home *** CD-ROM | disk | FTP | other *** search
- ;=======================================================================;
- ; ;
- ; FLOPPY DISK DRIVER: SUPPORTS ANY SIZE OF FLOPPY DISK, WITHIN ;
- ; THE FOLLOWING LIMITS: ;
- ; ;
- ; o THE DISK MUST HAVE A VALID BOOT SECTOR. THIS MEANS ;
- ; THAT THE BOOT SECTOR MUST HAVE A TABLE STORED IN ;
- ; IT, WITH THE PARAMETERS FOR THAT DISK. ;
- ; o THE NUMBER OF SECTORS PER TRACK CANNOT EXCEED 32. ;
- ; THE NUMBER, 32, CAN BE CHANGED TO REFLECT NEWER ;
- ; DISK FORMATS SIMPLY BY CHANGING THE DEFINED VALUE ;
- ; BELOW. ;
- ; o THE SECTOR SIZE MUST BE 512 BYTES. ;
- ; o THE FORMAT ID CODE MUST BE HEX F0 OR GREATER. THIS ;
- ; VALUE IS CHECKED EVERY TIME THE DIRECTORY IS ;
- ; ACCESSED, SIMPLY TO KEEP FROM ACCIDENTALLY WRITING ;
- ; TO A DISK WHOSE FORMAT IS UNKNOWN. ;
- ; ;
- ; THE PROCEDURE TO CREATE THE FINAL FILE 'ANYDISK.SYS' IS: ;
- ; >A86 ANYDISK.ASM ;
- ; >RENAME ANYDISK.BIN ANYDISK.SYS (IF YOU HAVE A86) ;
- ; ;
- ; >MASM ANYDISK,ANYDISK; ;
- ; >LINK ANYDISK,ANYDISK; ;
- ; >EXE2BIN ANYDISK.EXE ANYDISK.SYS (IF YOU HAVE MASM) ;
- ; ;
- ; THIS PROGRAM WAS WRITTEN BY GEORGE BREESE, OVER A 24 HOUR ;
- ; PERIOD, STARTING AT NOON ON 1/16/88. ;
- ; ;
- ; ADDRESS COMMENTS TO: ;
- ; ;
- ; GEORGE BREESE ;
- ; BOX 428 ;
- ; MORAVIA, NEW YORK 13118 ;
- ; ;
- ;=======================================================================;
-
- ;
- ; THE FIRST PART OF THE CODE CONSISTS OF GLOBAL DEFINITIONS.
- ; DON'T ALTER THESE, UNLESS NOTED OTHERWISE.
- ;
- MAXSEC EQU 32 ;MAX # OF LEGAL SECTORS PER TRACK
- ; (CAN CHANGE THIS)
- FALSE EQU 0
- TRUE EQU 0FFFFH
- ERROR_BIT EQU 8000H ;THESE ARE STATUS BIT SETTINGS USED WHEN
- BUSY_BIT EQU 0200H ;VALUES ARE RETURNED TO DOS. DO NOT
- DONE_BIT EQU 0100H ;CHANGE!
- ERR_UNIT_BAD EQU 1
- ERR_COMMAND EQU 3
- ERR_CRC EQU 4
- ERR_SECTOR EQU 8
- ERR_GENERAL EQU 12
- IS_CHANGED EQU -1
- DONT_KNOW EQU 0
- NOT_CHANGED EQU 1
- CR EQU 13 ;ASCII EQUIVALENTS OF CR,LF
- LF EQU 10
- ;
- ; NOW THE STRUCTURES FOR DOS REQUESTS ARE DEFINED. A GOOD
- ; WORKING KNOWLEDGE OF THE 'C'LANGUAGE WILL HELP HERE.
- ;
- REQUEST EQU DS:[BX]
-
- REQHDR STRUC
- DB ?
- DB ?
- COMMAND DB ?
- STATUS DW ?
- DB 8 DUP (?)
- REQHDR ENDS
-
- INITHDR STRUC
- DB (TYPE REQHDR) DUP (?)
- UNITS DB ?
- ENDADRO DW ?
- ENDADRS DW ?
- BPBPTRO DW ?
- BPBPTRS DW ?
- DRIVENUM DB ?
- INITHDR ENDS
-
- MEDHDR STRUC
- DB (TYPE REQHDR) DUP (?)
- MEDIA DB ?
- CHANGE DB ?
- MEDHDR ENDS
-
- BPBHDR STRUC
- DB (TYPE REQHDR) DUP (?)
- DB ?
- XFRADRO DW ?
- XFRADRS DW ?
- DW ?
- DW ?
- BPBHDR ENDS
-
- RWHDR STRUC
- DB (TYPE REQHDR) DUP (?)
- DB ?
- DW ?
- DW ?
- COUNT DW ?
- STRTSEC DW ?
- RWHDR ENDS
-
- TRANSFER EQU DWORD PTR XFRADRO
- ;
- ; THE ACTUAL CODE STARTS HERE. A '.SYS' FILE BEGINS WITH A BLANK DWORD
- ; THAT DOS WILL LATER FILL WITH A LINK TO OTHER .SYS FILES AT BOOT
- ; TIME. THEN COMES A WORD WITH BITS SET TO SHOW SPECIAL ABILITIES
- ; (THIS DRIVER HAS NONE). THEN, TWO POINTERS, TO THE TWO CALLS THAT
- ; DOS WILL MAKE. THEN, THE NUMBER OF UNITS, AND A UNIQUE 7-CHAR
- ; LABEL TO SHOW WHO WE ARE WITHIN THE SYSTEM.
- ;
- ; IN NORMAL USE AFTER BOOTING, THE WAY DOS WILL ACCESS THIS IS FOLLOWS:
- ; 1. DOS WILL CALL OUR STRATEGY ROUTINE, AND HAND US THE PARAMETERS
- ; FOR THE UPCOMING DISK ACTION. WE CAN PROCESS THE PARAMETERS
- ; IN ADVANCE IF WE WANT TO, BUT WE CAN'T TAKE ANY ACTION UNTIL...
- ; 2. DOS CALLS OUR DISK HANDLER (LABELED "INTERRUPT".) WE DO THE
- ; REQUESTED ACTION, AND RETURN A STATUS CODE.
- ;
- RDRIVE SEGMENT PARA
- ASSUME CS:RDRIVE,DS:NOTHING,ES:NOTHING
- ORG 0
- START EQU $
- DD -1
- DW 0
- DW OFFSET STRATEGY
- DW OFFSET INTERRUPT
- DB 1,'ANYSIZE'
- ;
- ; HERE'S A TABLE WE WILL USE IN OUR "INTERRUPT" HANDLER, TO JUMP
- ; TO THE INDIVIDUAL FUNCTIONS WE PERFORM.
- ;
- JUMPTAB LABEL WORD
- DW OFFSET INIT
- DW OFFSET MEDIA_CHECK
- DW OFFSET BUILD_BPB
- DW OFFSET IOCTL_INPUT
- DW OFFSET READ
- DW OFFSET READ_NOWAIT
- DW OFFSET INPUT_STATUS
- DW OFFSET INPUT_FLUSH
- DW OFFSET WRITE
- DW OFFSET WRITE_VERIFY
- DW OFFSET OUTPUT_STATUS
- DW OFFSET OUTPUT_FLUSH
- DW OFFSET IOCTL_OUTPUT
-
- REQ_PTR DD ? ;THE POINTER TO THE REQUEST'S PARAMETERS
- BPB_TAB DW OFFSET BPB
- ;
- ; REGISTERS. SET BY GETNEXT, USED BY READ/WRITE.
- ;
- XAL DB ?
- XDL DB 0 ; 0 = ASSUME DRIVE A
- XCOUNT DW ?
- LOGSEC DW ?
-
- XFER LABEL DWORD ; THE TRANSFER ADDRESS
- XBX DW ?
- XES DW ?
-
- XSS DW 0 ; POINTER TO DOS'S STACK
- XSP DW 0
-
- STK DB 51 DUP ('STACK ') ;255 BYTES FOR OUR LOCAL STACK
- STKEND LABEL WORD
-
- SIGN_ON DB 'Any-size disk driver V1.2',9,'George Breese 8/8/88',CR,LF
- SGN2 DB '$ew virtual drive ' ; $ WILL BE TURNED INTO N IF >DOS 3.0
- DRVV DB '?: connected to drive ' ; DRVV IS OUR DRIVE NAME
- DRVC DB 'A:',CR,LF,'$' ; DRVC IS REAL DRIVE NAME
-
- TRACKS DB ?
- DOSTBL DB 0DFH,2,25H,2,9,2AH,0FFH,50H,0F6H,0,1
- OLD1E DW 0,0
- ;
- ; REV 1.1: A.T. 80-TRACK, DOUBLE-DENSITY DISKS ARE SUPPORTED.
- ; IN ORDER TO MAKE 720K DISKS ON 80-TRACK 5.25" DRIVES,
- ; LOCATION 40:90 GETS ITS VALUE 'ANDed' WITH HEX DF TO
- ; SELECT SINGLE STEPPING (AND THUS 80-TRACK OPERATION).
- ;
-
- PARMSAV DW 0
-
- ;
- ; REV 1.2: OPERATION OF THIS DRIVER HAS BEEN MADE MORE BULLET-
- ; PROOF. THE ARRAY 'DOSTBL' HOLDS A CUSTOMIZED DISK BIOS PARAMETER
- ; TABLE. PREVIOUS VERSIONS USED, AND DAMAGED, THE TABLE MADE BY DOS.
- ;
-
- ;
- ; THE FOLLOWING IS WHERE THE BOOT SECTOR IS STORED, AND THUS WHERE
- ; THE DRIVE PARAMETERS COME FROM.
- ;
-
- INTERN LABEL WORD
- DB 0,0,0
- DB 'OEM NAME'
- BPB LABEL WORD
- SECTOR_SIZE LABEL WORD
- DW 512
- DB 1
- DW 0
- DB 2
- DW 32
- DISK_SIZE LABEL WORD
- DW 128
- ID_BYTE DB 0F8H
- DW 1
- SPT DW 8
- SIDES DW 1
- DW 0
- DB 511 DUP (0)
-
- ;
- ; THE STRATEGY HANDLER SIMPLY TAKES THE GIVEN POINTER AND FILES IT
- ; AWAY FOR THE INTERRUPT CALL.
- ;
- STRATP PROC FAR
- STRATEGY:
- MOV CS:WORD PTR [REQ_PTR],BX
- MOV CS:WORD PTR [REQ_PTR+2],ES
- RET
- STRATP ENDP
-
- ;
- ; THE "INTERRUPT" HANDLER.
- ;
- ;
- INTERP PROC FAR
- INTERRUPT:
- PUSH AX
- PUSH BX
- PUSH CX
- PUSH DX
- PUSH BP
- PUSH SI
- PUSH DI
- PUSH DS
- PUSH ES
- PUSHF
- MOV CS:[XSS],SS ;DOS HAS A SMALL STACK, SO WE'LL
- MOV CS:[XSP],SP ;SUBSTITUTE OUR OWN.
- PUSH CS
- POP SS
- MOV SP,OFFSET STKEND
- CALL SETT
- LDS BX,CS:[REQ_PTR]
- MOV AL,REQUEST.COMMAND
- CBW
- CMP AL,0CH
- JAE CMD_ERROR ; WE ONLY HAVE SUPPORT FOR
- SHL AX,1 ; IOCTL FUNCTIONS 0-11.
- MOV SI,AX
- MOV AX,OFFSET EXIT
- PUSH AX ; FORCE A RETURN ADDRESS ON THE STACK,
- XOR AX,AX ; THEN 'CALL' A FUNCTION HANDLER.
- JMP CS:JUMPTAB[SI]
- IOCTL_INPUT:
- READ_NOWAIT:
- INPUT_STATUS:
- INPUT_FLUSH: ; ALL OF THESE NEED NOT BE
- OUTPUT_STATUS: ; PROCESSED - DISKS DON'T DO
- OUTPUT_FLUSH: ; THESE THINGS ANYWAY.
- IOCTL_OUTPUT:
- POP AX
- CMD_ERROR:
- MOV AX,ERR_COMMAND ; IF THE COMMAND WAS BAD, THEN SET
- OR AX,ERROR_BIT ; THE BITS TO SHOW IT.
- EXIT:
- LDS BX,CS:[REQ_PTR] ; FUNCTION HANDLERS ARE FORCED TO
- OR AX,DONE_BIT ; 'RETURN' HERE
- MOV REQUEST.STATUS,AX
- CALL RESETT
- MOV SS,CS:[XSS] ; RESTORE DOS'S STACK AND LEAVE.
- MOV SP,CS:[XSP]
- POPF
- POP ES
- POP DS
- POP DI
- POP SI
- POP BP
- POP DX
- POP CX
- POP BX
- POP AX
- RET
- INTERP ENDP
-
- MEDIAP PROC NEAR
- MEDIA_CHECK:
- MOV DI,3
- LP: PUSH CS
- POP ES
- MOV AH,2
- MOV AL,1 ; THIS SECTION CHECKS FOR NON-SUPPORTED
- MOV BX,OFFSET INTERN ; FORMATS.
- MOV CX,1
- MOV DH,0
- MOV DL,CS:[XDL]
- INT 13H
- JNC LP2
- DEC DI
- JNZ LP
- JMP ERR_HANDLE
- LP2: ; THE CHECK FOR VALID PARAMETERS
- PUSH AX
- MOV AL,BYTE PTR CS:SPT
- MOV CS:[DOSTBL+4],AL
- POP AX
- CMP WORD PTR CS:[SECTOR_SIZE],512
- JNZ BUMRAP
- CMP BYTE PTR CS:[SPT],MAXSEC
- JAE BUMRAP
- CMP BYTE PTR CS:[ID_BYTE],0F8H
- JNB OK_SO_FAR
- BUMRAP: MOV AX,7 ;INVALID MEDIA, OR NON-DOS DISK
- OR AX,ERROR_BIT
- JMP EXIT
-
- OK_SO_FAR: ; CALC NUMBER OF TRACKS FOR A.T. SUPPORT
- MOV AL,BYTE PTR CS:[SPT]
- MUL BYTE PTR CS:[SIDES]
- MOV CL,AL
- MOV AX,CS:[DISK_SIZE]
- DIV CL
- MOV CS:[TRACKS],AL
-
- LDS BX,CS:[REQ_PTR]
- MOV REQUEST.CHANGE,DONT_KNOW
- ;
- ; DON'T KNOW IS THE STANDARD RESPONSE FOR A FLOPPY DRIVE
- ; WHEN THE 'DISKETTE CHANGE LINE' ISN'T SUPPORTED.
- ; WE CAN'T GUARANTEE WHAT MACHINE WE'RE RUNNING ON, SO
- ; WE ALWAYS RETURN "DON'T KNOW".
- ; PERHAPS IN A FUTURE REVISION, I'LL CHECK FOR THE CHANGE LINE.
- ; -- G.E.B.
- ;
- XOR AX,AX
- RET
- MEDIAP ENDP
-
- ;
- ; BUILD BIOS PARAMETER BLOCK. POINTS DOS TO OUR PARAMETER TABLE.
- ;
- BBPBP PROC NEAR
- BUILD_BPB:
- LDS BX,CS:[REQ_PTR]
- MOV REQUEST.BPBPTRO,OFFSET BPB
- MOV REQUEST.BPBPTRS,CS
- XOR AX,AX ; RETURN NO ERROR BITS, BECAUSE WE
- RET ; HAVEN'T DONE ANYTHING!
- BBPBP ENDP
-
- ;
- ; READ: READ FROM DISK. A SHORT ROUTINE. MOST OF THE WORK IS DONE BY
- ; 'VERIFY' AND 'GETNEXT'.
- ;
-
- READP PROC NEAR
- READ:
- CALL VERIFY
- PUSH CS
- POP DS
- READ_LOOP:
- LES BX,DWORD PTR DS:[XFER]
- PUSH ES
- PUSH BX
- CALL GETNEXT
- POP BX
- POP ES
- MOV DI,3
- RDD:
- MOV AH,2
- MOV AL,DS:[XAL] ; COUNT
- OR AL,AL
- JZ READ_DONE
- MOV DL,DS:[XDL] ; DRIVE #
- CALL NEW13 ; CALL BIOS
- JNB READ_LOOP
- DEC DI
- JNZ RDD
- JMP ERR_HANDLE
- READ_DONE:
- XOR AX,AX ; RETURN 0 IF OK
-
- RET
- READP ENDP
-
- ;
- ; WRITE: PUTS SECTORS TO DISK.
- ; A SHORT ROUTINE, BECAUSE 'GETNEXT' AND 'VERIFY' DO ALL THE WORK.
- ;
- ;
-
- WRITEP PROC NEAR
- WRITE:
- WRITE_VERIFY:
- CALL VERIFY
- PUSH CS
- POP DS
- WRIT_LOOP:
- LES BX,DS:[XFER]
- PUSH ES
- PUSH BX
- CALL GETNEXT
- POP BX
- POP ES
- MOV DI,2
- WDD: MOV AH,3
- MOV AL,DS:[XAL] ; # OF SECTORS
- OR AL,AL
- JZ READ_DONE
- MOV DL,DS:[XDL] ; DRIVE #
- CALL NEW13 ; CALL BIOS DISK INTERRUPT
- JNB WRIT_LOOP
- DEC DI
- JNZ WDD
- JMP ERR_HANDLE
- WRIT_DONE:
- XOR AX,AX
- RET
- WRITEP ENDP
-
- ;
- ; GETNEXT: SETS UP THE REGISTERS FOR READS/WRITES.
- ;
- GETNEXT PROC NEAR
- ;
- ; PART 1: FIGURE CH=LOGSEG/(SPT*SIDES).
- ;
- MOV AX,DS:[LOGSEC] ; FIRST, CH = LOGSEC / (SIDES*SPT)
- MOV SI,AX
- MOV CL,BYTE PTR DS:[SPT]
- MOV DL,CL ; PRESERVE SPT INSIDE DL FOR LATER...
- CMP BYTE PTR DS:[SIDES],2
- JNZ G10
- SHL CL,1
- G10:
- DIV CL
- MOV CH,AL
- ;
- ; PART 2: FIGURE CL=LOGSEC-(TRACK*SPT*SIDES). CL STILL HOLDS
- ; SPT*SIDES FROM PART 1.
- ;
- PART2: MUL CL ; YIELDS SPT*SIDES*TRACK
- XCHG SI,AX
- SUB AX,SI ; LOGSEC-(SPT*SIDES*TRACK)
- MOV CL,AL ; INTO CL
- CMP CL,DL ; IS AL > SPT?
- JAE SIDE1
- MOV DH,0 ; HANDLE SIDE 0
- JMP PART3
- SIDE1: SUB CL,DL
- MOV DH,1 ; HANDLE SIDE 1
- ;
- ; WE'VE NOW GOT CX WHERE WE WANT IT! WE'LL PUSH IT, AND POP IT LATER.
- ; AL NOW NEEDS # OF SECTORS TO READ
- ;
- PART3:
- PUSH CX
- XCHG CL,DL
- SUB CL,DL ; start by taking SPT (WHICH IS CL) - XCL (WHICH IS DL)
- XOR CH,CH ; BUT DO WE WANT THAT MANY SECTORS? (CX>XCOUNT?)
- CMP CX,DS:[XCOUNT]
- JBE PART4 ; IF NOT, THEN SET CX TO XCOUNT
- MOV CX,DS:[XCOUNT]
- ;
- ; CX HAS THE SECTOR COUNT FOR THIS NEXT INT13 OPERATION. WE'LL MOVE
- ; IT INTO AL LATER. NOW, WE HAVE TO UPDATE OUR POINTERS.
- ;
- PART4:
- ADD DS:[LOGSEC],CX ; UPDATE LOGSEC AND XCOUNT.
- SUB DS:[XCOUNT],CX
- MOV AX,WORD PTR DS:[SECTOR_SIZE]
- PUSH DX
- MUL CX
- POP DX
- ADD DS:[XBX],AX ; AND ADD TO XBX
- MOV DS:[XAL],CL
- POP CX
- INC CL ; CORRECT CL'S MODULO RANGE.
- ;
- ; AT THE END OF THIS, DH HAS SIDE, CX HAS TRACK&SECTOR, AND AL HAS
- ; SECTOR COUNT.
- ;
- RET
- GETNEXT ENDP
-
- ;
- ; TRANSLATOR FOR BIOS ERRORS.
- ;
- ERR_HANDLE PROC NEAR ;SHOULD BE JMP'ed TO!!! NOT CALLed!!!
- MOV CX,12
- ;12 is valid for ah=8 or 32 (dma failure or 765 failure)
- CMP AH,2 ; bad address mark
- JNZ E1
- MOV CX,11
- E1: CMP AH,3 ; write protect
- JNZ E2
- MOV CX,0
- E2: CMP AH,4 ;sector not found
- JNZ E3
- MOV CX,8
- E3: CMP AH,16 ;bad crc
- JNZ E4
- MOV CX,11
- E4: CMP AH,64 ;bad seek
- JNZ E5
- MOV CX,6
- E5: CMP AH,128 ;timeout
- JNZ E6
- MOV CX,2
- E6: MOV AX,ERROR_BIT
- OR AX,CX
- JMP EXIT
- ERR_HANDLE ENDP
-
- ;
- ; VERIFY: CHECKS THE REQUEST TO SEE IF ITS PARAMETERS ARE VALID.
- ;
- VERIFY PROC NEAR
- ;
- ; FIRST, SEE IF LOGSEC IS PAST END-OF-DISK.
- ;
- MOV CX,REQUEST.STRTSEC
- MOV CS:[LOGSEC],CX
- CMP CX,CS:DISK_SIZE
- JAE OUT_OF_RANGE
- ;
- ; THEN, SEE IF END-OF-REQUEST IS PAST END-OF-DISK.
- ;
- ADD CX,REQUEST.COUNT
- CMP CX,CS:DISK_SIZE
- JBE IN_RANGE
- OUT_OF_RANGE: ;(THE PARAMETERS ARE INVALID.)
- POP AX ; FORCE OUR RETURN TO 'EXIT'
- MOV AX,ERR_SECTOR
- OR AX,ERROR_BIT
- MOV REQUEST.COUNT,0
- RET
- IN_RANGE:
- ;
- ; NOW, SEE IF MORE THAN 64K WAS REQUESTED.
- ;
- MOV AX,REQUEST.COUNT
- CMP AX,128
- JA OUT_OF_RANGE
- MOV CL,9
- SHL AX,CL
- ADD AX,REQUEST.XFRADRO
- JC OUT_OF_RANGE
- MOV AX,REQUEST.COUNT
- MOV CS:[XCOUNT],AX
- CLD
- LES DX,REQUEST.TRANSFER
- MOV CS:[XES],ES
- MOV CS:[XBX],DX
- RET
- VERIFY ENDP
-
- ;
- ; SETT: SETS THE DISK DRIVE CONTROLLER TO TIGHTER SPECS FOR THE
- ; LARGER DISK SIZES.
- ;
- ;
- SETT PROC NEAR
- PUSH DS
- PUSH AX
- XOR AX,AX
- MOV DS,AX
- MOV AX,DS:[78H]
- MOV CS:OLD1E,AX
- MOV AX,DS:[7AH]
- MOV CS:OLD1E+2,AX
- MOV WORD PTR [7AH],CS
- MOV WORD PTR [78H],OFFSET DOSTBL
- MOV AX,DS:[490H]
- MOV CS:PARMSAV,AX
- CMP CS:TRACKS,66
- JB NO490
- AND WORD PTR DS:[490H],0DFDFH
- NO490: POP AX
- POP DS
- RET
- SETT ENDP
-
- RESETT PROC NEAR
- PUSH DS
- PUSH AX
- XOR AX,AX
- MOV DS,AX
- MOV AX,CS:[OLD1E]
- MOV DS:[78H],AX
- MOV AX,WORD PTR CS:[OLD1E+2]
- MOV DS:[7AH],AX
- MOV AX,CS:PARMSAV
- MOV DS:[490H],AX
- POP AX
- POP DS
- RET
- RESETT ENDP
-
- ;
- ; HANDLER FOR 'INIT' FUNCTION. IT PARSES THE COMMAND LINE TO FIND
- ; THE DRIVE NAME TO ATTACH ITSELF TO, AND PRINTS ITS FINDINGS
- ; ONLY IF DOS 3.0 OR LATER IS INTALLED.
- ;
-
- INITP PROC NEAR
- INIT:
- PUSH DS
- LDS DI,DWORD PTR REQUEST.BPBPTRO
- INC DI
- XOR SI,SI
- ; CALL _INSTALL
- INIT_L1:
- INC SI
- CMP SI,80 ; FOR INSURANCE AGAINST ODD CONFIG.SYS FILES
- JZ IPART3 ; (NAMELY THOSE W/O CR-LF'S)
- MOV AX,WORD PTR [DI]
- CMP AH,13 ; WE'LL TEST AX='A:' IN A MOMENT...
- JZ IPART3
- CMP AH,':'
- JZ SELECT_DRV
- NOSEL: INC DI
- JMP INIT_L1
- SELECT_DRV:
- CMP AL,'a' ; CONVERT DRIVE LETTER TO U/C
- JB SEL3
- SUB AL,20H
- SEL3:
- SUB AL,'A'
- CMP AL,4 ; ACCEPT DRIVE NAMES WITHIN A-D.
- JAE NOSEL
- MOV CS:[XDL],AL
- ADD AL,'A'
- MOV CS:[DRVC],AL
- JMP IPART3
- IPART3:
- POP DS ; CHECK DOS VERSION NUMBER
- MOV AH,30H
- INT 21H
- CMP AL,3 ; BECAUSE THE DRIVE NUMBER ISN'T
- JL IPART4
- LDS BX,CS:[REQ_PTR] ; REPORTED IN 2.0 OR 2.1.
- MOV AL,REQUEST.DRIVENUM
- ADD AL,'A'
- MOV CS:[DRVV],AL
- MOV CS:[SGN2],'N'
- IPART4:
- LDS BX,CS:[REQ_PTR] ; NOW FILL IN THE REQUEST INFO.
- MOV REQUEST.UNITS,1
- MOV REQUEST.BPBPTRO,OFFSET BPB_TAB
- MOV REQUEST.BPBPTRS,CS
- MOV REQUEST.ENDADRO,OFFSET LASTBYTE
- MOV REQUEST.ENDADRS,CS
- PUSH CS
- POP DS
- MOV DX,OFFSET SIGN_ON ; PRINT A 'HELLO' MESSAGE,
- MOV AH,9
- INT 21H
- XOR AX,AX ; AND WE'RE DONE.
- RET
- INITP ENDP
- MYBLK DB 1024 DUP ('?')
-
- NEW13 PROC NEAR
- PUSH DI
- PUSH AX
- INT 13H
- JNC OK13
- CMP AH,9
- STC
- JNZ OK13
- POP AX
- POP DI
- CALL DMA13
- RET
- OK13: POP DI
- POP DI
- RET
- NEW13 ENDP
-
- _COUNT DB ?
-
- DMA13 PROC NEAR
- PUSH ES
- PUSH AX
- PUSH CX
- MOV CS:_COUNT,AL
- MOV AL,1
- DMA000: PUSH AX
- INT 13H
- POP AX
- JC CARRY
- DMA010: INC CL
- CALL ADDSIZ
- DEC CS:_COUNT
- JNZ DMA000
- CLC
- DMAEND:
- POP CX
- POP AX
- POP ES
- RET
-
- CARRY:
- TEST AH,1
- JZ CARRY_2
- JMP CARRY_3
- CARRY_2:
- PUSH ES
- PUSH BX
- MOV BX,CS
- MOV ES,BX
- MOV BX,OFFSET MYBLK
- PUSH AX
- INT 13H
- POP AX
- POP BX
- POP ES
- JC OHWELL
- PUSH AX
- PUSH BX
- PUSH CX
- PUSH SI
- CALL GETSIZ
- MOV SI,OFFSET MYBLK
- COPY2: MOV AL,CS:[SI]
- MOV ES:[BX],AL
- INC BX
- INC SI
- LOOP COPY2
- POP SI
- POP CX
- POP BX
- POP AX
- JMP DMA010
- OHWELL:
- STC
- JMP DMAEND
- CARRY_3:
- PUSH AX
- PUSH BX
- PUSH CX
- PUSH SI
- CALL GETSIZ
- MOV SI,OFFSET MYBLK
- COPY3: MOV AL,ES:[BX]
- MOV CS:[SI],AL
- INC BX
- INC SI
- LOOP COPY3
- POP SI
- POP CX
- POP BX
- POP AX
- PUSH ES
- PUSH BX
- MOV BX,CS
- MOV ES,BX
- MOV BX,OFFSET MYBLK
- PUSH AX
- INT 13H
- POP AX
- POP BX
- POP ES
- JC OHWELL
- JMP DMA010
- DMA13 ENDP
-
- GETSIZ PROC NEAR
- PUSH BX
- MOV CL,CS:[DOSTBL+3]
- INC CL
- MOV BX,64
- SHL BX,CL
- MOV CX,BX
- POP BX
- RET
- GETSIZ ENDP
-
- ADDSIZ PROC NEAR
- PUSH BX
- PUSH CX
- MOV CL,CS:[DOSTBL+3]
- INC CL
- MOV BX,64/16
- SHL BX,CL
- MOV CX,ES
- ADD CX,BX
- MOV ES,CX
-
- POP CX
- POP BX
- RET
- ADDSIZ ENDP
-
- LASTBYTE LABEL WORD
- RDRIVE ENDS
- END
-