Working PiDrive
Apple 3 PiDrive driver. Apple2 PiDrive driver can mount under Linux
This commit is contained in:
parent
bf07a8c365
commit
f683d6a051
File diff suppressed because one or more lines are too long
|
@ -1,2 +0,0 @@
|
||||||
LIST
|
|
||||||
]
|
|
Binary file not shown.
Binary file not shown.
|
@ -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
|
|
||||||
|
|
||||||
]
|
|
|
@ -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,6 +2,8 @@ a2pi (0.1.8-2) unstable; urgency=low
|
||||||
|
|
||||||
* Fix FUSE create file function
|
* Fix FUSE create file function
|
||||||
* Add VSDRIVE functionality
|
* 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
|
-- David Schmenk <dschmenk@gmail.com> Tue, 04 Feb 2014 13:43:53 -0800
|
||||||
|
|
||||||
|
|
|
@ -58,12 +58,18 @@ case "$1" in
|
||||||
sed 's/^#user_allow_other/user_allow_other/' /etc/fuse.conf.bak > /etc/fuse.conf
|
sed 's/^#user_allow_other/user_allow_other/' /etc/fuse.conf.bak > /etc/fuse.conf
|
||||||
fi
|
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
|
ln -s /usr/share/a2pi/A2PI-1.4.PO /usr/share/a2pi/A2VD1.PO
|
||||||
fi
|
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
|
ln -s /usr/share/a2pi/BLANK.PO /usr/share/a2pi/A2VD2.PO
|
||||||
fi
|
fi
|
||||||
#
|
#
|
||||||
|
|
Binary file not shown.
Binary file not shown.
|
@ -1,7 +1,8 @@
|
||||||
.SUFFIXES =
|
.SUFFIXES =
|
||||||
AFLAGS = -o $@
|
AFLAGS = -o $@
|
||||||
ROM = ROM\#062000
|
ROM = ROM\#062000
|
||||||
DRVR = PIDRIVE\#062000
|
VDRV = PIDRIVE\#062000
|
||||||
|
VCLK = PICLOCK\#062000
|
||||||
#
|
#
|
||||||
# Image filetypes for CiderPress
|
# Image filetypes for CiderPress
|
||||||
#
|
#
|
||||||
|
@ -10,12 +11,16 @@ BINTYPE = \#060000
|
||||||
SYSTYPE = \#ff0000
|
SYSTYPE = \#ff0000
|
||||||
TXTTYPE = \#040000
|
TXTTYPE = \#040000
|
||||||
|
|
||||||
all: $(ROM) $(DRVR)
|
all: $(ROM) $(VDRV) $(VCLK)
|
||||||
|
|
||||||
$(ROM): rom.s
|
$(ROM): rom.s
|
||||||
ca65 rom.s -o rom.o
|
ca65 rom.s -o rom.o
|
||||||
ld65 -o $(ROM) -C rom.cfg rom.o
|
ld65 -o $(ROM) -C rom.cfg rom.o
|
||||||
|
|
||||||
$(DRVR): pidrive.s
|
$(VDRV): pidrive.s
|
||||||
ca65 pidrive.s -o pidrive.o
|
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
|
||||||
|
|
|
@ -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
|
|
@ -70,7 +70,7 @@ PDWRPRT EQU $2B
|
||||||
;*
|
;*
|
||||||
;* PRODOS GLOBAL PAGE LOCATIONS
|
;* PRODOS GLOBAL PAGE LOCATIONS
|
||||||
;*
|
;*
|
||||||
CLKJSR EQU $BF06
|
CLKJMP EQU $BF06
|
||||||
DEV1L EQU $BF10
|
DEV1L EQU $BF10
|
||||||
DEV1H EQU $BF11
|
DEV1H EQU $BF11
|
||||||
DEV2L EQU $BF20
|
DEV2L EQU $BF20
|
||||||
|
@ -93,7 +93,7 @@ SRCH EQU $09
|
||||||
DRVRDST EQU $D742
|
DRVRDST EQU $D742
|
||||||
DRVRLEN EQU 125
|
DRVRLEN EQU 125
|
||||||
LDA #$60
|
LDA #$60
|
||||||
STA CLKJSR ; UNHOOK CLOCK DRIVER (WITH RTS)
|
STA CLKJMP ; UNHOOK CLOCK DRIVER (WITH RTS)
|
||||||
LDA #<DRVRELOC
|
LDA #<DRVRELOC
|
||||||
STA SRCL
|
STA SRCL
|
||||||
LDA #>DRVRELOC
|
LDA #>DRVRELOC
|
||||||
|
|
|
@ -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.
13
src/a2pid.c
13
src/a2pid.c
|
@ -33,7 +33,7 @@
|
||||||
* Apple II request entry
|
* Apple II request entry
|
||||||
*/
|
*/
|
||||||
#define MAX_XFER 64
|
#define MAX_XFER 64
|
||||||
|
#define AWAIT_COMPLETE 0x100
|
||||||
struct a2request {
|
struct a2request {
|
||||||
int idx;
|
int idx;
|
||||||
int type;
|
int type;
|
||||||
|
@ -1037,6 +1037,7 @@ reset:
|
||||||
state = RESET;
|
state = RESET;
|
||||||
newtio.c_cc[VMIN] = 3; /* blocking read until 3 chars received */
|
newtio.c_cc[VMIN] = 3; /* blocking read until 3 chars received */
|
||||||
tcsetattr(a2fd, TCSANOW, &newtio);
|
tcsetattr(a2fd, TCSANOW, &newtio);
|
||||||
|
a2reqlist->type |= AWAIT_COMPLETE;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
state = RESET;
|
state = RESET;
|
||||||
|
@ -1088,7 +1089,7 @@ reset:
|
||||||
write(a2fd, &iopkt[3], 1);
|
write(a2fd, &iopkt[3], 1);
|
||||||
iopkt[0] = vdrvstatus((iopkt[0] >> 1) & 0x01);
|
iopkt[0] = vdrvstatus((iopkt[0] >> 1) & 0x01);
|
||||||
write(a2fd, iopkt, 1);
|
write(a2fd, iopkt, 1);
|
||||||
if (a2reqlist) /* resend last request */
|
if (a2reqlist && !(a2reqlist->type & AWAIT_COMPLETE)) /* resend last request */
|
||||||
write(a2fd, &(a2reqlist->type), 1);
|
write(a2fd, &(a2reqlist->type), 1);
|
||||||
break;
|
break;
|
||||||
case 0xA4: /* virtual drive 1 READ call */
|
case 0xA4: /* virtual drive 1 READ call */
|
||||||
|
@ -1097,8 +1098,8 @@ reset:
|
||||||
iopkt[3] = iopkt[0] + 1; /* ack */
|
iopkt[3] = iopkt[0] + 1; /* ack */
|
||||||
write(a2fd, &iopkt[3], 1);
|
write(a2fd, &iopkt[3], 1);
|
||||||
iopkt[0] = vdrvread(a2fd, (iopkt[0] >> 1) & 0x01, iopkt[1] | (iopkt[2] << 8));
|
iopkt[0] = vdrvread(a2fd, (iopkt[0] >> 1) & 0x01, iopkt[1] | (iopkt[2] << 8));
|
||||||
write(a2fd, iopkt, 1);
|
write(a2fd, iopkt, 1);
|
||||||
if (a2reqlist) /* resend last request */
|
if (a2reqlist && !(a2reqlist->type & AWAIT_COMPLETE)) /* resend last request */
|
||||||
write(a2fd, &(a2reqlist->type), 1);
|
write(a2fd, &(a2reqlist->type), 1);
|
||||||
break;
|
break;
|
||||||
case 0xA8: /* virtual drive 1 WRITE call */
|
case 0xA8: /* virtual drive 1 WRITE call */
|
||||||
|
@ -1112,7 +1113,7 @@ reset:
|
||||||
write(a2fd, iopkt, 1);
|
write(a2fd, iopkt, 1);
|
||||||
newtio.c_cc[VMIN] = 3; /* blocking read until 3 chars received */
|
newtio.c_cc[VMIN] = 3; /* blocking read until 3 chars received */
|
||||||
tcsetattr(a2fd, TCSANOW, &newtio);
|
tcsetattr(a2fd, TCSANOW, &newtio);
|
||||||
if (a2reqlist) /* resend last request */
|
if (a2reqlist && !(a2reqlist->type & AWAIT_COMPLETE)) /* resend last request */
|
||||||
write(a2fd, &(a2reqlist->type), 1);
|
write(a2fd, &(a2reqlist->type), 1);
|
||||||
break;
|
break;
|
||||||
case 0xAC: /* virtual clock TIME call */
|
case 0xAC: /* virtual clock TIME call */
|
||||||
|
@ -1120,7 +1121,7 @@ reset:
|
||||||
iopkt[3] = 0xAD; /* ack */
|
iopkt[3] = 0xAD; /* ack */
|
||||||
write(a2fd, &iopkt[3], 1);
|
write(a2fd, &iopkt[3], 1);
|
||||||
write(a2fd, prodos_time(), 4);
|
write(a2fd, prodos_time(), 4);
|
||||||
if (a2reqlist) /* resend last request */
|
if (a2reqlist && !(a2reqlist->type & AWAIT_COMPLETE)) /* resend last request */
|
||||||
write(a2fd, &(a2reqlist->type), 1);
|
write(a2fd, &(a2reqlist->type), 1);
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
|
|
Loading…
Reference in New Issue