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
						
			
		