Meta

base:petscii_to_screencode

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:

```		// 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:

```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```