;************************************************************************ ; ; ; T I S K N A L S T V E S P O L L I N G R E Z I M U ; ; ;************************************************************************ ; ; ;Program vytvori v ramdisku buffer pro tiskarnu, pres ktery pak probiha ;tisk v spoolling rezimu. Velikost bufferu definuje uzivatel. Vlastni ;tisk probiha pres preruseni, vystupni zarizeni je UL1. Buffer je vytvoren ;snizenim konstanty DSM v tabulce DPB. Puvodni konstanta DSM je obnovitel- ;na prikazem v hlavnim menu programu. ; ; .Z80 ASEG ; bdos equ 05 ;vstupni adresa sluzeb bdosu vint equ 0ec50h ;prerusovaci tab. v bios typ0me equ 0ec5ah ;tabulka fyzickeho prirazeni disku v biosu toukey equ 0f3ddh ;test klavesnice:a=0-nestlaceno,a=ff-stlaceno identi equ 0ec48h ;identifikace biosu ul1 equ 0fe4eh ;pocatek programu UL1 za biosem errlpt equ 0f43ch ;chybovy vystup tiskarny ramc equ 80h ;byte ramcard v tabulce typ0me bell equ 7 ;znaky lf equ 0ah cr equ 0dh ht equ 9 cls equ 0ch eol equ 16h ff equ 0ch stack equ 0 ;definice pocatku zasobniku pa55 equ 0d0h ;port a 8255 pb55 equ 0d1h ;port b 8255 papio equ 0feh ;port a Z80 pio pbpio equ 0ffh ;port b Z80 pio rrbpio equ 0fdh ;ridici port b Z80 pio setpag equ 0f9h ;stranka v ramcard setadr equ 0ebh ;adresa na strance v ramcard inotrc equ 0eah ;r/w port dat v ramcard ; ; org 100h ; ; ld hl,(bdos+1) ;nastaveni stacku ld sp,hl ld hl,identi ;identifikace verze biosu ld de,nap0 ld bc,7 ;delka zony call cpdehl ;porovnani ld de,nap0i ;spatna verze biosu jp nz,napis ld c,19h ;dodani cisla aktualni diskove jednotky call bdos ld (aktjed),a ;odlozeni ld hl,typ0me ;zjisteni,ktery disk je ramcard ld b,5 ;je max 5 disku catchd: ld a,(hl) ;prevzeti byte cp ramc ;je to ramcard? jr z,makenm ;spocitej poradi disku inc hl ;dalsi pozice djnz catchd ld de,nap1 ;ramcard nepripojena jp napis makenm: ld a,5 ;vypocet disku, kterym je ramcard sub b ld c,0eh ;nastaveni aktualni jednotky ld e,a ;cislo jednotky call bdos ld c,1bh ;pro analyzu obsazenosti ramcard call bdos ;v hl adresa alokacniho vektoru ramcard ld (adralv),hl ;ulozeni adresy alokacnich vekt. ramc. ld c,1fh ;adresa tabulky DPB call bdos ;do hl ld c,(hl) ;SPT-pocet sec. 128 b. na stopu ld de,3 ;vypocet polohy konstanty BLM add hl,de ld a,(hl) ;prevzeti BLM inc a ;pocet vet po 128 bytech rrca ;:2 rrca ;:4 rrca ;:8 = velikost al. bloku v KB ld (BLS),a ;ulozeni pro pozdejsi zpracovani inc hl inc hl ;hl ukazuje na DSM ld (adrDSM),hl ;ulozeni adresy DSM ld de,mark1 ;je to prvni vyvolani programu? ld hl,mark2 ;porovnani nazvu push bc ld bc,8 ;delka zony call cpdehl ;porovnani zon jr z,forw1 ;skoc vpred, DSM je znamy ld hl,vykmod ;presun obsluzneho programu ld de,ul1 ld bc,DSM-ul1 ldir pop bc ld hl,flags ;nastaveni priznaku: res 3,(hl) ;spooling buf. nevytvoren ld hl,(vint) ;prerusovaci vektor ld (vinter),hl ;a jeho ulozeni ld hl,(adrDSM) ;adresa konstanty DSM ld e,(hl) ;prevzeti konstanty inc hl ld d,(hl) ld (DSM),de ;ulozeni pro pripadnou obnovu ;vypocet velikosti ramcard ld de,7 add hl,de ;hl,ukazuje na OFF-pocet stop, ld e,(hl) ;rezervovanych na pocatku disku inc hl ld d,(hl) ;pocet stop v de ld a,c ;pocet sec. 128 b. na stopu call axde ;nasobeni axde; vystup je v ahl ex de,hl ld a,128 ;ted se vypocte pocet vyhrazenych call axde ;bytu pro system push hl ld a,(BLS) ;velikost al. bloku v kB ld de,400h ;1kB=1024B call axde ;delka al.bloku v bytech ex de,hl ld a,(DSM) ;pocet al bloku-1 inc a call axde ;pocet bytu v nesystemove casti ;ramcard pop de ;pocet bytu v systemove casti dec de ;max. pripustna adresa v ramc. add hl,de adc a,0 ld (maxadr),hl ;a ulozeni ld (maxadr+2),a push bc forw1: pop bc ld c,0eh ;obnoveni puvodniho akt. disku ld a,(aktjed) ld e,a call bdos ld c,9 ;tisk nazvu programu a menu ld de,nap2 call bdos ld de,nap6 ;zadej hodnotu wloop: call hodn ;tisk napisu+sejmuti klav. ld a,h and a jr nz,wloop ld a,l ;prevzeti cislice cp 1 ;zvoleno definovani bufferu? jr z,defbuf cp 2 ;pokracovani v tisku po stu- jp z,contsk ;denem startu cp 3 ;provest iniciaci spoolling jp z,inicia ;bufferu? cp 4 ;je zvolena likvidace bufferu jr z,killbf ;v ramcard? cp 5 ;nastaveni tiskarny? jp z,settsk jr wloop killbf: ld hl,flags ;shozeni priznaku vytvoreni res 3,(hl) ;spooll. buff. ld hl,3 ;lst:=lpt: res 6,(hl) set 7,(hl) ld hl,(adrDSM) ;obnoveni plne kapacity ramdisku ld de,(DSM) ld (hl),e inc hl ld (hl),d ld hl,ul1 ;vymazani identifikace programu ld b,20h ;vymaze se 32 pozic kloop: ld (hl),0 inc hl djnz kloop ld a,3 ;zakazeme preruseni out (rrbpio),a ld hl,(vinter) ;obnova puvodniho mista prerus. ld (vint),hl ld de,nap4 ;vystupni zprava: ;"plna kapacita ramdisku" jp napis ;navrat do CP/M defbuf: ld de,nap7 ld c,9 call bdos ;mazani obrazovky ld de,nap5 ;zadej velikost bufferu dfbf: call hodn ;tisk napisu + ;sejmuti honoty + prevod ;do hexa tvaru do hl ld a,h and a jr nz,dfbf ld a,l ;prevzeti cisla cp 201 ;max. 200d jr nc,dfbf ;bylo zadano vice nez 200 kB and a jr z,dfbf ;nula se nesmi zadat ld (sizbkb),a ;zadana velikost bufferu v kB ;prevod na pocet alok. bloku ld c,a ld a,(BLS) ;velikost al. bloku v kB ld d,0 numlop: srl a ;posun doprava jr z,numblz ;skok pocet al. bloku je znamy srl c jr nc,numlop ;zadny blok neprebyva, skok ld d,1 ;priznak prebyvajiciho bloku numblz: ld a,d ;prebyva al. blok? add a,c ;o jeden blok vice ld (spbuff),a ;pocet al. bloku, ;ktere je nutno rezervovat ;vypocet poctu bytu, ktere jsou ;vyhrazeny v al. zone pro evi- ;denci alokacnich bloku ld hl,(DSM) ;velikost disku v al. blocich-1 inc hl ld a,l ;je to cislo nuloveho modulo 8? ld b,3 ;+vypocet zbytku del8: srl h rr l djnz del8 ;:8 and 7 jr nz,forw2 ;skok, je zbytek dec hl ;neni zbytek v dalsim byte forw2: ld de,(adralv) ;test obsazenosti al. bloku shora ex de,hl ;adresa zony al. vekt. do hl add hl,de ;adresa posledniho byte ld b,8 ;zarazka ld c,(hl) ;prevzeti byte and a jr z,bytf ;skok v posl. byte je obsazeno 8 b. ld b,a ;pocet platnych bitu xchlp: rlc c ;rolujeme, aby posledni bit naleze- djnz xchlp ;jici nejvyssimu al. bloku byl na ;pozici bitu 0 ld b,a ;pocet platnych bitu bytf: ld a,(spbuff) ;pocet al. bl, ktere se musi rezerv. ld de,nap8 ;buffer je vytvoren bytful: rr c ;testuje se na h=obsazeno jr c,bloful ;skok,blok je obsazen dec a ;dekrement poz. poctu al. bloku jr z,alfree ;skok, pozad. buf. mozno vytvorit djnz bytful ;vsechny bity ld b,8 ;1B=8 bitu dec hl ;dalsi byte ld c,(hl) jr bytful ;a testuje se dale bloful: ld c,a ;pocet al. bloku, ktere zbyvaji do ;pozadovane velikosti ld a,(spbuff) ;pozadovana velikost sub c ;co je mozne vytvorit ld de,nap15 ;buffer nemozno vytvorit call z,napis ;navrat do cp/m ld (spbuff),a ;a ulozeni ld d,0 ld e,a ;do de ld a,(BLS) ;velikost al. bloku v kB call axde ;co je mozne vytvorit-udano v kB ld a,l ld (sizbkb),a ;a ulozeni ld hl,nanap ;doplneni napisu call hdprev ;prevod a doplneni ld de,nap9 ;vytvoril se buff o velikosti..kB alfree: push de ld a,(sizbkb) ;velikost spoollbuff. v kB ld de,400h ;prevod na pocet bytu call axde ;do ahl ld (delbuf),hl ;ulozeni delky spoollbuff. ld (delbuf+2),a ex de,hl ld b,a ld hl,(maxadr) ;vypocet min. adresy ld a,(maxadr+2) push de call inc ;inkrement ahl pop de and a sbc hl,de sbc a,b ld (minadr),hl ld (minadr+2),a ; a ulozeni pop de ld hl,(DSM) ;snizeni konstanty DSM ld bc,(spbuff) ;velikost bufferu v al. bl. ld b,0 and a sbc hl,bc ;nova DSM ld c,l ld b,h ;do bc ld hl,(adrDSM) ;adresa DSM v biosu ld (hl),c inc hl ld (hl),b ; a jeji nastaveni ld (newDSM),bc ;ulozeni noveho DSM ld c,9 call bdos ;tisk napisu-buffer vytvoren ;nebo vytvoren s omezenim call initi ;vstupni iniciace call wflpt ;ceka na ready tiskarny ld de,nap13 ;ma se cekat pri nove strance? call answ ld hl,3 ;adresa iobyte systemu set 6,(hl) ;lst:=ul1: set 7,(hl) ld hl,flags ;budeme menit priznak set 3,(hl) ;priznak vytvoreni bufferu res 2,(hl) ;bez cekani pri nove strance jr nc,nowait set 2,(hl) ;bude se cekat nowait: ld hl,tabul ;nastaveni tab = 9 pozic call outbyt ld de,naplf ;dva nove radky ld c,9 call bdos ld de,nap14 ;chces nastavit tiskarnu? call answ call setcon ;nastaveni a povoleni prerus. ;+navrat pri carry, pri nc ;teply start ; ;nastaveni tiskarny settsk: ld a,(03) ;neni nevhodne prirazeni tisk.? and 80h jr nz,priok ld de,nap23 ;navrat do CP/M jp napis priok: call wflpt ;ceka na ready tiskarny ld hl,iniali ;iniciace tiskarny, konec NLQ call outbyt ; ld de,nap17 ;volba zakladni sire pisma ld hl,tsipi ;tabulka sire pisma jr vykseg ;provedeni vyberu a nastaveni typppe: ld de,nap18 ;typ pisma (pro pica, el, prop.) ld hl,ttyppe ;tabulka jr vykseg typcp: ld de,nap19 ;typ pisma pro condensed ld hl,ttypcp ;tabulka jr vykseg provp: ld de,nap20 ;provedeni pisma ld hl,tprovp jr vykseg sirpis: ld de,nap21 ;sire pisma ld hl,tsirpi jr vykseg charp: ld de,nap22 ;charakter pisma ld hl,tcharp ; ;Vykonny segment vyslani povelu do tiskarny. hl=pocatek tabulky, ;de=napis k tisku. Napis vytiskne a sejme zadane cislo z klavesnice ;a zkontroluje meze. V tabulce najde prislusne misto a vysle prikaz ;do tiskarny, pote preda rizeni dle adresy v tabulce. ; vykseg: push hl ld c,9 ;tisk napisu call bdos znovu: ld de,nap6 ;sejmuti cisla do hl call hodn ld a,h ;nesmi byt vice cisel and a jr nz,znovu or l ;v a je zadane cislo jr z,znovu ;nesmi byt nula ld b,a ;pocitadlo pop hl push hl ;adresa tabulky ld a,(hl) ;max. mez cp b ;neni zadana hodnota vyssi? jr c,znovu ;pokud ano pop hl inc hl kolem: ld e,(hl) ;prevzeti adresy, na kterou inc hl ;se bude skakat ld d,(hl) inc hl djnz hledej ;posun v tabulce push de ;adresa skoku call outbyt ;vyslani prikazu do tiskarny ret ;skok na adresu v de hledej: ld a,(hl) ;hleda se byte 7fh (konec inc hl ;serie) cp 7fh jr nz,hledej jr kolem ;dalsi udaje v tabulce ; ; iniali: defb 1bh,40h,1bh,78h ;inicializace tiskarny+ defb 30h,7fh ;konec NLQ tisku tabul: defb 1bh,44h,8,16,24 ;tabulator po 9 znacich defb 32,40,48,56,64 defb 72,80,88,96,104 defb 112,120,128,136 defb 00,7fh ; ;Tabulkove udaje pro tiskarnu. Prvni byte urcuje pocet porametru, ;dale nasleduji jednotlive polozky, zakoncene 7fh. Prvni dva byty ;v polozce urcuji adresu, na kterou se preda rizeni po vyslani ;povelu, dalsi byty v polozce se vysilaji do tiskarny. ; tsipi: defb 4 ;zakladni sire pisma defw typppe ;pica defb 7fh defw typppe ;proportional pica defb 1bh,70h,31h,7fh defw typcp ;condensed pica defb 0fh,7fh defw typppe ;elite defb 1bh,4dh,7fh ; ttyppe: defb 5 ;typ pisma (pica, prop., elite) defw provp ;draft defb 7fh defw provp ;zdvojeni bodu pod sebou defb 1bh,47h,7fh defw provp ;NLQ defb 1bh,78h,31h,7fh defw provp ;subscripts defb 1bh,53h,31h,7fh defw provp ;superscripts defb 1bh,53h,30h,7fh ; ttypcp: defb 3 ;typ pisma (condensed pica) defw sirpis ;draft defb 7fh defw sirpis ;subscripts defb 1bh,53h,31h,7fh defw sirpis ;superscripts defb 1bh,53h,30h,7fh ; tprovp: defb 2 ;provedeni pisma defw sirpis ;normalni defb 7fh defw sirpis ;tucne defb 1bh,45h,7fh ; tsirpi: defb 3 ;sire pisma defw charp ;normalni defb 7fh defw charp ;dvojta sire s vypnutim po LF defb 0eh,7fh defw charp ;dvojta sire pisma defb 1bh,57h,31h,7fh ; tcharp: defb 2 ;charakter pisma defw prestb ;navrat do CP/M pres tabulaci defb 7fh ;svisle defw prestb ;kurziva defb 1bh,34h,7fh ; ;pokracovani v tisku po stu- ;denem startu contsk: ld hl,flags ;buffer je vytvoren? bit 3,(hl) jr z,inicia ;pokud ne ld de,nap12 ;tisk obnoven ld c,9 call bdos ld hl,(adrDSM) ;obnoveni konstanty DSM ld de,(newDSM) ;v biosu ld (hl),e inc hl ld (hl),d and a ;shozeni carry setcon: ld hl,inter ;nastaveni adresy obsluzne ld (vint),hl ;prerusovaci rutiny ld a,83h ;povolime preruseni out (rrbpio),a ret c ;vrati se pri carry jr nlfcr ;navrat do cp/m ; ;iniciace spoollbuferu inicia: ld de,nap11 ;spoollbuff nebyl dosud ld hl,flags ;vytvoren bit 3,(hl) ;byl jiz vytvoren? jr z,napis ;skok, pokud ne call initi ;iniciace spoolling buf. ld de,nap10 ;napis iniciace provedena jr napis ;a navrat ; prestb: ld hl,tabul ;nastaveni tabulatoru call outbyt ;vyslani do tiskarny nlfcr: ld de,nap24 ;novy radek napis: ld c,9 ;vystup retezce znaku call bdos rst 00 ; ; ; Testuje pripravenost tiskarny ;---------------------------------------------- ; ;Vstup: 0 ;Vystup:Tisk napisu tiskarna nepripravena+cekani, ; dokud neni ready. ;Meni: af,de,hl,bc ; ; wflpt: in a,(papio) ;je tiskarna ready? and 0dh ret z ;tiskarna ready, nvrat ld de,nap16 ;tiskarna neni pripravena ld c,9 call bdos wfread: in a,(papio) and 0dh ;ceka na ready jr nz,wfread ret ; ; ; Vysle na list serii bytu ;--------------------------------------- ; ;Vstup: hl=pocatek zony v pameti, odkud se maji ; byty vysilat. Zona musi byt zakoncena ; bytem 7fh. ;Vystup:Serie bytu do zarizeni list. ;Meni: hl,af,bc,de ; ; outbyt: push hl ld hl,(01) ;kde zacina bios? ld de,12d ;list add hl,de ld (setcal+1),hl ;nastaveni call list pop hl allby: ld a,(hl) ;prevzeti bytu inc hl cp 7fh ;konec? ret z ld c,a push hl setcal: call 00 ;meni se programove pop hl jr allby ;vsechny byty ; ; ;Tisk napisu + zadani znaku a (A) nebo n (N) z klavesnice ;-------------------------------------------------------- ; ;Vstup: Pocatek napisu, ktery se ma tisknout v de, ; a delka bufferu klavesnice na kbuff. ; Vstup je az answ! ;Vystup:Snima znaky z klavesnice a vyhodnoti, zda ; prisel znak a nebo n. Pri a c=h,pri n c=l. ;Meni: af,hl,bc ; ; eloop: pop de answ: push de ld c,9 ;beep a ld de,nap3 ;smazani radku call bdos pop de push de ld c,9 call bdos ;tisk zadaneho napisu ld c,0ah ;snimej klavesnici ld de,kbuff ;pocatek bufferu klavesnice push de call bdos pop de inc de ;ukazuje na pocet zad. zn. ld a,(de) ;pocet zadanych znaku and a jr z,eloop ;nesmi byt nulovy dec a jr nz,eloop ;a musi byt jeden inc de ;sejmuti znaku ld a,(de) pop de res 5,a ;plati velka i mala pismena cp "A" ;ano? scf ;nastaveni cary ret z cp "N" ;ne? ret z jr answ ;chybny znak, znovu ; ; ;Tisk napisu + prevzeti trojcif. cisla z klavesnice ;----------------------------------------------------- ; ;Vstup: Pocatek napisu, ktery se ma tisknout v de, ; a delka bufferu klavesnice na kbuff. ;Vystup:Snima cislice z klavesnice a prevadi je do ; hexatvaru. Hexacislo je ulozeno do hl. Vstup ; je az hodn. ;Meni: af,hl,bc ; ; zloop: pop de hodn: push de ld c,9 ;beep a ld de,nap3 ;smazani radku call bdos pop de push de ld c,9 call bdos ;tisk zadaneho napisu ld c,0ah ;snimej klavesnici ld de,kbuff ;pocatek bufferu klavesnice push de call bdos pop de inc de ;ukazuje na pocet zad. zn. ld a,(de) ;pocet zadanych znaku and a jr z,zloop ;nesmi byt nulovy ld b,a ;pocet znaku v b ld hl,0 ;nulovani sumacni bunky makez: inc de ld a,(de) ;prevzeti znaku sub 30h jr c,zloop ;pri chybe cp 0ah ;max. cislice 9 jr nc,zloop ;pri chybe add hl,hl ;prevod na hexa tvar push bc push hl pop bc add hl,hl ;x4 add hl,hl ;x8 add hl,bc ;x10 ld b,0 ld c,a add hl,bc ;pricteni posledniho znaku pop bc djnz makez ;pro vsechny znaky pop de ret ; ; ; Porovnani zon ;----------------------------------------------------- ; ;Porovna dve zony v oper. pameti. ;Vstup: hl = adresa pocatku 1. zony ; de = adresa pocatku 2. zony ; bc = delka zony ;Vystup:Priznak nuly je nastaven pri souhlasu zon, pri ; nesouhlasu je priznak nuly nulovan. ;Meni: hl,de,bc,af ; ; cpdehl: ld a,(de) inc de cpi ret nz ;pri nesouhlasu jp pe,cpdehl ;dalsi znak ret ; ; ; ; Vypocte soucin a x de ;-------------------------------------------- ; ;vstup: a,de=cinitele ;vystup: a,h,l (a=nejvyssi vaha) ;meni: af,hl,de,bc ; ; axde: ld hl,0 ;pro vysledek ld b,h ;b=0 ld c,a ;1. cinitel ld a,h ;a=0 dalrad: bit 0,c ;platny rad? jr z,vyrad ;vynecha se add hl,de adc a,b ;pricteni radu vyrad: sla e ;vypoc. dal. radu rl d rl b srl c ;cinitel vycerpan? jr nz,dalrad ;dalsi rad ret ; ; ;Prevod 1 byte hexa na znakovy tvar a ulozeni do pameti ;------------------------------------------------------ ; ;Vstup: hl=adresa mista, kam se ma ulozit znakovy retezec, ; a=prevadene hexacislo ;Vystup: Znakovy retezec od adresy (hl) ulozeny v pameti. ; rvni se uklada msb. Vypis nul ve vyssich radech ; se potlacuje. ;Meni: af,de,hl,bc ; ; hdprev: ld e,0 ld c,100 ld d,a call dcisl ;stovky znakove ld (hl),a ;do pameti inc hl ld c,10 call dcisl ;desitky znakove ld (hl),a ;do pameti inc hl ld a,d add a,30h ld (hl),a ;jednotky ret dcisl: ld a,d ld b,0 ;sumacni bunka dcsl: inc b sub c jr nc,dcsl add a,c ld d,a dec b ld a,b or e ;nuly se potlaci ld a," " ret z inc e xor a ld a,b add a,30h ret ; ; ; Vstupni iniciace spoolling rezimu ;---------------------------------------------- ; ;Vstup: 0 ;Vystup:Iniciace promennych spoolling rezimu ;Meni: hl,a ; ; initi: ld hl,flags res 1,(hl) ;jeste se netisklo ld hl,0 ;nulovy pocet zn. ve fronte ld (numby),hl ld (numby+1),hl ld hl,(minadr) ;minimalni adresa ld a,(minadr+2) ld (aktadr),hl ;odtud se bude tisknout ld (aktadr+2),a ld (ukladr),hl ;a sem se uklada ld (ukladr+2),a xor a out (papio),a ;data nepristavena ret ; ; vykmod: .phase ul1 ; defb "UL1" ;identifikace pro bios jr sendch ;skok na pocatek programu mark1: .dephase mark2: .phase mark1 defb "SPOOLv.1" ;identifikace programu pri ;opetovnem vyvolani sendch: ld hl,0 ;konstanty cekaci smycky ld b,5 wfpl: push hl push bc ;test na naplneni zony di ld a,(delbuf+2) ;max. pocet znaku ld de,(delbuf) ld b,a ld hl,(numby) ;pocet znaku k tisku ld a,(numby+2) ei and a sbc hl,de ;porovnani sbc a,b pop bc pop hl jr c,bufznk ;skok na ulozeni dec hl ;buffer je plny, ;cekame, mozna se vyprazdni ld a,h or l jr nz,wfpl djnz wfpl lpte: ld de,naperr jp errlpt ;chybove hlaseni bufznk: di ld hl,(numby) ld a,(numby+2) ;ma se co tisknout? or h or l jr z,nbuffc ;skok,buffer je prazdny buffc: ld a,(numby+2) ;obnova a pro nektere podpr. ld hl,(numby) call inc ;inkrement poctu znaku v ahl ld (numby),hl ld (numby+2),a ;a ulozeni ld hl,(ukladr) ;ulozeni znaku do bufferu ld a,(ukladr+2) ld b,a out (setpag),a ;nastaveni strany v ramcard push bc ld b,h ;nastaveni adresy ld c,setadr out (c),l pop bc ld a,c ;zapis byte out (inotrc),a ld a,b call jemadr ;neni max. adresa? Neni-li ;inkrement ahl jr nz,uloz ;a skok na ulozeni ld hl,(minadr) ;a jedeme znovu od spodu ld a,(minadr+2) uloz: ld (ukladr),hl ;ulozeni ld (ukladr+2),a ei ret nbuffc: ld b,5 ld hl,0 ;pro timeout wfrdy: in a,(papio) ;je tiskarna ready? and 0dh ;platne bity jr z,vyszn ;vyslani znaku, je-li ready ld a,(flags) ;uz se tisklo? bit 1,a ;pokud ano, jr nz,buffc ;necekame a bufferujeme dec hl ;a cekame ld a,h or l jr nz,wfrdy ;ceka se dal djnz wfrdy jr lpte ;chybove hlaseni vyszn: call buffc ;znak se ulozi call inter ;a vysle ret ; ; ; Porovna ahl s 3-byte promennou maxadr ;--------------------------------------------------------- ; ;Vstup: Naplnene registry a, hl. ;Vystup:Nastavi pri shode ahl a maxadr priznak nuly. ;Meni: de, b ,af ; ; jemadr: ex de,hl ld hl,(maxadr) ld b,a ld a,(maxadr+2) and a sbc hl,de sbc a,b or h or l ex de,hl ld a,b ret z ;navrat pri shode inc: ld de,1 ;inkrement add hl,de adc a,0 ld d,a ld a,0ffh ;likvidace pripadneho and a ;priznaku nuly ld a,d ret ;priznaku nuly ; ; ; Prerusovaci rutina ;------------------------------------------------- ; ;Vstup: 0 ;Vystup:Tiskne znak z pozice (aktadr), posune ukazovatka ; (aktadr) a snizi ukazovatko (numby)=pocet znaku ; k tisku. ;Meni: 0 ; ; inter: di ;pro jistotu, vola se i ld (prosp),sp ;odjinud ld sp,stack push af push hl push de push bc call outch ;vyslani znaku pop bc pop de pop hl pop af ld sp,(prosp) ei reti ; outch: ld hl,flags set 1,(hl) ;pro pristi pruchod: ;uz se tisklo ld hl,(numby) ;pocet znaku k tisku ld a,(numby+2) ld b,a or h or l ;neni nulovy? ret z ;navrat je-li ld de,1 ;dekrement poctu znaku xor a sbc hl,de sbc a,b ld (numby),hl ;zpetne ulozeni ld (numby+2),a ld hl,(aktadr) ;nastaveni adresy v ramc. ld b,h ld c,setadr out (c),l ld a,(aktadr+2) out (setpag),a ; a stranky call jemadr ;neni max. adresa? neni-li, ;inkrement ahl jr nz,nmadr ;neni-li max adresa, skok ld hl,(minadr) ;jedeme znovu od spodu ld a,(minadr+2) nmadr: ld (aktadr),hl ;ulozeni ld (aktadr+2),a ld a,(flags) ;ma se privolat obsluha bit 2,a ;pri nove strance? in a,(inotrc) ;prevzeti byte k tisku jr z,sntch ;skok, obsluha se neprivolava cp ff ;je znak nove stranky? jr nz,sntch ;skok neni-li ;privolani obsluhy ld c,1 ;priznak pro test stlac. kl. wfkl: ld hl,(01) ;bios +3 ld de,9 add hl,de ;conout ld de,npbeep ;navratova adresa push bc push de ld c,bell ;pipnem si jp (hl) npbeep: ld de,1000h ;doba, kdy to nepipa wfklav: call toukey ;sejme klavesnici pop bc add a,c ;1. pruchod + stlaceno nebo jr z,stprv ;2. pruchod + nestlaceno, push bc ;skoc dec de ;utika cas, kdy nepipame ld a,e or d jr nz,wfklav pop bc jr wfkl ;pipne se a snima stprv: ld a,c ;prvni pruchod? ld c,0 ;uz nebude and a jr nz,wfkl ;po prvnim se snima nestlaceno ld hl,0 ;pockame aby byla klavesa wfnk: dec hl ;urcite nestlacena ld a,h or l jr nz,wfnk jp outch ;dalsi znak sntch: out (pbpio),a ;pristaveni dat tiskarne ld a,80h ;signal data pristavena out (papio),a busylp: in a,(papio) ;data prevzata? and 0dh cp 01 jr nz,busylp ;ne, skok xor a ;data neplatna out (papio),a ret ; ; naperr: defb "UL1 not ready!",cr,lf,"$" ; ; DSM: defs 2 ;puvodni konstanta DSM ramcard newDSM: defs 2 ;nova konstanta DSM adrDSM: defs 2 ;adresa konstanty DSM flags: defs 1 ;bit 0 nepouzit ;bit 1 = h uz se tisklo ;bit 2 = h tisk na volne listy, ;pri "FF" privolat obsluhu ;bit 3 = h buffer je vytvoren numby: defs 3 ;pocet bytu k tisku aktadr: defs 3 ;adresa ze ktere se tiskne ukladr: defs 3 ;adresa na kterou se uklada minadr: defs 3 ;min. adresa ukladanych znaku delbuf: defs 3 ;delka bufferu v bytech maxadr: defs 3 ;max adresa na kterou lze ukladat prosp: defs 2 ;pro ukazatel zasobniku vinter: defs 2 ;pro misto preruseni v biosu; .dephase ; adralv: defs 2 ;adresa alokacnich vektoru BLS: defs 1 ;velikost alok. bloku v KB sizbkb: defs 1 ;vel. spoolbuf. v kB spbuff: defs 1 ;velikost spoollbuff. v al. bloc. aktjed: defs 1 ;aktualni jednotka kbuff: defb 4 defs 5 ;buffer klavesnice nap0: defb "1990 v4" nap0i: defb cr,lf,"Chybna verze modulu BIOS!",cr,lf,"$" nap1: defb cr,lf,"Ramdisk neni pripojen!",cr,lf,"$" nap2: defw cls defb lf,lf,ht," S P O O L L I N G R E Z I M" defb " T I S K A R N Y U L 1",lf,cr,ht defb " ----------------------------" defb "------------------------",cr,lf defb lf,lf,lf,lf,ht defb " 1........Definovani spoolling bufferu" defb " v ramdisku" defb cr,lf,lf,ht defb " 2........Obnoveni tisku po studenem " defb "startu systemu" defb cr,lf,lf,ht defb " 3........Iniciace spoolling bufferu" defb cr,lf,lf,ht defb " 4........Likvidace spoolling bufferu" defb cr,lf,lf,ht defb " 5........Nastaveni tiskarny" defb lf,lf,lf naplf: defb cr,lf,lf,"$" nap3: defb bell,cr,eol,"$" nap4: defw cls defb lf,lf,"Plna kapacita " defb "ramdisku.",cr,lf,lf,"Prirazeno: LST:=LPT:" defb cr,lf,lf,"$" nap5: defb "Zadej velikost spoollbufferu v kB (1-200): $" nap6: defb "Zadej cislo prikazu: $" nap7: defw cls defb "$" nap8: defb cr,lf,lf,"Buffer je vytvoren.",cr,lf,lf,"Prirazeno: " defb " LST:=UL1:",cr,lf,lf,"$" nap9: defb cr,lf,lf,"Velikost bufferu je pouze " nanap: defb " kB. Zbytek ramdisku blokuji",cr,lf defb "soubory pod CP/M.",cr,lf,lf,"Prirazeno: " defb " LST:=UL1:",cr,lf,lf,"$" nap10: defw cls defb lf,lf,"Spoolling buffer je inicializovan.",cr,lf,lf,"$" nap11: defw cls defb lf,lf,"Spoolling buffer nebyl dosud vytvoren." defb cr,lf,lf,"$" nap12: defw cls defb lf,lf,"Tisk obnoven.",cr,lf,lf,"$" nap13: defb "Zastaveni tisku pri nove strance? (A/N) $" nap14: defb "Nastaveni tiskarny? (A/N) $" nap15: defw cls defb lf,lf,"Plny ramdisk!",cr,lf,lf,"$" nap16: defb "Tiskarna neni pripravena!",cr,"$" nap17: defw cls defb lf,lf,lf,lf,ht,ht defb "Z A K L A D N I S I R E P I S M A" defb cr,lf,ht,ht defb "---------------------------------------------" defb cr,lf,lf,lf,ht,ht,ht defb " 1........Pica" defb cr,lf,lf,ht,ht,ht defb " 2........Proportional Pica" defb cr,lf,lf,ht,ht,ht defb " 3........Condensed Pica" defb cr,lf,lf,ht,ht,ht defb " 4........Elite" defb lf,lf,lf,lf,cr,"$" nap18: defw cls defb lf,lf,lf,lf,ht,ht,ht defb " T Y P P I S M A" defb cr,lf,ht,ht,ht defb " ------------------" defb cr,lf,lf,lf,ht,ht,ht defb " 1........Draft" defb cr,lf,lf,ht,ht,ht defb " 2........Zdvojeni bodu svisle" defb cr,lf,lf,ht,ht,ht defb " 3........NLQ" defb cr,lf,lf,ht,ht,ht defb " 4........Subscripts" defb cr,lf,lf,ht,ht,ht defb " 5........Superscripts" defb lf,lf,lf,lf,cr,"$" ; nap19: defw cls defb lf,lf,lf,lf,ht,ht,ht defb " T Y P P I S M A" defb cr,lf,ht,ht,ht defb " ------------------" defb cr,lf,lf,lf,ht,ht,ht defb " 1........Draft" defb cr,lf,lf,ht,ht,ht defb " 2........Subscripts" defb cr,lf,lf,ht,ht,ht defb " 3........Superscripts" defb lf,lf,lf,lf,cr,"$" nap20: defw cls defb lf,lf,lf,lf,ht,ht,ht defb "P R O V E D E N I P I S M A" defb cr,lf,ht,ht,ht defb "----------------------------" defb cr,lf,lf,lf,ht,ht,ht defb " 1........Normalni" defb cr,lf,lf,ht,ht,ht defb " 2........Tucne" defb lf,lf,lf,lf,cr,"$" nap21: defw cls defb lf,lf,lf,lf,ht,ht,ht defb " S I R E P I S M A" defb cr,lf,ht,ht,ht defb " ------------------" defb cr,lf,lf,lf,ht,ht,ht defb " 1........Zakladni sire" defb cr,lf,lf,ht,ht,ht defb " 2........Dvojta sire do prijeti LF" defb cr,lf,lf,ht,ht,ht defb " 3........Dvojta sire" defb lf,lf,lf,lf,cr,"$" nap22: defw cls defb lf,lf,lf,lf,ht,ht,ht defb "C H A R A K T E R P I S M A" defb cr,lf,ht,ht,ht defb "----------------------------" defb cr,lf,lf,lf,ht,ht,ht defb " 1........Svisle pismo" defb cr,lf,lf,ht,ht,ht defb " 2........Kurziva" defb lf,lf,lf,lf,cr,"$" nap23: defw cls defb lf,lf,"Nevhodne prirazeni LST!",lf nap24: defb cr,lf defb "$" ; ; end