Programowanie: Konwersje znaków ATASCII i ANTIC: Różnice pomiędzy wersjami
Przejdź do nawigacji
Przejdź do wyszukiwania
konwersja atascii - antic i powrotem |
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 | ||
adc #$c0 | |||
spl:eor #$40 | |||
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 | ||
spl:eor #$40 | |||
adc #$40 | |||
plp | |||
ror | ror | ||
rts | rts | ||
</pre> | </pre> | ||
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 z 22 sty 2019, 23:03
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+#
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+#
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