home *** CD-ROM | disk | FTP | other *** search
- .WIDTH 96
- ;******************************
- ;FILE: APL40TRK.A65
- ; THIS FILE IS A VERSION OF WINK SAVILLE'S APLFLPY.A65 DISK
- ; DRIVER, MODIFIED TO HANDLE 40 (RATHER THAN 35) TRACKS * 16
- ; SECTORS. Thanks to Wink for advice & consultations!
- ;
- ;
- ; This driver has also been modified to have disk initialization compatible
- ; with PCPI vers 1.6: the slot-determination code was meant for v2.0.
- ;
- ;
- ;PURP: DRIVER FOR THE APPLE FLOPPY ASSUMES THAT 0BD00H IS RWTS LOCATION.
- ;
- ;CHANGES:
- ;
- ; 2/24/84 Steven M. Block, Caltech
- ; Added code to support 40 tracks * 16 sectors:
- ; any call to the FORMAT routine makes a 'flying patch'
- ; to DOS 3.3 at 6502 location $BEFE (in RWTS), changing
- ; the byte there to $28 (from $23). The byte is restored
- ; after finishing the FORMAT command. This driver is
- ; assembled to act as drives C: and D: (rather than A: & B:).
- ; Any call to this driver to FORMAT results in a
- ; 40-track disk initialization. Any call to FORMAT A: or B:
- ; results in a 35-track initialization by the usual APLFLPY
- ; driver. The system therefore will appear to have 4 'logical'
- ; drives, but only two physical ones.
- ;
- ; 6/30/83 (WLS)
- ; ADDED CODE TO INIT THAT USES ABOOTSLOT TO SET UP THE
- ; SLOT ARRAY
- ;
- ; 5/11/83 (WLS)
- ; ADDED CODE FOR ISOLATING THE DRIVE AND DENSITY IN THE
- ; FORMAT COMMAND
- ;
- ; 2/24/83 (WLS)
- ; ADDED QUERY FOR SLOT NUMBER
- ;
- ; 12/29/82 (WLS)
- ; CHANGED LENGTH OF NAME FROM 12 TO 15
- ;
- ; 9/1/82 (WLS)
- ; ADDED SEND COMMAND (VERISON 3)
- ; ADDED SETTING OF PREVIOUS DRIVE AND SLOT UPON SUCCESSFUL RWTS
- ; CALL
- ;
- ; 8/1/82 (WLS)
- ; ADDED CALL RD1Z80BYTE IN SEND HOST AND DISK PARAMETERS
- ;
- ; 6/16/82 (WLS)
- ; CHANGED FORMAT TO GET THE DRIVE NUMBER
- ;
- ; 5/26/82 (WLS)
- ; MOVED SECTOR TRANSLATION FROM Z80 BIOS TO HERE
- ; ADDED SNDPRM SUPPORT
- ;
- ; 4/28/82 (WLS)
- ; ADDED CODE TO SUPPORT BLOCK DEVICE TABLES
- ;
- ; 4/2/82 (WLS)
- ; ADDED CODE TO CHANGE MONTC2 DEPENDING ON TYPE OF COMMAND
- ; ADDED CODE TO CHECK IF THE CARD IS IN THE SLOT
- ;
- ; 2/24/82 (WLS)
- ; CHANGED TO ALLOW MULTIPLE CONTROLLERS
- ;
- ; 1/7/82 (WLS)
- ; MADE DRIVE 0 BE THE APPLE DRIVES
- ;
- ; 11/16/81 (WLS)
- ; CREATED
- ;*******************************
-
- FALSE: .EQU 0
- TRUE: .EQU NOT FALSE
-
- BASEPG0: .QUERY "ENTER BASE OF PAGE 0: "
- PAGE0W0: .EQU BASEPG0 ;PAGE ZERO TEMPORARY 1
- PAGE0W1: .EQU PAGE0W0+2 ;PAGE ZERO TEMPORARY 2
-
- ;EQUATES
- .NOLIST
- .INCLUDE DRVREQUS.A65
- .LIST
- ; the following equate is already defined in DRVREQUS.A65:
- ; the one here has been changed to comment to avoid multiple definition:
- ;ABOOTSLOT: .EQU CP65+94 ;ADDRESS OF THE BOOTSLOT VARIABLE
-
- ;
- ;EQUATES
- RWTSENTER: .EQU 0BD00H ;RWTS ENTRY POINT UNDER APPLEDOS
- INIT .EQU 0 ;INIT COMMAND
- READ .EQU 1 ;READ COMMAND
- WRITE .EQU 2 ;WRITE COMMAND
- FORMAT .EQU 4 ;FORMAT COMMAND
-
- APLFDSK .EQU 2 ;CPM DRIVE NUMBER OF APPLES FIRST DISK
- ; this line was formerly APLFDSK .EQU 0 and worked for drives A: & B:
- ; changing to 2 gives drives C: & D: ---this change may alternatively
- ; be made in the PCPI 'INSTALL' program by changing the device number. SMB.
-
- ;HEADER
- BEGDRVR:
- .WORD 0 ;LOAD ADDRESS (0=RELOCATE)
- .WORD ((ENDRVR-BEGDRVR)+0FFH) AND 0FF00H ;LENGTH
- .BYTE 4 ;LENGTH OF PAGE 0 DATA
- .BYTE 0 ;TAG FOR FUTURE VERSIONS
- FDISK: .WORD APLFDSK ;FIRST DISK
- MDISK: .WORD 6 ;MAXIMUM NUMBER OF DRIVES
- .WORD IAPL16
- .WORD RAPL16
- .WORD WAPL16
- .WORD OAPL16
- .WORD PAPL16 ;POLL ROUTINE
- .WORD 5 ;VERSION NUMBER
- NAME: .BYTE 15,"APL 16*40 FLPPY" ;NAME (15 BYTES + 1 BYTE FOR LENGTH)
- ; old name used to be APL 16*35 FLPPY.
- ;
- ;
- ; all 'ALLOCATION VECTOR SIZE' values in the next table were .WORD 16
- ; they have been changed to 19 to reflect larger size on 40 track drives.
- ;BUFFER SIZE, CHECK SIZE AND ALLOCATION SIZE OF EACH DRIVE DEFINED
- .WORD 256 ;HOST BUFFER SIZE
- .WORD 12 ;CHECK VECTOR SIZE
- .WORD 19 ;ALLOCATION VECTOR SIZE
- .WORD 256 ;HOST BUFFER SIZE
- .WORD 12 ;CHECK VECTOR SIZE
- .WORD 19 ;ALLOCATION VECTOR SIZE
- .WORD 256 ;HOST BUFFER SIZE
- .WORD 12 ;CHECK VECTOR SIZE
- .WORD 19 ;ALLOCATION VECTOR SIZE
- .WORD 256 ;HOST BUFFER SIZE
- .WORD 12 ;CHECK VECTOR SIZE
- .WORD 19 ;ALLOCATION VECTOR SIZE
- .WORD 256 ;HOST BUFFER SIZE
- .WORD 12 ;CHECK VECTOR SIZE
- .WORD 19 ;ALLOCATION VECTOR SIZE
- .WORD 256 ;HOST BUFFER SIZE
- .WORD 12 ;CHECK VECTOR SIZE
- .WORD 19 ;ALLOCATION VECTOR SIZE
-
- ;ARRAY OF SLOT NUMBERS TO BE INDEXED BY LOGICAL DRIVE
- SLOTNUM:
- .BYTE 060H,060H
- .BYTE 050H,050H
- .BYTE 040H,040H
- ; below are the values for PCPI version 2.0. Changed back to
- ; actual slot numbers, above, to be compatible with PCPI v.1.6. S.B.
- ;
- ; .BYTE 0,0 ;FIRST PAIR, SET TO 0 IF DYNAMIC
- ; .BYTE 0,0 ;SECOND PAIR
- ; .BYTE 0,0 ;THIRD PAIR
- ;
- PARMS:
- ;HOST PARAMETERS FIRST
- .WORD 256 ;BYTES PER SECTOR
- .WORD 32 ;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
- .WORD 32 ;SECTORS PER TRACK
- .BYTE 3 ;BLOCK SHIFT FACTOR
- .BYTE 7 ;BLOCK MASK
- .BYTE 0 ;EXTENT MASK
- .WORD 147 ;NUMBER OF BLOCKS ON DISK - 1
- ; was .WORD 127 for a 35 track drive. Changed to 147 for 40 tracks.
- .WORD 47 ;NUMBER OF DIRECTORY ENTRIES - 1
- .BYTE 192 ;ALLOC0 (MASKS)
- .BYTE 0 ;ALLOC1
- .WORD 12 ;CHECK MASKS
- .WORD 3 ;OFFSET TO DIRECTORY TRACK
-
- SZPARMS: .EQU $-PARMS
-
-
- ;*******************************
- ;ROUTINES: IAP16,RAP16,WAP16,OAP16
- ;PURP: HANDLE THE 4 ENTRY POINTS
- ;ENTRY: A,Y = ADDRESS OF PARAMETERS
- ;EXIT: IF NO ERRORS THEN
- ; A = 0
- ; ELSE
- ; A <> 0
- ;USED: A,F
- ;******************************
-
- ;INITIALIZE
- IAPL16:
- ;IF SLOT ARRAY[0] = 0 THEN
- ; DYNAMICLY SET UP THE SLOT ARRAY USING THE BOOT SLOT VALUE
- LDA SLOTNUM
- BNE $1 ;BIF NOT ZERO
-
- ;DYNAMICALLY SET UP SLOTNUM
- LDA ABOOTSLOT ;GET THE BOOT SLOT
- STA SLOTNUM ;THE FIRST 2 = BOOT SLOT
- STA SLOTNUM+1
- LDY #2 ;START AT THE SECOND PAIR
- $LP:
- SEC
- SBC #10H ;DECREMENT TO THE PREVIOUS SLOT
- CMP #40H ;IF LESS THAN SLOT 4 THEN CHANGE TO SLOT 6
- BCS $0 ; BIF >= SLOT 4
- LDA #60H ; ELSE CHANGE TO SLOT 6
- $0: STA SLOTNUM,Y
- INY
- STA SLOTNUM,Y
- INY
- CPY #6
- BNE $LP ;CONTINUE UNTIL ALL SLOTS ARE DONE
-
- $1:
- LDX #INIT
- JMP APLF16
-
- ;READ A SECTOR
- RAPL16:
- LDX #READ
- JMP APLF16
-
- ;WRITE A SECTOR
- WAPL16:
- LDX #WRITE
- JMP APLF16
-
- ;OTHER COMMANDS
- OAPL16:
- CMP #SNDPRMCMD ;IS THIS THE SEND PARAMETERS COMMAND
- BNE CHKFRMT
-
- ;SEND THE HOST AND DISK PARAMETERS
- 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
-
- ;CHECK FOR FORMAT COMMAND
- CHKFRMT:
- CMP #FRMTCMD ;FORMAT
- BNE CHKNAME ;ERROR EXIT
- JSR RD1Z80BYTE ;GET DRIVE NUMBER AND DENSITY
- TAY
- AND #0FH ;ISOLATE THE DRIVE
- STA CURDSK
- TYA
- LSR A
- LSR A
- LSR A
- LSR A
- STA DENSITY ;SAVE DENSITY
- LDA AFRMTPARMS+1 ;GET ADDRESS OF PARAMETERS FOR FORMAT
- LDY AFRMTPARMS
- ; added code here to do 40-track patch to RWTS
- ; this code patches $28 to location $BEFE in DOS 3.3 before
- ; calling RWTS for a FORMAT command.
- PATCH1 .EQU BEFEH
- PHA
- LDA #028H
- STA PATCH1
- PLA
- ; end of first part of added code
- LDX #FORMAT
- JSR APLF16
- ; this used to be a jump APLF16 but I changed it to a call in order to
- ; undo the patch on the way out:
- PHA
- LDA #023
- STA PATCH1
- PLA
- RTS
- ; end of added code
-
- ;OLD LINE: JMP APLF16 ;DO FORMAT
-
- ;CHECK FOR SEND NAME COMMAND
- CHKNAME:
- CMP #SNDNAMECMD ;SEND NAME COMMAND
- BNE ERRXIT
-
- LDA NAME ;GET LENGTH
- STA CNT ;SAVE AS COUNT
- JSR WR1Z80BYTE ;SEND IT TO HOST
- LDA #1
- STA IDX
- LDA CNT
- BNE $LP
- CLC
- LDA #0 ;NO ERRORS
- RTS
-
- $LP: LDX IDX
- LDA NAME,X ;GET NEXT CHARACTER
- JSR WR1Z80BYTE
- INC IDX
- DEC CNT
- BNE $LP ;CONTINUE UNTIL ALL BYTES ARE SENT
- LDA #0 ;RETURN WITH NO ERRORS
- RTS
-
- ERRXIT: LDA #0FFH ;UNKNOWN OTHER COMMAND
-
- PAPL16: ;NO POLLING
- RTS
-
-
- ;********************************
- ;ROUTINE: APLF16
- ;PURP: PERFORM AN APPLE 16 SECTOR CALL
- ;ENTRY: A = HIGH BYTE OF PARAMETERS
- ; Y = LOW BYTE OF PARAMETERS
- ;EXIT: IF NO ERRORS THEN
- ; A = 0
- ; ELSE
- ; A = 1
- ;USED: A,F
- ;******************************
-
- APLF16:
- STX FUNCTION
- STA PAGE0W0+1 ;SAVE POINTER TO PARAMETERS
- STY PAGE0W0
- LDY #OCURDSK
- LDA (PAGE0W0),Y
- SEC
- SBC FDISK ;NORMALIZE TO 0
- TAY
- LDA SLOTNUM,Y ;SLOTNUM[DRIVE NUMBER]
- STA IBSLOT
- TYA ;GET NORMALIZED DRIVE NUMBER BACK
- AND #1 ;USE BIT 0 AS DRIVE NUMBER
- STA IBDRVN
- INC IBDRVN ;INCREMENT TO 1 OR 2
-
- ;CHECK IF THE CARD IS THERE
- LDA 0CFFFH ;TRUN OFF ALL ROMS
- LDA IBSLOT ;FORM CN00 ADDRESS IN PAGE0W1
- LSR A
- LSR A
- LSR A
- LSR A
- ORA #0C0H
- STA PAGE0W1+1
- LDA #0
- STA PAGE0W1
-
- ;CHECK BYTES 5 AND 7 FOR 03,3C ERROR EXIT IF NOT THERE
- LDY #5
- LDA (PAGE0W1),Y ;GET ID BYTE
- CMP #03H
- BNE ERROR ;BIF BYTE 5 IS NOT 03H
- LDY #7
- LDA (PAGE0W1),Y
- CMP #03CH
- BNE ERROR ;BIF BYTE 7 IS NOT 03CH
-
- LDY #OCURTRK
- LDA (PAGE0W0),Y
- STA IBTRK ;SET TRACK
- LDY #OCURSEC
- LDA (PAGE0W0),Y ;GET REQUESTED SECOTOR
- TAY
- LDA SECTRAN,Y ;TRANSLATE THE SECTOR
- STA IBSEC ;STORE IT
- LDY #OCURDMA
- LDA (PAGE0W0),Y ;GET LOW BYTE OF DMA ADDRESS
- STA IBBUFP
- INY
- LDA (PAGE0W0),Y ;GET HIGH BYTE OF DMA ADDRESS
- STA IBBUFP+1
- LDA FUNCTION ;GET FUCNTION
- BEQ NOERROR ;EXIT WITH NO ERRORS (A=0) IF COMMAND IS INIT
- STA IBCMD ;SET COMMAND
-
- ;CHANGE MOTOR TIME COUNT 2 TO WAIT LESS IF THIS IS A READ
- LDY #0D8H ;ASSUME IT'S NOT A READ
- CMP #READ ;IS THE COMMAND A READ?
- BNE $1 ; BIF NOT
- LDY #0E8H ;ELSE CHANGE IT TO A SMALLER WAIT TIME
- $1: STY MONTC2 ;STORE VALUE
-
- LDA ADRIOB+1
- LDY ADRIOB
- JSR RWTSENTER
- BCC NOERROR ;BIF NO ERRORS
- ERROR: LDA #1 ;ELSE ERROR
- RTS
-
- NOERROR:
- ;CHANGE PREVIOUS SLOT AND DRIVE NUMBER
- LDA IBSLOT
- STA IBPSN ;SET PREVIOUS SLOT
- LDA IBDRVN
- STA IBPDN ;SET PREVIOUS DRIVE
-
- ;RETURN WITH NO ERRORS
- LDA #0
- RTS
-
-
- FUNCTION: .BYTE 0 ;FUNCTION NUMBER
- IDX: .BYTE 0 ;TEMPORARY
- CNT: .BYTE 0 ;TEMPORARY
- DENSITY: .BYTE 0 ;TEMPROARY
- ADRIOB: .WORD IOB ;ADDRESS OF IOB
- IOB:
- IBTYPE: .BYTE 1 ;TYPE OF IOB
- IBSLOT: .BYTE 060H ;SLOT NUMBER * 16
- IBDRVN: .BYTE 0 ;DRIVE NUMBER
- IBVOL: .BYTE 0 ;VOLUME NUMBER
- IBTRK: .BYTE 0 ;TRACK NUMBER
- IBSEC: .BYTE 0 ;SECTOR NUMBER
- IBDCTP: .WORD DCTB ;ADDRESS OF DEVICE CHARACTERICS TABLE
- IBBUFP: .WORD 0 ;BUFFER POINTER
- IBFREE: .WORD 0 ;UNUSED
- IBCMD: .BYTE 0 ;COMMAND 0=NUL, 1=READ, 2=WRITE, 3=FORMAT
- IBSTAT: .BYTE 0 ;ERROR STATUS 0=OK, 10H=WRITE PROTECTED
- ; 20H=BAD VOLUME, 40H=DRIVE ERROR, 80H=READ ERROR
- IBSMOD: .BYTE 0 ;ACTUAL VOLUME NUMBER
- IBPSN: .BYTE 060H ;PREVIOUS SLOT NUMBER * 16
- IBPDN: .BYTE 1 ;PREVIOUS DISK NUMBER
-
- DCTB: .BYTE 0 ;DEVICE TYPE CODE
- PPTC: .BYTE 1 ;
- MONTC: .BYTE 0EFH ;MOTOR ON TIME COUNTER BYTE 1
- MONTC2: .BYTE 0D8H ;MOTOR ON TIME COUNTER BYTE 2
-
- SECTRAN:
- .BYTE 0,6,12,3,9,15,14,5,11,2,8,7,13,4,10,1
- AFRMTPARMS:
- .WORD FRMTPARMS
- FRMTPARMS:
- CURDSK: .BYTE 0
- CURTRK: .WORD 0
- CURSEC: .WORD 0
- CURDMA: .WORD 0
-
- ENDRVR:
- .END