;*************************************************** ; ; FORMATOVACI PROGRAM ; ;*************************************************** ; ; .cref .Z80 aseg ; ; bdos equ 05 ;pocat. bdos ; ;adresy WD 2797: ; drselp equ 094h ;drive sel. p. comreg equ 090h ;prikazovy reg. trkreg equ 091h ;reg. stopy datreg equ 093h ;dat. reg. secreg equ 092h ;sector reg. ; ; ; org 100h ; ; ld de,(bdos+1) ;neni malo pameti? ld hl,0a000h and a sbc hl,de jr c,spaceok ;pamet staci ld de,nap11 ld c,9 call bdos ;napis nestaci pamet rst 00 spaceok:ld sp,0a000h ld de,nap5 ld c,9 call bdos ;vstupni hlaseni strt: ld de,nap1 ld c,9 ;zaloz disketu call bdos ld c,1 call bdos ;ceka na klavesu cp 0dh ;pri cr format jr z,strfor res 5,a ;mala p. na velka cp "E" ;pri e navrat jr z,retu cp "X" jr z,switch ;prepnuti 720/360 jr strt retu: ld de,nap8 ld c,9 call bdos jp 0000 ;navrat do syst. switch: ld hl,(dpb) ;platna tabulka xor a ;dve strany ld (postr),a ld a,tab720 and 0ffh;co je zarazeno? cp l ;720 bytu? jr z,na360 ld a,tab360 and 0ffh ;je 360kb? cp l jr z,na180 ;skok na nastaveni 180 kb ld hl,tab720 ld (dpb),hl ;promenna ld a,80d ;pocet stop ld (setfrm),a ;nastav. prom. ld de,nap6 ;napis 720k ld c,9 call bdos jr strt na360: ld hl,tab360 ;nastav. 360k ld (dpb),hl ld a,40d ;40 stop ld (setfrm),a ;nastav.prom. ld de,nap7 ld c,9 call bdos jr strt na180: ld hl,tab180 ;nastav 180k ld (dpb),hl ld a,1 ;pouze strana 1 ld (postr),a ld a,40 ;pocet stop ld (setfrm),a ld de,nap10 ld c,9 call bdos jr strt strfor: ld de,nap9 ;napis format. ld c,9 call bdos ld a,(disket) ;start motoru out (drselp),a ld hl,0 ;ceka na ready del1: dec hl rept 4 ex (sp),hl endm in a,(comreg) ;je ready? and 80h jr z,home ld a,l or h jr nz,del1 ;pri nevycerp. ld de,nap2 ;disk not ready ld c,9 call bdos jp strt home: call hlhome ;home hlavy jr z,error ;pri chybe ld a,0 ;prvni strana ld (strana),a seeks0: ld (stopa),a ;stopa push af call makedt di call writfs ;zapis stopy ei pop bc jr nz,error ;pri chybe ld a,(postr) ;jednostranna disketa? and a jr nz,singpg ;pri jednostranne diskete push bc ld a,1 ;druha strana ld (strana),a call makedt di call writfs ;zapis stopy ei pop bc jr nz,error ;pri chybe singpg: ld hl,setfrm ;pocet stop ld a,b ;dalsi stopa inc a cp (hl) ;posledni stpa? jr z,vseok ;na zapis tab. push af ld a,05fh ;step in out (comreg),a ld b,10 djnz $ wt0: in a,(comreg) and 81h ;hotovo? jr nz,wt0 xor a ld (strana),a pop af jr seeks0 vseok: call hlhome ;hlava do home jr z,error and 98h jr nz,error di call mtbdph ;zapis tabulky ei jr nz,error ;pri chybe ld de,nap4 ld c,9 call bdos ;ok! jp strt ;znovu error: ld de,nap3 ;chybovy navrat ld c,9 call bdos jp strt ; ; ; vytvori data pro stopu ;---------------------------------------- ; makedt: ld de,konst ;sem se presouva ld hl,tab ;odtud ld bc,sector-tab ;delka ldir ;vstupni cast ld iy,tabsec ;tabulka sektoru ld a,9 ;nast. poc. sekt. fills: ex AF',AF ld a,(iy+0) ;cislo sektoru ld (sektor),a inc iy ;posun ukazov. ex AF',AF ld hl,sector ld bc,zaver-sector ldir dec a ;uz 9 sektoru? jr nz,fills ;dalsi sektor ld bc,konst-zaver ;posledni cast ldir ret ; ; ; zapis stopy ;---------------------------------- ; writfs: ld hl,konst ;pocatek dat ld a,(disket) ;retrigr monofl. out (drselp),a ld a,(strana) rlca ld d,a ld a,0f4h ;zapis stopy or d out (comreg),a ld b,10 djnz $ ld c,datreg nxtwd: ld b,(hl) inc hl nxtwr: in a,(comreg) ;mozno vyslat byte? cp 01 jr z,nxtwr out (c),b bit 1,a jr nz,nxtwd ;dalsi byte bit 0,a ;je busy? jr nz,nxtwr and 084h ;neni chyba? ret nz ;pri chybe ld a,(disket) ;retrigr monofl. out (drselp),a ld e,1 ;1.sektor dalsec: ld a,e cp 0ah ;posledni sec? ld a,0 ret z ;spravny navrat ld a,e inc e out (secreg),a ld a,088h ;read sector or d out (comreg),a ld b,10 djnz $ nxtrd: in a,(comreg) ;je busy? cp 01 jr z,nxtrd in b,(c) ;cteni dat bit 1,a ;data platna jr z,rnbw ;jeste ne,skok jr nxtrd ;dalsi byte rnbw: bit 0,a ;busy bit jr nz,nxtrd ;dalsi byte and 9ch ret nz jr z,dalsec ;dalsi sektor ; ; ; hlava do polohy home ;-------------------------------------- ; hlhome: ld a,0fh ;disk home out (comreg),a ld a,(disket) out (drselp),a ;retrigr ld b,10 ;pauza djnz $ whome: in a,(comreg) ;hotovo? bit 0,a jr nz,whome bit 2,a ;bez chyby? ret ; ; ;vlozi prislusnou tabulku dph do 0.stopy, 1.sektor ;------------------------------------------------- ; mtbdph: ld hl,konst ;poc. dat push hl ld bc,512d ;delka sekt. dalee5: ld (hl),0e5h ;plneni zony dec bc inc hl ld a,b or c jr nz,dalee5 pop hl push hl ld de,2eh ;mezera add hl,de ;adresa presunu ex de,hl ld hl,(dpb) ;tabulka ld bc,22d ;delka tabulky ldir ;presun ld a,1 ;sektor out (secreg),a pop hl ;adresa ld a,(disket) ;retrigr out (drselp),a ld a,0a8h ;write sector out (comreg),a ld b,10 djnz $ ld c,datreg ndpb: ld b,(hl) ;prevzeti byte inc hl nwr: in a,(comreg) ;mozno vyslat? cp 01 jr z,nwr out (c),b ;vyslani bit 1,a jr nz,ndpb ;dalsi byte bit 0,a ;je busy? jr nz,nwr and 0dch ;chyba? ret nz ld a,88h ;read sector out (comreg),a ld b,10 djnz $ verif: in a,(datreg) ;data se zahazuji in a,(comreg) bit 0,a ;je busy? jr nz,verif and 98h ;chyba? ret ; ; nap1: db "Insert disk to B, then " db "type CR!",0ah,0dh,"$" nap2: db "Disk B not ready!",0ah,0dh,"$" nap3: db "Impossible to format this disk, " db "permanent error occured!",0ah,0dh,"$" nap4: db "Function complete!",0ah,0dh,"$" nap5: db 0ah,0ah,0ah,0ah,0ah,0dh db "----------------------------" db 0ah,0dh db "F O R M " db "A T P R O G R A M ",0ah,0dh db "----------------------------" db 0ah,0dh,0ah db "X = format switch 720/360/180KB" db 0ah,0dh db "E = exit",0ah,0dh,0ah,0ah db "Actual format: 720 KB",0ah,0dh db 0ah,0ah,"$" nap6: db 0dh,"Format 720 KB",0ah,0dh,"$" nap7: db 0dh,"Format 360 KB",0ah,0dh,"$" nap8: db 0dh,20h,0ah,0dh,"$" nap9: db "Wait please!" db 0ah,0dh,"$" nap10: db 0dh,"Format 180 KB",0ah,0dh,"$" nap11: db 0ah,0dh,"Not enough memory!" db 0ah,0dh,"$" ; ; disket: db 01 dpb: dw tab720 ;v iniciaci 720b. setfrm: db 80d postr: db 0 ;prepinac jedno/dvoustr. disk. ; ; tab720: db "1990 v4" ;identifikace biosu dw 72 ;spt db 4 ;bsh db 15 ;blm db 0 ;exm dw 354 ;dsm dw 191 ;drm db 0e0h ;al0 db 0 ;al1 dw 48 ;cks dw 1 ;off ; ; tab360: db "1990 v4" ;identifikace biosu dw 72 ;spt db 4 ;bsh db 15 ;blm db 1 ;exm dw 174 ;dsm dw 127 ;drm db 0c0h ;al0 db 0 ;al1 dw 32 ;cks dw 1 ;off ; ; tab180: db "1990 v4" ;identifikace biosu dw 36 ;spt db 3 ;bsh db 07 ;blm db 0 ;exm dw 170 ;dsm dw 063 ;drm db 0c0h ;al0 db 0 ;al1 dw 16 ;cks dw 2 ;off ; ; tabsec: db 1,6,2,7,3,8,4,9,5 ; ; tab: rept 16 db 04eh,04eh,04eh,04eh,04eh endm rept 2 db 0,0,0,0,0,0 endm db 0f6h,0f6h,0f6h,0fch rept 10 db 04eh,04eh,04eh,04eh,04eh endm sector: db 0,0,0,0,0,0,0,0,0,0,0,0 db 0f5h,0f5h,0f5h,0feh stopa: db 00 strana: db 00 sektor: db 00 db 02,0f7h rept 4 db 4eh,4eh,4eh,4eh,4eh endm db 4eh,4eh db 0,0,0,0,0,0,0,0,0,0,0,0 db 0f5h,0f5h,0f5h,0fbh rept 102 db 0e5h,0e5h,0e5h,0e5h,0e5h endm db 0e5h,0e5h db 0f7h,4eh,4eh,4eh,4eh rept 10 db 4eh,4eh,4eh,4eh,4eh endm zaver: rept 140 db 4eh,4eh,4eh,4eh,4eh endm konst: end