; ;=================================================== ; ; l o a d e r p r o C P M ; ( R L 8 0 0 ) ; ;=================================================== ; ; aseg .z80 .list org 0100h ; ; adrfil equ 094h ;zavad. adresa exadr equ 096h ;startovaci adresa longpr equ 092h ;delka programu setsp equ 0de00h ;pro init sp bdos equ 05h ;call bdos fcb equ 05ch ;poloha fcb pocbuf equ 040h ;buffer klavesnice delbuf equ 01bh ;delka bufferu-1 delbk equ 0fh ;delka buf. klav. -2 stbn equ 051h ;pocatek buf. nazvu stbp equ 059h ;pocatek buf. pripony poc equ 040h ;poc. promennych pa55 equ 0d0h ;pa io 8255 pb55 equ 0d1h pc55 equ 0d2h rr55 equ 0d3h ;rid. registr 8255 ; ; movstr: ld de,strpr ;misto presunu ld hl,konmov ;odtud se pres. ld bc,flags-strpr ;delka-1 ldir ;presun jp strpr ;skok na start konmov: ; .phase 0d600h ; strpr: ld sp,setsp ;nastaveni sp xor a ld (portc),a ;nulovani ld iy,flags ;byte priznaku ld de,nap1 ;tisk hvezdicky strt1: call napis errpar: call clrbuf ;nezerovani bufferu ld de,pocbuf ;pocatek buf. ld c,0ah ;cteni retezce z konz. call bdos ld de,pocbuf+2 ;prvni znak ld a,(de) ;typ prikazu res 5,a ;prevod pismen cp "S" ;save? jp z,save cp "V" ;verify? jp z,verify cp "E" ;navrat do cpm? jp z,00 cp " " jr z,strpr ;ignoruje mezeru cp "X" ;prepinac sl/fast jp z,slofas cp "L" ;load? ld de,nap2 ;neznamy parametr call nz,napis jr nz,strpr ;pri chybnem parametru ;----------------------------------------------------------- ; ld de,pocbuf+2 ;nasleduje load call scanb ;sajme nazev prog. lohlav: res 1,(iy+0) ;prizn. exist. pr. call nexts ;sejme hlavicku ld de,nap5 ;loading call napis ld de,081h ;pocatek jmena call napis ;nazev souboru bit 0,(iy+0) ;zadan nazev? ld hl,strpr ;start programu jr nz,yesnam ;pri zadanem jm. ld hl,lohlav yesnam: ld (loaret+1),hl ;modifikace prog. call setfcb ;nastaveni fcb ld a,(080h) ;typ souboru and a ;soubor pod CPM? jr z,movfil ;je-li ld de,nap7 ;soubor neni pod CPM call napis ;nahrat na disk? waitk: ld c,01 ;vstup znaku z konz. call bdos cp "N" ;pri ne navrat jp z,loaret cp "Y" ;ano? jr nz,waitk ;ceka na ano nebo ne movfil: ld c,0fh ;neexistuje jiz? ld de,fcb call bdos ;otevreni souboru cp 0ffh jr z,okmov ;skok,neexistuje-li set 1,(iy+0) ;soubor existuje ld de,nap19 ;nap. s. existuje call napis laywt: ld c,01 ;vstup znaku z konz. call bdos cp "N" ;pri ne navrat jr z,loaret cp "Y" jr nz,laywt ;ceka okmov: ld hl,0100h ;misto pro telo pr. ld a,53h ;priznak tela ld bc,(longpr) ;delka programu call lobl ;nahrani tela jp c,rerrt ;pri chybe bit 1,(iy+0) ;soubor existuje? jr nz,layst ;pri existenci ld c,016h ;zalozeni souboru ld de,fcb ;adresa fcb call bdos cp 0ffh ;zalozeni soub. ok? jr z,adrful ;pri nezalozeno layst: ld de,0ffh ;adresa DMA-1 add ix,de ;posledni adresa pr. inc de ;adresa FCB nextdm: push de ld c,1ah ;nastaveni adr. DMA call bdos ld de,fcb ;zapis sektoru ld c,15h call bdos and a ;uspesny zapis? pop de jr nz,wrrcer ;chyba zapisu ld hl,80h ;delka DMA add hl,de ;adr. dalsiho DMA ex de,hl ;adr. do de push ix ;konec programu? pop hl sbc hl,de jr nc,nextdm ;dalsi blok ld c,10h ;uzavreni souboru ld de,fcb call bdos cp 0ffh ;uzavreni ok? ld de,nap14 ;pole neuzavreno jr z,eret ld de,nap8 ;pole ok call napis loaret: jp strpr ;meni se progr. adrful: ld de,nap9 ;plny adresar jr eret wrrcer: ld de,nap10 ;chyba zap. na disk eret: call napis jp strpr ;skok na pocatek ;------------------------------------------------------ ; save: ld de,pocbuf+2 call scanb ;sejmuti nazvu nznova: bit 0,(iy+0) ;zadan nazev? push af call z,errnam ;znovu nazev pop af jr z,nznova ;pri chyb. zadani ld de,stbn ;pro nast. FCB call stfcb ;nast.fcb call getfil ;vyt. prog. z disku ld hl,080h ;adresa hlav. ld b,l ;delka call dbbuf ;vymez. zonu hlav. ld hl,0100h ;poc. prog. ld (adrfil),hl ;adresa push hl sbc hl,hl ;hl=0 ld (exadr),hl ;start adresa pop hl ex de,hl sbc hl,de ;delka souboru ld (longpr),hl ;delka programu ld hl,080h ;pocatek hlavicky ld (hl),00 ;typ souboru inc hl ex de,hl ld hl,stbn ;nazev ld bc,0bh ;delka nazvu ldir ;presun do hlavicky ex de,hl ld (hl),0dh ;konec jmena ld a,0cch ;priznak hlav. ld hl,80h ;odtud se vyhrava ld b,h ;delka ld c,l call outtp ;vyhrani hlav. ld a,53h ;priznak tela ld hl,0100h ;odtud se vyhrava ld bc,(longpr) ;delka prog. call outtp ;vyhr. tela ld de,nap8 ;ok navrat jr eret ;----------------------------------------------------- ; verify: res 0,(iy+0) ;verif. bez jmena call nexts ;sejme hlavicku call setfcb ;nastavi FCB dle hlav. call getfil ;vytazeni souboru z disku ld de,nap15 ;verifying call napis ld de,81h ;nazev souboru call napis ld de,0d253h ;priznaky ld a,53h ;priznak tela ld bc,(longpr) ;delka programu ld hl,(adrfil) ;zavadeci adresa ld a,b ;nulova delka? or c jr z,verify call cons ;kontr.suma call sttap ;start tape di call vstse ;vstupni piskani call verbl ;verifikace bloku ei ld de,nap8 ;ok! call napis jr verify ;skok na dalsi soub. ;--------------------------------------------------- ; slofas: ld a,(prfi) ;meni rezim nor/fast cp "*" ;normal? ld de,nap20 ;fast jr z,nozm ;pri normal ld de,nap21 ;normal nozm: call napis ld hl,(placx) ;zmena prog. ld a,h ld (placx),a ld a,l ld (placx+1),a ld hl,tab ;tabulka konst. ld b,4 ;pocet zmen zmprm: ld e,(hl) ;adresa inc hl ld d,(hl) inc hl placx: ld a,(hl) ;prevz. byte inc hl inc hl ;dalsi cykl ld (de),a ;zmena djnz zmprm ;dalsi zmena jp strpr ;start programu ; ; ; verifikuje blok ;--------------------------------------------------- ; ;vstup: hl=1.adresa, bc=delka, de=priznaky d253h, ; a=cch pro hlav., 53h pro telo ;vystup: verifikace bloku s chybovymi vystupy ; pri break a chybnem bytu ; nahraje hlavicku do oper. pameti ;meni: priznaky ; ; verbl: push bc push hl verb: call uphr ;ceka na vzest. hranu jr c,veret ;pri break call pr1 ;pauza in a,(pc55) ;cteni bitu and 020h ;plati bit z mg. jr z,verb ;nespravna hrana pop hl pop bc push bc push hl vrloop: call loby ;nacte byte do a jr c,veret ;pri break cp (hl) ;souhlas byte? jr nz,vrerr ;pri chybe inc hl ;dalsi byte dec bc ld a,b ;zona vycerpana? or c jr nz,vrloop ;dalsi byte ld hl,(vksum) ;kontr. suma call loby ;1.byte k. sumy jr c,veret ;pri break cp h ;souhlas? jr nz,vrerr ;pri chybe call loby ;2.byte jr c,veret ;pri break cp l ;souhlas? jr nz,vrerr ;pri chybe pop hl pop bc ret ;uspesny navrat vrerr: ei call stopt ;stop tape a ld de,nap16 ;verifikovaci chyba evret: jp eret ;na pocatek veret: ei call stopt ;stop tape ld de,nap13 ;break! call napis brut: in a,(pb55) ;jeste break? cpl and 081h jp z,strpr ;poc. prog. call pau1 ;pauza jr brut ;ceka na neobs. ; ; ; nahraje hlavicku na 80h ;----------------------------------------------------- ; ;vstup: sejmuty nazev rutinou scanb ;vystup: hlavicka dle zadani v op od 80h, delka tela v ix. ;meni: af,bc,de,hl,ix ; ; nexts: ld hl,80h ;misto ukladani hlavicky ld b,h ;delka hlavicky ld c,l ld a,0cch ;priznak hlavicky call lobl ;nahrani hlavicky rerrt: ld de,nap0 ;error jr c,evret ;pri chybe ld de,nap4 ;found call napis ld hl,81h ;pocatek jmena push hl fdnam: ld a,(hl) ;maska 7. bitu and 7fh ld (hl),a ;zpetne ulozeni cp 0dh ;konec nazvu? inc hl ;posun ukazovatele jr nz,fdnam ;neni-li konec ld (hl),"$" ;konec textu v CPM pop de ;pocatef nazvu-1 sbc hl,de ;delka jmena ld b,l ;pro test shody push bc call napis ;tisk nazvu pop bc bit 0,(iy+0) ;zadan nazev? jr z,forw ;neni-li zadan dec b ;delka jmena ld hl,stbn ;buffer nazvu nextzn: ld a,(de) ;porovnani jmen cp (hl) jr nz,nexts ;pri neshode inc hl ;posun ukazatelu inc de djnz nextzn ;cely nazev forw: ld hl,strpr-0101h ;volna pamet ld bc,(longpr) ;delka programu push bc pop ix and a sbc hl,bc ;neni program dlouhy? ld de,nap6 ;nestaci pamet jr c,evret ;navrat ret ; ; ; vytahne soubor z diskety ;------------------------------------------------------ ; ;vstup: nastaveni FCB ;vystup: program dle FCB od #100 nebo chyb. hlas. ;meni: af,de,hl,bc ; ; getfil: ld c,0fh ;otevreni souboru ld de,fcb call bdos cp 0ffh ;otevreni uspesne? ld de,nap11 ;pole neexistuje jp z,evret ;chybovy navrat ld c,23h ;zjisteni delky soub. ld de,fcb call bdos ld de,0100h ;nastaveni pro DMA push de nxtse: ld c,1ah ;nastaveni DMA call bdos ld c,14h ;cteni vety ld de,fcb call bdos and a ;cteni uspesne? push af ld b,03h ;soubor vycerpan? ld hl,fcb+21h scf nr: ld a,(hl) sbc a,00 ld (hl),a ;dekrement pocitadla inc hl djnz nr pop af pop de ld hl,80h ;dalsi DMA add hl,de ex de,hl ;DMA v de push de and a ;cteni uspesne? jr z,nxtse ;dalsi sektor ex (sp),hl ;posl. plat. adr.+1 ld b,03 ;byl vytazen cely s.? ld hl,fcb+21h ld de,nap12 ;chyba cteni z ramc. zero: ld a,(hl) ;kontr. proti delce cp 0ffh inc hl jp nz,evret ;pri chybe djnz zero pop de dec de ret ; ; ; sejme nazev souboru ;------------------------------------------------------- ; ;vstup: na scanb-de=poc. buf., odkud se ma zpracovavat-1 ;vystup: nazev ve formatu CPM od stbn. bit 0,iy=h-nazev ; zadan, =l-nezadan nazev. opravuje chybne zadani ;meni: af,de,hl,bc ; errnam: ld de,nap3 ;chybne zadane jmeno call napis call clrbuf ;mazani bufferu scana: ld de,pocbuf ;pocatek bufferu ld c,0ah ;sajme nazev call bdos ld de,pocbuf+1 scanb: res 0,(iy+0) ;nezadan nazev ld hl,stbn ;buffer nazvu ld b,delbk-1 ;delka buf. kl.-1 scan1: inc de ;dalsi znak ld a,(de) ;znak do a dec b ;dekr. pocitadla ret z ;nazev nezadan cp " " ;mezera? jr z,scan1 ;ignoruje se ld a,delbk-4 ;max. 1 mezera cp b jr nc,errnam ;zadani znovu ld b,08h ;max delka jmena scan2: ld a,(de) ;prevzeti znaku inc de cp "." ;oddelovac? jr z,cons1 ;na priponu ld (hl),a ;ulozeni inc hl ;posun ukazatele djnz scan2 ;dalsi znak cons1: ld hl,stbp ;buffer pripony ex de,hl ld bc,03 ;delka pripony ldir ;presun set 0,(iy+0) ;nazev platny ret ; ; ; nastavi FCB ;--------------------------------------------------- ; ;vstup: jmeno od adresy#81h (z hlavicky) ;vystup: nastavi FCB pro praci se souborem ;meni: af,de,hl,bc ; ; setfcb: ld de,81h ;pocatek jmena stfcb: ld hl,fcb ;fcb xor a ;ramcard vzdy A ld (hl),a inc hl ex de,hl ld bc,0bh ;delka jmena ldir ;presun jmena a prip. ld b,03h ;nulovani EX,S1,S2 zerex: ld (de),a inc de djnz zerex ld (fcb+20h),a ;nulovani CR ret ; ; ; vymezeruje buffer klavesnice ;---------------------------------------------------- ; ;vstup: 0 ;vystup: mazani bufferu klavesnice a nast. jeho del. ;meni: b,hl ; ; clrbuf: ld hl,pocbuf ld b,delbuf ld (hl),delbk ;ulozeni del. buff. dabbuf: inc hl dbbuf: ld (hl)," " ;mezera djnz dabbuf ;cely buffer ret ; ; ; zobrazi napis ;----------------------------------------------------- ; ;vstup: de=pocatek napisu,konec=$ ;vystup: napis na pozici kurzoru ;meni: hl,bc ; ; napis: push af push de dalt: ld a,(de) ;prevz. znaku cp "$" ;konec? jr z,naptr ;navrat ld c,06h ;vystup znaku push de ld e,a call bdos pop de inc de jr dalt ;dalsi znak naptr: pop de pop af ret ; ; ;vyhraje blok od (hl) delky (bc) ;s obsluhou magnetofonu (format sharp) ;---------------------------------------- ; ;vstup: a=cch pri hlavicce, 53h pri bloku ;vystup: vyhraje blok ;meni: af,de ; ; outtp: ld e,a ;typ bloku do a ld d,0d7h ;priznak zaznamu ld a,b ;nulova delka blk? or c ret z ;pri ni navrat call cons ;kontr. suma call sttap ;start tape call uvps ;uvodni cast save call sabl ;vyslani bloku call stopt ;stop tape ret ; ; ; uvodni cast save ;--------------------------------------- ; ;vstup: e=cch pro hlavicku ;vystup: vstupni piskani+posloupn. h a l ;meni: af ; ; uvps: push de push bc ld a,e ;typ bloku doa ld bc,1000h ;delka hlavick. pisk. ld de,2828h ;pocet ser. bi. l,h cp 0cch ;hlavicka? jr z,jehl ;skok pri hlavicce ld bc,0800h ;pro telo ld de,1414h jehl: call outl ;vyslani bitu nul dec bc ld a,b ;vstupni piskani or c jr nz,jehl ;repete hnext: call outh ;vyslani bitu jedn. dec d ;repete jr nz,hnext lnext: call outl ;vyslani bitu nul dec e ;repete jr nz,lnext call outh ;1 bit h pop bc pop de ret ; ; ;vysle blok od (hl) delky (bc) ;---------------------------------------- ; ;vstup: hl=1. adr. bloku, bc=delka ;vystup: vysle blok ;meni: af ; ; sabl: push de push bc push hl ex (sp),hl ;casovani ex (sp),hl daby: ld a,(hl) ;byte k vyslani call saby ;vyslani byte in a,(pb55) ;break? and 81h jp z,veret ;navr. pri break inc hl ;dalsi byte dec bc ;byte vycerpany? ld a,b or c jr nz,daby ;dalsi byte ld hl,(ksum) ;kont. suma ld a,h ;1. byte sumy call saby ;vyslani byte ld a,l ;2.byte call saby call outh ;vysle 1 bit jednic. xor a ;c=0 jp nur1 ;navrat ; ; ;zapne magnetofon a vysle prisl. napisy ;----------------------------------------- ; ;vstup: d=d7h pri zaznamu, <>d7h pri sn. ;vystup: zapn. tape+napisy record.play, ; nebo play ;meni: af ; ; sttap: push bc push hl ld a,0f8h ;pro test break out (pa55),a ld b,0ah ;bude 10 pokusu loop2: in a,(pc55) ;test chodu tape and 10h jr z,nogo ;skok stoji-li navt: ld b,0ffh ;pro pauzu loop1: call pau1 ;pauza djnz loop1 pop hl pop bc ret nogo: ld a,06h ;rozbehnuti tape out (rr55),a ;res 3,pc inc a out (rr55),a ;set 3,pc djnz loop2 ;opakuje se 10x ld a,d ;je load? push de ld de,nap17 ;play cp 0d7h ;pri load jr nz,play ld de,nap18 ;record play play: call napis ;tisk pop de waitp: in a,(pc55) ;bezi tape? and 10h jr nz,navt ;skok pri behu in a,(pb55) ;break? and 81h jr nz,waitp ;neni-li jp veret ;pri break ; ; ; vypnuti magnetofonu ;---------------------------------------- ; ;vstup: 0 ;vystup: zastavi magnetofon ;meni: 0 ; ; stopt: push af push bc push de ld b,0ah ;10 pokusu vyda: in a,(pc55) ;bezi tape? and 10h jr z,snv ;vypnut tape ld a,6 ;res 3,pc out (rr55),a inc a ;set 3,pc out (rr55),a djnz vyda ;dalsi pokus snv: pop de pop bc pop af ret ; ; ; vysle 1 byte na magnetofon ;--------------------------------------- ; ;vstup: a=byte k vyslani ;vystup: vyslani byte ;meni: af ; ; saby: push bc ld b,8 ;pocet bitu call outh ;vysl. 1bite jedn. dabit: rlca ;bit k vys. v cary call c,outh ;pri c jednicka call nc,outl ;pri nc nula dec b jp nz,dabit ;dalsi bit in a,(pc55) ;bezi tape? bit 4,a jp z,veret ;pri stop tape pop bc ret ; ; ;vysle jednickovy bit na magnetofon ;-------------------------------------- ; ;vstup: 0 ;vystup: vyslani bitu ;meni: 0 ; ; outh: push af ld a,3 ;bit 1 pc na h out (rr55),a ld a,1 ;zvuk. vystup out (rr55),a call pauh ;pauza ld a,2 ;bit 1 pc na l out (rr55),a ld a,0 ;zvuk. vystup out (rr55),a call pauh ;pauza pop af ret ; ; ;vysle nulovy bit na magnetofon ;--------------------------------------- ; ;vstup: 0 ;vystup: vyslani bitu ;meni: 0 ; ; outl: push af ld a,3 ;bit 1 pc na h out (rr55),a ld a,1 ;zvuk. vystup out (rr55),a call paul dec hl ld a,2 ;bit 1 pc na l out (rr55),a ld a,0 ;zvuk. vystup out (rr55),a call paul inc hl pop af ret ; ; ; pauzy ;----------------------------------------- ; ;vstup: 0 ;vystup: 0 ;meni: af ; ; pau1: push bc ld b,14h kol: call prfi1 call pr2 djnz kol pop bc ret pr1: ld a,(portc) ;stav portu rra ccf ;kompl. bitu 0 rla out (rr55),a ;zvuk. vystup ld (portc),a ;ulozeni zmeny prfi1: ld a,47h jr way way: jr kol1 kol1: dec a jr nz,kol1 ret pr2: nop ret paul: ld a,49 ;pauza pro bit l jr kol1 pauh: ld a,68h ;pauza pro bit h jr kol1 ; ; ;spocte kontrolni sumu bloku ;---------------------------------------- ; ;vstup: hl=1. adresa bloku ; bc=delka bloku ;vystup: kontrolni suma v (ksum) ;meni: af ; ; cons: push de push bc push hl ld de,0 ;vstup. nast. sumy dbyte: ld a,b or c jr z,navra ;suma zjistena,nav. ld a,(hl) ;prevzeti byte push bc ld b,8 ;8 bitu v byte dalb: rlca jr nc,nebit ;skok pri nul. bitu inc de ;bit je na h nebit: djnz dalb ;dalsi bit pop bc inc hl ;dalsi byte dec bc jr dbyte navra: ld (ksum),de ;ulozeni sumy ld (vksum),de nur1: pop hl pop bc pop de ret ; ; ;nahraje blok z magnetofonu ;------------------------------------- ; ;vstup: hl=1. adresa mista ukladani ; bc=delka bloku ; a=cch pro hlav, a=53h pro telo ;vystup: uspesne natazeno-c=l,a=0 ; chybna kontr. suma-c=h ;meni: af,de ; ; lobl: ld e,a ;typ bloku do e ld d,0d2h ;priznak cteni ld a,b or c ;navrat pri nul. del. ret z call sttap ;start tape+napisy call vstse ;zachyceni vst. ser. call lblok ;cteni bloku call stopt ;zastaveni tape jp c,rerrt ;pri chybne k.s. ret ; ; ;vyhodnoti vstupni serii bloku ;---------------------------------------- ; ;vstup: a=cch pri hlav, a=53h pri tele ;vystup:navrat pred vlastnim blokem ;meni: af ; ; vstse: call inpt ;navrat po #64 pulz. push de push bc push hl ld hl,2828h ;pro hlavicku ld a,e cp 0cch ;je hlavicka? jr z,jhlav ;skok, je-li ld hl,1414h ;pro telo jhlav: ld (ksum),hl ;odlozeni again: ld hl,(ksum) agai1: call uphr ;ceka na prech.l-h jr c,lvert ;pri break call pr1 ;pauza in a,(pc55) ;jaka je uroven? and 20h jr z,again ;skok pri l dec h jr nz,agai1 ;pocet nevycerpan? nesl: call uphr ;ceka na up hranu jr c,lvert ;pri break call pr1 ;cas smycka in a,(pc55) ;jaky bit? and 20h jr nz,again ;neni-li l, vse znova dec l jr nz,nesl ;neni-li sprav. poc. call uphr ;up hrana jr c,lvert ;pri break jr nur1 ;navrat ; ; ;zachyceni vstupniho piskani pri load ;----------------------------------------- ; ;vstup: 0 ;vystup: zachyti 64h pulzu piskani ;meni: af ; ; inpt: push de push bc push hl inpt1: ld h,64h ;pocet pruchodu inpt2: call uphr ;up hrana lvert: jp c,veret ;pri break call pr1 ;pauza in a,(pc55) ;cte bit and 20h jr nz,inpt1 ;skok pri h dec h ;repete 64x jr nz,inpt2 ;jeste neni #64 jp nur1 ;navrat ; ; ;zachyti vzestupnou hranu pri load ;--------------------------------------- ; ;vstup: 0 ;vystup: navrat pri prechodu l-h, nebo ; pri break (c=h) ;meni: af ; ; uphr: ld a,0f8h ;pro break out (pa55),a nop ;uklidneni nenil: in a,(pb55) ;je break? and 81h jr nz,nenib ;skok, neni-li scf ;priznak break ret nenib: in a,(pc55) ;cte tape and 20h jr nz,nenil ;skok pri h nenih: in a,(pb55) ;break? and 81h jr nz,nenb ;skok, neni-li scf ;priznak break ret nenb: in a,(pc55) ;cte tape and 20h jr z,nenih ;skok pri l ret ;navrat pri h ; ; ;nacte blok z magnetofonu ;---------------------------------------- ; ;vstup: hl=1. ukladaci adresa ; bc=delka bloku ;vystup: c=0-uspesne natazeno ; c=h-chybna kontrolni suma ; test break ;meni: af ; ; lblok: push de push bc push hl wafb: call uphr ;up hrana? jr c,fbrt ;pri break call pr1 ;pauza in a,(pc55) ;vystup tape? and 20h jr z,wafb ;skok pri nespr. ur. ld hl,0 ;nulov. k. sumy ld (ksum),hl pop hl push hl allby: call loby ;nacteni byte do a fbrt: jp c,veret ;pri break ld (hl),a ;ulozeni byte inc hl ;dalci pozice dec bc ld a,b or c ;blok natazen? jr nz,allby ;pri ne repete ld hl,(ksum) ;kontr. suma pri nat. call loby ;1. byte k.sumy jr c,fbrt ;pri break cp h ;souhlasi? jr nz,sumer ;pri chybe call loby ;2. byte k. sumy jr c,fbrt ;pri break cp l ;souhlasi? jr nz,sumer ;pri chybe xor a ;uspesne natazeno jr nur11 ;navrat sumer: scf ;chybovy navrat jr nur11 ; ; ;nacte byte z magnetofonu do a ;--------------------------------------- ; ;vstup: 0 ;vystup: byte v a, pri break c=h ;meni: af ; ; loby: push de push bc push hl ld hl,0800h ;8 bitu,v l vysl. dalbi: call uphr ;up hrana? jp c,nur1 ;navrat pri break call pr1 ;pauza in a,(pc55) ;bit tape? and 20h jp z,zadh ;pri bitu l push hl ld hl,(ksum) ;inkrement k. sumy inc hl ld (ksum),hl pop hl scf ;bit je h zadh: ld a,l ;vytvareny byte rla ld l,a dec h ;dekrement poctu b. jp nz,dalbi ;balsi bit call uphr ;up hrana? ld a,l ;byte do a nur11: pop hl pop bc pop de ret ; ; ; napisy ;----------------------------------------- ; ; nap0: db 0dh,0ah,"Check s" db "um error!$" nap1: db 0dh,0ah prfi: db "*$" nap2: db 0dh,0ah,"Unknown " db "parameter!$" nap3: db 0dh,0ah,"Invalid " db "name," db " a new one!",0dh db 0ah,"$" nap4: db 0dh,0ah,"Found " db "$" nap5: db 0dh,0ah,"Loading " db "$" nap6: db 0dh,0ah,"No file" db " space!$" nap7: db 0dh,0ah,"Not CP/M " db "file! Continue " db "at loading?",0dh db 0ah,"$" nap8: db 0dh,0ah,"OK!$" nap9: db 0dh,0ah,"Directory" db " full!$" nap10: db 0dh,0ah,"Write er" db "ror on disk!$" nap11: db 0dh,0ah,"No such f" db "ile on disk!$" nap12: db 0dh,0ah,"Read erro" db "r on disk!$" nap13: db 0dh,0ah,"Break!$" nap14: db 0dh,0ah,"File not " db "closed!$" nap15: db 0dh,0ah,"Verifying" db " $" nap16: db 0dh,0ah,"Verifying" db " error!$" nap17: db 0dh,0ah,"Play!",0dh db 0ah,"$" nap18: db 0dh,0ah,"Record " db "play!",0dh,0ah,"$" nap19: db 0dh,0ah,"File exi" db "st! Continue at " db "loading?",0dh,0ah db "$" nap20: db 0dh,0ah,"CMT mode" db ": fast$" nap21: db 0dh,0ah,"CMT mode" db ": normal$" ; ; tab: dw prfi ;tab. slow/fast db "*#" dw prfi1+1 db 47h,21h dw pauh+1 db 68h,33h dw paul+1 db 49,25 ; ksum: dw 0 ;2byte kont. sumy vksum: dw 0 ;pom. kont. suma portc: db 0 ;pro akust. load flags: db 0 ;priznaky ; db "(c) Marty" db " 1988 for CPM" db " from 0d600" ; ; .dephase ; ; end