home *** CD-ROM | disk | FTP | other *** search
/ ftp.update.uu.se / ftp.update.uu.se.2014.03.zip / ftp.update.uu.se / pub / rainbow / msdos / latrobe / b / biodif.arc / UDISKDRV.DIF < prev    next >
Text File  |  1987-06-20  |  13KB  |  440 lines

  1.  
  2. ----------UDISKDRV.OLD
  3. ;
  4. ;--
  5.  
  6. ----------UDISKDRV.ASM
  7. ;    RGT    17 Jan 1987    Allow it to reference double-sided disks.
  8. ;
  9. ;    RGT    8 Feb 1987    Added calls to disk cache routines
  10. ;
  11. ;--
  12.  
  13. -----------------------------------------------
  14.  
  15. ----------UDISKDRV.OLD
  16. ;
  17.  
  18. ----------UDISKDRV.ASM
  19. ;                                    ;RGT
  20. ;   Include the disk definition file                    ;RGT
  21. ;                                    ;RGT
  22.     INCLUDE    FDISK.H                            ;RGT
  23. ;
  24.  
  25. -----------------------------------------------
  26.  
  27. ----------UDISKDRV.OLD
  28. TMRCNT        EQU    002H        ;2-second timeout
  29. ;
  30. ;   Dfine the IOCTL packet offsets
  31. ;
  32. IOFUN    EQU    0            ;IOCTL packet function offset
  33. IODRV    EQU    1            ;IOCTL packet driver offset
  34. IOSEC    EQU    2            ;IOCTL packet sector offset
  35. IOTRK    EQU    4            ;IOCTL packet track offset
  36. IOCNT    EQU    6            ;IOCTL packet sector count offset
  37. IOOFF    EQU    8            ;IOCTL buffer offset offset
  38. IOSEG    EQU    00AH            ;IOCTL buffer segment offset
  39.  
  40.  
  41. ----------UDISKDRV.ASM
  42. TMRCNT        EQU    005H        ;5-second timeout        ;RGT
  43. ;
  44.  
  45.  
  46. -----------------------------------------------
  47.  
  48. ----------UDISKDRV.OLD
  49. ;
  50.  
  51. ----------UDISKDRV.ASM
  52.     EXTRN    DISK_CTYP_OFF:ABS    ;Pointer to media type holder    ;RGT
  53.     EXTRN    READ_BLOCK_FROM_CACHE:NEAR    ;Routine to read cache    ;RGT
  54.     EXTRN    WRITE_BLOCK_TO_CACHE:NEAR    ;Routine to write cache    ;RGT
  55.     EXTRN    INVALIDATE_DISK_CACHE:NEAR    ;Routine to invalidate    ;RGT
  56.                         ;disk in cache        ;RGT
  57. ;
  58.  
  59. -----------------------------------------------
  60.  
  61. ----------UDISKDRV.OLD
  62.     CALL    PHYSBUF            ;Do buffered read or write
  63.     JC    RDWRRET            ;Exit if error
  64.     MOV    AL,DSKDRV        ;No error  --  reset timer/drive
  65.  
  66. ----------UDISKDRV.ASM
  67. ;                                    ;RGT
  68. ;   If this is a read, then try to read the data from the disk cache    ;RGT
  69. ;                                    ;RGT
  70.     CMP    BYTE PTR COMMAND,FREAD    ;Check if this is a read    ;RGT
  71.     JNE    READWRITE_110        ;If not, check write        ;RGT
  72.     LES    DI,DWORD PTR DMAOFF    ;Get address of user buffer    ;RGT
  73.     MOV    DX,SECTOR        ;Get logical sector        ;RGT
  74.     MOV    AL,DRIVER        ;Get driver code        ;RGT
  75.     CALL    READ_BLOCK_FROM_CACHE    ;Call routine to read cache    ;RGT
  76.     JC    READWRITE_210        ;If not in cache, read from disk;RGT
  77. ;                                    ;RGT
  78. ;   Disk block was in cache  --  no need to read from disk        ;RGT
  79. ;                                    ;RGT
  80.     JMP    SHORT READWRITE_310    ;Skip over disk read        ;RGT
  81. ;                                    ;RGT
  82. ;   If this is a write, then write the data to the disk cache        ;RGT
  83. ;                                    ;RGT
  84. READWRITE_110:                                ;RGT
  85.     LES    DI,DWORD PTR DMAOFF    ;Get address of user buffer    ;RGT
  86.     MOV    DX,SECTOR        ;Get logical sector        ;RGT
  87.     MOV    AL,DRIVER        ;Get driver code        ;RGT
  88.     CALL    WRITE_BLOCK_TO_CACHE    ;Call routine to write cache    ;RGT
  89. READWRITE_210:                                ;RGT
  90.     CALL    PHYSBUF            ;Do buffered read or write
  91.     JC    RDWRRET            ;Exit if error
  92. ;                                    ;RGT
  93. ;   If this was a read, and the buffer was not in cache,        ;RGT
  94. ;    then the routine was called to read the disk.            ;RGT
  95. ;    Now that the disk has been read, write it to cache.        ;RGT
  96. ;                                    ;RGT
  97.     CMP    BYTE PTR COMMAND,FREAD    ;Check if this is a read    ;RGT
  98.     JNE    READWRITE_310        ;If not, check write        ;RGT
  99.     LES    DI,DWORD PTR DMAOFF    ;Get address of user buffer    ;RGT
  100.     MOV    DX,SECTOR        ;Get logical sector        ;RGT
  101.     MOV    AL,DRIVER        ;Get driver code        ;RGT
  102.     CALL    WRITE_BLOCK_TO_CACHE    ;Call routine to write cache    ;RGT
  103. ;                                    ;RGT
  104. ;   Disk has been read or written, and not error occured.        ;RGT
  105. ;    Reset disk timer and get ready for next read or write.        ;RGT
  106. ;                                    ;RGT
  107. READWRITE_310:                                ;RGT
  108.     MOV    AL,DSKDRV        ;No error  --  reset timer/drive
  109.  
  110. -----------------------------------------------
  111.  
  112. ----------UDISKDRV.OLD
  113.     MOV    SI,[BX+6]        ;SI = type pointer (current type)
  114.     MOV    TYPPTR,SI        ;Save type pointer
  115.     MOV    AL,[SI]            ;Get current format
  116.     AND    AX,7            ;Three choices
  117.     ADD    BX,AX            ;Add word offset
  118.  
  119. ----------UDISKDRV.ASM
  120.     MOV    SI,[BX+DISK_CTYP_OFF]    ;SI = type pointer (current type)
  121.     MOV    TYPPTR,SI        ;Save type pointer
  122.     MOV    AL,[SI]            ;Get current format
  123.     AND    AX,7            ;Six choices            ;RGT
  124.     ADD    BX,AX            ;Add word offset
  125.  
  126. -----------------------------------------------
  127.  
  128. ----------UDISKDRV.OLD
  129.     MOV    AH,-1            ;SEt change to unknown
  130.     JC    SAMDSK            ;If error, return error
  131.  
  132. ----------UDISKDRV.ASM
  133.     MOV    AH,-1            ;Set change to unknown
  134.     JC    SAMDSK            ;If error, return error
  135.  
  136. -----------------------------------------------
  137.  
  138. ----------UDISKDRV.OLD
  139. ;
  140. ;   Set return code to no error
  141. ;
  142. MAYBEC:
  143.     CLC                ;Clear carry for no error
  144.  
  145. ----------UDISKDRV.ASM
  146.     JMP    SHORT NOCHANGE        ;And return success        ;RGT
  147. ;
  148. ;   Disk changed  --  invalidate cache for disk and set return code to no error
  149. ;
  150. MAYBEC:
  151.     PUSH    AX            ;Save result of check        ;RGT
  152.     MOV    AL,BL            ;Get current disk in reg AL    ;RGT
  153.     CALL    INVALIDATE_DISK_CACHE    ;Invalidate cache for this disk    ;RGT
  154.     POP    AX            ;Restore result of check    ;RGT
  155. NOCHANGE:                                ;RGT
  156.     CLC                ;Clear carry for no error
  157.  
  158. -----------------------------------------------
  159.  
  160. ----------UDISKDRV.OLD
  161.     RET                ;Return to caller
  162.  
  163. ----------UDISKDRV.ASM
  164. ;                                    ;RGT
  165. ;   Disk information has been stored  --  invalidate cache for this disk;RGT
  166. ;                                    ;RGT
  167.     XOR    CX,CX            ;Clear count            ;RGT
  168.     MOV    CL,AL            ;Get count of number of disks    ;RGT
  169.     DEC    AL            ;Decrement to get disk number    ;RGT
  170. FDSKINIT_010:                                ;RGT
  171.     PUSH    CX            ;Save count of disks        ;RGT
  172.     CALL    INVALIDATE_DISK_CACHE    ;Invalidate cache for this disk    ;RGT
  173.     DEC    AL            ;Decrement to next disk        ;RGT
  174.     POP    CX            ;Restore count of disks        ;RGT
  175.     LOOP    FDSKINIT_010        ;Loop for all floppy disks    ;RGT
  176.     RET                ;Return to caller
  177.  
  178. -----------------------------------------------
  179.  
  180. ----------UDISKDRV.OLD
  181. ;    ?
  182.  
  183. ----------UDISKDRV.ASM
  184. ;    DRIVER    --  Disk drive to be checked.
  185. ;
  186. ;   Exit Parameters:
  187. ;
  188. ;    Carry    --  Set if error occured on read or write
  189. ;            If set, Reg AL contains MS-DOS error code.
  190. ;
  191. ;   Side Effects:
  192. ;
  193. ;    Sets disk drive type to the disk type found.
  194. ;
  195. ;   Registers Changed:    All
  196. ;
  197. ;   Disk types returned by Z80:
  198. ;
  199. ;    Rainbow        = 0
  200. ;    Robin        = 2
  201. ;    IBM 9        = 4    (Not used  --  returns ROBIN)
  202. ;    IBM 8        = 8
  203. ;    Mongrel        = 00AH
  204. ;    Double-Sided    = 010H        (Set in addition to others)
  205. ;    Unknown        = 0FFH
  206. ;
  207. ;   Disk types that are set by this routine:
  208. ;
  209. ;    Rainbow Single-sided    = 0
  210. ;    IBM 8 Single-sided    = 1
  211. ;    IBM 9 Single-sided    = 2
  212. ;    Rainbow Double-sided    = 4
  213. ;    IBM 8 Double-sided    = 5
  214. ;    IBM 9 Double-sided    = 6
  215. ;
  216. ;--
  217. ;
  218. CHKMED:
  219.     MOV    AL,DRIVER        ;Get current drive to check
  220.     CMP    AL,BYTE PTR FDSKTBL    ;See if it is a valid drive
  221.     JB    CKMDA1            ;If so, check it
  222.     MOV    AL,1            ;Otherwise, set error code to invalid
  223.     STC                ;Set carry to indicate error
  224.     JMP    BAILOUT            ;And bail out of routine
  225. ;
  226. ;   Drive is valid  --  check media check flag
  227. ;
  228. CKMDA1:
  229.     CMP    BYTE PTR MC_FLG,1    ;Check media check flag
  230.     JNZ    NORMAL            ;If not set, do check
  231.     XOR    AX,AX            ;Otherwise, assume Rainbow media
  232.     JMP    SHORT OKMDIA        ;And skip media check codes
  233. ;
  234. ;   Normal operation  --  check media type
  235. ;
  236. NORMAL:
  237.     MOV    BX,OFFSET IOPKT        ;Get offset of I/O packet
  238.     MOV    IOCTL_DMASEG_OFF[BX],DS    ;Store I/O transfer buf seg    ;RGT
  239.     MOV    WORD PTR IOCTL_DMAOFF_OFF[BX],OFFSET BUFFER        ;RGT
  240.                         ;I/O transfer buf off
  241.     MOV    IOCTL_DRIVE_OFF[BX],AL        ;Drive to check        ;RGT
  242.     MOV    BYTE PTR IOCTL_CMD_OFF[BX],IOCTL_CMD_MEDIA_CHK        ;RGT
  243.                     ;Check media function
  244.     INT    DSKDRCT            ;Direct disk driver interrupt
  245. ;
  246. ;   Performed media check function by direct disk function
  247. ;
  248.     MOV    AL,01            ;In case of error, set error code
  249.     JC    BAILOUT            ;If error, bailout
  250.     MOV    BX,OFFSET BUFFER    ;Media type is in first byte of buffer
  251.     XOR    AX,AX            ;Clear field for weird
  252.     MOV    AL,[BX]            ;Get media type
  253. ;    AND    AL,AL            ;If Rainbow or IBM8, then OK
  254.     AND    AL,AL            ;Check if Rainbow, then OK    ;RGT
  255.     JZ    OKMDIA            ;Return that media type
  256.     CMP    AL,010H            ;See if double-sided        ;RGT
  257.     JNZ    CALLSOFT        ;If not, then check type    ;RGT
  258.     MOV    AL,4            ;Otherwise, set double-sided    ;RGT
  259.     JMP    SHORT OKMDIA        ;And return rainbow double    ;RGT
  260. ;                                    ;RGT
  261. ;   Not a Rainbow diskette  --  read disk media type            ;RGT
  262. ;                                    ;RGT
  263. CALLSOFT:                                ;RGT
  264.     CALL    SOFTCHK            ;Otherwise, find out what type it is
  265.     JB    BAILOUT            ;If not succesful, then just return
  266. ;
  267. ;   Found media type  --  return it to caller
  268. ;
  269. OKMDIA:
  270.     XOR    BX,BX            ;Clear pointer
  271.     MOV    BL,DRIVER        ;Get current disk again
  272.     SHL    BX,1            ;Make it a word index
  273.     MOV    BX,FDSKTBL[BX+1]    ;Get media type table for drive
  274.     MOV    SI,[BX+DISK_CTYP_OFF]    ;Get pointer to media type holder
  275.     MOV    [SI],AL            ;Save media type
  276.     XOR    AL,AL            ;Clear status for no error
  277.     CLC                ;Clear carry for no error
  278. ;
  279. ;   Done or error occured  --  return to caller
  280. ;
  281. BAILOUT:
  282.     RET                ;Return to caller
  283.  
  284.  
  285. ;++
  286. ;
  287. ;   Function:    SOFTCHK
  288. ;
  289. ;   Abstract:
  290. ;
  291. ;    Soft media check to see if it is a real 9-sector disk.
  292. ;    Read the disk ID byte to check if logical.
  293. ;
  294. ;   Entry Parameters:
  295. ;
  296. ;    ?
  297.  
  298. -----------------------------------------------
  299.  
  300. ----------UDISKDRV.OLD
  301. ;   Registers Changed:    All
  302.  
  303. ----------UDISKDRV.ASM
  304. ;    Reg AL    --  Media type
  305. ;
  306. ;   Registers Changed:    All
  307.  
  308. -----------------------------------------------
  309.  
  310. ----------UDISKDRV.OLD
  311. CHKMED:
  312.     MOV    AL,DRIVER        ;Get current drive to check
  313.     CMP    AL,BYTE PTR FDSKTBL    ;See if it is a valid drive
  314.     JB    CKMDA1            ;If so, check it
  315.     MOV    AL,1            ;Otherwise, set error code to invalid
  316.     STC                ;Set carry to indicate error
  317.     JMP    BAILOUT            ;And bail out of routine
  318. ;
  319. ;   Drive is valid  --  check media check flag
  320. ;
  321. CKMDA1:
  322.     CMP    BYTE PTR MC_FLG,1    ;Check media check flag
  323.     JNZ    NORMAL            ;If not set, do check
  324.     XOR    AX,AX            ;Otherwise, assume Rainbow media
  325.     JMP    SHORT OKMDIA        ;And skip media check codes
  326. ;
  327. ;   Normal operation  --  check media type
  328. ;
  329. NORMAL:
  330.     MOV    BX,OFFSET IOPKT        ;Get offset of I/O packet
  331.     MOV    IOSEG[BX],DS        ;Store I/O transfer buffer segment
  332.     MOV    WORD PTR IOOFF[BX],OFFSET BUFFER    ;I/O transfer buf off
  333.     MOV    IODRV[BX],AL        ;Drive to check
  334.     MOV    BYTE PTR IOFUN[BX],04    ;Check media function
  335.     INT    DSKDRCT            ;Direct disk driver interrupt
  336. ;
  337. ;   Performed media check function by direct disk function
  338. ;
  339.     MOV    AL,01            ;In case of error, set error code
  340.     JC    BAILOUT            ;If error, bailout
  341.     MOV    BX,OFFSET BUFFER    ;Media type is in first byte of buffer
  342.     XOR    AX,AX            ;Clear field for weird
  343.     MOV    AL,[BX]            ;Get media type
  344.     AND    AL,AL            ;If Rainbow or IBM8, then OK
  345.     JZ    OKMDIA            ;Return that media type
  346.     CALL    SOFTCHK            ;Otherwise, find out what type it is
  347.     JB    BAILOUT            ;If not succesful, then just return
  348. ;
  349. ;   Found media type  --  return it to caller
  350. ;
  351. OKMDIA:
  352.     XOR    BX,BX            ;Clear pointer
  353.     MOV    BL,DRIVER        ;Get current disk again
  354.     SHL    BX,1            ;Make it a word index
  355.     MOV    BX,FDSKTBL[BX+1]    ;Get media type table for drive
  356.     MOV    SI,[BX+6]        ;Get pointer to media type holder
  357.     MOV    [SI],AL            ;Save media type
  358.     XOR    AL,AL            ;Clear status for no error
  359.     CLC                ;Clear carry for no error
  360. ;
  361. ;   Done or error occured  --  return to caller
  362. ;
  363. BAILOUT:
  364.     RET                ;Return to caller
  365.  
  366.  
  367. ;++
  368. ;
  369. ;   Function:    SOFTCHK
  370. ;
  371. ;   Abstract:
  372. ;
  373. ;    Soft media check to see if it is a real 9-sector disk.
  374. ;    Read the disk ID byte to check if logical.
  375. ;
  376. ;   Entry Parameters:
  377. ;
  378. ;    ?
  379. ;
  380. ;   Exit Parameters:
  381. ;
  382. ;    Carry    --  Set if error occured on read or write
  383. ;            If set, Reg AL contains MS-DOS error code.
  384. ;
  385. ;    Reg AL    --  Media type
  386. ;
  387. ;   Registers Changed:    All
  388. ;
  389. ;
  390. ;--
  391. ;
  392. SOFTCHK:
  393.  
  394. ----------UDISKDRV.ASM
  395. SOFTCHK:
  396.  
  397. -----------------------------------------------
  398.  
  399. ----------UDISKDRV.OLD
  400.     MOV    IODRV[BX],AL        ;Drive to be read
  401.     MOV    BYTE PTR IOSEC[BX],2    ;Type byte is on sector 2
  402.     MOV    WORD PTR IOTRK[BX],0    ;On track zero
  403.     MOV    WORD PTR IOCNT[BX],1    ;Only read one sector, of course
  404.     MOV    WORD PTR IOOFF[BX],OFFSET BUFFER    ;Default sector buff
  405.     MOV    IOSEG[BX],DS        ;Default data segment
  406.     MOV    BYTE PTR IOFUN[BX],0    ;Read data command
  407. ;
  408.  
  409. ----------UDISKDRV.ASM
  410.     MOV    IOCTL_DRIVE_OFF[BX],AL    ;Drive to be read        ;RGT
  411.     MOV    BYTE PTR IOCTL_SECTOR_OFF[BX],2    ;Type byte is on sec 2    ;RGT
  412.     MOV    WORD PTR IOCTL_TRACK_OFF[BX],0    ;On track zero        ;RGT
  413.     MOV    WORD PTR IOCTL_COUNT_OFF[BX],1    ;Only read one sector,    ;RGT
  414.                         ;of course
  415.     MOV    WORD PTR IOCTL_DMAOFF_OFF[BX],OFFSET BUFFER        ;RGT
  416.                         ;Default sector buff
  417.     MOV    IOCTL_DMASEG_OFF[BX],DS        ;Default data segment    ;RGT
  418.     MOV    BYTE PTR IOCTL_CMD_OFF[BX],IOCTL_CMD_READ        ;RGT
  419.                         ;Read data command
  420. ;
  421.  
  422. -----------------------------------------------
  423.  
  424. ----------UDISKDRV.OLD
  425. ;
  426.  
  427. ----------UDISKDRV.ASM
  428. ;                                    ;RGT
  429. ;   Check for double-sided IBM disk types                ;RGT
  430. ;                                    ;RGT
  431.     MOV    AL,5            ;Set to IBM 8-sector double    ;RGT
  432.     CMP    BYTE PTR [BX],0FFH    ;See if IBM 8-sector double    ;RGT
  433.     JZ    EXITO            ;If so, then return type    ;RGT
  434.     INC    AL            ;Increment to IBM 9-sect double    ;RGT
  435.     CMP    BYTE PTR [BX],0FDH    ;See if IBM 9-sector doulbe    ;RGT
  436.     JZ    EXITO            ;If so, then return type    ;RGT
  437. ;
  438.  
  439. -----------------------------------------------
  440.