; ; K O P I E S Y S T E M U C P / M ; ;**************************************************** ; ; ;Program zavede od adresy 1200h modul BIOS,BDOS a CCP ;z mech., urcene DR (zde B) a pote pretahne system ;na novou disketu opet v mech. urc. DR. Na zdrojovem ;disku je BIOS a BDOS ulozen na 0. stope od 4. do 18. ;sektoru, CCP je umisten jako systemovy soubor na ;disku. ; ; .z80 aseg ; org 100h ; ; stack equ 1000h pbios equ 1200h ;pocatek BIOS po nat. pccp equ 3500h ;poc. CCP po natazeni bdos equ 5 ;sluzby BDOS synch1 equ 01348h ;identif. verze bcurtr equ 0fa0ah ;pole akt. stop; pro ;iniciaci nutno naplnit ;0ffh bigsys equ 1 ;1.sektor 512 b. sys. secnas equ 9 ;sekt. na stranu st. delsys equ 18d ;delka sys. po 512 b. ; ;porty radice WD 2797: comreg equ 090h ;ridici registr secreg equ 092h ;registr sektoru datreg equ 093h ;datovy registr drselp equ 094h ;drive select port ; ;parametry mechaniky: spseek equ 0fh ;rychlost krokovani ;(primo bity r0, r1) ;+prikaz restore seldsk equ 01 ;vybrany disk (udaj ;se posila do drselp) dr equ 02 ;natahovat se bude ;z disku B vektb equ 1 ;pro init disku b fcb equ 05ch ;pole FCB ; ; ; strt: ld sp,stack ld de,nap0 call napis ;vstupni hlaseni strmt macro r,zx wait&r: ld c,1 ;vstup znaku call bdos res 5,a ;mala pism. na vel. cp "E" jr nz,con&r ld de,nap6 ;novy radek call napis rst 00h ;restart cp/m con&r: cp 0dh jr nz,wait&r ;ceka na cr ld c,2 ;novy radek ld e,0ah call bdos di ld a,seldsk ;rozbeh motoru out (drselp),a ld hl,0 ;ceka se na rozbeh wt&r: in a,(comreg) ;je disk ready? bit 7,a jr z,stra&r ;je-li ready dec hl ld a,h or l jr nz,wt&r ;ceka se dal ld de,nap1 ;disk neni ready call napis jr wait&r stra&r: ifb ld de,nap5 ;loading system else ld de,nap7 ;writing cp/m endif call napis call home ld hl,pbios-512 ;sem/odtud se cte ld a,bigsys ;1. sektor systemu ld c,datreg ;datovy registr ld d,0 ;prvni strana ld e,secnas ;sektoru na strane di endm strmt c dalsec: out (secreg),a ;nastaveni sektoru push af ;cteni sektoru ld a,88h ;read code or d ;urceni strany out (comreg),a ;vyslani prikazu ld b,10 djnz $ ;timeout nxtrd: in a,(comreg) cp 01 ;je busy? jr z,nxtrd ;ceka in b,(c) ;prevzeti byte bit 1,a ;data platna? jr z,rnbw ;skok,pokud ne ld (hl),b ;ulozeni dat inc hl jr nxtrd ;dalsi byte rnbw: bit 0,a ;busy? jr nz,nxtrd ;dalsi byte and 09ch ;nebyla chyba? jp nz,err1 ;pri chybe pop af cp e ;posledni? inc a ;dalsi sektor jr c,dalsec ;na dalsi ld a,d ;test na druh. str. and a jr nz,dbioen ;vse je vycteno ld d,2 ;druha strana ld e,delsys+bigsys-secnas-1 ld a,(pbios+2eh+20-512);konst. off v DPH cp 2 ;vyhrazeny dve stopy? ld a,1 jr nz,dalsec ld d,10 zkus1: ld a,5fh ;step in out (comreg),a ld b,10 djnz $ wt1: in a,(comreg) and 81h ;hotovo? jr nz,wt1 in a,(comreg) bit 4,a jr z,ok1 call home dec d jr nz,zkus1 jp err1 ok1: ld d,08h ld a,1 jr dalsec dbioen: ei ld hl,synch1 ;overeni verze ld de,synch2 ld bc,7 ;delka porovnani cpdehl: ld a,(de) inc de cpi jp nz,err3 ;pri chybe jp pe,cpdehl ;dalsi byte ld hl,bcurtr ;akt. stopy ld b,5 filff: ld (hl),0ffh ;plni ffh inc hl djnz filff ld c,0dh ;iniciace systemu disku call bdos ld c,0eh ;akt. disk b ld e,vektb ;aktivni disk b call bdos ld de,fcb ;natazeni CCP push de ld hl,name ;plneni FCB ld bc,0fh ldir xor a ld (fcb+20h),a ;nulovani CR ld c,0fh ;otevreni souboru pop de call bdos cp 0ffh ;uspesne? jp z,err3 ;pri chybe ld a,seldsk ;retrigr monofl. out (drselp),a ld c,23h ;zjisteni del. soub. ld de,fcb call bdos ld de,pccp ;nastaveni 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,nap2 ;chyba cteni z ramc. zero: ld a,(hl) ;kontr. proti delce cp 0ffh inc hl jp nz,err1 ;pri chybe djnz zero pop hl dec hl ;adr. posl. byte CCP ld (ladr),hl ;ulozeni wtstop: in a,(drselp) ;ceka na stop mot. bit 0,a jr nz,wtstop ld de,nap3 ;disk, do ktereho se call napis ;zapise system do (DR) strmt d,zy ;start motoru out (secreg),a push af ;cteni 1. sektoru ld a,88h ;read code or d ;urceni strany out (comreg),a ;vyslani prikazu ld b,10 djnz $ ;timeout nxtrdr: in a,(comreg) cp 01 ;je busy? jr z,nxtrdr ;ceka in b,(c) ;prevzeti byte bit 1,a ;data platna? jr z,rnbwr ;skok,pokud ne ld (hl),b ;ulozeni dat inc hl jr nxtrdr ;dalsi byte rnbwr: bit 0,a ;busy? jr nz,nxtrdr ;dalsi byte and 09ch ;nebyla chyba? jp nz,err1 ;pri chybe pop af inc a ;2. sektor ntsec: out (secreg),a ;nastaveni sektoru push af ld a,0a8h ;flopy write code or d ;strana out (comreg),a ld b,10 ;timeout djnz $ nxtwd: ld b,(hl) ;prevzeti byte inc hl ;posun ukazovatka nxtwr: in a,(comreg) ;mozno vyslat byte? cp 01 jr z,nxtwr ;ceka se dal out (c),b ;vyslani byte bit 1,a ;pozadav. prist. byte? jr nz,nxtwd ;dalsi byte bit 0,a ;je busy? jr nz,nxtwr ;novy zap. tehoz byte and 0dch ;neni chyba? jp nz,err1 ;pri chybe ld a,88h ;read code or d ;strana disku out (comreg),a ld b,10 ;ceka djnz $ versct: in a,(datreg) ;data se zahazuji in a,(comreg) ;stavove slovo bit 0,a ;je busy? jr nz,versct ;dalsi byte and 98h ;neni chyba? jp nz,err1 ;pri chybe ld a,seldsk ;retrigr chodu mot. out (drselp),a pop af cp e ;posledni? inc a ;dalsi sektor dec hl ;byte na tomto (hl) ;uz nebyl zapsan jr c,ntsec ;na dalsi ld a,d ;test na druh. str. and a jr nz,bioend ;vse je zapsano ld d,2 ;druha strana ld e,delsys+bigsys-secnas-1 ;posl.sec.na 2.str. ld a,(pbios+2eh+20-512);je 180kb disketa? cp 2 ld a,1 jr nz,ntsec ld d,10 zkus: ld a,1 out (datreg),a ld a,1fh ;step in out (comreg),a ld b,10 djnz $ wt10: in a,(comreg) and 81h ;hotovo? jr nz,wt10 in a,(comreg) bit 4,a jr z,ok call home dec d jr nz,zkus jp err1 ok: ld d,08h ld a,1 jp ntsec bioend: ei ld hl,bcurtr ;akt. stopy ld b,5 fillff: ld (hl),0ffh ;plni ffh inc hl djnz fillff ld c,0dh ;iniciace systemu disku call bdos ld c,0eh ;akt. disk b ld e,vektb ;aktivni disk b call bdos ld de,fcb ;jmeno souboru push de ld hl,name ld bc,7 ldir ;nastaveni fcb xor a ld (fcb+20h),a ;nulovani CR pop de ld ix,(ladr) ;posledni adr. CCP ld c,0fh ;neexistuje jiz? call bdos ;otevreni souboru cp 0ffh jr nz,layst ;skok,existuje-li ld c,016h ;zalozeni souboru ld de,fcb ;adresa fcb call bdos cp 0ffh ;zalozeni soub. ok? ld de,nap9 ;plny adresar jr z,cerr ;pri nezalozeno layst: ld de,pccp ;adresa DMA 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,err1 ;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? jr z,err1 ;pri chybe ld de,nap8 ;pole ok call napis ei jp wtstop ;dalsi disk err3: ld de,nap4 ;verze nenalezena jr cerr err1: ld de,nap2 ;load/write error cerr: ei call napis rst 00h ;skok do cp/m ; ; ; Tiskne napis od adresy v DE ;-------------------------------------- ; napis: ld c,9 call bdos ret ; ; home: push de ld d,10 krat&r: ld a,seldsk ;retrigr monofl. out (drselp),a dec d jp z,err1 ld a,10 out (datreg),a ld a,1fh out (comreg),a ld b,10 djnz $ pos&r: in a,(comreg) and 81h jr nz,pos&r ld a,spseek ;restore out (comreg),a ld b,10 ;time out djnz $ wfho&r: in a,(comreg) ;je stopa 0? bit 0,a jr nz,wfho&r ;ceka na not busy bit 2,a ;je home? jr z,krat&r ;chyba pop de ret ; ; ;napisy: ; nap0: defb 0ah,0ah,0dh defb "=========================================" defb 0ah,0dh,0ah defb "+ S Y S T E M C O P Y P R O G R A M +" defb 0ah,0ah,0dh defb "=========================================" defb 0ah,0ah,0ah,0dh defb "Insert source disk to ",dr+40h,", then " defb "type CR (or E to exit): $" nap1: defb "Drive not ready! (CR to cont, E to " defb "exit): $" nap2: defb "Read/write error!",0dh,0ah,"$" nap3: defb "Insert blank system disk to ",dr+40h defb ", then type CR (or E to exit): $" nap4: defb "CP/M v2.2-4 not found!",0dh,0ah,"$" nap5: defb "Loading system - wait please!",0dh,0ah,"$" nap7: defb "Writing CP/M v2.2-4",0dh,0ah,"$" nap8: defb "Function complete!" nap6: defb 0ah,0ah,0dh,"$" nap9: defb "Directory full!",0ah,0dh,"$" name: defb dr,"CCP SYS",0,0,0 synch2: defb "1990 v4" ; ladr: defs 2 ;posledni adresa CCP ; ; ; end