User Tools

Site Tools


base:petscii_to_screencode

Differences

This shows you the differences between two versions of the page.

Link to this comparison view

base:petscii_to_screencode [2015-04-17 04:33] (current)
Line 1: Line 1:
 +====== PETSCII to screencode conversion ======
  
 +By Mace
 +
 +While creating my own routine to display a floppy directory, I stumbled accross the awkward difference between ASCII/​PETSCII codes and screencodes. In *SCII, the letter A is value 65, while on the screen it is value 1. Yet, simply subtracting 64 from all *SCII codes doesn'​t work.
 +An easy way of converting would be to create a table, but that takes quite some space for something that is not that hard to code.
 +Simply said, you have to divide the *SCII code in blocks and for each block apply a certain calculation to get the screencode.
 +
 +It could look something like this:
 +<​code>​ //​ A = *SCII-code
 +
 + cmp #$20 // if A<32 then...
 + bcc ddRev
 +
 + cmp #$60 // if A<96 then...
 + bcc dd1
 +
 + cmp #$80 // if A<128 then...
 + bcc dd2
 +
 + cmp #$a0 // if A<160 then...
 + bcc dd3
 +
 + cmp #$c0 // if A<192 then...
 + bcc dd4
 +
 + cmp #$ff // if A<255 then...
 + bcc ddRev
 +
 + lda #$7e // A=255, then A=126
 + bne ddEnd
 +
 + dd2: and #$5f // if A=96..127 then strip bits 5 and 7
 + bne ddEnd
 +
 + dd3: ora #$40 // if A=128..159, then set bit 6
 + bne ddEnd
 +
 + dd4: eor #$c0 // if A=160..191 then flip bits 6 and 7
 + bne ddEnd
 +
 + dd1: and #$3f // if A=32..95 then strip bits 6 and 7
 + bpl ddEnd // <- you could also do .byte $0c here
 +
 + ddRev: eor #$80 // flip bit 7 (reverse on when off and vice versa)
 + ddEnd:
 + // screencode is now in accu
 +</​code>​
 +
 +If you would like to use a table after all, you could use this one:
 +<​code>​
 +tab_petscii2screencode:​
 + ;​PETSCII RANGE
 + .byte $80,​$81,​$82,​$83,​$84,​$85,​$86,​$87,​ $88,​$89,​$8a,​$8b,​$8c,​$8d,​$8e,​$8f ;​$00-...
 + .byte $90,​$91,​$92,​$93,​$94,​$95,​$96,​$97,​ $98,​$99,​$9a,​$9b,​$9c,​$9d,​$9e,​$9f ;​...-$1f
 + .byte $20,​$21,​$22,​$23,​$24,​$25,​$26,​$27,​ $28,​$29,​$2a,​$2b,​$2c,​$2d,​$2e,​$2f ;​$20-...
 + ​ .byte $30,​$31,​$32,​$33,​$34,​$35,​$36,​$37,​ $38,​$39,​$3a,​$3b,​$3c,​$3d,​$3e,​$3f ;​...-$3f
 + .byte $00,​$01,​$02,​$03,​$04,​$05,​$06,​$07,​ $08,​$09,​$0a,​$0b,​$0c,​$0d,​$0e,​$0f ;​$40-...
 + ​ .byte $10,​$11,​$12,​$13,​$14,​$15,​$16,​$17,​ $18,​$19,​$1a,​$1b,​$1c,​$1d,​$1e,​$1f ;​...-$5f
 + .byte $40,​$41,​$42,​$43,​$44,​$45,​$46,​$47,​ $48,​$49,​$4a,​$4b,​$4c,​$4d,​$4e,​$4f ;​$60-...
 + ​ .byte $50,​$51,​$52,​$53,​$54,​$55,​$56,​$57,​ $58,​$59,​$5a,​$5b,​$5c,​$5d,​$5e,​$5f ;​...-$7f
 + .byte $c0,​$c1,​$c2,​$c3,​$c4,​$c5,​$c6,​$c7,​ $c8,​$c9,​$ca,​$cb,​$cc,​$cd,​$ce,​$cf ;​$80-...
 + ​ .byte $d0,​$d1,​$d2,​$d3,​$d4,​$d5,​$d6,​$d7,​ $d8,​$d9,​$da,​$db,​$dc,​$dd,​$de,​$df ;​...-$9f
 + .byte $60,​$61,​$62,​$63,​$64,​$65,​$66,​$67,​ $68,​$69,​$6a,​$6b,​$6c,​$6d,​$6e,​$6f ;​$a0-...
 + ​ .byte $70,​$71,​$72,​$73,​$74,​$75,​$76,​$77,​ $78,​$79,​$7a,​$7b,​$7c,​$7d,​$7e,​$7f ;​...-$bf
 + .byte $00,​$01,​$02,​$03,​$04,​$05,​$06,​$07,​ $08,​$09,​$0a,​$0b,​$0c,​$0d,​$0e,​$0f ;​$c0-...
 + ​ .byte $10,​$11,​$12,​$13,​$14,​$15,​$16,​$17,​ $18,​$19,​$1a,​$1b,​$1c,​$1d,​$1e,​$1f ;​...-$df
 + .byte $60,​$61,​$62,​$63,​$64,​$65,​$66,​$67,​ $68,​$69,​$6a,​$6b,​$6c,​$6d,​$6e,​$6f ;​$e0-...
 + ​ .byte $70,​$71,​$72,​$73,​$74,​$75,​$76,​$77,​ $78,​$79,​$7a,​$7b,​$7c,​$7d,​$7e,​$5e ;​...-$ff
 +</​code>​
base/petscii_to_screencode.txt ยท Last modified: 2015-04-17 04:33 (external edit)