;============================================================================== ; MIKROPRINT 2 - modernizovaná verze pro plně osmibitové znaky (jako PRINT) ;============================================================================== ; VSTUP - znak, který má být vytisknut v registru A ; VYSTUP - vytisknutý znak (MPRINT), nebo řetězec (TEXTOUT) na obrazovce ; ; TEXTOUT ; 0 - řídící znak označující konec řetězce ; 13 - řídící znak CR (carriage return) - konec řádku ; 22 - řídící znak za nímž MUSÍ následovat nejméně 2 byty určující souřadnice (řádek, sloupec) ; ; MPRINT všechna omezení řídícími znaky ignoruje TEXTOUT ld a,(hl) ; tisk řetězce ukončeného 0 (pokud není 0 jako parametr po 22) or a ret z ; při 0 ukonči výpis cp 13 jr z,MPRINT_CR ; Z = řídící znak 13, skoč na jeho zpracování cp 22 jr z,MPRINT_AT ; Z = řídící znak 22, skoč na jeho zpracování call MPRINT inc hl jr TEXTOUT TEXTOUTB ld a,(hl) ; tisk řetězce, délka v B, adresa textu v HL push bc call MPRINT ; nijak neřeší kód znaků! Nereaguje na 13, ani na 22... inc hl pop bc djnz TEXTOUTB ret MPRINT_CR call MPRN_NL0 jr TEXTOUT MPRINT_AT inc hl ; a přečti znak následující po 22 ld c,(hl) ; číslo řádku do C (Y) inc hl ld b,(hl) ; číslo sloupce do B (X) ld (MPRINT_XY),bc ; obojí ulož do odpovídající proměnné inc hl ; HL musí ukazovat ZA 2. parametr, protože přeskočím inc ve smyčce push hl ; změněný HL ulož ; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ; výpočet adresy ve VRAM podle čísla řádku a sloupce ld a,c ; vezmi číslo řádku z C rrca ; a 3x rotací vpravo (dolní 3 bity na místo horních) rrca rrca and 11100000b ; ponech jen horní 3 bity ld l,a ; vypočtené číslo ulož do reg. L (máme dolní byte) ld a,c ; znovu vezmi číslo řádku z C and 00011000b ; ponech 3. a 4. bit or 01000000b ; a pričti 64 ld h,a ; a do H ulož výsledný horní byte adresy ld (MPRINT_LNA),hl ; kompletní adresu uložím do proměnné (získali jsme adresu řádku) ld a,b ; vezmi číslo sloupce z C ; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ; až dosud stejné pro PRINT i MPRINT rra ; A/2 and 011111b ; ponech jen dolních 5 bitů (rozsah 0 až 31) ld b,0 ; řádek a sloupec nebudou potřeba, BC použiju ke sčítání ld c,a ; v BC bude číslo sloupce add hl,bc ; a přičtu ho k HL, takže v HL bude kompletní adresa znaku ve VRAM ld (MPRINT_CHA),hl ; a uložit do proměnné (CHA = character address) pop hl jp TEXTOUT ; a je možno pokračovat ve výpisu řetězce MPRINT push hl ; uloz HL kvuli smycce pro vypis retezce ld l,a ; do HL kód znaku ld h,0 add hl,hl ; HL *= 8 add hl,hl add hl,hl ; v HL bude adresa znaku od začátku fontu pro znak 0 MPRN_FN0 ld de,15360 ; pričti k HL adresu fontu add hl,de ; takže v HL je teď adresa předlohy znaku ex de,hl ; adresu předlohy potřebuju v DE (takže registry přehodím) ld hl,(MPRINT_CHA) ; a v HL potřebuju adresu znaku ve VRAM ld a,(MPRINT_X) ; otestuj jestli se jedna o lichy, nebo sudy bit 0,a ; sloupec - tj. leva/prava pulka bytu jr z,MPRN_SUDY ; bit 0 = 0 => znak delitelny 2 MPRN_LICHY inc a ; v A je Xova souradnice, spočítám novou Xovou souřadnici ld (MPRINT_X),a ; krome jineho se ted znak stal lichym ld a,(de) ; do A předlohu and 00001111b ; z předlohy jen levou půlku ld c,a ; odložit do C ld a,(hl) ; do A byte z obrazovky and 11110000b ; vymazat levou půlku, tam přijde znak or c ; přidat připravený půlbajt znaku ld (hl),a ; uložit do obrazovky inc h ; o mikrořádek níž (nepřekročí znakovou pozici) inc de ; další byte předlohy ld a,(de) ; podruhé and 00001111b ld c,a ld a,(hl) and 11110000b or c ld (hl),a inc h inc de ld a,(de) ; potřetí and 00001111b ld c,a ld a,(hl) and 11110000b or c ld (hl),a inc h inc de ld a,(de) ; počtvrté and 00001111b ld c,a ld a,(hl) and 11110000b or c ld (hl),a inc h inc de ld a,(de) ; popáté and 00001111b ld c,a ld a,(hl) and 11110000b or c ld (hl),a inc h inc de ld a,(de) ; pošesté and 00001111b ld c,a ld a,(hl) and 11110000b or c ld (hl),a inc h inc de ld a,(de) ; posedmé and 00001111b ld c,a ld a,(hl) and 11110000b or c ld (hl),a inc h inc de ld a,(de) ; poosmé and 00001111b ld c,a ld a,(hl) and 11110000b or c ld (hl),a ld hl,(MPRINT_CHA) ; další znak bude SUDÝ, nutno změnit adresu inc hl ld (MPRINT_CHA),hl ld a,(MPRINT_X) ; otestuju jestli vypsaný znak nebyl na řádku poslední and 00111111b ; ponechám dolních 6 bitů jp z,MPRN_NL ; Z => A = 64 - proveď korekci (nejspíš posun o řádek níž) pop hl ret ; vrat se - konec rutiny MPRINT MPRN_SUDY inc a ; v A je Xova souradnice, spočítám novou Xovou souřadnici ld (MPRINT_X),a ; krome jineho se ted znak stal lichym ld a,(de) ; do A předlohu and 11110000b ; z předlohy jen pravou půlku ld c,a ; odložit do C ld a,(hl) ; do A byte z obrazovky and 00001111b ; vymazat pravou půlku, tam přijde znak or c ; přidat připravený půlbajt znaku ld (hl),a ; uložit do obrazovky inc h ; o mikrořádek níž (nepřekročí znakovou pozici) inc de ; další byte předlohy ld a,(de) ; podruhé and 11110000b ld c,a ld a,(hl) and 00001111b or c ld (hl),a inc h inc de ld a,(de) ; potřetí and 11110000b ld c,a ld a,(hl) and 00001111b or c ld (hl),a inc h inc de ld a,(de) ; počtvrté and 11110000b ld c,a ld a,(hl) and 00001111b or c ld (hl),a inc h inc de ld a,(de) ; popáté and 11110000b ld c,a ld a,(hl) and 00001111b or c ld (hl),a inc h inc de ld a,(de) ; pošesté and 11110000b ld c,a ld a,(hl) and 00001111b or c ld (hl),a inc h inc de ld a,(de) ; posedmé and 11110000b ld c,a ld a,(hl) and 00001111b or c ld (hl),a inc h inc de ld a,(de) ; poosmé and 11110000b ld c,a ld a,(hl) and 00001111b or c ld (hl),a pop hl ; znak se stal LICHYm, nemohlo tedy dojit ret ; ani ke zmene adresy natoz neceho jineho MPRN_NL0 inc hl ; HL ukazuje na kód 13, posunu ho za něj xor a ; v A je teď nejpíš taky 13, potřebuju 0 push hl ; uložím adresu zpracovávaného znaku MPRN_NL ld (MPRINT_X),a ; v A je 0, a tak to na začátku řádku má být ld a,(MPRINT_Y) ; vezmi číslo řádku cp 23 ; otestuj neni-li nahodou uplne nejspodnejsi jr z,MPRN_LL ; Z = řádek je 23, skoč na zpracování NL na posledním řádku inc a ; zvyš číslo řádku ld (MPRINT_Y),a ; ulož ho ld hl,(MPRINT_LNA) ; vezmi adresu prvního znaku na dosud používaném řádku ld a,l ; a spočítej adresu o jeden znak níž add a,32 ; (obdoba rutiny DOWNCH) ld l,a jr nc,MPRN_NL2 ld a,h add a,8 ld h,a cp 88 jr nz,MPRN_NL2 ld h,64 MPRN_NL2 ld (MPRINT_LNA),hl ; adresu znaku na začátku nového řádku ulož do proměnných ld (MPRINT_CHA),hl pop hl ret ; návrat z PRINT (po skoku na PRINT_CR se vrátím na TEXTOUT) MPRN_LL ld hl,(MPRINT_LNA) ; NEW LINE na posledním řádku, vezmi adresu tohoto řádku ld (MPRINT_CHA),hl ; a ulož ji jako adresu znaku pop hl ret ; návrat z PRINT ;------------------------------------------------------------------------------ ; POTŘEBNÉ PROMĚNNÉ ;------------------------------------------------------------------------------ ; ; Proměnná PRINT_COL je v této verzi ignorována, je zde pouze kvůli kompatibilitě a ; plné zaměnitelnosti této rutiny s její barevnou verzí. MPRINT_XY dw 0 ; 1. byte je Y (řádek), druhý byte X (sloupec), kvůli ; 16 bit. reg. MPRINT_Y equ MPRINT_XY MPRINT_X equ MPRINT_XY+1 ; vyšší registry (H, B, D) MPRINT_COL db 58 ; color - implicitně INK 0, PAPER 7 MPRINT_CLE db 0 ; 0 = barvy vypnuty, 1 barvy zapnuty MPRINT_LNA dw 16384 ; adresa znaku na začátku právě aktuálního řádku MPRINT_CHA dw 16384 ; adresa znaku, který bude tisknut MPRINT_FNA equ MPRN_FN0+1 ; adresa, kde mohou adresu fontu měnit externí programy ; Font by měl být dlouhý 2048 bytů pro všech 256 znaků, tj. jsou uvažovány ; i znaky mezi 0 až 31 včetně (výjimkou jsou řetězce pro 0,13,22). Pro písmo ; nevyužité pozice možno využít pro další rozšíření fontu, např. semigrafické ; znaky, rámečky a pod. Kompatibilita s ISO8859-2 případně jinou znakovou ; sadou podobné míry rozšířenosti by měla být zachována. ; binclude ../libs/font_mprint_iso8859-2_4x8.bin ;============================================================================== ; 100 řádků kódů, 1000 řádků ASCII ART