Programowanie: Konwersje znaków ATASCII i ANTIC
From Atariki
(Różnice między wersjami)
Wersja z dnia 09:48, 22 wrz 2017 Mono (Dyskusja | wkład) (konwersja atascii - antic i powrotem) ← Previous diff |
Aktualna wersja 0xF (Dyskusja | wkład) (po trzy nowe warianty, wszystkie szybsze i nie dłuższe od poprzednich) |
||
Linia 2: | Linia 2: | ||
Program przekształca wpisany do akumulatora znak w kodzie [[ATASCII]] na [[Kody ekranowe|kod ekranowy]] ANTIC-a. Wynik w akumulatorze. | Program przekształca wpisany do akumulatora znak w kodzie [[ATASCII]] na [[Kody ekranowe|kod ekranowy]] ANTIC-a. Wynik w akumulatorze. | ||
+ | |||
+ | Najkrótszy kod: | ||
<pre> | <pre> | ||
Linia 7: | Linia 9: | ||
asl | asl | ||
php | php | ||
- | cmp #2*$60 | + | adc #$c0 |
- | bcs @ | + | spl:eor #$40 |
- | sbc #2*$20-1 | + | plp |
- | bcs @ | + | |
- | adc #2*$60 | + | |
- | @ plp | + | |
ror | ror | ||
+ | rts | ||
+ | </pre> | ||
+ | |||
+ | Dwa bajty dłuższe, ale szybsze: | ||
+ | |||
+ | <pre> | ||
+ | atascii2antic: | ||
+ | asl | ||
+ | adc #$c0 | ||
+ | spl:eor #$40 | ||
+ | lsr | ||
+ | scc:eor #$80 | ||
+ | rts | ||
+ | </pre> | ||
+ | |||
+ | Najdłuższa metoda, nie używa stosu, znacznika C ani D: | ||
+ | |||
+ | <pre> | ||
+ | atascii2antic: | ||
+ | bit const20 | ||
+ | sne:eor #$40 | ||
+ | const40 equ *-1 | ||
+ | bit const40 | ||
+ | sne:eor #$20 | ||
+ | const20 equ *-1 | ||
rts | rts | ||
</pre> | </pre> | ||
Linia 42: | Linia 66: | ||
asl | asl | ||
php | php | ||
- | cmp #2*$60 | + | spl:eor #$40 |
- | bcs @ | + | adc #$40 |
- | sbc #2*$40-1 | + | plp |
- | bcs @ | + | |
- | adc #2*$60 | + | |
- | @ plp | + | |
ror | ror | ||
rts | rts | ||
</pre> | </pre> | ||
- | i w wersji tablicowej: | + | Dwa bajty dłuższe, ale szybsze: |
+ | |||
+ | <pre> | ||
+ | antic2atascii: | ||
+ | asl | ||
+ | spl:eor #$40 | ||
+ | adc #$40 | ||
+ | lsr | ||
+ | scc:eor #$80 | ||
+ | rts | ||
+ | </pre> | ||
+ | |||
+ | Najdłuższa metoda, nie używa stosu, znacznika C ani D: | ||
+ | |||
+ | <pre> | ||
+ | antic2atascii: | ||
+ | bit const40 | ||
+ | sne:eor #$20 | ||
+ | const20 equ *-1 | ||
+ | bit const20 | ||
+ | sne:eor #$40 | ||
+ | const40 equ *-1 | ||
+ | rts | ||
+ | </pre> | ||
+ | |||
+ | Wersja tablicowa: | ||
<pre> | <pre> |
Aktualna wersja
[Edytuj]
ATASCII → ANTIC
Program przekształca wpisany do akumulatora znak w kodzie ATASCII na kod ekranowy ANTIC-a. Wynik w akumulatorze.
Najkrótszy kod:
atascii2antic: asl php adc #$c0 spl:eor #$40 plp ror rts
Dwa bajty dłuższe, ale szybsze:
atascii2antic: asl adc #$c0 spl:eor #$40 lsr scc:eor #$80 rts
Najdłuższa metoda, nie używa stosu, znacznika C ani D:
atascii2antic: bit const20 sne:eor #$40 const40 equ *-1 bit const40 sne:eor #$20 const20 equ *-1 rts
Można oczywiście użyć tablicy:
atascii2antic: tax lda antic,x rts antic: :32 .byte $40+# :64 .byte $00+# :32 .byte $60+# :32 .byte $c0+# :64 .byte $80+# :32 .byte $e0+#
[Edytuj]
ANTIC → ATASCII
Zasadniczo konwersję przeprowadza się analogicznie:
antic2atascii: asl php spl:eor #$40 adc #$40 plp ror rts
Dwa bajty dłuższe, ale szybsze:
antic2atascii: asl spl:eor #$40 adc #$40 lsr scc:eor #$80 rts
Najdłuższa metoda, nie używa stosu, znacznika C ani D:
antic2atascii: bit const40 sne:eor #$20 const20 equ *-1 bit const20 sne:eor #$40 const40 equ *-1 rts
Wersja tablicowa:
antic2atascii: tax lda atascii,x rts atascii: :64 .byte $20+# :32 .byte $00+# :32 .byte $60+# :64 .byte $a0+# :32 .byte $80+# :32 .byte $e0+#
[Edytuj]
Warianty
Jeśli w programie mamy już procedurę konwersji ATASCII → ANTIC, można użyć innej metody:
antic2atascii: jsr atascii2antic jmp atascii2antic
lub też (dysponując wersją stablicowaną):
antic2atascii: tax ldy antic,x lda antic,y rts
Analogiczną konwersję ATASCII → ANTIC można oczywiście przeprowadzić mając procedurę konwersji ANTIC → ATASCII
atascii2antic: jsr antic2atascii jmp antic2atascii
lub dysponując tablicą:
atascii2antic: tax ldy atascii,x lda atascii,y rts