### Site Tools

base:petscii_to_screencode

# Differences

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

 — 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 + ​ + + 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 +