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 >
Wrap
Text File
|
1990-07-21
|
10KB
|
481 lines
.WIDTH 96
;******************************
;FILE: AUXDISK.A65
;PURP: USE THE EXTRA BANKS OF MEMORY (AUX + LC) ON
; 128K APPLES AS A RAM DISK
;
;WRITTEN BY: K. C. M. LAU.
; ALL RIGHTS RESERVED.
; RELEASED INTO THE PUBLIC DOMAIN
; FOR NON-COMMERCIAL USE ONLY.
;REVISED: DEC 87
;ASSEMBLER: PCPI STARCARD OEM PACKAGE'S - A65.COM
;*******************************
FALSE .EQU 0
TRUE .EQU NOT FALSE
BASEP0: .QUERY "ENTER BASE OF PAGE 0: "
PAGE0W0: .EQU BASEP0 ;WORD 0 OF PAGE 0
PAGE0W1: .EQU BASEP0+2 ;NOT USED
LENP0: .EQU 4 ;4 BYTES OF PAGE 0
;SYSTEM EQUATES
OPG0BASE .EQU 80H
SYSP1 .EQU OPG0BASE+2
CP65: .EQU 0B000H
RD1Z80BYTE: .EQU CP65+9
WR1Z80BYTE: .EQU CP65+12
OCURDSK: .EQU 0
OCURTRK: .EQU 1
OCURSEC: .EQU 3
OCURDMA: .EQU 5
SNDPRMCMD: .EQU 00
FRMTCMD: .EQU 01
SNDNAMECMD: .EQU 15
;EQUATES
FDSK .EQU 12 ;DEFAULT FIRST DISK IS M
;HEADER
BEGDRVR:
.WORD 0 ;LOAD ADDRESS (0=RELOCATE)
.WORD ((ENDDRVR-BEGDRVR)+0FFH) AND 0FF00H ;LENGTH
.BYTE LENP0 ;LENGTH OF PAGE 0 DATA
.BYTE 0 ;TAG FIELD (FOR FUTURE MUST BE ZERO)
FDISK: .WORD FDSK ;FIRST DISK
MDISK: .WORD 1 ;MAXIMUM NUMBER OF DRIVES
.WORD INIT ;INITIALIZE
.WORD READ ;READ A SECTOR
.WORD WRITE ;WRITE A SECTOR
.WORD OTHER ;OTHER
.WORD POLL ;POLL
.WORD 1 ;VERSION NUMBER
NAME: .BYTE 15,"AUX RAM DISK " ;NAME (MUST BE 15 BYTES PLUS THE
; LENGTH BYTE)
;BUFFER SIZE, CHECK SIZE AND ALLOCATION SIZE OF EACH DRIVE DEFINED
;AND MUST FOLLOW THE NAME. IT IS USED BY INSTALL TO RELOCATE CP/M
; THIS DATA IS DERIVED FROM USING DISKDATA.ASM.
; IT IS THE INFORMATION AT THE END OF THE DISKDATA.ASM FILE
;
;THESE ARE FOR RAM DISK
.WORD 256 ;HOST BUFFER SIZE
.WORD 0 ;CHECK VECTOR SIZE
.WORD 10 ;ALLOCATION VECTOR SIZE (ALLOWS FOR 80K)
;THESE PARAMETERS ARE DETERMINED BY USING THE DISKDATA.ASM FILE. REFER TO THE
;CP/M ALTERATION GUIDE AND THE EXAMPLES ON HOW TO SETUP THE MACROS IN
;DISKDATA.ASM.
PARMS:
;HOST PARAMETERS FIRST
;MHSTPARM 1024,256,1
.WORD 256 ;BYTES PER SECTOR
.WORD 2 ;CPM RECORDS PER TRACK
.BYTE 2 ;CPM RECORDS PER HOST BLOCK
.BYTE 8 ;CPM RECORDS PER ALLOCATION BLOCK
.BYTE 1 ;SECTOR MASK
.BYTE 1 ;SECTOR SHIFT COUNT
;DISK PARAMETER BLOCK
;DISKDEF 0,0,0,0,1024,128,48,48,0
.WORD 2 ;SECTORS PER TRACK
.BYTE 3 ;BLOCK SHIFT FACTOR
.BYTE 7 ;BLOCK MASK
.BYTE 0 ;EXTENT MASK
.WORD 77 ;DISK SIZE IN BLOCKS - 1
.WORD 47 ;NUMBER OF DIRECTORY ENTRIES - 1
.BYTE 192 ;ALLOC0 (MASKS)
.BYTE 0 ;ALLOC1
.WORD 0 ;CHECK MASKS
.WORD 0 ;OFFSET TO DIRECTORY TRACK
SZPARMS: .EQU $-PARMS
;******************************
;ROUTINE: INIT
;PURP: INITIALIZE ENTRY POINT
;ENTRY: NONE
;EXIT: IF NO ERRORS THEN
; A = 0
; ELSE
; A = 1
;USED: ALL
;******************************
SIGNON .BYTE "Auxillary memory ramdisk M: installed",13,10,0
;INITIIALIZE
INIT:
BIT 0C062H ;CHECK FOR CLOSED APPLE
BMI INIT1 ;--> FORMAT
LDA 0C018H ;SAVE AND SET 80STORE
PHP
STA 0C001H
BIT 0C055H ;PAGE 2 ON
LDA 7FFH ;FETCH FLAG BYTE
BIT 0C054H ;PAGE 2 OFF
PLP ;RESTORE 80STORE
BMI $ESON
STA 0C000H
$ESON:
CMP #0E5H ;CHECK IF FORMATTED YET
BEQ INIT2
INIT1 JSR FORMAT
INIT2 JSR PRSIGN
LDA #0
RTS ;RETURN WITH A = 0
;Patch VDOUT vector (video out)
INITVD LDY #84H+(8*3) ;find vector to video out
LDA (SYSP1),Y
STA VDOUT+1
INY
LDA (SYSP1),Y
STA VDOUT+2
RTS
VDOUT JMP 0FF69H ;to be patched (video out)
;Print signon message
PRSIGN JSR INITVD
LDX #0 ;reset string pointer
STX MESIND
JMP PRSIGN2
PRSIGN1 JSR VDOUT
INC MESIND
PRSIGN2 LDX MESIND
LDA SIGNON,X
BNE PRSIGN1 ;print until 0
RTS
MESIND .BYTE 0
;******************************
;ROUTINE: READ
;PURP: READ A SECTOR
;ENTRY: A = HIGH BYTE OF PARAMETERS
; Y = LOW BYTE OF PARAMETERS
; PARM[OCURDSK] = DRIVE
; PARM[OCURTRK] = TRACK LOW BYTE
; PARM[OCURTRK+1] = TRACK HIGH BYTE
; PARM[OCURSEC] = SECTOR LOW BYTE
; PARM[OCURSEC+1] = SECTOR HIGH BYTE (CURRENTLY 0)
; PARM[OCURDMA] = BUFFER ADDRESS LOW BYTE
; PARM[OCURDMA+1] = BUFFER ADDRESS HIGH BYTE
;EXIT: IF NO ERRORS THEN
; A = 0
; ELSE
; A = ERROR NUMBER
;USED: ALL
;******************************
READ:
STA PAGE0W0+1 ;SAVE PTR TO PARMS
STY PAGE0W0
PHP ;SAVE AND DISABLE INTR
SEI
LDY #OCURTRK+1
LDA (PAGE0W0),Y
PHP
DEY
LDA (PAGE0W0),Y
CLC ;SKIP FIRST 8 PAGES
ADC #8
BCS READLC
PLP
BNE READLC1
CMP #20H ;ROTATE PAGES TO LEAVE HGRX UNUSED TILL LATE
BCC READ1
ADC #20H-1
BCC READ1
ADC #20H-1
READ1 CMP #0C0H ;CHECK FOR LC ACCESS
BCS READALC
JSR PREPRD ;SET PARMS FOR MOVE
CLC ;AUX --> MAIN
AMVCOM BIT 0C018H ;SAVE AND CLEAR 80STORE
PHP
STA 0C000H
JSR 0C311H ;AUXMOVE
R80IQ PLP ;RESTORE 80STORE (ASSUME OFF)
BPL RIQ
STA 0C001H
RIQ PLP ;RESTORE INTR
LDA #0 ;NO ERROR
RTS
READLC PLP
READLC1 SEC
SBC #40H
JMP READLC2
READALC LDX PAGE0W0
LDY PAGE0W0+1
STA 0C009H ;ALTZP ON
STX PAGE0W0
STY PAGE0W0+1
READLC2 CMP #0D0H ;CHECK FOR 2ND BANK
BCS READBK2
ADC #010H ;READ FROM 1ST BANK
BIT 0C088H
JMP READLC3
READBK2 BIT 0C080H ;READ 2ND BANK
READLC3 JSR PREPRD
MVCOM JSR MOVE ;BLOCK MOVE
STA 0C008H ;ALTZP OFF
BIT 0C08AH ;ENABLE ROM
JMP RIQ
PREPRD STA 3DH ;SRC ST
STA 3FH ;SRC END
LDA #0
STA 3CH
LDA #0FFH
STA 3EH
LDY #OCURDMA ;DEST ST
LDA (PAGE0W0),Y
STA 42H
INY
LDA (PAGE0W0),Y
STA 43H
RTS
MOVE: LDY #0 ;BLOCK MOVE (COPY OF ROM 0FE2CH)
MOVE1 LDA (03CH),Y
STA (042H),Y
MOVE2 INC 042H
BNE MOVE3
INC 043H
MOVE3 LDA 03CH
CMP 03EH
LDA 03DH
SBC 03FH
INC 03CH
BNE MOVE4
INC 03DH
MOVE4 BCC MOVE1
RTS
;******************************
;ROUTINE: WRITE
;PURP: WRITE A SECTOR
;ENTRY: A = HIGH BYTE OF PARAMETERS
; Y = LOW BYTE OF PARAMETERS
; PARM[OCURDSK] = DRIVE
; PARM[OCURTRK] = TRACK LOW BYTE
; PARM[OCURTRK+1] = TRACK HIGH BYTE
; PARM[OCURSEC] = SECTOR LOW BYTE
; PARM[OCURSEC+1] = SECTOR HIGH BYTE (CURRENTLY 0)
; PARM[OCURDMA] = BUFFER ADDRESS LOW BYTE
; PARM[OCURDMA+1] = BUFFER ADDRESS HIGH BYTE
;EXIT: IF NO ERRORS THEN
; A = 0
; ELSE
; A = ERROR NUMBER
;USED: ALL
;******************************
WRITE:
STA PAGE0W0+1 ;SAVE PTR TO PARMS
STY PAGE0W0
PHP ;SAVE AND DISABLE INTR
SEI
LDY #OCURTRK+1 ;FETCH TRACK NO
LDA (PAGE0W0),Y
PHP
DEY
LDA (PAGE0W0),Y
CLC
ADC #8 ;SKIP FIRST 8 PAGES
BCS WRLC
PLP
BNE WRLC1
CMP #20H ;ROTATE PAGES TO LEAVE HGRX UNUSED TILL LATE
BCC WRITE1
ADC #20H-1
BCC WRITE1
ADC #20H-1
WRITE1 CMP #0C0H ;CHECK FOR LC ACCESS
BCS WRALC
JSR PREPWR
SEC ;MAIN --> AUX
JMP AMVCOM ;AUXMOVE
WRLC: PLP
WRLC1: SEC
SBC #040H
JMP WRLC2
WRALC: LDX PAGE0W0
LDY PAGE0W0+1
STA 0C009H ;ALTZP ON
STX PAGE0W0
STY PAGE0W0+1
WRLC2 CMP #0D0H ;CHECK FOR 2ND BANK ACCESS
BCS WRBK2
ADC #10H ;WRITE TO 1ST BANK
BIT 0C089H ;WRITE TO 1ST BANK
BIT 0C089H
JMP WRLC3
WRBK2 BIT 0C081H ;WRITE TO 2ND BANK
BIT 0C081H
WRLC3 JSR PREPWR
JMP MVCOM ;MOVE, ALTZP OFF, EN ROM, A=0, RTS
PREPWR: STA 43H ;DEST ST
LDA #0
STA 42H
LDY #OCURDMA+1 ;SRC ST
LDA (PAGE0W0),Y
STA 3DH
DEY
LDA (PAGE0W0),Y
STA 3CH
CLC ;SRC END = SRC ST + 0FFH
ADC #0FFH
STA 3EH
LDA 3DH
ADC #0
STA 3FH
RTS
;******************************
;ROUTINE: OTHER
;PURP: OTHER COMMANDS
;ENTRY: PARAMETERS ARE READ DIRECTLY FROM Z-80
;EXIT: IF NO ERRORS THEN
; A = 0
; ELSE
; A = ERROR NUMBER
;USED: ALL
;******************************
;OTHER COMMANDS
; OTHER PARAMETERS ARE DEPENDENT ON WHICH ENTRY IS CALLED
OTHER:
CMP #SNDPRMCMD ;IS THIS THE SEND PARAMETERS COMMAND
BNE CHKFRMT ;BIF NOT SEND PARMATERS
;SEND THE HOST AND DISK PARAMETERS
; ENTRY PARAMETERS:
; THE DRIVE NUMBER (1 BYTE)
; EXIT PARAMETERS:
; ERROR CODE (1 BYTE)
JSR RD1Z80BYTE ;GET THE DRIVER NUMBER
LDY #0
STY IDX
$0:
LDA PARMS,Y
JSR WR1Z80BYTE ;SEND THE NEXT BYTE
INC IDX ;INCREMENT TO NEXT BYTE
LDY IDX
CPY #SZPARMS ;ARE WE DONE ?
BNE $0 ;BIF NOT DONE
LDA #0 ;INDICATE NO ERRORS
RTS
CHKFRMT:
CMP #FRMTCMD ;FORMAT COMMAND ?
BNE CHKNAME ;BIF NOT
;FORMAT A DRIVE
; ENTRY PARAMETERS:
; THE DRIVE NUMBER (1 BYTE)
; EXIT PARAMETERS:
; ERROR CODE (1 BYTE)
JSR RD1Z80BYTE ;GET DRIVE
FORMAT:
PHP ;SAVE AND DISABLE INTR
SEI
LDA 0C018H ;SAVE AND CLEAR 80STORE
PHP
STA 0C000H
LDX #00H ;INIT ST
STX PATCH+1
DEX ;START AT 07FFH TO SET INIT FLAG
LDA #07H
STA PATCH+2
LDA #0E5H
FORM1 STA 0C005H ;RAMWRT ON
PATCH:
STA 0800H,X ;ZERO DIR (0800H - 0DFFH)
STA 0C004H ;RAMWRT OFF
INX ;INCR PTR
BNE FORM1
INC PATCH+2
LDY PATCH+2 ;CHECK END
CPY #0EH
BCC FORM1
JMP R80IQ ;REST 80STORE+INTR, A=0, RTS
;CHECK FOR SEND NAME COMMAND
CHKNAME:
CMP #SNDNAMECMD ;SEND NAME COMMAND ?
BNE CHKOTHR ; BIF NOT
; ENTRY PARAMETERS:
; NONE
; EXIT PARAMETERS:
; SEND THE LENGTH OF THE NAME (1 BYTE)
; FOLLOWED BYTE THE NAME (LENGTH NUMBER OF BYTES)
; ERROR CODE (1 BYTE)
LDA NAME ;GET LENGTH
STA CNT ;SAVE AS COUNT
JSR WR1Z80BYTE ;SEND IT TO HOST
LDA #1
STA IDX
$LP: LDX IDX
LDA NAME,X ;GET NEXT CHARACTER
JSR WR1Z80BYTE ;WRITE THE NEXT CHARACTER
INC IDX
DEC CNT
BNE $LP ;CONTINUE UNTIL ALL BYTES ARE SENT
LDA #0 ;NO ERRORS
RTS
CHKOTHR:
LDA #0FFH ;BAD COMMAND
RTS
;***********************************
;ROUTINE: POLLENTRY
;PURP: HANDLE POLLING, THIS ENTRY POINT
; IS CALLED PERIODICALY WHILE THE APPLE IS
; WAITING FOR A COMMAND FROM THE Z-80. THIS
; CODE SHOULD BE VERY SHORT AS THE Z-80 IS
; IGNORED WHILE THIS CODE IS BEING EXECUTED
;ENTRY: NONE
;EXIT: NONE
;USED: ALL
;***********************************
POLL:
RTS
IDX: .BLOCK 1 ;TEMPORARY
CNT: .BLOCK 1 ;TEMPORARY
ENDDRVR:
.END
*********************************
POLL:
RTS
IDX: .BLOCK 1 ;TEMPORARY
CNT: .BLOCK 1 ;TEMPOR