Dzisiaj zrobiłem sobie wolne. Czasem człowiek musi odpocząć, więc poszedłem do piaskownicy (ładna nazwa).
Doszedłem do wniosku, że wszystko już jest rozpracowane, więc nic tu po mnie. Jednak procedury systemowe po latach stały się nudne. Może coś ożywić? Najpierw napisałem (przerobiłem jeden z przykładów Taszy) procedurę udającą pisanie człowieka na konsoli.
Kod: Zaznacz cały
.cr z80
.tf CA80_buon.hex,int
.lf CA80_buon.lst
.sf CA80_buon.sym
.in ca80.inc
.sm code ;
.or $c000 ; U12/C000
ld SP,$ff66 ;
;
.begin
call CLR
.db 80H
.repeat ; while (--licznik)
ld B,messEnd-mess ; B-licznik elementów tabeli
ld IX,mess ; adres tabeli znaczków
ld HL,APWYS
ld E,(HL)
inc HL
ld D,(HL)
ex DE,HL ; adres PWYS
.loop2
ld C,(IX+10H) ; weź element tabeli - PWYS
ld (HL),C ; ustaw PWYS
ld C,08H ; kod dolnego segmentu - kursor
call COM1 ; pokaż znaczek
ld C,(IX+2*10H) ; weź element tabeli - DELAY
call delay ; opóźnienie
ld C,(IX+0) ; weź element tabeli - ZNAK
call COM1 ; pokaż znaczek
inc IX ; indeks++
djnz .loop2 ; while (--licznik)
jr .repeat
;
mess:
.db 7CH, 1CH, 5CH, 54H, 00H, 00H, 00H, 00H, 00H, 6FH, 02H, 63H, 21H, 23H, 63H, 00H
messEnd:
.db 17H, 16H, 15H, 14H, 13H, 12H, 11H, 10H, 17H, 16H, 15H, 14H, 13H, 12H, 11H, 10H
.db 50H, 30H, 60H, 20H, 35H, 45H, 50H, 7FH, 35H, 45H, 50H, 7FH, 35H, 45H, 50H, 7FH
;
delay: push BC
push AF
ld B,C
.delay
halt ; 2ms
halt ; 2ms
halt ; 2ms
djnz .delay ; while( --B )
pop AF
pop BC
retAlternatywna zawartość tabelki:
Kod: Zaznacz cały
mess:
.db 7CH, 5CH, 54H, 0EH, 63H, 62H, 21H, 00H, 00H, 00H, 00H, 00H, 00H, 00H, 00H, 00H
messEnd:
.db 17H, 16H, 15H, 14H, 13H, 12H, 11H, 10H, 17H, 16H, 15H, 14H, 13H, 12H, 11H, 10H
.db 50H, 30H, 60H, 20H, 35H, 45H, 50H, 7FH, 35H, 45H, 50H, 7FH, 35H, 45H, 50H, 7FHNiby działa, ale jak używać jej do komunikatów o różnej długości? Niestety rejestry indeksowe Z80 ładnie wyglądają tylko na pierwszy rzut oka. Indeks musi być na stałe zdefiniowany i programowo nie można go zmieniać. Można napisać samomodyfikujący się program... Napisałem taki w pracy dyplomowej w technikum i do dzisiaj się tego wstydzę.
Można odwrócić tabelę i wtedy wszystko pasuje, ale na koniec pętli i tak musimy wartość rejestru zwiększyć o trzy, więc cała zabawa nie ma sensu, bo lepiej i szybciej będzie użyć HL. Wyszło mi coś takiego:
Kod: Zaznacz cały
.cr z80
.tf CA80_fun.hex,int
.lf CA80_fun.lst
.sf CA80_fun.sym
.in ca80.inc
.sm code ;
.or $c000 ; U12/C000
ld SP,$ff66 ;
;
.begin
call CLR
.db 80H
.repeat
ld HL, mess
call NEWPRINT
jr .repeat
;
delay: push BC
push AF
ld B,A
.delay
halt ; 2ms
halt ; 2ms
halt ; 2ms
djnz .delay ; while( --B )
pop AF
pop BC
ret
NEWPRINT:
; HL adres tabeli znaczków
; kazdy znak ma trzy parametry: kod 7seg, PWYS, DELAY (razy 6ms)
; jezeli bit3 PWYS (normalnie zero), to wstawiamy kursor
;
ld IX,APWYS
ld E,(IX)
ld D,(IX+1) ; nie użyłem Hi i Lo ;-(
push DE
pop IX ; adres PWYS
loop:
ld A,(HL) ; wez element tabeli - ZNAK
cp 0FFH
ret Z ; koniec tabeli znaków
ld C,A ; dla COM1
inc HL
ld A,(HL) ; wez element tabeli - PWYS
ld B,A
and 0F7H ; wytnij ewentualny bit3
ld (IX),A ; ustaw PWYS
bit 3,B
jr Z,bezKursora
ld B,C
ld C,8 ; dolny segment - kursor
call COM1
ld C,B
bezKursora:
inc HL
ld A,(HL) ; wez element tabeli - DELAY
or A
call NZ,delay ; opóźnienie
call COM1 ; pokaż znaczek
inc HL ; indeks++
jr loop
mess:
.db 39H, 13H, 7FH
.db 77H, 12H, 0H
.db 7FH, 11H, 0H
.db 3FH, 10H, 0H
.db 00H, 23H, 50H
.db 00H, 42H, 50H
.db 00H, 44H, 50H
.db 00H, 51H, 50H
.db 00H, 53H, 50H
.db 30H, 17H, 0H
.db 00H, 52H, 50H
.db 00H, 52H, 50H
.db 36H, 17H, 0H
.db 00H, 61H, 50H
.db 00H, 61H, 50H
.db 00H, 61H, 50H
.db 30H, 16H, 0H
.db 5CH, 10H, 0H
.db 5CH, 11H, 50H
.db 63H, 10H, 18H
.db 00H, 10H, 18H
.db 7FH, 11H, 0H
.db 5CH, 11H, 18H
.db 63H, 12H, 0H
.db 5CH, 12H, 18H
.db 63H, 11H, 18H
.db 00H, 11H, 18H
.db 7FH, 12H, 0H
.db 5CH, 12H, 18H
.db 63H, 13H, 0H
.db 5CH, 13H, 18H
.db 63H, 12H, 18H
.db 00H, 12H, 18H
.db 7FH, 13H, 0H
.db 5CH, 13H, 18H
.db 63H, 14H, 0H
.db 5CH, 14H, 18H
.db 63H, 13H, 18H
.db 00H, 13H, 18H
.db 7FH, 14H, 0H
.db 5CH, 14H, 18H
.db 63H, 15H, 0H
.db 5CH, 15H, 18H
.db 63H, 14H, 18H
.db 00H, 14H, 18H
.db 7FH, 15H, 0H
.db 5CH, 15H, 18H
.db 73H, 16H, 0H
.db 5CH, 16H, 18H
.db 63H, 15H, 18H
.db 00H, 15H, 18H
.db 7FH, 16H, 0H
.db 5CH, 16H, 18H
.db 77H, 17H, 0H
.db 5CH, 17H, 18H
.db 63H, 16H, 18H
.db 00H, 16H, 18H
.db 7FH, 17H, 0H
.db 30H, 17H, 50H
.db 39H, 17H, 50H
.db 09H, 16H, 50H
.db 09H, 15H, 50H
.db 09H, 14H, 50H
.db 00H, 17H, 50H
.db 39H, 16H, 0H
.db 09H, 13H, 0H
.db 00H, 16H, 50H
.db 39H, 15H, 0H
.db 09H, 12H, 0H
.db 00H, 15H, 50H
.db 39H, 14H, 0H
.db 09H, 11H, 0H
.db 00H, 14H, 50H
.db 39H, 13H, 0H
.db 09H, 10H, 0H
.db 77H, 12H, 50H
.db 3FH, 10H, 50H
.db 30H, 12H, 50H
.db 77H, 11H, 0H
.db 00H, 1FH, 7FH
.db 00H, 1EH, 50H
.db 00H, 1DH, 30H
.db 00H, 1CH, 40H
.db 00H, 1BH, 50H
.db 00H, 1AH, 50H
.db 00H, 19H, 50H
.db 00H, 18H, 50H
.db EOM
;
Nie uczyłem się animacji, więc efekt taki sobie. Można na szybko wpisać NOP (0) pod 0C012H (stara szkoła zapisu szesnastkowego). Obrazek będzie żwawszy. Można sparametryzować opóźnienia, żeby łatwiej zmieniać dane, ale dzień jest za krótki...
Życzę dobrej zabawy!
ca80_inc.txt
CA80_buon_ASM.TXT
CA80_fun_ASM.TXT
P.S. W CA80.inc dodałem trochę "przydasiów". Kod trochę koślawy, bo za dużo używałem Ctrl+C i Ctrl+V...