;========================================= ; ; modul BIOS pro CPM ; (verze 2.0) ; ;========================================= ; ; .cref .z80 ; aseg org 100h jp pret ; org 01200h ; .phase 0ec00h ; ; bte: ccp equ bte-01600h ;start. adr. ccp bdos equ bte-0dfah ;poc. bdos sinic equ 080h ;iniciace stacku delsys equ 61d+16d+27d ;delka ccp+bdos+adre- ;sar+cmt.com v sekt. pccp equ 02000h ;pocatek ccp po load bdstpa equ 1 ;stopa ccp bdsec equ 11d ;sector ccp 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 listst ;stav tiskarny? jp setran ;transformuj sektor ; ; defb "Modul BIOS " defb "(C) Marty " identi: defb "1988 v2" 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 16 ;spt defb 3 ;bsh defb 7 ;blm defb 0 ;exm defw 243 ;dsm defw 63 ;drm defb 0c0h ;al0 defb 0 ;al1 defw 16 ;cks defw 5 ;off=10 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 a,019h ;konst. zp. klav. ld (konzp),a ld a,3 ;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 xor a ld (unacnt),a ;pocitadlo neal. zap. dec a ;a=ff 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 (pc55),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 ld a,0ffh ld (ftrep),a ;klav. nestlacena ei call beep ;zvuk. vyst. call bel 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 program 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: ld e,a ;odl. modu ld (setmod),a ;naplneni prom. cp 03h ;mod 3 ? ld c,081h ;rov. zap. ld d,80 ;poc. zn. na rad. ld a,4 ;mod 3 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 (rovza),a ;nast. prom. ld a,e ;obn. modu dec a ;vypoc. adr. 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 ld hl,0 ;nast. scrol. reg. ld (scofs),hl ;ulozeni ld hl,escrb ;kon. scrl. buf. ld bc,06cfh ;adr. registru otdr ;vyslani xor a ;neni cad konz. ld (altm),a ld (pcbln),a ;kur. blink ld c,01dh ;home call outcrt ld c,01fh call outcrt ;smazani cele obraz. ret ; ; paltb: defb 040h,0fh,011h,022h,030h ;z1-bh,mh,rh,c defb 040h,01h,01ah,02bh,03fh ;z2-mh,rh,zh,b defb 040h,0fh,010h,020h,030h ;z3-bh,ch,ch,c defb 040h,01h,01fh,02fh,03fh ;z4-mh,bh,bh,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 and 07fh ;maskovani r. bitu cp 07fh ;delay? ret z ;navrat pri delay cp 020h ;ridici znaky? jr c,rznak ;skok pri ano 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,(numrad) ;posledni radek? dec a cp h ;radky vycerpany? jr nc,setdf ;nast. ukaz. ld h,a ;nast. posl. rad. push hl call rolup ;scroll pop hl setdf: ld (dfcc),hl ;ulozeni ukazov. kur. stdf: call dfthl ;pris. adr. ve vram ld (dfbin),hl ;uloz. bin. adr. ret ;---------------------------------- rznak: sub 7 ;vypust. neobs. pozic ret c cp 7 jr c,vyhod sub 0ah ret c vyhod: 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 bel,cleft,return defw lf,cdwn,return defw cr defw cright,return defw cup,esc defw return,home,eol defw eos ; cup: ld a,h ;kursor nahoru and a ;posledni radek? ret z dec h ;posun k. jr setdf ;navrat ; cdwn: ld a,(numrad) ;posl. radek? dec a cp h ret z inc h ;dalsi pozice jr setdf ; cleft: ld a,l ;kursor doleva dec l and a ;prvni poz. v rad.? jr nz,setdf ;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 setdf ;nast. ukaz. ; home: ld h,0 ;poloha c. home cr: ld l,0 psetdf: jr 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,0e1h ;pozice 0,0 je add a,c ;zadavana jako ; ;020,020 ret nc ;spodni mez dec a ;o 020 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: call vymez ;vymezer. do konce radku ret ; eos: ld a,l ;mazani od poz. kur. and a ;poc.radku? jr z,pocrad ;skok pri pocatku push hl call vymez ;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,060h ;delka tonu call cbeep ;pipnuti ret ; ; ; vymezeruje cast radku ;--------------------------------- ; ;vstup: l=pozice v radku ;vystup: vymaz od (l) do konce radku ;meni: af,hl,b ; ; vymez: ld a,(numzn) ;pocet znaku na radek sub l ;pocet poz. na vymezer. ld hl,(dfbin) ;adr. ve vram ld b,a tiskm: push hl push bc ld a," " ;tisk mez. call outch pop bc pop hl inc hl ;dalsi pozice djnz tiskm ret ; ; ; vysle souvisly ton ;--------------------------------- ; ;vstup: d=delka tonu, hl=adr. tabulky ;vystup: pipnuti ;meni: af,hl,bc,d ; ; cbeep: ld b,4 ;pocet parametru call outby ;start tonu komzp: ld b,0 delb: ex (sp),hl ;casova smycka djnz delb dec d jr nz,delb 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,01h,0d3h,0f9h defb 0d4h,003h,0d4h btab2: defb 036h,0d7h,00h,0d3h btab3: defb 036h,0d7h,01h,0d3h,080h defb 0d4h,004h,0d4h ; ; ; 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,0ah ;delka push af call z,komzp ;kompenzace zpozdeni pop af 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 call adcn ;prevod na displ. code exx push hl 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) set 4,h ;zn. gen. je od 1000h exx ld b,8 ;8 byte ld de,(numzn) ;pocet znaku na rad. ld d,0 ;nulovani d in a,(0e0h) ;eprom 1k-2k daby: exx ld a,(hl) ;prevzeti znaku inc hl ;dalsi byte exx ld (hl),a ;byte do vram add hl,de ;dalsi pozice v vram djnz daby ;pro 8 byte in a,(0e1h) ;vse ram ei exx pop hl exx 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,043h ;druh kursoru ld hl,(dfbin) ; sour. kursoru bin di exx push hl 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 or 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,0 ;pro nulovani 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 ; ; ;tab. displ. code na ascii (bez r. zn.) ;--------------------------------------- ; ascit: defb 00h,061h,062h defb 063h,064h,065h,066h,067h defb 068h,069h,06bh,06ah,02fh defb 02ah,02eh,02dh,020h,021h defb 022h,023h,024h,025h,026h defb 027h,028h,029h,04fh,02ch defb 051h,02bh,057h,049h,055h defb 001h,002h,003h,004h,005h defb 006h,007h,008h,009h,00ah defb 00bh,00ch,00dh,00eh,00fh defb 010h,011h,012h,013h,014h defb 015h,016h,017h,018h,019h defb 01ah,052h,059h,054h,050h defb 045h,0a4h,081h,082h,083h defb 084h,085h,086h,087h,088h defb 089h,08ah,08bh,08ch,08dh defb 08eh,08fh,090h,091h,092h defb 093h,094h,095h,096h,097h defb 098h,099h,09ah,0bch,080h defb 040h,0a5h ; ; ;prevod displ. kodu do ascii kodu ;-------------------------------------- ; ;vstup: a=displ. kod ;vystup: a=ascii kod. neprevadi rid. znaky ;meni: af,hl,de,bc ; ; dacn: ld hl,ascit ;pocatek tabulky ld d,h ld e,l ld bc,05fh ;delka tabulky cpir ;hleda znak jr z,catas ;skok pri nal. znaku xor a ;znak nenalezen ret catas: or a dec hl ;-ascii znak sbc hl,de ld a,l ;ascii do a add a,020h ret ;navrat ; ; ;prevadi ascii do display kodu ;-------------------------------------- ; ;vstup: a=ascii kod (bez ridicich znaku) ;vystup: a=display kod ;meni: af,bc ; ; adcn: push hl ld hl,ascit ;pocatek tabulky sub 020h ;prev. bez r. zn. ld c,a ld b,0 add hl,bc ;adresa v tabulce ld a,(hl) ;prevzeti znaku pop hl ret ; ; ;cte klav. konz. s cekanim na stisk klav. ;---------------------------------------- ; ;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: call conper ;test prirazeni xor a ;nulov. pr. pro rep. ld (ftrep),a nekl: call cblnk ;blikani kursoru call ctekl ;cteni klavesnice or a jr nz,jekl ;skok pri stlac. kl. ld (lastk),a ;klavesa nestlacena jr nekl ;cekani na klavesu jekl: ld bc,01000h ;zpozdeni delay: dec c jr nz,delay djnz delay ld c,a ;klav. do c 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,0fah ;pro zpozdeni-nesh. jr nesh ;skok pri neshode klok: ld a,(konzp) ;konst. zpozdeni ld b,a ;pro djnz push bc ld a,1 ;nebude se dekod. kl. ld (ftrep),a ld a,(pokl) ;poradi klavesy ld c,a smyc1: xor a ;zpozdeni smyc2: dec a jr nz,smyc2 call ctekl ;cteni klav. ld a,(pokl) ;porov. por. klav. cp c ;souhlas sminulym? jr nz,nekl1 ;skok pr nesouhl. djnz smyc1 pop bc xor a ;povol. dekod. klav. ld (ftrep),a ld a,c ;znak do a ld hl,takl ;bez repeat? ld b,6 ;je 6 r. znaku look: cp (hl) jr z,exret ;r. znak nal., skok inc hl ;dalsi pozice djnz look ld a,019h ;konstanta repeat nesh: ld (konzp),a ;ulozeni ld a,c ;v a je cteny znak ld (lastk),a ;ulozeni or a call nz,beep ;kratke pipnuti call necur ;zhasnuti kurzoru cp 080h ;inv. fce shift? ret nz ;neni, navrat push af ld a,(pklav) ;priznaky klav. xor 1 ;inv. fce shift ld (pklav),a ;ulozeni pop af jr conin exret: ld a,019h ;konst. repeat ld (konzp),a jp conin ; takl: defb 03h,080h,01bh,01dh ;zn. bez rep. defb 01eh,01fh ; ; ; ;pruchozi cteni klavesnice mz-800 ;-------------------------------------- ; ;vstup: cteni klavesnice bez debou ;vystup: znak ascii a sluz. kody v a. ; pri nastlaceno a=0. ; u f1-f5, viz cteni klav. s cekanim ;meni: af,de,hl ; ; ctekl: di 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 ei ret nebr: bit 7,a ld a,01bh ;prim. riz. kursoru jr z,retct inc b ;test na klavesy f1-f5 call snima ;sejmuti sloupce jp nz,zpfk ;skok pri stlaceni klav. ld b,0f0h ;sejmuti klaves 0-63 call snima ld (pokl),a ;uloz. por. kl.+1 pop de ;v d je sl. 8 jr z,navrt ;klavesa nestlacena ld a,(ftrep) ;povoleno dekodovani? rrca jr c,navrt ;nepovoleno-li, nav. ld h,0 ;rel. adr. v tabulce bit 6,d ;klavesa ctrl ld bc,ztab ;baz. adr. nor.+ctrl zn. jr z,ctrl ;skok pri ctrl ld a,(pklav) ;prizn. byte kl. cp 01h ;ma byt inv. shift? ld a,d jr nz,notran ld a,l ;por. klav. v a cp 8 ;klav. y? jr z,transf ;skok na inv. shift cp 9 ;klav. z? jr z,transf ;skok pri z cp 40 ;test na dal. alfa kl. jr nc,notran cp 16 jr c,notran transf: ld a,d ;inv. shift (u pism.) xor 1 ld d,a notran: ld bc,ztab ;neshift. znaky bit 0,d ;je shift? jr nz,nequ ;skok, neni shift ld bc,shtab ;tabulka shift. znaku nequ: call prevd ;prevod na ascii navrt: ei 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 push bc call recal ;do polohy home pop bc bit 0,(iy+0) ;neni zapis? jr z,noftrk ;pri zapisu bit 5,(iy+0) ;sektor 128byte? ;=8" muze byt bez ;tabulky dpb jr z,noftrk ;pokud je push hl ;cteni 1. sektoru push bc ;0. stopy push de ld a,1 ;sektor out (secreg),a ld e,5 ;bude 5 pokusu catchd: call physco ;cteni sektoru jr z,noes0 ;neni-li chyba dec e ;dalsi pokus jr nz,catchd xor a ;pro chybovy napis ld (seltrk),a inc a ld (selsec),a pop de pop bc pop hl 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 jr nfpok ;na pokracovani fpok: ld bc,15d ;delka ldir ;presun tabulky nfpok: pop de pop bc pop hl jr noftrk ;pokracovani v oper. yftrk: out (trkreg),a ;stara stopa noftrk: 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=aktualni jednotka ;vystup: hl obsahuje adresu DPB akt. 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,(dpb0) ;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, 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 res 1,(hl) ;volba con=crt set 0,(hl) pop hl ;likvidace ret 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" 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 ; 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 rovza: defs 1 ;roviny zapisu vram dfcc: defs 2 ;sour. kurs., l=sloupec dfbin: defs 2 ;adr. kur. ve vram lastk: defs 1 ;posl. pl. kl. ascii konzp: defs 1 ;konstanta zp. kl. 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 numrad: defs 1 ;poc. radku; program ; ;wm upravuje numzn ; ;z 25 na 24, wboot ; ;vraci zpet na 25. ; ;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 nebo pokracovani ;hstbuf pri fyz. sekt. 1k ; .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-pret ;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