Mercurial > hg > Members > kono > nitros9-code
changeset 1907:638ffc04bbd0
Fixed incorrect calculation code for bitmap sectors
author | boisy |
---|---|
date | Sat, 05 Nov 2005 19:33:22 +0000 |
parents | 0382b69961f2 |
children | 695f74930c6f |
files | level1/cmds/format.asm |
diffstat | 1 files changed, 1754 insertions(+), 1747 deletions(-) [+] |
line wrap: on
line diff
--- a/level1/cmds/format.asm Thu Nov 03 01:39:13 2005 +0000 +++ b/level1/cmds/format.asm Sat Nov 05 19:33:22 2005 +0000 @@ -31,7 +31,7 @@ * Also, if a cluster size is not specified on the command line, * the best one is automatically calculated. * -* 2005-10-25 P.Harvey-Smith. +* 2005-10-25 P.Harvey-Smith. * Added support for formatting Dragon floppies, this is required because * dragon floppies are aranged thus :- * LSN Purpose @@ -48,7 +48,7 @@ * To format a floppy with dragon format, you need to use the command line * parameter 'FD' (format, Dragon). * -* 2005-10-26 P.Harvey-Smith +* 2005-10-26 P.Harvey-Smith * Determined the purpose and commented some of the unknown memory vars, * also renamed others to more closeley represent their purpose, e.g. * there where two 'cluster size' vars, one was inface number of bytes in @@ -57,1089 +57,1094 @@ * that can have (under OS-9) cobbler run on it, and will subsequently then * boot. * - - nam Format +* 25 2005-10-26 Boisy G. Pitre +* Fixed an issue where the bitmap sector wasn't being properly set up +* due to some incorrect assumptions. The result was that copying a file +* to a newly formatted hard drive would, in cases where the drive was +* large, wipe out the bitmap sector and root directory area. + + nam Format ttl RBF Disk format program - + * Disassembled 02/07/17 11:00:13 by Disasm v1.6 (C) 1988 by RML - - ifp1 - use defsfile - endc - -DOHELP set 0 -DOROLL set 0 - -tylg set Prgrm+Objct -atrv set ReEnt+rev -rev set $00 -edition set 24 - + + ifp1 + use defsfile + endc + +DOHELP set 0 +DOROLL set 0 + +tylg set Prgrm+Objct +atrv set ReEnt+rev +rev set $00 +edition set 25 + mod eom,name,tylg,atrv,start,size - + ******************************************************************** * begin our data area, starts on direct page ******************************************************************** - -savedu rmb 2 save the u register -totsects rmb 3 -tmpnum rmb 4 -sectmode rmb 1 -diskpath rmb 1 disk path number -currtrak rmb 2 current track on -currside rmb 2 -currsect rmb 1 current sector on -sectcount rmb 2 counted sectors -trk0data rmb 2 track 0 data pointer -trkdata rmb 2 track !0 data pointer -u000E rmb 2 -mfm rmb 1 denisity (double/single) -maxmfm rmb 1 -tpi rmb 1 -numsides rmb 1 -ncyls rmb 2 total number of cylinders -u0017 rmb 1 -u0018 rmb 1 -sectors rmb 2 total number of sectors -sectors0 rmb 2 total number of sectors -bps rmb 1 bytes per sector (returned from SS.DSize) -dtype rmb 1 disk device type (5", 8", hard disk) -dns rmb 1 density byte -sas rmb 1 density byte -ready rmb 1 ready to proceed, skip warning -dresult rmb 2 decimal number in binary -interlv rmb 1 sector interleave value -u0022 rmb 2 -clustsiz rmb 1 cluster size (specified or default) -clustspecified rmb 1 cluster size specified on command line -NumBitmapBytes rmb 2 Number of bytes in cluster allocation bitmap -u002A rmb 1 -clustcnt rmb 1 -NoRootFDSecs rmb 1 Number of sectors in Root FD (normally 8 ?) -NoSysSectors rmb 2 Number of Sectors at beginning of disk reserved for system -NoSysClusters rmb 1 Number of system Clusters to allocate -u0030 rmb 1 -u0031 rmb 1 -u0032 rmb 1 -u0033 rmb 1 -u0034 rmb 1 -u0035 rmb 1 -oksects rmb 3 -u0038 rmb 2 -u003A rmb 2 -u003C rmb 1 -u003D rmb 2 -u003F rmb 2 -u0041 rmb 2 -u0043 rmb 1 -u0044 rmb 1 -dovfy rmb 1 -dtentry rmb 2 -u0048 rmb 1 -toffs rmb 1 track offset (derived from PD.SToff) -soffs rmb 1 sector offset (derived from PD.SToff) -t0sngdns rmb 1 track 0 single density flag -cocofmt rmb 1 COCO disk format flag (1 = yes) -dolog rmb 1 logical format -prmbuf rmb 2 -u0051 rmb 4 -u0055 rmb 15 -u0064 rmb 7 -u006B rmb 4 -dskname rmb 32 quoted delimited disk name buffer -u008F rmb 40 -IsDragon rmb 1 Is this a dragon disk ? -SaveRootLSN rmb 3 Saved copy of DD.DIR -AddedSysSecs rmb 2 Additional system sectors (0 for CoCo, $10 for Dragon boot area) -LSN0 rmb 256 LSN0 build buffer -optbuf rmb 256 -numbuf rmb 32 -fdtbuf1 rmb 3 -fdtbuf2 rmb 9924 -u297E rmb 451 -size equ . - -name fcs /Format/ - fcb edition - + +savedu rmb 2 save the u register +totsects rmb 3 +tmpnum rmb 4 +sectmode rmb 1 +diskpath rmb 1 disk path number +currtrak rmb 2 current track on +currside rmb 2 +currsect rmb 1 current sector on +sectcount rmb 2 counted sectors +trk0data rmb 2 track 0 data pointer +trkdata rmb 2 track !0 data pointer +u000E rmb 2 +mfm rmb 1 denisity (double/single) +maxmfm rmb 1 +tpi rmb 1 +numsides rmb 1 +ncyls rmb 2 total number of cylinders +u0017 rmb 1 +u0018 rmb 1 +sectors rmb 2 total number of sectors +sectors0 rmb 2 total number of sectors +bps rmb 1 bytes per sector (returned from SS.DSize) +dtype rmb 1 disk device type (5", 8", hard disk) +dns rmb 1 density byte +sas rmb 1 density byte +ready rmb 1 ready to proceed, skip warning +dresult rmb 2 decimal number in binary +interlv rmb 1 sector interleave value +u0022 rmb 2 +clustsiz rmb 1 cluster size (specified or default) +clustspecified rmb 1 cluster size specified on command line +NumBitmapBytes rmb 2 Number of bytes in cluster allocation bitmap +u002A rmb 1 +clustcnt rmb 1 +NoRootFDSecs rmb 1 Number of sectors in Root FD (normally 8 ?) +NoSysSectors rmb 2 Number of Sectors at beginning of disk reserved for system +NoSysClusters rmb 2 Number of system Clusters to allocate +u0030 rmb 1 +u0031 rmb 1 +u0032 rmb 1 +u0033 rmb 1 +u0034 rmb 1 +u0035 rmb 1 +oksects rmb 3 +u0038 rmb 2 +u003A rmb 2 +u003C rmb 1 +u003D rmb 2 +u003F rmb 2 +u0041 rmb 2 +u0043 rmb 1 +u0044 rmb 1 +dovfy rmb 1 +dtentry rmb 2 +u0048 rmb 1 +toffs rmb 1 track offset (derived from PD.SToff) +soffs rmb 1 sector offset (derived from PD.SToff) +t0sngdns rmb 1 track 0 single density flag +cocofmt rmb 1 COCO disk format flag (1 = yes) +dolog rmb 1 logical format +prmbuf rmb 2 +u0051 rmb 4 +u0055 rmb 15 +u0064 rmb 7 +u006B rmb 4 +dskname rmb 32 quoted delimited disk name buffer +u008F rmb 40 +IsDragon rmb 1 Is this a dragon disk ? +SaveRootLSN rmb 3 Saved copy of DD.DIR +AddedSysSecs rmb 2 Additional system sectors (0 for CoCo, $10 for Dragon boot area) +LSN0 rmb 256 LSN0 build buffer +optbuf rmb 256 +numbuf rmb 32 +fdtbuf1 rmb 3 +fdtbuf2 rmb 9924 +u297E rmb 451 +size equ . + +name fcs /Format/ + fcb edition + *val1 fdb $0000 *val2 fdb $0000 *val3 fdb $0000 - + * Hard drive sector data: 128 bytes of $E5, and another 128 bytes of $E5 hdsdat fdb $80E5,$80E5,$0000 - + * Single Density Floppy Track Data sgtdat fdb $0100,$28FF,$0600,$01FC,$0CFF,$0000 * Single Density Sector Data sgsdat fdb $0600,$01FE,$0400,$01F7,$0AFF,$0600 fdb $01FB,$80E5,$80E5,$01F7,$0AFF,$0000 - fcb $FF -sgfidp fdb $0043 -sgsize fdb $0128 - + fcb $FF +sgfidp fdb $0043 +sgsize fdb $0128 + * Double Density Floppy Track Data dbtdat fdb $504E,$0C00,$03F6,$01FC,$204E,$0000 * Double Density Sector Data dbsdat fdb $0C00,$03F5,$01FE,$0400,$01F7,$164E fdb $0C00,$03F5,$01FB,$80E5,$80E5,$01F7 fdb $164E,$0000 - fcb $4E -dbfidp fdb $0090 -dbsize fdb $0152 - + fcb $4E +dbfidp fdb $0090 +dbsize fdb $0152 + * Double Density Color Computer Format dctdat fdb $204E,$0000,$0C00,$03F5,$01FE,$0400 fdb $01F7,$164E,$0C00,$03F5,$01FB,$80E5 fdb $80E5,$01F7,$184E,$0000 - fcb $4E -dcfidp fdb $0030 -dcsize fdb $0154 - -DragonFlag equ 'd' Flag that we are formatting dragon formatted disk. -DragonRootSec equ $12 Dragon root sector is always LSN 18 -DragonBootSize equ $10 Size of dragon boot area - + fcb $4E +dcfidp fdb $0030 +dcsize fdb $0154 + +DragonFlag equ 'd' Flag that we are formatting dragon formatted disk. +DragonRootSec equ $12 Dragon root sector is always LSN 18 +DragonBootSize equ $10 Size of dragon boot area + ******************************************************************** * format module execution start address ******************************************************************** - -start stu <savedu save our data pointer - bsr ClrWork clear the work area - bsr OpenDev get device name and open it - lbsr Default handle all the options - lbsr GetDTyp initialize the device - lbsr Proceed - lbsr Format physically format device - lbsr InitLSN0 initialize LSN0 - lbsr ReadLSN0 attempt to read back LSN0 - lbsr Stamps - lbsr MkRootFD file descriptor - ldu <dtentry device table entry - os9 I$Detach detach the device - clrb flag no error -Exit os9 F$Exit exit module - + +start stu <savedu save our data pointer + bsr ClrWork clear the work area + bsr OpenDev get device name and open it + lbsr Default handle all the options + lbsr GetDTyp initialize the device + lbsr Proceed + lbsr Format physically format device + lbsr InitLSN0 initialize LSN0 + lbsr ReadLSN0 attempt to read back LSN0 + lbsr MkBMap make bitmap sectors + lbsr MkRootFD file descriptor + ldu <dtentry device table entry + os9 I$Detach detach the device + clrb flag no error +Exit os9 F$Exit exit module + ******************************************************************** * clear our working memory area ******************************************************************** - -ClrWork leay diskpath,u point to work area - pshs y save that - leay >LSN0,u get size of area -ClrOne clr ,-y clear it down - cmpy ,s at begin? - bhi ClrOne not yet, - clr IsDragon,u Assume we are not formatting a dragon disk - clr AddedSysSecs,u Clear aditional system sectors - clr AddedSysSecs+1,u - puls pc,y done - + +ClrWork leay diskpath,u point to work area + pshs y save that + leay >LSN0,u get size of area +ClrOne clr ,-y clear it down + cmpy ,s at begin? + bhi ClrOne not yet, + clr IsDragon,u Assume we are not formatting a dragon disk + clr AddedSysSecs,u Clear aditional system sectors + clr AddedSysSecs+1,u + puls pc,y done + ******************************************************************** * get rbf device name and open it ******************************************************************** - -OpenDev lda ,x+ get char at X - cmpa #PDELIM pathlist delimiter? - beq PrsPrm branch if so -BadPath ldb #E$BPNam else set bad pathname - lbra PrtError and print error -PrsPrm os9 F$PrsNam parse pathname - lbcs PrtError branch if illegal (has additional pathlist element) - lda #PDELIM get pathlist name separator - cmpa ,y another pathlist separator? - beq BadPath yes, set bad pathname - sty <u0022 no, save end of pathname - leay <prmbuf,u point to pathname buffer -MovNam sta ,y+ save pathname character - lda ,x+ get next pathname character - decb decrement pathname size - bpl MovNam got full pathname? - leax <prmbuf+1,u get pathname for I$Attach - lda #C$SPAC space character - sta ,y delimit pathname - clra get access mode - os9 I$Attach attach the rbf device - lbcs PrtError if error print error and exit - stu <dtentry save device table entry - ldu <savedu get data pointer - lda #PENTIR delimit pathname - ldb #C$SPAC for os9 I$Open - std ,y do it now - lda #WRITE. get access mode - leax <prmbuf,u get pathname - os9 I$Open open the rbf device - bcs Exit exit if could not open it - sta <diskpath save path number - rts return - + +OpenDev lda ,x+ get char at X + cmpa #PDELIM pathlist delimiter? + beq PrsPrm branch if so +BadPath ldb #E$BPNam else set bad pathname + lbra PrtError and print error +PrsPrm os9 F$PrsNam parse pathname + lbcs PrtError branch if illegal (has additional pathlist element) + lda #PDELIM get pathlist name separator + cmpa ,y another pathlist separator? + beq BadPath yes, set bad pathname + sty <u0022 no, save end of pathname + leay <prmbuf,u point to pathname buffer +MovNam sta ,y+ save pathname character + lda ,x+ get next pathname character + decb decrement pathname size + bpl MovNam got full pathname? + leax <prmbuf+1,u get pathname for I$Attach + lda #C$SPAC space character + sta ,y delimit pathname + clra get access mode + os9 I$Attach attach the rbf device + lbcs PrtError if error print error and exit + stu <dtentry save device table entry + ldu <savedu get data pointer + lda #PENTIR delimit pathname + ldb #C$SPAC for os9 I$Open + std ,y do it now + lda #WRITE. get access mode + leax <prmbuf,u get pathname + os9 I$Open open the rbf device + bcs Exit exit if could not open it + sta <diskpath save path number + rts return + ******************************************************************** * get geometry and options, proceed (Y/N) ******************************************************************** - -Default bsr Geometry - lbsr DoOpts + +Default bsr Geometry + lbsr DoOpts * lbsr Proceed - rts - + rts + ******************************************************************** * get rbf device geometry ******************************************************************** - + ssztbl fcb $1,$2,$4,$8 - -Geometry leax >optbuf,u status packet address - clrb SS.OPT function - os9 I$GetStt get status packet - bcs Exit exit if error - ldb PD.SID-PD.OPT,x number of surfaces - stb <numsides save it + +Geometry leax >optbuf,u status packet address + clrb SS.OPT function + os9 I$GetStt get status packet + bcs Exit exit if error + ldb PD.SID-PD.OPT,x number of surfaces + stb <numsides save it ldb PD.SToff-PD.OPT,x get track/sector offset values - beq L0143 branch if they are zero - tfr b,a yes, make copy - anda #$0F isolate track offset (lower 4 bits) - sta <toffs save it - lsrb - lsrb - lsrb - lsrb isolate sector offset - stb <soffs save it -L0143 ldb PD.DNS-PD.OPT,x density capability - stb <dns + beq L0143 branch if they are zero + tfr b,a yes, make copy + anda #$0F isolate track offset (lower 4 bits) + sta <toffs save it + lsrb + lsrb + lsrb + lsrb isolate sector offset + stb <soffs save it +L0143 ldb PD.DNS-PD.OPT,x density capability + stb <dns * pshs b save it - andb #DNS.MFM check double-density - stb <mfm save double-density (Yes/No) - stb <maxmfm save it again as maximum mfm - ldb <dns get saved PD.DNS byte - lsrb now 96 TPI bit is in bit pos 0 - pshs b save it - andb #$01 tpi (0=48/135, 1=96) - stb <tpi save it - puls b get byte with bit shifted right once - lsrb shift original bit #2 into bit #0 - andb <maxmfm AND with mfm bit (1 = MFM, 0 = FM) - stb <t0sngdns save as track 0 single density flag + andb #DNS.MFM check double-density + stb <mfm save double-density (Yes/No) + stb <maxmfm save it again as maximum mfm + ldb <dns get saved PD.DNS byte + lsrb now 96 TPI bit is in bit pos 0 + pshs b save it + andb #$01 tpi (0=48/135, 1=96) + stb <tpi save it + puls b get byte with bit shifted right once + lsrb shift original bit #2 into bit #0 + andb <maxmfm AND with mfm bit (1 = MFM, 0 = FM) + stb <t0sngdns save as track 0 single density flag * puls b get original PD.DNS byte * NOTE: We check the TYP.CCF at this point - ldb PD.TYP-PD.OPT,x disk device type - stb <dtype - andb #TYP.CCF - stb <cocofmt store it - beq L0169 branch if not CoCo format - ldb #$01 - stb <soffs CoCo has a sector offset of 1 - clr <toffs and no track offset -L0169 ldd PD.CYL-PD.OPT,x number of cylinders - std <ncyls save it + ldb PD.TYP-PD.OPT,x disk device type + stb <dtype + andb #TYP.CCF + stb <cocofmt store it + beq L0169 branch if not CoCo format + ldb #$01 + stb <soffs CoCo has a sector offset of 1 + clr <toffs and no track offset +L0169 ldd PD.CYL-PD.OPT,x number of cylinders + std <ncyls save it * ldb PD.TYP-PD.OPT,x disk device type - ldb <dtype get IT.TYP byte - andb #TYPH.SSM mask out all but sector size + ldb <dtype get IT.TYP byte + andb #TYPH.SSM mask out all but sector size leay ssztbl,pcr - ldb b,y - stb <bps and save bytes per sector - ldd PD.SCT-PD.OPT,x default sectors/track - std <sectors save it - ldd PD.T0S-PD.OPT,x default sectors/track tr00,s0 - std <sectors0 save it - ldb PD.ILV-PD.OPT,x sector interleave offset - stb <interlv save it - ldb PD.SAS-PD.OPT,x minimum sector allocation - stb <sas save it - ldb #$01 default cluster size - stb <clustsiz save it - stb <sectmode and sector mode + ldb b,y + stb <bps and save bytes per sector + ldd PD.SCT-PD.OPT,x default sectors/track + std <sectors save it + ldd PD.T0S-PD.OPT,x default sectors/track tr00,s0 + std <sectors0 save it + ldb PD.ILV-PD.OPT,x sector interleave offset + stb <interlv save it + ldb PD.SAS-PD.OPT,x minimum sector allocation + stb <sas save it + ldb #$01 default cluster size + stb <clustsiz save it + stb <sectmode and sector mode *** ADDED CODE -- BGP. CHECK FOR PRESENCE OF SS.DSIZE - lda <dtype get type byte - bita #TYPH.DSQ drive size query bit set? - beq nogo@ no, don't bother querying the drive for its size - lda <diskpath get disk path number - ldb #SS.DSize disk size getstat - os9 I$GetStt attempt - bcs err@ - sta <bps save bytes/sector - stb <sectmode - tstb LBA mode? - bne chs@ - tfr x,d - stb <totsects save result... + lda <dtype get type byte + bita #TYPH.DSQ drive size query bit set? + beq nogo@ no, don't bother querying the drive for its size + lda <diskpath get disk path number + ldb #SS.DSize disk size getstat + os9 I$GetStt attempt + bcs err@ + sta <bps save bytes/sector + stb <sectmode + tstb LBA mode? + bne chs@ + tfr x,d + stb <totsects save result... sty <totsects+1 - bra nogo@ -chs@ - stx <ncyls save cylinders - stb <numsides save sides - sty <sectors save sectors/track - sty <sectors0 save sectors/track 0 -nogo@ - clrb no error - rts return -err@ pshs b + bra nogo@ +chs@ + stx <ncyls save cylinders + stb <numsides save sides + sty <sectors save sectors/track + sty <sectors0 save sectors/track 0 +nogo@ + clrb no error + rts return +err@ pshs b leax CapErr,pcr - lda #$02 - ldy #100 - os9 I$WritLn - puls b - lbra PrtError - + lda #$02 + ldy #100 + os9 I$WritLn + puls b + lbra PrtError + ******************************************************************** * find a option and call, until all options are processed ******************************************************************** - -DoOpts ldx <u0022 option buffer -L0185 leay >OptTbl,pcr point to table - bsr L019C check for match? - bcs L01A5 no, match - pshs b,a save d register - ldd $02,y get offset value - leay d,y make function address - puls b,a restore d register - jsr ,y call function - bcc L0185 finished good? - lbra Exit no, exit -L019C lda ,x+ get option character -L019E cmpa ,y is it in the table? - bne L01A6 no, try the next one - ldb $01,y get return value - clra flag good -L01A5 rts return -L01A6 leay $04,y get next table location - tst ,y is it the end of the table? - bne L019E no, try next location - coma yes, flag bad - rts return - + +DoOpts ldx <u0022 option buffer +L0185 leay >OptTbl,pcr point to table + bsr L019C check for match? + bcs L01A5 no, match + pshs b,a save d register + ldd $02,y get offset value + leay d,y make function address + puls b,a restore d register + jsr ,y call function + bcc L0185 finished good? + lbra Exit no, exit +L019C lda ,x+ get option character +L019E cmpa ,y is it in the table? + bne L01A6 no, try the next one + ldb $01,y get return value + clra flag good +L01A5 rts return +L01A6 leay $04,y get next table location + tst ,y is it the end of the table? + bne L019E no, try next location + coma yes, flag bad + rts return + ******************************************************************** * option command table ******************************************************************** - -OptTbl -opt.1 fcc /R/ - fcc /Y/ + +OptTbl +opt.1 fcc /R/ + fcc /Y/ fdb DoReady-opt.1 -opt.2 fcc /r/ - fcc /Y/ +opt.2 fcc /r/ + fcc /Y/ fdb DoReady-opt.2 -opt.3 fcc /S/ - fcc / / +opt.3 fcc /S/ + fcc / / fdb DoDsity-opt.3 -opt.4 fcc /s/ - fcc / / +opt.4 fcc /s/ + fcc / / fdb DoDsity-opt.4 -opt.5 fcc /D/ - fcc /M/ +opt.5 fcc /D/ + fcc /M/ fdb DoDsity-opt.5 -opt.6 fcc /d/ - fcc /M/ +opt.6 fcc /d/ + fcc /M/ fdb DoDsity-opt.6 -opt.7 fcc /"/ - fcb $00 +opt.7 fcc /"/ + fcb $00 fdb DoQuote-opt.7 -opt.8 fcc /:/ - fcb $00 +opt.8 fcc /:/ + fcb $00 fdb DoColon-opt.8 -opt.9 fcc "/" - fcb $00 +opt.9 fcc "/" + fcb $00 fdb DoClust-opt.9 -opt.10 fcc /1/ - fcb $01 +opt.10 fcc /1/ + fcb $01 fdb Do1-opt.10 -opt.11 fcc /2/ - fcb $02 +opt.11 fcc /2/ + fcb $02 fdb Do2-opt.11 -opt.12 fcc /'/ - fcb 0 +opt.12 fcc /'/ + fcb 0 fdb DoSQuote-opt.12 -opt.13 fcc /L/ - fcb $01 +opt.13 fcc /L/ + fcb $01 fdb DoL-opt.13 -opt.14 fcc /l/ - fcb 01 +opt.14 fcc /l/ + fcb 01 fdb DoL-opt.14 -opt.15 fcc /(/ - fcb $00 +opt.15 fcc /(/ + fcb $00 fdb DoLParen-opt.15 -opt.16 fcc /)/ - fcb $00 +opt.16 fcc /)/ + fcb $00 fdb DoRParen-opt.16 -opt.17 fcc /,/ - fcb $00 +opt.17 fcc /,/ + fcb $00 fdb DoComa-opt.17 -opt.18 fcb C$SPAC - fcb 00 +opt.18 fcb C$SPAC + fcb 00 fdb DoSpace-opt.18 - -opt.19 fcb 'F' - fcb ' ' - fdb DoFormat-opt.19 -opt.20 fcb 'f' - fcb ' ' - fdb DoFormat-opt.20 - - - fcb $00 - + +opt.19 fcb 'F' + fcb ' ' + fdb DoFormat-opt.19 +opt.20 fcb 'f' + fcb ' ' + fdb DoFormat-opt.20 + + + fcb $00 + ******************************************************************** * S/D - density; single or double ******************************************************************** - -DoDsity cmpb <maxmfm compare against maximum - bgt OptAbort if greater than, abort - cmpb <t0sngdns - blt OptAbort - stb <mfm - clrb - + +DoDsity cmpb <maxmfm compare against maximum + bgt OptAbort if greater than, abort + cmpb <t0sngdns + blt OptAbort + stb <mfm + clrb + ******************************************************************** * skip white space ******************************************************************** - -DoComa -DoRParen -DoLParen -DoSpace rts - + +DoComa +DoRParen +DoLParen +DoSpace rts + ******************************************************************** * set ready flag - skip warn messages ******************************************************************** - -DoReady stb <ready set and save ready - rts return - + +DoReady stb <ready set and save ready + rts return + ******************************************************************** * 1/2 - number of sides ******************************************************************** - -Do2 -Do1 cmpb <numsides - bgt OptAbort - stb <numsides - clrb - rts - + +Do2 +Do1 cmpb <numsides + bgt OptAbort + stb <numsides + clrb + rts + ******************************************************************** * only do a logical format on the rbf device ******************************************************************** - -DoL stb <dolog do a logical format - clrb did option - rts return - + +DoL stb <dolog do a logical format + clrb did option + rts return + ******************************************************************** * not a option - show abort message and exit ******************************************************************** - -OptAbort leax >AbortOp,pcr Option not allowed message - lbra PExit print message and exit - + +OptAbort leax >AbortOp,pcr Option not allowed message + lbra PExit print message and exit + ******************************************************************** * double quoted option "disk name" save name in dskname ******************************************************************** - -DoQuote leay <dskname,u delimited buffer - ldb #C$SPAC delimited size -koQuote lda ,x+ delimited character - cmpa #'" is end quote? - beq L0221 must be done - sta ,y+ no, save character - decb decrement name size - bne KoQuote get all 32 of them or quote -L0215 ldb ,x+ next delimited character - cmpb #'" find end quote? - beq L0227 yes, back up and mark it - cmpb #C$SPAC skip space character? - bcc L0215 yes, get next one - bra L0227 no, mark it's end -L0221 lda #C$SPAC get space character - cmpb #C$SPAC any delimited characters? - beq L022B no, mark it's end -L0227 leay -$01,y yes, back up - lda ,y get saved character -L022B adda #$80 make it negative - sta ,y mark it's end - clrb did option - rts return - + +DoQuote leay <dskname,u delimited buffer + ldb #C$SPAC delimited size +koQuote lda ,x+ delimited character + cmpa #'" is end quote? + beq L0221 must be done + sta ,y+ no, save character + decb decrement name size + bne KoQuote get all 32 of them or quote +L0215 ldb ,x+ next delimited character + cmpb #'" find end quote? + beq L0227 yes, back up and mark it + cmpb #C$SPAC skip space character? + bcc L0215 yes, get next one + bra L0227 no, mark it's end +L0221 lda #C$SPAC get space character + cmpb #C$SPAC any delimited characters? + beq L022B no, mark it's end +L0227 leay -$01,y yes, back up + lda ,y get saved character +L022B adda #$80 make it negative + sta ,y mark it's end + clrb did option + rts return + ******************************************************************** * single quoted option 'number of cylinders' save number in ncyls ******************************************************************** - -DoSQuote lbsr Decimal procces number of cylinders - ldd <dresult get it - std <ncyls save it - rts return - + +DoSQuote lbsr Decimal procces number of cylinders + ldd <dresult get it + std <ncyls save it + rts return + ******************************************************************** * colon quoted option :interleave value: save value in interlv ******************************************************************** - -DoColon lbsr Decimal proccess interleave value - ldd <dresult get it - tsta answer out of bounds? - beq L0243 no, save it - ldb #$01 yes, default size -L0243 stb <interlv save it - rts return - + +DoColon lbsr Decimal proccess interleave value + ldd <dresult get it + tsta answer out of bounds? + beq L0243 no, save it + ldb #$01 yes, default size +L0243 stb <interlv save it + rts return + ******************************************************************** * Format option : formatting a CoCo or a Dragon disk ? ******************************************************************** - -DoFormat - lda ,x+ Get next char - cmpa #'D' Do a dragon disk ? - beq DoFmtDragon - cmpa #'d' - bne DoFmtDragon - clr IsDragon,u Mark it as a normal CoCo (or other) disk - clrb - rts - -DoFmtDragon - lda #DragonFlag Mark as Dragon disk - sta IsDragon,u - - ldd #DragonBootSize Setup additional system sectors - std AddedSysSecs,u - - clrb - rts - + +DoFormat + lda ,x+ Get next char + cmpa #'D' Do a dragon disk ? + beq DoFmtDragon + cmpa #'d' + bne DoFmtDragon + clr IsDragon,u Mark it as a normal CoCo (or other) disk + clrb + rts + +DoFmtDragon + lda #DragonFlag Mark as Dragon disk + sta IsDragon,u + + ldd #DragonBootSize Setup additional system sectors + std AddedSysSecs,u + + clrb + rts + ******************************************************************** * quoted option /cluster size/ save size in clustsiz * cluster size is in decimal. The number of sectors * in a cluster must be a power of 2 and the number * should max out at 32 for coco os9 ******************************************************************** - -DoClust lbsr Decimal proccess cluster size - ldd <dresult get it - tsta answer out of bounds? - beq L0250 no, save it - ldb #$01 yes, default size -L0250 stb <clustsiz save it - stb <clustspecified save fact that cluster was specified - negb get two's complement - decb power of 2 - andb <clustsiz in range? - beq L025C yes, skip ahead - ldb #$01 no, default size - stb <clustsiz save it -L025C clrb did option -L025D rts return - + +DoClust lbsr Decimal proccess cluster size + ldd <dresult get it + tsta answer out of bounds? + beq L0250 no, save it + ldb #$01 yes, default size +L0250 stb <clustsiz save it + stb <clustspecified save fact that cluster was specified + negb get two's complement + decb power of 2 + andb <clustsiz in range? + beq L025C yes, skip ahead + ldb #$01 no, default size + stb <clustsiz save it +L025C clrb did option +L025D rts return + ******************************************************************** * print title, format (Y/N), and get response ******************************************************************** - -Proceed + +Proceed * leax >Title,pcr coco formatter message * lbsr PrintLn print it - tst <dtype disk type... - bmi h@ + tst <dtype disk type... + bmi h@ lbsr FloppySummary - bra n@ -h@ lbsr HDSummary -n@ leay >optbuf,u point to option buffer - ldx PD.T0S-PD.OPT,y default sectors/track tr00,s0 - tst <mfm double-density? - beq L0271 no, - ldx PD.SCT-PD.OPT,y default sectors/track -L0271 stx <sectors save it - lbsr LineFD - leax >FmtMsg,pcr formatting drive message - ldy #FmtMLen length of message - lbsr Print print it - leax <prmbuf,u input buffer - tfr x,y put it in y -L0283 lda ,y+ get input - cmpa #PENTIR proceed (y/n)? - bne L0283 no, wait for yes - pshs y save input pointer - lda #C$CR carriage return - sta -$01,y store it over input - lbsr PrintLn print line - puls y get pointer - lda #PENTIR - sta -$01,y - lda <ready ok to proceed? ready - bne L02BC yes, were ready skip ahead + bra n@ +h@ lbsr HDSummary +n@ leay >optbuf,u point to option buffer + ldx PD.T0S-PD.OPT,y default sectors/track tr00,s0 + tst <mfm double-density? + beq L0271 no, + ldx PD.SCT-PD.OPT,y default sectors/track +L0271 stx <sectors save it + lbsr LineFD + leax >FmtMsg,pcr formatting drive message + ldy #FmtMLen length of message + lbsr Print print it + leax <prmbuf,u input buffer + tfr x,y put it in y +L0283 lda ,y+ get input + cmpa #PENTIR proceed (y/n)? + bne L0283 no, wait for yes + pshs y save input pointer + lda #C$CR carriage return + sta -$01,y store it over input + lbsr PrintLn print line + puls y get pointer + lda #PENTIR + sta -$01,y + lda <ready ok to proceed? ready + bne L02BC yes, were ready skip ahead * tst <dtype is this a floppy or hard drive? * bpl L02AB it is a floppy * leax >HDFmt,pcr it is a hard drive * ldy #$002A length of message * lbsr Print print message -L02AB leax >Query,pcr query message - ldy #QueryLen length of message - lbsr Input show it and get response (Y/N) - anda #$DF make it upper case - cmpa #'Y answered yes? - bne L02D5 no, check for no? -L02BC tst <dtype formatting hard drive? - bpl L025D no, return skip hard disk warn message - leax >HDFmt,pcr show hard disk warn message - ldy #HDFmtLen size of the message - lbsr Input show it and get response (Y/N) - anda #$DF make it upper case - cmpa #'Y answered yes? - beq L025D yes, return - clrb clear error - lbra Exit exit -L02D5 clrb clear error - cmpa #'N answered no? - lbeq Exit yes, exit - bra L02AB no, get a (Y/N) answer - +L02AB leax >Query,pcr query message + ldy #QueryLen length of message + lbsr Input show it and get response (Y/N) + anda #$DF make it upper case + cmpa #'Y answered yes? + bne L02D5 no, check for no? +L02BC tst <dtype formatting hard drive? + bpl L025D no, return skip hard disk warn message + leax >HDFmt,pcr show hard disk warn message + ldy #HDFmtLen size of the message + lbsr Input show it and get response (Y/N) + anda #$DF make it upper case + cmpa #'Y answered yes? + beq L025D yes, return + clrb clear error + lbra Exit exit +L02D5 clrb clear error + cmpa #'N answered no? + lbeq Exit yes, exit + bra L02AB no, get a (Y/N) answer + ******************************************************************** * print usage message and return ******************************************************************** - -LineFD leax >CrRtn,pcr point to line feed -PrintLn ldy #80 size of message -Print lda #$01 standard output path - os9 I$WritLn print line - rts return - + +LineFD leax >CrRtn,pcr point to line feed +PrintLn ldy #80 size of message +Print lda #$01 standard output path + os9 I$WritLn print line + rts return + ******************************************************************** * print message and get response * entry: x holds data address y holds data size * exit: a holds response (ascii character) ******************************************************************** - -Input pshs u,y,x,b,a save registers - bsr Print print line - leax ,s get data address - ldy #$0001 data size - clra standard input - os9 I$Read read it - lbcs Exit exit on error - bsr LineFD print line feed - puls u,y,x,b,a restore stack - anda #$7F make it ascii - rts return - + +Input pshs u,y,x,b,a save registers + bsr Print print line + leax ,s get data address + ldy #$0001 data size + clra standard input + os9 I$Read read it + lbcs Exit exit on error + bsr LineFD print line feed + puls u,y,x,b,a restore stack + anda #$7F make it ascii + rts return + ******************************************************************** * get capability of the rbf device ******************************************************************** - -GetDTyp leax >hdsdat,pcr assume hard drive data for now - stx <trk0data sector data pointer - ldb <dtype get disk drive type + +GetDTyp leax >hdsdat,pcr assume hard drive data for now + stx <trk0data sector data pointer + ldb <dtype get disk drive type bitb #TYP.HARD+TYP.NSF hard disk or non-standard type? - bne L0323 yes, branch - tst <cocofmt is this a COCO formatted disk? - beq L031B branch if not - leax >dctdat,pcr point to COCO track data - bra L032D -L031B leax >sgtdat,pcr point to single density track data - tst <mfm double-density? - beq L032D no, save off X -L0323 stx <trk0data + bne L0323 yes, branch + tst <cocofmt is this a COCO formatted disk? + beq L031B branch if not + leax >dctdat,pcr point to COCO track data + bra L032D +L031B leax >sgtdat,pcr point to single density track data + tst <mfm double-density? + beq L032D no, save off X +L0323 stx <trk0data leax >dbtdat,pcr - tst <t0sngdns track 0 is single density? - beq L032F branch if so -L032D stx <trk0data save as track 0 data -L032F stx <trkdata and !0 track data - tst <sectmode LBA values already in place? - beq ack@ + tst <t0sngdns track 0 is single density? + beq L032F branch if so +L032D stx <trk0data save as track 0 data +L032F stx <trkdata and !0 track data + tst <sectmode LBA values already in place? + beq ack@ * Compute total sectors from C/H/S - clra - ldb <numsides get number of sides - tfr d,y - clrb D = 0 - ldx <ncyls - bsr Mulbxty multiply B,X*Y + clra + ldb <numsides get number of sides + tfr d,y + clrb D = 0 + ldx <ncyls + bsr Mulbxty multiply B,X*Y * B,X now is numsides * numcyls * Subtract one from B,X because t0s will be added later - exg d,x - subd #$0001 - bcc L0344 - leax -$01,x -L0344 exg d,x - ldy <sectors - bsr Mulbxty multiply B,X*Y + exg d,x + subd #$0001 + bcc L0344 + leax -$01,x +L0344 exg d,x + ldy <sectors + bsr Mulbxty multiply B,X*Y * B,X now is numsides * numcyls * sectors - exg d,x + exg d,x * Add in sectors/track0 - addd <sectors0 + addd <sectors0 std <totsects+1 - exg d,x - adcb #$00 - stb <totsects -ack@ - lda <dtype get type byte - bita #TYPH.DSQ drive size query bit set? - beq mlex branch if so (we don't take bps into account here) + exg d,x + adcb #$00 + stb <totsects +ack@ + lda <dtype get type byte + bita #TYPH.DSQ drive size query bit set? + beq mlex branch if so (we don't take bps into account here) **** We now multiply totsects * the bytes per sector - dec <bps decrement bytes per sector (8=7,4=3,2=1,1=0) - beq mlex exit out ofloop if zero -ml@ lsl <totsects+2 else multiply by 2 + dec <bps decrement bytes per sector (8=7,4=3,2=1,1=0) + beq mlex exit out ofloop if zero +ml@ lsl <totsects+2 else multiply by 2 rol <totsects+1 - rol <totsects - lsr <bps shift out bits - tst <bps - bne ml@ - + rol <totsects + lsr <bps shift out bits + tst <bps + bne ml@ + ************************************************ * Calculates the correct cluster size & size of bitmap in bytes - -mlex lda #$08 - pshs a - ldx <totsects+1 - ldb <totsects - bsr Div24by8 divide totsects by 8 - lda <clustsiz get current cluster size - pshs a save it as divisor - bsr Div24by8 - tstb B = 0? (more than $FFFF bytes required ?) - beq L0374 branch if so - + +mlex lda #$08 + pshs a + ldx <totsects+1 + ldb <totsects + bsr Div24by8 divide totsects by 8 + lda <clustsiz get current cluster size + pshs a save it as divisor + bsr Div24by8 + tstb B = 0? (more than $FFFF bytes required ?) + beq L0374 branch if so + * Too small a cluster size comes here - tst <clustspecified did user specify cluster on command line? - bne u@ branch if so (show error message) - lsl <clustsiz multiply by 2 - bcs u@ if carry set to stop - leas 2,s else eat stack - bra mlex and continue trying -u@ leax >ClustMsg,pcr cluster size mismatch message - lbsr PrintLn print mismatch message - lbra L05B1 abort message and exit -L0374 leas $02,s - stx <NumBitmapBytes Save Size of bitmap in bytes - rts return - + tst <clustspecified did user specify cluster on command line? + bne u@ branch if so (show error message) + lsl <clustsiz multiply by 2 + bcs u@ if carry set to stop + leas 2,s else eat stack + bra mlex and continue trying +u@ leax >ClustMsg,pcr cluster size mismatch message + lbsr PrintLn print mismatch message + lbra L05B1 abort message and exit +L0374 leas $02,s + stx <NumBitmapBytes Save Size of bitmap in bytes + rts return + ******************************************************************** * multiply (mlbxty B:X * Y) ******************************************************************** - -Mulbxty lda #$08 make stack space -MulClr clr ,-s clear the space - deca cleared? - bne MulClr no, - sty ,s - stb $02,s - stx $03,s -MulLoop ldd ,s we done? - beq MulZer yes, clean up - lsra - rorb - std ,s - bcc MulNoC - ldd $03,s - addd $06,s - std $06,s - lda $02,s - adca $05,s - sta $05,s -MulNoC ldd $03,s - lslb - rola - std $03,s - lda $02,s - rola - sta $02,s - bra MulLoop continue rest -MulZer leas $05,s clean up space - puls pc,x,b pop results, return - + +Mulbxty lda #$08 make stack space +MulClr clr ,-s clear the space + deca cleared? + bne MulClr no, + sty ,s + stb $02,s + stx $03,s +MulLoop ldd ,s we done? + beq MulZer yes, clean up + lsra + rorb + std ,s + bcc MulNoC + ldd $03,s + addd $06,s + std $06,s + lda $02,s + adca $05,s + sta $05,s +MulNoC ldd $03,s + lslb + rola + std $03,s + lda $02,s + rola + sta $02,s + bra MulLoop continue rest +MulZer leas $05,s clean up space + puls pc,x,b pop results, return + ******************************************************************** * 24 bit divide (2,s = divisor, B:X = dividend, result in B:X) ******************************************************************** - -L03AE pshs x,b save X,B on stack - lsr ,s divide B:X by 2 - ror $01,s - ror $02,s - puls x,b retrieve B:X - exg d,x exchange bits 15-0 in D,X - adcb #$00 - adca #$00 - exg d,x - adcb #$00 -Div24by8 lsr $02,s - bne L03AE - rts - + +L03AE pshs x,b save X,B on stack + lsr ,s divide B:X by 2 + ror $01,s + ror $02,s + puls x,b retrieve B:X + exg d,x exchange bits 15-0 in D,X + adcb #$00 + adca #$00 + exg d,x + adcb #$00 +Div24by8 lsr $02,s + bne L03AE + rts + ******************************************************************** * format rbf device ******************************************************************** - -Format tst <dolog doing a logical format? - bne L03E4 yes, don't do this then - tst <dtype test for hard drive from PD.TYP - bpl L03E5 branch if floppy - leax >Both,pcr PHYSICAL and LOGICAL? message - ldy #BothLen length of message - lbsr Input print and get input - anda #$DF make it upper case - cmpa #'Y is it yes? - beq L03E5 yes, - cmpa #'N is it no? - bne Format no, -L03E4 rts return -L03E5 lda <diskpath device path number - ldb #SS.Reset reset device - os9 I$SetStt at track zero - lbcs Exit exit if error - ldd #$0000 get current track - std <currtrak save it - inca get current sector - sta <currsect save it -L03F8 clr <currside clear current side -L03FA bsr L045C - leax >LSN0,u point to our LSN0 buffer - ldd <currtrak - addd <u0048 - tfr d,u - clrb - tst <cocofmt do we format this as a COCO disk? - bne L041B branch if so - tst <mfm single density? - beq L041D branch if so - tst <t0sngdns track 0 single density? - bne L041B branch if not - tst <currtrak+1 is current track 0? - bne L041B branch if not - tst <currside side is zero? - beq L041D branch if 0 -L041B orb #$02 else set side 1 -L041D tst <tpi 48 tpi? - beq L0423 branch if so - orb #$04 else set 96 tpi bit -L0423 lda <currside get current side - beq L0429 branch if 0 - orb #$01 -L0429 tfr d,y get side/density bits - lda <diskpath rbf device path number - ldb #SS.WTrk format (write) track - os9 I$SetStt do format it - lbcs Exit exit if error - ldu <savedu get u pointer - ldb <currside get current side - incb increment - stb <currside and store - cmpb <numsides compare against number of sides - bcs L03FA branch if greater than - ldd <currtrak get current track - addd #$0001 increment it - std <currtrak save it - cmpd <ncyls did all tracks? - bcs L03F8 no, - rts yes, return - + +Format tst <dolog doing a logical format? + bne L03E4 yes, don't do this then + tst <dtype test for hard drive from PD.TYP + bpl L03E5 branch if floppy + leax >Both,pcr PHYSICAL and LOGICAL? message + ldy #BothLen length of message + lbsr Input print and get input + anda #$DF make it upper case + cmpa #'Y is it yes? + beq L03E5 yes, + cmpa #'N is it no? + bne Format no, +L03E4 rts return +L03E5 lda <diskpath device path number + ldb #SS.Reset reset device + os9 I$SetStt at track zero + lbcs Exit exit if error + ldd #$0000 get current track + std <currtrak save it + inca get current sector + sta <currsect save it +L03F8 clr <currside clear current side +L03FA bsr L045C + leax >LSN0,u point to our LSN0 buffer + ldd <currtrak + addd <u0048 + tfr d,u + clrb + tst <cocofmt do we format this as a COCO disk? + bne L041B branch if so + tst <mfm single density? + beq L041D branch if so + tst <t0sngdns track 0 single density? + bne L041B branch if not + tst <currtrak+1 is current track 0? + bne L041B branch if not + tst <currside side is zero? + beq L041D branch if 0 +L041B orb #$02 else set side 1 +L041D tst <tpi 48 tpi? + beq L0423 branch if so + orb #$04 else set 96 tpi bit +L0423 lda <currside get current side + beq L0429 branch if 0 + orb #$01 +L0429 tfr d,y get side/density bits + lda <diskpath rbf device path number + ldb #SS.WTrk format (write) track + os9 I$SetStt do format it + lbcs Exit exit if error + ldu <savedu get u pointer + ldb <currside get current side + incb increment + stb <currside and store + cmpb <numsides compare against number of sides + bcs L03FA branch if greater than + ldd <currtrak get current track + addd #$0001 increment it + std <currtrak save it + cmpd <ncyls did all tracks? + bcs L03F8 no, + rts yes, return + ******************************************************************** * Writes AA bytes of BB to X (byte pairs are in tables above) ******************************************************************** - -L044E ldy <u000E -L0451 ldd ,y++ get two bytes at Y - beq L046B branch if zero (end) -L0455 stb ,x+ store B at X and post increment - deca decrement count - bne L0455 continue if not done - bra L0451 else get next byte pair -L045C lda <dtype get drive's PD.TYP - bita #TYP.HARD+TYP.NSF hard disk or non-standard format? - beq L046C branch if neither - ldy <trkdata point Y to track data - leax >LSN0,u point to the LSN0 buffer - bsr L0451 build LSN0 sector -L046B rts - + +L044E ldy <u000E +L0451 ldd ,y++ get two bytes at Y + beq L046B branch if zero (end) +L0455 stb ,x+ store B at X and post increment + deca decrement count + bne L0455 continue if not done + bra L0451 else get next byte pair +L045C lda <dtype get drive's PD.TYP + bita #TYP.HARD+TYP.NSF hard disk or non-standard format? + beq L046C branch if neither + ldy <trkdata point Y to track data + leax >LSN0,u point to the LSN0 buffer + bsr L0451 build LSN0 sector +L046B rts + ******************************************************************** * ******************************************************************** - -L046C ldy <trkdata grab normal track data - ldb <sectors+1 get sector - tst <currtrak+1 track 0? - bne L047E branch if not - tst <currside side 0? - bne L047E branch if not - ldy <trk0data + +L046C ldy <trkdata grab normal track data + ldb <sectors+1 get sector + tst <currtrak+1 track 0? + bne L047E branch if not + tst <currside side 0? + bne L047E branch if not + ldy <trk0data * ldb <u001C - ldb <sectors0+1 get sectors in track 0 -L047E sty <u000E + ldb <sectors0+1 get sectors in track 0 +L047E sty <u000E stb <sectcount+1 - stb <u0018 - bsr L04EC - leax >LSN0,u - bsr L0451 - sty <u000E -L0490 bsr L044E + stb <u0018 + bsr L04EC + leax >LSN0,u + bsr L0451 + sty <u000E +L0490 bsr L044E dec <sectcount+1 - bne L0490 - lda ,y+ - sty <u000E - stx <u003D - leay >u297E,u - sty <dresult - tfr a,b -L04A6 std ,x++ - cmpx <dresult - bcs L04A6 - ldy <u000E - ldd ,y++ - std <u003F - ldd ,y - std <u0041 + bne L0490 + lda ,y+ + sty <u000E + stx <u003D + leay >u297E,u + sty <dresult + tfr a,b +L04A6 std ,x++ + cmpx <dresult + bcs L04A6 + ldy <u000E + ldd ,y++ + std <u003F + ldd ,y + std <u0041 clr <sectcount+1 - leax >LSN0,u - ldd <u003F - leay >u008F,u -L04C3 leax d,x + leax >LSN0,u + ldd <u003F + leay >u008F,u +L04C3 leax d,x ldd <currtrak+1 - adda <toffs add in track offset - std ,x + adda <toffs add in track offset + std ,x ldb <sectcount+1 - lda b,y - incb + lda b,y + incb stb <sectcount+1 - ldb <currsect - adda <soffs add in sector offset - bcs L04E5 - std $02,x + ldb <currsect + adda <soffs add in sector offset + bcs L04E5 + std $02,x lda <sectcount+1 - cmpa <u0018 - bcc L04E4 - ldd <u0041 - bra L04C3 -L04E4 rts - + cmpa <u0018 + bcc L04E4 + ldd <u0041 + bra L04C3 +L04E4 rts + ******************************************************************** * ******************************************************************** - -L04E5 leax >AbortSct,pcr sector number out of range message - lbra PExit print message and exit - + +L04E5 leax >AbortSct,pcr sector number out of range message + lbra PExit print message and exit + ******************************************************************** * ******************************************************************** - -L04EC pshs y,b - tfr b,a + +L04EC pshs y,b + tfr b,a ldb <currtrak+1 - cmpb #$01 - bhi L0518 - leax >u008F,u - leay a,x - ldb <interlv - bne L0507 -L0500 leax >AbortIlv,pcr Interleave out of range message - lbra PExit print message and exit -L0507 cmpb <u0018 - bhi L0500 - nega - pshs y,x,b,a - clra -L050F sta ,x - inca - cmpa <u0018 - bne L051A - leas $06,s -L0518 puls pc,y,b -L051A ldb <interlv - abx - cmpx $04,s - bcs L0525 - ldb ,s - leax b,x -L0525 cmpx $02,s - bne L050F - leax $01,x - stx $02,s - bra L050F - + cmpb #$01 + bhi L0518 + leax >u008F,u + leay a,x + ldb <interlv + bne L0507 +L0500 leax >AbortIlv,pcr Interleave out of range message + lbra PExit print message and exit +L0507 cmpb <u0018 + bhi L0500 + nega + pshs y,x,b,a + clra +L050F sta ,x + inca + cmpa <u0018 + bne L051A + leas $06,s +L0518 puls pc,y,b +L051A ldb <interlv + abx + cmpx $04,s + bcs L0525 + ldb ,s + leax b,x +L0525 cmpx $02,s + bne L050F + leax $01,x + stx $02,s + bra L050F + ******************************************************************** * initialize sector 0 ******************************************************************** - -InitLSN0 lbsr ClrBuf clear the sector buffer - ldd <totsects+1 get total sectors bits 15-0 - std DD.TOT+1,x save - ldb <totsects get bits 23-16 - stb DD.TOT,x save - ldd <sectors get sectors/track - std <DD.SPT,x save - stb DD.TKS,x save - lda <clustsiz get cluster size - sta DD.BIT+1,x save - - clra - ldb <NumBitmapBytes Calculate number of bitmap sectors needed + +InitLSN0 lbsr ClrBuf clear the sector buffer + ldd <totsects+1 get total sectors bits 15-0 + std DD.TOT+1,x save + ldb <totsects get bits 23-16 + stb DD.TOT,x save + ldd <sectors get sectors/track + std <DD.SPT,x save + stb DD.TKS,x save + lda <clustsiz get cluster size + sta DD.BIT+1,x save + + clra + ldb <NumBitmapBytes Calculate number of bitmap sectors needed tst <NumBitmapBytes+1 Exact multiple of sector size ? - beq L054F Yes no extra sectors needed - addd #$0001 Add extra sector for bytes at end -L054F addd #$0001 - addd AddedSysSecs,u Add additional system sectors (usually 0) - std DD.DIR+1,x save directory sector - - clra - tst <mfm single density? - beq L0561 branch if so - ora #FMT.DNS else set double density bit - tst <t0sngdns track 0 is single density? - beq L0561 branch if so + beq L054F Yes no extra sectors needed + addd #$0001 Add extra sector for bytes at end +L054F addd #$0001 + addd AddedSysSecs,u Add additional system sectors (usually 0) + std DD.DIR+1,x save directory sector + + clra + tst <mfm single density? + beq L0561 branch if so + ora #FMT.DNS else set double density bit + tst <t0sngdns track 0 is single density? + beq L0561 branch if so * ora #FMT.T0DN - ora #$08 -L0561 ldb <numsides get number of sides - cmpb #$01 just 1? - beq L0569 branch if so - ora #FMT.SIDE else set double-sided bit -L0569 tst <tpi 48tpi? - beq L056F branch if so - ora #FMT.TDNS else set 96 tpi -L056F sta <DD.FMT,x save - ldd <NumBitmapBytes get size of bitmap in bytes - std DD.MAP,x save number of bytes in allocation bit map - lda #$FF attributes - sta DD.ATT,x save - leax >LSN0+DD.DAT,u point to time buffer - os9 F$Time get current time + ora #$08 +L0561 ldb <numsides get number of sides + cmpb #$01 just 1? + beq L0569 branch if so + ora #FMT.SIDE else set double-sided bit +L0569 tst <tpi 48tpi? + beq L056F branch if so + ora #FMT.TDNS else set 96 tpi +L056F sta <DD.FMT,x save + ldd <NumBitmapBytes get size of bitmap in bytes + std DD.MAP,x save number of bytes in allocation bit map + lda #$FF attributes + sta DD.ATT,x save + leax >LSN0+DD.DAT,u point to time buffer + os9 F$Time get current time leax >LSN0+DD.NAM,u - leay <dskname,u quote delimited disk name buffer - tst ,y name in buffer? - beq L0594 branch if not -L058C lda ,y+ get character of name - sta ,x+ and save in name area of LSN0 - bpl L058C - bra L05C7 + leay <dskname,u quote delimited disk name buffer + tst ,y name in buffer? + beq L0594 branch if not +L058C lda ,y+ get character of name + sta ,x+ and save in name area of LSN0 + bpl L058C + bra L05C7 * Here we prompt for a disk name L0594 leax >DName,pcr - ldy #DNameLen - lbsr Print print disk name prompt - leax >LSN0+DD.NAM,u point to new name - ldy #33 read up to 33 characters - clra - os9 I$ReadLn from standard input - bcc L05B8 branch if ok - cmpa #E$EOF end of file? - bne L0594 branch if not -L05B1 leax >Aborted,pcr format aborted message - lbra PExit print message and exit -L05B8 tfr y,d copy number of chars entered into D - leax d,x point to last char + 1 - clr ,-x - decb decrement chars typed - beq L0594 branch if zero (go ask again) - lda ,-x get last character - ora #$80 set hi bit - sta ,x and save -L05C7 leax >LSN0+DD.DAT,u point to time - leay <$40,x - pshs y - ldd #$0000 -L05D3 addd ,x++ - cmpx ,s - bcs L05D3 - leas $02,s - std >LSN0+DD.DSK,u save disk ID - - lda IsDragon,u Do we need to fixup for dragon ? - cmpa #DragonFlag - bne Nofixup - bsr FixForDragon Adjust for Dragon disk format - -NoFixup + ldy #DNameLen + lbsr Print print disk name prompt + leax >LSN0+DD.NAM,u point to new name + ldy #33 read up to 33 characters + clra + os9 I$ReadLn from standard input + bcc L05B8 branch if ok + cmpa #E$EOF end of file? + bne L0594 branch if not +L05B1 leax >Aborted,pcr format aborted message + lbra PExit print message and exit +L05B8 tfr y,d copy number of chars entered into D + leax d,x point to last char + 1 + clr ,-x + decb decrement chars typed + beq L0594 branch if zero (go ask again) + lda ,-x get last character + ora #$80 set hi bit + sta ,x and save +L05C7 leax >LSN0+DD.DAT,u point to time + leay <$40,x + pshs y + ldd #$0000 +L05D3 addd ,x++ + cmpx ,s + bcs L05D3 + leas $02,s + std >LSN0+DD.DSK,u save disk ID + + lda IsDragon,u Do we need to fixup for dragon ? + cmpa #DragonFlag + bne Nofixup + bsr FixForDragon Adjust for Dragon disk format + +NoFixup * Not sure what this code is for... * ldd >val1,pcr * std >u01A7,u @@ -1147,735 +1152,737 @@ * std >u01A9,u * ldd >val3,pcr * std >u01AB,u - lda <diskpath - ldb #SS.Opt - leax >LSN0+DD.OPT,u point to disk options - os9 I$GetStt get options - ldb #SS.Reset reset head to track 0 - os9 I$SetStt do it! - lbcs Exit branch if error - leax >LSN0,u point to LSN0 - lbra WritSec and write it! - - + lda <diskpath + ldb #SS.Opt + leax >LSN0+DD.OPT,u point to disk options + os9 I$GetStt get options + ldb #SS.Reset reset head to track 0 + os9 I$SetStt do it! + lbcs Exit branch if error + leax >LSN0,u point to LSN0 + lbra WritSec and write it! + + ******************************************************************** * Adjust LSN0 values so we make a Dragon OS-9 compatible disk ******************************************************************** - -FixForDragon - pshs x - leax LSN0,u Point at LSN0 - - lda dtype,u Get disk type - bita #TYP.CCF CoCo/Dragon format disk ? - beq DgnNoFix Nope, don't adjust - - ldd DD.MAP,x Fixup map - cmpd #$ff Dragon disks have only one bitmap sector - bls DgnMapOK only using 1, don't adjust - lsra Divide map count by 2 - rorb - std DD.MAP,x - inc DD.BIT+1,x Increment cluster size to 2 - - stb <clustsiz Update local cluster size var - -DgnMapOK -DgnNoFix - puls x,pc - - + +FixForDragon + pshs x + leax LSN0,u Point at LSN0 + + lda dtype,u Get disk type + bita #TYP.CCF CoCo/Dragon format disk ? + beq DgnNoFix Nope, don't adjust + + ldd DD.MAP,x Fixup map + cmpd #$ff Dragon disks have only one bitmap sector + bls DgnMapOK only using 1, don't adjust + lsra Divide map count by 2 + rorb + std DD.MAP,x + inc DD.BIT+1,x Increment cluster size to 2 + + stb <clustsiz Update local cluster size var + +DgnMapOK +DgnNoFix + puls x,pc + + ******************************************************************** * read in sector 0 of device ******************************************************************** - -ReadLSN0 lda <diskpath get disk path - os9 I$Close close it - leax <prmbuf,u point to device name - lda #READ. - os9 I$Open open for read - lbcs BadSect branch if problem - sta <diskpath save new disk path - leax >LSN0,u - ldy #256 - os9 I$Read read first sector - lbcs BadSect branch if problem - lda <diskpath get disk path - os9 I$Close close path to device - leax <prmbuf,u re-point to device name - lda #UPDAT. - os9 I$Open open in read/write mode - lbcs BadSect branch if error - sta <diskpath else save new disk path - + +ReadLSN0 lda <diskpath get disk path + os9 I$Close close it + leax <prmbuf,u point to device name + lda #READ. + os9 I$Open open for read + lbcs BadSect branch if problem + sta <diskpath save new disk path + leax >LSN0,u + ldy #256 + os9 I$Read read first sector + lbcs BadSect branch if problem + lda <diskpath get disk path + os9 I$Close close path to device + leax <prmbuf,u re-point to device name + lda #UPDAT. + os9 I$Open open in read/write mode + lbcs BadSect branch if error + sta <diskpath else save new disk path + * Save location of start of root directory, for later use - leax LSN0,u point to LSN0 - lda DD.DIR,x Get location of root - ldx DD.DIR+1,x - sta SaveRootLSN,u Save a copy for later use - stx SaveRootLSN+1,u - rts and return - + leax LSN0,u point to LSN0 + lda DD.DIR,x Get location of root + ldx DD.DIR+1,x + sta SaveRootLSN,u Save a copy for later use + stx SaveRootLSN+1,u + rts and return + ******************************************************************** -* +* Make Bitmap Sectors ******************************************************************** - -Stamps lda <dtype get device type in A - clr <dovfy clear verify flag - bita #TYP.HARD hard drive? - beq nothd branch if not + +MkBMap lda <dtype get device type in A + clr <dovfy clear verify flag + bita #TYP.HARD hard drive? + beq nothd branch if not * Hard drives are asked for physical verification here askphys leax >Verify,pcr - ldy #VerifyL - lbsr Input prompt for physical verify of hard drive - anda #$DF - cmpa #'Y yes? - beq nothd branch if so - cmpa #'N no? - bne askphys not not, ask again - sta <dovfy else flag that we don't want physical verify -nothd ldd <sectors0 get sectors/track at track 0 - std <u0017 save - clra D = 0 - clrb - sta <oksects clear OK sectors + ldy #VerifyL + lbsr Input prompt for physical verify of hard drive + anda #$DF + cmpa #'Y yes? + beq nothd branch if so + cmpa #'N no? + bne askphys not not, ask again + sta <dovfy else flag that we don't want physical verify +nothd ldd <sectors0 get sectors/track at track 0 + std <u0017 save + clra D = 0 + clrb + sta <oksects clear OK sectors std <oksects+1 - std <currtrak clear current track - std <sectcount clear counted sectors - std <u0032 - stb <u0031 - sta <u003C - leax >optbuf,u - stx <u0038 - lbsr ClrSec - leax 256,x - stx <u003A - clra - ldb #$01 D = 1 - std <u0034 - lda <clustsiz get cluster size - sta <clustcnt store in cluster counter - clr <u002A - + std <currtrak clear current track + std <sectcount clear counted sectors + std <u0032 + stb <u0031 + sta <u003C + leax >optbuf,u + stx <u0038 + lbsr ClrSec + leax 256,x + stx <u003A + clra + ldb #$01 D = 1 + std <u0034 + lda <clustsiz get cluster size + sta <clustcnt store in cluster counter + clr <u002A + * Calculate the number of reserved clusters at begining of disk, from * number of reserved sectors - - clra - ldb <NumBitmapBytes Get no of sectors used by bitmap - tst <NumBitmapBytes+1 Exact number of sectors in bitmap ? - beq L069D Yes : skip - addd #$0001 No : round up sector count -L069D addd #$0009 Add 8 sectors for root FD (IT.SAS) + 1 sector for LSN0 - addd AddedSysSecs,u Add additional system sectors (if any) + clra + ldb <NumBitmapBytes Get no of sectors used by bitmap + tst <NumBitmapBytes+1 Exact number of sectors in bitmap ? + beq L069D Yes : skip + addd #$0001 No : round up sector count +L069D addd #$0009 Add 8 sectors for root FD (IT.SAS) + 1 sector for LSN0 + addd AddedSysSecs,u Add additional system sectors (if any) std <NoSysSectors - lda <clustsiz get cluster size - + std <NoSysClusters + lda <clustsiz get cluster size + * Since cluster sizes can only be a power of 2 (1,2,4,8,16 etc) we divide block count * by 2 until we get a carry, this gives us the cluster count - -L06A4 lsra - bcs L06B5 First calculate number of system clusters - lsr <NoSysSectors - ror <NoSysSectors+1 - bcc L06A4 - inc <NoSysSectors+1 - bne L06A4 - inc <NoSysSectors - bra L06A4 - -L06B5 ldb <NoSysSectors+1 - stb <NoSysClusters Save No of clusters - lda <clustsiz get cluster size - mul Now work out number of system sectors - std <NoSysSectors Save it - - subd #$0001 Calculate number of sectors in root FD ? + +L06A4 lsra + bcs L06B5 First calculate number of system clusters + lsr <NoSysClusters + ror <NoSysClusters+1 + bcc L06A4 + inc <NoSysClusters+1 + bne L06A4 + inc <NoSysClusters + bra L06A4 + +L06B5 + ldd <NoSysSectors +* ldd <NoSysSectors +* std <NoSysClusters Save No of clusters +* lda <clustsiz get cluster size +* mul Now work out number of system sectors +* std <NoSysSectors Save it + + subd #$0001 Calculate number of sectors in root FD ? + subd AddedSysSecs,u Remove additional system sectors (if any) subb <NumBitmapBytes - subd AddedSysSecs,u Remove additional system sectors (if any) - sbca #$00 + sbca #$00 tst <NumBitmapBytes+1 - beq L06CC - subd #$0001 - + beq L06CC + subd #$0001 + L06CC stb <NoRootFDSecs - -L06CE tst <dovfy do we verify? - bne OutScrn no, output screen display - lda <diskpath yes, get rbf device path - leax >LSN0,u get sector buffer - ldy #256 sector size - os9 I$Read read of sector successful? - bcc OutScrn yes, output screen display - os9 F$PErr no, print error message - lbsr NextSec get next sector - lda #$FF - sta <u002A - tst <u0031 - bne OutScrn output screen display - ldx <u0032 + +L06CE tst <dovfy do we verify? + bne OutScrn no, output screen display + lda <diskpath yes, get rbf device path + leax >LSN0,u get sector buffer + ldy #256 sector size + os9 I$Read read of sector successful? + bcc OutScrn yes, output screen display + os9 F$PErr no, print error message + lbsr NextSec get next sector + lda #$FF + sta <u002A + tst <u0031 + bne OutScrn output screen display + ldx <u0032 cmpx <NoSysSectors - bhi OutScrn output screen display -BadSect leax >BadSectM,pcr bad system sector message -PExit lbsr PrintLn print message - clrb clear error - lbra Exit exit no error - + bhi OutScrn output screen display +BadSect leax >BadSectM,pcr bad system sector message +PExit lbsr PrintLn print message + clrb clear error + lbra Exit exit no error + ******************************************************************** * output screen display scrolling track counter ******************************************************************** - -OutScrn ldd <sectcount get counted sectors - addd #$0001 increment it - std <sectcount save counted sectors - cmpd <u0017 good sector count? - bcs L0745 next segment - clr <sectcount clear counted sectors - clr <sectcount+1 - tst <dovfy are we verifying? - bne L073A no, - lda #C$SPAC yes, get space - pshs a save it - lda <currtrak+1 track high byte - lbsr HexDigit make it ascii -L0724 pshs b,a save two ascii digits - lda <currtrak track low byte - lbsr HexDigit make it ascii - pshs b,a save two ascii digits - lda #C$CR get CR - pshs a - tfr s,x get output from stack - ldy #$0006 length of output + +OutScrn ldd <sectcount get counted sectors + addd #$0001 increment it + std <sectcount save counted sectors + cmpd <u0017 good sector count? + bcs L0745 next segment + clr <sectcount clear counted sectors + clr <sectcount+1 + tst <dovfy are we verifying? + bne L073A no, + lda #C$SPAC yes, get space + pshs a save it + lda <currtrak+1 track high byte + lbsr HexDigit make it ascii +L0724 pshs b,a save two ascii digits + lda <currtrak track low byte + lbsr HexDigit make it ascii + pshs b,a save two ascii digits + lda #C$CR get CR + pshs a + tfr s,x get output from stack + ldy #$0006 length of output * lbsr Print print it - lda #$01 - os9 I$Write + lda #$01 + os9 I$Write * lda $02,s * cmpa #$46 end of line? * bne L0738 skip line feed * lbsr LineFD print linefeed -L0738 leas $06,s pop output off stack -L073A ldd <currtrak get current track - addd #$0001 increment it - std <currtrak save it back - ldd <sectors get number of sectors - std <u0017 save it -L0745 dec <clustcnt decrement cluster counter - bne L075B - bsr L0784 - tst <u002A - bne L0755 - ldd <oksects+1 increment good sectors - addd #$0001 +L0738 leas $06,s pop output off stack +L073A ldd <currtrak get current track + addd #$0001 increment it + std <currtrak save it back + ldd <sectors get number of sectors + std <u0017 save it +L0745 dec <clustcnt decrement cluster counter + bne L075B + bsr L0784 + tst <u002A + bne L0755 + ldd <oksects+1 increment good sectors + addd #$0001 std <oksects+1 - bcc L0755 - inc <oksects -L0755 clr <u002A - lda <clustsiz get cluster size - sta <clustcnt save in cluster counter -L075B ldb <u0031 - ldx <u0032 - leax $01,x - bne L0764 - incb -L0764 cmpb <totsects - bcs L076C + bcc L0755 + inc <oksects +L0755 clr <u002A + lda <clustsiz get cluster size + sta <clustcnt save in cluster counter +L075B ldb <u0031 + ldx <u0032 + leax $01,x + bne L0764 + incb +L0764 cmpb <totsects + bcs L076C cmpx <totsects+1 - bcc L0773 -L076C stb <u0031 - stx <u0032 - lbra L06CE -L0773 lda #$FF - sta <u002A - leay >optbuf,u -L077B cmpy <u0038 - beq GoodSect number of good sectors summary - bsr L0784 - bra L077B -L0784 ldx <u0038 - lda <u002A - rora - rol ,x+ - inc <u003C - lda <u003C - cmpa #$08 - bcs L07A6 - clr <u003C - stx <u0038 - cmpx <u003A - bne L07A6 - bsr WrtSecs - leax >optbuf,u - stx <u0038 - lbsr ClrSec -L07A6 rts return - + bcc L0773 +L076C stb <u0031 + stx <u0032 + lbra L06CE +L0773 lda #$FF + sta <u002A + leay >optbuf,u +L077B cmpy <u0038 + beq GoodSect number of good sectors summary + bsr L0784 + bra L077B +L0784 ldx <u0038 + lda <u002A + rora + rol ,x+ + inc <u003C + lda <u003C + cmpa #$08 + bcs L07A6 + clr <u003C + stx <u0038 + cmpx <u003A + bne L07A6 + bsr WrtSecs + leax >optbuf,u + stx <u0038 + lbsr ClrSec +L07A6 rts return + ******************************************************************** * convert byte to ascii hexadecimal and return it in d register ******************************************************************** - -HexDigit tfr a,b get byte again - lsra shift upper digit - lsra - lsra - lsra - andb #$0F mask lower digit - addd #$3030 make it ascii - cmpa #$39 upper digit > 9 - bls L07B8 no, - adda #$07 yes, make hexadecimal -L07B8 cmpb #$39 lower digit > 9 - bls L07BE no, - addb #$07 yes, make hexadecimal -L07BE rts return - + +HexDigit tfr a,b get byte again + lsra shift upper digit + lsra + lsra + lsra + andb #$0F mask lower digit + addd #$3030 make it ascii + cmpa #$39 upper digit > 9 + bls L07B8 no, + adda #$07 yes, make hexadecimal +L07B8 cmpb #$39 lower digit > 9 + bls L07BE no, + addb #$07 yes, make hexadecimal +L07BE rts return + ******************************************************************** * number of good sectors message ******************************************************************** - -GoodSect lbsr LineFD print line feed - leax >NumGood,pcr number of good sectors - ldy #NGoodLen length of message - lbsr Print print it - ldb <clustsiz get cluster size - lda <oksects get 24 bit counter + +GoodSect lbsr LineFD print line feed + leax >NumGood,pcr number of good sectors + ldy #NGoodLen length of message + lbsr Print print it + ldb <clustsiz get cluster size + lda <oksects get 24 bit counter ldx <oksects+1 - pshs x,a save 24 bit counter -L07D4 lsrb carry set 0xxx xxxx -> X ? - bcs L07DF yes, - lsl $02,s <u0036 1 X <- nnnn nnnn X <- xxxx xxx0 - rol $01,s <u0036 2 N <- nnnn nnnX N <- xxxx xxx0 - rol ,s <u0036 3 N <- nnnn nnnN - bra L07D4 did all sectors? -L07DF puls x,a get counted sectors - ldb #C$CR - pshs b save enter - tfr d,y get size - tfr x,d get - tfr b,a get convert byte - bsr HexDigit convert it BYTE 1 - pshs b,a save in buffer - tfr x,d get convert byte - bsr HexDigit convert it BYTE 2 - pshs b,a save in buffer - tfr y,d get convert byte - bsr HexDigit convert it BYTE 3 - pshs b,a save it buffer - tfr s,x get output buffer - lbsr PrintLn print it - leas $07,s fix stack - rts return - + pshs x,a save 24 bit counter +L07D4 lsrb carry set 0xxx xxxx -> X ? + bcs L07DF yes, + lsl $02,s <u0036 1 X <- nnnn nnnn X <- xxxx xxx0 + rol $01,s <u0036 2 N <- nnnn nnnX N <- xxxx xxx0 + rol ,s <u0036 3 N <- nnnn nnnN + bra L07D4 did all sectors? +L07DF puls x,a get counted sectors + ldb #C$CR + pshs b save enter + tfr d,y get size + tfr x,d get + tfr b,a get convert byte + bsr HexDigit convert it BYTE 1 + pshs b,a save in buffer + tfr x,d get convert byte + bsr HexDigit convert it BYTE 2 + pshs b,a save in buffer + tfr y,d get convert byte + bsr HexDigit convert it BYTE 3 + pshs b,a save it buffer + tfr s,x get output buffer + lbsr PrintLn print it + leas $07,s fix stack + rts return + ******************************************************************** * get allocation bit map and write sectors ******************************************************************** - -WrtSecs - pshs y save register - clra set number - ldb #$01 bits to set - cmpd <u0034 map sector? - bne L081E yes, write sector - leax >optbuf,u allocation bit map - clra get number - ldb <NoSysClusters system sectors - tfr d,y into register - clrb first bit to set - os9 F$AllBit set allocation bit map - lbcs BadSect if there a error -L081E lbsr GetSec get sector - leax >optbuf,u allocation bit map - lbsr WritSec write sector - ldd <totsects get total sectors - cmpd <u0031 lsn sector count? - bcs AdvSec advance to mapped sectors - bhi NxtSec get next sector - ldb <totsects+2 get LSB total sectors - cmpb <u0033 good sector count? - bcc AdvSec advance to mapped sectors -NxtSec lbsr NextSec skip to next sector -AdvSec ldd <u0034 get mapped sectors - addd #$0001 count from one - std <u0034 save mapped sectors count - puls pc,y restore and return - + +WrtSecs + pshs y save register + clra set number + ldb #$01 bits to set + cmpd <u0034 map sector? + bne L081E yes, write sector + leax >optbuf,u allocation bit map + clra get number + ldy <NoSysClusters system sectors +* tfr d,y into register + clrb first bit to set + os9 F$AllBit set allocation bit map + lbcs BadSect if there a error +L081E lbsr GetSec get sector + leax >optbuf,u allocation bit map + lbsr WritSec write sector + ldd <totsects get total sectors + cmpd <u0031 lsn sector count? + bcs AdvSec advance to mapped sectors + bhi NxtSec get next sector + ldb <totsects+2 get LSB total sectors + cmpb <u0033 good sector count? + bcc AdvSec advance to mapped sectors +NxtSec lbsr NextSec skip to next sector +AdvSec ldd <u0034 get mapped sectors + addd #$0001 count from one + std <u0034 save mapped sectors count + puls pc,y restore and return + ******************************************************************** * create root directory file descriptor ******************************************************************** - -MkRootFD lbsr GetSec get sector - leax >fdtbuf1,u sector buff - lbsr ClrSec clear sector - leax >fdtbuf2,u get date last modified - os9 F$Time get system time - leax >fdtbuf1,u get file descriptor + +MkRootFD lbsr GetSec get sector + leax >fdtbuf1,u sector buff + lbsr ClrSec clear sector + leax >fdtbuf2,u get date last modified + os9 F$Time get system time + leax >fdtbuf1,u get file descriptor lda #DIR.+PEXEC.+PWRIT.+PREAD.+EXEC.+UPDAT. - sta FD.ATT,x save in FD.ATT - lda #$02 get link count - sta FD.LNK,x save in FD.LNK - clra directory size - ldb #DIR.SZ*2 directory entries (DIR.SZ*2) - std FD.SIZ+2,x save it (FD.SIZ+2) + sta FD.ATT,x save in FD.ATT + lda #$02 get link count + sta FD.LNK,x save in FD.LNK + clra directory size + ldb #DIR.SZ*2 directory entries (DIR.SZ*2) + std FD.SIZ+2,x save it (FD.SIZ+2) ldb <NoRootFDSecs - decb + decb stb <FD.SEG+FDSL.B+1,x save it (c+FDSL.B+1) * ldd <u0034 - - ldd SaveRootLSN+1,u Get saved root dir LSN - - addd #$0001 + + ldd SaveRootLSN+1,u Get saved root dir LSN + + addd #$0001 std <FD.SEG+FDSL.A+1,x save it (FD.SEG+FDSL.A+1) - bsr SeekRootLSN - bsr WritSec - bsr ClrBuf - ldd #$2EAE (#'.*256+'.+128) - std DIR.NM,x (DIR.NM) + bsr SeekRootLSN + bsr WritSec + bsr ClrBuf + ldd #$2EAE (#'.*256+'.+128) + std DIR.NM,x (DIR.NM) stb <DIR.SZ+DIR.NM,x (DIR.NM+DIR.SZ) * ldd <u0034 - - ldd SaveRootLSN+1,u Get saved root dir LSN - + + ldd SaveRootLSN+1,u Get saved root dir LSN + std <DIR.FD+1,x std <DIR.SZ+DIR.FD+1,x - bsr WritSec - bsr ClrBuf + bsr WritSec + bsr ClrBuf ldb <NoRootFDSecs - decb make zero offset (0 - 255) -NextCnt decb decrement sector count - bne NextWrt if more to do - rts else return -NextWrt pshs b save sector count - bsr WritSec write the sector - puls b get count back - bra NextCnt do until done - + decb make zero offset (0 - 255) +NextCnt decb decrement sector count + bne NextWrt if more to do + rts else return +NextWrt pshs b save sector count + bsr WritSec write the sector + puls b get count back + bra NextCnt do until done + ******************************************************************** * Get root dir first LSN ******************************************************************** - -GetRootLSN - pshs x Retrieve start of Dir from LSN0 - leax LSN0,u - ldd DD.DIR+1,x - puls x - - rts - + +*GetRootLSN +* pshs x Retrieve start of Dir from LSN0 +* leax LSN0,u +* ldd DD.DIR+1,x +* puls x +* +* rts + ******************************************************************** * Seek to Root LSN ******************************************************************** - -SeekRootLSN - pshs d,x,u - - ldx SaveRootLSN,u msw of pos - lda SaveRootLSN+2,u lsw - clrb - tfr d,u - lbsr SeekSec - - puls d,x,u,pc - + +SeekRootLSN + pshs d,x,u + + ldx SaveRootLSN,u msw of pos + lda SaveRootLSN+2,u lsw + clrb + tfr d,u + lbsr SeekSec + + puls d,x,u,pc + ******************************************************************** * clear the 256 byte sector buffer ******************************************************************** - -ClrBuf leax >LSN0,u sector buffer -ClrSec clra store mask - clrb sector count -ClrLop sta d,x clear the buffer - decb decrement sector count - bne ClrLop clear sector buffer - rts return when done - + +ClrBuf leax >LSN0,u sector buffer +ClrSec clra store mask + clrb sector count +ClrLop sta d,x clear the buffer + decb decrement sector count + bne ClrLop clear sector buffer + rts return when done + ******************************************************************** * write physical 256 byte sector to the diskette ******************************************************************** - -WritSec lda <diskpath get path number - ldy #256 get sector size - os9 I$Write write the sector - lbcs Exit exit on error - rts return - + +WritSec lda <diskpath get path number + ldy #256 get sector size + os9 I$Write write the sector + lbcs Exit exit on error + rts return + ******************************************************************** * get sector file position ******************************************************************** - -GetSec clra - ldb <u0034 get map sectors high word - tfr d,x save it - lda <u0035 - clrb get map sectors low word - tfr d,u save it - + +GetSec clra + ldb <u0034 get map sectors high word + tfr d,x save it + lda <u0035 + clrb get map sectors low word + tfr d,u save it + ******************************************************************** * seek to physical sector ******************************************************************** - -SeekSec lda <diskpath get path number - os9 I$Seek seek to sector - ldu <savedu get data pointer - lbcs Exit exit if error - rts return - + +SeekSec lda <diskpath get path number + os9 I$Seek seek to sector + ldu <savedu get data pointer + lbcs Exit exit if error + rts return + ******************************************************************** * skip to the next sector ******************************************************************** - -NextSec ldx <u0031 lsn count - lda <u0033 good sector count - clrb add this - addd #$0100 sector - tfr d,u lsn count - bcc SeekSec seek it? - leax $01,x next sector - bra SeekSec seek it - + +NextSec ldx <u0031 lsn count + lda <u0033 good sector count + clrb add this + addd #$0100 sector + tfr d,u lsn count + bcc SeekSec seek it? + leax $01,x next sector + bra SeekSec seek it + ******************************************************************** * the format module never gets to this code? ******************************************************************** - - ldd ,y - leau >LSN0,u - leax >dcnums,pcr decimal number conversion table - ldy #$2F20 - + + ldd ,y + leau >LSN0,u + leax >dcnums,pcr decimal number conversion table + ldy #$2F20 + ******************************************************************** * ******************************************************************** - -L08E6 leay >$0100,y - subd ,x - bcc L08E6 - addd ,x++ - pshs b,a - ldd ,x - tfr y,d - beq L090E - ldy #$2F30 - cmpd #$3020 - bne L0908 - ldy #$2F20 - tfr b,a -L0908 sta ,u+ - puls b,a - bra L08E6 -L090E sta ,u+ - lda #C$CR - sta ,u - ldu <savedu - leas $02,s - leax >LSN0,u - lbsr PrintLn - rts - + +L08E6 leay >$0100,y + subd ,x + bcc L08E6 + addd ,x++ + pshs b,a + ldd ,x + tfr y,d + beq L090E + ldy #$2F30 + cmpd #$3020 + bne L0908 + ldy #$2F20 + tfr b,a +L0908 sta ,u+ + puls b,a + bra L08E6 +L090E sta ,u+ + lda #C$CR + sta ,u + ldu <savedu + leas $02,s + leax >LSN0,u + lbsr PrintLn + rts + dcnums fdb 10000,1000,100,10,1,0 - + ******************************************************************** * process decimal number input (65535) ******************************************************************** - -Decimal ldd #$0000 start at zero -L092F bsr DecBin get first digit - bcs L0939 if overflow - bne L092F get next digit - std <dresult save decimal as binary - bne L093E if no error return -L0939 ldd #$0001 flag error - std <dresult save it -L093E rts return - + +Decimal ldd #$0000 start at zero +L092F bsr DecBin get first digit + bcs L0939 if overflow + bne L092F get next digit + std <dresult save decimal as binary + bne L093E if no error return +L0939 ldd #$0001 flag error + std <dresult save it +L093E rts return + ******************************************************************** * process decimal number into it's binary representation * return with binary in the d register ******************************************************************** - -DecBin pshs y,b,a save registers - ldb ,x+ get digit - subb #$30 make it binary - cmpb #$0A bla bla bla! - bcc L095D - lda #$00 - ldy #$000A -L094F addd ,s - bcs L095B - leay -$01,y - bne L094F - std ,s - andcc #^Zero -L095B puls pc,y,b,a -L095D orcc #Zero - puls pc,y,b,a - + +DecBin pshs y,b,a save registers + ldb ,x+ get digit + subb #$30 make it binary + cmpb #$0A bla bla bla! + bcc L095D + lda #$00 + ldy #$000A +L094F addd ,s + bcs L095B + leay -$01,y + bne L094F + std ,s + andcc #^Zero +L095B puls pc,y,b,a +L095D orcc #Zero + puls pc,y,b,a + ******************************************************************** * print error, usage message, and exit ******************************************************************** - -PrtError lda #$02 standard error - os9 F$PErr print error - IFNE DOHELP - leax <HelpMsg,pcr point to usage - ldy #HelpLen usage size - lda #$02 standard error - os9 I$WritLn print usage - ENDC - clrb no error - os9 F$Exit exit module - + +PrtError lda #$02 standard error + os9 F$PErr print error + ifne DOHELP + leax <HelpMsg,pcr point to usage + ldy #HelpLen usage size + lda #$02 standard error + os9 I$WritLn print usage + endc + clrb no error + os9 F$Exit exit module + ******************************************************************** * messages ******************************************************************** - + *Title fcb C$LF * fcc "COLOR COMPUTER FORMATTER" *HelpCR fcb C$CR - IFNE DOHELP + ifne DOHELP HelpMsg fcc "Use: FORMAT /devname <opts>" - fcb C$LF + fcb C$LF fcc " opts: R - Ready" - fcb C$LF + fcb C$LF fcc " S/D - density; single or double" - fcb C$LF + fcb C$LF fcc " L - Logical format only" - fcb C$LF + fcb C$LF fcc / "disk name"/ - fcb C$LF + fcb C$LF fcc " 1/2 - number of sides" - fcb C$LF + fcb C$LF fcc " 'No. of cylinders' (in decimal)" - fcb C$LF + fcb C$LF fcc " :Interleave value: (in decimal)" - fcb C$LF + fcb C$LF fcc " /Cluster size/ (in decimal)" - fcb C$LF + fcb C$LF fcc " FD - Dragon format disk" - fcb C$CR -HelpLen equ *-HelpMsg - ENDC + fcb C$CR +HelpLen equ *-HelpMsg + endc FmtMsg fcc "Formatting device: " -FmtMLen equ *-FmtMsg -Query +FmtMLen equ *-FmtMsg +Query * fcc "y (yes) or n (no)" * fcb C$LF fcc "Ready? " -QueryLen equ *-Query +QueryLen equ *-Query CapErr fcc "ABORT can't get media capacity" - fcb C$CR + fcb C$CR AbortIlv fcc "ABORT Interleave value out of range" - fcb C$CR + fcb C$CR AbortSct fcc "ABORT Sector number out of range" - fcb C$CR + fcb C$CR AbortOp fcc "ABORT Option not allowed on Device" - fcb C$CR + fcb C$CR DName fcc "Disk name: " -DNameLen equ *-DName +DNameLen equ *-DName fcc "How many Cylinders (Tracks?) : " BadSectM fcc "Bad system sector, " Aborted fcc "FORMAT ABORTED" - fcb C$CR + fcb C$CR ClustMsg fcc "Cluster size mismatch" -CrRtn fcb C$CR +CrRtn fcb C$CR * fcc "Double density? " * fcc "Track 0 Double density? " *TPIChg fcc "Change from 96tpi to 48tpi? " *DSided fcc "Double sided? " NumGood fcc "Number of good sectors: $" -NGoodLen equ *-NumGood +NGoodLen equ *-NumGood HDFmt fcc "This is a HARD disk - are you sure? " *HDFmt fcc "WARNING: You are formatting a HARD Disk.." * fcb C$LF * fcc "Are you sure? " -HDFmtLen equ *-HDFmt +HDFmtLen equ *-HDFmt Both fcc "Both PHYSICAL and LOGICAL format? " -BothLen equ *-Both +BothLen equ *-Both Verify fcc "Physical Verify desired? " -VerifyL equ *-Verify -SUMH - fcb C$CR,C$LF +VerifyL equ *-Verify +SUMH + fcb C$CR,C$LF fcc " NitrOS-9 RBF Disk Formatter" - fcb C$CR,C$LF + fcb C$CR,C$LF fcc "------------ Format Data ------------" - fcb C$CR,C$LF + fcb C$CR,C$LF * fcb C$CR,C$LF * fcc "Fixed values:" - fcb C$CR,C$LF -SUMHL equ *-SUMH + fcb C$CR,C$LF +SUMHL equ *-SUMH FMT fcc " Floppy Disk Format: " -FMTL equ *-FMT +FMTL equ *-FMT TOF fcc " Track Offset: " -TOFL equ *-TOF +TOFL equ *-TOF SOF fcc " Sector Offset: " -SOFL equ *-SOF +SOFL equ *-SOF PFS fcc " Physical floppy size: " -PFSL equ *-PFS +PFSL equ *-PFS DC fcc " Disk capacity: " -DCL equ *-DC +DCL equ *-DC CSZ fcc " Cluster size: " -CSZL equ *-CSZ +CSZL equ *-CSZ *SSZ fcc " Sector size: " *SSZL equ *-SSZ SST fcc " Sectors/track: " -SSTL equ *-SST +SSTL equ *-SST TZST fcc " Track zero sect/trk: " -TZSTL equ *-TZST +TZSTL equ *-TZST *LSNOF fcc " LSN offset: $" *LSNOFL equ *-LSNOF TPC fcc "Total physical cylinders: " -TPCL equ *-TPC +TPCL equ *-TPC MSA fcc " Minimum sect allocation: " -MSAL equ *-MSA +MSAL equ *-MSA RF fcc " Recording format: " -RFL equ *-RF +RFL equ *-RF TD fcc " Track density in TPI: " -TDL equ *-TD +TDL equ *-TD NLC fcc "Number of log. cylinders: " -NLCL equ *-NLC +NLCL equ *-NLC NS fcc " Number of surfaces: " -NSL equ *-NS +NSL equ *-NS SI fcc "Sector interleave offset: " -SIL equ *-SI +SIL equ *-SI SCTS fcc " sectors" - fcb C$CR + fcb C$CR SPPR fcc " (" -SPPRL equ *-SPPR -PRSP fcc " bytes)" - fcb C$CR -PRSPL equ *-PRSP -CoCo fcc !CoCo! - fcb C$CR -Dragon fcc !Dragon! - fcb C$CR +SPPRL equ *-SPPR +PRSP fcc " bytes)" + fcb C$CR +PRSPL equ *-PRSP +CoCo fcc !CoCo! + fcb C$CR +Dragon fcc !Dragon! + fcb C$CR Standard fcc !Standard OS-9! - fcb C$CR -Three5 fcc !3 1/2"! - fcb C$CR -FiveQ fcc !5 1/4"! - fcb C$CR -_MFM fcc /M/ -FM fcc /FM/ - fcb C$CR -TPI48 fcc /48/ - fcb C$CR -TPI96 fcc !96! - fcb C$CR -TPI135 fcc !135! - fcb C$CR - - -HDSummary + fcb C$CR +Three5 fcc !3 1/2"! + fcb C$CR +FiveQ fcc !5 1/4"! + fcb C$CR +_MFM fcc /M/ +FM fcc /FM/ + fcb C$CR +TPI48 fcc /48/ + fcb C$CR +TPI96 fcc !96! + fcb C$CR +TPI135 fcc !135! + fcb C$CR + + +HDSummary bsr ShowHeader lbsr ShowDiskCapacity - ldb <dtype - andb #TYPH.DSQ - bne o@ + ldb <dtype + andb #TYPH.DSQ + bne o@ lbsr ShowSectorsTrack lbsr ShowSectorsTrackZero lbsr ShowNumberSurfaces lbsr ShowTotalPhysCylinders o@ lbsr ShowClusterSize - lbsr ShowSAS - rts - -FloppySummary + lbsr ShowSAS + rts + +FloppySummary bsr ShowHeader bsr ShowDiskType bsr ShowPhysFloppy @@ -1884,232 +1891,232 @@ lbsr ShowTotalPhysCylinders lbsr ShowTrackOffset lbsr ShowSectorOffset - lbsr ShowSAS + lbsr ShowSAS lbsr ShowRecordingFormat lbsr ShowTrackDensity lbsr ShowNumberLogCylinders lbsr ShowNumberSurfaces lbsr ShowSectorInterleaveOffset - rts - -ShowHeader - lda #$01 - leax SUMH,pcr - ldy #SUMHL - os9 I$Write - rts - -ShowDiskType - leax FMT,pcr - ldy #FMTL - os9 I$Write - ldb <dtype - leax CoCo,pcr - bitb #TYP.CCF - bne n@ + rts + +ShowHeader + lda #$01 + leax SUMH,pcr + ldy #SUMHL + os9 I$Write + rts + +ShowDiskType + leax FMT,pcr + ldy #FMTL + os9 I$Write + ldb <dtype + leax CoCo,pcr + bitb #TYP.CCF + bne n@ t@ leax Standard,pcr - bra s@ -n@ ldb IsDragon,u Get dragon flag - cmpb #DragonFlag Dragon disk ? - bne s@ - leax Dragon,pcr -s@ ldy #80 - os9 I$WritLn - rts - -ShowPhysFloppy - leax PFS,pcr - ldy #PFSL - os9 I$Write - ldb <dtype - leax FiveQ,pcr - bitb #TYP.3 - beq n@ + bra s@ +n@ ldb IsDragon,u Get dragon flag + cmpb #DragonFlag Dragon disk ? + bne s@ + leax Dragon,pcr +s@ ldy #80 + os9 I$WritLn + rts + +ShowPhysFloppy + leax PFS,pcr + ldy #PFSL + os9 I$Write + ldb <dtype + leax FiveQ,pcr + bitb #TYP.3 + beq n@ t@ leax Three5,pcr -n@ ldy #80 - os9 I$WritLn - rts - -ShowDiskCapacity - leax DC,pcr - ldy #DCL - os9 I$Write - clra - ldb <totsects - std <tmpnum +n@ ldy #80 + os9 I$WritLn + rts + +ShowDiskCapacity + leax DC,pcr + ldy #DCL + os9 I$Write + clra + ldb <totsects + std <tmpnum ldd <totsects+1 - std <tmpnum+2 - leax <tmpnum,u - leay numbuf,u - lbsr itoa + std <tmpnum+2 + leax <tmpnum,u + leay numbuf,u + lbsr itoa * X points to buffer, Y holds size - pshs x - tfr y,d - leax d,x + pshs x + tfr y,d + leax d,x * X points at character after last member - leay SCTS,pcr -go@ lda ,y+ - sta ,x+ - cmpa #C$CR - bne go@ - puls x - ldy #80 - lda #$01 - os9 I$WritLn + leay SCTS,pcr +go@ lda ,y+ + sta ,x+ + cmpa #C$CR + bne go@ + puls x + ldy #80 + lda #$01 + os9 I$WritLn * Put out leading spaces and ( - leax SPPR,pcr - ldy #SPPRL - os9 I$Write + leax SPPR,pcr + ldy #SPPRL + os9 I$Write * Copy number from totsects - clra + clra ldd totsects,u - std tmpnum,u + std tmpnum,u lda totsects+2,u - clrb + clrb std tmpnum+2,u - leax <tmpnum,u - leay numbuf,u - lbsr itoa + leax <tmpnum,u + leay numbuf,u + lbsr itoa * X points to the ASCII number * Y holds length - lda #$01 - os9 I$Write - leax PRSP,pcr - ldy #PRSPL - os9 I$WritLn - rts - -ShowSectorsTrack - leax SST,pcr - ldy #SSTL - os9 I$Write - ldd <sectors - lbra PrintNum - -ShowTrackOffset - leax TOF,pcr - ldy #TOFL - os9 I$Write - clra - ldb <toffs - lbra PrintNum - -ShowSectorOffset - leax sOF,pcr - ldy #SOFL - os9 I$Write - clra - ldb <soffs - lbra PrintNum - -ShowSectorsTrackZero - leax TZST,pcr - ldy #TZSTL - os9 I$Write - ldd <sectors0 - lbra PrintNum - -ShowTotalPhysCylinders - leax TPC,pcr - ldy #TPCL - os9 I$Write - ldd <ncyls - lbra PrintNum - -ShowClusterSize - leax CSZ,pcr - ldy #CSZL - os9 I$Write - clra - ldb <clustsiz - lbra PrintNum - -ShowSAS - leax MSA,pcr - ldy #MSAL - os9 I$Write - clra - ldb <sas - lbra PrintNum - -ShowRecordingFormat - leax RF,pcr - ldy #RFL - os9 I$Write - leax _MFM,pcr - tst <mfm - bne n@ - leax FM,pcr -n@ ldy #80 - os9 I$WritLn - rts - -ShowTrackDensity - leax TD,pcr - ldy #TDL - os9 I$Write + lda #$01 + os9 I$Write + leax PRSP,pcr + ldy #PRSPL + os9 I$WritLn + rts + +ShowSectorsTrack + leax SST,pcr + ldy #SSTL + os9 I$Write + ldd <sectors + lbra PrintNum + +ShowTrackOffset + leax TOF,pcr + ldy #TOFL + os9 I$Write + clra + ldb <toffs + lbra PrintNum + +ShowSectorOffset + leax sOF,pcr + ldy #SOFL + os9 I$Write + clra + ldb <soffs + lbra PrintNum + +ShowSectorsTrackZero + leax TZST,pcr + ldy #TZSTL + os9 I$Write + ldd <sectors0 + lbra PrintNum + +ShowTotalPhysCylinders + leax TPC,pcr + ldy #TPCL + os9 I$Write + ldd <ncyls + lbra PrintNum + +ShowClusterSize + leax CSZ,pcr + ldy #CSZL + os9 I$Write + clra + ldb <clustsiz + lbra PrintNum + +ShowSAS + leax MSA,pcr + ldy #MSAL + os9 I$Write + clra + ldb <sas + lbra PrintNum + +ShowRecordingFormat + leax RF,pcr + ldy #RFL + os9 I$Write + leax _MFM,pcr + tst <mfm + bne n@ + leax FM,pcr +n@ ldy #80 + os9 I$WritLn + rts + +ShowTrackDensity + leax TD,pcr + ldy #TDL + os9 I$Write leax TPI135,pcr - ldb <dtype - lsrb - bcs n@ -x@ leax TPI48,pcr - ldb <dns - bitb #DNS.DTD - beq n@ - leax TPI96,pcr -n@ ldy #80 - os9 I$WritLn - rts - -ShowNumberLogCylinders - leax NLC,pcr - ldy #NLCL - os9 I$Write - ldd <ncyls - lbra PrintNum - -ShowNumberSurfaces - leax NS,pcr - ldy #NSL - os9 I$Write - clra - ldb <numsides - bra PrintNum - -ShowSectorInterleaveOffset - leax SI,pcr - ldy #SIL - os9 I$Write - clra - ldb <interlv - bra PrintNum - + ldb <dtype + lsrb + bcs n@ +x@ leax TPI48,pcr + ldb <dns + bitb #DNS.DTD + beq n@ + leax TPI96,pcr +n@ ldy #80 + os9 I$WritLn + rts + +ShowNumberLogCylinders + leax NLC,pcr + ldy #NLCL + os9 I$Write + ldd <ncyls + lbra PrintNum + +ShowNumberSurfaces + leax NS,pcr + ldy #NSL + os9 I$Write + clra + ldb <numsides + bra PrintNum + +ShowSectorInterleaveOffset + leax SI,pcr + ldy #SIL + os9 I$Write + clra + ldb <interlv + bra PrintNum + * Output decimal number to stdout with CR tacked at end * Entry: B = number * Leading zeros are NOT printed -PrintNum - pshs d - clr ,-s - clr ,-s - leax ,s - leay numbuf,u - bsr itoa - lda #$01 - os9 I$Write - leas 4,s - lbra LineFd - -Base fcb $3B,$9A,$CA,$00 1,000,000,000 - fcb $05,$F5,$E1,$00 100,000,000 - fcb $00,$98,$96,$80 10,000,000 - fcb $00,$0f,$42,$40 1,000,000 - fcb $00,$01,$86,$a0 100,000 - fcb $00,$00,$27,$10 10,000 - fcb $00,$00,$03,$e8 1,000 - fcb $00,$00,$00,$64 100 - fcb $00,$00,$00,$0a 10 - fcb $00,$00,$00,$01 1 - +PrintNum + pshs d + clr ,-s + clr ,-s + leax ,s + leay numbuf,u + bsr itoa + lda #$01 + os9 I$Write + leas 4,s + lbra LineFd + +Base fcb $3B,$9A,$CA,$00 1,000,000,000 + fcb $05,$F5,$E1,$00 100,000,000 + fcb $00,$98,$96,$80 10,000,000 + fcb $00,$0f,$42,$40 1,000,000 + fcb $00,$01,$86,$a0 100,000 + fcb $00,$00,$27,$10 10,000 + fcb $00,$00,$03,$e8 1,000 + fcb $00,$00,$00,$64 100 + fcb $00,$00,$00,$0a 10 + fcb $00,$00,$00,$01 1 + * Entry: * X = address of 24 bit value * Y = address of buffer to hold hexadecimal number @@ -2140,107 +2147,107 @@ * leas 1,s * ldy #0006 * puls x,pc - + * Entry: * X = address of 32 bit value * Y = address of buffer to hold number * Exit: * X = address of buffer holding number * Y = length of number string in bytes -itoa pshs u,y - tfr y,u - ldb #10 max number of numbers (10^9) - pshs b save count on stack - leay Base,pcr point to base of numbers -s@ lda #$30 put #'0 - sta ,u at U -s1@ bsr Sub32 ,X=,X-,Y - inc ,u - bcc s1@ if X>0, continue - bsr Add32 add back in - dec ,u+ - dec ,s decrement counter - beq done@ - lda ,s - cmpa #$09 - beq comma@ - cmpa #$06 - beq comma@ - cmpa #$03 - bne s2@ -comma@ ldb #', - stb ,u+ -s2@ leay 4,y point to next - bra s@ -done@ leas 1,s +itoa pshs u,y + tfr y,u + ldb #10 max number of numbers (10^9) + pshs b save count on stack + leay Base,pcr point to base of numbers +s@ lda #$30 put #'0 + sta ,u at U +s1@ bsr Sub32 ,X=,X-,Y + inc ,u + bcc s1@ if X>0, continue + bsr Add32 add back in + dec ,u+ + dec ,s decrement counter + beq done@ + lda ,s + cmpa #$09 + beq comma@ + cmpa #$06 + beq comma@ + cmpa #$03 + bne s2@ +comma@ ldb #', + stb ,u+ +s2@ leay 4,y point to next + bra s@ +done@ leas 1,s * 1,234,567,890 - ldb #14 length of string with commas + 1 - ldx ,s++ get pointer to buffer -a@ decb - beq ex@ - lda ,x+ get byte - cmpa #'0 - beq a@ - cmpa #', - beq a@ - clra - tfr d,y transfer count into Y -v@ leax -1,x - puls u,pc -ex@ ldy #0001 - bra v@ - + ldb #14 length of string with commas + 1 + ldx ,s++ get pointer to buffer +a@ decb + beq ex@ + lda ,x+ get byte + cmpa #'0 + beq a@ + cmpa #', + beq a@ + clra + tfr d,y transfer count into Y +v@ leax -1,x + puls u,pc +ex@ ldy #0001 + bra v@ + * Entry: * X = address of 32 bit minuend * Y = address of 32 bit subtrahend * Exit: * X = address of 32 bit difference -Sub32 ldd 2,x - subd 2,y - std 2,x - ldd ,x - sbcb 1,y - sbca ,y - std ,x - rts - - +Sub32 ldd 2,x + subd 2,y + std 2,x + ldd ,x + sbcb 1,y + sbca ,y + std ,x + rts + + * Entry: * X = address of 32 bit number * Y = address of 32 bit number * Exit: * X = address of 32 bit sum -Add32 ldd 2,x - addd 2,y - std 2,x - ldd ,x - adcb 1,y - adca ,y - std ,x - rts - - - IFNE DOROLL +Add32 ldd 2,x + addd 2,y + std 2,x + ldd ,x + adcb 1,y + adca ,y + std ,x + rts + + + ifne DOROLL RollMsg fcc " Recording Format: FM/MFM" - fcb C$LF + fcb C$LF fcc " Track density in TPI: 48/96" - fcb C$LF + fcb C$LF fcc " Number of Cylinders: 0000" - fcb C$LF + fcb C$LF fcc " Number of Surfaces: 0000" - fcb C$LF + fcb C$LF fcc "Sector Interleave Offset: 0000" - fcb C$LF + fcb C$LF fcc " Disk type: 0000" - fcb C$LF + fcb C$LF fcc " Sectors/Cluster: 0000" - fcb C$LF + fcb C$LF fcc " Sectors/Track: 0000" - fdb $0A0A + fdb $0A0A fcc "Sector: 00 Track: 00 Side: 00" -RollLen equ *-RollMsg - ENDC - - emod -eom equ * - end +RollLen equ *-RollMsg + endc + + emod +eom equ * + end