mirror of
https://github.com/AppleWin/AppleWin.git
synced 2024-11-19 04:08:45 +00:00
1495 lines
34 KiB
ArmAsm
1495 lines
34 KiB
ArmAsm
ORG $2000 ;Re-ORG as necessary
|
|
LST ON,S,ASYM,VSYM
|
|
SBTL 'DISK FORMAT & PREPARATION ROUTINE'
|
|
REP 50
|
|
*
|
|
* APPLE'S PRODOS FORMATTING/DISK BUILDING MODULE
|
|
*
|
|
* VERSION 1.0.3
|
|
*
|
|
*
|
|
* MODIFIED FOR COMPLIANCE WITH PRODOS TECHNOTE #16
|
|
* AND, TO CONSOLIDATE BUILDDISK, AND FORMATTER.
|
|
* INTO ONE MODULE, ACCESSED WITH A SINGLE CALL.
|
|
* ALSO TO PROVIDE A MECHANISM FOR THE USER TO
|
|
* DETERMINE THE NUMBER OF BLOCKS ON THE DEVICE,
|
|
* AND WHETHER IT IS A DISK II, /RAM, OR OTHER.
|
|
* ON 10/17/85, BY PETE MC DONALD.
|
|
*
|
|
* COPYRIGHT APPLE COMPUTER, INC., 1982-85
|
|
*
|
|
REP 50
|
|
*
|
|
* ENTRY1: (ORG+$10)
|
|
* INITIALIZES THE SPECIFIED UNIT #. BY:
|
|
* -FORMATTING PHYSICAL MEDIA. IF IT CAN BE FORMATTED
|
|
* -WRITING BOOT LOADER IN BLOCKS 0,1 (EVEN IF IT IS
|
|
* NOT A DISK II).
|
|
* -CREATING VOLUME DIRECTORY IN BLOCKS 2,3,4,5 WITH
|
|
* THE NAME CONTAINED IN THE FIRST 16 BYTES OF THE MODULE.
|
|
* -ALLOCATING BIT MAP IN BLOCKS 6 AND UP.
|
|
*
|
|
* ON ENTRY, @ ENTRY1 (ORG+$10):
|
|
* A = THE UNIT NUMBER, IN THE FORMAT REQUIRED BY THE
|
|
* PRODOS WRITE BLOCK CALL.
|
|
* X/Y = THE ADDRESS OF A BUFFER OF AT LEAST 512 BYTES
|
|
* WHICH THIS ROUTINE CAN FREELY USE. X = THE
|
|
* LOW PART OF THE ADDRESS.
|
|
* THE FIRST 16 BYTES OF THE MODULE MUST CONTAIN THE DESIRED
|
|
* VOLUME NAME, WHERE THE FIRST BYTE CONTAINS THE LENGTH
|
|
* OF THE NAME (SHOULD BE 1 THRU 15) AND THE REMAINING 15
|
|
* BYTES CONTAIN THE NAME (SHOULD BE A PROPER VOLUME
|
|
* NAME, WITH NO LEADING SLASH). THE ORIGINAL
|
|
* CONTENTS OF THESE 16 BYTES ARE 12 (THE LENGTH), AND THE
|
|
* NAME 'DEFAULT.NAME '. NO CHECKING IS DONE ON THESE
|
|
* 16 BYTES, BUT BIT 7 IS STRIPPED FROM EACH BYTE OF THE
|
|
* NAME.
|
|
*
|
|
*
|
|
* ON RETURN:
|
|
* Z IS UNDEFINED.
|
|
* C = THE ERROR STATUS:
|
|
* C = 0 INDICATES NO DETECTED ERRORS.
|
|
* C = 1 INDICATES AN ERROR, IN WHICH CASE THE ACCUMULATOR
|
|
* CONTAINS THE PRODOS ERROR CODE.
|
|
* A = 0 IF THERE WAS NO ERROR (C = 0), OR IT CONTAINS THE
|
|
* PRODOS ERROR CODE IF THERE WAS AN ERROR (C = 1).
|
|
* X AND Y ARE DESTROYED.
|
|
* THE FIRST 512 BYTES OF THE BUFFER ARE DESTROYED.
|
|
* 0-PAGE LOCATIONS 2 AND 3 HAVE BEEN USED, BUT HAVE BEEN RESTORED
|
|
* TO THEIR VALUES AT ENTRY.
|
|
* 0-PAGE LOCATIONS $42-$47 HAVE BEEN CHANGED AND NOT RESTORED.
|
|
*
|
|
* IF CALLED FOR A NON-EXISTENT DISK (INCLUDING SLOT 0),
|
|
* ERROR $28 WILL BE RETURNED.
|
|
* IF IT IS AN EXISTENT UNIT NUMBER, THE PROCESS BEGINS,
|
|
* AND OTHER ERRORS ARE THEN POSSIBLE.
|
|
*
|
|
* USES UNIT, ROM ID'S, AND DRIVER ADDRESS TO DETERIME SIZE
|
|
* THOSE DEVICES FOR WHICH THE SIZE IS GOTTEN BY
|
|
* A STATUS CALL TO THE SLOT'S ROM, THE DRIVE BIT IS
|
|
* PRESENT IN LOCATION $43 AND IS USED TO INDEX INTO THE
|
|
* DRIVER VECTOR TABLE. THEREFORE, THE 2 DRIVES IN A SLOT
|
|
* COULD BE DIFFERENT SIZES.
|
|
*
|
|
page
|
|
REP 50
|
|
*
|
|
* ENTRY2 (ORG+$13):
|
|
* RETURNS THE SIZE AND WHETHER IS DISK II, /RAM, OR OTHER.
|
|
*
|
|
* ON ENTRY, @ ENTRY2 (ORG+$13):
|
|
* A = UNIT NUMBER, IN FORMAT REQUIRED BY PRODOS.
|
|
* X/Y = THE ADDRESS OF A BUFFER OF AT LEAST 512 BYTES,
|
|
* WHICH THIS ROUTINE CAN USE FREELY. X = THE
|
|
* LOW PART OF THE ADDRESS.
|
|
*
|
|
*
|
|
* ON RETURN:
|
|
* Z IS UNDEFINED.
|
|
* C = THE ERROR STATUS.
|
|
* C = 0, NO ERROR
|
|
* C = 1, AN ERROR WAS DETECTED.
|
|
* X = (SIZE lo) IF C = 0, X = UNDEFINED IF C = 1
|
|
* Y = (SIZE HI) IF C = 0. IF C = 1 THEN y = undefined
|
|
* A = error code if C = 1: IF C = 0 then
|
|
* A = 0 FOR DISK II, A = 1 FOR /RAM, A = 2 FOR ALL OTHERS.
|
|
*
|
|
* THE FIRST 512 BYTES OF THE BUFFER ARE DESTROYED.
|
|
* ZERO PAGE LOCS 2 AND 3 HAVE BEEN USED, BUT HAVE
|
|
* BEEN RESTORED TO THEIR VALUES AT ENTRY.
|
|
* 0 - PAGE LOCATIONS 42-47, HAVE BEEN CHANGED AND
|
|
* NOT RESTORED.
|
|
*
|
|
* IF CALLED FOR NON EXISTENT DEVICE, ERROR $28 WILL BE RETURNED
|
|
* IF CALLED FOR EXISTENT DEVICE, PROCESS WILL BEGIN, AND THEN
|
|
* OTHER ERRORS ARE POSSIBLE.
|
|
*
|
|
* USES UNIT, ROM ID'S, AND DRIVER ADDRESS TO DETERIME SIZE
|
|
* THOSE DEVICES FOR WHICH THE SIZE IS GOTTEN BY
|
|
* A STATUS CALL TO THE SLOT'S ROM, THE DRIVE BIT IS
|
|
* PRESENT IN LOCATION $43 AND IS USED TO INDEX INTO THE
|
|
* DRIVER VECTOR TABLE. THEREFORE, THE 2 DRIVES IN A SLOT
|
|
* COULD BE DIFFERENT SIZES.
|
|
*
|
|
page
|
|
REP 50
|
|
*
|
|
MLIENTRY EQU $BF00 ;MLI ENTRY POINT
|
|
DEVADRS01 EQU $BF10 ;DEVICE DRIVER VECTOR TABLE
|
|
DEVCNT EQU $BF31 ;ONLINE DEVICE COUNT
|
|
DEVLST EQU $BF32 ;ONLINE DEVICE LIST
|
|
DATELO EQU $BF90 ;DATE/TIME (4 BYTES)
|
|
KMVERSN EQU $BFFE ;MINIMUM VERSION #
|
|
KVERSION EQU $BFFF ;PRODOS VERSION
|
|
ENTRYB EQU $0D ;ENTRIES/BLOCK IN A DIRECTORY
|
|
ENTRYL EQU $27 ;DIRECTORY ENTRY LENGTH
|
|
*
|
|
* PAGE ZERO LOCATIONS
|
|
*
|
|
BUFFPTR EQU 2 ;AND 3
|
|
DEVCMD EQU $42
|
|
DEVUNIT EQU $43
|
|
DEVBLK EQU $46 ;AND 47
|
|
*
|
|
BUILDDISK EQU *
|
|
*
|
|
DUMSIZE DB 12 ;SIZE OF THE DUMMY NAME
|
|
DUMMYNAM ASC 'DEFAULT.NAME '
|
|
page
|
|
*
|
|
* ACTUAL ENTRY POINTS ARE HERE
|
|
*
|
|
entry1 jmp form ;normal builddisk entry
|
|
entry2 jmp stat ;return device size and type.
|
|
*
|
|
* this performs the normal format and disk build operations
|
|
*
|
|
form jsr validate ;save regs/verify unit num
|
|
bcs out ;error go home zp restored by validate
|
|
jmp Build ;else do format/build
|
|
*
|
|
* returns device size in x/y y=hi, and a= 0 for DISK II,
|
|
* 1 for /RAM, 2 for all others./
|
|
*
|
|
stat jsr validate ;save zp/validate unit #
|
|
bcs out ;error go home/zp restored by validate.
|
|
jsr getblks ;else get and return size/type of unit
|
|
stx loctemp ;save size hi for a sec
|
|
jsr error ;no error, but fix zp locs 2,3
|
|
tax ;for the sake of consistency swap
|
|
tya ;regs around to conform with normal
|
|
ldy loctemp ;status call.
|
|
out rts ;bye
|
|
*
|
|
Validate STA UNITNUM1 ;SAVE THE PASSED UNIT NUMBER
|
|
STA UNITNUM2 ;SAVE THE PASSED UNIT NUMBER
|
|
STA UNITNUM3 ;SAVE THE PASSED UNIT NUMBER
|
|
*
|
|
AND #$F0 ;CLEAR LO BITS JUST IN CASE
|
|
STA UNITLEFT ;SAVE FOR LATER (LEFT JUSTIFIED)
|
|
*
|
|
LDA BUFFPTR ;SAVE CURRENT CONTENTS OF 0-PAGE LOCATIONS
|
|
STA SAVEZERO
|
|
LDA BUFFPTR+1
|
|
STA SAVEZERO+1
|
|
*
|
|
STX BUFFPTR ;SAVE PASSED BUFFER ADDRESS IN 0-PAGE
|
|
STY BUFFPTR+1
|
|
STX LBUFFPTR ;ALSO SAVE IN LOCAL PARAMETER LIST
|
|
STY LBUFFPTR+1
|
|
*
|
|
LDX DEVCNT ; POINT TO LAST ACTIVE DISK
|
|
LOOP LDA DEVLST,X ; GET BYTE FOR ACTIVE DISK
|
|
AND #$F0 ; CLEAR OUT DISKTYPE INDICATOR
|
|
CMP UNITLEFT ; FOUND OUR DISK?
|
|
BEQ FOUND ; YES
|
|
DEX ; NO, POINT TO NEXT DISK
|
|
BPL LOOP ; IF X HAS NOT GONE NEGATIVE, THERE ARE MORE DISKS
|
|
*
|
|
* DIDN'T FIND DISK.
|
|
LDA #$28 ; SIGNAL NO DEVICE
|
|
SEC ; SIGNAL ERROR
|
|
BCS ERROR ;ALWAYS
|
|
found clc
|
|
RTS
|
|
*
|
|
BUILD equ *
|
|
jsr doformat ;go format if can
|
|
bcs error ;taken if error during format.
|
|
jsr isitram ;is unitnum /RAM ?o-SD
|
|
BNE OKDISK ;NO
|
|
*
|
|
LDA #0 ;No error, but do nothing |
|
|
CLC ; since RAMDISK Format does it for us |
|
|
BCC ERROR ;ALWAYS |
|
|
*
|
|
okdisk equ * ;mod
|
|
lda UNITLEFT ;*mod* recover disktype
|
|
STA DISKTYPE ;SAVE FOR LATER
|
|
JSR MLIENTRY ;WRITE BOOT BLOCK 0
|
|
DB $81
|
|
DW BLK0PARM
|
|
BNE ERROR
|
|
*
|
|
JSR MLIENTRY ;WRITE BOOT BLOCK 1
|
|
DB $81
|
|
DW BLK1PARM
|
|
BNE ERROR
|
|
*
|
|
JSR ROOTBLK2 ;WRITE ROOT DIRECTORY BLK 2
|
|
BCS ERROR
|
|
JSR ROOTBLKS ;WRITE ROOT DIRECTORY BLKS 3-5
|
|
BCS ERROR
|
|
JSR BITMAPS ;WRITE BIT MAP IN BLKS 6 AND UP
|
|
*
|
|
ERROR LDX SAVEZERO ;RESTORE 0-PAGE LOCATIONS
|
|
STX BUFFPTR
|
|
LDX SAVEZERO+1
|
|
STX BUFFPTR+1
|
|
*
|
|
RTS
|
|
*
|
|
SAVEZERO DW 0
|
|
DISKTYPE DB 0 ;LOW ORDER NIBBLE FROM DEVLST
|
|
*
|
|
BLK0PARM DB 3 ;3 PARAMETERS
|
|
UNITNUM1 DB 0 ;UNIT NUMBER FILLED IN FROM CALLER
|
|
DW BOOTZERO ;ADDRESS OF BOOT BLOCK
|
|
DW 0 ;WRITE TO BLOCK 0
|
|
*
|
|
BLK1PARM DB 3 ;3 PARAMETERS
|
|
UNITNUM2 DB 0 ;UNIT NUMBER FILLED IN FROM CALLER
|
|
DW BOOTONE ;ADDRESS OF BOOT BLOCK
|
|
DW 1 ;WRITE TO BLOCK 1
|
|
SBTL 'SETUP & WRITE ROOT DIRECTORY'
|
|
ROOTBLK2 EQU *
|
|
JSR MLIENTRY ;GET DATE/TIME
|
|
DB $82
|
|
DW 0
|
|
* CANNOT GENERATE AN ERROR FROM THIS CALL
|
|
JSR CLRBUFF ;CLEAR BUFFER
|
|
LDY #2 ;POINT TO FORWARD POINTER IN BUFFER
|
|
LDA #3 ;BLOCK 2 POINTS FORWARD TO BLOCK 3
|
|
STA (BUFFPTR),Y
|
|
*
|
|
LDY #4+0 ;POINT TO STORAGE TYPE/NAME LENGTH
|
|
LDA DUMSIZE ;USE DUMMY NAME
|
|
ORA #$F0 ;OR IN THE DIRECTORY MARKER
|
|
STA (BUFFPTR),Y
|
|
LDX #0 ;POINT TO FIRST CHARACTER OF NAME
|
|
RTD1 EQU *
|
|
INY
|
|
LDA DUMMYNAM,X ;GET VOLUME NAME
|
|
AND #$7F ;NO HI BIT
|
|
STA (BUFFPTR),Y ;WRITE TO BUFR
|
|
INX
|
|
CPX DUMSIZE ;DONE?
|
|
BNE RTD1 ;NO
|
|
*
|
|
LDX #0 ;POINT TO DATE/TIME IN PRODOS
|
|
LDY #4+$18 ;POINT TO DATE/TIME IN BUFFER
|
|
RT2 LDA DATELO,X ;TRANSFER DATE/TIME TO BUFFER
|
|
STA (BUFFPTR),Y
|
|
INX
|
|
INY
|
|
CPX #4
|
|
BNE RT2
|
|
*
|
|
LDA KVERSION ;GET VERSION # FROM GLOBALS
|
|
STA (BUFFPTR),Y
|
|
*
|
|
INY
|
|
LDA KMVERSN ;AND MINIMUM VERSION #
|
|
STA (BUFFPTR),Y
|
|
INY
|
|
LDA #$C3 ;GET ACCESS BYTE VALUE
|
|
STA (BUFFPTR),Y
|
|
INY
|
|
LDA #ENTRYL ;GET ENTRY LENGTH
|
|
STA (BUFFPTR),Y
|
|
INY
|
|
LDA #ENTRYB ;GET ENTRIES/BLOCK
|
|
STA (BUFFPTR),Y
|
|
LDY #4+$23 ;POINT TO BITMAP PTR
|
|
LDA #6
|
|
STA (BUFFPTR),Y
|
|
JSR GETBLKS ;GET TOTAL BLKS (A=LO,X=HI)
|
|
BCS RTRET ;QUIT ON ERROR
|
|
LDY #4+$25 ;POINT TO TOTAL BLOCKS IN BUFFER
|
|
STA (BUFFPTR),Y ;LO
|
|
STA TEMP ;ALSO STORE IN TEMP AND TEMP1
|
|
INY
|
|
TXA
|
|
STA (BUFFPTR),Y ;HI
|
|
STA TEMP1
|
|
*
|
|
LDA #1 ;SET UP TO WRITE BLOCK 2 (GETS INCREMENTED)
|
|
STA BLKNUM
|
|
JSR WRTBLK
|
|
RTRET RTS ;C=1 MEANS ERROR ON WRITE, ELSE GOOD
|
|
*
|
|
TEMP DB 0
|
|
TEMP1 DB 0
|
|
PAGE
|
|
REP 50
|
|
*
|
|
* isitram - determine if chosen unit, is /ram
|
|
*
|
|
* if vector is $ff00, then is /ram.
|
|
*
|
|
* ENTRY: unitleft contains left justified unitnum
|
|
* EXIT: X unchanged, a,y scrambled
|
|
* is ram, z=1
|
|
* not ram z=0
|
|
*
|
|
isitram equ *
|
|
lda unitleft ;get justified unit number
|
|
lsr a ;right justify
|
|
lsr a
|
|
lsr a
|
|
jsr getvect ;get device driver address
|
|
bne notram ;taken if low order of vect not 0
|
|
cpy #$FF ;is high byte $FF
|
|
bne notram ;if not is not /ram and z=0 return
|
|
lda #00 ;is /ram make z=1
|
|
notram rts ;bye
|
|
*
|
|
*
|
|
* isitdiskII - is unit number a disk II
|
|
* use signature bytes in CN00
|
|
* derive cn from unitleft
|
|
* ENtry: unitleft contains left just unitnum
|
|
* exit : z=1 is diskII
|
|
* z=0 not disKII
|
|
* a,x scramble
|
|
* y unchanged
|
|
*
|
|
isitdiskII equ *
|
|
lda unitleft ;get unit number
|
|
and #$70 ;extract slot number
|
|
lsr a ;move slot to low nibble.
|
|
lsr a
|
|
lsr a
|
|
lsr a
|
|
ora #$c0 ;append $C for a slot address
|
|
sta loadd+2 ;mod hi byte of lda to point to CNXX
|
|
ldx #3 ;init count of bytes to check
|
|
chklp lda dIIlocs,x ;get lowbyte of address to check
|
|
sta loadd+1 ;save at load instruction
|
|
loadd lda $C000 ; self modifying get byte at loc
|
|
cmp dIIids,x ;is it a DiskII signature ?
|
|
bne endDII ;taken if no
|
|
dex ;else check the next one
|
|
bpl chklp ;are there anymore ?
|
|
inx ;make z=1
|
|
endDII rts ;bye z=0 is not DII, z=1, is dII
|
|
dIIids dfb $20,0,3,0 ;DiskII signatures,
|
|
dIIlocs dfb 1,3,5,$ff ;and thier respective locations.
|
|
*
|
|
*
|
|
* DOFORMAT-format physical disk media if possible
|
|
*
|
|
* If disk II, use formatter driver.
|
|
* If ram based. Or if Rom based with can format true, use
|
|
* device format call.
|
|
* If is Rom based, and can format is not true, then do nothing.
|
|
* called only after it has been determined that unit # is valid
|
|
*
|
|
* ENTRY: BUFFPTR, & BUFFPTR+1, are user passed buffer address.
|
|
* UNITLEFT contains left justified unit num.
|
|
* UNITNUM1, contains originally passed unit num.
|
|
* A=unitnum, X&Y=don't care.
|
|
*
|
|
* EXIT: Success a=0 c=0 x,y unknown.
|
|
* Failure, a=errnum, c=1, x,y unknown.
|
|
* if ROM call made, $42-$47, destroyed.
|
|
*
|
|
*
|
|
doformat equ *
|
|
jsr isitdiskII ;is unit a disk II
|
|
bne dforcont ;taken if not
|
|
ldx #$D ;init index/count-1
|
|
savlp lda $d0,x ;save locs $D0 - $DD
|
|
sta locbuff,x
|
|
dex ;next one /any more ?
|
|
bpl savlp ;taken if yes
|
|
lda UNITLEFT ;get the original unit num
|
|
jsr FORMATTII ;format a disk II
|
|
php ;save error status
|
|
pha ;save error code (if any)
|
|
ldx #$D ;restore $d0 - $DD
|
|
reslp lda locbuff,x
|
|
sta $D0,x
|
|
dex ;next one /anymore ?
|
|
bpl reslp ;taken if yes.
|
|
pla ;recover Error code
|
|
plp ;and error status.
|
|
rts ;done bye
|
|
*
|
|
dforcont lda unitleft ;get unit num again
|
|
lsr a ;right justify
|
|
lsr a
|
|
lsr a
|
|
jsr getvect ;get vector to device driver.
|
|
sta devjmp ;save lowbyte
|
|
sty devjmp+1 ;and high byte for driver call.
|
|
tya ;get high byte of address
|
|
and #$f0 ;clear low nibble
|
|
cmp #$c0 ;does it point to $CN ?
|
|
bne dforcont1 ;taken if no.(is not ROM based)
|
|
*
|
|
sty modadd+2 ;set up LDA to point at attributes
|
|
modadd lda $C0FE ;modified by previous instruction.
|
|
and #$08 ;isolate can format bit.
|
|
bne dforcont1 ;taken if it supports formatting
|
|
clc ;does not, but no error, just return for
|
|
rts ;builddisk to write dir etc.
|
|
*
|
|
dforcont1 lda unitnum1 ;get back unit num
|
|
sta devunit ;save it for driver
|
|
lda #00 ;zero for
|
|
sta devblk ;block
|
|
sta devblk+1 ;and block hi
|
|
lda #03 ;get format command
|
|
sta devcmd ;save it for driver
|
|
sta $cfff ;turn off whoever has $c800
|
|
lda $c08b ;switch language card in
|
|
lda $c08b
|
|
jsr asjmp ;jsr to jmp indirect to driver.
|
|
bit $c082 ;switch rom back in.
|
|
rts ;ret to continue build, with error if any
|
|
*
|
|
* GETBLKS - GET # OF BLOCKS ON DEVICE.
|
|
*
|
|
* IF IT'S A DISKII, BLOCKS ARE HARDCODED AT $118. IF
|
|
* is /RAM # blocks hardcoded at $7f. If is is an
|
|
* OTHER KIND OF DISK, NUMBER OF BLOCKS MAY BE IN
|
|
* $CNFC,FD. BUT IF THEY CONTAIN 0, THEN MUST CALL
|
|
* ROM CODE WITH STATUS REQUEST TO GET BLOCKS.
|
|
*
|
|
* ENTRY: UNITNUM1, UNITLEFT, AND DISKTYPE MUST BE SET.
|
|
* EXIT: Success: Carry = 0, X=HI,A=LO BLOCKS
|
|
* : Y=0 for DISK II, Y=1 for /RAM, Y=2 for all others.
|
|
* Failure: Carry = 1, Accum = error code
|
|
* : X and Y undefined
|
|
* If ROM call is made: $42-$47 destroyed
|
|
*
|
|
REP 50
|
|
*
|
|
GETBLKS equ * ;was LDA DISKTYPE
|
|
jsr isitdiskII ;was CMP #DISKII
|
|
BNE DB1a ;NO
|
|
lda #0 ;save the fact that this is disk II
|
|
sta loctemp ;at a local temp
|
|
LDA #$18 ;YES, SIZE = 280 BLOCKS
|
|
LDX #1
|
|
BNE DB2 ;ALWAYS
|
|
*
|
|
db1a equ *
|
|
jsr isitram ;is this /RAM ?
|
|
bne db1 ;taken if not
|
|
lda #1 ;save the fact that tis is /RAM
|
|
sta loctemp ;at a local temp
|
|
ldx #0 ;and there are $7f blocks
|
|
lda #$7f ;get them and reset z
|
|
bne db2 ;alwayss
|
|
*
|
|
* Not DISK II SO CHECK $CNFC-FD
|
|
*
|
|
DB1 LDA UNITLEFT ; get unit number (left justified) |
|
|
LSR A ; SHIFT UNIT NUMBER INTO TABLE INDEX |
|
|
LSR A ; |
|
|
LSR A ; |
|
|
STA UNITRIGHT ; save it |
|
|
JSR GETVECT ;GET DRIVER VECTOR FROM TABLE |
|
|
*
|
|
* mod to check if driver is in CN00, if not must ask size.
|
|
*
|
|
tya
|
|
and #$F0 ;clear all but high nibble of address
|
|
cmp #$c0 ;is it in rom space
|
|
bne ask ;taken if not in ROM
|
|
*
|
|
*
|
|
STY BUFFPTR+1 ;HI |
|
|
LDA #$FC
|
|
STA BUFFPTR ;LO
|
|
LDY #0
|
|
LDA (BUFFPTR),Y
|
|
PHA
|
|
INY
|
|
LDA (BUFFPTR),Y
|
|
TAX
|
|
BNE DB3 ; if not zero, then size is hardwired
|
|
PLA ; get lo byte
|
|
BNE DB2 ; if not zero then return
|
|
ask JSR ASKSIZE ; need to go ask device for size
|
|
BCS RESTORE ; branch if error
|
|
lda #2 ;save the fact that this is a "other"
|
|
sta loctemp ;at a local temp
|
|
TXA ; get low byte
|
|
PHA ; save it
|
|
TYA ; get hi byte
|
|
TAX ; put in X
|
|
PLA ; get low byte back
|
|
bcc RESTORE ; GO RESTORE BUFFER POINTER AND EXIT
|
|
*
|
|
DB3 PLA
|
|
DB2 CLC ; clear carry to indicate success
|
|
RESTORE LDY LBUFFPTR ; RESTORE THE POINTER TO THE CALLER'S BUFFER
|
|
STY BUFFPTR
|
|
LDY LBUFFPTR+1
|
|
STY BUFFPTR+1
|
|
ldy loctemp ;get the kind of device anbd return it.
|
|
RTS
|
|
*
|
|
ASKSIZE EQU * ; ask device for size via status command
|
|
LDA #0 ; COMMAND BYTE = 0 (give status)
|
|
STA DEVCMD ; store in zero page parameters
|
|
STA DEVBLK ; block #
|
|
STA DEVBLK+1
|
|
LDA UNITRIGHT ; get unit # (right justified)
|
|
JSR GETVECT ; |
|
|
STA DEVJMP ; |
|
|
STY DEVJMP+1 ; |
|
|
LDA UNITNUM1 ; get unit #, with possible low nibble junk
|
|
STA DEVUNIT
|
|
STA $CFFF
|
|
lda $c08b
|
|
lda $c08b
|
|
JSR ASJMP
|
|
bit $c082
|
|
RTS
|
|
ASJMP JMP (DEVJMP) ; indirect jump to ROM entry
|
|
BRK
|
|
*
|
|
GETVECT EQU * ; |
|
|
TAY ;VECTOR INTO TABLE IN ACC ON ENTRY |
|
|
LDA DEVADRS01,Y ;GET LOW BYTE |
|
|
PHA ;SAVE IT |
|
|
LDA DEVADRS01+1,Y ;GET HI BYTE |
|
|
TAY ;SAVE IT IN Y |
|
|
PLA ;GET LO BYTE BACK |
|
|
RTS ; |
|
|
*
|
|
UNITLEFT DB 0 ; UNIT NUMBER
|
|
UNITRIGHT DB 0 ; reserve a byte for saving slot
|
|
DEVJMP DW 0 ; ADDRESS IN ROM
|
|
*
|
|
REP 50
|
|
*
|
|
* WRTBLK -- INCREMENTS THE BLOCK NUMBER AND WRITES
|
|
* CURRENT BUFFER TO THAT BLOCK
|
|
*
|
|
REP 50
|
|
*
|
|
WRTBLK EQU *
|
|
INC BLKNUM
|
|
JSR MLIENTRY
|
|
DB $81 ;BLOCK WRITE
|
|
DW PARMLIST
|
|
RTS
|
|
*
|
|
PARMLIST EQU * ;PARAMETER LIST FOR WRITING BLOCKS 2 AND UP
|
|
DB 3 ;PARM COUNT
|
|
UNITNUM3 DB 0
|
|
LBUFFPTR DW 0
|
|
BLKNUM DW 0
|
|
PAGE
|
|
REP 50
|
|
*
|
|
* ROOTBLKS - SETUP AND WRITE FORWARD & BACKWARD POINTERS
|
|
* INTO BLOCKS 3,4,5 OF ROOT DIRECTORY
|
|
*
|
|
REP 50
|
|
*
|
|
ROOTBLKS EQU *
|
|
JSR CLRBUFF ;CLEAR OUT BUFFER AREA
|
|
LDA #2 ;BACKWARD POINTER FOR BLOCK 3
|
|
LDX #4 ;FORWARD POINTER FOR BLOCK 3
|
|
JSR BF1 ;WRITE BLOCK 3 TO DISK
|
|
BCS BF2 ;ERR
|
|
LDA #3 ;BACKWARD POINTER FOR BLOCK 4
|
|
LDX #5 ;FORWARD POINTER FOR BLOCK 4
|
|
JSR BF1 ;WRITE BLK 4 TO DISK
|
|
BCS BF2 ;ERR
|
|
LDA #4 ;BACKWARD POINTER FOR BLOCK 5
|
|
LDX #0 ;FORWARD POINTER FOR BLOCK 5
|
|
BF1 LDY #0 ;POINT TO BACKWARD POINTER
|
|
STA (BUFFPTR),Y ;STORE BACKWARD PTR IN BUFFER
|
|
LDY #2 ;POINT TO FORWARD POINTER
|
|
TXA
|
|
STA (BUFFPTR),Y ;STORE FORWARD PTR IN BUFFER
|
|
JSR WRTBLK ;CALL MLI FOR WRITE TO DISK
|
|
BF2 RTS ;C=1 ERR ON WRITE ELSE OK
|
|
SBTL 'SETUP AND WRITE BITMAP'
|
|
REP 50
|
|
*
|
|
* CONVBLKS - CONVERT # OF BLOCKS ON DEVICE TO # OF
|
|
* BYTES TO SET IN BITMAP FOR NEWLY FORMATTED DISK.
|
|
*
|
|
* ENTER: TEMP = LO BLOCKS
|
|
* TEMP1 = HI BLOCKS
|
|
*
|
|
* EXIT: TEMP = LO BYTES
|
|
* TEMP1 = HI BYTES
|
|
* NBITS = EXTRA BITS
|
|
*
|
|
REP 50
|
|
*
|
|
CONVBLKS EQU *
|
|
LDA TEMP ; get low order # of blocks
|
|
AND #$07 ; put remainder of bits in NBITS
|
|
STA NBITS
|
|
LDA TEMP ; mask out low bits
|
|
AND #$F8 ; so that ROR's work
|
|
CLC ; clear carry for first time
|
|
LDX #3 ; slide bits down 3 places
|
|
CNV1 ROR TEMP1 ; slide top bits down
|
|
ROR A ; slide bottom bits down
|
|
DEX
|
|
BNE CNV1 ; go back and do more
|
|
STA TEMP ; put back lower bits
|
|
RTS
|
|
*
|
|
NBITS DB 0
|
|
PAGE
|
|
REP 50
|
|
*
|
|
* BITMAPS - SETUP AND WRITE BIT MAPS TO NEWLY FORMATTED
|
|
* DISKS. WORKS FOR ARBITRARY-SIZED VOLUMES.
|
|
*
|
|
* INPUTS:
|
|
* TEMP,TEMP1 -- word containing # blocks in device
|
|
*
|
|
* OUTPUTS:
|
|
* TEMP,TEMP1 -- destroyed
|
|
* CARRY -- 0 -> success
|
|
* 1 -> failure, code in accumulator
|
|
*
|
|
REP 50
|
|
*
|
|
BITMAPS EQU *
|
|
jsr convblks ;convert # blks to # of bytes & bits
|
|
LDA NBITS ;ANY EXTRA BITS?
|
|
BEQ BTMP1 ;BRANCH IF NOT
|
|
INC TEMP ;DO 1 MORE BYTE IN BITMAP
|
|
BNE BTMP1 ; IF THERE IS.
|
|
INC TEMP1
|
|
BTMP1 EQU *
|
|
lda temp1 ; hi byte of # of bytes in bit map
|
|
clc
|
|
ror A ; get # of blocks in bit map (#/$200)
|
|
bcs used ; if carry set, then need another bit
|
|
ldx temp ; did we end on even block boundary?
|
|
beq used ; branch if so (carry clear)
|
|
sec ; otherwise, set carry for another bit
|
|
used adc #6 ; add in # bits for root dir & boot blks
|
|
pha ; save # of bits to mark as used
|
|
LDA NBITS
|
|
BEQ BTMP2
|
|
DEC TEMP ;RESTORE # BYTES IN MAP TO # FULL BYTES
|
|
LDA TEMP
|
|
CMP #$FF
|
|
BNE BTMP2
|
|
DEC TEMP1
|
|
BTMP2 JSR CLRBUFF ;ZERO THE BUFFER
|
|
mapblock lda temp1 ; check # of bytes left TO DO
|
|
cmp #2 ; LESS THAN $200 BYTES to do?
|
|
bcc last ; go do last block if YES.
|
|
SBC #2 ;SET COUNT TO DO AT N-$200
|
|
STA TEMP1
|
|
jsr setfull ; set the full block with $FF's
|
|
pla ; get # of bits to mark used
|
|
jsr markused
|
|
jsr WRTBLK ; write this block of bit map out
|
|
bcs bterr ; branch if error during write
|
|
lda #0 ;# of bits to be marked as used next time
|
|
pha
|
|
beq BTMP2 ; always taken
|
|
last jsr CLRBUFF ; clear buffer first
|
|
lda temp1 ; 1 PAGE OR LESS?
|
|
beq last1 ;BRANCH IF YES
|
|
LDA #$FF
|
|
jsr WRTBITS ; set first page to $FF's
|
|
inc BUFFPTR+1 ; point to second page
|
|
LAST1 LDY TEMP ;ANY FULL BYTES ON THIS PG OF PARTIAL BLOCK?
|
|
BEQ LAST1.1 ;BRANCH IF NOT
|
|
jsr setCNT ; ELSE mark final partial block
|
|
LAST1.1 LDY TEMP
|
|
INY ;POINT TO BYTE AFTER TEMP
|
|
JSR EXTRAB ;GO DO EXTRA BITS
|
|
lda temp1 ; was it the in the 1st or 2nd page ?
|
|
beq marklast ; branch if 1st
|
|
dec BUFFPTR+1 ; fix BUFFPTR if we did 2nd page
|
|
marklast pla ; pull off # of bits to mark as used
|
|
jsr markused ; mark them used
|
|
jsr WRTBLK ; write out last block of bit map
|
|
rts ; return (with carry set if error)
|
|
*
|
|
markused equ * ; mark some bits as used at start of blk
|
|
ldy #0 ; point to beginning of buffer
|
|
markloop tax ; store # bits to mark in X
|
|
beq markrtn ; if no bits to mark as used, return
|
|
cpx #8 ; more than eight bits to mark?
|
|
bcc markpart ; branch if less than full byte
|
|
lda #0 ; zero out whole byte
|
|
sta (BUFFPTR),y
|
|
iny ; point to next byte in block
|
|
txa ; get # bits in accum
|
|
sec ; set carry for subtraction
|
|
sbc #8 ; subtract off bits just marked
|
|
bpl markloop ; always taken
|
|
markpart lda #$7F ; at least 1 bit gets cleared
|
|
partloop dex ; are we done?
|
|
beq partdone ; branch if so
|
|
clc ; otherwise, rotate in another clear bit
|
|
ror A
|
|
bcs partloop ; branch always
|
|
partdone sta (BUFFPTR),y
|
|
markrtn rts
|
|
*
|
|
bterr equ * ; return after error writing block
|
|
tax ; save error code in X
|
|
pla ; pull off extraneous byte from stack
|
|
txa ; get error code back
|
|
sec ; mark as error
|
|
rts
|
|
*
|
|
SETCNT EQU * ;SET # OF BYTES IN Y TO $FF
|
|
LDA #$FF
|
|
SETCNT1 DEY
|
|
STA (BUFFPTR),Y
|
|
BNE SETCNT1
|
|
RTS
|
|
*
|
|
extrab lda nbits ; write leftover bits
|
|
beq ex1 ; none left over
|
|
jsr getbits ; gives mask in acc, leaves Y intact
|
|
DEY
|
|
sta (BUFFPTR),y
|
|
ex1 rts
|
|
*
|
|
CLRBUFF equ * ; clear buffer area
|
|
lda #0 ; |
|
|
BEQ WRTB1 ; |
|
|
SETFULL LDA #$FF ;FILL BUFFER W/$FF |
|
|
WRTB1 jsr wrtbits ; write out bits of 00's OR $FF's |
|
|
inc BUFFPTR+1 ; set to 2nd page of buffer
|
|
jsr wrtbits
|
|
dec BUFFPTR+1 ; restore pointer
|
|
rts
|
|
wrtbits ldy #0
|
|
wrtb sta (BUFFPTR),Y
|
|
iny
|
|
bne wrtb
|
|
rts
|
|
*
|
|
REP 50
|
|
*
|
|
* GETBITS - GET BIT MASK FOR REMAINING BITS.
|
|
* USED IN FORMAT FOR SETTING BITS IN VOLUME
|
|
* BIT MAPS.
|
|
*
|
|
REP 50
|
|
*
|
|
GETBITS EQU * ;GET BIT MASK FOR REMAINING BYTE IN UIMEM
|
|
SEC
|
|
LDA #$08
|
|
SBC NBITS
|
|
BEQ ALLBITS
|
|
TAX
|
|
CPX #8
|
|
BEQ NOBITS
|
|
LDA #$FF
|
|
SHFBITS ASL A
|
|
DEX
|
|
BNE SHFBITS
|
|
BEQ SOMEBITS
|
|
ALLBITS LDA #$FF
|
|
SOMEBITS EQU *
|
|
RTS
|
|
NOBITS LDA #0
|
|
BEQ SOMEBITS
|
|
SBTL 'BOOT BLOCK 0 AND 1 CODE'
|
|
REP 50
|
|
*
|
|
* BOOT BLOCK 0 CODE
|
|
*
|
|
REP 50
|
|
*
|
|
BOOTZERO EQU * ;WRITTEN TO BLOCK 0
|
|
DFB $01,$38,$B0,$03,$4C,$32,$A1,$86
|
|
DFB $43,$C9,$03,$08,$8A,$29,$70,$4A
|
|
DFB $4A,$4A,$4A,$09,$C0,$85,$49,$A0
|
|
DFB $FF,$84,$48,$28,$C8,$B1,$48,$D0
|
|
DFB $3A,$B0,$0E,$A9,$03,$8D,$00,$08
|
|
DFB $E6,$3D,$A5,$49,$48,$A9,$5B,$48
|
|
DFB $60,$85,$40,$85,$48,$A0,$63,$B1
|
|
DFB $48,$99,$94,$09,$C8,$C0,$EB,$D0
|
|
DFB $F6,$A2,$06,$BC,$1D,$09,$BD,$24
|
|
DFB $09,$99,$F2,$09,$BD,$2B,$09,$9D
|
|
DFB $7F,$0A,$CA,$10,$EE,$A9,$09,$85
|
|
DFB $49,$A9,$86,$A0,$00,$C9,$F9,$B0
|
|
DFB $2F,$85,$48,$84,$60,$84,$4A,$84
|
|
DFB $4C,$84,$4E,$84,$47,$C8,$84,$42
|
|
DFB $C8,$84,$46,$A9,$0C,$85,$61,$85
|
|
DFB $4B,$20,$12,$09,$B0,$68,$E6,$61
|
|
DFB $E6,$61,$E6,$46,$A5,$46,$C9,$06
|
|
DFB $90,$EF,$AD,$00,$0C,$0D,$01,$0C
|
|
DFB $D0,$6D,$A9,$04,$D0,$02,$A5,$4A
|
|
DFB $18,$6D,$23,$0C,$A8,$90,$0D,$E6
|
|
DFB $4B,$A5,$4B,$4A,$B0,$06,$C9,$0A
|
|
DFB $F0,$55,$A0,$04,$84,$4A,$AD,$02
|
|
DFB $09,$29,$0F,$A8,$B1,$4A,$D9,$02
|
|
DFB $09,$D0,$DB,$88,$10,$F6,$29,$F0
|
|
DFB $C9,$20,$D0,$3B,$A0,$10,$B1,$4A
|
|
DFB $C9,$FF,$D0,$33,$C8,$B1,$4A,$85
|
|
DFB $46,$C8,$B1,$4A,$85,$47,$A9,$00
|
|
DFB $85,$4A,$A0,$1E,$84,$4B,$84,$61
|
|
DFB $C8,$84,$4D,$20,$12,$09,$B0,$17
|
|
DFB $E6,$61,$E6,$61,$A4,$4E,$E6,$4E
|
|
DFB $B1,$4A,$85,$46,$B1,$4C,$85,$47
|
|
DFB $11,$4A,$D0,$E7,$4C,$00,$20,$4C
|
|
DFB $3F,$09,$26,$50,$52,$4F,$44,$4F
|
|
DFB $53,$20,$20,$20,$20,$20,$20,$20
|
|
DFB $20,$20,$A5,$60,$85,$44,$A5,$61
|
|
DFB $85,$45,$6C,$48,$00,$08,$1E,$24
|
|
DFB $3F,$45,$47,$76,$F4,$D7,$D1,$B6
|
|
DFB $4B,$B4,$AC,$A6,$2B,$18,$60,$4C
|
|
DFB $BC,$09,$A9,$9F,$48,$A9,$FF,$48
|
|
DFB $A9,$01,$A2,$00,$4C,$79,$F4,$20
|
|
DFB $58,$FC,$A0,$1C,$B9,$50,$09,$99
|
|
DFB $AE,$05,$88,$10,$F7,$4C,$4D,$09
|
|
DFB $AA,$AA,$AA,$A0,$D5,$CE,$C1,$C2
|
|
DFB $CC,$C5,$A0,$D4,$CF,$A0,$CC,$CF
|
|
DFB $C1,$C4,$A0,$D0,$D2,$CF,$C4,$CF
|
|
DFB $D3,$A0,$AA,$AA,$AA,$A5,$53,$29
|
|
DFB $03,$2A,$05,$2B,$AA,$BD,$80,$C0
|
|
DFB $A9,$2C,$A2,$11,$CA,$D0,$FD,$E9
|
|
DFB $01,$D0,$F7,$A6,$2B,$60,$A5,$46
|
|
DFB $29,$07,$C9,$04,$29,$03,$08,$0A
|
|
DFB $28,$2A,$85,$3D,$A5,$47,$4A,$A5
|
|
DFB $46,$6A,$4A,$4A,$85,$41,$0A,$85
|
|
DFB $51,$A5,$45,$85,$27,$A6,$2B,$BD
|
|
DFB $89,$C0,$20,$BC,$09,$E6,$27,$E6
|
|
DFB $3D,$E6,$3D,$B0,$03,$20,$BC,$09
|
|
DFB $BC,$88,$C0,$60,$A5,$40,$0A,$85
|
|
DFB $53,$A9,$00,$85,$54,$A5,$53,$85
|
|
DFB $50,$38,$E5,$51,$F0,$14,$B0,$04
|
|
DFB $E6,$53,$90,$02,$C6,$53,$38,$20
|
|
DFB $6D,$09,$A5,$50,$18,$20,$6F,$09
|
|
DFB $D0,$E3,$A0,$7F,$84,$52,$08,$28
|
|
DFB $38,$C6,$52,$F0,$CE,$18,$08,$88
|
|
DFB $F0,$F5,$BD,$8C,$C0,$10,$FB,$00
|
|
DFB $00,$00,$00,$00,$00,$00,$00,$00
|
|
PAGE
|
|
REP 50
|
|
*
|
|
* BOOT BLOCK 1 CODE
|
|
*
|
|
REP 50
|
|
*
|
|
BOOTONE EQU * ;WRITTEN TO BLOCK 1
|
|
DFB $4C,$6E,$A0,$53,$4F,$53,$20,$42
|
|
DFB $4F,$4F,$54,$20,$20,$31,$2E,$31
|
|
DFB $20,$0A,$53,$4F,$53,$2E,$4B,$45
|
|
DFB $52,$4E,$45,$4C,$20,$20,$20,$20
|
|
DFB $20,$53,$4F,$53,$20,$4B,$52,$4E
|
|
DFB $4C,$49,$2F,$4F,$20,$45,$52,$52
|
|
DFB $4F,$52,$08,$00,$46,$49,$4C,$45
|
|
DFB $20,$27,$53,$4F,$53,$2E,$4B,$45
|
|
DFB $52,$4E,$45,$4C,$27,$20,$4E,$4F
|
|
DFB $54,$20,$46,$4F,$55,$4E,$44,$25
|
|
DFB $00,$49,$4E,$56,$41,$4C,$49,$44
|
|
DFB $20,$4B,$45,$52,$4E,$45,$4C,$20
|
|
DFB $46,$49,$4C,$45,$3A,$00,$00,$0C
|
|
DFB $00,$1E,$0E,$1E,$04,$A4,$78,$D8
|
|
DFB $A9,$77,$8D,$DF,$FF,$A2,$FB,$9A
|
|
DFB $2C,$10,$C0,$A9,$40,$8D,$CA,$FF
|
|
DFB $A9,$07,$8D,$EF,$FF,$A2,$00,$CE
|
|
DFB $EF,$FF,$8E,$00,$20,$AD,$00,$20
|
|
DFB $D0,$F5,$A9,$01,$85,$E0,$A9,$00
|
|
DFB $85,$E1,$A9,$00,$85,$85,$A9,$A2
|
|
DFB $85,$86,$20,$BE,$A1,$E6,$E0,$A9
|
|
DFB $00,$85,$E6,$E6,$86,$E6,$86,$E6
|
|
DFB $E6,$20,$BE,$A1,$A0,$02,$B1,$85
|
|
DFB $85,$E0,$C8,$B1,$85,$85,$E1,$D0
|
|
DFB $EA,$A5,$E0,$D0,$E6,$AD,$6C,$A0
|
|
DFB $85,$E2,$AD,$6D,$A0,$85,$E3,$18
|
|
DFB $A5,$E3,$69,$02,$85,$E5,$38,$A5
|
|
DFB $E2,$ED,$23,$A4,$85,$E4,$A5,$E5
|
|
DFB $E9,$00,$85,$E5,$A0,$00,$B1,$E2
|
|
DFB $29,$0F,$CD,$11,$A0,$D0,$21,$A8
|
|
DFB $B1,$E2,$D9,$11,$A0,$D0,$19,$88
|
|
DFB $D0,$F6,$A0,$00,$B1,$E2,$29,$F0
|
|
DFB $C9,$20,$F0,$3E,$C9,$F0,$F0,$08
|
|
DFB $AE,$64,$A0,$A0,$13,$4C,$D4,$A1
|
|
DFB $18,$A5,$E2,$6D,$23,$A4,$85,$E2
|
|
DFB $A5,$E3,$69,$00,$85,$E3,$A5,$E4
|
|
DFB $C5,$E2,$A5,$E5,$E5,$E3,$B0,$BC
|
|
DFB $18,$A5,$E4,$6D,$23,$A4,$85,$E2
|
|
DFB $A5,$E5,$69,$00,$85,$E3,$C6,$E6
|
|
DFB $D0,$95,$AE,$4F,$A0,$A0,$1B,$4C
|
|
DFB $D4,$A1,$A0,$11,$B1,$E2,$85,$E0
|
|
DFB $C8,$B1,$E2,$85,$E1,$AD,$66,$A0
|
|
DFB $85,$85,$AD,$67,$A0,$85,$86,$20
|
|
DFB $BE,$A1,$AD,$68,$A0,$85,$85,$AD
|
|
DFB $69,$A0,$85,$86,$AD,$00,$0C,$85
|
|
DFB $E0,$AD,$00,$0D,$85,$E1,$20,$BE
|
|
DFB $A1,$A2,$07,$BD,$00,$1E,$DD,$21
|
|
DFB $A0,$F0,$08,$AE,$64,$A0,$A0,$13
|
|
DFB $4C,$D4,$A1,$CA,$10,$ED,$A9,$00
|
|
DFB $85,$E7,$E6,$E7,$E6,$86,$E6,$86
|
|
DFB $A6,$E7,$BD,$00,$0C,$85,$E0,$BD
|
|
DFB $00,$0D,$85,$E1,$A5,$E0,$D0,$04
|
|
DFB $A5,$E1,$F0,$06,$20,$BE,$A1,$4C
|
|
DFB $8A,$A1,$18,$AD,$6A,$A0,$6D,$08
|
|
DFB $1E,$85,$E8,$AD,$6B,$A0,$6D,$09
|
|
DFB $1E,$85,$E9,$6C,$E8,$00,$A9,$01
|
|
DFB $85,$87,$A5,$E0,$A6,$E1,$20,$79
|
|
DFB $F4,$B0,$01,$60,$AE,$32,$A0,$A0
|
|
DFB $09,$4C,$D4,$A1,$84,$E7,$38,$A9
|
|
DFB $28,$E5,$E7,$4A,$18,$65,$E7,$A8
|
|
DFB $BD,$29,$A0,$99,$A7,$05,$CA,$88
|
|
DFB $C6,$E7,$D0,$F4,$AD,$40,$C0,$4C
|
|
DFB $EF,$A1,$00,$00,$00,$00,$00,$00
|
|
DFB $00,$00,$00,$00,$00,$00,$00,$00
|
|
DFB $00,$00,$03,$00,$F6,$50,$52,$4F
|
|
loctemp dfb 0
|
|
locbuff ds $E,0
|
|
ZBDEND EQU *
|
|
poslo equ >ZBDEND ;extract lowbyte of current pc
|
|
ZBDLEN EQU ZBDEND-BUILDDISK ;length of Buildisk, less formatter
|
|
ds $100-poslo ;fill to next page boundry
|
|
sbtl 'Disk II FORMATTER'
|
|
page
|
|
FORMATTII equ * ;here is the diskII formatter.
|
|
*
|
|
*
|
|
* * * * * * * * * * * * * * * * * * * * * * * * * * * *
|
|
* * * * * * * * * * * * * * * * * * * * * * * * * * * *
|
|
* * * *
|
|
* * M U S T B E O N P A G E B O U N D A R Y * *
|
|
* * * *
|
|
* * * * * * * * * * * * * * * * * * * * * * * * * * * *
|
|
* * * * * * * * * * * * * * * * * * * * * * * * * * * *
|
|
* *
|
|
* ProDOS DISK ][ Formatter Device Driver *
|
|
* *
|
|
* Copyright Apple Computer, Inc., 1982-1984 *
|
|
* *
|
|
* Enter with ProDOS device number in A-register: *
|
|
* Zero = bits 0, 1, 2, 3 *
|
|
* Slot No.= bits 4, 5, 6 *
|
|
* Drive 1 = bit 7 off *
|
|
* Drive 2 = bit 7 on *
|
|
* *
|
|
* Error codes returned in A-register: *
|
|
* $00 : Good completion *
|
|
* $27 : Unable to format *
|
|
* $2B : Write-Protected *
|
|
* $33 : Drive too SLOW *
|
|
* $34 : Drive too FAST *
|
|
* NOTE: Carry flag is set if error occured. *
|
|
* *
|
|
* Uses zero page locations $D0 thru $DD *
|
|
* *
|
|
* - - - - - - - - - - - - - - - - - - - - - - - - - - *
|
|
* Modified 15 December 1983 to disable interrupts *
|
|
* Modified 20 December 1983 to increase tolerance *
|
|
* of disk speed check *
|
|
* Modified 30 March 1983 to increase tolerance of *
|
|
* disk speed *
|
|
* * * * * * * * * * * * * * * * * * * * * * * * * * * *
|
|
PHP
|
|
SEI
|
|
JSR *+$38
|
|
PLP
|
|
CMP #$00
|
|
BNE *+$04
|
|
CLC
|
|
RTS
|
|
CMP #$02
|
|
BNE *+$07
|
|
LDA #$2B
|
|
JMP *+$0F
|
|
CMP #$01
|
|
BNE *+$07
|
|
LDA #$27
|
|
JMP *+$06
|
|
CLC
|
|
ADC #$30
|
|
SEC
|
|
RTS
|
|
ASL A
|
|
ASL *+$400
|
|
STA *+$40F
|
|
TXA
|
|
LSR A
|
|
LSR A
|
|
LSR A
|
|
LSR A
|
|
TAY
|
|
LDA *+$406
|
|
JSR *+$193
|
|
LSR *+$3EE
|
|
RTS
|
|
TAX
|
|
AND #$70
|
|
STA *+$3E6
|
|
TXA
|
|
LDX *+$3E2
|
|
ROL A
|
|
LDA #$00
|
|
ROL A
|
|
BNE *+$08
|
|
LDA $C08A,X
|
|
JMP *+$06
|
|
LDA $C08B,X
|
|
LDA $C089,X
|
|
LDA #$D7
|
|
STA $DA
|
|
LDA #$50
|
|
STA *+$3C8
|
|
LDA #$00
|
|
JSR *-$3E
|
|
LDA $DA
|
|
BEQ *+$08
|
|
JSR *+$2D2
|
|
JMP *-$07
|
|
LDA #$01
|
|
STA $D3
|
|
LDA #$AA
|
|
STA $D0
|
|
LDA *+$3AA
|
|
CLC
|
|
ADC #$02
|
|
STA $D4
|
|
LDA #$00
|
|
STA $D1
|
|
LDA $D1
|
|
LDX *+$39F
|
|
JSR *-$64
|
|
LDX *+$399
|
|
LDA $C08D,X
|
|
LDA $C08E,X
|
|
TAY
|
|
LDA $C08E,X
|
|
LDA $C08C,X
|
|
TYA
|
|
BPL *+$07
|
|
LDA #$02
|
|
JMP *+$5A
|
|
JSR *+$2C1
|
|
BCC *+$10
|
|
LDA #$01
|
|
LDY $D4
|
|
CPY *+$374
|
|
BCS *+$04
|
|
LDA #$04
|
|
JMP *+$47
|
|
LDY $D4
|
|
CPY *+$368
|
|
BCS *+$07
|
|
LDA #$04
|
|
JMP *+$3B
|
|
CPY *+$35F
|
|
BCC *+$07
|
|
LDA #$03
|
|
JMP *+$31
|
|
LDA *+$357
|
|
STA *+$357
|
|
DEC *+$354
|
|
BNE *+$07
|
|
LDA #$01
|
|
JMP *+$21
|
|
LDX *+$348
|
|
JSR *+$8C
|
|
BCS *-$10
|
|
LDA $D8
|
|
BNE *-$14
|
|
LDX *+$33C
|
|
JSR *+$1D
|
|
BCS *-$1C
|
|
INC $D1
|
|
LDA $D1
|
|
CMP #$23
|
|
BCC *-$73
|
|
LDA #$00
|
|
PHA
|
|
LDX *+$329
|
|
LDA $C088,X
|
|
LDA #$00
|
|
JSR *-$DF
|
|
PLA
|
|
RTS
|
|
LDY #$20
|
|
DEY
|
|
BEQ *+$5E
|
|
LDA $C08C,X
|
|
BPL *-$03
|
|
EOR #$D5
|
|
BNE *-$0A
|
|
NOP
|
|
LDA $C08C,X
|
|
BPL *-$03
|
|
CMP #$AA
|
|
BNE *-$0C
|
|
LDY #$56
|
|
LDA $C08C,X
|
|
BPL *-$03
|
|
CMP #$AD
|
|
BNE *-$17
|
|
LDA #$00
|
|
DEY
|
|
STY $D5
|
|
LDA $C08C,X
|
|
BPL *-$03
|
|
CMP #$96
|
|
BNE *+$32
|
|
LDY $D5
|
|
BNE *-$0E
|
|
STY $D5
|
|
LDA $C08C,X
|
|
BPL *-$03
|
|
CMP #$96
|
|
BNE *+$23
|
|
LDY $D5
|
|
INY
|
|
BNE *-$0E
|
|
LDA $C08C,X
|
|
BPL *-$03
|
|
CMP #$96
|
|
BNE *+$15
|
|
LDA $C08C,X
|
|
BPL *-$03
|
|
CMP #$DE
|
|
BNE *+$0C
|
|
NOP
|
|
LDA $C08C,X
|
|
BPL *-$03
|
|
CMP #$AA
|
|
BEQ *+$5E
|
|
SEC
|
|
RTS
|
|
LDY #$FC
|
|
STY $DC
|
|
INY
|
|
BNE *+$06
|
|
INC $DC
|
|
BEQ *-$0B
|
|
LDA $C08C,X
|
|
BPL *-$03
|
|
CMP #$D5
|
|
BNE *-$0E
|
|
NOP
|
|
LDA $C08C,X
|
|
BPL *-$03
|
|
CMP #$AA
|
|
BNE *-$0C
|
|
LDY #$03
|
|
LDA $C08C,X
|
|
BPL *-$03
|
|
CMP #$96
|
|
BNE *-$17
|
|
LDA #$00
|
|
STA $DB
|
|
LDA $C08C,X
|
|
BPL *-$03
|
|
ROL A
|
|
STA $DD
|
|
LDA $C08C,X
|
|
BPL *-$03
|
|
AND $DD
|
|
STA $D7,Y
|
|
EOR $DB
|
|
DEY
|
|
BPL *-$17
|
|
TAY
|
|
BNE *-$47
|
|
LDA $C08C,X
|
|
BPL *-$03
|
|
CMP #$DE
|
|
BNE *-$50
|
|
NOP
|
|
LDA $C08C,X
|
|
BPL *-$03
|
|
CMP #$AA
|
|
BNE *-$5A
|
|
CLC
|
|
RTS
|
|
STX *+$271
|
|
STA *+$26D
|
|
CMP *+$258
|
|
BEQ *+$5E
|
|
LDA #$00
|
|
STA *+$265
|
|
LDA *+$24E
|
|
STA *+$260
|
|
SEC
|
|
SBC *+$259
|
|
BEQ *+$39
|
|
BCS *+$09
|
|
EOR #$FF
|
|
INC *+$23E
|
|
BCC *+$07
|
|
ADC #$FE
|
|
DEC *+$237
|
|
CMP *+$248
|
|
BCC *+$05
|
|
LDA *+$243
|
|
CMP #$0C
|
|
BCS *+$03
|
|
TAY
|
|
SEC
|
|
JSR *+$1F
|
|
LDA *+$14A,Y
|
|
JSR *+$136
|
|
LDA *+$232
|
|
CLC
|
|
JSR *+$15
|
|
LDA *+$149,Y
|
|
JSR *+$129
|
|
INC *+$224
|
|
BNE *-$41
|
|
JSR *+$121
|
|
CLC
|
|
LDA *+$207
|
|
AND #$03
|
|
ROL A
|
|
ORA *+$214
|
|
TAX
|
|
LDA $C080,X
|
|
LDX *+$20D
|
|
RTS
|
|
JSR *+$1E0
|
|
LDA $C08D,X
|
|
LDA $C08E,X
|
|
LDA #$FF
|
|
STA $C08F,X
|
|
CMP $C08C,X
|
|
PHA
|
|
PLA
|
|
NOP
|
|
LDY #$04
|
|
PHA
|
|
PLA
|
|
JSR *+$5F
|
|
DEY
|
|
BNE *-$06
|
|
LDA #$D5
|
|
JSR *+$56
|
|
LDA #$AA
|
|
JSR *+$51
|
|
LDA #$AD
|
|
JSR *+$4C
|
|
LDY #$56
|
|
NOP
|
|
NOP
|
|
NOP
|
|
BNE *+$05
|
|
JSR *+$1AC
|
|
NOP
|
|
NOP
|
|
LDA #$96
|
|
STA $C08D,X
|
|
CMP $C08C,X
|
|
DEY
|
|
BNE *-$0E
|
|
BIT $00
|
|
NOP
|
|
JSR *+$199
|
|
LDA #$96
|
|
STA $C08D,X
|
|
CMP $C08C,X
|
|
LDA #$96
|
|
NOP
|
|
INY
|
|
BNE *-$0F
|
|
JSR *+$1E
|
|
LDA #$DE
|
|
JSR *+$19
|
|
LDA #$AA
|
|
JSR *+$14
|
|
LDA #$EB
|
|
JSR *+$0F
|
|
LDA #$FF
|
|
JSR *+$0A
|
|
LDA $C08E,X
|
|
LDA $C08C,X
|
|
RTS
|
|
NOP
|
|
PHA
|
|
PLA
|
|
STA $C08D,X
|
|
CMP $C08C,X
|
|
RTS
|
|
SEC
|
|
LDA $C08D,X
|
|
LDA $C08E,X
|
|
BMI *+$60
|
|
LDA #$FF
|
|
STA $C08F,X
|
|
CMP $C08C,X
|
|
PHA
|
|
PLA
|
|
JSR *+$5A
|
|
JSR *+$57
|
|
STA $C08D,X
|
|
CMP $C08C,X
|
|
NOP
|
|
DEY
|
|
BNE *-$0E
|
|
LDA #$D5
|
|
JSR *+$5A
|
|
LDA #$AA
|
|
JSR *+$55
|
|
LDA #$96
|
|
JSR *+$50
|
|
LDA $D3
|
|
JSR *+$3A
|
|
LDA $D1
|
|
JSR *+$35
|
|
LDA $D2
|
|
JSR *+$30
|
|
LDA $D3
|
|
EOR $D1
|
|
EOR $D2
|
|
PHA
|
|
LSR A
|
|
ORA $D0
|
|
STA $C08D,X
|
|
LDA $C08C,X
|
|
PLA
|
|
ORA #$AA
|
|
JSR *+$2A
|
|
LDA #$DE
|
|
JSR *+$26
|
|
LDA #$AA
|
|
JSR *+$21
|
|
LDA #$EB
|
|
JSR *+$1C
|
|
CLC
|
|
LDA $C08E,X
|
|
LDA $C08C,X
|
|
RTS
|
|
PHA
|
|
LSR A
|
|
ORA $D0
|
|
STA $C08D,X
|
|
CMP $C08C,X
|
|
PLA
|
|
NOP
|
|
NOP
|
|
NOP
|
|
ORA #$AA
|
|
NOP
|
|
NOP
|
|
PHA
|
|
PLA
|
|
STA $C08D,X
|
|
CMP $C08C,X
|
|
RTS
|
|
BRK
|
|
BRK
|
|
BRK
|
|
LDX #$11
|
|
DEX
|
|
BNE *-$01
|
|
INC $D9
|
|
BNE *+$04
|
|
INC $DA
|
|
SEC
|
|
SBC #$01
|
|
BNE *-$0E
|
|
RTS
|
|
DFB $01,$30,$28
|
|
DFB $24,$20,$1E
|
|
DFB $1D,$1C,$1C
|
|
DFB $1C,$1C,$1C
|
|
DFB $70,$2C,$26
|
|
DFB $22,$1F,$1E
|
|
DFB $1D,$1C,$1C
|
|
DFB $1C,$1C,$1C
|
|
LDA *+$BE
|
|
STA $D6
|
|
LDY #$80
|
|
LDA #$00
|
|
STA $D2
|
|
JMP *+$05
|
|
LDY $D4
|
|
LDX *+$B0
|
|
JSR *-$C8
|
|
BCC *+$05
|
|
JMP *+$93
|
|
LDX *+$A5
|
|
JSR *-$153
|
|
INC $D2
|
|
LDA $D2
|
|
CMP #$10
|
|
BCC *-$19
|
|
LDY #$0F
|
|
STY $D2
|
|
LDA *+$92
|
|
STA *+$92
|
|
STA *+$90,Y
|
|
DEY
|
|
BPL *-$04
|
|
LDA $D4
|
|
SEC
|
|
SBC #$05
|
|
TAY
|
|
JSR *+$6C
|
|
JSR *+$69
|
|
PHA
|
|
PLA
|
|
NOP
|
|
NOP
|
|
DEY
|
|
BNE *-$0B
|
|
LDX *+$74
|
|
JSR *-$248
|
|
BCS *+$3E
|
|
LDA $D8
|
|
BEQ *+$15
|
|
DEC $D4
|
|
LDA $D4
|
|
CMP *+$60
|
|
BCS *+$31
|
|
SEC
|
|
RTS
|
|
LDX *+$5D
|
|
JSR *-$25F
|
|
BCS *+$1C
|
|
LDX *+$55
|
|
JSR *-$2CA
|
|
BCS *+$14
|
|
LDY $D8
|
|
LDA *+$4E,Y
|
|
BMI *+$0D
|
|
LDA #$FF
|
|
STA *+$47,Y
|
|
DEC $D2
|
|
BPL *-$1E
|
|
CLC
|
|
RTS
|
|
DEC *+$3D
|
|
BNE *-$25
|
|
DEC $D6
|
|
BNE *+$04
|
|
SEC
|
|
RTS
|
|
LDA *+$2F
|
|
ASL A
|
|
STA *+$2E
|
|
LDX *+$29
|
|
JSR *-$293
|
|
BCS *+$08
|
|
LDA $D8
|
|
CMP #$0F
|
|
BEQ *+$09
|
|
DEC *+$1D
|
|
BNE *-$11
|
|
SEC
|
|
RTS
|
|
LDX #$D6
|
|
JSR *-$03
|
|
JSR *-$06
|
|
BIT $00
|
|
DEX
|
|
BNE *-$09
|
|
JMP *-$B4
|
|
DFB $0E,$1B,$03
|
|
DFB $10,$00,$00
|
|
DFB $00,$00,$00
|
|
DFB $00,$00,$00
|
|
DFB $00,$00,$00
|
|
DFB $00,$00,$00
|
|
DFB $00,$00,$00
|
|
DFB $00,$00,$00
|
|
DFB $00,$00,$00
|
|
Zend equ *
|
|
Ztotal equ Zend-Builddisk
|