Programowanie: Konwersje znaków ATASCII i ANTIC

From Atariki

(Różnice między wersjami)
Jump to: navigation, search
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

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
Personal tools