;================================================================================================== ; Disassembly of the file "zx-centroface-prectena-ROM-2716.bin" made by l00k ;================================================================================================== ; disassembloval a okomentoval l00k ; do zkompilovatelné podoby upravil zxcygnus ; ; Tato verze zdrojového kódu produkuje v kompileru AS identický binární kód, jako byl přečtený ; z ROM ZX-Centroface. Komentáře a jména návěští nemusí být ideální, mohou obsahovat chyby. cpu z80undoc org 2048 ;-------------------------------------------------------------------------------------------------- ; #0800 2048 START di ld hl,RET_TO_ZXROM ; rutina Návrat s odpojením ROM (v bufferu tiskárny) push hl ; přes ni se vrátíme ld hl,(5c74h) ; T-ADDR - Address of next item in parameter table ld a,(hl) ; vyzvedni cp 0ach ; 0EAC -> je to příkaz COPY? (test nižšího bajtu adresy) jp nz,LPRINT_LLIST ; odskoč pokud není (LPRINT/LLIST) call REDIR_CHAN3 ; nasměruj obsluhu kanálu 3 na podprogram na adrese #0efc pop hl ; návratová adresa pop bc ; zahoď 3 hodnoty ze zásobníku (návrat z COPY-LINE a 2 uložené hodnoty) pop bc pop bc push hl ; vrať adresu návratové rutiny call ZXROM_CALL ; volej rutinu v ZX ROM jejíž adresa je za CALL dw 18h ; 0018: THE 'COLLECT CHARACTER' RESTART cp 13 ; CR? (#0d) - zde může být jen CR nebo ":" (COPY nemá parametry) ld bc,WAIT_FOR_SPACE ; kudy se vrátit - rutina počkej na stisk mezerníku push bc ; na zásobník COPY_NO_CONF jp z,PRINT_SCRSHOT ; Z = tiskni screenshot dle aktuálního nastavení COPY inc hl ; na další znak zadaného příkazu ld a,(hl) ; vyzvedni cp 13 ; CR? (#0d) jr z,COPY_NO_CONF ; Z = je, CR, konec příkazu, není konfigurační parametr cp 234 ; 234 (#ea) = token příkazu REM jr nz,COPY_NO_CONF ; NZ = není REM, není konfigurační parametr inc hl ; na další znak zadaného příkazu ld a,(hl) ; vyzvedni znak push hl ; uschovej adresu v řádku COPY_NEXT_PARAM ld hl,COPY_PARAM_TAB ; adresa tabulky parametrů call SEARCH_PROGADDR ; prohledej data a vrať adresu příslušné rutiny pop de ; obnov adresu příkazu do DE jp (hl) ; proveď konfiguraci dle parametru za COPY:REM ;-------------------------------------------------------------------------------------------------- ; #0839 2105 COPY : REM neznámý příkaz / parametr za REMem UNKNOWN_CMD call READ_NUMPARAM jp nz,REP_NONSINBASIC ; chyba Report "C - Nonsense in BASIC" ld a,(de) ; vyzvedni další znak v řádku push de ; uschovej adresu příkazu na zásobník jr COPY_NEXT_PARAM ; opakuj pro další parametr ;-------------------------------------------------------------------------------------------------- ; #0843 2115 společný návratový bod po zpracování parametrů příkazu COPY FINISH_SETUP ld hl,5c46h ; 5C45: PPC - Line number of statement being executed - vyšší bajt ld a,0c0h ; maska 1100 0000 and (hl) ; je nastaven bit 6 nebo bit 7? jr nz,CONFIG_STATUS ; NZ = ano, pokračuj zobrazením aktuální konfigurace pop hl ; zahoď adresu, návrat přes čekání na mezeru ret ; návrat přes 5b2d ; Znamená to, že ze ZX-Centroface chová odlišně když je příkaz vložený do programu a zadaný z příkazového řádku? ;-------------------------------------------------------------------------------------------------- ; #084d 2125 vypiš aktuální nastavení na obrazovku, příkaz COPY : ? CONFIG_STATUS xor a ; kanál 0 (vypisuje se do řádku 23) call ZXROM_CALL ; volej rutinu v ZX ROM jejíž adresa je za CALL dw 1601h ; 1601: THE 'CHAN-OPEN' SUBROUTINE ld a,1 ; hlášení 1 - inv 1+"CR |TOKENS ON " call WRITE_MESSAGE ; vypiš ld a,(iy+77h) ; 5CB1 - druhý bajt v NMIADD and 0ah ; maska 0000 1010 cp 0ah ; jsou nastaveny oba bity? ld a,2 ; hlášení 2 - AT 1,2+"+LF" call z,WRITE_MESSAGE ; vypiš pokud ano bit 2,(iy+77h) ; byl jen bit 2? ld a,3 ; hlášení 3 - AT 1,13+"OFF"" call nz,WRITE_MESSAGE ; pro nenulový bit ld a,4 ; hlášení 4 - AT 1,17 call WRITE_MESSAGE ; vypiš ld a,(iy+77h) ; vyzvedni rlca ; horní 3 bity rotuj vlevo do dolních 3 bitů rlca rlca and 7 ; nech jen tyto 3 bity add a,'0' ; přičti kód znaku 0 call ZXROM_CALL ; volej rutinu v ZX ROM jejíž adresa je za CALL dw 10h ; 0010: THE 'PRINT A CHARACTER' RESTART ld a,7ch ; znak "|" call ZXROM_CALL ; volej rutinu v ZX ROM jejíž adresa je za CALL dw 10h ; 0010: THE 'PRINT A CHARACTER' RESTART ld a,(iy+30h) ; sys. proměnná FLAGS2 - zx-centroface používá jinak nevyužité horní 3 bity ;Bit Description ;0 Reset when the screen is clear ;1 Set when the printer buffer is in use ;2 Set when in quotes during line parsing ;3 Set when CAPS LOCK is on ;4 Set when using channel K (keyboard) ;5 Unused ;6 Unused ;7 Unused rlca ; posuň horní 3 nepoužívané bity dolů rlca ; je zde číslo ovladače rlca and 00000111b ; nech jen dolní 3 bity add a,5 ; přičti 5 (5-11 jsou názvy tiskáren) call WRITE_MESSAGE ; vypiš ld a,7ch ; "|" call ZXROM_CALL ; volej rutinu v ZX ROM jejíž adresa je za CALL dw 10h ; 0010: THE 'PRINT A CHARACTER' RESTART ld l,(iy+45h) ; 5C7F - P-POSN - Column number of printer position ld h,00h ; připrav HL - počet sloupců na tiskárně ld e,20h ; povol úvodní mezeru ;zde vypíše číslo z HL (0-255) ld bc,0ff9ch ; -100 call ZXROM_CALL ; volej rutinu v ZX ROM jejíž adresa je za CALL dw 192Ah ; 192A: OUT_SP_NO This entry point is used to print a line number ; that may (E=+20) or may not (E=+FF) require leading spaces. ld c,0f6h ; -10 call ZXROM_CALL ; volej rutinu v ZX ROM jejíž adresa je za CALL dw 192Ah ; 192A: OUT_SP_NO This entry point is used to print a line number ; that may (E=+20) or may not (E=+FF) require leading spaces. ld a,l call ZXROM_CALL ; volej rutinu v ZX ROM jejíž adresa je za CALL dw 15EFh ; 15EF: THE 'MAIN PRINTING' SUBROUTINE ret ; návrat ;-------------------------------------------------------------------------------------------------- ; #08b9 2233 / - zapnutí(/x) vypnutí(/0) LF k CR, příkaz COPY : /n SET_LINE_END call READ_NUMPAR_INC ; posuň se v řádku a načti možné číslo jp z,REP_NONSINBASIC ; Z = nebylo číslo, chyba Report C - Nonsense in BASIC or c ; vyšší bajt or nižší čísla jr nz,SET_LINE_END_1 ; pro nenulovou hodnotu poskoč ld a,0f5h ; maska pro příznaky je 1111 01001 and (iy+77h) ; vynuluj příslušné bity jr SET_LINE_END_2 ; a poskoč na uložení výsledku SET_LINE_END_1 ld a,0ah ; maska 0000 1010 or (iy+77h) ; nastav tyto bity SET_LINE_END_2 ld (iy+77h),a ; ulož příznaky zpět jp FINISH_SETUP ; společná část po nastavení parametru příkazem COPY ;-------------------------------------------------------------------------------------------------- ; #08d4 2260 . - nastav typ COPY ; tečka nastavuje textový/grafický tisk příkazem COPY a zvětšení grafického tisku SET_PRN_MODE call READ_NUM_PARAM ; načti do horních 3 bitů C číslený parametr, může být jen 0-7 ld a,(iy+77h) ; vyzvedni and 00011111b ; vynuluj horní tři bity (#1f) or c ; přidej načtený parametr ld (iy+77h),a ; vrať zpět jp FINISH_SETUP ; společná část po nastavení parametru příkazem COPY ;-------------------------------------------------------------------------------------------------- ; #08e3 2275 CHR$ - zapnutí (1) vypnutí (0) tisku TOKENS SET_TOKENS call READ_NUMPAR_INC ; posuň se v řádku a načti možné číslo jp z,REP_NONSINBASIC ; Z = nebylo číslo, chyba Report C - Nonsense in BASIC or c ; vyšší bajt or nižší čísla jr nz,SET_TOKENS_1 ; pro nenulový odskoč set 2,(iy+77h) ; nastav bit 2 (23610 + 119 = 23729 druhý bajt v NMIADD) jr SET_TOKENS_2 ; přeskoč nulování SET_TOKENS_1 res 2,(iy+77h) ; vynuluj bit 2 (23610 + 119 = 23729 druhý bajt v NMIADD) SET_TOKENS_2 jp FINISH_SETUP ; společná část po nastavení parametru příkazem COPY ;-------------------------------------------------------------------------------------------------- ; #08f9 2297 COPY - tisk kopie obrazovky podle aktuálního nastavení PRINT_SCRSHOT pop hl ; zahodit návratovou adresu ld a,(iy+77h) ; vyzvedni typ and 0e0h ; nech horní 3 bity - maska 1110 0000 ld hl,COPY_MODE_TAB ; adresa tabulky pro typ COPY obrazovky call SEARCH_PROGADDR ; prohledej data a vrať adresu příslušné rutiny jp (hl) ; a vrať se přes ni ;-------------------------------------------------------------------------------------------------- ; #0906 2310 COPY - normální velikost 1:1 COPY_NORM ld a,2 ; pošli 2. sekvenci z PRINTER_SEQ na tiskárnu = n/72 inch line spacing call PRINT_CTRLSEQ call PRINT_NEW_LINE ; zpracování CR - odřádkování na tiskárně ld bc,0 ; vynulovat počítadla B = Y <0,191> a C = X <0,255> = souřadnice pixelů od levého horního rohu COPY_LNLOOP push bc ; uschovej souřadnice ld a,1 ; pošli 1. sekvenci PRINTER_SEQ na tiskárnu = 8 characters margin from left border call PRINT_CTRLSEQ ld a,3 ; pošli 3. sekvenci z PRINTER_SEQ na tiskárnu = 256 columns (pixels) call PRINT_CTRLSEQ pop bc ; obnov souřadnice ; jehličková tiskárna tiskne pixely na výšku - je třeba načíst 8 pixelů pod sebou z obrazovky COPY_PXCOLMN push bc ; uschovej souřadnice ld d,8 ; počítadlo - 8 pixelů/bitů COPY_PXCOLUMN push bc ; uschovej souřadnice pixelu ze sloupce 8px ld a,b ; souřadnice Y do A call ZXROM_CALL ; zavolej část podprog. "PIXEL ADDRESS" v ZX ROM dw 22b0h ; A = Y, C = X, vrátí adresu v HL a číslo bitu v A ld b,a ; číslo bitu v bytu do B inc b ; zvyš číslo bitu, musí být > 0 ld a,(hl) ; vyzvedni obrazová data COPY_ROTPX rlca ; rotuj je djnz COPY_ROTPX ; opakuj podle čísla bitu rl e ; narotuj příslušný bit do E pop bc ; obnov souřadnice pixelu ze sloupce 8px inc b ; souřadnice Y o 1 pixel dolů dec d ; sniž počítadlo pixelů jr nz,COPY_PXCOLUMN ; opakuj pro všech 8 pixelů nad sebou ld a,e ; sestavený výsledek z E do A call PRINT_CHAR ; pošli A do tiskárny inc c ; zvyš X souřadnici -> další osmice pixelů nad sebou o jeden pixel vpravo ld a,c ; odlož X souřadnici do A jr z,COPY_NEXTLN ; Z = zpracováno 256px na šířku obrazovky, odskok pop bc ; obnov souřadnice ld c,a ; odloženou novou souřadnici X do C jr COPY_PXCOLMN ; opakuj pro další osmici pixelů nad sebou COPY_NEXTLN pop de ; zahoď uložené souřadnice (v BC jsou suořadnice správné) call PRINT_NEW_LINE ; pošli CR, nebo CRLF dle nastavení ld a,191 ; výška obrazovky - 1 do A cp b ; porovnej s aktuální Y souřadnicí jr nc,COPY_LNLOOP ; NC = souřadnice Y nepřesáhla 191, opakuj ld a,4 ; pošli 4. sekvenci z PRINTER_SEQ na tiskárnu = 1/6 inch line spacing jp PRINT_CTRLSEQ ;-------------------------------------------------------------------------------------------------- ; #094e 2382 COPY - zvětšení ; TODO: tady mohou být návěští popletené... nutno zkorigovat podle disaasemblingu od l00ka COPY_ZOOM ld a,6 ; pošli 6. sekvenci z PRINTER_SEQ na tiskárnu = n/216-inch line spacing call PRINT_CTRLSEQ call PRINT_NEW_LINE ; pošli CR, nebo CRLF dle nastavení ld a,1 ; pošli 1. sekvenci PRINTER_SEQ na tiskárnu = 8 characters margin from left border call PRINT_CTRLSEQ ld bc,0 ; B=0 y (0-191), C=0 (0-255) ; #095e 095eh COPYZOOM_LOOP push bc ; uschovej počítadla ld a,5 ; pošli 5. sekvenci z PRINTER_SEQ na tiskárnu = number of columns 768 call PRINT_CTRLSEQ pop bc ; obnov počítadla ; #0965 0965h COPYZOOM_PXCOL2 push bc ; ulož počítadla ld d,4 ; počítadlo 4x (protože 4 pixely na výšku, každý 2x ; #0968 0968h COPYZOOM_PXCOL push bc ; ulož počítadla na začátku cyklu ld a,b ; souřadnice Y do A call ZXROM_CALL ; zavolej část podprog. "PIXEL ADDRESS" v ZX ROM dw 22b0h ; A = Y, C = X, vrátí adresu v HL a číslo bitu v A ld b,a ; číslo bitu do B inc b ; zvyš, použije se v cyklu ld a,(hl) ; načti obrazová data ; #0972 0972h COPYZOOM_ROTPX rlca ; rotuj djnz COPYZOOM_ROTPX ; opakuj podle čísla bitu rl e ; výsledný bit do E rrca ; ten samý bit ještě jednou do CY rl e ; a do E pop bc ; obnov počítadla inc b ; zvyš Y dec d ; sniž počítadlo jr nz,COPYZOOM_PXCOL ; opakuj 4x ld a,e ; načtený výsledek doA call PRINT_CHAR ; pošli A na tiskárnu call PRINT_CHAR ; pošli A na tiskárnu call PRINT_CHAR ; pošli A na tiskárnu inc c ; zvyš X ld a,c ; schovej do C jr z,COPYZOOM_NEWLN ; pokud je 256 (0) poskoč pop bc ; obnov počítadla ld c,a ; vrať X do C jr COPYZOOM_PXCOL2 ; opakuj ; #0991 0991h COPYZOOM_NEWLN pop de ; zahoď počítadla call PRINT_NEW_LINE ; pošli CR, nebo CRLF dle nastavení ld a,0bfh ; 191 cp b ; porovnej jr nc,COPYZOOM_LOOP ; opakuj dokud není ld a,7 jp PRINT_CTRLSEQ ; vrať se přes vypiš A-tou položku ze seznamu na PRINTER_SEQ na tiskárnu ;-------------------------------------------------------------------------------------------------- ; #099f 2463 vytiskni 1 znak (8x8 bodů) graficky na tiskárně ; přepnutí na grafiku musí být provedeno předem ; očekává adresu předlohy v HL (písmena s diakritikou, copyright, nebo UDG PRINTGR_CHAR ld bc,087fh ; B = 8, C = 01111111b PRINTGRCHAR_1 push bc ; uschovej počítadla push hl ; a adresu PRINTGRCHAR_2 ld a,(hl) ; načti příslušné bity inc hl ; jednotlivých řádků or c ; vymaskuj, všechny bit 1, kromě žádaného (počínaje bitem 7) add a,1 ; proč ne inc a? rl e ; do E zdola djnz PRINTGRCHAR_2 ; opakuj 8x ld a,e ; výsledek do A call PRINT_CHAR ; pošli A na tiskárnu pop hl ; obnov registry pop bc rrc c ; posuň masku v C na další bit jr c,PRINTGRCHAR_1 ; opakuj 8x ret ; návrat ;-------------------------------------------------------------------------------------------------- ; #09b8 2488 posuň se v řádku a načti možné číslo READ_NUMPAR_INC inc de ; #09b9 2489 načti možné číslo READ_NUMPARAM ex de,hl ; prohoď registry ld de,(5c5dh) ; 5C5D: CH-ADD - Address of the next character to be interpreted push de ; uschovej ld (5c5dh),hl ; 5C5D: CH-ADD - Address of the next character to be interpreted push hl ; vlož vstupní hodnotu z DE na proměnnou a schovej si ji res 7,(iy+1) ; FLAGS - Various flags to control the BASIC system ; Reset when checking syntax call ZXROM_CALL ; volej rutinu v ZX ROM jejíž adresa je za CALL dw 24FBh ; 24FB: THE 'SCANNING' SUBROUTINE pop hl ; obnov adresu push hl ; a ještě schovej ld (5c5dh),hl ; 5C5D: CH-ADD - Address of the next character to be interpreted set 7,(iy+01h) ; FLAGS - Various flags to control the BASIC system ; Reset when checking syntax call ZXROM_CALL ; volej rutinu v ZX ROM jejíž adresa je za CALL dw 24FBh ; 24FB: THE 'SCANNING' SUBROUTINE pop hl ; obnov adresu bit 6,(iy+1) ; FLAGS - Various flags to control the BASIC system ; Variable type flag: string (reset) or numeric (set) push af ; uschovej příznak řetězec/číslo jr nz,READ_NUMBER ; pro číslo poskoč call ZXROM_CALL ; volej rutinu v ZX ROM jejíž adresa je za CALL dw 2BF1h ; 2BF1: THE 'STK-FETCH' SUBROUTINE - načti poslední číslo ze zásobníku kalkulátoru do registrů jr READ_NUM_FIN ; na ukončení ; #09e9 2537 READ_NUMBER push hl call ZXROM_CALL ; volej rutinu v ZX ROM jejíž adresa je za CALL dw 2da2h ; 2DA2: THE 'FLOATING-POINT TO BC' SUBROUTINE pop hl ld a,(hl) ; vyzvedni znak cp 'A' ; je to A a víc? (65, #41) jr nc,READ_NUM_FIN ; na konec pokud ano ld a,0eh ; 14 - BASIC číslo v řádku READ_NUMBER_2 inc hl ; posuň se cp (hl) ; porovnej jr nz,READ_NUMBER_2 ; opakuj dokud není push bc ; schovej BC call ZXROM_CALL ; volej rutinu v ZX ROM jejíž adresa je za CALL dw 11a7h ; 11A7: THE 'REMOVE-FP' SUBROUTINE pop bc ; obnov BC READ_NUM_FIN pop af ; obnov příznak ld a,b ; vyšší bajt i do B pop hl ; obnov HL - původní hodnota CH-ADD ld (5c5dh),hl ; 5C5D: CH-ADD - Address of the next character to be interpreted ret ; návrat ;-------------------------------------------------------------------------------------------------- ; #0a09 2569 = - nastav typ tiskárny SET_PRINTER call READ_NUM_PARAM ; načti do horních 3 bitů C číslený parametr, může být jen 0-7 ld a,(iy+30h) ; sys. proměnná FLAGS2 - zx-centroface používá jinak nevyužité horní 3 bity ;Bit Description ;0 Reset when the screen is clear ;1 Set when the printer buffer is in use ;2 Set when in quotes during line parsing ;3 Set when CAPS LOCK is on ;4 Set when using channel K (keyboard) ;5 Unused ;6 Unused ;7 Unused and 00011111b ; nech dolních 5 bitů or c ; přidej parametr ld (iy+30h),a ; ulož zpět jp FINISH_SETUP ; společná část po nastavení parametru příkazem COPY ;-------------------------------------------------------------------------------------------------- ; #0a18 2584 prohledej tabulku parametrů a vrať adresu obslužné rutiny pro ten parametr ; v HL adresa tabulky, v A testovaná hodnota SEARCH_PROGADDR ld b,0 ; počet položek do BC ld c,(hl) inc hl ; posuň se ld e,(hl) ; vyzvedni adresu tabulky adres inc hl ld d,(hl) inc hl ; posuň se za ni cpir ; prohledej data ex de,hl ; adresa kde se zastavil do DE, do HL adresa začátku tabulky add hl,bc ; indexuj podle BC add hl,bc ld e,(hl) ; vyzvedni adresu rutiny inc hl ld d,(hl) ex de,hl ; dej ji do HL ret ; a návrat ;-------------------------------------------------------------------------------------------------- ; #0a2a 2602 LEN - nastav délku řádky tiskárny SET_LINE_LENGTH call READ_NUMPAR_INC ; posuň se v řádku a načti možné číslo jp z,REP_NONSINBASIC ; Z = nebylo číslo, chyba Report C - Nonsense in BASIC or a ; otestuj A jp nz,MSG_OUTOFRANGE ; chyba Report B - integer out of range or c ; přidej C (k nule) jp z,MSG_OUTOFRANGE ; chyba Report B - integer out of range ld (iy+45h),c ; nastav 5C7F: P-POSN - Column number of printer position jp FINISH_SETUP ; společná část po nastavení parametru příkazem COPY ;-------------------------------------------------------------------------------------------------- ; #0a3e 2622 COPY - screenshot obrazovky na tiskárnu pouze znakově (nerozpoznatelné znaky se nevytisknou) COPY_CHARS ld bc,0 ; resetuj znakové souřadnice - B=0 sloupec (0-31), C=0 řádek (0-23) ;smyčka COPYCH_LOOP push bc ; uschovej souřadnice push bc ; 2x call ZXROM_CALL ; volej rutinu v ZX ROM jejíž adresa je za CALL dw 2538h ; do 2535: THE 'SCANNING SCREEN$' SUBROUTINE - v BC již souřadnice call ZXROM_CALL ; volej rutinu v ZX ROM jejíž adresa je za CALL dw 2BF1h ; 2BF1: THE 'STK-FETCH' SUBROUTINE dec c pop bc ; obnov souřadnice jr nz,COPYCH_SPACE ; pokud nebylo C=1 vytiskni mezeru cp ' ' ; znaky menší než mezera? jr c,COPYCH_SPACE ; ty taky nahraď mezerou cp 60h ; byla to libra? jr nz,COPYCH_NOPOUND ; NZ = není libra, přeskoč nahrazení ld a,23h ; tu nahraď "#" jr COPYCH_PRINT ; tiskni znak ; COPYCH_NOPOUND cp 80h ; je znak ASCII? (tj. je kód znaku menší než 128?) jr c,COPYCH_PRINT ; C = je ASCII, vytiskni COPYCH_SPACE ld a,' ' ; není-li ASCII, tiskni mezeru COPYCH_PRINT call PRINT_CHAR ; vypiš PRINT_CHARA na tiskárnu inc b ; posuň se ld a,b ; uschovej cp 32 ; už je to 32? jr nc,COPYCH_NEXTLN ; NC = poskoč pop bc ; obnov souřadnice ld b,a ; obnov uschovanou hodnotu jr COPYCH_LOOP ; a opakuj ;konec řádku COPYCH_NEXTLN pop bc ; obnov počítadla call PRINT_NEW_LINE ; pošli CR, nebo CRLF dle nastavení inc c ; zvyš počítadlo řádků ld a,23 ; 23 (#17) cp c ; porovnej číslo řádku s 23 v A ret c ; C = 24 řádků vytištěno, návrat ld b,0 ; sloupec 0 jr COPYCH_LOOP ; opakuj pro další řádek ;-------------------------------------------------------------------------------------------------- ; #0a7d 2685 načti do horních 3 bitů C číslený parametr, může být jen 0-7 READ_NUM_PARAM call READ_NUMPAR_INC ; posuň se v řádku a načti možné číslo jp z,REP_NONSINBASIC ; Z = nebylo číslo, chyba Report C - Nonsense in BASIC ld a,11111000b ; maska 11111000 (#f8) - pro test, hodnota smí být jen 0-7 and c ; použij na C or b ; přidej bity z B jp nz,MSG_OUTOFRANGE ; pokud to nebyla 0, chyba Report B - integer out of range ld a,c ; parametr rrca ; přesuň dolní 3 bity na horní b0->b5,b1->b6,b2->b7 rrca rrca ld c,a ; výsledek do C ret ; návrat ;-------------------------------------------------------------------------------------------------- ; #0a90 2704 pošli A-tou položku z tabulky sekvencí na tiskárnu (řídící ECS sekvence a copyright) PRINT_CTRLSEQ push hl ; uschovej registry push bc push af ld hl,PRINTER_SEQ ; do HL adresa tabulky sekvencí pro tiskárnu call SEARCH_STRING ; najdi A-tou položku, vrací délku v C a adresu řetězce v HL ld b,c ; délka řetězce do B PRINT_CTRLSEQ_1 ld a,(hl) ; vyzvedni znak do A call PRINT_CHAR ; tiskni znak inc hl ; adresu na další znak / byte djnz PRINT_CTRLSEQ_1 ; opakuj pro všechny znaky pop af ; obnov registry pop bc pop hl ret ; návrat ;-------------------------------------------------------------------------------------------------- ; #0aa5 2725 vypiš na obrazovku A-tý text z tabulky řetězců (hlášky i formátovací sekvence) ; používá se k zobrazení informačního řádku s aktuálním nastavením WRITE_MESSAGE push hl ; uschovej registry push bc push af ld hl,MESSAGE_TAB ; do HL adresa tabulky řetězců call SEARCH_STRING ; najdi A-tou položku, vrací délku v C a adresu řetězce v HL ld b,c ; délka textu do B WRITE_MSG_1 ld a,(hl) ; vyzvedni znak call ZXROM_CALL ; volej rutinu v ZX ROM jejíž adresa je za CALL dw 10h ; 0010: THE 'PRINT A CHARACTER' RESTART (RST 16) inc hl ; adresu na další znak / byte djnz WRITE_MSG_1 ; opakuj pro celý řetězec pop af ; obnov registry pop bc pop hl ret ; návrat ;-------------------------------------------------------------------------------------------------- ; #0abc 2748 najdi A-tou položku v tabulce řetězců, dej do C její délku, do HL adresu ; prohledává tabulku hlášek i tabulku řídících sekvencí pro tiskárnu ; A musí být větší než 0 (1 = 1. sekvence, 0 = 256. sekvence) SEARCH_STRING ld b,0 ; připrav SEARCH_STR_1 ld c,(hl) ; délku položky do C inc hl ; adresu na řetězec po bytu délky dec a ; sniž počítadlo položek ret z ; Z = hotovo, položka nalezena (ukazatel v HL) add hl,bc ; přičti délku položky k adrese -> na další položku jr SEARCH_STR_1 ; a opakuj ;-------------------------------------------------------------------------------------------------- ;je to do COPY-LINE, dá A do D a přistránkuje EPROM interface ;pokračuje se pak v EPROM interfejsu na 0F0Eh ;-------------------------------------------------------------------------------------------------- ; #0ac5 2757 nastav adresu obslužného programu pro kanál #3 na 0efch REDIR_CHAN3 push hl ; uschovej registry push de push bc push af ld bc,15 ; informace o kanálu zabírají 5 bytů *3 na kanál ld hl,(5c4fh) ; vyzvedni CHANS "Address of channel data", může se posunout např. TRDOSem add hl,bc ; posuň ukazatel na kanál #3 ld bc,0efch ; do BC adresu obslužného programu (oblast COPY-LINE od #0ef4 v ZX ROM) ld (hl),c ; zapiš do proměnné o kanálu #3 inc hl ld (hl),b call COLUMN_33_TO_80 ; pokud je sloupec tiskárny 33, změň hodnotu na 80 call CPY_SUBROUTINE ; přenes rutiny do bufferu tiskárny (25 bajtů, 3 rutiny) pop af ; obnov registry pop bc pop de pop hl ret ; návrat ; CHANS 5c4fh = 23631 ; se samotnou ZX 48k ROM je v CHANS 5cb6h = 23734, channel #3 je na 5cc5h 23749 a obsahuje 09f4h 2548 ; s inic. Betadiskem je v CHANS 5d26h 23846 (+15 = 5d35h) a obsahuje 09f4h 2548 ;-------------------------------------------------------------------------------------------------- ; #0ae1 2785 pokud je (IY+45h)=33, změň hodnotu na 80 .... smysl? ; ; 5C7F: P-POSN - Column number of printer position COLUMN_33_TO_80 ld a,(iy+45h) ; pozice znaku (sloupec) ze sys. proměnné do A cp 33 ; je to 33? ret nz ; NZ = není, návrat ld (iy+45h),80 ; 32 znaků vytištěno, změň na 80 ret ; návrat ;-------------------------------------------------------------------------------------------------- ; #0aec 2796 posuň tiskovou pozici a vytiskni znak z A MOVE_AND_PRINT call MOVE_PRINT_POSX ; posuň aktuální tiskovou souřadnici (IY+46h), pokud je max tak CR ;-------------------------------------------------------------------------------------------------- ;#0aef 2799 pošli znak do tiskárny z reg. A PRINT_CHAR push af ; uschovej znak PRINT_BUSYLOOP call ZXROM_CALL ; volej rutinu v ZX ROM jejíž adresa je za CALL dw 8020 ; (#1F54) test klávesy BREAK jp nc,MSG_BREAK ; pokud je, ohlaš BREAK a konec in a,(0bfh) ; je tiskárna připravena? and 01000000b ; (#40) ponech bit 6 = signál BUSY z tiskárny jr nz,PRINT_BUSYLOOP ; NZ = tiskárna je BUSY, opakuj pop af ; obnov hodnotu pro port out (0bfh),a ; strobe H 0b10111111 = zapíše znak na port s dosud neaktivním strobe out (0bbh),a ; strobe L 0b10111011 = potvrzení platnosti znaku aktivací strobe po dobu 11T (cca 3,1us) out (0bfh),a ; strobe H 0b10111111 = deaktivuje strobe, ale zatím nemění znak na portu ret ; a návrat ;-------------------------------------------------------------------------------------------------- ; #0b06 2822 počkej na stisk mezerníku WAIT_FOR_SPACE ld a,127 ; příslušná řada (#7F) in a,(254) ; načti stav (#FE) rra ; bit 0 do carry jr c,WAIT_FOR_SPACE ; C = 1 = není mezerník, opakuj ret ; je mezeník, návrat ;-------------------------------------------------------------------------------------------------- ; #0b0e 2830 vstup z LPRINT/LLIST, znak k výpisu je v D ; provede inicializaci kanálu #3 pokud už není provedena LPRINT_LLIST ld hl,(5c4fh) ; vyzvedni CHANS - Address of channel data ld c,15 ; posun o 3*5 bytů ld b,0 add hl,bc ; na kanál #3 ld c,(hl) ; vyzvedni do BC adresu inc hl ld b,(hl) ld hl,0efch ; adresa obslužného programu call REDIR_CHAN3 ; nasměruj obsluhu kanálu 3 na podprogram na adrese #0efc sbc hl,bc ; porovnej stávající adresu na kanálu oproti 0EFC (nová hodnota) jr z,LPRINT_LLIST_2 ; a pokud tam tato hodnota už byla poskoč ; inicializace kanálu #3, nastavení výchozích parametrů ZX-Centroface ld a,(iy+30h) ; sys. proměnná FLAGS2 - zx-centroface používá jinak nevyužité horní 3 bity and 00011111b ; nech jen dolních 5 bitů (používá BASIC) - typ tiskárny 0 = STAR ld (iy+30h),a ; zapiš FLAGS2 ld (iy+77h),0 ; vynuluj ld (iy+45h),80 ; nastav 5C7F: P-POSN - Column number of printer position na 80 pop hl ; návratová adresa přes 5b2dh do HL pop bc ; zahoď 4 adresy ze zásobníku před návratovou pop bc pop bc pop bc jp (hl) ; vrať se přes odpojení ROM ;-------------------------------------------------------------------------------------------------- ; #0b39 2873 standardní tisk znaku LPRINT/LLIST po kontrole LPRINT_LLIST_2 ld a,d ; znak k výpisu do A bit 2,(iy+77h) ; příznak CHR$ jr nz,0b48h ; pokud je 1 poskoč - přímý tisk bit 0,(iy+77h) ; příznak ESC res 0,(iy+77h) ; vynuluj ho - toto umožňuje pouze ESC+ 1 znak (2 bajtové ESC povely) !! jp nz,PRINT_CHAR ; pokud byl příznak =1 tak vytiskni znak z A ld a,(iy+30h) ; sys. proměnná FLAGS2 - zx-centroface používá jinak nevyužité horní 3 bity or 00011111b ; nastav 5 dolních bitů na 1 inc a ; zvýšením o jedna otestuj, jestli i horní 3 bity byly 1, tj. jestli po OR bylo FLAGS2 255 ld a,d ; znak k výpisu do A call z,PRINT_CSMODE ; Z = typ tiskárny v proměnné FLAGS2 byl 7 "CS Mode" = zpracování českých znaků 192-255 cp 6 ; řídící kód čárka (TAB) jr z,PRINT_DASH ; Z = zpracuj čárku cp 22 ; řídící kód AT (#16) jr z,PRINT_TAB_AT ; Z = zpracuj AT cp 23 ; řídící kód TAB (#17) jp nz,PRINT_NO_DTA ; NZ = není TAB ;zpracování řídícího kódu TAB a AT PRINT_TAB_AT ld de,5b26h ; nová adresa pro PO_CHANGE - tudy půjde další znak call ZXROM_CALL ; volej rutinu v ZX ROM jejíž adresa je za CALL dw 0a80h ; 0A80: PO_CHANGE (current 'output' routine address is changed temporarily) ;-------------------------------------------------------------------------------------------------- ; #0b6a 2922 kopíruj podprogram do bufferu tiskárny (25 bajtů, 3 rutiny) CPY_SUBROUTINE ld hl,0f6ch ; zdroj, adresa 3 malých podprogramů ld de,5b20h ; cíl, tiskový buffer ZX Printer ld bc,25 ; 25 bytů ldir ; kopíruj ret ;-------------------------------------------------------------------------------------------------- ; #0b76 2934 zpracování čísla za TAB,AT a obnovení tiskové rutiny PRINT_ATTAB_NUM ld de,5b20h ; nová adresa pro PO_CHANGE - tudy půjde další znak (standard) call ZXROM_CALL ; volej rutinu v ZX ROM jejíž adresa je za CALL dw 0a80h ; 0A80: PO_CHANGE (current 'output' routine address is changed temporarily) or 255 ; nastav příznaky NZ,NC ld a,b ; znak co přišel do A push af ; uschovej jr PRINT_ALIGNSP ; skok na zarovnání mezerami ;-------------------------------------------------------------------------------------------------- ; #0b84 2948 řídící kód 6 - čárka PRINT_DASH push af ; uschovej příznaky - při vstupu zde je Z ld a,(iy+45h) ; vyzvedni 5C7F: P-POSN - Column number of printer position - max. pozice (80) srl a ; divné dělení 2 (co pokud si nastavím liché číslo?) PRINT_ALIGNSP sub (iy+46h) ; 5C80: PR-CC - Address of next position for LPRINT to print at - odečti aktuální pozici jr nc,PRINT_HALFLN ; odskoč pokud si v první půlce řádku call PRINT_NEW_LINE ; pošli CR, nebo CRLF dle nastavení pop af ; obnov příznaky ret z ; pro Z návrat ;vypiš B mezer PRINT_B_SPACES ld a,' ' ; mezera call MOVE_AND_PRINT ; vypiš na tiskárnu djnz PRINT_B_SPACES ; opakuj potřebný počet ret ; návrat ;-------------------------------------------------------------------------------------------------- ; #0b9c 2972 čárka a akt. pozice v první půlce řádku PRINT_HALFLN pop de ; zahoď uložené příznaky ret z ; pokud si přesně v půlce návrat ld b,a ; rozdíl je počet mezer k výpisu do B jr PRINT_B_SPACES ; vypiš mezery ;-------------------------------------------------------------------------------------------------- ; #0ba1 2977 nebylo AT,čárka,TAB PRINT_NO_DTA cp 13 ; je znak CR? (#0d) jp z,PRINT_NEW_LINE ; z = pošli CR, nebo CRLF dle nastavení cp 24 ; jiné řídící znaky z rozsahu (#18) ret c ; C = řídící znaky menší než 24 budou ignorovány cp 27 ; je ESC? (#1b) jr nz,PRINT_NO_ESC ; NZ = není ESC, přeskoč zpracování ESC set 0,(iy+77h) ; zpracování ESC - nastav příznak ESC kód ; toto proč? zde bych očekával jp PRINT_CHAR - tisk ; od kdy se ESC kódy počítají do délky a netisknou ??? ; nastavením příznaku jde další znak přímo na tisk... ale bez toho ESC ???? jp MOVE_PRINT_POSX ; návrat přes posun aktuální tiskové pozice (IY+46h), pokud je max tak CR ;-------------------------------------------------------------------------------------------------- ; #0bb4 2996 pokud nebyl řídící znak PRINT_NO_ESC cp 96 ; (#60) znak s kódem 96? - libra jr nz,PRINT_NO_POUND ; poskoč pokud ne ld a,23h ; nahraď libru znakem "#" PRINT_NO_POUND cp 127 ; (#7f) znaky 0..126? jp c,MOVE_AND_PRINT ; C = znaky v rozsahu 32..126 tiskni přímo (s posunem pozice) jp z,PRINT_COPYRIGHT ; Z = tiskni znak 127 copyright cp 144 ; (#90) znaky 128..143, čtverečková grafika jp c,PRINT_BLOCKS ; C = tiskni čtverečkové znaky 128..143 cp 165 ; (#a5) znaky 144..164, UDG jp c,PRINT_UDG ; C = tiskni UDG v rozsahu 144..164 ;znaky 165 a výše sub 165 ; (#a5) odečti offset call CALL_NEXTADDR ; pokračuj v ZX ROM na adrese za CALL dw 0c10h ; 0C10: PO_TOKENS Enter here when expanding token codes. ;-------------------------------------------------------------------------------------------------- ; #0bd3 3027 pro CS MODE voláno toto PRINT_CSMODE cp 192 ; 0-191? (#c0) ret c ; C = menší než 192 = normální tisk, návrat pop hl ; návratovou adresu zahodit (voláno CALLem) call MODE_AND_TESTGR ; posuň tiskovou pozici a otestuj jestli je grafická tiskárna jr z,PRINT_SPACE ; Z = není grafická tiskárna, vytiskni mezeru sub 192 ; odečti 192 (#c0) ld hl,CSCHAR_TABLE ; do HL adresa tabulky znaků s diakritikou jr PRINT_GRCMN ; pokračuj společnou částí pro tisk jednoho grafického znaku ;-------------------------------------------------------------------------------------------------- ; #0be3 3043 zpracování znaku 127 (copyright) PRINT_COPYRIGHT call MODE_AND_TESTGR ; posuň tiskovou pozici a otestuj jestli je grafická tiskárna ld hl,FONT_COPYRIGHT ; grafická předloha (c) jr nz,PRINT_GRCMN_2 ; NZ = vytiskni graficky ld a,9 ; jinak sekvence č.9 = rozepsaný copyright do 3 ASCII znaků "(c)" jp PRINT_CTRLSEQ ; vrať se přes vypiš A-tou položku ze seznamu na PRINTER_SEQ na tiskárnu ;-------------------------------------------------------------------------------------------------- ; #0bf0 3056 znaky 128..143 (čtverečková grafika) PRINT_BLOCKS call MODE_AND_TESTGR ; posuň tiskovou pozici a otestuj jestli je grafická tiskárna jr z,PRINT_SPACE ; pokud ne, vytiskni mezeru ld b,a ; číslo znaku do A call ZXROM_CALL ; volej rutinu v ZX ROM jejíž adresa je za CALL dw 0b38h ; 0B38: PO_GR_1 Graphic characters are constructed in an ad hoc manner ; in the calculator's memory area, i.e. mem-0 and mem-1. ld hl,5c92h ; MEMBOT - Calculator's memory area - adresa vytvořené předlohy jr PRINT_GRCMN_2 ; vytiskni graficky ;-------------------------------------------------------------------------------------------------- ; #0c00 3072 vytiskni mezeru PRINT_SPACE ld a,' ' ; mezera do A (#20) jp PRINT_CHAR ; vytiskni ;-------------------------------------------------------------------------------------------------- ; #0c05 3077 znaky 144-164 (UDG) PRINT_UDG call MODE_AND_TESTGR ; posuň tiskovou pozici a otestuj jestli je grafická tiskárna ; ;zde mělo být: jr z,PRINT_UDG_CHAR ; sub 90h ;tj. prohozené instrukce sub 90h ; odečti 144 (první znak UDG) jr z,PRINT_UDG_CHAR ; Z = tiskni UDG znakově pomocí ASCII ld hl,(5c7bh) ; adresu předloh UDG do HL - "Address of first user defined graphic" - kvůli 16kB ZXS PRINT_GRCMN ld d,0 ; kód znaku z A do DE ld e,a ex de,hl ; kód znaku do HL, adresa do DE add hl,hl ; 2x add hl,hl ; 4x add hl,hl ; 8x add hl,de ; přičti adresu předloh PRINT_GRCMN_2 ld a,8 ; pošli 8 sekvenci z PRINTER_SEQ na tiskárnu = n/72 inch line spacing call PRINT_CTRLSEQ ; zachová reg. A, HL i BC jp PRINTGR_CHAR ;-------------------------------------------------------------------------------------------------- ; #0c1f 3103 pokud není grafická tiskárna vypiš písmeno odpovídající UDG ; zde by mělo být správně: sub 4Fh (79) PRINT_UDG_CHAR add a,'A' ; přičti znak A (#41) jp PRINT_CHAR ; vytiskni znakově ;-------------------------------------------------------------------------------------------------- ; #0c24 3108 posuň tiskovou pozici a otestuj jestli je grafická tiskárna MODE_AND_TESTGR call MOVE_PRINT_POSX ; posuň aktuální tiskovou souřadnici (IY+46h), pokud je max tak CR push bc ; uschovej ld c,a ; uschovej A v C ld a,(iy+77h) ; vyzvedni příznaky and 11100000b ; nech jen horní 3 bity () ld a,c ; obnov A pop bc ; obnov BC ret ; návrat ;-------------------------------------------------------------------------------------------------- ; #0c31 3121 zpracování CR vs CRLF odřádkování PRINT_NEW_LINE push af ; uschovej A ld a,13 ; kód CR do A ld (iy+46h),0 ; 5C80: PR-CC - Address of next position for LPRINT to print at call PRINT_CHAR ; vytiskni ld a,(iy+77h) ; načti příznaky and 10 ; maska 00001010b cp 10 ; zůstalo 10? call z,PRINT_CHAR ; Z = je 10, je zapnuto CRLF, vytiskni ještě LF pop af ; obnov A ret ; návrat ;-------------------------------------------------------------------------------------------------- ; #0c47 3143 posuň aktuální tiskovou souřadnici (IY+46h), dosáhla-li konce řádku, tak odřádkuj MOVE_PRINT_POSX push af ; uschovej A ld a,(iy+46h) ; 5C80: PR-CC - Address of next position for LPRINT to print at cp (iy+45h) ; porovnej s 5C7F: P-POSN - Column number of printer position call nc,PRINT_NEW_LINE ; NC = konec řádku dosažen, přejdi na další řádek inc (iy+46h) ; zvyš 5C80: PR-CC - Address of next position for LPRINT to print at pop af ; obnov A ret ; návrat ;-------------------------------------------------------------------------------------------------- ; #0c56 3158 chyba Report C - Nonsense in BASIC REP_NONSINBASIC call CALL_NEXTADDR ; pokračuj v ZX ROM na adrese za CALL dw 1C8Ah ; Report C - Nonsense in BASIC. ;-------------------------------------------------------------------------------------------------- ; #0c5b 3163 volej rutinu v ZX ROM jejíž adresa je za CALL ZXROM_CALL push de push hl push bc call CPY_SUBROUTINE ; přenes rutiny do bufferu tiskárny (25 bajtů, 3 rutiny) pop bc pop hl inc sp inc sp ex (sp),hl ld e,(hl) inc hl ld d,(hl) inc hl ex (sp),hl dec sp dec sp push de ex de,hl ld hl,5b33h ; rutina připojení ROM interface inc sp inc sp ex (sp),hl dec sp dec sp ex de,hl jr ROM_DISCONNECT ; návrat přes odpojení ROM ;-------------------------------------------------------------------------------------------------- ; #0c7a 3194 pokračuj v ZX ROM na adrese za CALL CALL_NEXTADDR push de push hl push bc call CPY_SUBROUTINE ; přenes rutiny do bufferu tiskárny (25 bajtů, 3 rutiny) pop bc pop hl pop de ex (sp),hl push de ld e,(hl) inc hl ld d,(hl) pop hl ex de,hl ex (sp),hl ;návrat přes odpojení ROM ROM_DISCONNECT push hl ; uschovej HL ld hl,RET_TO_ZXROM ; adresa rutiny odpojení ROM interface ex (sp),hl ; na zásobník a obnov HL ret ; a vrať se ;-------------------------------------------------------------------------------------------------- ; #0c91 3217 tabulka hlášení pro rutinu 0AA5h MESSAGE_TAB db 19 ; délka 1. řetězce db 14h,1 ; zapnutí inverze db "CR ",124 db "TOKENS ON ",124 ; #0ca5 db 6 ; délka 2. řetězce db 22,1,2 ; AT 1,2 db "+LF" ; #0cac db 6 ; délka 3. řetězce db 22,1,13 ; AT 1,13 db "OFF" ; #0cb3 db 3 ; délka 4. řetězce db 22,1,17 ; AT 1,17 ; #0cb7 db 9 ; délka 5. řetězce db "STAR " ; #0cc1 db 9 ; délka 6. řetězce db "EPSON 80 " ; #0ccb db 9 ; délka 7. řetězce db "EPSON 85 " ; #0cd6 db 9 ; délka 8. řetězce db "EPSON 105" ; #0cdf db 9 ; délka 9. řetězce db "SEIK 1000" ; #0ce9 db 9 ; délka 10. řetězce db "SEIK 1200" ; #0cf3 db 9 ; délka 11. řetězce db "PANASONIC" ; #0cfd db 9 ; délka 12. řetězce db "CS MODE " ; #0d07 db 2 ; délka 13. řetězce db 14h,0 ; vypnutí inverze ;-------------------------------------------------------------------------------------------------- ; #0d0a 3338 tabulka řídících sekvencí pro tiskárnu 1-9, dle referenční příručky EPSON ESP/P PRINTER_SEQ db 3 ; sekvence 1, délka 3 byty db 1Bh,6Ch,8 ; ESC+"l"+8 - left margin = 8 characters margin from left border db 3 ; sekvence 2, délka 3 byty db 1Bh,41h,8 ; ESC+"A"+8 - n/72 inch line spacing for 9 pin printers only db 4 ; sekvence 3, délka 4 byty db 1Bh,4Bh,0,1 ; ESC+"K"+0+1 - 60dpi graphics + number of columns 256 db 3 ; sekvence 4, délka 3 byty db 1Bh,32h,0 ; ESC+"2"+0 - 1/6 inch line spacing for all ESC/P, ESC/P2, ESC/P 9pin db 4 ; sekvence 5, délka 4 byty db 1Bh,4Ch,0,3 ; ESC+"L"+0+3 - 120dpi graphics + number of columns 768 db 3 ; sekvence 6, délka 3 byty db 1Bh,33h,15h ; ESC+"3"+21 - Set n/216-inch line spacing for 9 pin printers only db 2 ; sekvence 7, délka 2 byty db 1Bh,40h ; ESC+"@" - Initialize printer db 4 ; sekvence 8, délka 4 byty db 1Bh,4Bh,8,0 ; ESC+"K"+8+0 - 60dpi graphics + number of columns? (8?) db 3 ; sekvence 9, délka 3 byty db "(c)" ; náhrada znaku copyright sekvenci "(c)" = #28, #63, #29 ;-------------------------------------------------------------------------------------------------- ; #0d30 3376 tabulka parametrů pro příkaz COPY:REM COPY_PARAM_TAB db 9 ; počet položek tabulky (včetně adresy druhé tabulky) dw COPY_PARAM_ADDR ; adresy tabulky adres obslužných rutin db 13 ; 9 - CR - COPY (podle nastavení) db 0b1h ; 8 - token LEN - nastav délku řádky tiskárny db ":" ; 7 - : - COPY (podle nastavení) db "=" ; 6 - = - nastav typ tiskárny db 0c2h ; 5 - token CHR$ db "/" ; 4 - / - zapnutí(/x) vypnutí(/0) LF k CR db "?" ; 3 - ? - vypiš aktuální nastavení na obrazovku db "." ; 2 - . - nastav typ COPY COPY_PARAM_ADDR dw UNKNOWN_CMD ; neznámý parametr za REM dw SET_PRN_MODE ; . - nastav textový / grafický tisk - ovlivňuje COPY, tisk UDG a copyrightu dw CONFIG_STATUS ; ? -vypiš aktuální nastavení na obrazovku dw SET_LINE_END ; / - zapnutí(/x) vypnutí(/0) LF k CR (CR vs CRLF) dw SET_TOKENS ; CHR$ - zapnutí (CHR$x) nebo vypnutí (CHR$0) tokenů, vypnuté tokeny = tiskne kód, ne BASICový "příkaz" dw SET_PRINTER ; = - nastav model tiskárny (s EPSON LX-800 fungovalo vše stejně?) dw PRINT_SCRSHOT ; : - COPY (podle nastavení) dw SET_LINE_LENGTH ; LEN - nastav délku řádku tiskárny (výchozí 80 znaků) dw PRINT_SCRSHOT ; CR - COPY (podle nastavení) ;-------------------------------------------------------------------------------------------------- ; #0d4d 3405 tabulka pro tisk obsahu obrazovky příkazem COPY COPY_MODE_TAB db 3 ; počet položek tabulky (včetně adresy druhé tabulky) dw COPY_MODE_ADDR ; adresa tabulky adres rutin db 20h ; 0010 0000 db 40h ; 0100 0000 COPY_MODE_ADDR dw COPY_CHARS ; tisk obrazovky - pouze znakově dw COPY_ZOOM ; tisk obrazovky - zvětšeno 2x (40h) dw COPY_NORM ; tisk obrazovky - normální velikost 1:1 (20h) dec c ex af,af' ;-------------------------------------------------------------------------------------------------- ; #0d5a 3418 tabulka předloh českých a slovenských znaků CSCHAR_TABLE db 00001000b ; 192 - ˇ (čárka) db 00010000b db 00000000b db 00000000b db 00000000b db 00000000b db 00000000b db 00000000b db 00000100b ; 193 - á db 00001000b db 00111000b db 00000100b db 00111100b db 01000100b db 00111100b db 00000000b db 00000000b ; 194 - mezera db 00000000b db 00000000b db 00000000b db 00000000b db 00000000b db 00000000b db 00000000b db 00010100b ; 195 - č db 00001000b db 00011100b db 00100000b db 00100000b db 00100000b db 00011100b db 00000000b db 00010100b ; 196 - ď db 00001000b db 00000100b db 00111100b db 01000100b db 01000100b db 00111100b db 00000000b db 00101000b ; 197 - ě db 00010000b db 00111000b db 01000100b db 01111000b db 01000000b db 00111100b db 00000000b db 00001000b ; 198 - ŕ (r s čárkou) db 00010000b db 00011100b db 00100000b db 00100000b db 00100000b db 00100000b db 00000000b db 00000000b ; 199 - mezera db 00000000b db 00000000b db 00000000b db 00000000b db 00000000b db 00000000b db 00000000b db 00101000b ; 200 - ü db 00000000b db 01000100b db 01000100b db 01000100b db 01000100b db 00111000b db 00000000b db 00001000b ; 201 - í db 00010000b db 00000000b db 00110000b db 00010000b db 00010000b db 00111000b db 00000000b db 00010000b ; 202 - ů db 00101000b db 00010000b db 01000100b db 01000100b db 01000100b db 00111000b db 00000000b db 00000100b ; 203 - ĺ (l s čárkou) db 00011000b db 00010000b db 00010000b db 00010000b db 00010000b db 00001100b db 00000000b db 00001010b ; 204 - ľ (l s háčkem) db 00010100b db 00010000b db 00010000b db 00010000b db 00010000b db 00001100b db 00000000b db 00101000b ; 205 - ö db 00000000b db 00111000b db 01000100b db 01000100b db 01000100b db 00111000b db 00000000b db 00101000b ; 206 - ň db 00010000b db 01111000b db 01000100b db 01000100b db 01000100b db 01000100b db 00000000b db 00001000b ; 207 - ó db 00010000b db 00111000b db 01000100b db 01000100b db 01000100b db 00111000b db 00000000b db 00010000b ; 208 - uo (o s opačným háčkem) db 00101000b db 00000000b db 00111000b db 01000100b db 01000100b db 00111000b db 00000000b db 00101000b ; 209 - ä db 00000000b db 00111000b db 00000100b db 00111100b db 01000100b db 00111100b db 00000000b db 00010100b ; 210 - ř db 00001000b db 00011100b db 00100000b db 00100000b db 00100000b db 00100000b db 00000000b db 00101000b ; 211 - š db 00010000b db 00111000b db 01000000b db 00111000b db 00000100b db 01111000b db 00000000b db 00010100b ; 212 - ť db 00001000b db 00010000b db 00111000b db 00010000b db 00010000b db 00001100b db 00000000b db 00001000b ; 213 - ú db 00010000b db 01000100b db 01000100b db 01000100b db 01000100b db 00111000b db 00000000b db 00000000b ; 214 - mezera db 00000000b db 00000000b db 00000000b db 00000000b db 00000000b db 00000000b db 00000000b db 00001000b ; 215 - é db 00010000b db 00111000b db 01000100b db 01111000b db 01000000b db 00111100b db 00000000b db 00010000b ; 216 - a s opačnou čárkou db 00001000b db 00111000b db 00000100b db 00111100b db 01000100b db 00111100b db 00000000b db 00001000b ; 217 - ý db 00010000b db 01000100b db 01000100b db 01000100b db 00111100b db 00000100b db 00111000b db 00101000b ; 218 - ž db 00010000b db 01111100b db 00001000b db 00010000b db 00100000b db 01111100b db 00000000b db 00101000b ; 219 - ¨ (dvojtečka) db 00000000b db 00000000b db 00000000b db 00000000b db 00000000b db 00000000b db 00000000b db 00101000b ; 220 - ˇ (háček) db 00010000b db 00000000b db 00000000b db 00000000b db 00000000b db 00000000b db 00000000b db 00000000b ; 221 - německé ostré s (B) db 00110000b db 01001000b db 01110000b db 01001000b db 01001000b db 01010000b db 01000000b db 00000000b ; 222 - malá gama db 00000000b db 00000000b db 00111100b db 00000100b db 00000100b db 00000100b db 00000000b db 00010000b ; 223 - stříška db 00101000b db 00000000b db 00000000b db 00000000b db 00000000b db 00000000b db 00000000b db 00000100b ; 224 - čárka db 00001000b db 00000000b db 00000000b db 00000000b db 00000000b db 00000000b db 00000000b db 00000100b ; 225 - Á db 00001000b db 00111100b db 01000010b db 01111110b db 01000010b db 01000010b db 00000000b db 00000000b ; 226 - mezera db 00000000b db 00000000b db 00000000b db 00000000b db 00000000b db 00000000b db 00000000b db 00100100b ; 227 - Č db 00011000b db 00111100b db 01000010b db 01000000b db 01000010b db 00111100b db 00000000b db 01001000b ; 228 - Ď db 00110000b db 01111000b db 01000100b db 01000010b db 01000100b db 01111000b db 00000000b db 00100100b ; 229 - Ě db 00011000b db 01111110b db 01000000b db 01111100b db 01000000b db 01111110b db 00000000b db 00001000b ; 230 - Ŕ (R s čárkou) db 00010000b db 01111100b db 01000010b db 01111100b db 01000100b db 01000010b db 00000000b db 00000000b ; 231 - mezera db 00000000b db 00000000b db 00000000b db 00000000b db 00000000b db 00000000b db 00000000b db 00100100b ; 232 - Ü db 00000000b db 01000010b db 01000010b db 01000010b db 01000010b db 00111100b db 00000000b db 00000100b ; 233 - Í db 00001000b db 00111110b db 00001000b db 00001000b db 00001000b db 00111110b db 00000000b db 00011000b ; 234 - Ů db 00011000b db 01000010b db 01000010b db 01000010b db 01000010b db 00111100b db 00000000b db 00001000b ; 235 - Ĺ (L s čárkou) db 01010000b db 01000000b db 01000000b db 01000000b db 01000000b db 01111110b db 00000000b db 00101000b ; 236 - Ľ (L s háčkem) db 01010000b db 01000000b db 01000000b db 01000000b db 01000000b db 01111110b db 00000000b db 00100100b ; 237 - Ö db 00000000b db 00111100b db 01000010b db 01000010b db 01000010b db 00111100b db 00000000b db 00100100b ; 238 - Ň db 00011000b db 01000010b db 01100010b db 01011010b db 01000110b db 01000010b db 00000000b db 00000100b ; 239 - Ó db 00001000b db 00111100b db 01000010b db 01000010b db 01000010b db 00111100b db 00000000b db 00011000b ; 240 - velké UO (O se stříškou) db 00100100b db 00000000b db 00111100b db 01000010b db 01000010b db 00111100b db 00000000b db 00100100b ; 241 - Ä db 00000000b db 00111100b db 01000010b db 01111110b db 01000010b db 01000010b db 00000000b db 00100100b ; 242 - Ř db 00011000b db 01111100b db 01000010b db 01111100b db 01000100b db 01000010b db 00000000b db 00100100b ; 243 - Š db 00011000b db 00111100b db 01000000b db 00111100b db 00000010b db 01111100b db 00000000b db 00100100b ; 244 - Ť db 00011000b db 11111110b ; zde je adresa 0efch, ale volá se kód v ZX ROM, ne zde db 00010000b db 00010000b db 00010000b db 00010000b db 00000000b db 00001000b ; 245 - Ú db 00010000b db 01000010b db 01000010b db 01000010b db 01000010b db 00111100b db 00000000b ;-------------------------------------------------------------------------------------------------- ; #0f0a 3850 (znak 246) ; Zde není znak, zde je vstupní bod, který se trefil do jedné z pozic pro znaky. ; Před vstupním bodem jsou dva byty, jako výplň pro případ posunutí předchozího kódu. ; Celé to musí zabírat spolu s instrukcemi vstupního bodu 8 bytů, stejně jako znaky okolo. db 0 db 0 ; hlavní vstupní bod - voláno z příkazu LPRINT přes 0EF4: THE 'COPY-LINE' SUBROUTINE ; musí být na adrese #0f0c 3852 org 3852 in a,(0fbh) ; stejný in jako v ROM -> přistránkování zx-centroface ROM nop ; počkej 4T jp START ; a skoč na začátek ; #0f0c 3852 v ZXROM součást podprogramu COPY-LINE od #0ef4, resp. COPY-L-2 od #0f0c (výpis ROM strana 57) ; z portu (#FB) se čte stav tiskárny ZX-Printer ; mělo by být nastaveno carry, protože nenastal BREAK ; a v registru D by měl být stav portu (#FB), ze kterého ZX ROM čte krátce předtím (prý 0, nebo 2) ; ; A_3852 in a,(0fbh) ; COPY-L-2 - instrukce in a,(#fb) z ZX ROM způsobí přestránkování sem ; A_3854 add a,a ; zx-centroface reaguje na čtení portu a zároveň na běh ; A_3855 ret m ; programu v této oblasti ; ... ;-------------------------------------------------------------------------------------------------- db 00001000b ; 247 - É db 00010000b db 01111110b db 01000000b db 01111100b db 01000000b db 01111110b db 00000000b db 00010000b ; 248 - A s opačnou čárkou db 00001000b db 00111100b db 01000010b db 01111110b db 01000010b db 01000010b db 00000000b db 00001000b ; 249 - Ý db 10010010b db 01000100b db 00101000b db 00010000b db 00010000b db 00010000b db 00000000b db 00100100b ; 250 - Ž db 00011000b db 01111110b db 00000100b db 00011000b db 00100000b db 01111110b db 00000000b db 00100100b ; 251 - ¨ (přehláska) db 00000000b db 00000000b db 00000000b db 00000000b db 00000000b db 00000000b db 00000000b db 00100100b ; 252 - ˇ (háček) db 00011000b db 00000000b db 00000000b db 00000000b db 00000000b db 00000000b db 00000000b db 00000000b ; 253- německé ss (B) db 01111000b db 01000100b db 01111000b db 01000100b db 01000100b db 01011000b db 01000000b db 00000000b ; 254 - šipka dolů db 00010000b db 00010000b db 00010000b db 01010100b db 00111000b db 00010000b db 00000000b db 00011000b ; 255 - stříška db 00100100b db 00000000b db 00000000b db 00000000b db 00000000b db 00000000b db 00000000b ;-------------------------------------------------------------------------------------------------- ; #0f5a grafická předloha pro kód 127 - (c) FONT_COPYRIGHT db 00111100b db 01000010b db 10011001b db 10100001b db 10100001b db 10011001b db 01000010b db 00111100b ;-------------------------------------------------------------------------------------------------- ; #0f62 3938 chyba Report "B - integer out of range" MSG_OUTOFRANGE call CALL_NEXTADDR ; pokračuj v ZX ROM na adrese za CALL dw 046ch ; Report B - integer out of range. ; #0f67 3943 chyba Report "L - BREAK into program" MSG_BREAK call CALL_NEXTADDR ; pokračuj v ZX ROM na adrese za CALL dw 1b7bh ; Report L - BREAK into program. ;-------------------------------------------------------------------------------------------------- ; odsud kopie 25 (#19) bajtů na 5b20h (až včetně bytu na 0F84) ; standardní rutina A5b20_0f6c ld de,0efch ; adresa obslužného podprogramu pro kanál 3 A5b23_0f6f jp 0a80h ; skok do ZX ROM na #0A80 PO_CHANGE ; příchozí znak je parametr (TAB, AT) A5b26_0f72 ld b,a ; znak do B A5b27_0f73 call ZXCENTROF_ROM ; rutina připojení ROM interface A5b2a_0f76 call PRINT_ATTAB_NUM ; zpracování čísla za TAB,AT a obnovení tiskové rutiny na 5B20 ; návrat s odpojením ROM RET_TO_ZXROM equ 5b2dh A5b2d_0f79 push af ; uschovej A A5b2e_0f7a in a,(7bh) ; odpoj ROM interface A5b30_0f7c pop af ; obnov A A5b31_0f7d ei ; povol přerušení A5b32_0f7e ret ; a návrat ; podprogram připojení ROM interface ZXCENTROF_ROM equ 5b33h A5b33_0f7f push af ; uschovej A A5b34_0f80 di ; zákaz přerušení A5b35_0f81 in a,(0fbh) ; připni ROM interface A5b37_0f83 pop af ; obnov A A5b38_0f84 ret ; a návrat ;-------------------------------------------------------------------------------------------------- ; #0f85 3973 text - odsud víceméně volné místo, netiskne se TXT_CREDITS db "SHOULD YOU HAVE ANY PROBLEM WITH THE DEVICE PLEASEPHONE:PRAG 376120 Mr.Dan." ; #0fd0 4048 verze TXT_VERSION db "VERSION 1.6" ; #0fdb 4059 bordel po předchozí verzi db "RSION 1.5" ; zbývající prostor do 2048 bytů db 0,0,0,0,0,0,0,0 db 0,0,0,0,0,0,0,0 db 0,0,0,0,0,0,0,0 db 0,0,0,0 ;-------------------------------------------------------------------------------------------------- ; Systémové proměnné (využívané) ; ; FLAGS 23611 #5C3B 8b různé příznaky pro práci Basicu, blíže nespecifikovatelné ; ; PPC 23621 #5C45 16b číslo právě vykonávaného řádku ; ; UDG 23675 #5C7B 16b adresa definice znaků UDG ; ;-------------------------------------------------------------------------------------------------- ; FLAGS2 23658 #5c6a 8b další příznaky používané při práci Basicu. Bit 3 této ; (iy+30h) systémové proměnné určuje, zda je zapnutý caps lock. ; ; bit 0 - Reset when the screen is clear ; bit 1 - Set when the printer buffer is in use ; bit 2 - Set when in quotes during line parsing ; bit 3 - Set when CAPS LOCK is on ; bit 4 - Set when using channel K (keyboard) ; bit 5 - Unused ; bit 6 - Unused ; bit 7 - Unused ; ; ZX-Centroface využívá BASICem nevyužité 3 bity k uložení typu zvolené tiskárny 0..7. ; Význam ostatních bitů a jejich hodnoty musí zůstat nezměněny. ; ;-------------------------------------------------------------------------------------------------- ; P_POSN 23679 #5c7f 8b číslo sloupce v tiskové vyrovnávací paměti ; (iy+45h) ; ; ZX-Centroface používá ke stejnému účelu, jako ZX Printer, k určení X pozice tisknutého znaku. ; ;-------------------------------------------------------------------------------------------------- ; PRCC 23680 #5c80 16b adresa v tiskovém bufferu, na kterou se zapíše další ; (iy+46h) znak při tisku na tiskárně. Vyšší bajt na adrese 23681, ; obsahuje vždy hodnotu 91 (desítkově). ; ;-------------------------------------------------------------------------------------------------- ; NMIADD 23728 #5CB0 16b adresa rutiny obsluhující NMI. U ZX Specter 48K/48K+/128K+/+2 je v ROM chyba, ; takže pokud tato systémová proměnná obsahuje 0, provede se reset počítače, ; jinak neprovede nic ; ; (iy+77h) 23729 #5cb1 druhý bajt v NMIADD je použitý pro uchování konfigurace ZX -Centroface ; ; bit 7 - určuje textový vs grafický tisk a zvětšení grafického tisku ; bit 6 - určuje textový vs grafický tisk a zvětšení grafického tisku ; bit 5 - určuje textový vs grafický tisk a zvětšení grafického tisku ; bit 4 ; bit 3 - v kombinaci s bitem 1 určuje LF/CRLF ; bit 2 - zapíná/vypíná TOKENy (tisk příkazů BASICu) ; bit 1 - v kombinaci s bitem 1 určuje LF/CRLF ; bit 0 ; ;-------------------------------------------------------------------------------------------------- ; poprogram ZX ROM #22b0 je součást #22AA "PIXEL-ADD" ; ; #22b0 ld b,a ; souřadnici Y zkopíruj do B ; and a ; resetuj carry flag ; rra ; narotuj carry flag zleva -> v A bude 0 a původní bity 7, 6, 5, 4, 3, 2, 1 ; scf ; nastav carry flag ; rra ; narotuj carry flag zleva -> v A bude 1 0 a původní bity 7, 6, 5, 4, 3, 2 ; and a ; resetuj carry flag ; rra ; narotuj carry flag zleva -> v A bude 0 1 0 a původní bity 7, 6, 5, 4, 3 ; xor b ; and 11111000b ; vynuluj dolní 3 bity, dalším XOR se obnoví horních 5 bitů a zbudou změněné jen dolní 3 ; xor b ; A bude obsahovat 64 + 8*INT(b/64) + (b mod 8) (0 1 0 b7 b6 b5 b2 b1 b0) ; ld h,a ; vyšší byte adresy je hotov, ulož do H ; ld a,c ; souřadnici X zkopíruj do A ; rlca ; rlca ; rlca ; A obsahuje bity 2 1 0 7 6 5 4 3 z C ; xor b ; and 11000111b ; vynuluj bity 5, 4, 3, do nich se vloží bity 5, 4, 3 ze souřadnice Y ; xor b ; rlca ; rlca ; v A bude 32*INT(b/(b mod64)/8)+INT(x/8) ; ld l,a ; nižší byte adresy je hotov, ulož do L ; ld a,c ; souřadnici X do A ; and 00000111b ; ponech jen dolní tři bity = číslo bitu v bytu ; ret ; ; VSTUP A = souřadnice Y, C = souřadnice Y ; VÝSTUP adresa v HL, číslo bitu v A ;--------------------------------------------------------------------------------------------------