home *** CD-ROM | disk | FTP | other *** search
/ Programmer 7500 / MAX_PROGRAMMERS.iso / PROGRAMS / UTILS / FLOPPIES / ANYDISK.ZIP / ANYDISK.ASM next >
Encoding:
Assembly Source File  |  1988-08-25  |  15.6 KB  |  806 lines

  1. ;=======================================================================;
  2. ;                                    ;
  3. ;    FLOPPY DISK DRIVER: SUPPORTS ANY SIZE OF FLOPPY DISK, WITHIN    ;
  4. ;    THE FOLLOWING LIMITS:                        ;
  5. ;                                    ;
  6. ;    o    THE DISK MUST HAVE A VALID BOOT SECTOR. THIS MEANS    ;
  7. ;        THAT THE BOOT SECTOR MUST HAVE A TABLE STORED IN    ;
  8. ;        IT, WITH THE PARAMETERS FOR THAT DISK.            ;
  9. ;    o    THE NUMBER OF SECTORS PER TRACK CANNOT EXCEED 32.    ;
  10. ;        THE NUMBER, 32, CAN BE CHANGED TO REFLECT NEWER        ;
  11. ;        DISK FORMATS SIMPLY BY CHANGING THE DEFINED VALUE    ;
  12. ;        BELOW.                            ;
  13. ;    o    THE SECTOR SIZE MUST BE 512 BYTES.            ;
  14. ;    o    THE FORMAT ID CODE MUST BE HEX F0 OR GREATER. THIS    ;
  15. ;        VALUE IS CHECKED EVERY TIME THE DIRECTORY IS        ;
  16. ;        ACCESSED, SIMPLY TO KEEP FROM ACCIDENTALLY WRITING    ;
  17. ;        TO A DISK WHOSE FORMAT IS UNKNOWN.            ;
  18. ;                                    ;
  19. ;    THE PROCEDURE TO CREATE THE FINAL FILE 'ANYDISK.SYS' IS:    ;
  20. ;        >A86 ANYDISK.ASM                    ;
  21. ;        >RENAME ANYDISK.BIN ANYDISK.SYS     (IF YOU HAVE A86)    ;
  22. ;                                    ;
  23. ;        >MASM ANYDISK,ANYDISK;                    ;
  24. ;        >LINK ANYDISK,ANYDISK;                    ;
  25. ;        >EXE2BIN ANYDISK.EXE ANYDISK.SYS (IF YOU HAVE MASM)    ;
  26. ;                                    ;
  27. ;    THIS PROGRAM WAS WRITTEN BY GEORGE BREESE, OVER A 24 HOUR    ;
  28. ;    PERIOD, STARTING AT NOON ON 1/16/88.                ;
  29. ;                                    ;
  30. ;    ADDRESS COMMENTS TO:                        ;
  31. ;                                    ;
  32. ;        GEORGE BREESE                        ;
  33. ;        BOX 428                            ;
  34. ;        MORAVIA, NEW YORK 13118                    ;
  35. ;                                    ;
  36. ;=======================================================================;
  37.  
  38. ;
  39. ;    THE FIRST PART OF THE CODE CONSISTS OF GLOBAL DEFINITIONS.
  40. ;    DON'T ALTER THESE, UNLESS NOTED OTHERWISE.
  41. ;
  42. MAXSEC    EQU    32     ;MAX # OF LEGAL SECTORS PER TRACK
  43.     ; (CAN CHANGE THIS)
  44. FALSE    EQU    0
  45. TRUE    EQU    0FFFFH
  46. ERROR_BIT    EQU    8000H     ;THESE ARE STATUS BIT SETTINGS USED WHEN
  47. BUSY_BIT    EQU    0200H     ;VALUES ARE RETURNED TO DOS. DO NOT
  48. DONE_BIT    EQU    0100H     ;CHANGE!
  49. ERR_UNIT_BAD    EQU    1
  50. ERR_COMMAND    EQU    3
  51. ERR_CRC    EQU    4
  52. ERR_SECTOR    EQU    8
  53. ERR_GENERAL    EQU    12
  54. IS_CHANGED    EQU    -1
  55. DONT_KNOW    EQU    0
  56. NOT_CHANGED    EQU    1
  57. CR    EQU    13     ;ASCII EQUIVALENTS OF CR,LF
  58. LF    EQU    10
  59. ;
  60. ;    NOW THE STRUCTURES FOR DOS REQUESTS ARE DEFINED.  A GOOD
  61. ;    WORKING KNOWLEDGE OF THE 'C'LANGUAGE WILL HELP HERE.
  62. ;
  63. REQUEST    EQU    DS:[BX]
  64.  
  65. REQHDR    STRUC
  66.     DB    ?
  67.     DB    ?
  68. COMMAND    DB    ?
  69. STATUS    DW    ?
  70.     DB    8 DUP (?)
  71. REQHDR    ENDS
  72.  
  73. INITHDR    STRUC
  74.     DB    (TYPE REQHDR) DUP (?)
  75. UNITS    DB    ?
  76. ENDADRO    DW    ?
  77. ENDADRS    DW    ?
  78. BPBPTRO    DW    ?
  79. BPBPTRS    DW    ?
  80. DRIVENUM    DB    ?
  81. INITHDR    ENDS
  82.  
  83. MEDHDR    STRUC
  84.     DB    (TYPE REQHDR) DUP (?)
  85. MEDIA    DB    ?
  86. CHANGE    DB    ?
  87. MEDHDR    ENDS
  88.  
  89. BPBHDR    STRUC
  90.     DB    (TYPE REQHDR) DUP (?)
  91.     DB    ?
  92. XFRADRO    DW    ?
  93. XFRADRS    DW    ?
  94.     DW    ?
  95.     DW    ?
  96. BPBHDR    ENDS
  97.  
  98. RWHDR    STRUC
  99.     DB    (TYPE REQHDR) DUP (?)
  100.     DB    ?
  101.     DW    ?
  102.     DW    ?
  103. COUNT    DW    ?
  104. STRTSEC    DW    ?
  105. RWHDR    ENDS
  106.  
  107. TRANSFER    EQU    DWORD PTR XFRADRO
  108. ;
  109. ;    THE ACTUAL CODE STARTS HERE. A '.SYS' FILE BEGINS WITH A BLANK DWORD
  110. ;    THAT DOS WILL LATER FILL WITH A LINK TO OTHER .SYS FILES AT BOOT
  111. ;    TIME. THEN COMES A WORD WITH BITS SET TO SHOW SPECIAL ABILITIES
  112. ;    (THIS DRIVER HAS NONE).  THEN, TWO POINTERS, TO THE TWO CALLS THAT
  113. ;    DOS WILL MAKE. THEN, THE NUMBER OF UNITS, AND A UNIQUE 7-CHAR
  114. ;    LABEL TO SHOW WHO WE ARE WITHIN THE SYSTEM.
  115. ;
  116. ;    IN NORMAL USE AFTER BOOTING, THE WAY DOS WILL ACCESS THIS IS FOLLOWS:
  117. ;    1.    DOS WILL CALL OUR STRATEGY ROUTINE, AND HAND US THE PARAMETERS
  118. ;        FOR THE UPCOMING DISK ACTION.  WE CAN PROCESS THE PARAMETERS
  119. ;        IN ADVANCE IF WE WANT TO, BUT WE CAN'T TAKE ANY ACTION UNTIL...
  120. ;    2.    DOS CALLS OUR DISK HANDLER (LABELED "INTERRUPT".)  WE DO THE
  121. ;        REQUESTED ACTION, AND RETURN A STATUS CODE.
  122. ;
  123. RDRIVE    SEGMENT    PARA
  124.     ASSUME    CS:RDRIVE,DS:NOTHING,ES:NOTHING
  125.     ORG    0
  126. START    EQU    $
  127.     DD    -1
  128.     DW    0
  129.     DW    OFFSET STRATEGY
  130.     DW    OFFSET INTERRUPT
  131.     DB    1,'ANYSIZE'
  132. ;
  133. ;    HERE'S A TABLE WE WILL USE IN OUR "INTERRUPT" HANDLER, TO JUMP
  134. ;    TO THE INDIVIDUAL FUNCTIONS WE PERFORM.
  135. ;
  136. JUMPTAB    LABEL    WORD
  137.     DW    OFFSET INIT
  138.     DW    OFFSET MEDIA_CHECK
  139.     DW    OFFSET BUILD_BPB
  140.     DW    OFFSET IOCTL_INPUT
  141.     DW    OFFSET READ
  142.     DW    OFFSET READ_NOWAIT
  143.     DW    OFFSET INPUT_STATUS
  144.     DW    OFFSET INPUT_FLUSH
  145.     DW    OFFSET WRITE
  146.     DW    OFFSET WRITE_VERIFY
  147.     DW    OFFSET OUTPUT_STATUS
  148.     DW    OFFSET OUTPUT_FLUSH
  149.     DW    OFFSET IOCTL_OUTPUT
  150.  
  151. REQ_PTR    DD    ?     ;THE POINTER TO THE REQUEST'S PARAMETERS
  152. BPB_TAB    DW    OFFSET BPB
  153. ;
  154. ;    REGISTERS. SET BY GETNEXT, USED BY READ/WRITE.
  155. ;
  156. XAL    DB    ?
  157. XDL    DB    0     ; 0 = ASSUME DRIVE A
  158. XCOUNT    DW    ?
  159. LOGSEC    DW    ?
  160.  
  161. XFER    LABEL    DWORD     ; THE TRANSFER ADDRESS
  162. XBX    DW    ?
  163. XES    DW    ?
  164.  
  165. XSS    DW    0     ; POINTER TO DOS'S STACK
  166. XSP    DW    0
  167.  
  168. STK    DB    51 DUP ('STACK ')     ;255 BYTES FOR OUR LOCAL STACK
  169. STKEND    LABEL    WORD
  170.  
  171. SIGN_ON    DB    'Any-size disk driver V1.2',9,'George Breese 8/8/88',CR,LF
  172. SGN2    DB    '$ew virtual drive '     ; $ WILL BE TURNED INTO N IF >DOS 3.0
  173. DRVV    DB    '?: connected to drive '     ; DRVV IS OUR DRIVE NAME
  174. DRVC    DB    'A:',CR,LF,'$'     ; DRVC IS REAL DRIVE NAME
  175.  
  176. TRACKS    DB    ?
  177. DOSTBL    DB    0DFH,2,25H,2,9,2AH,0FFH,50H,0F6H,0,1
  178. OLD1E    DW    0,0
  179. ;
  180. ;    REV 1.1:  A.T. 80-TRACK, DOUBLE-DENSITY DISKS ARE SUPPORTED.
  181. ;    IN ORDER TO MAKE 720K DISKS ON 80-TRACK 5.25" DRIVES,
  182. ;    LOCATION 40:90 GETS ITS VALUE 'ANDed' WITH HEX DF TO
  183. ;    SELECT SINGLE STEPPING (AND THUS 80-TRACK OPERATION).
  184. ;
  185.  
  186. PARMSAV    DW    0
  187.  
  188. ;
  189. ;    REV 1.2:  OPERATION OF THIS DRIVER HAS BEEN MADE MORE BULLET-
  190. ;    PROOF.  THE ARRAY 'DOSTBL' HOLDS A CUSTOMIZED DISK BIOS PARAMETER
  191. ;    TABLE.  PREVIOUS VERSIONS USED, AND DAMAGED, THE TABLE MADE BY DOS.
  192. ;
  193.  
  194. ;
  195. ;    THE FOLLOWING IS WHERE THE BOOT SECTOR IS STORED, AND THUS WHERE
  196. ;    THE DRIVE PARAMETERS COME FROM.
  197. ;
  198.  
  199. INTERN    LABEL    WORD
  200.     DB    0,0,0
  201.     DB    'OEM NAME'
  202. BPB    LABEL    WORD
  203. SECTOR_SIZE    LABEL    WORD
  204.     DW    512
  205.     DB    1
  206.     DW    0
  207.     DB    2
  208.     DW    32
  209. DISK_SIZE    LABEL    WORD
  210.     DW    128
  211. ID_BYTE    DB    0F8H
  212.     DW    1
  213. SPT    DW    8
  214. SIDES    DW    1
  215.     DW    0
  216.     DB    511 DUP (0)
  217.  
  218. ;
  219. ;    THE STRATEGY HANDLER SIMPLY TAKES THE GIVEN POINTER AND FILES IT
  220. ;    AWAY FOR THE INTERRUPT CALL.
  221. ;
  222. STRATP    PROC    FAR
  223. STRATEGY:    
  224.     MOV    CS:WORD PTR [REQ_PTR],BX
  225.     MOV    CS:WORD PTR [REQ_PTR+2],ES
  226.     RET
  227. STRATP    ENDP
  228.  
  229. ;
  230. ;    THE "INTERRUPT" HANDLER.
  231. ;
  232. ;
  233. INTERP    PROC    FAR
  234. INTERRUPT:    
  235.     PUSH    AX
  236.     PUSH    BX
  237.     PUSH    CX
  238.     PUSH    DX
  239.     PUSH    BP
  240.     PUSH    SI
  241.     PUSH    DI
  242.     PUSH    DS
  243.     PUSH    ES
  244.     PUSHF
  245.     MOV    CS:[XSS],SS     ;DOS HAS A SMALL STACK, SO WE'LL
  246.     MOV    CS:[XSP],SP     ;SUBSTITUTE OUR OWN.
  247.     PUSH    CS
  248.     POP    SS
  249.     MOV    SP,OFFSET STKEND
  250.     CALL    SETT
  251.     LDS    BX,CS:[REQ_PTR]
  252.     MOV    AL,REQUEST.COMMAND
  253.     CBW
  254.     CMP    AL,0CH
  255.     JAE    CMD_ERROR     ; WE ONLY HAVE SUPPORT FOR
  256.     SHL    AX,1     ; IOCTL FUNCTIONS 0-11.
  257.     MOV    SI,AX
  258.     MOV    AX,OFFSET EXIT
  259.     PUSH    AX     ; FORCE A RETURN ADDRESS ON THE STACK,
  260.     XOR    AX,AX     ; THEN 'CALL' A FUNCTION HANDLER.
  261.     JMP    CS:JUMPTAB[SI]
  262. IOCTL_INPUT:    
  263. READ_NOWAIT:    
  264. INPUT_STATUS:    
  265. INPUT_FLUSH:    ; ALL OF THESE NEED NOT BE
  266. OUTPUT_STATUS:    ; PROCESSED - DISKS DON'T DO
  267. OUTPUT_FLUSH:    ; THESE THINGS ANYWAY.
  268. IOCTL_OUTPUT:    
  269.     POP    AX
  270. CMD_ERROR:    
  271.     MOV    AX,ERR_COMMAND     ; IF THE COMMAND WAS BAD, THEN SET
  272.     OR    AX,ERROR_BIT     ; THE BITS TO SHOW IT.
  273. EXIT:    
  274.     LDS    BX,CS:[REQ_PTR]     ; FUNCTION HANDLERS ARE FORCED TO
  275.     OR    AX,DONE_BIT     ; 'RETURN' HERE
  276.     MOV    REQUEST.STATUS,AX
  277.     CALL    RESETT
  278.     MOV    SS,CS:[XSS]     ; RESTORE DOS'S STACK AND LEAVE.
  279.     MOV    SP,CS:[XSP]
  280.     POPF
  281.     POP    ES
  282.     POP    DS
  283.     POP    DI
  284.     POP    SI
  285.     POP    BP
  286.     POP    DX
  287.     POP    CX
  288.     POP    BX
  289.     POP    AX
  290.     RET
  291. INTERP    ENDP
  292.  
  293. MEDIAP    PROC    NEAR
  294. MEDIA_CHECK:    
  295.     MOV    DI,3
  296. LP:    PUSH    CS
  297.     POP    ES
  298.     MOV    AH,2
  299.     MOV    AL,1     ; THIS SECTION CHECKS FOR NON-SUPPORTED
  300.     MOV    BX,OFFSET INTERN     ; FORMATS.
  301.     MOV    CX,1
  302.     MOV    DH,0
  303.     MOV    DL,CS:[XDL]
  304.     INT    13H
  305.     JNC    LP2
  306.     DEC    DI
  307.     JNZ    LP
  308.     JMP    ERR_HANDLE
  309. LP2:    ; THE CHECK FOR VALID PARAMETERS
  310.     PUSH    AX
  311.     MOV    AL,BYTE PTR CS:SPT
  312.     MOV    CS:[DOSTBL+4],AL
  313.     POP    AX
  314.     CMP    WORD PTR CS:[SECTOR_SIZE],512
  315.     JNZ    BUMRAP
  316.     CMP    BYTE PTR CS:[SPT],MAXSEC
  317.     JAE    BUMRAP
  318.     CMP    BYTE PTR CS:[ID_BYTE],0F8H
  319.     JNB    OK_SO_FAR
  320. BUMRAP:    MOV    AX,7     ;INVALID MEDIA, OR NON-DOS DISK
  321.     OR    AX,ERROR_BIT
  322.     JMP    EXIT
  323.  
  324. OK_SO_FAR:    ; CALC NUMBER OF TRACKS FOR A.T. SUPPORT
  325.     MOV    AL,BYTE PTR CS:[SPT]
  326.     MUL    BYTE PTR CS:[SIDES]
  327.     MOV    CL,AL
  328.     MOV    AX,CS:[DISK_SIZE]
  329.     DIV    CL
  330.     MOV    CS:[TRACKS],AL
  331.  
  332.     LDS    BX,CS:[REQ_PTR]
  333.     MOV    REQUEST.CHANGE,DONT_KNOW
  334.     ;
  335.     ; DON'T KNOW IS THE STANDARD RESPONSE FOR A FLOPPY DRIVE
  336.     ; WHEN THE 'DISKETTE CHANGE LINE' ISN'T SUPPORTED.
  337.     ; WE CAN'T GUARANTEE WHAT MACHINE WE'RE RUNNING ON, SO
  338.     ; WE ALWAYS RETURN "DON'T KNOW".
  339.     ; PERHAPS IN A FUTURE REVISION, I'LL CHECK FOR THE CHANGE LINE.
  340.     ; -- G.E.B.
  341.     ;
  342.     XOR    AX,AX
  343.     RET
  344. MEDIAP    ENDP
  345.  
  346. ;
  347. ;    BUILD BIOS PARAMETER BLOCK.  POINTS DOS TO OUR PARAMETER TABLE.
  348. ;
  349. BBPBP    PROC    NEAR
  350. BUILD_BPB:    
  351.     LDS    BX,CS:[REQ_PTR]
  352.     MOV    REQUEST.BPBPTRO,OFFSET BPB
  353.     MOV    REQUEST.BPBPTRS,CS
  354.     XOR    AX,AX     ; RETURN NO ERROR BITS, BECAUSE WE
  355.     RET        ; HAVEN'T DONE ANYTHING!
  356. BBPBP    ENDP
  357.  
  358. ;
  359. ;    READ: READ FROM DISK.  A SHORT ROUTINE. MOST OF THE WORK IS DONE BY
  360. ;    'VERIFY' AND 'GETNEXT'.
  361. ;
  362.  
  363. READP    PROC    NEAR
  364. READ:    
  365.     CALL    VERIFY
  366.     PUSH    CS
  367.     POP    DS
  368. READ_LOOP:    
  369.     LES    BX,DWORD PTR DS:[XFER]
  370.     PUSH    ES
  371.     PUSH    BX
  372.     CALL    GETNEXT
  373.     POP    BX
  374.     POP    ES
  375.     MOV    DI,3
  376. RDD:    
  377.     MOV    AH,2
  378.     MOV    AL,DS:[XAL]     ; COUNT
  379.     OR    AL,AL
  380.     JZ    READ_DONE
  381.     MOV    DL,DS:[XDL]     ; DRIVE #
  382.     CALL    NEW13     ; CALL BIOS
  383.     JNB    READ_LOOP
  384.     DEC    DI
  385.     JNZ    RDD
  386.     JMP    ERR_HANDLE
  387. READ_DONE:    
  388.     XOR    AX,AX     ; RETURN 0 IF OK
  389.  
  390.     RET
  391. READP    ENDP
  392.  
  393. ;
  394. ;    WRITE: PUTS SECTORS TO DISK.
  395. ;    A SHORT ROUTINE, BECAUSE 'GETNEXT' AND 'VERIFY' DO ALL THE WORK.
  396. ;
  397. ;
  398.  
  399. WRITEP    PROC    NEAR
  400. WRITE:    
  401. WRITE_VERIFY:    
  402.     CALL    VERIFY
  403.     PUSH    CS
  404.     POP    DS
  405. WRIT_LOOP:    
  406.     LES    BX,DS:[XFER]
  407.     PUSH    ES
  408.     PUSH    BX
  409.     CALL    GETNEXT
  410.     POP    BX
  411.     POP    ES
  412.     MOV    DI,2
  413. WDD:    MOV    AH,3
  414.     MOV    AL,DS:[XAL]     ; # OF SECTORS
  415.     OR    AL,AL
  416.     JZ    READ_DONE
  417.     MOV    DL,DS:[XDL]     ; DRIVE #
  418.     CALL    NEW13     ; CALL BIOS DISK INTERRUPT
  419.     JNB    WRIT_LOOP
  420.     DEC    DI
  421.     JNZ    WDD
  422.     JMP    ERR_HANDLE
  423. WRIT_DONE:    
  424.     XOR    AX,AX
  425.     RET
  426. WRITEP    ENDP
  427.  
  428. ;
  429. ;    GETNEXT: SETS UP THE REGISTERS FOR READS/WRITES.
  430. ;
  431. GETNEXT    PROC    NEAR
  432. ;
  433. ;    PART 1: FIGURE CH=LOGSEG/(SPT*SIDES).
  434. ;
  435.     MOV    AX,DS:[LOGSEC]     ; FIRST, CH = LOGSEC / (SIDES*SPT)
  436.     MOV    SI,AX
  437.     MOV    CL,BYTE PTR DS:[SPT]
  438.     MOV    DL,CL     ; PRESERVE SPT INSIDE DL FOR LATER...
  439.     CMP    BYTE PTR DS:[SIDES],2
  440.     JNZ    G10
  441.     SHL    CL,1
  442. G10:    
  443.     DIV    CL
  444.     MOV    CH,AL
  445. ;
  446. ;    PART 2: FIGURE CL=LOGSEC-(TRACK*SPT*SIDES). CL STILL HOLDS
  447. ;    SPT*SIDES FROM PART 1.
  448. ;
  449. PART2:    MUL    CL     ; YIELDS SPT*SIDES*TRACK
  450.     XCHG    SI,AX
  451.     SUB    AX,SI     ; LOGSEC-(SPT*SIDES*TRACK)
  452.     MOV    CL,AL     ; INTO CL
  453.     CMP    CL,DL     ; IS AL > SPT?
  454.     JAE    SIDE1
  455.     MOV    DH,0     ; HANDLE SIDE 0
  456.     JMP    PART3
  457. SIDE1:    SUB    CL,DL
  458.     MOV    DH,1     ; HANDLE SIDE 1
  459. ;
  460. ;    WE'VE NOW GOT CX WHERE WE WANT IT! WE'LL PUSH IT, AND POP IT LATER.
  461. ;     AL NOW NEEDS # OF SECTORS TO READ
  462. ;
  463. PART3:    
  464.     PUSH    CX
  465.     XCHG    CL,DL
  466.     SUB    CL,DL    ; start by taking SPT (WHICH IS CL) - XCL (WHICH IS DL)
  467.     XOR    CH,CH     ; BUT DO WE WANT THAT MANY SECTORS? (CX>XCOUNT?)
  468.     CMP    CX,DS:[XCOUNT]
  469.     JBE    PART4     ; IF NOT, THEN SET CX TO XCOUNT
  470.     MOV    CX,DS:[XCOUNT]
  471. ;
  472. ;    CX HAS THE SECTOR COUNT FOR THIS NEXT INT13 OPERATION. WE'LL MOVE
  473. ;    IT INTO AL LATER.  NOW, WE HAVE TO UPDATE OUR POINTERS.
  474. ;
  475. PART4:    
  476.     ADD    DS:[LOGSEC],CX     ; UPDATE LOGSEC AND XCOUNT.
  477.     SUB    DS:[XCOUNT],CX
  478.     MOV    AX,WORD PTR DS:[SECTOR_SIZE]
  479.     PUSH    DX
  480.     MUL    CX
  481.     POP    DX
  482.     ADD    DS:[XBX],AX     ; AND ADD TO XBX
  483.     MOV    DS:[XAL],CL
  484.     POP    CX
  485.     INC    CL     ; CORRECT CL'S MODULO RANGE.
  486. ;
  487. ;    AT THE END OF THIS, DH HAS SIDE, CX HAS TRACK&SECTOR, AND AL HAS
  488. ;    SECTOR COUNT.
  489. ;
  490.     RET
  491. GETNEXT    ENDP
  492.  
  493. ;
  494. ;    TRANSLATOR FOR BIOS ERRORS.
  495. ;
  496. ERR_HANDLE    PROC    NEAR     ;SHOULD BE JMP'ed TO!!! NOT CALLed!!!
  497.     MOV    CX,12
  498.     ;12 is valid for ah=8 or 32 (dma failure or 765 failure)
  499.     CMP    AH,2     ; bad address mark
  500.     JNZ    E1
  501.     MOV    CX,11
  502. E1:    CMP    AH,3     ; write protect
  503.     JNZ    E2
  504.     MOV    CX,0
  505. E2:    CMP    AH,4     ;sector not found
  506.     JNZ    E3
  507.     MOV    CX,8
  508. E3:    CMP    AH,16     ;bad crc
  509.     JNZ    E4
  510.     MOV    CX,11
  511. E4:    CMP    AH,64     ;bad seek
  512.     JNZ    E5
  513.     MOV    CX,6
  514. E5:    CMP    AH,128     ;timeout
  515.     JNZ    E6
  516.     MOV    CX,2
  517. E6:    MOV    AX,ERROR_BIT
  518.     OR    AX,CX
  519.     JMP    EXIT
  520. ERR_HANDLE    ENDP
  521.  
  522. ;
  523. ;    VERIFY: CHECKS THE REQUEST TO SEE IF ITS PARAMETERS ARE VALID.
  524. ;
  525. VERIFY    PROC    NEAR
  526. ;
  527. ;    FIRST, SEE IF LOGSEC IS PAST END-OF-DISK.
  528. ;
  529.     MOV    CX,REQUEST.STRTSEC
  530.     MOV    CS:[LOGSEC],CX
  531.     CMP    CX,CS:DISK_SIZE
  532.     JAE    OUT_OF_RANGE
  533. ;
  534. ;    THEN, SEE IF END-OF-REQUEST IS PAST END-OF-DISK.
  535. ;
  536.     ADD    CX,REQUEST.COUNT
  537.     CMP    CX,CS:DISK_SIZE
  538.     JBE    IN_RANGE
  539. OUT_OF_RANGE:    ;(THE PARAMETERS ARE INVALID.)
  540.     POP    AX     ; FORCE OUR RETURN TO 'EXIT'
  541.     MOV    AX,ERR_SECTOR
  542.     OR    AX,ERROR_BIT
  543.     MOV    REQUEST.COUNT,0
  544.     RET
  545. IN_RANGE:    
  546. ;
  547. ;    NOW, SEE IF MORE THAN 64K WAS REQUESTED.
  548. ;
  549.     MOV    AX,REQUEST.COUNT
  550.     CMP    AX,128
  551.     JA    OUT_OF_RANGE
  552.     MOV    CL,9
  553.     SHL    AX,CL
  554.     ADD    AX,REQUEST.XFRADRO
  555.     JC    OUT_OF_RANGE
  556.     MOV    AX,REQUEST.COUNT
  557.     MOV    CS:[XCOUNT],AX
  558.     CLD
  559.     LES    DX,REQUEST.TRANSFER
  560.     MOV    CS:[XES],ES
  561.     MOV    CS:[XBX],DX
  562.     RET
  563. VERIFY    ENDP
  564.  
  565. ;
  566. ;    SETT: SETS THE DISK DRIVE CONTROLLER TO TIGHTER SPECS FOR THE
  567. ;    LARGER DISK SIZES.
  568. ;
  569. ;
  570. SETT    PROC    NEAR
  571.     PUSH    DS
  572.     PUSH    AX
  573.     XOR    AX,AX
  574.     MOV    DS,AX
  575.     MOV    AX,DS:[78H]
  576.     MOV    CS:OLD1E,AX
  577.     MOV    AX,DS:[7AH]
  578.     MOV    CS:OLD1E+2,AX
  579.     MOV    WORD PTR [7AH],CS
  580.     MOV    WORD PTR [78H],OFFSET DOSTBL
  581.     MOV    AX,DS:[490H]
  582.     MOV    CS:PARMSAV,AX
  583.     CMP    CS:TRACKS,66
  584.     JB    NO490
  585.     AND    WORD PTR DS:[490H],0DFDFH
  586. NO490:    POP    AX
  587.     POP    DS
  588.     RET
  589. SETT    ENDP
  590.  
  591. RESETT    PROC    NEAR
  592.     PUSH    DS
  593.     PUSH    AX
  594.     XOR    AX,AX
  595.     MOV    DS,AX
  596.     MOV    AX,CS:[OLD1E]
  597.     MOV    DS:[78H],AX
  598.     MOV    AX,WORD PTR CS:[OLD1E+2]
  599.     MOV    DS:[7AH],AX
  600.     MOV    AX,CS:PARMSAV
  601.     MOV    DS:[490H],AX
  602.     POP    AX
  603.     POP    DS
  604.     RET
  605. RESETT    ENDP
  606.  
  607. ;
  608. ;    HANDLER FOR 'INIT' FUNCTION. IT PARSES THE COMMAND LINE TO FIND
  609. ;    THE DRIVE NAME TO ATTACH ITSELF TO, AND PRINTS ITS FINDINGS
  610. ;    ONLY IF DOS 3.0 OR LATER IS INTALLED.
  611. ;
  612.  
  613. INITP    PROC    NEAR
  614. INIT:    
  615.     PUSH    DS
  616.     LDS    DI,DWORD PTR REQUEST.BPBPTRO
  617.     INC    DI
  618.     XOR    SI,SI
  619. ;    CALL _INSTALL
  620. INIT_L1:    
  621.     INC    SI
  622.     CMP    SI,80     ; FOR INSURANCE AGAINST ODD CONFIG.SYS FILES
  623.     JZ    IPART3     ; (NAMELY THOSE W/O CR-LF'S)
  624.     MOV    AX,WORD PTR [DI]
  625.     CMP    AH,13     ; WE'LL TEST AX='A:' IN A MOMENT...
  626.     JZ    IPART3
  627.     CMP    AH,':'
  628.     JZ    SELECT_DRV
  629. NOSEL:    INC    DI
  630.     JMP    INIT_L1
  631. SELECT_DRV:    
  632.     CMP    AL,'a'     ; CONVERT DRIVE LETTER TO U/C
  633.     JB    SEL3
  634.     SUB    AL,20H
  635. SEL3:    
  636.     SUB    AL,'A'
  637.     CMP    AL,4     ; ACCEPT DRIVE NAMES WITHIN A-D.
  638.     JAE    NOSEL
  639.     MOV    CS:[XDL],AL
  640.     ADD    AL,'A'
  641.     MOV    CS:[DRVC],AL
  642.     JMP    IPART3
  643. IPART3:    
  644.     POP    DS     ; CHECK DOS VERSION NUMBER
  645.     MOV    AH,30H
  646.     INT    21H
  647.     CMP    AL,3     ; BECAUSE THE DRIVE NUMBER ISN'T
  648.     JL    IPART4
  649.     LDS    BX,CS:[REQ_PTR]     ; REPORTED IN 2.0 OR 2.1.
  650.     MOV    AL,REQUEST.DRIVENUM
  651.     ADD    AL,'A'
  652.     MOV    CS:[DRVV],AL
  653.     MOV    CS:[SGN2],'N'
  654. IPART4:    
  655.     LDS    BX,CS:[REQ_PTR]     ; NOW FILL IN THE REQUEST INFO.
  656.     MOV    REQUEST.UNITS,1
  657.     MOV    REQUEST.BPBPTRO,OFFSET BPB_TAB
  658.     MOV    REQUEST.BPBPTRS,CS
  659.     MOV    REQUEST.ENDADRO,OFFSET LASTBYTE
  660.     MOV    REQUEST.ENDADRS,CS
  661.     PUSH    CS
  662.     POP    DS
  663.     MOV    DX,OFFSET SIGN_ON     ; PRINT A 'HELLO' MESSAGE,
  664.     MOV    AH,9
  665.     INT    21H
  666.     XOR    AX,AX     ; AND WE'RE DONE.
  667.     RET
  668. INITP    ENDP
  669. MYBLK    DB    1024 DUP ('?')
  670.  
  671. NEW13    PROC    NEAR
  672.     PUSH    DI
  673.     PUSH    AX
  674.     INT    13H
  675.     JNC    OK13
  676.     CMP    AH,9
  677.     STC
  678.     JNZ    OK13
  679.     POP    AX
  680.     POP    DI
  681.     CALL    DMA13
  682.     RET
  683. OK13:    POP    DI
  684.     POP    DI
  685.     RET
  686. NEW13    ENDP
  687.  
  688. _COUNT    DB    ?
  689.  
  690. DMA13    PROC    NEAR
  691.     PUSH    ES
  692.     PUSH    AX
  693.     PUSH    CX
  694.     MOV    CS:_COUNT,AL
  695.     MOV    AL,1
  696. DMA000:    PUSH    AX
  697.     INT    13H
  698.     POP    AX
  699.     JC    CARRY
  700. DMA010:    INC    CL
  701.     CALL    ADDSIZ
  702.     DEC    CS:_COUNT
  703.     JNZ    DMA000
  704.     CLC
  705. DMAEND:    
  706.     POP    CX
  707.     POP    AX
  708.     POP    ES
  709.     RET
  710.  
  711. CARRY:    
  712.     TEST    AH,1
  713.     JZ    CARRY_2
  714.     JMP    CARRY_3
  715. CARRY_2:    
  716.     PUSH    ES
  717.     PUSH    BX
  718.     MOV    BX,CS
  719.     MOV    ES,BX
  720.     MOV    BX,OFFSET MYBLK
  721.     PUSH    AX
  722.     INT    13H
  723.     POP    AX
  724.     POP    BX
  725.     POP    ES
  726.     JC    OHWELL
  727.     PUSH    AX
  728.     PUSH    BX
  729.     PUSH    CX
  730.     PUSH    SI
  731.     CALL    GETSIZ
  732.     MOV    SI,OFFSET MYBLK
  733. COPY2:    MOV    AL,CS:[SI]
  734.     MOV    ES:[BX],AL
  735.     INC    BX
  736.     INC    SI
  737.     LOOP    COPY2
  738.     POP    SI
  739.     POP    CX
  740.     POP    BX
  741.     POP    AX
  742.     JMP    DMA010
  743. OHWELL:    
  744.     STC
  745.     JMP    DMAEND
  746. CARRY_3:    
  747.     PUSH    AX
  748.     PUSH    BX
  749.     PUSH    CX
  750.     PUSH    SI
  751.     CALL    GETSIZ
  752.     MOV    SI,OFFSET MYBLK
  753. COPY3:    MOV    AL,ES:[BX]
  754.     MOV    CS:[SI],AL
  755.     INC    BX
  756.     INC    SI
  757.     LOOP    COPY3
  758.     POP    SI
  759.     POP    CX
  760.     POP    BX
  761.     POP    AX
  762.     PUSH    ES
  763.     PUSH    BX
  764.     MOV    BX,CS
  765.     MOV    ES,BX
  766.     MOV    BX,OFFSET MYBLK
  767.     PUSH    AX
  768.     INT    13H
  769.     POP    AX
  770.     POP    BX
  771.     POP    ES
  772.     JC    OHWELL
  773.     JMP    DMA010
  774. DMA13    ENDP
  775.  
  776. GETSIZ    PROC    NEAR
  777.     PUSH    BX
  778.     MOV    CL,CS:[DOSTBL+3]
  779.     INC    CL
  780.     MOV    BX,64
  781.     SHL    BX,CL
  782.     MOV    CX,BX
  783.     POP    BX
  784.     RET
  785. GETSIZ    ENDP
  786.  
  787. ADDSIZ    PROC    NEAR
  788.     PUSH    BX
  789.     PUSH    CX
  790.     MOV    CL,CS:[DOSTBL+3]
  791.     INC    CL
  792.     MOV    BX,64/16
  793.     SHL    BX,CL
  794.     MOV    CX,ES
  795.     ADD    CX,BX
  796.     MOV    ES,CX
  797.  
  798.     POP    CX
  799.     POP    BX
  800.     RET
  801. ADDSIZ    ENDP
  802.  
  803. LASTBYTE    LABEL    WORD
  804. RDRIVE    ENDS
  805.     END
  806.