home *** CD-ROM | disk | FTP | other *** search
/ ftp.barnyard.co.uk / 2015.02.ftp.barnyard.co.uk.tar / ftp.barnyard.co.uk / cpm / walnut-creek-CDROM / BEEHIVE / UTILITYS / AUXDISK.ARC / AUXDISK.A65 next >
Text File  |  1990-07-21  |  10KB  |  481 lines

  1.     .WIDTH    96
  2. ;******************************
  3. ;FILE:     AUXDISK.A65
  4. ;PURP:    USE THE EXTRA BANKS OF MEMORY (AUX + LC) ON
  5. ;    128K APPLES AS A RAM DISK
  6. ;
  7. ;WRITTEN BY:    K. C. M. LAU.
  8. ;        ALL RIGHTS RESERVED.
  9. ;        RELEASED INTO THE PUBLIC DOMAIN
  10. ;        FOR NON-COMMERCIAL USE ONLY.
  11. ;REVISED:    DEC 87
  12. ;ASSEMBLER:    PCPI STARCARD OEM PACKAGE'S - A65.COM
  13. ;*******************************
  14.  
  15. FALSE    .EQU    0
  16. TRUE    .EQU    NOT FALSE
  17.  
  18. BASEP0:    .QUERY    "ENTER BASE OF PAGE 0: "
  19. PAGE0W0: .EQU    BASEP0        ;WORD 0 OF PAGE 0
  20. PAGE0W1: .EQU    BASEP0+2    ;NOT USED
  21. LENP0:    .EQU    4        ;4 BYTES OF PAGE 0
  22.  
  23. ;SYSTEM EQUATES
  24. OPG0BASE    .EQU    80H
  25. SYSP1        .EQU    OPG0BASE+2
  26. CP65:        .EQU    0B000H
  27. RD1Z80BYTE:    .EQU    CP65+9
  28. WR1Z80BYTE:    .EQU    CP65+12
  29. OCURDSK:    .EQU    0
  30. OCURTRK:    .EQU    1
  31. OCURSEC:    .EQU    3
  32. OCURDMA:    .EQU    5
  33. SNDPRMCMD:    .EQU    00
  34. FRMTCMD:    .EQU    01
  35. SNDNAMECMD:    .EQU    15
  36.  
  37. ;EQUATES
  38. FDSK    .EQU    12    ;DEFAULT FIRST DISK IS M
  39.  
  40. ;HEADER
  41. BEGDRVR:
  42.     .WORD    0        ;LOAD ADDRESS (0=RELOCATE)
  43.     .WORD    ((ENDDRVR-BEGDRVR)+0FFH) AND 0FF00H    ;LENGTH
  44.     .BYTE    LENP0        ;LENGTH OF PAGE 0 DATA
  45.     .BYTE    0        ;TAG FIELD (FOR FUTURE MUST BE ZERO)
  46. FDISK:    .WORD    FDSK        ;FIRST DISK
  47. MDISK:    .WORD    1        ;MAXIMUM NUMBER OF DRIVES
  48.     .WORD    INIT        ;INITIALIZE
  49.     .WORD    READ        ;READ A SECTOR
  50.     .WORD    WRITE        ;WRITE A SECTOR
  51.     .WORD    OTHER        ;OTHER
  52.     .WORD    POLL        ;POLL
  53.     .WORD    1        ;VERSION NUMBER
  54. NAME:    .BYTE    15,"AUX RAM DISK   " ;NAME (MUST BE 15 BYTES PLUS THE
  55.                     ; LENGTH BYTE)
  56.  
  57.     ;BUFFER SIZE, CHECK SIZE AND ALLOCATION SIZE OF EACH DRIVE DEFINED
  58.     ;AND MUST FOLLOW THE NAME. IT IS USED BY INSTALL TO RELOCATE CP/M
  59.     ; THIS DATA IS DERIVED FROM USING DISKDATA.ASM.
  60.     ; IT IS THE INFORMATION AT THE END OF THE DISKDATA.ASM FILE
  61.     ;
  62.     ;THESE ARE FOR RAM DISK
  63.     .WORD    256        ;HOST BUFFER SIZE
  64.     .WORD    0        ;CHECK VECTOR SIZE
  65.     .WORD    10        ;ALLOCATION VECTOR SIZE (ALLOWS FOR 80K)
  66.  
  67. ;THESE PARAMETERS ARE DETERMINED BY USING THE DISKDATA.ASM FILE. REFER TO THE
  68. ;CP/M ALTERATION GUIDE AND THE EXAMPLES ON HOW TO SETUP THE MACROS IN
  69. ;DISKDATA.ASM.
  70. PARMS:
  71.     ;HOST PARAMETERS FIRST
  72.     ;MHSTPARM    1024,256,1
  73.     .WORD    256        ;BYTES PER SECTOR
  74.     .WORD    2        ;CPM RECORDS PER TRACK
  75.     .BYTE    2        ;CPM RECORDS PER HOST BLOCK
  76.     .BYTE    8        ;CPM RECORDS PER ALLOCATION BLOCK
  77.     .BYTE    1        ;SECTOR MASK
  78.     .BYTE    1        ;SECTOR SHIFT COUNT
  79.  
  80.     ;DISK PARAMETER BLOCK
  81.     ;DISKDEF    0,0,0,0,1024,128,48,48,0
  82.     .WORD    2        ;SECTORS PER TRACK
  83.     .BYTE    3        ;BLOCK SHIFT FACTOR
  84.     .BYTE    7        ;BLOCK MASK
  85.     .BYTE    0        ;EXTENT MASK
  86.     .WORD    77        ;DISK SIZE IN BLOCKS - 1
  87.     .WORD    47        ;NUMBER OF DIRECTORY ENTRIES - 1
  88.     .BYTE    192        ;ALLOC0 (MASKS)
  89.     .BYTE    0        ;ALLOC1
  90.     .WORD    0        ;CHECK MASKS
  91.     .WORD    0        ;OFFSET TO DIRECTORY TRACK
  92. SZPARMS: .EQU    $-PARMS
  93.  
  94.  
  95. ;******************************
  96. ;ROUTINE: INIT
  97. ;PURP:    INITIALIZE ENTRY POINT
  98. ;ENTRY: NONE
  99. ;EXIT:    IF NO ERRORS THEN
  100. ;      A = 0
  101. ;    ELSE
  102. ;      A = 1
  103. ;USED:    ALL
  104. ;******************************
  105. SIGNON    .BYTE    "Auxillary memory ramdisk M: installed",13,10,0
  106.  
  107.     ;INITIIALIZE
  108. INIT:
  109.     BIT    0C062H        ;CHECK FOR CLOSED APPLE
  110.     BMI    INIT1        ;--> FORMAT
  111.     LDA    0C018H        ;SAVE AND SET 80STORE
  112.     PHP
  113.     STA    0C001H
  114.     BIT    0C055H        ;PAGE 2 ON
  115.     LDA    7FFH        ;FETCH FLAG BYTE
  116.     BIT    0C054H        ;PAGE 2 OFF
  117.     PLP            ;RESTORE 80STORE
  118.     BMI    $ESON
  119.     STA    0C000H
  120. $ESON:
  121.     CMP    #0E5H        ;CHECK IF FORMATTED YET
  122.     BEQ    INIT2
  123. INIT1    JSR    FORMAT
  124. INIT2    JSR    PRSIGN
  125.     LDA    #0
  126.     RTS            ;RETURN WITH A = 0
  127.  
  128. ;Patch VDOUT vector (video out)
  129. INITVD    LDY    #84H+(8*3)    ;find vector to video out
  130.     LDA    (SYSP1),Y
  131.     STA    VDOUT+1
  132.     INY
  133.     LDA    (SYSP1),Y
  134.     STA    VDOUT+2
  135.     RTS
  136.  
  137. VDOUT    JMP    0FF69H        ;to be patched (video out)
  138.  
  139. ;Print signon message
  140. PRSIGN    JSR    INITVD
  141.     LDX    #0        ;reset string pointer
  142.     STX    MESIND
  143.     JMP    PRSIGN2
  144.  
  145. PRSIGN1    JSR    VDOUT
  146.     INC    MESIND
  147. PRSIGN2    LDX    MESIND
  148.     LDA    SIGNON,X
  149.     BNE    PRSIGN1        ;print until 0
  150.     RTS
  151.  
  152. MESIND    .BYTE    0
  153.  
  154. ;******************************
  155. ;ROUTINE: READ
  156. ;PURP:    READ A SECTOR
  157. ;ENTRY: A = HIGH BYTE OF PARAMETERS
  158. ;    Y = LOW BYTE OF PARAMETERS
  159. ;      PARM[OCURDSK] = DRIVE
  160. ;      PARM[OCURTRK] = TRACK LOW BYTE
  161. ;      PARM[OCURTRK+1] = TRACK HIGH BYTE
  162. ;      PARM[OCURSEC] = SECTOR LOW BYTE
  163. ;      PARM[OCURSEC+1] = SECTOR HIGH BYTE (CURRENTLY 0)
  164. ;      PARM[OCURDMA] = BUFFER ADDRESS LOW BYTE
  165. ;      PARM[OCURDMA+1] = BUFFER ADDRESS HIGH BYTE
  166. ;EXIT:    IF NO ERRORS THEN
  167. ;      A = 0
  168. ;    ELSE
  169. ;      A = ERROR NUMBER
  170. ;USED:    ALL
  171. ;******************************
  172.  
  173.  
  174. READ:
  175.     STA    PAGE0W0+1    ;SAVE PTR TO PARMS
  176.     STY    PAGE0W0
  177.     PHP            ;SAVE AND DISABLE INTR
  178.     SEI
  179.     LDY    #OCURTRK+1
  180.     LDA    (PAGE0W0),Y
  181.     PHP
  182.     DEY
  183.     LDA    (PAGE0W0),Y
  184.     CLC            ;SKIP FIRST 8 PAGES
  185.     ADC    #8
  186.     BCS    READLC
  187.     PLP
  188.     BNE    READLC1
  189.     CMP    #20H        ;ROTATE PAGES TO LEAVE HGRX UNUSED TILL LATE
  190.     BCC    READ1
  191.     ADC    #20H-1
  192.     BCC    READ1
  193.     ADC    #20H-1
  194. READ1    CMP    #0C0H        ;CHECK FOR LC ACCESS
  195.     BCS    READALC
  196.     JSR    PREPRD        ;SET PARMS FOR MOVE
  197.  
  198.     CLC            ;AUX --> MAIN
  199.  
  200. AMVCOM    BIT    0C018H        ;SAVE AND CLEAR 80STORE
  201.     PHP
  202.     STA    0C000H
  203.     JSR    0C311H        ;AUXMOVE
  204. R80IQ    PLP            ;RESTORE 80STORE (ASSUME OFF)
  205.     BPL    RIQ
  206.     STA    0C001H
  207. RIQ    PLP            ;RESTORE INTR
  208.     LDA    #0        ;NO ERROR
  209.     RTS
  210.  
  211.  
  212. READLC    PLP
  213. READLC1    SEC
  214.     SBC    #40H
  215.     JMP    READLC2
  216.  
  217. READALC    LDX    PAGE0W0
  218.     LDY    PAGE0W0+1
  219.     STA    0C009H        ;ALTZP ON
  220.     STX    PAGE0W0
  221.     STY    PAGE0W0+1
  222.  
  223. READLC2    CMP    #0D0H        ;CHECK FOR 2ND BANK
  224.     BCS    READBK2
  225.     ADC    #010H        ;READ FROM 1ST BANK
  226.     BIT    0C088H
  227.     JMP    READLC3
  228.  
  229. READBK2    BIT    0C080H        ;READ 2ND BANK
  230. READLC3    JSR    PREPRD
  231. MVCOM    JSR    MOVE        ;BLOCK MOVE
  232.     STA    0C008H        ;ALTZP OFF
  233.     BIT    0C08AH        ;ENABLE ROM
  234.     JMP    RIQ
  235.  
  236. PREPRD    STA    3DH        ;SRC ST
  237.     STA    3FH        ;SRC END
  238.     LDA    #0
  239.     STA    3CH
  240.     LDA    #0FFH
  241.     STA    3EH
  242.     LDY    #OCURDMA    ;DEST ST
  243.     LDA    (PAGE0W0),Y
  244.     STA    42H
  245.     INY
  246.     LDA    (PAGE0W0),Y
  247.     STA    43H
  248.     RTS
  249.  
  250. MOVE:    LDY    #0        ;BLOCK MOVE (COPY OF ROM 0FE2CH)
  251. MOVE1    LDA    (03CH),Y
  252.     STA    (042H),Y
  253. MOVE2    INC    042H
  254.     BNE    MOVE3
  255.     INC    043H
  256. MOVE3    LDA    03CH
  257.     CMP    03EH
  258.     LDA    03DH
  259.     SBC    03FH
  260.     INC    03CH
  261.     BNE    MOVE4
  262.     INC    03DH
  263. MOVE4    BCC    MOVE1
  264.     RTS
  265.  
  266. ;******************************
  267. ;ROUTINE: WRITE
  268. ;PURP:    WRITE A SECTOR
  269. ;ENTRY: A = HIGH BYTE OF PARAMETERS
  270. ;    Y = LOW BYTE OF PARAMETERS
  271. ;      PARM[OCURDSK] = DRIVE
  272. ;      PARM[OCURTRK] = TRACK LOW BYTE
  273. ;      PARM[OCURTRK+1] = TRACK HIGH BYTE
  274. ;      PARM[OCURSEC] = SECTOR LOW BYTE
  275. ;      PARM[OCURSEC+1] = SECTOR HIGH BYTE (CURRENTLY 0)
  276. ;      PARM[OCURDMA] = BUFFER ADDRESS LOW BYTE
  277. ;      PARM[OCURDMA+1] = BUFFER ADDRESS HIGH BYTE
  278. ;EXIT:    IF NO ERRORS THEN
  279. ;      A = 0
  280. ;    ELSE
  281. ;      A = ERROR NUMBER
  282. ;USED:    ALL
  283. ;******************************
  284.  
  285. WRITE:
  286.     STA    PAGE0W0+1    ;SAVE PTR TO PARMS
  287.     STY    PAGE0W0
  288.     PHP            ;SAVE AND DISABLE INTR
  289.     SEI
  290.     LDY    #OCURTRK+1    ;FETCH TRACK NO
  291.     LDA    (PAGE0W0),Y
  292.     PHP
  293.     DEY
  294.     LDA    (PAGE0W0),Y
  295.     CLC
  296.     ADC    #8        ;SKIP FIRST 8 PAGES
  297.     BCS    WRLC
  298.     PLP
  299.     BNE    WRLC1
  300.     CMP    #20H        ;ROTATE PAGES TO LEAVE HGRX UNUSED TILL LATE
  301.     BCC    WRITE1
  302.     ADC    #20H-1
  303.     BCC    WRITE1
  304.     ADC    #20H-1
  305. WRITE1    CMP    #0C0H        ;CHECK FOR LC ACCESS
  306.     BCS    WRALC
  307.     JSR    PREPWR
  308.     SEC            ;MAIN --> AUX
  309.     JMP    AMVCOM        ;AUXMOVE
  310.  
  311. WRLC:    PLP
  312. WRLC1:    SEC
  313.     SBC    #040H
  314.     JMP    WRLC2
  315.  
  316. WRALC:    LDX    PAGE0W0
  317.     LDY    PAGE0W0+1
  318.     STA    0C009H        ;ALTZP ON
  319.     STX    PAGE0W0
  320.     STY    PAGE0W0+1
  321.  
  322. WRLC2    CMP    #0D0H        ;CHECK FOR 2ND BANK ACCESS
  323.     BCS    WRBK2
  324.     ADC    #10H        ;WRITE TO 1ST BANK
  325.     BIT    0C089H        ;WRITE TO 1ST BANK
  326.     BIT    0C089H
  327.     JMP    WRLC3
  328.  
  329. WRBK2    BIT    0C081H        ;WRITE TO 2ND BANK
  330.     BIT    0C081H
  331. WRLC3    JSR    PREPWR
  332.     JMP    MVCOM        ;MOVE, ALTZP OFF, EN ROM, A=0, RTS
  333.     
  334. PREPWR:    STA    43H        ;DEST ST
  335.     LDA    #0
  336.     STA    42H
  337.     LDY    #OCURDMA+1    ;SRC ST
  338.     LDA    (PAGE0W0),Y
  339.     STA    3DH
  340.     DEY
  341.     LDA    (PAGE0W0),Y
  342.     STA    3CH
  343.     CLC            ;SRC END = SRC ST + 0FFH
  344.     ADC    #0FFH
  345.     STA    3EH
  346.     LDA    3DH
  347.     ADC    #0
  348.     STA    3FH
  349.     RTS
  350.  
  351.  
  352. ;******************************
  353. ;ROUTINE: OTHER
  354. ;PURP:    OTHER COMMANDS
  355. ;ENTRY: PARAMETERS ARE READ DIRECTLY FROM Z-80
  356. ;EXIT:    IF NO ERRORS THEN
  357. ;      A = 0
  358. ;    ELSE
  359. ;      A = ERROR NUMBER
  360. ;USED:    ALL
  361. ;******************************
  362.  
  363.     ;OTHER COMMANDS
  364.     ; OTHER PARAMETERS ARE DEPENDENT ON WHICH ENTRY IS CALLED
  365. OTHER:
  366.     CMP    #SNDPRMCMD    ;IS THIS THE SEND PARAMETERS COMMAND
  367.     BNE    CHKFRMT        ;BIF NOT SEND PARMATERS
  368.  
  369.     ;SEND THE HOST AND DISK PARAMETERS
  370.     ; ENTRY PARAMETERS:
  371.     ;    THE DRIVE NUMBER (1 BYTE)
  372.     ; EXIT PARAMETERS:
  373.     ;     ERROR CODE (1 BYTE)
  374.     JSR    RD1Z80BYTE    ;GET THE DRIVER NUMBER
  375.     LDY    #0
  376.     STY    IDX
  377. $0:
  378.     LDA    PARMS,Y
  379.     JSR    WR1Z80BYTE    ;SEND THE NEXT BYTE
  380.     INC    IDX        ;INCREMENT TO NEXT BYTE
  381.     LDY    IDX
  382.     CPY    #SZPARMS    ;ARE WE DONE ?
  383.     BNE    $0        ;BIF NOT DONE
  384.     LDA    #0        ;INDICATE NO ERRORS
  385.     RTS
  386.  
  387.  
  388. CHKFRMT:
  389.     CMP    #FRMTCMD    ;FORMAT COMMAND ?
  390.     BNE    CHKNAME        ;BIF NOT
  391.  
  392.     ;FORMAT A DRIVE
  393.     ; ENTRY PARAMETERS:
  394.     ;    THE DRIVE NUMBER (1 BYTE)
  395.     ; EXIT PARAMETERS:
  396.     ;     ERROR CODE (1 BYTE)
  397.     JSR    RD1Z80BYTE    ;GET DRIVE
  398.  
  399. FORMAT:
  400.     PHP            ;SAVE AND DISABLE INTR
  401.     SEI
  402.     LDA    0C018H        ;SAVE AND CLEAR 80STORE
  403.     PHP
  404.     STA    0C000H
  405.     LDX    #00H        ;INIT ST
  406.     STX    PATCH+1
  407.     DEX            ;START AT 07FFH TO SET INIT FLAG
  408.     LDA    #07H
  409.     STA    PATCH+2
  410.     LDA    #0E5H
  411. FORM1    STA    0C005H        ;RAMWRT ON
  412. PATCH:
  413.     STA    0800H,X        ;ZERO DIR (0800H - 0DFFH)
  414.     STA    0C004H        ;RAMWRT OFF
  415.     INX            ;INCR PTR
  416.     BNE    FORM1
  417.     INC    PATCH+2
  418.     LDY    PATCH+2        ;CHECK END
  419.     CPY    #0EH
  420.     BCC    FORM1
  421.     JMP    R80IQ        ;REST 80STORE+INTR, A=0, RTS
  422.  
  423.     ;CHECK FOR SEND NAME COMMAND
  424. CHKNAME:
  425.     CMP    #SNDNAMECMD    ;SEND NAME COMMAND ?
  426.     BNE    CHKOTHR    ; BIF NOT
  427.  
  428.     ; ENTRY PARAMETERS:
  429.     ;    NONE
  430.     ; EXIT PARAMETERS:
  431.     ;    SEND THE LENGTH OF THE NAME (1 BYTE)
  432.     ;    FOLLOWED BYTE THE NAME (LENGTH NUMBER OF BYTES)
  433.     ;     ERROR CODE (1 BYTE)
  434.     LDA    NAME        ;GET LENGTH
  435.     STA    CNT        ;SAVE AS COUNT
  436.     JSR    WR1Z80BYTE    ;SEND IT TO HOST
  437.     LDA    #1
  438.     STA    IDX
  439.  
  440. $LP:    LDX    IDX
  441.     LDA    NAME,X        ;GET NEXT CHARACTER
  442.     JSR    WR1Z80BYTE    ;WRITE THE NEXT CHARACTER
  443.     INC    IDX
  444.     DEC    CNT
  445.     BNE    $LP        ;CONTINUE UNTIL ALL BYTES ARE SENT
  446.     LDA    #0        ;NO ERRORS
  447.     RTS
  448.  
  449. CHKOTHR:
  450.     LDA    #0FFH        ;BAD COMMAND
  451.     RTS
  452.  
  453.  
  454. ;***********************************
  455. ;ROUTINE: POLLENTRY
  456. ;PURP:    HANDLE POLLING, THIS ENTRY POINT
  457. ;    IS CALLED PERIODICALY WHILE THE APPLE IS
  458. ;    WAITING FOR A COMMAND FROM THE Z-80. THIS
  459. ;    CODE SHOULD BE VERY SHORT AS THE Z-80 IS
  460. ;    IGNORED WHILE THIS CODE IS BEING EXECUTED
  461. ;ENTRY:    NONE
  462. ;EXIT:    NONE
  463. ;USED:    ALL
  464. ;***********************************
  465.  
  466. POLL:
  467.     RTS
  468.  
  469. IDX:    .BLOCK    1        ;TEMPORARY
  470. CNT:    .BLOCK    1        ;TEMPORARY
  471.  
  472. ENDDRVR:
  473.  
  474.     .END
  475. *********************************
  476.  
  477. POLL:
  478.     RTS
  479.  
  480. IDX:    .BLOCK    1        ;TEMPORARY
  481. CNT:    .BLOCK    1        ;TEMPOR