home *** CD-ROM | disk | FTP | other *** search
/ Oakland CPM Archive / oakcpm.iso / cpm / apple / ap40trk.lbr / AP40TRK.AQ5 / AP40TRK.A65
Encoding:
Text File  |  1987-07-05  |  11.0 KB  |  452 lines

  1.     .WIDTH    96
  2. ;******************************
  3. ;FILE:     APL40TRK.A65
  4. ;    THIS FILE IS A VERSION OF WINK SAVILLE'S APLFLPY.A65 DISK
  5. ;    DRIVER, MODIFIED TO HANDLE 40 (RATHER THAN 35) TRACKS * 16
  6. ;    SECTORS.  Thanks to Wink for advice & consultations!
  7. ;    
  8. ;
  9. ; This driver has also been modified to have disk initialization compatible 
  10. ; with PCPI vers 1.6: the slot-determination code was meant for v2.0.
  11. ;
  12. ;
  13. ;PURP:    DRIVER FOR THE APPLE FLOPPY ASSUMES THAT 0BD00H IS RWTS LOCATION.
  14. ;
  15. ;CHANGES:
  16. ;
  17. ;    2/24/84 Steven M. Block, Caltech
  18. ;        Added code to support 40 tracks * 16 sectors:
  19. ;        any call to the FORMAT routine makes a 'flying patch'
  20. ;        to DOS 3.3 at 6502 location $BEFE (in RWTS), changing 
  21. ;        the byte there to $28 (from $23).  The byte is restored 
  22. ;        after finishing the FORMAT command.  This driver is
  23. ;        assembled to act as drives C: and D: (rather than A: & B:).
  24. ;        Any call to this driver to FORMAT results in a
  25. ;        40-track disk initialization.  Any call to FORMAT A: or B:
  26. ;        results in a 35-track initialization by the usual APLFLPY
  27. ;        driver.  The system therefore will appear to have 4 'logical'
  28. ;        drives, but only two physical ones.
  29. ;
  30. ;    6/30/83 (WLS)
  31. ;        ADDED    CODE TO INIT THAT USES ABOOTSLOT TO SET UP THE
  32. ;            SLOT ARRAY
  33. ;
  34. ;    5/11/83    (WLS)
  35. ;        ADDED    CODE FOR ISOLATING THE DRIVE AND DENSITY IN THE
  36. ;            FORMAT COMMAND
  37. ;
  38. ;    2/24/83    (WLS)
  39. ;        ADDED    QUERY FOR SLOT NUMBER
  40. ;
  41. ;    12/29/82 (WLS)
  42. ;        CHANGED LENGTH OF NAME FROM 12 TO 15
  43. ;
  44. ;    9/1/82    (WLS)
  45. ;        ADDED    SEND COMMAND (VERISON 3)
  46. ;        ADDED    SETTING OF PREVIOUS DRIVE AND SLOT UPON SUCCESSFUL RWTS
  47. ;            CALL
  48. ;
  49. ;    8/1/82    (WLS)
  50. ;        ADDED    CALL RD1Z80BYTE IN SEND HOST AND DISK PARAMETERS
  51. ;
  52. ;    6/16/82 (WLS)
  53. ;        CHANGED    FORMAT TO GET THE DRIVE NUMBER
  54. ;
  55. ;    5/26/82    (WLS)
  56. ;        MOVED    SECTOR TRANSLATION FROM Z80 BIOS TO HERE
  57. ;        ADDED    SNDPRM SUPPORT
  58. ;
  59. ;    4/28/82    (WLS)
  60. ;        ADDED    CODE TO SUPPORT BLOCK DEVICE TABLES
  61. ;
  62. ;    4/2/82    (WLS)
  63. ;        ADDED    CODE TO CHANGE MONTC2 DEPENDING ON TYPE OF COMMAND
  64. ;        ADDED    CODE TO CHECK IF THE CARD IS IN THE SLOT
  65. ;
  66. ;    2/24/82 (WLS)
  67. ;        CHANGED TO ALLOW MULTIPLE CONTROLLERS
  68. ;
  69. ;    1/7/82 (WLS)
  70. ;        MADE DRIVE 0 BE THE APPLE DRIVES
  71. ;
  72. ;    11/16/81 (WLS)
  73. ;        CREATED
  74. ;*******************************
  75.  
  76. FALSE:    .EQU    0
  77. TRUE:    .EQU    NOT FALSE
  78.  
  79. BASEPG0: .QUERY    "ENTER BASE OF PAGE 0: "
  80. PAGE0W0: .EQU    BASEPG0        ;PAGE ZERO TEMPORARY 1
  81. PAGE0W1: .EQU    PAGE0W0+2    ;PAGE ZERO TEMPORARY 2
  82.  
  83. ;EQUATES
  84.     .NOLIST
  85.     .INCLUDE    DRVREQUS.A65
  86.     .LIST
  87. ; the following equate is already defined in DRVREQUS.A65:
  88. ; the one here has been changed to comment to avoid multiple definition:
  89. ;ABOOTSLOT: .EQU    CP65+94        ;ADDRESS OF THE BOOTSLOT VARIABLE
  90.  
  91. ;
  92. ;EQUATES
  93. RWTSENTER: .EQU    0BD00H    ;RWTS ENTRY POINT UNDER APPLEDOS
  94. INIT    .EQU    0    ;INIT COMMAND
  95. READ    .EQU    1    ;READ COMMAND
  96. WRITE    .EQU    2    ;WRITE COMMAND
  97. FORMAT    .EQU    4    ;FORMAT COMMAND
  98.  
  99. APLFDSK .EQU    2    ;CPM DRIVE NUMBER OF APPLES FIRST DISK
  100. ; this line was formerly APLFDSK .EQU 0 and worked for drives A: & B:
  101. ; changing to 2 gives drives C: & D: ---this change may alternatively
  102. ; be made in the PCPI 'INSTALL' program by changing the device number. SMB.
  103.     
  104. ;HEADER
  105. BEGDRVR:
  106.     .WORD    0        ;LOAD ADDRESS (0=RELOCATE)
  107.     .WORD    ((ENDRVR-BEGDRVR)+0FFH) AND 0FF00H    ;LENGTH
  108.     .BYTE    4        ;LENGTH OF PAGE 0 DATA
  109.     .BYTE    0        ;TAG FOR FUTURE VERSIONS    
  110. FDISK:    .WORD    APLFDSK        ;FIRST DISK
  111. MDISK:    .WORD    6        ;MAXIMUM NUMBER OF DRIVES
  112.     .WORD    IAPL16
  113.     .WORD    RAPL16
  114.     .WORD    WAPL16
  115.     .WORD    OAPL16
  116.     .WORD    PAPL16        ;POLL ROUTINE
  117.     .WORD    5        ;VERSION NUMBER
  118. NAME:    .BYTE    15,"APL 16*40 FLPPY" ;NAME (15 BYTES + 1 BYTE FOR LENGTH)
  119. ;    old name used to be APL 16*35 FLPPY.
  120. ;
  121. ;
  122. ; all 'ALLOCATION VECTOR SIZE' values in the next table were .WORD 16
  123. ; they have been changed to 19 to reflect larger size on 40 track drives.
  124.     ;BUFFER SIZE, CHECK SIZE AND ALLOCATION SIZE OF EACH DRIVE DEFINED
  125.     .WORD    256        ;HOST BUFFER SIZE
  126.     .WORD    12        ;CHECK VECTOR SIZE
  127.     .WORD    19        ;ALLOCATION VECTOR SIZE
  128.     .WORD    256        ;HOST BUFFER SIZE
  129.     .WORD    12        ;CHECK VECTOR SIZE
  130.     .WORD    19        ;ALLOCATION VECTOR SIZE
  131.     .WORD    256        ;HOST BUFFER SIZE
  132.     .WORD    12        ;CHECK VECTOR SIZE
  133.     .WORD    19        ;ALLOCATION VECTOR SIZE
  134.     .WORD    256        ;HOST BUFFER SIZE
  135.     .WORD    12        ;CHECK VECTOR SIZE
  136.     .WORD    19        ;ALLOCATION VECTOR SIZE
  137.     .WORD    256        ;HOST BUFFER SIZE
  138.     .WORD    12        ;CHECK VECTOR SIZE
  139.     .WORD    19        ;ALLOCATION VECTOR SIZE
  140.     .WORD    256        ;HOST BUFFER SIZE
  141.     .WORD    12        ;CHECK VECTOR SIZE
  142.     .WORD    19        ;ALLOCATION VECTOR SIZE
  143.  
  144. ;ARRAY OF SLOT NUMBERS TO BE INDEXED BY LOGICAL DRIVE
  145. SLOTNUM:
  146.     .BYTE 060H,060H
  147.     .BYTE 050H,050H
  148.     .BYTE 040H,040H
  149. ;    below are the values for PCPI version 2.0.  Changed back to
  150. ;    actual slot numbers, above, to be compatible with PCPI v.1.6.  S.B.
  151. ;
  152. ;    .BYTE    0,0    ;FIRST PAIR, SET TO 0 IF DYNAMIC
  153. ;    .BYTE    0,0    ;SECOND PAIR
  154. ;    .BYTE    0,0    ;THIRD PAIR
  155. ;
  156. PARMS:
  157.     ;HOST PARAMETERS FIRST
  158.     .WORD    256        ;BYTES PER SECTOR
  159.     .WORD    32        ;CPM RECORDS PER TRACK
  160.     .BYTE    2        ;CPM RECORDS PER HOST BLOCK
  161.     .BYTE    8        ;CPM RECORDS PER ALLOCATION BLOCK
  162.     .BYTE    1        ;SECTOR MASK
  163.     .BYTE    1        ;SECTOR SHIFT COUNT
  164.  
  165.     ;DISK PARAMETER BLOCK
  166.     .WORD    32        ;SECTORS PER TRACK
  167.     .BYTE    3        ;BLOCK SHIFT FACTOR
  168.     .BYTE    7        ;BLOCK MASK
  169.     .BYTE    0        ;EXTENT MASK
  170.     .WORD    147        ;NUMBER OF BLOCKS ON DISK - 1
  171. ;    was .WORD 127 for a 35 track drive.  Changed to 147 for 40 tracks.
  172.     .WORD    47        ;NUMBER OF DIRECTORY ENTRIES - 1
  173.     .BYTE    192        ;ALLOC0 (MASKS)
  174.     .BYTE    0        ;ALLOC1
  175.     .WORD    12        ;CHECK MASKS
  176.     .WORD    3        ;OFFSET TO DIRECTORY TRACK
  177.  
  178. SZPARMS: .EQU    $-PARMS
  179.  
  180.  
  181. ;*******************************
  182. ;ROUTINES: IAP16,RAP16,WAP16,OAP16
  183. ;PURP:    HANDLE THE 4 ENTRY POINTS
  184. ;ENTRY:    A,Y = ADDRESS OF PARAMETERS
  185. ;EXIT:    IF NO ERRORS THEN
  186. ;      A = 0
  187. ;    ELSE
  188. ;      A <> 0
  189. ;USED:    A,F
  190. ;******************************
  191.  
  192.     ;INITIALIZE
  193. IAPL16:
  194.     ;IF SLOT ARRAY[0] = 0 THEN
  195.     ; DYNAMICLY SET UP THE SLOT ARRAY USING THE BOOT SLOT VALUE
  196.     LDA    SLOTNUM
  197.     BNE    $1        ;BIF NOT ZERO
  198.  
  199.     ;DYNAMICALLY SET UP SLOTNUM
  200.     LDA    ABOOTSLOT    ;GET THE BOOT SLOT
  201.     STA    SLOTNUM        ;THE FIRST 2 = BOOT SLOT
  202.     STA    SLOTNUM+1    
  203.     LDY    #2        ;START AT THE SECOND PAIR
  204. $LP:
  205.     SEC
  206.     SBC    #10H        ;DECREMENT TO THE PREVIOUS SLOT
  207.     CMP    #40H        ;IF LESS THAN SLOT 4 THEN CHANGE TO SLOT 6
  208.     BCS    $0        ; BIF >= SLOT 4
  209.     LDA    #60H        ; ELSE CHANGE TO SLOT 6
  210. $0:    STA    SLOTNUM,Y
  211.     INY
  212.     STA    SLOTNUM,Y
  213.     INY
  214.     CPY    #6
  215.     BNE    $LP        ;CONTINUE UNTIL ALL SLOTS ARE DONE
  216.  
  217. $1:
  218.     LDX    #INIT
  219.     JMP    APLF16
  220.  
  221.     ;READ A SECTOR
  222. RAPL16:
  223.     LDX    #READ
  224.     JMP    APLF16
  225.  
  226.     ;WRITE A SECTOR
  227. WAPL16:
  228.     LDX    #WRITE
  229.     JMP    APLF16
  230.  
  231.     ;OTHER COMMANDS
  232. OAPL16:
  233.     CMP    #SNDPRMCMD    ;IS THIS THE SEND PARAMETERS COMMAND
  234.     BNE    CHKFRMT
  235.  
  236.     ;SEND THE HOST AND DISK PARAMETERS
  237.     JSR    RD1Z80BYTE    ;GET THE DRIVER NUMBER
  238.     LDY    #0
  239.     STY    IDX
  240. $0:
  241.     LDA    PARMS,Y
  242.     JSR    WR1Z80BYTE    ;SEND THE NEXT BYTE
  243.     INC    IDX        ;INCREMENT TO NEXT BYTE
  244.     LDY    IDX
  245.     CPY    #SZPARMS    ;ARE WE DONE ?
  246.     BNE    $0        ;BIF NOT DONE
  247.     LDA    #0        ;INDICATE NO ERRORS
  248.     RTS
  249.  
  250.     ;CHECK FOR FORMAT COMMAND    
  251. CHKFRMT:
  252.     CMP    #FRMTCMD    ;FORMAT
  253.     BNE    CHKNAME        ;ERROR EXIT
  254.     JSR    RD1Z80BYTE    ;GET DRIVE NUMBER AND DENSITY
  255.     TAY
  256.     AND    #0FH        ;ISOLATE THE DRIVE
  257.     STA    CURDSK
  258.     TYA
  259.     LSR    A
  260.     LSR    A
  261.     LSR    A
  262.     LSR    A
  263.     STA    DENSITY        ;SAVE DENSITY
  264.     LDA    AFRMTPARMS+1    ;GET ADDRESS OF PARAMETERS FOR FORMAT
  265.     LDY    AFRMTPARMS
  266. ; added code here to do 40-track patch to RWTS
  267. ; this code patches $28 to location $BEFE in DOS 3.3 before 
  268. ; calling RWTS for a FORMAT command.
  269. PATCH1  .EQU      BEFEH
  270.     PHA
  271.     LDA    #028H
  272.     STA    PATCH1
  273.     PLA
  274. ; end of first part of added code
  275.     LDX    #FORMAT
  276.     JSR     APLF16
  277. ; this used to be a jump APLF16 but I changed it to a call in order to
  278. ; undo the patch on the way out:
  279.     PHA
  280.     LDA    #023
  281.     STA    PATCH1
  282.     PLA
  283.     RTS
  284. ; end of added code
  285.  
  286. ;OLD LINE:    JMP    APLF16        ;DO FORMAT
  287.  
  288.     ;CHECK FOR SEND NAME COMMAND
  289. CHKNAME:
  290.     CMP    #SNDNAMECMD    ;SEND NAME COMMAND
  291.     BNE    ERRXIT
  292.  
  293.     LDA    NAME        ;GET LENGTH
  294.     STA    CNT        ;SAVE AS COUNT
  295.     JSR    WR1Z80BYTE    ;SEND IT TO HOST
  296.     LDA    #1
  297.     STA    IDX
  298.     LDA    CNT
  299.     BNE    $LP    
  300.     CLC
  301.     LDA    #0        ;NO ERRORS
  302.     RTS
  303.  
  304. $LP:    LDX    IDX
  305.     LDA    NAME,X        ;GET NEXT CHARACTER
  306.     JSR    WR1Z80BYTE
  307.     INC    IDX
  308.     DEC    CNT
  309.     BNE    $LP        ;CONTINUE UNTIL ALL BYTES ARE SENT
  310.     LDA    #0        ;RETURN WITH NO ERRORS
  311.     RTS
  312.  
  313. ERRXIT:    LDA    #0FFH        ;UNKNOWN OTHER COMMAND
  314.     
  315. PAPL16:                ;NO POLLING
  316.     RTS
  317.  
  318.  
  319. ;********************************
  320. ;ROUTINE: APLF16
  321. ;PURP:    PERFORM AN APPLE 16 SECTOR CALL
  322. ;ENTRY:    A = HIGH BYTE OF PARAMETERS
  323. ;    Y = LOW BYTE OF PARAMETERS
  324. ;EXIT:    IF NO ERRORS THEN
  325. ;      A = 0
  326. ;    ELSE
  327. ;      A = 1
  328. ;USED:    A,F
  329. ;******************************
  330.  
  331. APLF16:
  332.     STX    FUNCTION
  333.     STA    PAGE0W0+1        ;SAVE POINTER TO PARAMETERS
  334.     STY    PAGE0W0
  335.     LDY    #OCURDSK
  336.     LDA    (PAGE0W0),Y
  337.     SEC
  338.     SBC    FDISK        ;NORMALIZE TO 0
  339.     TAY
  340.     LDA    SLOTNUM,Y    ;SLOTNUM[DRIVE NUMBER]
  341.     STA    IBSLOT
  342.     TYA            ;GET NORMALIZED DRIVE NUMBER BACK
  343.     AND    #1        ;USE BIT 0 AS DRIVE NUMBER
  344.     STA    IBDRVN
  345.     INC    IBDRVN        ;INCREMENT TO 1 OR 2
  346.  
  347.     ;CHECK IF THE CARD IS THERE
  348.     LDA    0CFFFH        ;TRUN OFF ALL ROMS
  349.     LDA    IBSLOT        ;FORM CN00 ADDRESS IN PAGE0W1
  350.     LSR    A
  351.     LSR    A
  352.     LSR    A
  353.     LSR    A
  354.     ORA    #0C0H
  355.     STA    PAGE0W1+1
  356.     LDA    #0
  357.     STA    PAGE0W1
  358.  
  359.     ;CHECK BYTES 5 AND 7 FOR 03,3C ERROR EXIT IF NOT THERE
  360.     LDY    #5
  361.     LDA    (PAGE0W1),Y    ;GET ID BYTE
  362.     CMP    #03H
  363.     BNE    ERROR        ;BIF BYTE 5 IS NOT 03H
  364.     LDY    #7
  365.     LDA    (PAGE0W1),Y
  366.     CMP    #03CH
  367.     BNE    ERROR        ;BIF BYTE 7 IS NOT 03CH
  368.  
  369.     LDY    #OCURTRK
  370.     LDA    (PAGE0W0),Y
  371.     STA    IBTRK        ;SET TRACK
  372.     LDY    #OCURSEC
  373.     LDA    (PAGE0W0),Y    ;GET REQUESTED SECOTOR
  374.     TAY
  375.     LDA    SECTRAN,Y    ;TRANSLATE THE SECTOR
  376.     STA    IBSEC        ;STORE IT
  377.     LDY    #OCURDMA
  378.     LDA    (PAGE0W0),Y    ;GET LOW BYTE OF DMA ADDRESS
  379.     STA    IBBUFP
  380.     INY
  381.     LDA    (PAGE0W0),Y    ;GET HIGH BYTE OF DMA ADDRESS
  382.     STA    IBBUFP+1
  383.     LDA    FUNCTION    ;GET FUCNTION
  384.     BEQ    NOERROR        ;EXIT WITH NO ERRORS (A=0) IF COMMAND IS INIT
  385.     STA    IBCMD        ;SET COMMAND
  386.  
  387.     ;CHANGE MOTOR TIME COUNT 2 TO WAIT LESS IF THIS IS A READ
  388.     LDY    #0D8H        ;ASSUME IT'S NOT A READ
  389.     CMP    #READ        ;IS THE COMMAND A READ?
  390.     BNE    $1        ; BIF NOT
  391.     LDY    #0E8H        ;ELSE CHANGE IT TO A SMALLER WAIT TIME
  392. $1:    STY    MONTC2        ;STORE VALUE
  393.  
  394.     LDA    ADRIOB+1
  395.     LDY    ADRIOB
  396.     JSR    RWTSENTER
  397.     BCC    NOERROR        ;BIF NO ERRORS
  398. ERROR:    LDA    #1        ;ELSE ERROR
  399.     RTS
  400.  
  401. NOERROR:
  402.     ;CHANGE PREVIOUS SLOT AND DRIVE NUMBER
  403.     LDA    IBSLOT
  404.     STA    IBPSN        ;SET PREVIOUS SLOT
  405.     LDA    IBDRVN
  406.     STA    IBPDN        ;SET PREVIOUS DRIVE
  407.  
  408.     ;RETURN WITH NO ERRORS
  409.     LDA    #0
  410.     RTS
  411.  
  412.  
  413. FUNCTION: .BYTE    0        ;FUNCTION NUMBER
  414. IDX:    .BYTE    0        ;TEMPORARY
  415. CNT:    .BYTE    0        ;TEMPORARY
  416. DENSITY: .BYTE    0        ;TEMPROARY
  417. ADRIOB:    .WORD    IOB        ;ADDRESS OF IOB
  418. IOB:
  419. IBTYPE:    .BYTE    1    ;TYPE OF IOB
  420. IBSLOT:    .BYTE    060H    ;SLOT NUMBER * 16
  421. IBDRVN:    .BYTE    0    ;DRIVE NUMBER
  422. IBVOL:    .BYTE    0    ;VOLUME NUMBER
  423. IBTRK:    .BYTE    0    ;TRACK NUMBER
  424. IBSEC:    .BYTE    0    ;SECTOR NUMBER
  425. IBDCTP:    .WORD    DCTB    ;ADDRESS OF DEVICE CHARACTERICS TABLE
  426. IBBUFP:    .WORD    0    ;BUFFER POINTER
  427. IBFREE:    .WORD    0    ;UNUSED
  428. IBCMD:    .BYTE    0    ;COMMAND 0=NUL, 1=READ, 2=WRITE, 3=FORMAT
  429. IBSTAT:    .BYTE    0    ;ERROR STATUS 0=OK, 10H=WRITE PROTECTED
  430.             ; 20H=BAD VOLUME, 40H=DRIVE ERROR, 80H=READ ERROR
  431. IBSMOD:    .BYTE    0    ;ACTUAL VOLUME NUMBER
  432. IBPSN:    .BYTE    060H    ;PREVIOUS SLOT NUMBER * 16
  433. IBPDN:    .BYTE    1    ;PREVIOUS DISK NUMBER
  434.  
  435. DCTB:    .BYTE    0    ;DEVICE TYPE CODE
  436. PPTC:    .BYTE    1    ;
  437. MONTC:    .BYTE    0EFH    ;MOTOR ON TIME COUNTER BYTE 1
  438. MONTC2:    .BYTE    0D8H    ;MOTOR ON TIME COUNTER BYTE 2
  439.  
  440. SECTRAN:
  441.     .BYTE    0,6,12,3,9,15,14,5,11,2,8,7,13,4,10,1
  442. AFRMTPARMS:
  443.     .WORD    FRMTPARMS
  444. FRMTPARMS:
  445. CURDSK:    .BYTE    0
  446. CURTRK:    .WORD    0
  447. CURSEC:    .WORD    0
  448. CURDMA:    .WORD    0
  449.  
  450. ENDRVR:
  451.     .END
  452.