;============================================================================== ; HLAVNI RUTINA MPRINT2, KTERA ZARIZUJE VYKRESLENI 1 ZNAKU NA OBRAZOVKU ;============================================================================== ; VSTUP - znak, ktery ma byt vytisknut v registru A (pozor na znak 22) ; VYSTUP- vytisknuty znak na obrazovce, pripadne zmenene parametry rutiny MPRINT2 push hl ; uloz HL, nutno zachovat ! HL se totiz skoro ; vzdy pouziva ve smyckach pro vypis retezce jp MP_ZNAK ; rovnou vypis znak, bez dalsi kontroly MPRINT push hl ; uloz HL, nutne - viz o par radek drive cp 13 ; testuj neni-li znak 13 = konec radku (EOL) jp z,MPENTER ; jestli je 13, uprav tiskovou pozici cp 22 ; testuj neni-li znak 22 = nova pozice (AT) jp nz,MP_ZNAK ; neni-li skoc rovnou na vypis znaku MP_AT pop hl ; obnov ulozene HL (ukazuje na retezec) inc hl ; a precti znak nasledujici po znaku 22 ld a,(hl) ld (MP_POSY),a ; uloz cislo radku (22,y=radek,x=sloupec) ld b,a ; odloz radek do registru B inc hl ; a precti cislo sloupce (2. znak po 22) ld a,(hl) ld (MP_POSX),a ; uloz cislo sloupce ld c,a ; odloz sloupec do reg. C push hl ; znova uloz, ted uz zmeneny registr HL ; nasleduje vypocet nove adresy (tiskove pozice) ve VRAM ld a,b ; vezmi odlozene cislo radku rrca ; a 3x rotaci vpravo (dolni 3 bity na misto hornich) rrca rrca and 11100000b ; ponech jen horni 3 bity ld l,a ; vypoctene cislo uloz do reg. L (mame dolni byte) ld a,b ; vezmi znovu cislo radku and 00011000b ; ponech 3. a 4. bit or 01000000b ; a pricti 64 ld h,a ; tim jsme vytvorili horni byte adresy radku ld (MP_LAST),hl ; uloz kompletni adresu radku ld a,c ; vezmi odlozene cislo sloupce rra ; a vydel ho 2 (2 znaky na 1 byte ve VRAM) and 01111111b ; ponech dolnich 7 bitu (pro jistotu) ld b,0 ; radek a sloupec uz nebudou potreba, takze ld c,a ; do BC vlozime poradi bytu od zacatku radku add hl,bc ; a pricteme ho k HL, cimz ziskame adresu znaku ld (MP_VRAM),hl ; ulozime do promenne pop hl ; a muzeme obnovit HL, pri dalsim zavolani ret ; bude vyrobena adresa pouzita k vypisu znaku MP_NONS ld a,'?' ; pokud znak nema smysl nahrad ho znakem ? MP_ZNAK cp 32 ; testuj jestli kod znaku neni mensi nez 32 jp c,MP_NONS ; a pripadne ho nahrad otaznikem ld l,a ; do HL vezmi kod znaku ld h,0 add hl,hl ; a vynasob ho 8 - pocet bytu predlohy znaku add hl,hl add hl,hl ld de,MP_FONT-256 ; pricti k HL adresu fontu add hl,de ; takze ted je v HL adresa predlohy znaku ld de,(MP_VRAM) ; a do DE nactu adresu znaku ve VRAM ld a,(MP_POSX) ; otestuj jestli se jedna o lichy, nebo sudy and 1 ; sloupec - tj. leva/prava pulka bytu jp z,MPSUDY ; bit 0 = 0 => znak delitelny 2 MPLICHY ld a,(hl) ; cti predlohu znaku and 00001111b ; a z predlohy ponech jen pravou pulku ld c,a ; zatim uloz do C ld a,(de) ; nacti byte z obrazovky and 11110000b ; znej ponech jen tu pulku na niz nepatri znak or c ; spoj se znakem ld (de),a ; a uloz zpatky do obrazovky inc d ; posun se o 1 mikroradek dolu (DE=DE+256) inc hl ; posun se na dalsi byte predlohy ld a,(hl) ; vse opakuj jeste 7x v rozvinutem cyklu and 00001111b ; rozvinuti cyklu ma za nasledek mirne ld c,a ; zvyseni rychlosti za cenu vetsi delky kodu ld a,(de) and 11110000b or c ld (de),a inc d inc hl ld a,(hl) and 00001111b ld c,a ld a,(de) and 11110000b or c ld (de),a inc d inc hl ld a,(hl) and 00001111b ld c,a ld a,(de) and 11110000b or c ld (de),a inc d inc hl ld a,(hl) and 00001111b ld c,a ld a,(de) and 11110000b or c ld (de),a inc d inc hl ld a,(hl) and 00001111b ld c,a ld a,(de) and 11110000b or c ld (de),a inc d inc hl ld a,(hl) and 00001111b ld c,a ld a,(de) and 11110000b or c ld (de),a inc d inc hl ld a,(hl) and 00001111b ld c,a ld a,(de) and 11110000b or c ld (de),a inc d inc hl ld a,(MP_POSX) ; v tuto chvili je dokonceno kresleni znaku inc a ; je cas vypocitat pozici dalsiho znaku na r. ld (MP_POSX),a ; uloz zpatky prepocitanou X-ovou pozici znaku ld hl,(MP_VRAM) ; dalsi znak bude SUDY, nutno zmenit adresu inc hl ld (MP_VRAM),hl MPRETL2 cp 64 ; po zmene adresy mohlo dojit k prekroceni jp z,MPENTER ; praveho okraje - proved prip. korekci pop hl ret ; vrat se - konec rutiny MPRINT MPSUDY ld a,(hl) and 11110000b ld c,a ld a,(de) and 00001111b or c ld (de),a inc d inc hl ld a,(hl) and 11110000b ld c,a ld a,(de) and 00001111b or c ld (de),a inc d inc hl ld a,(hl) and 11110000b ld c,a ld a,(de) and 00001111b or c ld (de),a inc d inc hl ld a,(hl) and 11110000b ld c,a ld a,(de) and 00001111b or c ld (de),a inc d inc hl ld a,(hl) and 11110000b ld c,a ld a,(de) and 00001111b or c ld (de),a inc d inc hl ld a,(hl) and 11110000b ld c,a ld a,(de) and 00001111b or c ld (de),a inc d inc hl ld a,(hl) and 11110000b ld c,a ld a,(de) and 00001111b or c ld (de),a inc d inc hl ld a,(hl) and 11110000b ld c,a ld a,(de) and 00001111b or c ld (de),a inc d inc hl ld a,(MP_POSX) ; spocitej novou pozici - sloupec inc a ld (MP_POSX),a ; krome jineho se ted znak stal lichym pop hl ; znak se stal LICHYm, nemohlo tedy dojit ret ; ani ke zmene adresy natoz neceho jineho MPENTER xor a ; skok na zacatek nasledujiciho radku ld (MP_POSX),a ; nastav X-ovou pozici na 0 ld a,(MP_POSY) ; precti cislo radku cp 23 ; otestuj neni-li nahodou uplne nejspodnejsi jr nz,MPENTE2 ; pokud ne odskoc ld hl,(MP_LAST) ; jinak vezmi adresu zacatku tohoto radku (23) ld (MP_VRAM),hl ; a pouzij ji pro pristi znak pop hl ret ; vrat se - konec rutiny MPRINT MPENTE2 inc a ; zvys cislo radku ld (MP_POSY),a ; a uloz ho ld hl,(MP_LAST) ; vezmi adresu zacatku posledniho radku ld a,l ; a spocitej adresu o 8 bodu niz add a,32 ; (obdoba rutiny DOWNCH) ld l,a jr nc,MPENTE3 ld a,h add a,8 ld h,a cp 88 jr nz,MPENTE3 ld h,64 MPENTE3 ld (MP_LAST),hl ; adresu zacatku radku uloz (2x) ld (MP_VRAM),hl pop hl ret ; vrat se ;============================================================================== ; PROMENNE NEZBYTNE POTREBNE K FUNKCI TISKOVE RUTINY ;============================================================================== MP_POSX db 0 ; X-ova souradnice znaku - sloupec MP_POSY db 0 ; Y-ova souradnice znaku - radek MP_LAST dw 16384 ; adresa znaku, ktery je uplne na zacatku aktual. radku MP_VRAM dw 16384 ; adresa znaku, ktery je momentalne na rade (bude se ; tiskout) MP_FONT binclude ../libs/font_mprint_iso8859-2_4x8.bin ; font, mozno nahradit cp1250.bin, ascii.bin ; TODO: vyrobit font v ISO8859-2 a zahodit ten v CP1250 ... ;==============================================================================