;*****************************************************************************; ; ; ; SSS DDDD SSS Y Y SSS TTTTT EEEEE M M SSS ; ; S S D D S S Y Y S S T E MM MM S S ; ; S D D S Y Y S T E M MM M S ; ; SSS D D SSS Y SSS T EEE M M SSS ; ; S D D S Y S T E M M S ; ; S S D D S S Y S S T E M M S S ; ; SSS DDDD SSS Y SSS T EEEEE M M SSS ; ; ; ; ; ; SD SYSTEMS, INC. ; ; 10111 MILLER RD. ; ; DALLAS, TX 75238 ; ; ; ; (214) - 340 - 0303 ; ; ; ; COPYRIGHT (C) 1983 ; ; ; ;*****************************************************************************; Title 'FLPDRVR floppy disk driver for cpm 3.0' ;=============================================================================; ; V/R Description Initials-Date ; ;-----------------------------------------------------------------------------; ; 1.0a Initial version for CPM3.0 dkb... 1/6/83 ; ; 1.0b Pre-run dkb... 1/15/83 ; ; 1.0c Add sdsys maclib for ddbtbl dkb... 1/15/83 ; ; 1.0d Remove macro expansion of dph,dpb tables dkb... 1/16/83 ; ; 1.0 RELEASE for distribution dkb... 1/17/83 ; ; 1.1a Add density changed reporting dkb... 1/18/83 ; ; 1.1b Fix mini double density interleave problem dkb... 1/24/83 ; ; 1.1 RELEASE for distribution dkb... 1/24/83 ; ; 1.2a fixed bank switch to use call ?bank dkb... 4/14/83 ; ; 1.2 RELEASE for distribution CPM30 rel 1.5 dkb... 4/14/83 ; ; 1.21 Made external SDSYS.LIB internal wbd... 7/8/83 ; ;=============================================================================; ; maclib cond dseg ; Disk drive dispatching tables for linked BIOS ; Variables containing parameters passed by BDOS extrn @adrv,@rdrv,@cbnk extrn @dma,@trk,@sect,@dbnk,?bank public dpb$sav,dph$sav public cmdsv,error,erflag ; System Control Block variables extrn @ermde,@media ; BDOS error mode ; Utility routines in standard BIOS extrn ?wboot ; warm boot vector extrn ?pmsg ; print message @ up to 00> extrn ?pdec ; print binary number in from 0 to 99. extrn ?pderr ; print BIOS disk error header extrn ?conin,?cono ; con in and out extrn ?const ; get console status ; Variables containing parameters passed by dbios public fdsd0,fdsd1,fdsd2,fdsd3 public taddr,?drvar public sctr,trk,homed,@dtype,ixsav ; Port Address Equates maclib ports ; CP/M 3 Disk definition macros maclib cpm3 ; Z80 macro library instruction definitions maclib z80 ; common control characters cr equ 13 lf equ 10 bell equ 7 ; Extended Disk Parameter Headers (XPDHs) drtbl macro ?spt,?tps,?ihg,?gp1,?gp2,?gp3,?sk1,?sk2,?sk3 ; db ?spt ; sectors per track db ?tps ; tracks per side db ?ihg ; index header gap db ?gp1 ; gap 1 db ?gp2 ; gap 2 db ?gp3 ; gap 3 db ?sk1 ; restore cmd db ?sk2 ; seek no verify cmd db ?sk3 ; seek with verify endm ; mdrtbl macro ?spt,?tps,?ihg,?gp1,?gp2,?gp3,?sk1,?sk2,?sk3 ; db ?spt ; sectors per track db ?tps ; tracks per side db ?ihg ; index header gap db ?gp1 ; gap 1 db ?gp2 ; gap 2 db ?gp3 ; gap 3 db ?sk1 ; restore cmd db ?sk2 ; seek no verify cmd db ?sk3 ; seek with verify endm ; xdph macro ?rdadr,?wradr,?initadr,?login,?unit,?typ dw ?rdadr ; address of read routine dw ?wradr ; address of write routine dw ?initadr ; address of initialization dw ?login ; address of login routine db ?unit ; unit number db ?typ ; unit type endm ; ; Disk I/O routines for standardized BIOS interface ; Initialization entry point. ; called for first time initialization. step$var equ 0ff90h dsm$var equ stepvar+16 ; fd$init0: ; zero out variables for starters lxi h,taddr lxi d,taddr+1 lxi b,ramend-taddr mov m,0 ldir fd$init1: ; initialization not needed ret ; fd$login: ; This entry is called when a logical drive is about to ; be logged into for the purpose of density determination. sded dph$sav ; save current dph lxi d,stdsdt+1 lxi h,step$var mvi b,4 lopstp: push b lxi b,5 mov a,m stax d ; set track # xchg dad b xchg inx h lxi b,3 ldir pop b inx d djnz lopstp ; xchg lhld dsm$var shld u2$dsm lhld dsm$var+2 shld u3$dsm lhld dsm$var+4 shld u6$dsm lhld dsm$var+6 shld u7$dsm ; ; It may adjust the parameters contained in the disk ; parameter header pointed at by ; lda @rdrv call @dtype ; go get disk type lxi h,unit$table ; dpb table lda @rdrv sta drv$sav ; save density check ani 070h ; strip of all unit bits rar rar rar ; shift right 3 times for index mov c,a ; build index in bc mvi b,0 dad b ; point to dpb mov a,m ; get it inx h mov h,m ; into hl mov l,a shld dpb$sav xchg ; dpb in de lhld dph$sav ; xdph in hl dcx d ; dcx d ; back up to xlate table ldax d ; and put in xdph mov m,a inx d inx h ldax d mov m,a inx d ; de pointing back to dpb lbcd dph$sav ; dph in bc lxi h,-2 ; backup 2 dad b lda @rdrv ; and get new unit byte mov m,a ; put unit byte in hl lxi h,11 ; now to media byte dad b mvi a,-1 mov m,a ; set it inx h sta @media ; and in sct mov m,e inx h mov m,d ; dpb in xdph lhld dph$sav ; restore dph xra a ret ; dph$sav dw 0 dpb$sav dw 0 drv$sav db 0 rdysta db 0 savcur db 0 ; ; disk READ and WRITE entry points. ; these entries are called with the following arguments: ; relative drive number in @rdrv (8 bits) ; absolute drive number in @adrv (8 bits) ; disk transfer address in @dma (16 bits) ; disk transfer bank in @dbnk (8 bits) ; disk track address in @trk (16 bits) ; disk sector address in @sect (16 bits) ; pointer to XDPH in ; they transfer the appropriate data, perform retries fd$read: sded dph$sav ; save dph for retries xra a ; 0 = read sta function call set$up ; go setup for floppy variables lxi b,read$msg sbcd operation$name lda rdysta ; check ready flag ora a sta error jrnz ntrd ; if not ready, don't hang up call fread ; go to external floppy routine ora a rz jr eract fd$write: sded dph$sav ; save dph for retries xra a inr a ; 1 = write sta function call set$up ; go setup for floppy variables lxi b,write$msg sbcd operation$name lda rdysta ; check drive ready status ora a jrnz ntrd ; if not ready then don't hang up sta error call fwrite ; go to external floppy routine ora a rz ; eract: sta erflag ; save flag in status ani 80h jrnz ntrd lda @rdrv call @dtype lda drv$sav mov b,a lda @rdrv cmp b mvi a,-1 rnz ; density has changed 0.06 ntrd: lda @ermde inr a jz hard$error ; if so, then return hard error call ?pderr ; print message header lhld operation$name call ?pmsg lda error lxi h,error$table errm1: mov e,m inx h mov d,m inx h add a push psw xchg cc ?pmsg xchg pop psw jnz errm1 lxi h,error$msg call ?pmsg call ?conin ani 5fh ; make it upper case cpi 'Y' jz more$retries ; yes, then retry 10 more times hard$error: mvi a,1 ret cancel: jmp ?wboot ; operation$name: dw read$msg read$msg: db ', Read',0 write$msg: db ', Write',0 ; error$table: dw b7$msg dw b6$msg dw b5$msg dw b4$msg dw b3$msg dw b2$msg dw b1$msg dw b0$msg b7$msg: db ' Not Ready,',0 b6$msg: db ' Protect,',0 b5$msg: db ' Fault,',0 b4$msg: db ' Record Not Found,',0 b3$msg: db ' CRC,',0 b2$msg: db ' Lost Data,',0 b1$msg: db ' Dreq,',0 b0$msg: db ' Busy,',0 error$msg: db ' Retry (Y/N) ? ',0 ; more$retries: lda function ; get function # ora a ; chek for read lded dph$sav ; get dph in de jz fd$read ; yes, go read cpi 1 ; write ? jz fd$write ; yes, go write jmp hard$error ; ; if necessary, then return an error code in ; set$up: ; this routine adjust values for floppy interface ; @dma is stored in taddr ; @trk is adjusted, if double sided,double density,and ; stored in trk ; @sect is ajusted, if double-sided,double density, and ; stored in sctr in status ani 80h sta rdysta ; set ready status flag lda @rdrv push b ; save exec code lxi b,0 ani 070h ; look at type bit 4,a ; check double side bit jrz stdwr ; no, then standard write/read bit 6,a ; double density ? jrz stdwr ; no, then standard read/write mvi b,3 bit 5,a ; is it mini jrnz stdwr mvi b,1 ; no, then 8" stdwr: lda @trk ; get system track bit 0,b ; is this double,side,double density jrz stdwr2 ; if not, jmp ; srl a db 0cbh,3fh ; fake srl a instruction ; jrnc stdwr2 ; odd tracks are on back mvi c,18 bit 1,b ; mini ? jrnz stdwr2 mvi c,26 stdwr2: lxi h,0 mov l,a shld trk ; ; remove, fix done in sectran..dkb 1.01 ; lda @rdrv ; ani 060h ; cpi 060h ; check for 2d mini ; jrnz intlvy ; no, ok else ; inr c ; incr because of no sectran ; ; end of removed stuff...dkb 1.01 ; intlvy: lda @sect ; system sector add c ; add offset mov l,a shld sctr ; for bios lhld @dma shld taddr ; and dma address pop bc ; restore exec offset ret page ; ; nbytes equ 128 ; ports used by disk controller ; x equ 60h rset equ x+0 ; controller reset addr select equ x+3 ; drive select port status equ x+4 ; status port track equ x+5 ; track port sector equ x+6 ; sector port data equ x+7 ; data port cmd equ x+4 ; command port page ; ; ; ; ; disk error status bits (error) ; ; ; bit 7 - drive not ready ; bit 6 - write protected ; bit 5 - track seek error ; bit 4 - sector not found ; bit 3 - crc error ; bit 2 - data lost ; bit 1 - drq bit ; bit 0 - write deleted sector read ; feh - controller hang up ; 0fh - invalid track error ; ; ; disk controller command codes ; ; rdacmd equ 0c0h ; read address cmd rdcmd equ 88h ; read sector cmd wrcmd equ 0a8h ; write sector cmd wrtcmd equ 0f4h ; write track cmd ; ; ; the following equates relate the disk format ; tables to the index register (ix). ; ; nsctrs equ 0 ntrks equ 1 headr equ 2 gap1 equ 3 gap2 equ 4 gap3 equ 5 rscmd equ 6 skncmd equ 7 skcmd equ 8 ntypes: db 3 page ; ; The following tables contain definitions ; which vary according to drive type. ; ; 8" Single Density Drive Variables ?drvar: stdsdt: drtbl 26,77,100-27,6,11,27,8,18h,1ch ; ; 8" 256 Byte Double Density Variables ; stdddt: ddt256: drtbl 26,77,100-54,8,22,54,8,18h,1ch ; ; ; 5" Single Density Disk Variables ; minsdt: mdrtbl 18,35,20-8,6,11,8,0bh,1bh,1fh ; ; 5" Double Density Disk Variables ; minddt: mdrtbl 18,80,100-16,8,22,16,8,18h,1ch ; ; this routine sets up the unit byte for system use ; to install new diskettes or drives. ; @dtype: ani 0fh ori 040h ; try dd first sta @rdrv ; save @rdrv number lda ntypes ; # types of disks to try mov b,a lhld taddr ; save user tadddr shld temp2 call usl1 ; set @rdrv type bits lhld temp2 ; recall user taddr shld taddr lda @rdrv ; save @rdrv type data rnz ; return if error flg set jrnc usl0 setb 6,a ; set 256 bps bit usl0: mov e,a lda side ; chk doubl side bit ora a mov a,e ; recall @rdrv type data res 4,a ; reset double side bit jp ss ; all set if singl sided setb 4,a ; set double side bit ss: sta @rdrv ; set @rdrv type register xra a ; reset error flag ret ; return to caller usl1: push b pushix push h sspd spsv pop h call drvset jrnz usl2 ; if not ready, next type call idrd usl2: popix pop b lda idsv+3 rrc ; check for 256 bps rz dcr b call chgtyp ; try next dsk type jr usl1 ; chgtyp: lda @rdrv ; get @rdrv type register mov e,a ; store @rdrv type in e lda ntypes ; if error check drive type dcr a cmp b jrz sd8 ; try 8" single desity 2nd. dcr a ; if not sd8 jrz chgt1 ; if mini not suported, jmp cmp b ; try single density 5" jrz dd5 dcr a ; it's not sd-5 cmp b ; try double density 5" jrz sd5 chgt1: ori 1 ; must not be any thing out ; there set error flag pop h ; adjust ret addr ret ; and return sd8: mov a,e ; recall @rdrv type data ani 0fh ; reset double density bit jr chgt2 sd5: mov a,e ; get @rdrv data res 6,a setb 5,a ; reset 8" select bit jr chgt2 dd5: mov a,e ; get @rdrv data setb 5,a ; and mini bit setb 6,a ; set double density bit chgt2: sta @rdrv ; set @rdrv data ret page ; ; disk controller linkages ; homed: home: sspd spsv pushix ; save ix ptr call drvset ; select drive call home1 ; restore drive popix ; restore ix ret ; adjsec: lda sctr inr a sta sctr ; reset sectors to 1 base ret ; ; read a sector fread: jmp read ; dummy jump for vector later read: lxi b,301h readbt: sbcd rseek ; save nbr retrys pushix ; save ix lixd ixsav ; set current variable ; table read1: push b call rdsc ; read a sector pop b jrz rwret ; return if no error call retry ; retry if error jr read1 rwret: popix ; restore ix ret ; return to caller ; ; write a sector ; fwrite: jmp write ; dummy jump for vector later write: lxi b,301h wrbt: sbcd rseek ; save nbr retrys pushix ; save ix lixd ixsav ; set current variable ; table write1: push b call wrsc ; write a sctr pop b jrz rwret ; return if no error call retry ; retry if error jr write1 page ; ; ; retry: djnz retry2 ; do (b) retrys without reseek lda rtry ; get retry number mov b,a dcr c ; do (c) reseeks jp retry1 pop psw popix ; restore ix if error xra a inr a ; set error flag sta erflag ; set flag for deblocker ret ; return to caller retry1: push b call home1 ; restore drive pop b retry2: ret ; try again home1: sspd spsv ; set ret if error ldx a,rscmd ; restore to trk 0 call seek4 ; type 1 command execution xra a ; reset error flag ret ; page ; ; check drive sel and change if different ; drvset: lxi d,@rdrv ; get addr of @rdrv typ reg ldax d ; put @rdrv type in acc ani 060h ; get drive type bits mov c,a ; store drive type in c ldax d ; get @rdrv data ; to get drive number ani 03 mov b,a ; drive number in b mvi a,1 ; if drive 0 jrz drvsel ; set select bit 0 ckdrv1: rlc ; if not shift bit to djnz ckdrv1 ; proper position drvsel: ora c ; combine drive select bits ani 7fh ; with drive type bits mov b,a ; store new select data mov a,c ; if not change drive type ; table and output new ; select data lxix stdsdt ; drive type=8" sd cpi 0 jrz ckdrv lxix stdddt ; drive type=8" dd cpi 40h jrz ckdrv lxix minsdt ; drive type=5" sd cpi 20h jrz ckdrv lxix minddt ; drive type=5" dd ckdrv: sixd ixsav ; (ixsav)=new table addr push b ; save select data ; to enable delay drvst: pop psw ; get select data cma ; hrdwre reg is inverted out select ; set drv select reg ldax d ; get new drive type sta @rdrvck ; set old = new call delay ; drive select delay rdyck: in status ani 80h jnz end2 ret ; if not automatic return ; in rdychk routine page ; ; read present disk address (trk &sctr) ; idrd: call wait ; force not busy lxi h,idsv lxi b,600h+data mvi a,0f8h sta ermask call sweb mvi a,rdacmd call rdsc0 ; read id lda idsv ; cpi ix+ntrks db 0ddh,0beh,ntrks ; fake cp (ix+ntrks) jnc seek0 out track xra a ret ; delay: lda @rdrv bit 5,a ;test mini/full bit mvi a,39 ;32 ms del if full jrz delay1 mvi a,60 ;50 ms del if mini delay1: mvi b,0 delay3: djnz delay3 dcr a jrnz delay1 ret ; page ; ; read sector command cseg ; probably need this in common ..dkb ; rdsc: call drinit mvi a,rdcmd ; read command call stsdbt lhld taddr ; set transfer address rdsc0: sta cmdsv di ; disable int during trx push psw lda @dbnk ; out -1 ; set dma bank call ?bank pop psw out cmd ; output command jr rds1 rds1: jr rds2 ; wait for status update rds2: inir ; input a sector lda @cbnk ; restore current bank ; out -1 ; back to current bank call ?bank ei ; re enable interrupts jmp end$it ; ; write sector command ; wrsc: call drinit mvi a,wrcmd call stsdbt lhld taddr ; set transfer address sta cmdsv di ; disable interrupts push psw lda @dbnk ; set dma bank for transfer ; out -1 call ?bank pop psw out cmd ; output command jr wrs1 wrs1: jr wrs2 ; wait for status update wrs2: outir ; output a sector lda @cbnk ; then get current bank ; out -1 ; and switch it back in call ?bank ei ; re-enable interrupts jmp end$it ; page dseg ; okay in banked memory ; stsdbt: mov h,a ; set up side bit in cmd lda side mov l,a ani 1 mov a,h rz setb 1,a ret ; ; drive initialization routine ; drinit: pop h ; set up error return sspd spsv push h lda @rdrv ; get drive select data mov d,a lda @rdrvck ; get previous select data cmp d ; same as before? jrz dinit1 ; if so,skip drvset call drvset call idrd dinit1: call seek mvi a,0feh sta ermask jmp trint ; ; end of command ; end$it: call wait in status mov d,a lda ermask ana d ; check for errors rz end1: mov a,d end2: sta error ; save error bits call delay ori 1 lspd spsv call @rdrvfx ; force drvset after error ret ; page ; ; ; seek track ; seek: call rdyck ldx a,ntrks mov c,a lda trk cmp c ; chk for valid trk jrc seek1 seek0: mvi a,0fh jr end2 ; invalid track seek1: mov c,a ; save new trk # in track ; present track cmp c rz ; if same trk, return ldx a,skcmd ; seek command seek4: sta cmdsv mvi b,210 temp12: djnz temp12 call wait lda trk out data mvi a,80h sta ermask lda cmdsv out cmd mvi b,10 temp13: djnz temp13 call end$it call delay lda cmdsv cmpx rscmd rz in status ani 10h jrnz seek2 in track cmp c rz seek2: mvi a,20h end2jp: jr end2 page ; wait: mvi e,0 push b mvi c,2 wait2: in status ani 1 jrz dwait djnz wait2 dcr e jrnz wait2 dcr c jrnz wait2 pop b in select ori 80h out rset temp14: djnz temp14 ; reset to get out of wait in rset call frcint ; kill auto restore ldx a,rscmd ; & restore @ proper step rate call seek4 mvi a,0feh ; error=fe jr end2jp ; force retry ; ; disable wait states ; dwait: pop b in select ori 80h ; neg true .and. ; resets wait enabl bit out select ret ; ; enable wait states ; sweb: in select ani 7fh ; neg true .or. ; sets wait enabl bit out select ret page ; ; initialize for disk transfer ; trint: mvi b,0 ldx a,nsctrs inr a mov c,a lda sctr cmp c ; check for side jrc trint1 mvi b,10h dcr c sub c ; if side 2, subtract trint1: push psw call chgsid ; chk side and chg if needed pop psw out sector trint2: mvi b,nbytes ; count in b mvi c,data ; data port number in c lda @rdrv ; chk 256 byte bit bit 6,a jrz sweb mvi b,0 ; if set, make trx longer jr sweb ; chgsid: in select cma mov e,a ; check side selected ani 10h cmp b rz ; if same side, ret mov a,e ani 6fh ora b cma out select ; select new side mvi b,210 ; delay for side change temp15: djnz temp15 jmp idrd ; set up side byte ; ; force chip interrupt command ; frcint: mvi a,0d0h out cmd ; 'force interrupt' cmd mvi a,10 frc1: dcr a jrnz frc1 in status ret ; @rdrvfx: mvi a,-1 sta @rdrvck zend: ret ; cseg ; these must be in common ; taddr: ds 2 ; transfer address sctr: ds 2 ; sector trk: ds 2 ; track ermask: ds 1 ; error mask idsv: ds 1 ; bytes side: ds 5 ; id side byte spsv: ds 2 ; sp save (2 bytes) cichr: ds 1 ; used for backspace temp1: ds 1 ; 1 byte temporary reg temp2: ds 2 ; 2 byte temporary reg ixsav: ds 2 ; ix store buffer error: ds 1 erflag: ds 1 function: ds 1 ; read=0/write=1 cmdsv: ds 2 @rdrvck: ds 1 ; old unit byte rseek: ds 1 ; nbr of reseeks rtry: ds 1 ; nbr of rtrys ram$end: db 0 ; end of ram values ; dseg ;------------------------------------------------------------------ ; dpb tables for mixed format selections ; ;------------------------------------------------------------------ unit$table: dw un0dub ; single sided,single density 8" dw un1dub ; double sided,single density 8" dw un2dub ; single sided,single density 5" dw un3dub ; double sided,single density 5" dw un4dub ; single sided,double density 8" dw un5dub ; double sided,double density 8" dw un6dub ; single sided,double density 5" dw un7dub ; double sided,double density 5" ;------------------------------------------------------------------ ; ; disk parameter headers here ; ;------------------------------------------------------------------ xdpha: dw fd$write ; address of sector write dw fd$read ; address of sector read dw fd$login ; address of drive login dw fd$init0 ; address of drive init routine db 0 ; physical unit number db floppy ; controller type fdsd0: dw xlt3 ; translate table address db 0,0,0,0,0,0,0,0,0 ; bios scratch area db 0 ; media flag dw dummy ; disk parameter block (dpb) if loader dw csv0 ; checksum allocated here dw alv0 ; alloc vector allocated here dw drbcb0,dtbcb0,-1 ; dirbcb,dtabcb,hask alloc'd here db 0 ; hash bank else dw -2 ; checksum allocated by gencpm dw -2 ; alloc vector allocated by gencpm dw -2,-2,-2 ; dirbcb,dtabcb,hask alloc'd by gencpm db 0 ; hash bank endif ; xdphb: dw fd$write ; address of sector write dw fd$read ; address of sector read dw fd$login ; address of drive login dw fd$init0 ; address of drive init routine db 1 ; physical unit number db floppy ; controller type fdsd1: dw xlt3 ; translate table address db 0,0,0,0,0,0,0,0,0 ; bios scratch area db 0 ; media flag dw dummy ; disk parameter block (dpb) if loader dw csv0 ; checksum allocated here dw alv0 ; alloc vector allocated here dw drbcb0,dtbcb0,-1 ; dirbcb,dtabcb,hask alloc'd here db 0 ; hash bank else dw -2 ; checksum allocated by gencpm dw -2 ; alloc vector allocated by gencpm dw -2,-2,-2 ; dirbcb,dtabcb,hask alloc'd by gencpm db 0 ; hash bank endif xdphc: dw fd$write ; address of sector write dw fd$read ; address of sector read dw fd$login ; address of drive login dw fd$init0 ; address of drive init routine db 2 ; physical unit number db floppy ; controller type fdsd2: dw xlt3 ; translate table address db 0,0,0,0,0,0,0,0,0 ; bios scratch area db 0 ; media flag dw dummy ; disk parameter block (dpb) if loader dw csv0 ; checksum allocated here dw alv0 ; alloc vector allocated here dw drbcb0,dtbcb0,-1 ; dirbcb,dtabcb,hask alloc'd here db 0 ; hash bank else dw -2 ; checksum allocated by gencpm dw -2 ; alloc vector allocated by gencpm dw -2,-2,-2 ; dirbcb,dtabcb,hask alloc'd by gencpm db 0 ; hash bank endif ; xdphd: dw fd$write ; address of sector write dw fd$read ; address of sector read dw fd$login ; address of drive login dw fd$init0 ; address of drive init routine db 3 ; physical unit number db floppy ; controller type fdsd3: dw xlt3 ; translate table address db 0,0,0,0,0,0,0,0,0 ; bios scratch area db 0 ; media flag dw dummy ; disk parameter block (dpb) if loader dw csv0 ; checksum allocated here dw alv0 ; alloc vector allocated here dw drbcb0,dtbcb0,-1 ; dirbcb,dtabcb,hask alloc'd here db 0 ; hash bank else dw -2 ; checksum allocated by gencpm dw -2 ; alloc vector allocated by gencpm dw -2,-2,-2 ; dirbcb,dtabcb,hask alloc'd by gencpm db 0 ; hash bank endif ;------------------------------------------------------------------- ; disk parameter blocks here ; ;------------------------------------------------------------------ cseg ; this must be in common ; dw xstd ; translate table address un0dub: dw 26 ; spt db 3,7,0 ; blm bls exm dw 242 ; dsm dw 63 ; drm dw 0c0h ; alloc vector for dirctory dw 16 ; checksum size cks dw 2 ; offset for system tracks (off) db 0,0 ; sector size, and shift mask ; dw xstd ; translate table address un1dub: dw 52 ; spt db 4,15,0 ; blm bls exm dw 246 ; dsm dw 127 ; drm dw 0c0h ; alloc vector for dirctory dw 32 ; checksum size cks dw 1 ; offset for system tracks (off) db 0,0 ; sector size, and shift mask ; dw xlt4 ; translate table address un2dub: dw 18 ; spt db 3,7,0 ; blm bls exm u2dsm: dw 71 ; dsm dw 53 ; drm dw 0c0h ; alloc vector for dirctory dw 14 ; checksum size cks dw 3 ; offset for system tracks (off) db 0,0 ; sector size, and shift mask ; dw xlt4 ; translate table address un3dub: dw 36 ; spt db 3,7,0 ; blm bls exm u3dsm: dw 149 ; dsm dw 53 ; drm dw 0c0h ; alloc vector for dirctory dw 14h ; checksum size cks dw 2 ; offset for system tracks (off) db 0,0 ; sector size, and shift mask ; dw xlt3 ; translate table address un4dub: dw 52 ; spt db 4,15,0 ; blm bls exm dw 239 ; dsm dw 127 ; drm dw 0f0h ; alloc vector for dirctory dw 32 ; checksum size cks dw 3 ; offset for system tracks (off) db 1,1 ; sector size, and shift mask ; dw xlt3 ; translate table address un5dub: dw 52 ; spt db 5,31,0 ; blm bls exm dw 244 ; dsm dw 247 ; drm dw 0f0h ; alloc vector for dirctory dw 62 ; checksum size cks dw 3 ; offset for system tracks (off) db 1,1 ; sector size, and shift mask ; dw 0 ; translate table address un6dub: dw 36 ; spt db 4,15,0 ; blm bls exm u6dsm: dw 174 ; dsm dw 127 ; drm dw 0c0h ; alloc vector for dirctory dw 16 ; checksum size cks dw 2 ; offset for system tracks (off) db 1,1 ; sector size, and shift mask ; dw 0 ; translate table address un7dub: dw 36 ; spt db 5,31,0 ; blm bls exm u7dsm: dw 176 ; dsm dw 127 ; drm dw 0c0h ; alloc vector for dirctory dw 32 ; checksum size cks dw 2 ; offset for system tracks (off) db 1,1 ; sector size, and shift mask ; dw 0 ; translate table address ; dseg dummy: ;dpb dw 104 ; spt db 5,31,0 ; blm bls exm dw 0ffh ; dsm dw 0ffh ; drm dw 0ffh ; alloc vector for dirctory dw 64 ; checksum size cks dw 2 ; offset for system tracks (off) db 1,1 ; sector size, and shift mask ;------------------------------------------------------------------ ; disk translate tables here ;------------------------------------------------------------------ xstd: ;skew 26,6,1 ; standard skew db 1,7,0dh,13h,19h,05h,0bh,11h,17h,3,9,0fh,15h,2 db 8,0eh,14h,1ah,6,0ch,12h,18h,4,0ah,10h,16h ; xstd1: ;skew 26,6,27 db 1+26,7+26,0dh+26,13h+26,19h+26,05h+26,0bh+26,11h+26,17h+26 db 3+26,9+26,0fh+26,15h+26,2+26,8+26,0eh+26,14h+26,1ah+26,6+26 db 0ch+26,12h+26,18h+26,4+26,0ah+26,10h+26,16h+26 ; xlt2: ;skew 18,2,1 ; 256 skew 5" db 1,3,5,7,9,0bh,0dh,0fh,11h,2,4,6,8,0ah,0ch,0eh,10h,12h ; xlt21: ;skew 18,2,19 ; 256 side 2 5" db 1+18,3+18,5+18,7+18,9+18,0bh+18,0dh+18,0fh+18,11h+18,2+18 db 4+18,6+18,8+18,0ah+18,0ch+18,0eh+18,10h+18,12h+18 xlt3: ;skew 26,4,1 ; 8"-256 db 1,5,9,13,17,21,25 db 3,7,11,15,19,23 db 2,6,10,14,18,22,26 db 4,8,12,16,20,24 ; xlt31: ;skew 26,4,27 ; 8"-256 side 2 db 1+26,5+26,9+26,13+26,17+26,21+26,25+26 db 3+26,7+26,11+26,15+26,19+26,23+26 db 2+26,6+26,10+26,14+26,18+26,22+26,26+26 db 4+26,8+26,12+26,16+26,20+26,24+26 ; xlt4: ;skew 18,6,1 ; standard 5" db 1,7,0dh,2,8,0eh,3,9,0fh,4,0ah,10h,5,0bh,11h,6,0ch,12h ; xlt41: ;skew 18,6,19 ; standard 5" side 2 db 1+18,7+18,0dh+18,2+18,8+18,0eh+18,3+18,9+18,0fh+18,4+18 db 0ah+18,10h+18,5+18,0bh+18,11h+18,6+18,0ch+18,12h+18 ; ; if loader ; csv0: ds 64 alv0: ds 32 ; ; FLOPPY BCB'S ; drbcb0: db 0ffh ; drv db 0,0,0 ; rec# db 0 ; write flag db 0 ; sequence number dw 0 ; track number dw 0 ; sector number dw buff0 ; buff ad db 0 ; buffer bank dw 0 ; link dtbcb0: db 0ffh ; drv db 0,0,0 ; rec# db 0 ; write flag db 0 ; sequence number dw 0 ; track number dw 0 ; sector number dw buff1 ; buff ad db 0 ; buffer bank dw 0 ; link ; buff0: ds 256 buff1: ds 256 db 0 ; endif ; end