Working PiDrive

Apple 3 PiDrive driver.  Apple2 PiDrive driver can mount under Linux
This commit is contained in:
dschmenk 2014-02-12 17:30:06 -08:00
parent bf07a8c365
commit f683d6a051
17 changed files with 278 additions and 287 deletions

File diff suppressed because one or more lines are too long

View File

@ -1,2 +0,0 @@
LIST
]

BIN
client/PICLOCK#062000 Executable file

Binary file not shown.

BIN
client/PIDRIVE.A3DRVR#050000 Executable file

Binary file not shown.

View File

@ -1,32 +0,0 @@
NEW
REM LOAD PIDRIVE AND APPLY FIXUPS
300 PRINT CHR$ (4);"BLOAD PIDRIVE.A2DRVR"
310 VE = 816 : FX = VE + 4 : SI = PEEK(768) : SN = SI / 8
REM CHECK IF PRODOS DEVICE VECTOR SET
320 IF PEEK(48913 + SN) = 222 THEN POKE 48912 + SN, PEEK(VE) : POKE 48913 + SN, PEEK (VE + 1)
330 IF PEEK(48929 + SN) = 222 THEN POKE 48928 + SN, PEEK(VE) : POKE 48929 + SN, PEEK (VE + 1)
340 FOR D = 48946 TO 48959
350 IF PEEK (D) = 0 THEN POKE D, SI + 1 : POKE 48945, PEEK (48945) + 1 : D = 48960
360 NEXT
370 FOR D = 48946 TO 48959
380 IF PEEK (D) = 0 THEN POKE D, SI + 1 : POKE 48945, PEEK (48945) + 129 : D = 48960
390 NEXT
395 PRINT "PIDRIVE CONNECTED ON SLOT #"; SN / 2
REM INSERT CLOCK DRIVER
400 POKE 48903, PEEK (VE + 2) : POKE 48904, PEEK (VE + 3)
405 PRINT "PICLOCK CONNECTED"
REM RUN THROUGH FIXUP TABLE
410 AA = PEEK (FX) : IF AA = 0 THEN NEW : END
420 AA = AA + PEEK (FX + 1) * 256 : FX = FX + 2
430 POKE AA, PEEK (AA) + SI
440 GOTO 410
]

View File

@ -1,66 +0,0 @@
NEW
10 PRINT
11 PRINT "STARTING APPLE II PI CLIENT."
12 PRINT "PRESS ANY KEY TO CANCEL..."
REM ALLOCATE BASIC BUFFER SPACE
20 PRINT CHR$ (4);"BLOAD DEFSLOT"
30 CALL 769
REM LOAD APPROPRIATE CLIENT
40 A2$ = "A2PI" : IF PEEK (64435) < > 6 THEN A2$ = "A2PLUSPI"
50 PRINT CHR$ (4);"BLOAD ";A2$
REM IF DEFAULT SLOT NOT SET, SEARCH FOR SSC
60 IF PEEK (768) = 0 THEN GOSUB 100
65 POKE 769,0
REM INIT A2PI DRIVER
70 PRINT CHR$ (4);"PR# A$9600"
80 IF PEEK (769) < > 0 THEN PRINT "APPLE II PI CONNECTED." : PRINT "KEYBOARD ROUTED TO LINUX" : GOSUB 300
90 NEW : END
REM SEARCH FOR SSC
100 SC = 0 : PI = 0
110 FOR S = 1 TO 7
120 FW = 49152 + 256 * S
130 IF PEEK (FW + 5) = 56 AND PEEK (FW + 7) = 24 AND PEEK (FW + 12) = 49 THEN SC = S : PRINT "FOUND SERIAL CARD: SLOT #";S
150 NEXT
160 IF SC < > 0 THEN POKE 768,SC * 16: RETURN
REM NOTHING FOUND. LOW BUZZ TO SIGNIFY CONFIG NEEDED
200 FOR S = 1 TO 100 : SP = PEEK (49200): NEXT
210 POP : PRINT CHR$ (4);"RUN CONFIG"
220 END
REM LOAD PIDRIVE AND APPLY FIXUPS
300 PRINT CHR$ (4);"BLOAD PIDRIVE"
310 VE = 816 : FX = VE + 4 : SI = PEEK(768) : SN = SI / 8
REM CHECK IF PRODOS DEVICE VECTOR SET
320 IF PEEK(48913 + SN) = 222 THEN POKE 48912 + SN, PEEK(VE) : POKE 48913 + SN, PEEK (VE + 1)
330 IF PEEK(48929 + SN) = 222 THEN POKE 48928 + SN, PEEK(VE) : POKE 48929 + SN, PEEK (VE + 1)
335 PRINT "PIDRIVE CONNECTED ON SLOT #"; SN / 2
REM INSERT CLOCK DRIVER
340 POKE 48903 + SN, PEEK (VE + 2) : POKE 48904 + SN, PEEK (VE + 3)
345 PRINT "PICLOCK CONNECTED"
REM RUN THROUGH FIXUP TABLE
350 AA = PEEK (FX) + PEEK (FX + 1) * 256 : FX = FX + 2
360 IF AA = 0 THEN RETURN
370 POKE AA, PEEK (AA) + SI
380 GOTO 350
]

Binary file not shown.

2
debian/changelog vendored
View File

@ -2,6 +2,8 @@ a2pi (0.1.8-2) unstable; urgency=low
* Fix FUSE create file function
* Add VSDRIVE functionality
* Fix recursive call request (FUSE mount w/ pidrive active)
* Fix symlinks for A2VDx.PO updating
-- David Schmenk <dschmenk@gmail.com> Tue, 04 Feb 2014 13:43:53 -0800

12
debian/postinst vendored
View File

@ -58,12 +58,18 @@ case "$1" in
sed 's/^#user_allow_other/user_allow_other/' /etc/fuse.conf.bak > /etc/fuse.conf
fi
#
# Set up VSDRIVEs
# Set up PIDRIVEs
#
if [ ! -e /usr/share/a2pi/A2VD1.PO ] ; then
if [ ! -s /usr/share/a2pi/A2VD1.PO ] ; then
if [ -e /usr/share/a2pi/A2VD1.PO ] || [ -L /usr/share/a2pi/A2VD1.PO ] ;then
rm /usr/share/a2pi/A2VD1.PO
fi
ln -s /usr/share/a2pi/A2PI-1.4.PO /usr/share/a2pi/A2VD1.PO
fi
if [ ! -e /usr/share/a2pi/A2VD2.PO ] ; then
if [ ! -s /usr/share/a2pi/A2VD2.PO ] ; then
if [ -e /usr/share/a2pi/A2VD2.PO ] || [ -L /usrshare/a2pi/A2VD2.PO ] ; then
rm /usr/share/a2pi/A2VD2.PO
fi
ln -s /usr/share/a2pi/BLANK.PO /usr/share/a2pi/A2VD2.PO
fi
#

Binary file not shown.

Binary file not shown.

View File

@ -1,7 +1,8 @@
.SUFFIXES =
AFLAGS = -o $@
ROM = ROM\#062000
DRVR = PIDRIVE\#062000
VDRV = PIDRIVE\#062000
VCLK = PICLOCK\#062000
#
# Image filetypes for CiderPress
#
@ -10,12 +11,16 @@ BINTYPE = \#060000
SYSTYPE = \#ff0000
TXTTYPE = \#040000
all: $(ROM) $(DRVR)
all: $(ROM) $(VDRV) $(VCLK)
$(ROM): rom.s
ca65 rom.s -o rom.o
ld65 -o $(ROM) -C rom.cfg rom.o
$(DRVR): pidrive.s
$(VDRV): pidrive.s
ca65 pidrive.s -o pidrive.o
ld65 -o $(DRVR) -C drvr.cfg pidrive.o
ld65 -o $(VDRV) -C drvr.cfg pidrive.o
$(VCLK): piclock.s
ca65 piclock.s -o piclock.o
ld65 -o $(VCLK) -C drvr.cfg piclock.o

248
pidrive/piclock.s Executable file
View File

@ -0,0 +1,248 @@
.DEFINE EQU =
.DEFINE DB .BYTE
.DEFINE DW .WORD
.CODE
PISLOT EQU $00
;*
;* ACIA REGISTERS
;*
ACIADR EQU $C088+PISLOT*16
ACIASR EQU $C089+PISLOT*16
ACIACR EQU $C08A+PISLOT*16
ACIAMR EQU $C08B+PISLOT*16
;*
;* APPLE I/O LOCATIONS
;*
KEYBD EQU $C000
STROBE EQU $C010
;*
;* UTIL ROUTINES
;*
WAIT EQU $FCA8
COUT EQU $FDED
CROUT EQU $FD8E
PRBYTE EQU $FDDA
PRHEX EQU $FDE3
PRNTAX EQU $F941
RDKEY EQU $FD0C
RDCHAR EQU $FD35
GETLN EQU $FD6A
;*
;* ZERO PAGE PARAMETERS
;*
PDCMD EQU $42
PDUNIT EQU $43
PDBUFF EQU $44
PDBUFL EQU $44
PDBUFH EQU $45
PDBLKL EQU $46
PDBLKH EQU $47
;*
;* SLOT INDEX = SLOT # * 16
;*
SLOTIDX EQU $0300
;*
;* DRIVER SCRATCHPAD
;*
TMP EQU $0478+PISLOT
PAD0 EQU $0478+PISLOT
PAD1 EQU $04F8+PISLOT
PAD2 EQU $0578+PISLOT
PAD3 EQU $05F8+PISLOT
PAD4 EQU $0678+PISLOT
PAD5 EQU $06F8+PISLOT
PAD6 EQU $0778+PISLOT
PAD7 EQU $07F8+PISLOT
;*
;* PRODOS COMMANDS
;*
PDSTAT EQU 0
PDREAD EQU 1
PDWRITE EQU 2
PDFORMT EQU 3
;*
;* PRODOS ERRORS
;*
PDNOERR EQU $00
PDIOERR EQU $27
PDNODEV EQU $28
PDWRPRT EQU $2B
;*
;* PRODOS GLOBAL PAGE LOCATIONS
;*
CLKJMP EQU $BF06
DEV1L EQU $BF10
DEV1H EQU $BF11
DEV2L EQU $BF20
DEV2H EQU $BF21
DEVCNT EQU $BF31
DEVLST EQU $BF32
PDTIME EQU $BF90
;*
;* ZERO PAGE LOCATIONS FOR LOADER
;*
DSTPTR EQU $06
DSTL EQU $06
DSTH EQU $07
SRCPTR EQU $08
SRCL EQU $08
SRCH EQU $09
;*
;* DRIVER LOADER
;*
DRVRDST EQU $D742
DRVRLEN EQU 125
LDA #$4C
STA CLKJMP ; HOOK CLOCK DRIVER (WITH JMP)
LDA #<DRVRELOC
STA SRCL
LDA #>DRVRELOC
STA SRCH
LDA #<DRVRDST
STA DSTL
LDA #>DRVRDST
STA DSTH
LDY #DRVRLEN-1
BIT $C08B ; ENABLE LCRAM & WRITE
BIT $C08B
CPYLP: LDA (SRCPTR),Y
STA (DSTPTR),Y
DEY
BPL CPYLP
INY
LDX #SFIXUPTBL-IFIXUPTBL-1
IFIXLP: LDA IFIXUPTBL,X
STA DSTH
DEX
LDA IFIXUPTBL,X
STA DSTL
LDA (DSTPTR),Y
ORA SLOTIDX
STA (DSTPTR),Y
DEX
BPL IFIXLP
LDX #DRVRELOC-SFIXUPTBL-1
SFIXLP: LDA SFIXUPTBL,X
STA DSTH
DEX
LDA SFIXUPTBL,X
STA DSTL
LDA SLOTIDX
LSR
LSR
LSR
LSR
CLC
ADC (DSTPTR),Y
STA (DSTPTR),Y
DEX
BPL SFIXLP
BIT $C08A ; EBABLE ROM
LDA SLOTIDX
LSR
LSR
LSR
TAX
LDA DEV1H,X
CMP #$DE ; GNODEV
BNE INSDEV2
LDA #<DRVRDST
STA DEV1L,X
LDA #>DRVRDST
STA DEV1H,X
INY
INSDEV2:
LDA DEV2H,X
CMP #$DE
BNE INCDEV1
LDA #<DRVRDST
STA DEV2L,X
LDA #>DRVRDST
STA DEV2H,X
INY
INCDEV1:
CPY #$00
BEQ EXIT ; NOTHING TO BE DONE HERE
LDX #$00
DEV1LP: LDA DEVLST,X
BNE NXTDEV1
LDA SLOTIDX
ORA #$01
STA DEVLST,X
INC DEVCNT
BNE INCDEV2
NXTDEV1:
INX
CPX #14
BNE DEV1LP
INCDEV2:
LDX #$00
DEV2LP: LDA DEVLST,X
BNE NXTDEV2
LDA SLOTIDX
ORA #$81
STA DEVLST,X
INC DEVCNT
BNE EXIT
NXTDEV2:
INX
CPX #14
BNE DEV2LP
EXIT: RTS
;*
;* FIXUP TABLE
;*
IFIXUPTBL:
DW FIXUP1+1
DW FIXUP2+1
DW FIXUP3+1
DW FIXUP4+1
SFIXUPTBL:
DW FIXUP5+1
DW FIXUP6+1
DRVRELOC:
;*
;* PRODOS CLOCK ROUTINE
;*
.ORG DRVRDST
DOCLK: LDA #$AC
PHP
FIXUP5: STA PAD0
SEI
JSR SENDACC
TXA
JSR SENDACC
TYA
JSR SENDACC
CHKACK: JSR RECVACC
TAX
DEX
FIXUP6: CPX PAD0
BNE CHKACK
LDY #$00
CLKLP: JSR RECVACC
STA PDTIME,Y
INY
CPY #$04
BNE CLKLP
PLP
RTS
;*
;* ACIA I/O ROUTINES
;*
SENDACC:
PHA
FIXUP1:
SENDWT: LDA ACIASR
AND #$10
BEQ SENDWT
PLA
FIXUP2: STA ACIADR
RTS
RECVACC:
FIXUP3:
RECVWT: LDA ACIASR
AND #$08
BEQ RECVWT
FIXUP4: LDA ACIADR
RTS

View File

@ -70,7 +70,7 @@ PDWRPRT EQU $2B
;*
;* PRODOS GLOBAL PAGE LOCATIONS
;*
CLKJSR EQU $BF06
CLKJMP EQU $BF06
DEV1L EQU $BF10
DEV1H EQU $BF11
DEV2L EQU $BF20
@ -93,7 +93,7 @@ SRCH EQU $09
DRVRDST EQU $D742
DRVRLEN EQU 125
LDA #$60
STA CLKJSR ; UNHOOK CLOCK DRIVER (WITH RTS)
STA CLKJMP ; UNHOOK CLOCK DRIVER (WITH RTS)
LDA #<DRVRELOC
STA SRCL
LDA #>DRVRELOC

View File

@ -1,172 +0,0 @@
.DEFINE EQU =
.DEFINE DB .BYTE
.DEFINE DW .WORD
.CODE
PISLOT EQU $00
;*
;* ACIA REGISTERS
;*
ACIADR EQU $C088+PISLOT*16
ACIASR EQU $C089+PISLOT*16
ACIACR EQU $C08A+PISLOT*16
ACIAMR EQU $C08B+PISLOT*16
;*
;* APPLE I/O LOCATIONS
;*
KEYBD EQU $C000
STROBE EQU $C010
;*
;* UTIL ROUTINES
;*
WAIT EQU $FCA8
COUT EQU $FDED
CROUT EQU $FD8E
PRBYTE EQU $FDDA
PRHEX EQU $FDE3
PRNTAX EQU $F941
RDKEY EQU $FD0C
RDCHAR EQU $FD35
GETLN EQU $FD6A
;*
;* ZERO PAGE PARAMETERS
;*
PDCMD EQU $42
PDUNIT EQU $43
PDBUFF EQU $44
PDBUFL EQU $44
PDBUFH EQU $45
PDBLKL EQU $46
PDBLKH EQU $47
;*
;* DRIVER SCRATCHPAD
;*
TMP EQU $0478+PISLOT
PAD0 EQU $0478+PISLOT
PAD1 EQU $04F8+PISLOT
PAD2 EQU $0578+PISLOT
PAD3 EQU $05F8+PISLOT
PAD4 EQU $0678+PISLOT
PAD5 EQU $06F8+PISLOT
PAD6 EQU $0778+PISLOT
PAD7 EQU $07F8+PISLOT
;*
;* PRODOS COMMANDS
;*
PDSTAT EQU 0
PDREAD EQU 1
PDWRITE EQU 2
PDFORMT EQU 3
;*
;* PRODOS ERRORS
;*
PDNOERR EQU $00
PDIOERR EQU $27
PDNODEV EQU $28
PDWRPRT EQU $2B
;*
;* PRODOS GLOBAL PAGE LOCATIONS
;*
PDTIME EQU $BF90
;*
;* VECTORS
;*
;VECTBL: DB >DOCMD
; DB >DOCLK
; DB >FIXUP1+1
; DB >FIXUP2+1
; DB >FIXUP3+1
; DB >FIXUP4+1
;TMP: DB 0
;*
;* PRODOS INTELLIGENT DEVICE ENTRYPOINT
;*
DOCMD: LDA PDUNIT
ASL
LDA PDCMD
ROL
ASL
ORA #$A0
LDX PDBLKL
LDY PDBLKH
PHP
JSR SENDCMD
LDY PDCMD
BEQ STATUS
LDX #$02 ; # OF PAGES TO XFER
DEY ; CPY #PDREAD
BEQ RDBLK
DEY ; CMP #PDWRITE
BEQ WRBLK
IOERR: LDA #PDIOERR
CMDERR: PLP
SEC
RTS
RDBLK: JSR RECVACC
STA (PDBUFF),Y
INY
BNE RDBLK
INC PDBUFH
DEX
BNE RDBLK
STATUS: LDX #$FF
DEY ; LDY #$FF
CMDEX: JSR RECVACC
BNE CMDERR
PLP
CLC
RTS
WRBLK: LDA (PDBUFF),Y
JSR SENDACC
INY
BNE WRBLK
INC PDBUFH
DEX
BNE WRBLK
BEQ CMDEX
;*
;* PRODOS CLOCK ROUTINE
;*
;DOCLK: LDA #$AC
; PHP
; JSR SENDCMD
; LDY #$00
;CLKLP: JSR RECVACC
; STA PDTIME,Y
; INY
; CPY #$04
; BNE CLKLP
; PLP
; RTS
;*
;* ACIA I/O ROUTINES
;*
SENDCMD:
STA TMP
SEI
JSR SENDACC
TXA
JSR SENDACC
TYA
JSR SENDACC
CHKACK: JSR RECVACC
TAX
DEX
CPX TMP
BNE CHKACK
GOTACK: RTS
SENDACC:
PHA
FIXUP1:
SENDWT: LDA ACIASR
AND #$10
BEQ SENDWT
PLA
FIXUP2: STA ACIADR
RTS
RECVACC:
FIXUP3:
RECVWT: LDA ACIASR
AND #$08
BEQ RECVWT
FIXUP4: LDA ACIADR
RTS

Binary file not shown.

View File

@ -33,7 +33,7 @@
* Apple II request entry
*/
#define MAX_XFER 64
#define AWAIT_COMPLETE 0x100
struct a2request {
int idx;
int type;
@ -1037,6 +1037,7 @@ reset:
state = RESET;
newtio.c_cc[VMIN] = 3; /* blocking read until 3 chars received */
tcsetattr(a2fd, TCSANOW, &newtio);
a2reqlist->type |= AWAIT_COMPLETE;
}
else
state = RESET;
@ -1088,7 +1089,7 @@ reset:
write(a2fd, &iopkt[3], 1);
iopkt[0] = vdrvstatus((iopkt[0] >> 1) & 0x01);
write(a2fd, iopkt, 1);
if (a2reqlist) /* resend last request */
if (a2reqlist && !(a2reqlist->type & AWAIT_COMPLETE)) /* resend last request */
write(a2fd, &(a2reqlist->type), 1);
break;
case 0xA4: /* virtual drive 1 READ call */
@ -1097,8 +1098,8 @@ reset:
iopkt[3] = iopkt[0] + 1; /* ack */
write(a2fd, &iopkt[3], 1);
iopkt[0] = vdrvread(a2fd, (iopkt[0] >> 1) & 0x01, iopkt[1] | (iopkt[2] << 8));
write(a2fd, iopkt, 1);
if (a2reqlist) /* resend last request */
write(a2fd, iopkt, 1);
if (a2reqlist && !(a2reqlist->type & AWAIT_COMPLETE)) /* resend last request */
write(a2fd, &(a2reqlist->type), 1);
break;
case 0xA8: /* virtual drive 1 WRITE call */
@ -1112,7 +1113,7 @@ reset:
write(a2fd, iopkt, 1);
newtio.c_cc[VMIN] = 3; /* blocking read until 3 chars received */
tcsetattr(a2fd, TCSANOW, &newtio);
if (a2reqlist) /* resend last request */
if (a2reqlist && !(a2reqlist->type & AWAIT_COMPLETE)) /* resend last request */
write(a2fd, &(a2reqlist->type), 1);
break;
case 0xAC: /* virtual clock TIME call */
@ -1120,7 +1121,7 @@ reset:
iopkt[3] = 0xAD; /* ack */
write(a2fd, &iopkt[3], 1);
write(a2fd, prodos_time(), 4);
if (a2reqlist) /* resend last request */
if (a2reqlist && !(a2reqlist->type & AWAIT_COMPLETE)) /* resend last request */
write(a2fd, &(a2reqlist->type), 1);
break;
default: