[CA80] Przegląd wybranych procedur systemowych CA80 | programowanie (piaskownica)

Kącik dla elektroniki retro - układy, urządzenia, podzespoły, literatura itp.
Awatar użytkownika
tasza
Geek
Geek
Posty: 1082
Rejestracja: czwartek 12 sty 2017, 10:24
Kontaktowanie:

[CA80] Przegląd wybranych procedur systemowych CA80 | programowanie (piaskownica)

Postautor: tasza » piątek 19 kwie 2019, 15:23

♬ ☘ 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: :arrow: http://bienata.waw.pl/ca8011.php choć to już nie do końca jest taka ... piaskownica.

#slowanawiatr
______________________________________________ ____ ___ __ _ _ _ _
Kończysz tworzyć dopiero, gdy umierasz. (Marina Abramović)

Awatar użytkownika
gaweł
Geek
Geek
Posty: 1260
Rejestracja: wtorek 24 sty 2017, 22:05
Lokalizacja: Białystok

Re: [CA80] Przegląd wybranych procedur systemowych CA80 | programowanie (piaskownica)

Postautor: gaweł » sobota 20 kwie 2019, 17:01

Z80 wiecznie żywy :lol:

Prawdziwe słowa nie są przyjemne. Przyjemne słowa nie są prawdziwe.
Lao Tse

tapy
User
User
Posty: 120
Rejestracja: niedziela 14 kwie 2019, 17:09
Kontaktowanie:

Re: [CA80] Przegląd wybranych procedur systemowych CA80 | programowanie (piaskownica)

Postautor: tapy » sobota 20 kwie 2019, 20:20

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.

Awatar użytkownika
tasza
Geek
Geek
Posty: 1082
Rejestracja: czwartek 12 sty 2017, 10:24
Kontaktowanie:

Re: [CA80] Przegląd wybranych procedur systemowych CA80 | programowanie (piaskownica)

Postautor: tasza » sobota 09 lis 2019, 22:31

Na fali przygód z magnetofonem, kilka krótkich zdań uzupełnienia o procedurki systemowe ZMAG,ZEOF,OMAG
:arrow: http://bienata.waw.pl/ca8011.php#magnetofon
______________________________________________ ____ ___ __ _ _ _ _
Kończysz tworzyć dopiero, gdy umierasz. (Marina Abramović)

Awatar użytkownika
Zegar
User
User
Posty: 318
Rejestracja: wtorek 02 lip 2019, 14:42

Re: [CA80] Przegląd wybranych procedur systemowych CA80 | programowanie (piaskownica)

Postautor: Zegar » niedziela 08 gru 2019, 19:34

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
        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!

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...
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


Wróć do „Retro”

Kto jest online

Użytkownicy przeglądający to forum: Bing [Bot] i 5 gości