;========================================= ; ; modul BIOS pro CPM ; (verze 4.0) ; ;========================================= ; ; .cref .z80 ; aseg org 100h jp pret ; org 01200h ; .phase 0ec00h ; ; bte: ccp equ bte-01600h ;start. adr. ccp bazadr equ 2430h ;pocatek znak. gen. v ramcard bdos equ bte-0dfah ;poc. bdos sinic equ 080h ;iniciace stacku delsys equ 115d ;delka ccp+bdos+adre- ;sar+cmt.com v sekt. pccp equ 02100h ;pocatek ccp po load bdstpa equ 1 ;stopa ccp bdsec equ 13d ;sector ccp sptrmc equ 16d ;pocet sektoru na stopu v ramc. rrbpi equ 0fdh ;rid. reg.pio b papio equ 0feh ;pa pio z80 pbpio equ 0ffh ;pb pio z80 pa55 equ 0d0h pb55 equ 0d1h ;adresy 8255 pc55 equ 0d2h rr55 equ 0d3h setzer equ 0f8h ;nast. adr. 00 v ramc. inrmc equ 0f9h ;cteni z ramcard (in) outrmc equ 0fah ;zapis do ramc. setadr equ 0ebh ;nast. adr. v ramc. setpag equ 0f9h ;nast. stranky v ramc.(pouze out) delst equ 0800h ;pocet byte stopy v ramc. delsc equ 080h ;delka sektoru v ramc. drselp equ 094h ;drive select port comreg equ 090h ;prikazovy registr WD2797 stareg equ 090h ;stavovy reg. WD 2797 trkreg equ 091h ;registr stopy WD 2797 datreg equ 093h ;datovy reg. WD 2797 secreg equ 092h ;reg. sektoru WD 2797 ; ; jp boot ;stud. start wbte: jp wboot ;teply start jp const ;stav konzoly jp conin ;vstup zn. z konz. jp conout ;vyst. zn. na konz. jp list ;vyst. na tisk. jp badio ;vyst. na der. jp badio ;vstup ze snim. jp dhome ;stopa 0 jp sldskd ;vyber disk jp settrk ;nastav stopu jp setsec ;nastav sektor jp stdmad ;nastav adr. dma jp read ;cti sektor jp write ;zapis sektor jp nsff ;stav tiskarny? Vraci 0ffh. jp setran ;transformuj sektor ; ; defb "Modul BIOS " defb "(C) Marty " identi: defb "1990 v4" defb 0 ;interrupt musi zacinat ; ;na sude adrese ; ; vint: defw rtint ;interrupt rtint: reti defs 6 ;zona prer. vektoru ; ; ;nasleduji parametry, ktere se modifikuji pri ;studenem startu pri iniciaci mechanik nebo ;pomocnymi programy v CP/M ; ;prirazeni konkretnich mechanik logickym vystupum: ;(deje se pres port 74174) ; typ0me: defb 80h ;ramcard defb 01h ;5 1/4' defb 32h ;8' defb 04h ;5 1/4' defb 08h ;5 1/4' ; ;tabulka parametru pro prikaz seek, restore a pod.: ;bit0=r0,bit1=r1,bit3=V,bit4=h ;poradi urceno v tabulce typ0me. ;dalsi bity musi byt nulove. ; typ0sk: defb 0ch,0ch,0ch,0ch,0ch ; ;tabulka poctu fyz. sektoru na stopu disk. jednotek: ;(na jedne strane) ; sec0me: defb 16,09,26,09,09 ; ;pocet vet po 128 byte v jednom fyz. sektoru: ; seccap: defb 1,4,1,4,4 ; ;tabulky prozatimne nadefinovanych parametru ;disket (vcetne ramcard): ; ;tabulka ramcard: ; dph0: defw 0,0,0,0 ;tabulka dph defw dirbuf ;adr. vyr. pameti defw dpb0 ;adr. tab. dpb defw csv0 ;adr. zony k. souc. defw alv0 ;zona alok. vekt. ; ;tabulka 5 1/4', 18sekt/st. (pro obe str.), ds, dd, ;80 stop na stranu: ; defw 0,0,0,0 defw dirbuf defw dpb1 defw csv1 defw alv1 ; ;tabulka 8', 26sekt/stopu,ss,sd: ; defw xlt ;prekladova tabulka defw 0,0,0 defw dirbuf defw dpb2 defw csv2 defw alv2 ; ;tabulka 5 1/4', 18sekt/st., ds, dd, ;40 stop na stranu: ; defw 0,0,0,0 defw dirbuf defw dpb3 defw csv3 defw alv3 ; ;tabulka 5 1/4', 18sekt/st., ds, dd, ;40 stop na stranu: ; defw 0,0,0,0 defw dirbuf defw dpb4 defw csv4 defw alv4 ; ;nasleduji tabulky dpb;pro kazdou me- ;chaniku je umyslne deklarovana vlastni ;tabulka dpb-to umozni definovat ctyri ;ruzne disketove mechaniky (patou je ;ramcard). ; ;ramcard: ; dpb0: defw sptrmc ;spt defb 3 ;bsh defb 7 ;blm defb 0 ;exm defw 241 ;dsm defw 63 ;drm defb 0c0h ;al0 defb 0 ;al1 defw 16 ;cks defw 6 ;off=12 kb pro syst. ; ;5 1/4',18 sec/stopu (pro obe strany), ds,dd, ;80 stop na stranu: ;; dpb1: defw 72 ;spt defb 4 ;bsh defb 15 ;blm defb 0 ;exm defw 354 ;dsm defw 191 ;drm defb 0e0h ;al0 defb 0 ;al1 defw 48 ;cks defw 1 ;off ; ;8', 26sec/stopu, ss,sd: ;(pozor! do vyhrazeneho mista se nevejde ;system!) ; dpb2: defw 26 ;spt defb 3 ;bsh defb 7 ;blm defb 0 ;exm defw 242 ;dsm defw 63 ;drm defb 192 ;al0 defb 0 ;al1 defw 16 ;cks defw 2 ;off ; ;5 1/4',18 sec/stopu (pro obe strany), ds,dd, ;40 stop na stranu: ; dpb3: defw 72 ;spt defb 4 ;bsh defb 15 ;blm defb 1 ;exm defw 174 ;dsm defw 127 ;drm defb 0c0h ;al0 defb 0 ;al1 defw 32 ;cks defw 1 ;off ; ;5 1/4',18 sec/stopu (pro obe strany), ds,dd, ;40 stop na stranu: ; dpb4: defw 72 ;spt defb 4 ;bsh defb 15 ;blm defb 1 ;exm defw 174 ;dsm defw 127 ;drm defb 0c0h ;al0 defb 0 ;al1 defw 32 ;cks defw 1 ;off ; ;prekladova tabulka: ; xlt: defb 1,7,13,19,25,5,11,17 defb 23,3,9,15,21,2,8,14 defb 20,26,6,12,18,24,4,10 defb 16,22 ; ; ;vstupni iniciace ;-------------------------------------- ; ;provede vstupni iniciaci, povoli ;preruseni, nastavi mod zobrazeni ; ; boot: di im 2 xor a ld sp,sinic ;nast. stacku out (0e0h),a ;ram 0-8k out (0e1h),a ;ram e000-ffff ld (flags),a ld (pklav),a ;norm. znaky ld (fbeep),a ;beep ano ld (lselby),a ;minuly vybr. disk ld (pcbln),a ld a,0bh ;neexistujici mod ld (setmod),a ;neexistujici mod zobraz. call normal ;normalni intenzita znaku call norzob ;normalni zobrazeni ld a,4 ;mod zobrazeni call inmod ;dilci nastaveni ld hl,081h ;nast. io b. ld (03h),hl ;akt. jedn. a uziv. ld hl,vint ;prer. v. pa pio ld a,h ;nastav. vys. byte ld i,a ld a,l ;nizsi byte out (rrbpi),a ;rr por. b. z80 pio ld a,0fh ;port b pio vystup out (rrbpi),a ld de,nap4 ;ident. zprava call dachz wboot: di ld sp,sinic ld a,(border) ;obnova borderu call setbor call normal ;normalni intenzita znaku call norzob ;normalni zobrazeni ld hl,tbrno ;ridici znaky con. brno call setrzn xor a ld (unacnt),a ;pocitadlo neal. zap. ld hl,pcbln res 1,(hl) ;roll mode obrazovky dec a ;a=ff ld (ftrep),a ;klav. nestlacena ld hl,bcurtr ;akt. stopy ld b,5 ;pocet parametru fillzr: ld (hl),a ;plneni neexistu- inc hl ;jici stopou djnz fillzr ;pro iniciaci-7bit ld hl,flags ;musi byt na h res 3,(hl) ;vyr. pam. neaktivni ld a,25 ;poc. radku ld (numrad),a ;nastaveni im 2 ;prer. mod ld a,4 ;zakaz prer. out (rr55),a ;od hodin ld hl,aktdsk ;aktualni disk ld (hl),0 ;musi byt ramcard inc hl ;stopa diskety ld (hl),bdstpa ;nast. stopy inc hl ;sektor inc hl ld (hl),bdsec ;nast. sekt. ld hl,ccp ;pocatek ccp ld b,44 ;delka v sekt. call movrmc ;nataz. bdos+ccp jr nz,bderr ;pri chybe ld a,0c3h ;instr. jp ld hl,wbte ;teply start ld (00h),a ;jp wboot ld (01h),hl ld hl,bdos ;poc. bdosu ld (05h),a ld (06h),hl ei call bel ;zvuk. vyst. ld a,(04h) ;akt.jedn.+uziv. ld c,a jp ccp ;pocatek ccp ; ; bderr: ld de,nap5 ;chyb. hlaseni call bioerr ;napis call conin ;ceka na klavesu ld sp,04h ;chybovy navrat ld hl,0e9h ;jp (hl) push hl ld hl,0e3d3h ;out (0e3) push hl ;nahore eprom ld hl,0e800h ;vstup monit. rst 00h ; ; ;nacte bdos + ccp z diskety nebo ramc. ;------------------------------------------- ; ;vstup: hl=adresa uklad. progr. v oper. pam. ; bc=delka progr. v "sekt." (po 128b.). ; sets a setrk urcuji misto na diskete, ; odkud se bude natahovat program,disketa ; je urcena prom. aktdsk. ;vystup: ulozi program od (hl).a=0 pri ; uspes. natazeni, a=1 pri chybe. ;meni: af,hl,de,bc ; ; movrmc: ld (setdm),hl ;adr. dma allcab: push bc call read ;cteni sekt. pop bc and a ret nz ;pri chybe ld de,080h ;dalsi adr. ld hl,(setdm) ;minul. adr. add hl,de ld (setdm),hl ;naplneni pr. ld hl,setsc ;prom. sekt. inc (hl) ;inc sektoru ld a,(dpb0) ;poc. sekt. na st. cp (hl) ;"za" stopu? jr nz,deltes ;pri nevycerpano ld (hl),0 ;prvni sekt. dec hl ;adr. seltrk dec hl inc (hl) ;inkrement stopy deltes: djnz allcab ;dalsi sektor xor a ;uspesny navrat ret ; ; ; nastavi border ;-------------------------------------------- ; ;vstup: a=byte pro nastaveni ;vystup: nastavi border ;meni: bc ; ; setbor: ld bc,06cfh ;border col. reg. out (c),a ;nast. borderu ld (border),a ;nastaveni prom. ret ; ; ;iniciacni nastaveni vybraneho modu 1 nebo 3 ;----------------------------------------- ; ;vstup: a= zobrazeni 1-4 (=mod 1 a 3) ;vystup: nast. zvol. zobr, scroll cele ob- ; razovky, cls, zakl. nast. palet ; dle (paltb). ; pri chybnem nast. modu c=1. ;meni: af,hl,de,bc ; ; inmod: call necur ;zhasnuti kur. ld e,a ;odl. modu cp 03h ;mod 3 ? ld c,085h ;rov. zap. ld d,80 ;poc. zn. na rad. ld a,6 ;mod 4 jr nc,zn80 ;ma-li byt 80 zn. xor a ;a=0 ld c,083h ;mod 1 ld d,40 ;40 zn. na rad. zn80: out (0ceh),a ;volba modu ld a,d ;poc. zn. na rad. ld (numzn),a ;nast. prom. ld a,c ;zap. mozmosti ld (provza),a ;nast. prom. ld a,(rovza) ;neni vyssi intenzita? cp 81h ;zobrazeni s vyssi inten.? call nz,inten ;nastavi nove roviny dec e ;porovnani s minul. modem ld a,(setmod) xor e and 0feh ;odliseni 40 a 80 zn. modu push af ld a,e ;obn. modu ld (setmod),a ;novy mod ld hl,borbuf ;border buf. ld b,0 ld c,a add hl,bc ;adr. v buf. ld d,(hl) ;prevz. byte rlca ;x2 rlca ;x4 add a,c ;x5 ld hl,paltb ;buf. palet ld c,a add hl,bc ;adr. v buf. ld bc,05f0h ;adr. pal. reg. otir ;nast. palet ld a,d ;nast. bord. call setbor xor a ;neni cad konz. ld (altm),a pop af ld a,81h ;zadny znak ret z ld hl,0 ;nast. scrol. reg. ld (scofs),hl ;ulozeni ld hl,escrb ;kon. scrl. buf. ld bc,06cfh ;adr. registru otdr ;vyslani ld c,0ch call outcrt ;smazani cele obraz. ld a,0dh ;cr ret ; ; paltb: defb 040h,00h,01fh,02eh,030h ;z1-c,b,sv. zluta,c defb 040h,0fh,011h,022h,03fh ;z2-b,m,t.cer.,b defb 040h,00h,01fh,02eh,030h ;z3-c,b,sv. zluta,c defb 040h,0fh,011h,022h,03fh ;z4-b,m,t.cer.,b ; borbuf: defb 0fh,01h,0fh,01h ;b,m,b,m ; defb 00h,00h,07dh,00h ;pro scrl. reg. escrb: defb 07dh ; ; ;vystup znaku v ascii na konzolu ;------------------------------------ ; ; ;vstup: ascii znak (i ridici) v c ;vystup: tisk znaku na obrazovku ;meni: af,hl,de,bc ; ; conout: call conper ;test prirazeni outcrt: push bc call necur ;zhasnuti kurzoru pop bc ld a,(altm) ;prime rizeni kurs.? and a jp nz,jealt ;skok na pr.riz. ld a,c sub 020h ;ridici znaky? jr c,rznak ;skok pri ano cp 05fh ;znaky ascii? jp z,exrzn ;zamena ridicich zn. jr c,chtest ;skok na tisk znaku cp 0dbh ;>z s hackem? ret nc ;pokud ano sub 41h cp 60h ret c ;neplatne znaky chtest: ld hl,(dfbin) ;misto tisku call outch ;vystup znaku ld hl,(dfcc) ;suradnice vys. zn. cright: inc l ;dalsi pozice ld a,(numzn) ;pocet zn./rad. dec a ;posl. sour. cp l ;konec radku? jr nc,setdf ;skok na nast. uk. ld l,0 ;prvni pozice lf: inc h ld a,(pnumrd) ;posledni radek? dec a cp h ;radky vycerpany? jr nc,setdf ;nast. ukaz. ld h,a ;nast. posl. rad. ld a,(pcbln) ;je roll mode? and 2 jr z,mroll ;skok pri roll mode ld h,0 ;prvni radek mroll: push hl call z,rolup ;scroll pouze pri roll modu pop hl setdf: ld (dfcc),hl ;ulozeni ukazov. kur. stdf: call dfthl ;pris. adr. ve vram ld (dfbin),hl ;uloz. bin. adr. ret ;---------------------------------- rznak: add a,20h add a,a ;x2 ld hl,tabri ;tab. rid. zn. ld b,0 ;vypocet poz. ld c,a add hl,bc ;adresa v tab. ld c,(hl) inc hl ld b,(hl) ld hl,(dfcc) ;misto tisku push bc ;rozeskok return: ret ; tabri: defw return,home,home,return defw inten,return,normal defw bel,cleft,tabul defw lf,cdwn,ff defw cr,invzob defw norzob,return,rollm defw pagem,return,eos,cright defw eol,return nastrz: defw cup,return defw cright,esc,return,return defw return,invez offesc: defb 1 ;offset escape pnumrd: defb 25 ;pom. pocet radku drzn: defw t2702 ;poc. tab. dal. rid. zn ; inten: ld a,(provza) ;nastavi odlisnou intenzitu and 0feh ;(barvu) jr setint ; normal: ld a,81h ;nastavi normalni intenzitu setint: ld (rovza),a ret exrzn: ld hl,(drzn) ;nastavi dalsi ridici sadu ;pocatek tabulky dalsich ;ridicich znaku setrzn: ld de,nastrz ;sem se bude presouvat ld bc,drzn+2-nastrz;delka ldir ;presun ret ; rollm: ld hl,pcbln ;nastaveni roll mode res 1,(hl) ;a obnoveni kurzoru ret ; pagem: call necur ;vypnuti kurzoru a nastaveni ld hl,pcbln ;page mode set 1,(hl) ret ; tabul: ld c," " ;tabulator o 8 pozic call outcrt ld a,(dfcc) and 7 ret z ;navrat,je pozice tabulatoru ld c,9 ;znovu test na pozici tab. jp outcrt cup: ld a,h ;kursor nahoru and a ;posledni radek? ret z dec h ;posun k. jr psetdf ;navrat ; cdwn: ld a,(numrad) ;posl. radek? dec a cp h ret z inc h ;dalsi pozice jr psetdf ; cleft: ld a,l ;kursor doleva dec l and a ;prvni poz. v rad.? jr nz,psetdf ;skok, neni-li ld a,h ;pozice radku and a ;prvni radek jr z,home ;pocat. pol. ld a,(numzn) ;poc. zn. na radek dec a ;posledni poz. v r. ld l,a dec h ;predch. radek jr psetdf ;nast. ukaz. ; home: ld h,0 ;poloha c. home cr: ld l,0 psetdf: jp setdf ; esc: ld a,2 ;prima adr. cur. ld (altm),a ;nast esc modu ret jealt: dec a ;obsluha esc ld (altm),a ;pro dalsi pruchod ld hl,dfcc ;ukazov. tisku ld d,0 ;vypocet ukaz. ld e,a add hl,de ;ukaz. rad. nebo sl. ld a,(offesc) ;pozice 0,0 je ld b,a ld a,c sub b ;zadavana s ruznym offsetem ;dle typu terminalu ret c ;spodni mez ld c,a ;zpet do c ld a,(altm) ;sloupec? and a ld a,(numzn) ;test na druhe meze jr z,pozvra ;pri sloupcich ld a,(numrad) ;pocet radku pozvra: dec a cp c ret c ;pri chyb. zadani ld (hl),c ;ulozeni hodnoty ld hl,(dfcc) ;ukaz. do hl jp stdf ;nast. ukaz. ; eol: ld a,(numzn) ;vymezer. do konce radku ld c,a ;pocet znaku na radek ld b,0 sub l ;pocet znaku do konce r. ret z ld d,a ld hl,(dfbin) ;bin. poloha kurzoru di ld a,(rovza) ;roviny zapisu or 080h out (0cch),a ld e,8 in a,(0e0h) ;vram ld a,(typcls) ;cim se ma mazat davym: push hl call vymrad ;vymaz telev. radku pop hl add hl,bc ;dalsi adresa dec e jr nz,davym in a,(0e1h) ;zpet ram ei ret vymrad: ld b,d vymtr: ld (hl),a ;nulovani inc hl djnz vymtr ret ; defb "ident akcep" ;vnitrni identifikace ; ff: call home ;smazani obrazovky ld h,0 jr pocrad ; eos: ld a,l ;mazani od poz. kur. and a ;poc.radku? jr z,pocrad ;skok pri pocatku push hl call eol ;vymezer. do k. radku pop hl inc h pocrad: ld a,019h ;max. poc. r. sub h ret z ;konec obr. ret ld l,a ;vypocet zony ld h,0 add hl,hl ;x2 add hl,hl ;x4 add hl,hl ;x8 ld b,h ;prevzeti delky ld c,l call clsp ;mazani ret ; bel: ld hl,btab1 ;zvuk. znameni ld d,030h ;delka tonu ld e,3 ;pocet tonu call cpbeep ;pipnuti ret ; invzob: xor a ;inverzni zobrazeni jr cszob ; norzob: ld a,61h ;normalni zobrazeni jr cszob ; invez: ld a,(drucur) ;inverze znaku a pozadi, cszob: xor 61h ;kurzoru; je inverze? ld (drucur),a ;zmena kurzoru ld a,2fh ;instrukce cpl ld hl,0ffffh ;pro druh mazani obrazovky sendin: ld (setinv),a ld (typcls),hl ret z inc hl ;hl=0 xor a ;nop jr sendin ; tbrno: defw cup,return ;ridici znaky brno defw cright,esc,return,return defw return,invez defb 1 ;offset escape defb 25 ;pom. pocet radku defw t2702 ;poc. tab. dal. rid. zn ; t2702: defw cright,return ;ridici znaky 2702 defw cup,esc,return defw home,eol,eos defb 20h ;offset escape defb 24 ;pocet radku defw tbrno ;tab. dalsich r. zn. ; ; ; vysle souvisly ton ;--------------------------------- ; ;vstup: d=delka tonu,e=pocet tonu,hl=adr. tabulky ;vystup: tony o stejne delce ;meni: af,hl,bc,de ; ; cbeep: ld e,1 cpbeep: ld a,1 ;zapnuti kanalu out (rr55),a ld b,3 ;pocet parametru call outby ;start tonu push de ld b,0 ;zpozdeni delb: ex (sp),hl ;casova smycka djnz delb dec d jr nz,delb pop de dec e ;tony vycerpany? jr nz,cpbeep ld hl,btab2 ;konec beepu ld b,2 ;dva param. outby: ld a,(hl) ;co vyslat inc hl ld c,(hl) ;kam inc hl out (c),a ;vyslani byte djnz outby ;cela serie ret ; btab1: defb 036h,0d7h,0cch,0d4h,018h,0d4h;f-3 defb 036h,0d7h,093h,0d4h,012h,0d4h;a#-3 defb 036h,0d7h,02ah,0d4h,025h,0d4h;a#-2 btab2: defb 036h,0d7h,00h,0d3h btab3: defb 036h,0d7h,04ah,0d4h,09h,0d4h;a#-4 ; ; ; beep ;------------------------------- ; ;vstup: 0 ;vystup: kratke pipnuti ;meni: hl,de,bc ; ; beep: push af ld a,(fbeep) ;povoleno pipnuti? dec a ld hl,btab3 ;parametry ld d,05h ;delka call nz,cbeep ;pipnuti pop af ret ; ; ;zapise znak v ascii do vram ;------------------------------------ ; ;vstup: ascii znak v a ;vystup: zapis do vram na bin. pozici v hl ;meni: af,hl,de,bc ; ; outch: di ex de,hl ;na (de) se bude ukladat ld l,a ;rel. adresa v zn. gen. ld a,(rovza) ;roviny zapisu tisk: ld h,0 out (0cch),a ;writte form. reg. add hl,hl ;x2 add hl,hl ;x4 add hl,hl ;x8 (1 znak = 8 byte) ld bc,bazadr ;bazova adresa zn.gen add hl,bc ;abs.adresa in a,(setzer) ;nulova strana v ramcard ld b,h ;nastaveni adresy v ramcard ld c,setadr out (c),l ld hl,(numzn) ;pocet znaku na radek ld h,0 ex de,hl in a,(0e0h) ;zapnuti vram ld b,8 ;8 bitu dara: in a,(inrmc) ;cteni byte setinv: cpl ;misto pro pripadnou inverzi ld (hl),a ;ulozeni znaku add hl,de ;dalsi pozice djnz dara ;vsech 8 bytu in a,(0e1h) ;vypnuti vram ei ret ; ; ;prepocet souradnic kursoru na adr. v vram ;----------------------------------------- ; ;vstup: sour. kursoru: h=radek, l=sloupec ;vystup bin. adresa ve vram v hl ;meni: af,hl,de ; ; dfthl: ld d,h ;poradi radku ld e,0 ld a,l ;poradi sloupce ld l,h ;poradi radku ld h,e ;nulovani h add hl,hl ;x2 add hl,hl ;x4 add hl,hl ;x8 add hl,hl ;x16 add hl,hl ;x32 add hl,hl ;x64 add hl,de ;x320=byte na 1 zn. rad. ld d,e ;nulovani d ld e,a ;pocet znaku vrad. ld a,(numzn) ; cp 028h ;40zn. na radek? jr z,ne80 ;ano, skok add hl,hl ;x640 (80 zn.) ne80: add hl,de ;rel. adr. v vram set 7,h ;vram je od 8000h ret ; ; ; inverze znaku ve vram ;------------------------------------ ; ;vstup: 0 ;vystup: inverze znaku kursorem ;meni: af,hl,de,bc ; ; invz: ld a,(drucur) ;druh kursoru ld de,(dfbin) ; sour. kursoru bin di ld l,a ;rel. adr. ld a,(rovza) ;rovina zapisu or 020h ;zapis jako xor and 07fh jr tisk ;zapis do vram ; ; ; ; blikani kursoru ;------------------------------------ ; ;vstup: 0 ;vystup: blika kursor ;meni: af,hl,de,bc ; ; cblnk: in a,(pc55) ;bezi casovac? rlca rlca jr c,nec1 ;skok na zhas. kurs. xor a out (pa55),a ;nuluje timer cpl out (pa55),a ;spusteni timeru ld a,(pcbln) ;stav zobr. kursoru and a ret nz ;kurs. je zobr., ret jr inv ;inverse kursoru ; ; ; zhasne kursor ;------------------------------------ ; ;vstup: 0 ;vystup: zhasnuti kursoru ;meni: f,hl,de,bc ; ; necur: ld h,a nec1: ld a,(pcbln) ;stav kursoru bit 0,a ld a,h ;obnoveni a ret z ;kursor nesviti, ret inv: push af ld a,(pcbln) ;zmena stavu zob. k. xor 1 ld (pcbln),a call invz ;inverse kurs. pop af ret ; ; ; hardwarovy roll nahoru ;---------------------------------------- ; ;vstup: 0 ;vystup: posun obrazu o jeden znak. radek ; mezi start a end udaji offset reg. ;meni: af,de,bc,hl ; ; rolup: ld hl,(scofs) ;ud. pro sc. of. reg. ld de,028h ;roll o 1 znak. radek add hl,de ;novy scroll offset push hl ld de,03e8h ;znak. del. scr. wdth and a sbc hl,de ;je uz max. rol. delka? pop hl jr nz,noscw ;skok, pokud ne nulofs: ld hl,0 ;nulov. scr. off. reg. noscw: ld (scofs),hl ;uloz. nove hodnoty wzp: in a,(0ceh) ;je zatemnov. pulz? and 040h ;maska jr nz,wzp ;ceka se na zat. pulz di ld bc,02cfh ;adr. scr. ofs. reg. 1 out (c),h ;nast. scr. offs. reg. dec b ;scr. offs. reg. 2 out (c),l ei ld bc,8 ;maze posl. radek call clsp ret ; ; ; mazani obrazovky ;----------------------------------------- ; ;vstup: pocet ctyricetic (osmdesatic) b. v bc ;vystup: smazani obr. "odzadu" o "delce" v bc ;meni: af,bc,hl ; ; clsp: ld a,(numzn) ;40 znaku na radek? cp 028h ld hl,01f40h ;relat. delka vram jr z,cls40 ;skok pri 40 zn. na rad. sla c ;bc x 2 rl b add hl,hl ;x2 pro 80 zn. na rad. cls40: set 7,h ;abs. adr. ve vram ld (prosp),sp ;uloz. ukazatele ld (prosp-2),hl ;novy ukazatel ld hl,(typcls) ;pro mazani ld a,(rovza) ;roviny zapisu do vram or 080h ;zapis do nast. rov. out (0cch),a ;wr. rol. reg. nclr: di ld sp,(prosp-2) ;nastaveni ukaz. in a,(0e0h) ;vram push hl ;vlastni nulovani push hl push hl push hl push hl push hl push hl push hl push hl push hl push hl push hl push hl push hl push hl push hl push hl push hl push hl push hl in a,(0e1h) ;ram ld (prosp-2),sp ;ulozeni ukazatele ld sp,(prosp) ;obnoveni puv. hodn. ei dec bc ld a,c ;vycerpan poc. radku? or b jr nz,nclr ;skok pri nevycerpano ret ; ; ;cte klav. konz. s cekanim na stisk klavesy ;----------------------------------------------- ; ;vstup: ceka na klavesu + repeat ;vystup: ascii kod v a a v lastk ; misto vstupu je az conin ; je-li prirazena klav. mz-800, ; sejme f1-f5; f1-f4=m1-m4 ; zobr., f5=zmena fce beepu ;meni: af,hl,de,bc ; ; nekl1: pop bc conin: xor a ;nulov. promenne ld (ftrep),a nekl: call cblnk ;blikani kursoru call ctekl ;cteni klavesnice cp 81h ;klavesa stlacena? jr nz,jekl ;skok pri stlac. kl. ld (lastk),a ;klavesa nestlacena jr nekl ;cekani na klavesu jekl: ld bc,0a00h ;zpozdeni delay: dec c jr nz,delay djnz delay ld c,a ;klav. do c ld a,(pokl) ;navrat pro kl. f1-f5 cp 72h ld a,c jr nc,fknvr call ctekl ;cteni klavesnice cp c ;souhlas obou cteni? jr nz,nekl ;skok pri nesouhl. ld a,(lastk) ;minula klavesa cp c ;souhlasi? jr z,klok ;skok pri shode ld a,028h ;pro zpozdeni-nesh. jr nesh ;skok pri neshode klok: push bc ld a,(pokl) ;poradi klavesy ld c,a smyc1: call ctekl ;cteni klav. ld a,(pokl) ;porov. por. klav. cp c ;souhlas sminulym? jr nz,nekl1 ;skok pr nesouhl. call rdtim ;vyprsel cas casovace? jr nz,smyc1 pop bc ld a,c ;znak do a ld hl,takl ;bez repeat? ld b,3 ;jsou 3 r. znaky look: cp (hl) jr z,nacon ;r. znak nal., skok inc hl ;dalsi pozice djnz look ld a,03h ;konstanta repeat nesh: ld (konzp),a ;ulozeni ld a,c ;v a je cteny znak call beep ;kratke pipnuti fknvr: call settim ld (lastk),a ;ulozeni cp 080h ;inv. fce shift? ret nz ;neni, navrat ld a,(pklav) ;priznaky klav. xor 1 ;inv. fce shift ld (pklav),a ;ulozeni nacon: jp conin ; takl: defb 03h,080h,01bh ;zn. bez rep:^C,shift, ;esc ; ; ;nastavi casovac 2 a 3 8253 na odezvu danou promennou konzp ;---------------------------------------------------------- ; ;vstup: 0 ;vystup:casovac 2 nastaven na 00h, casovac 1 nastaven ; na generaci jednoho pulzu za cas dany promennou ; konzp (mod 4) ;meni: bc,hl ; ; settim: push af ld hl,tab1tm ;tabulka parametru ld b,3 ;jejich pocet call outby ;vyslani ld c,0d6h ld hl,sttim ;promenna ini ;cteni citace 2 ini pop af ret ; tab1tm: defb 078h,0d7h,00h,0d5h konzp: defb 04h,0d5h ; ; ;sejme stav citace 2 obvodu 8253 ;-------------------------------- ; ;vstup: 0 ;vystup:a=0 pri zadanem stavu, jinak a<>0 ;meni: hl,af ; ; rdtim: push bc ld a,080h out (0d7h),a ;cteni za chodu cit 2 ld c,0d6h in a,(c) in b,(c) ld c,a ld hl,(sttim) ;minuly stav citace dec hl ;zadany stav and a sbc hl,bc ;souhlas? ld a,h or l pop bc ret ; ; ;pruchozi cteni klavesnice mz-800 ;-------------------------------------- ; ;vstup: cteni klavesnice bez debou ;vystup: znak ascii a sluz. kody v a. ; pri nastlaceno a=81h. ; u f1-f5, viz cteni klav. s cekanim ;meni: af,de,hl ; ; ctekl: push bc ld bc,0f800h+pa55 ; shift, ctrl,br. out (c),b ;zapis do portu nop ;pauza in a,(pb55) ;cteni sloupce push af and 081h ;test na shift+break jr nz,nebr ;skok, neni shift+break ld a,3 ;kod ctrl+C retct: pop bc pop bc ret nebr: bit 7,a ld a,01bh ;prim. riz. kursoru jr z,retct inc b ;test na klavesy f1-f5 ld h,1 ;sejme se sloupec f1-f5 call snima ;sejmuti sloupce jp nz,zpfk ;skok pri stlaceni klav. ld b,0f7h ;sejmuti klaves 0-63 ld h,8 ;sejme se 8 sloupcu call snima ld (pokl),a ;uloz. por. kl.+1 pop de ;v d je sl. 8 jr z,nulv ;klavesa nestlacena ld h,41 ;offset alfabet. znaku ld e,11h ;offset diakritiky ld bc,tabsh ;tabulka siftovanych znaku bit 0,d ;je shift? jr z,tectrl ;ano, skok ld e,21h ;offset cislic ld bc,tabnsh ;tabulka nasift. znaku tectrl: bit 6,d ;klavesa ctrl jr z,ctrl ;skok pri ctrl ld a,(pklav) ;prizn. byte kl. cp 01h ;ma byt inv. shift? ld a,d jr nz,notran transf: ld a,d ;inv. shift (u pism.) xor 1 notran: bit 0,a ;je shift? jr nz,nequ ;skok, neni shift ld h,73d ;tabulka shift. znaku nequ: call prevd ;prevod na ascii navrt: pop bc ret ctrl: call prevd ;prevod na ascii cp 020h ;128 byte wr128: ld hl,(setdm) ;parametry se mohou ld (seldma),hl ;pristavit beze zmeny ld hl,(aktdsk) ld (seldsk),hl ld a,(setsc) ld (selsec),a res 5,(iy+0) ;sektor=128byte jp spolrw ;fyzicke cteni/zapis rwch: pop bc ;chybovy navrat ret rwoper: ld hl,hstbuf ;pro nastaveni DMA ld (seldma),hl set 5,(iy+0) ;sektor > nez 128 byte ld a,(setsc) ;pozadovany sektor push bc ;b=kapacita fyz. s.-1 rlca vypfyz: srl a ;vypocet fyzickeho cisla srl b ;sektoru jr c,vypfyz inc a ld (pomsec),a xor a bit 3,(iy+0) ;host buff. aktivni? set 3,(iy+0) ;vzdy bude aktivni jr nz,noinit ;neni iniciace, skok set 2,(iy+0) ;musi se predecitat jr filhst ;neni-li aktivni noinit: bit 1,(iy+0) ;je cteni? call z,yeswr ;pri zapisu ld bc,3 ld de,dupdsk ;minule fyz. par. ld hl,aktdsk ;nove fyz. par. push bc call cpdehl ;porovnani par. pop bc jr z,match ;pri souhlasu ld hl,dupdsk ;parametry pro pozas- ld de,seldsk ;taveny zaznam ldir xor a bit 4,(iy+0) ;pozastaveny zapis? res 0,(iy+0) ;bude se zapisovat call nz,spolrw ;zapis na disk and a ;chyba zapisu? jr nz,rwch ;pri chybe filhst: ld hl,aktdsk ;nastaveni duplicit- ld de,dupdsk ;nich parametru ld bc,3 push bc push hl ldir pop hl ;nastaveni fyzickych pop bc ;parametru ld de,seldsk ldir bit 2,(iy+0) ;je treba cist? set 0,(iy+0) ;bude se cist call nz,spolrw ;predecteni nebo cteni and a jr nz,rwch ;pri chybe res 4,(iy+0) ;bez priznaku odl. zap. match: pop bc ld a,(setsc) ;presun vety do/z vy- and b ;rovnavaci pameti ld de,128 ;delka vety push de call axde ;v hl relat. adresa ld de,hstbuf ;vyrovnav. buffer add hl,de ld de,(setdm) ;adresa dma bit 1,(iy+0) ;je cteni? jr nz,budect ;skok na cteni ex de,hl ;obrat smer presunu set 4,(iy+0) ;pozastaveny zapis budect: pop bc ;delka sektoru (128 b.) ldir ;presun ld a,(wrtype) ;jde o zap. do adresare? cp 01 ld a,0 ret nz res 4,(iy+0) ;zruseni priz. odl. zap. res 0,(iy+0) ;budeme zapisovat spolrw: ld de,(seldsk) ;vybrany fyz.disk ld d,0 ld hl,typ0me ;tabulka fyz. prirazeni add hl,de ;disku ld a,(hl) ;prevzeti prirazeni cp 80h ;je to ramcard? jp z,ramdsk ld (selby),a ;udaj pro select port push af ld hl,bcurtr ;tab. nastav. stop disku add hl,de ld (curtrk),hl ;nastaveni ukazovatka ld hl,typ0sk ;param. pro prikazov. reg. add hl,de ld a,(hl) ;parametry pro prikaz ld (spseek),a ;seek a restore ld hl,sec0me ;pocet fyzickych sektoru add hl,de ;na stopu ld a,(hl) ld (pocsec),a ld a,(lselby) ;minuly parametr ld l,a pop af ;novy parametr cp l ;stejny disk? ld (lselby),a ;novy bude stary ld c,drselp ;drive select port ld d,04h ;pro prikazovy reg. ld b,a jr nz,baddr ;pri nesouhlasu jednotek in a,(c) ;motor bezi? and 01h ;motorovy bit res 2,d ;bez cekani jr nz,sametr ;skok,bezi-li baddr: set 2,d ;s cekanim na hlavicku out (c),b ;vyber nove mech. sametr: ld hl,21142 ;testuje po dobu 1s wfr: in a,(stareg) ;ready? bit 7,a jr z,strack ;je ready call pau jr z,wfr ;ceka 1s ld de,nap6 ;drive not ready chybna: ld a,(seldsk) ;fyzicky disk add a,41h ;znaky ASCII ld (retdsk),a ;doplneni napisu ld (stdsk),a call bioerr ;chybovy navrat ld a,1 ;priznak chyby ret strack: out (c),b ;retrigr monoflopu ld hl,(curtrk) ;nastaveni stopy ld a,(hl) ;nastavena stopa bit 7,a ;je treba iniciace ;mechaniky? jr z,yftrk ;neni-li treba bit 0,(iy+0) ;neni zapis? jr z,yftrk ;pri zapisu bit 5,(iy+0) ;sektor 128byte? ;=8" muze byt bez ;tabulky dpb ret z ;pokud je xor a ;pro chybovy napis ld (seltrk),a ld (hl),a ;aktualni stopa inc a ld (selsec),a out (secreg),a ;sektor call recal ;home hlavy ld e,5 ;bude 5 pokusu catchd: call physco ;cteni sektoru jr z,noes0 ;neni-li chyba dec e ;dalsi pokus jr nz,catchd jr cenerr ;na chyb. vystup noes0: ld a,(seldsk) ;vybr. disk call doddpb ;prislusna tabulka ex de,hl ;dpb do de ld hl,(seldma) ;sem se cetlo ld bc,2eh ;offset v sektoru add hl,bc ;pocatek tab. push de ld de,identi ;identifikace format. ld bc,7d ;programu call cpdehl ;porovnani napisu pop de jr z,fpok ;pri spravnem prog. ld de,nap9 ;chybove hl. call bioerr ret fpok: ld bc,15d ;delka ldir ;presun tabulky ret yftrk: out (trkreg),a ;stara stopa ld a,(seltrk) ;nova stopa ld (hl),a ;nova bude stara ld a,(pocsec) ;pocet sekt. na st. ld e,a ld a,(selsec) ;pozadovany sektor cp e ;urceni strany disku jr c,ssect ;nastav sektor jr z,ssect sub e ;vypocet cisla sekt. ;na druhe strane set 1,d ;nastav. priz. 2.str. ssect: out (secreg),a ;nastaveni sektoru ld e,3 ;pocet pokusu o nast. physop: ld hl,seltrk ;pozad. fyz. stopa in a,(trkreg) ;souc. stopa disku cp (hl) ;stopa nastavena? ld a,(hl) ;pozad. stopa call nz,seekco ;nastaveni stopy jr nz,physre ;pri chybe nastaveni ;rekalibrace call physco ;cteni/zapis ret z ;uspesny navrat res 2,d ;bez cekani na hlavu ld a,e ;byl to prvni pokus cp 02 ;o nastaveni stopy? jr nz,perrt physre: call recal ;rekalibrace pri ne- perrt: dec e ;uspesnem pokusu jr nz,physop ;dalsi pokus cenerr: ld a,(seltrk) ;prevod stopy na deka- call dfromh ;dicky tvar ld (sttrc),hl ;doplneni chyboveho ld a,(selsec) ;napisu call dfromh ;prevod sektoru ld (retsc),hl ld a,0feh ;neplatne cteni ld (dupsec),a ;nebo predecteni ld hl,(curtrk) ld (hl),0 ;je poloha home ld de,nap7 ;chybna r/w operace jp chybna ;chybovy navrat ; ; ;transformuje hexacislo na dekadicky tvar v ASCII ;------------------------------------------------ ; ;vstup: hexacislo <64h v A ;vystup: odpovidajici dekadicke cislo v znacich ; ASCII: l=znak s vyssi vahou ; h=znak s nizsi vahou ;meni: af, de,hl ; ; dfromh: ld l,0 ;sumacni bunka dades: sub 10d inc l jr nc,dades ;dalsi desitka add a,10d dec l ld h,a ;jednotky ld de,3030h add hl,de ;prevod na ASCII ret ; ; ;presun hlavy disk. jednotky na nultou stopu ;------------------------------------------- ; ;vstup: 0 ;vystup: hlava na stope 0 nebo chyb. hlaseni ;meni: af,bc, modifikuje d ; ; recal: ld a,(spseek) ;param. pro rest. ld c,04 ;er. maska prikazu jr conrc ;vyslani restore ; ; ;nastaveni hlavy disk. jednotky na zadanou stopu ;----------------------------------------------- ; ;vstup: registr stopy v WD 2797 nastaveny na po- ; lohu hlavy a pozadovana stopa v A ;vystup: hlava na pozadovane stope nebo chybove ; hlaseni ;meni: af,bc, modifikuje d ; ; seekco: out (datreg),a ;pozadovana stopa ld a,(spseek) ;parametry jednotky set 4,a ;prikaz seek ld c,18h ;seek error maska conrc: out (comreg),a ;vyslani prikazu ld a,(selby) ;retrigr monoflopu out (drselp),a ld b,10d djnz $ ;cekaci smycka wfseek: in a,(stareg) ;stavove slovo bit 0,a ;je platne? jr nz,wfseek ;ceka na platnost set 2,d ;s cekanim na hlavu and c ;maska platnych bitu ret ; ; ;fyzicke cteni - zapis na disk ;----------------------------------- ; ;vstup: disk ready, nastavena stopa, adresa DMA, bit 0 ; flags je nastaven dle pozad. operace, d=strana ; disku apriznak zpozdeni, v zaz. prist. data ;vystup: precteny nebo zapsany sektor od adr. (seldma); ; z=h-uspesna operace, jinak a obsahuje vymasko- ; vany stavovy registr WD 2797 ;meni: af,hl,bc ; ; physco: ld hl,(seldma) ;poc. pole dat di ld a,(selby) ;retrigr monofl. out (drselp),a ld c,datreg ;datovy registr bit 0,(iy+0) ;cteni? jr z,cowr ;pri zapisu ld a,88h ;floppy read c. or d ;volba strany+ ;zpozdeni out (comreg),a ;nastaveni rezimu ld b,10d djnz $ ;ceka nxtrd: in a,(stareg) ;stavovy registr cp 01 ;operace ok, ale ;je busy? jr z,nxtrd ;ceka na ready in b,(c) ;cteni dat bit 1,a ;data platna? jr z,rnbw ;jeste ne, skok ld (hl),b ;ulozeni dat inc hl jr nxtrd ;dalsi byte rnbw: bit 0,a ;busy bit jr nz,nxtrd ;jeste se ceka ei and 9ch ;maska chyb v read ret ; cowr: ld a,0a8h ;floppy write code or d ;strana+cekani out (comreg),a ;do prikaz. reg. ld b,10d djnz $ ;ceka nxtwd: ld b,(hl) ;prevzeti byte inc hl nxtwr: in a,(stareg) ;mozno vyslat byte? cp 01 jr z,nxtwr ;ceka se dal out (c),b ;vyslani byte bit 1,a ;pozadavek pristave- ;ni byte? jr nz,nxtwd ;dalsi byte bit 0,a ;je busy? jr nz,nxtwr ;novy zapis tehoz b. and 0dch ;maska chyby zapisu jr nz,wrserr ;pri chybe ld a,88h ;floppy read code res 2,d ;bez zpozdeni or d ;strana disku out (comreg),a ;zapis prikazu ld b,10d ;ceka djnz $ versct: in a,(datreg) ;data se zahazuji in a,(stareg) ;stavove slovo bit 0,a ;je busy? jr nz,versct ;dalsi byte and 98h ;maska na verify wrserr: ei ret ;chybu ; ; ;podprogram pauzy-celkova delka 100 stroj. taktu ;----------------------------------------------- ; pau: dec hl rept 4 ex (sp),hl endm bit 7,h ret ; ; ;uschovani reg. iy a jeho obnova ;--------------------------------- ; ;vstup: nastavena prom. aktdisk ;vystup: uschovani a obnova pres ret reg. iy. iy ; naplni adresou flags, a=0, z=h pri sec ; 128 byte, jinak a=b=(pocet 128-mic byte ; ve fyz. sektoru)-1 ;meni: iy,hl,de,af ; ; pshiy: pop hl ;navratova adresa push iy ;uschova iy ld iy,popiy ;navratova adresa push iy push hl ld iy,flags ld de,(aktdsk) ;aktual. disk ld d,0 ld hl,seccap ;tab. kapacity fyzic- add hl,de ;kych sektoru ld a,(hl) ;kapacita vybr. jedn. dec a ld b,a ret popiy: pop iy ;obnova iy ret ;navrat ; ; ;porovnani zony od (de) s zonou od (hl) ;------------------------------------------ ; ;vstup: nastavene de, hl, delka bloku v bc ;vystup: pri souhlasu zon se nastavi priznak z, ; pri nesouhlasu je nulovan. ;meni: af,de,hl,bc ; ; cpdehl: ld a,(de) inc de cpi ret nz jp pe,cpdehl ret ; ; ; dodani tabulky DPB ;----------------------------------------- ; ;vstup: a=pozadovana jednotka ;vystup: hl obsahuje adresu DPB poz. jednotky ;meni: af,de,hl,bc ; ; doddpb: call poupom ;tabulka DPH ld de,0ah add hl,de ld a,(hl) inc hl ld h,(hl) ld l,a ret ; ; ;testuje pokracovani v nealokovanem zapise ;------------------------------------------ ; ;vstup: c=typ zapisu (0-2), e=aktualni disk, ; d=0 ;vystup: nuluje nebo nastavi bit urcujici ; predecteni fyz. sekt. pri zapisu. ;meni: af,hl,de,bc ; ; yeswr: ld a,c ;typ zapisu do a ld (wrtype),a cp 2 ;zapis do neal. bl? jr nz,caltst ;skok na dalsi roz- ;liseni, muze jit o ;pokrac. v neal. zap. ld a,e ;aktualni disk call doddpb ;tabulka dpb inc hl inc hl ;pocet vet v alok. inc hl ;bloku - 1 do a ld a,(hl) ; ld (unacnt),a ;zapis musi smerovat ;do 1. vety, jinak ;chyba!!! ld hl,(aktdsk) ;nastaveni parametru ld (unadsk),hl ld a,(setsc) ld (unasec),a jr noof caltst: ld a,(unacnt) ;test na pokracovani and a ;v nealok. zapise jr z,alloc ;blok alok, nutno cist dec a ;pocitadlo sektoru ld (unacnt),a ld hl,unasec ;urceni soucasneho inc (hl) ;predpokladaneho sekto- push hl ;ru z minulych param. ld a,(unadsk) call doddpb ;tabulka dpb ld b,(hl) ;pocet vet 128 b. na st. pop hl ld a,(hl) ;konec stopy? inc a cp b jr c,noof ;neni-li konec stopy ld (hl),0ffh ;prvni sektor dec hl dec hl ;ukazuje na stopu inc (hl) ;dalsi stopa noof: ld bc,2 ;porovnaji se 2 par. ld hl,unadsk ;porovnani disku a stop ld de,aktdsk call cpdehl jr nz,alloc ;pri nesouhlasu inc de inc hl ;preskoci se fyzicky inc bc ;sektor call cpdehl ;porovnani sektoru 128b. res 2,(iy+0) ;shoda, neni treba pre- ret z ;decitat alloc: set 2,(iy+0) ;musi se predecitat xor a ld (unacnt),a ;nulov. cit. neal. zap. ret ; ; ;zapise - precte sektor z ramcard ;----------------------------------------- ; ;vstup: parametry v seldma,seltrk a v selsec ; iy=flags, nastaven bit 0 flags ;vystup: ulozeni dat z sektoru na adr. seldma ; a=0 pri cteni ok, jinak a=1 ;meni: af,hl,de,bc ; ; ramdsk: di call nastad ;adresa v ramcard ld d,0 ;pro kont. sumu bit 0,(iy+0) ;neni zapis? jr z,wrrdsk ;pri zapisu ld hl,(seldma) ;misto presunu ld b,delsc ;delka sektoru reaby: in a,(inrmc) ;cteni dat ld (hl),a ;ulozeni inc hl ;dalsi adresa xor d ;kontr. suma ld d,a djnz reaby ;cely sektor push de call setsum ;adr. kont. sumy pop de in a,(inrmc) ;cteni sumy xor d ;souhlas sum? ei ret z ;pri souhlasu wrerr: ld a,1 ;pro chyb. hlas. ei ret ; ; ;zapis zony pameti do zadaneho sektoru v ramc. ;--------------------------------------------- ; ;vstup: misto zaznamu urceno setrk a setsc ; adresa v operacni pameti dle setdm ; d=0,urcena adresa v ramcard pres ; call nastad ;vystup: zapis zony pameti do zad. sekt. ;meni: af,hl,de,bc ; ; wrrdsk: push hl push af ;uschovani par. ld hl,(seldma) ;adresa dma ld b,delsc ;delka sekt. wrby: ld a,(hl) ;prevzeti byte inc hl ;dalsi adresa out (outrmc),a ;zapis do ramcard xor d ;kont. suma ld d,a djnz wrby ;cely sektor push de call setsum ;adr. kont. sumy pop de ld a,d ;uloz. kont. sumy out (outrmc),a ;zapis sumy call sadrp ;znova nast. adresy in a,(inrmc) ;suma zapsana? cp d pop hl ld a,h pop hl jr nz,wrerr ;chyba zaznamu call sadr ;kontrola zapisu ld b,delsc ld hl,(seldma) ;vstupni parametry wnoer: in a,(inrmc) ;cteni byte xor (hl) ;souhlasi? jr nz,wrerr ;pri chybe inc hl ;dalsi byte djnz wnoer ei ;uspesny zapis ret ; ; ;vypocet a nastaveni adresy v ramcard ;--------------------------------------------- ; ;vstup: udaje v seltrk a v selsec ;vystup: nastaveni adresy v ramcard ;meni: af,hl,de,bc ; ; nastad: ld a,(seltrk) ;cislo stopy ld de,delst ;poc. byte na st. call axde ;a x de push af push hl ;ulozeni vysledku ld a,(selsec) ;cislo sektoru ld de,delsc ;delka sekt. call axde ;por. 1. byte sekt. pop de add hl,de ;abs. adr. v ramcard pop bc adc a,b sadr: out (setpag),a ;volba adresy sadrp: ld b,h ld c,setadr out (c),l ret ; ; ;vypocte a nastavi adresu kontrolni sumy ;----------------------------------------- ; ;vstup: udaje v seltrk a v selsec ;vystup: nastaveni adresy kont. sumy sekt. ; v ramcard ;meni: af,hl,de,bc ; ; setsum: ld a,(seltrk) ;aktualni stopa ld de,sptrmc ;poc. sekt. na stopu call axde ;a x de ld de,(selsec) ;cislo sektoru ld d,0f8h ;baz. adr. sum add hl,de ;adr. sumy ld a,3 ;zac. zony=3f800h jr sadr ;volba adresy ; ; ; 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 ; ; ;otestuje prirazeni konzoly+chybovy vystup ;-------------------------------------------- ; ;vstup: 0 pri rutine conper ; de=adresa napisu pri rutine error ;vystup: navrat pri crt,nebo vystup na tiskarnu, ; jinak zmena priraz na crt a navrat ; s chyb. hlasenim ;meni: af,hl,de ; ; conper: ld hl,0003h ;io byte ld a,(hl) and 3 ;platna konzola cp 1 ;crt? ret z ;navr. pri crt pop de ;likvidace ret cp 3 ;je uc1? jp z,list ;skok na tiskarnu res 1,(hl) ;volba con=crt set 0,(hl) badio: ld de,nap2 ;periferie neexist. bioerr: push de ;chybove hlaseni ld de,nap1 ;bios error call dachz ;tisk napisu pop de ;chybovy text dachz: ld a,(de) ;tisk cp "$" ret z push de ld c,a call outcrt pop de inc de jr dachz ; ; nap1: defb 0ah,0dh,"BIOS " defb "error: $" nap2: defb "not implemented " defb "peripheral",0ah defb 0dh,"$" nap3: defb "LPT not ready" defb 0ah,0dh,"$" nap4: defb "60K CPM " defb "verse 2.2-4 (KOI-8" defb 0c3h,"s2)" defb 0ah,0dh,"$" nap5: defb "bad " defb "loading BDOS & " defb "CCP",0ah,0dh,"$" nap6: defb "drive " retdsk: defb " not ready",0ah,0dh,"$" nap7: defb "bad r/w operation on drive " stdsk: defb " , track " sttrc: defb " , sector " retsc: defb " ",0ah,0dh,"$" nap8: defb "program " nap10: defb "UL1 is not initiated!",0ah,0dh,"$" nap9: defb "invalid format on select disk -" defb " not found tab. DPH!",0ah,0dh,"$" ; pret1: .dephase loader: .phase pret1 ; defs 1 ;rezerva wrtype: defs 1 ;typ zapisove operace ; 1=do adresare,2,0=data flags: defs 1 ;bit0=h-fyzicke cteni z disku ; =l-zapis na disk ; bit1=h-vstupni pozadavek cteni ; =l-vstupni poz. zapisu ; bit2- pomocna kopie bitu 1 ; bit3=h-hstbuf aktivni ; bit4=h-priznak odlozeneho zap. ; bit5=h-sektor=128byte ; ;nasledujici promenne musi byt ponechany v uvedene konfi- ;guraci, jinak bude porusena funkce programu. ; aktdsk: defs 1 ;pozadovany disk setrk: defs 1 ;pozadovana stopa pomsec: defs 1 ;pozadovany fyzicky sektor ; (pomocna promenna) setsc: defs 1 ;pozadovany sektor ; unadsk: defs 1 ;pracovni kopie aktdsk unatrk: defs 1 ;dtto setrk unacnt: defs 1 ;pocet vet do konce alok. bloku unasec: defs 1 ;pracovni kopie setsc ; seldsk: defs 1 ;vybrany fyzicky disk seltrk: defs 1 ;dtto stopa selsec: defs 1 ;dtto sektor ; dupdsk: defs 1 ;pracovni kopie seldsk duptrk: defs 1 ;dtto seltrk dupsec: defs 1 ;dtto selsec ; ;konec spolecne konfigurace ; setdm: defs 2 ;pozadovana adresa DMA seldma: defs 2 ;adr. dma fyzickeho disku spseek: defs 1 ;udaj pro seek vybr. disku pocsec: defs 1 ;pocet sekt. na stopu ; vybraneho fyzickeho disku selby: defs 1 ;vybrany fyzicky disk lselby: defs 1 ;minuly vybr. fyz. disk curtrk: defs 2 ;ukazovatko akt. stop bcurtr: defs 5 ;pole akt. stop disku pklav: defs 1 ;priznaky klavesnice pcbln: defs 1 ;kursor blink; bit 1 prepina ;page a roll mod, zakazuje nebo ;povoluje kurzor provza: defs 1 ;povolene roviny zapisu rovza: defs 1 ;roviny zapisu vram drucur: defs 1 ;druh kurzoru dfcc: defs 2 ;sour. kurs., l=sloupec dfbin: defs 2 ;adr. kur. ve vram lastk: defs 1 ;posl. pl. kl. ascii sttim: defs 2 ;stav citace 2 8253 defs 2 ;pro prom. prosp-2 prosp: defs 2 ;pro prim. adr. cur. fbeep: defs 1 ;potlac. beepu ftrep: defs 1 ;pro repeat klav. pokl: defs 1 ;poradi klav. +1 numzn: defs 1 ;pocet znaku na radek scofs: defs 2 ;udaj scr. offset reg. altm: defs 1 ;pro pr. adr. cur. setmod: defs 1 ;nast. mod zobrazeni border: defs 1 ;byte borderu typcls: defs 2 ;druh mazani obrazovky numrad: defs 1 ;poc. radku na obrazovce ; ;nasleduji zony al. vektoru a kont. souctu. ; alv0: defs 01fh ;alok. vekt. jedn.0 (ramc.) csv0: defs 16 ;kont. soucty jedn.0 alv1: defs 45 ;alok. vekt. jedn.1 (5 1/4' ; 18sek/stopu, ds,dd,80 stop csv1: defs 48 ;je to max.kapacita, se alv2: defs 45 ;kterou se pocita csv2: defs 48 alv3: defs 45 csv3: defs 48 alv4: defs 45 csv4: defs 48 ; dirbuf: defs 080h ;vyrov. pamet hstbuf: defs 512 ;vyrov. pam blok/deblok alg. prgul1: defs 512 ;misto pro uziv. program tisku ; .dephase ; org loader ; pret: out (0e1h),a ;nahore RAM ld hl,01200h ;odtud se presouva ld bc,pret1-bte ;delka bloku ld de,bte ;misto presunu ldir ;pres. do pr. ob. jp bte ;pocat. bios prets: ld hl,pret1-bte+prets-loader ;delka bios ld (01102h),hl ;uloz. delky ld hl,01200h ;odtud se pres. ld (01104h),hl push hl ld hl,pret ;start. adresa ld (01106h),hl ;ulozeni do hlav. out (0e1h),a ;nahore ram ld bc,pret1-bte ;delka bloku ld de,bte ;misto presunu pop hl ;odtud presun ldir ld hl,seltrk ;stopa ramcard ld (hl),bdstpa ;nast. stopy inc hl ld (hl),bdsec ;nast. sektoru ld b,delsys ;delka syst. v sec. ld hl,pccp ;poc.ccp ld (seldma),hl ;adr. dma ld iy,flags ;bude se zapisovat res 0,(iy+0) allcb: push bc call ramdsk ;zapis sekt. pop bc jr nz,wrch ;pri chybe ld de,080h ;dalsi adr. ld hl,(seldma) ;minul. adr. add hl,de ld (seldma),hl ;naplneni pr. ld hl,selsec ;prom. sekt. inc (hl) ;inc sektoru ld a,(dpb0) ;poc. sekt. na st. cp (hl) ;"za" stopu? jr nz,dltes ;pri nevycerpano ld (hl),0 ;prvni sekt. dec hl ;adr. setrk inc (hl) ;inkrement stopy dltes: djnz allcb ;dalsi sektor xor a ;uspesny navrat wrch: out (0e4h),a ;init rom ld de,prena ;napis wr. err. jp nz,0eb2eh ;navr. do mon. s err. ld c,setzer ;init ramcard jp 0e76ch ;zapis do ramc. prena: defb "WRITE ERROR ON " defb "RAMCARD!",0dh,0 ; end prets