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