♬ ☘ Moja muzyka do kodowania ♬ ♬ ♬ ☘
♫ ♩ ♪ Poets of the Fall ⚡ ☘ ⚡ Carnival of Rust ♪ ♩ ♫
https://youtu.be/AGPpUTPzS6k
Stronka ta skoncentrowana jest na podstawach programowania CA80, do tego w końcu ów komputerek stworzono. Dość dokładny opis procedur systemowych CA80 znajduje się w tomiku MIK05, tam też znajdziemy ich kod źródłowy oraz mapę zajętości górnych obszarów pamięci RAM. Pełny listing monitora to MIK08 i to jest kolejna broszurka, z której lekturą naprawdę warto się zmierzyć. Przykłady poniżej mocno nawiązują do tego, co znajdziemy w MIK05, nie chciałam jednak powielać prostych programików z MIK, prezentowane tu aplikacje są nieco bardziej rozbudowane i celowo podkręcone, demonstrując przy okazji kilka sympatycznych właściwości translatora SB-Assembler.
Zaprasza więc: http://bienata.waw.pl/ca8011.php choć to już nie do końca jest taka ... piaskownica.
#slowanawiatr
[CA80] Przegląd wybranych procedur systemowych CA80 | programowanie (piaskownica)
[CA80] Przegląd wybranych procedur systemowych CA80 | programowanie (piaskownica)
______________________________________________ ____ ___ __ _ _ _ _
Kończysz tworzyć dopiero, gdy umierasz. (Marina Abramović)
Kończysz tworzyć dopiero, gdy umierasz. (Marina Abramović)
Re: [CA80] Przegląd wybranych procedur systemowych CA80 | programowanie (piaskownica)
Z80 wiecznie żywy
Prawdziwe słowa nie są przyjemne. Przyjemne słowa nie są prawdziwe.
Lao Tse
Re: [CA80] Przegląd wybranych procedur systemowych CA80 | programowanie (piaskownica)
gaweł pisze:Z80 wiecznie żywy
... niemalże od 43 lat. Kiedyś się zastanawiałem dlaczego i chyba odpowiedzią na to pytanie jest jego szczegółowa dokumentacja. Obecnie bawiąc się np. Raspberry Pi nie wiemy co siedzi w środku, bo "ochrona własności intelektualnej" ubezwłasnowalnia posiadaczy tego typu sprzętów. Skończy się ich produkcja i zarazem zainteresowanie nimi, nikt nie pamięta już o układach, które były owiane podobną zasłoną patentowej tajemnicy.
Re: [CA80] Przegląd wybranych procedur systemowych CA80 | programowanie (piaskownica)
Na fali przygód z magnetofonem, kilka krótkich zdań uzupełnienia o procedurki systemowe ZMAG,ZEOF,OMAG
http://bienata.waw.pl/ca8011.php#magnetofon
http://bienata.waw.pl/ca8011.php#magnetofon
______________________________________________ ____ ___ __ _ _ _ _
Kończysz tworzyć dopiero, gdy umierasz. (Marina Abramović)
Kończysz tworzyć dopiero, gdy umierasz. (Marina Abramović)
Re: [CA80] Przegląd wybranych procedur systemowych CA80 | programowanie (piaskownica)
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.
Alternatywna zawartość tabelki:
Niby 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:
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!
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...
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
ret
Alternatywna 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, 7FH
Niby 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!
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...
Nie masz wymaganych uprawnień, aby zobaczyć pliki załączone do tego posta.
"If A = success, then the formula is A = X + Y + Z.
X is work. Y is play. Z is keep your mouth shut."A. Einstein
X is work. Y is play. Z is keep your mouth shut."A. Einstein
Kto jest online
Użytkownicy przeglądający to forum: Obecnie na forum nie ma żadnego zarejestrowanego użytkownika i 3 gości