User Tools

Site Tools


base:petscii_to_screencode
no way to compare when less than two revisions

Differences

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


base:petscii_to_screencode [2015-04-17 04:33] (current) – created - external edit 127.0.0.1
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 by 127.0.0.1