From f683d6a051947e40081d2fc749046cfe2b152695 Mon Sep 17 00:00:00 2001 From: dschmenk Date: Wed, 12 Feb 2014 17:30:06 -0800 Subject: [PATCH] Working PiDrive Apple 3 PiDrive driver. Apple2 PiDrive driver can mount under Linux --- client/BUILD/PIDRIVE.TEXT#040000 | 1 + client/LIST.CMD | 2 - client/PICLOCK#062000 | Bin 0 -> 272 bytes client/PIDRIVE.A3DRVR#050000 | Bin 0 -> 2048 bytes client/PIDRIVE.BAS | 32 ---- client/STARTUP.BAS | 66 -------- client/VSDRIVE#062000 | Bin 1522 -> 0 bytes debian/changelog | 2 + debian/postinst | 12 +- pidrive/PIDRIVE#062000 | Bin 320 -> 0 bytes pidrive/ROM#062000 | Bin 204 -> 0 bytes pidrive/makefile | 13 +- pidrive/piclock.s | 248 +++++++++++++++++++++++++++++++ pidrive/pidrive.s | 4 +- pidrive/pidriveclock.s | 172 --------------------- share/A2PI-1.4.PO | Bin 143360 -> 143360 bytes src/a2pid.c | 13 +- 17 files changed, 278 insertions(+), 287 deletions(-) create mode 100755 client/BUILD/PIDRIVE.TEXT#040000 delete mode 100755 client/LIST.CMD create mode 100755 client/PICLOCK#062000 create mode 100755 client/PIDRIVE.A3DRVR#050000 delete mode 100755 client/PIDRIVE.BAS delete mode 100755 client/STARTUP.BAS delete mode 100755 client/VSDRIVE#062000 delete mode 100755 pidrive/PIDRIVE#062000 delete mode 100755 pidrive/ROM#062000 create mode 100755 pidrive/piclock.s delete mode 100755 pidrive/pidriveclock.s diff --git a/client/BUILD/PIDRIVE.TEXT#040000 b/client/BUILD/PIDRIVE.TEXT#040000 new file mode 100755 index 0000000..17631f2 --- /dev/null +++ b/client/BUILD/PIDRIVE.TEXT#040000 @@ -0,0 +1 @@ +; PiDrive - Based on VSDRIVE by David Schmidt ; 1.0 - Initial release .TITLE "Apple /// PiDrive Driver" .PROC PIDRIVE DriverVersion .EQU 1000 ; Version number DriverMfgr .EQU 4453 ; Driver Manufacturer - DS ; ; SOS Equates ; ExtPG .EQU 1401 ; Driver extended bank address offset AllocSIR .EQU 1913 ; Allocate system internal resource SysErr .EQU 1928 ; Report error to system EReg .EQU 0FFDF ; Environment register ReqCode .EQU 0C0 ; Request code SOS_Unit .EQU 0C1 ; Unit number SosBuf .EQU 0C2 ; SOS buffer pointer (2 bytes) ReqCnt .EQU 0C4 ; Requested byte count CtlStat .EQU 0C2 ; Control/status code CSList .EQU 0C3 ; Control/status list pointer SosBlk .EQU 0C6 ; Starting block number QtyRead .EQU 0C8 ; Pointer to bytes read returned by D_READ ; ; Our temps in zero page ; Count .EQU 0CE ; 2 bytes Timer .EQU 0D0 ; 2 bytes NumBlks .EQU 0D2 ; 2 bytes lb,hb DataBuf .EQU 0D4 ; 2 bytes CmdAck .EQU 0D6 ; 1 byte ; ; Communications hardware constants ; ACIADR .EQU 0C088 ; ACIA Data register ACIASR .EQU 0C089 ; ACIA Status register ACIACMD .EQU 0C08A ; ACIA Command mode register ACIACTL .EQU 0C08B ; ACIA Control register ; ; SOS Error Codes ; XDNFERR .EQU 010 ; Device not found XBADDNUM .EQU 011 ; Invalid device number XREQCODE .EQU 020 ; Invalid request code XCTLCODE .EQU 021 ; Invalid control/status code XCTLPARAM .EQU 022 ; Invalid control/status parameter XNORESRC .EQU 025 ; Resources not available XBADOP .EQU 026 ; Invalid operation XIOERROR .EQU 027 ; I/O error XNODRIVE .EQU 028 ; Drive not connected XBYTECNT .EQU 02C ; Byte count not a multiple of 512 XBLKNUM .EQU 02D ; Block number to large XDISKSW .EQU 02E ; Disk switched XNORESET .EQU 033 ; Device reset failed ; ; Switch Macro ; .MACRO switch .IF "%1" <> "" ; If parameter 1 is present LDA %1 ; Load A with switch index .ENDC CMP #%2+1 ; Do bounds check BCS $010 ASL A TAY LDA %3+1,Y ; Get switch index from table PHA LDA %3,Y PHA .IF "%4" <> "*" ; If parameter 4 omitted, RTS ; then go to code .ENDC $010 .ENDM ; ; Enter Critical Section ; .MACRO EnterCritSec PHA LDA EReg ORA #080 ; Set 1MHz switch STA EReg PLA PHP ; Disable interrupts SEI .ENDM ; ; Leave Critical Section ; .MACRO LeaveCritSec PHA LDA EReg AND #07F STA EReg ; Whatever it was - set it back PLA PLP ; Restore interrupt state .ENDM ; ; Comment Field of driver ; .WORD 0FFFF ; Signal that we have a comment .WORD 46. ; Length of comment field... entered manually. ; The Pascal Assembler can't count forward references. ; SCP only shows 78 characters' worth of information. .ASCII "Apple /// PiDrive Driver by" .ASCII " David Schmenk 2014" ; 1 2 3 4 ; 1234567890123456789012345678901234567890 ;------------------------------------ ; ; Device identification Block (DIB) - PIDRIVE ; ;------------------------------------ DIB_0 .WORD DIB_1 ; Link pointer .WORD Entry ; Entry pointer .BYTE 008 ; Name length byte .ASCII ".PIDRIVE "; Device name .BYTE 080 ; Active, no page alignment PiSlot .BYTE 001 ; Slot number .BYTE 000 ; Unit number .BYTE 0E1 ; Type .BYTE 010 ; Subtype .BYTE 000 ; Filler DIB0_Blks .WORD 0000 ; # Blocks in device .WORD DriverMfgr ; Manufacturer .WORD DriverVersion ; Driver version .WORD 0000 ; DCB length followed by DCB ;------------------------------------ ; ; Device identification Block (DIB) - VSDRIVE2 ; ;------------------------------------ DIB_1 .WORD 0000 ; Link pointer .WORD Entry ; Entry pointer .BYTE 009 ; Name length byte .ASCII ".PIDRIVE2 "; Device name .BYTE 080 ; Active, no page alignment .BYTE 001 ; Slot number .BYTE 001 ; Unit number .BYTE 0E1 ; Type .BYTE 010 ; Subtype .BYTE 000 ; Filler DIB1_Blks .WORD 0000 ; # Blocks in device .WORD DriverMfgr ; Manufacturer .WORD DriverVersion ; Driver version .WORD 0000 ; DCB length followed by DCB ;------------------------------------ ; ; Local storage locations ; ;------------------------------------ LastOP .BLOCK 002, 0FF ; Last operation for D_REPEAT calls SIRAddr .WORD SIRTbl SIRTbl .BYTE 010 ; Slot # resource .BLOCK 004, 000 ; No interrupt handling SIRLen .EQU *-SIRTbl RdBlkProc .WORD 0000 WrBlkProc .WORD 0000 StackPtr .BYTE 000 DCB_Idx .BYTE 000 ; DCB 0's blocks .BYTE DIB1_Blks-DIB0_Blks ; DCB 1's blocks ;------------------------------------ ; ; Driver request handlers ; ;------------------------------------ Entry JSR Dispatch ; Call the dispatcher LDX SOS_Unit ; Get drive number for this unit LDA ReqCode ; Keep request around for D_REPEAT STA LastOP,X ; Keep track of last operation LDA #000 RTS ; ; The Dispatcher. Note that if we came in on a D_INIT call, ; we do a branch to Dispatch normally. ; Dispatch is called as a subroutine! ; DoTable .WORD DRead-1 ; 0 Read request .WORD DWrite-1 ; 1 Write request .WORD DStatus-1 ; 2 Status request .WORD DControl-1 ; 3 Control request .WORD BadReq-1 ; 4 Unused .WORD BadReq-1 ; 5 Unused .WORD BadOp-1 ; 6 Open - valid for character devices .WORD BadOp-1 ; 7 Close - valid for character devices .WORD DInit-1 ; 8 Init request .WORD DRepeat-1 ; 9 Repeat last read or write request Dispatch SWITCH ReqCode,9,DoTable ; Serve the request ; ; Dispatch errors ; BadReq LDA #XREQCODE ; Bad request code! JSR SysErr ; Return to SOS with error in A BadOp LDA #XBADOP ; Invalid operation! JSR SysErr ; Return to SOS with error in A ; ; D_REPEAT - repeat the last D_READ or D_WRITE call ; DRepeat LDX SOS_Unit LDA LastOP,X ; Recall the last thing we did CMP #002 ; Looking for operation < 2 BCS BadOp ; Can only repeat a read or write STA ReqCode JMP Dispatch NoDevice LDA #XDNFERR ; Device not found JSR SysErr ; Return to SOS with error in A ; ; ACIA addresses for slot # relocation ; RelocTbl .WORD Reloc1 .WORD Reloc2 .WORD Reloc3 .WORD Reloc4 .WORD Reloc5 .WORD Reloc6 .WORD Reloc7 ; ; D_INIT call processing - called at initialization ; DInit LDA SOS_Unit ; Check if we're initting the zeroeth unit BNE DInitDone ; If not - skip the serial setup LDY #001 STY DataBuf+ExtPG LDX #14.-1 RelocLoop LDA RelocTbl,X STA DataBuf+1 DEX LDA RelocTbl,X STA DataBuf LDA PiSlot ASL A ASL A ASL A ASL A ORA (DataBuf),Y STA (DataBuf),Y DEX BPL RelocLoop LDA PiSlot ORA #010 STA SIRTbl LDA #SIRLen LDX SIRAddr LDY SIRAddr+1 JSR AllocSIR ; Allocate the ACIA BCS NoACIA CReset EnterCritSec ; Set up the communications environment LDA #00B ; No parity, no interrupts Reloc1 STA ACIACMD ; Store via ACIA command register LDA #010 ; $16=300, $1e=9600, $1f=19200, $10=115k Reloc2 STA ACIACTL ; Store via ACIA control register Reloc3 LDA ACIASR ; Clear any prior ACIA interrupts LDA #080 JSR PutByte ; Init connection to Pi JSR GetByte ; Check ACK LeaveCritSec ; Re-enable system state CMP #081 BNE NoACIA DInitDone CLC RTS NoACIA LDA #XNORESRC JSR SysErr ; Return to SOS with error in A ; ; D_CONTROL call processing ; $00 = Reset device ; $FE = Perform media formatting ; DControl LDA CtlStat ; Control command BEQ CReset LDA #XCTLCODE ; Control/status code no good JSR SysErr ; Return to SOS with error in A ; ; D_STATUS call processing ; $00 = Driver Status ; $01 = Report drive size ; $FE = Return preferred bitmap location ($FFFF) ; DStatus LDA CtlStat ; Which status code to run? BNE DS0 LDY #000 ; 000 - Driver status, return zero STA (CSList),Y CLC RTS DS0 CMP #0FE BNE DSWhat LDY #000 ; Return preferred bit map locations. LDA #0FF ; We return FFFF, don't care STA (CSList),Y INY STA (CSList),Y CLC RTS DSWhat LDA #XCTLCODE ; Control/status code no good JSR SysErr ; Return to SOS with error in A ; ; D_READ call processing ; DRead TSX STX StackPtr ; Hang on to the stack pointer for hasty exits JSR CkCnt ; Checks for validity, aborts if not JSR CkUnit ; Checks for unit below unit max LDA #000 ; Zero # bytes read STA Count ; Local count of bytes read STA Count+1 TAY STA (QtyRead),Y ; Userland count of bytes read INY STA (QtyRead),Y ; Msb of userland bytes read LDA NumBlks ; Check for NumBlks greater than zero ORA NumBlks+1 BEQ RdDone LDA SosBuf ; Copy out buffer pointers STA DataBuf LDA SosBuf+1 STA DataBuf+1 LDA SosBuf+ExtPG STA DataBuf+ExtPG JSR FixUp ; Correct for addressing anomalies RdBlk JSR ReadBlock ; Transfer a block to/from the disk DEC NumBlks ; Did we get what was asked for? BNE RdMore DEC NumBlks+1 BPL RdMore LDA SosBlk CMP #002 ; Is this block #2 (lsb=2)? BNE RdDone LDA SosBlk+1 BNE RdDone ; Is this block #2 (msb=0)? LDY #029 ; Yes - store off the disk size LDA (SosBuf),Y PHA INY LDA (SosBuf),Y PHA LDX SOS_Unit ; Get the stats on this unit LDY DCB_Idx,X PLA STA DIB0_Blks+1,Y PLA STA DIB0_Blks,Y RdDone CLC RTS RdMore INC SosBlk BNE RdBlk INC SosBlk+1 JMP RdBlk LDY #000 LDA Count ; Local count of bytes read STA (QtyRead),y ; Update # of bytes actually read INY LDA Count+1 STA (QtyRead),y BCS IOError ; An error occurred ReadExit RTS ; Exit read routines IOError LDA #XIOERROR ; I/O error JSR SysErr ; Return to SOS with error in A ; ; D_WRITE call processing ; DWrite TSX STX StackPtr ; Hang on to the stack pointer for hasty exits JSR CkCnt ; Checks for validity JSR CkUnit ; Checks for unit below unit max LDA NumBlks ; Check for NumBlks greater than zero ORA NumBlks+1 BEQ WrDone ; Quantity to write is zero - so done LDA SosBuf ; Copy out buffer pointers STA DataBuf LDA SosBuf+1 STA DataBuf+1 LDA SosBuf+ExtPG STA DataBuf+ExtPG JSR FixUp WrBlk JSR WriteBlock DEC NumBlks ; Did we put what was asked for? BNE WrMore ; Not done yet... go around again DEC NumBlks+1 ; (16 bit decrement) BPL WrMore ; Not done yet... go around again WrDone CLC RTS ; We're done WrMore INC SosBlk BNE WrBlk INC SosBlk+1 JMP WrBlk ;------------------------------------ ; ; Utility routines ; ;------------------------------------ ; ; Check ReqCnt to ensure it's a multiple of 512. ; CkCnt LDA ReqCnt ; Look at the lsb of bytes requested BNE $1 ; No good! lsb should be 00 STA NumBlks+1 ; Zero out the high byte of blocks LDA ReqCnt+1 ; Look at the msb LSR A ; Put bottom bit into carry, 0 into top STA NumBlks ; Convert bytes to number of blks to xfer BCC CvtBlk ; Carry is set from LSR to mark error. $1 LDA #XBYTECNT JSR SysErr ; Return to SOS with error in A ; ; Test for valid block number; abort on error ; CvtBlk LDX SOS_Unit LDY DCB_Idx,X SEC LDA DIB0_Blks+1,Y ; Blocks on unit msb SBC SosBlk+1 ; User requested block number msb BVS BlkErr ; Not enough blocks on device for request BEQ $1 ; Equal msb; check lsb. RTS ; Greater msb; we're ok. $1 LDA DIB0_Blks,Y ; Blocks on unit lsb SBC SosBlk ; User requested block number lsb BVS BlkErr ; Not enough blocks on device for request RTS ; Equal or greater msb; we're ok. BlkErr LDA #XBLKNUM JSR SysErr ; Return to SOS with erorr in A IncrAdr INC Count+1 ; Increment byte count MSB INC DataBuf+1 ; Increment DataBuf MSB in userland ; ; Fix up the buffer pointer to correct for addressing ; anomalies. We just need to do the initial checking ; for two cases: ; 00xx bank N -> 80xx bank N-1 ; 20xx bank 8F if N was 0 ; FDxx bank N -> 7Dxx bank N+1 ; If pointer is adjusted, return with carry set ; FixUp LDA DataBuf+1 ; Look at msb BEQ $1 ; That's one! CMP #0FD ; Is it the other one? BCS $2 ; Yep. fix it! RTS ; Pointer unchanged, return carry clear. $1 LDA #080 ; 00xx -> 80xx STA DataBuf+1 DEC DataBuf+ExtPG ; Bank N -> band N-1 LDA DataBuf+ExtPG ; See if it was bank 0 CMP #07F ; (80) before the DEC. BNE $3 ; Nope! all fixed. LDA #020 ; If it was, change both STA DataBuf+1 ; Msb of address and LDA #08F STA DataBuf+ExtPG ; Bank number for bank 8F RTS ; Return carry set $2 AND #07F ; Strip off high bit STA DataBuf+1 ; FDxx ->7Dxx INC DataBuf+ExtPG ; Bank N -> bank N+1 $3 RTS ; Return carry set CkUnit CLC RTS ; ; CmdSend = Send request and block # ; CmdSend STA CmdAck JSR PutByte LDA SosBlk JSR PutByte LDA SosBlk+1 JSR PutByte INC CmdAck JSR GetByte CMP CmdAck BNE RWFail RTS ; ; RWFail - Complain with an OS I/O error ; RWFail LeaveCritSec LDX StackPtr TXS ; Pop! Goes the stack pointer LDA #XIOERROR ; Nearby branch point JSR SysErr ; Return to SOS with error in A ; ; ReadBlock - Read requested blocks from device into memory ; ReadBlock EnterCritSec LDA SOS_Unit ASL A ORA #0A4 ; Read command JSR CmdSend LDY #000 LDX #002 ; Two pages per block $1 JSR GetByte BCS RWFail STA (DataBuf),Y INY BNE $1 JSR IncrAdr DEX BNE $1 JSR GetByte ; Get status BNE RWFail LeaveCritSec RTS ; ; WriteBlock - write memory out to requested blocks ; WriteBlock EnterCritSec LDA SOS_Unit ASL A ORA #0A8 ; Write command JSR CmdSend LDY #000 LDX #002 ; Two pages per block $1 LDA (DataBuf),Y JSR PutByte INY BNE $1 JSR IncrAdr DEX BNE $1 JSR GetByte ; Get status BNE RWFail LeaveCritSec RTS ; ; GetByte - Get a byte from the ACIA ; ; Carry set on timeout, clear on data (returned in Accumulator) ; GetByte LDA #000 STA Timer STA Timer+1 Reloc4 GetByte1 LDA ACIASR ; Check status bits via ACIA status register AND #008 BNE GETIT ; Data is ready, go get it INC TIMER BNE GetByte1 ; Input register empty, no timeout; loop INC TIMER+1 BNE GetByte1 ; Input register empty, no timeout; loop SEC ; Timeout; return to caller RTS Reloc5 GETIT LDA ACIADR ; Get character via ACIA data register CLC RTS ; ; PutByte - Put a byte to the ACIA ; PutByte PHA ; Push 'character to send' onto the stack Reloc6 PutByte1 LDA ACIASR ; Check status bits AND #010 BEQ PutByte1 ; Output register is full, no timeout; so loop PLA ; Pull 'character to send' back off the stack Reloc7 STA ACIADR ; Put character RTS .END \ No newline at end of file diff --git a/client/LIST.CMD b/client/LIST.CMD deleted file mode 100755 index de8c83b..0000000 --- a/client/LIST.CMD +++ /dev/null @@ -1,2 +0,0 @@ -LIST -] diff --git a/client/PICLOCK#062000 b/client/PICLOCK#062000 new file mode 100755 index 0000000000000000000000000000000000000000..f9dbdbcbf30494df47ba8a954cc307f930b1e45d GIT binary patch literal 272 zcmZ4K)62Gh<;hl#l?tt#E1g=|R$gyqUr?jdeE^6ya!h3F5cqjw5&Pb~3a#v?KqT8n zHeLqiiEO6?UN2(adlW1TB-z$7Fna-kL?IhU?wL;40f@+|y@LBs-n+oP(rK>1{*~9~ z3hqC#R}m(n01{E$f8qec2cty{dyV#A;05a9WSncX|DECf3#>05@LhO`B+-Z>kx+cS z`g;BKw(AksbFQyk!=VsKin0jjc7Bg9~49x>#&YGM29eC@TL}8{6q0WXjN#o z`lS04HK-pp*cNrK?S)0+n3GDKFRe{pDm2$NuZSCng7L#(jmmVgxp>}dLnE7C{4kJt zF7KRs?mg%H?mg$;`v3qCZYm_6iTEt7U)!`{?WVU&>VGByUV5f=&pBawuK)k&ZCTQ= z^n*Jq0p2|Y#bN`z+0n7Hl?Q`CzP`O_PkX49JA4n{+Qpkb47G3P8@ILXYTdnqH@>lC z*?Vvhsv4fGcNpP@my)-!32Z?Yu98LL%uxsL1`Wi8xSYPr&2r?{jS2J4rL3n9sAqKG# z>y;JCYGsY0CuM64Kev1*U%p_0W{ufA7heNzqUu~UH|D)fn#&v63!>t5Cw$ih{FRzS zV{`m^(G`wdFSb>63Qy!yLwF;f8SzgH5$3BDUZ>awfo|KNKJ$@eepS3q==yMBRJ`VN zWMvGZBYrjWxAeq76r&@itva*k5A^_Fz<3W6pp9$Ufv9OlO?{$bvanJg)^hrYX2nN* z5zEInGyXkGP00DFNpGE=$}l-kPs>+hfiuI+CVhR$p##wN#X9<0z^~?0GMi7g^kWS4 zaf+&Eqhy0zXg?Hbnj%#*{gQNPlltg8+Qg9xv4{dWn9B#( z!L4+Mr-15U3*1U|5Xxej%xCkKZWSsrj}kSi2y523<%?UsOt-8ST(iVs+LapU)~w%1 z`c-X;@~Nk6mL`^;qTG&7NmR=ce7Xm|baqf)6+P*8eakf#gOiMW64_|Zl=t~2HYN+C z%Zp_JoM5GL+KvOWj%RX&Y05twx4X7mZ@C*)M`~B7>VYch&P(}w{))V_T#fe{ehNv$ z-onGSNUx#NS*}%TmA}|8EX&4N`d`{lY>35KA3O0xJIe@ zvj=z|ui_Nu@G}00XYmL82EWD#c47#3(*Y0SA`GA(0sn-1Fb!ES;Sw0|mUFAF(VNZy hapsCWh5uZ-#~%6%*i_OhXZ6xU{uKWg!_RpJ9s|Njuu}j4 literal 0 HcmV?d00001 diff --git a/client/PIDRIVE.BAS b/client/PIDRIVE.BAS deleted file mode 100755 index ba344ee..0000000 --- a/client/PIDRIVE.BAS +++ /dev/null @@ -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 - -] \ No newline at end of file diff --git a/client/STARTUP.BAS b/client/STARTUP.BAS deleted file mode 100755 index c92b7d8..0000000 --- a/client/STARTUP.BAS +++ /dev/null @@ -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 - -] \ No newline at end of file diff --git a/client/VSDRIVE#062000 b/client/VSDRIVE#062000 deleted file mode 100755 index b6a9f742105fd2d243b09d9d80d423e182085eec..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1522 zcmZ`(U1%It6uz^&aVI}b7j0l61@Ay>8i=t8C`-_XnB8;(lb>djP@xagZG?^3_r59W zLTtH1QW0t;I1XLR4Vlm&6s)8()h6B9Hum03DIyf&gG;HJjtyOtio|nw(I@F#7nQW~G-Rn%!q8Qolb|@iK{$}$$f6&T}yD|2@5eAI1QKJ@6VkeC{z&18yGy?w4 z>Q)0RNyCt+K2QtzU%e0KIq+JYDM@Y{R%on5}1 zX6%IJa&p183Y>gqTemrxu&q0sOxjjch@4_3GLYUBf`V6CC*yfm0?lv-*?$Px71hEU zNty`1#WJF1NHo0DKw!546X|IN%ZcL!zSI9>Q3z5k(7hmfymAw|bOiZc^m$dVdFa#< zWEy(CEXY^lrAy+aBwd6=l4coz-tqu)-MjSI4h5pA2*JS!Y0{RMGdhb;uHZL3jg+|l zH@9NWOmoQJIM` zTFGO-!rCMfD~Dje#yqOW9B3WV<%%_`?J00iJ;}8s?kIW!-D%7mX zrMFo<6}3dATO0%&GD9@J?W&~%6^8eF)sk6Xxv2RSi1}nEW;>nUFoP8veb21g_U?aP z+(a}|v2A;#=N^zqtKoSVM$9>((K;dJ6;D|93ECv67DCjAN#Xd)M9G3Xy-%)l%8AYC z2Du^F51bw$H#zmlBG)d~z&AENLu;o3&g?Dz-MTjwbad|N7d+ke9_r(s{ Tue, 04 Feb 2014 13:43:53 -0800 diff --git a/debian/postinst b/debian/postinst index 90ea15e..1599fca 100755 --- a/debian/postinst +++ b/debian/postinst @@ -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 # diff --git a/pidrive/PIDRIVE#062000 b/pidrive/PIDRIVE#062000 deleted file mode 100755 index e9a651d06c1b68bf53b98c049c51d430000bf876..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 320 zcmZ3P(95=e<;hl#l?tt#E1g=|R$gyqUr?jdeE^6ya!h3F5cqjw5&Pb~3a#v?KqT8n zHeLqiiEO6?UN2(adlW1TB-z$7Fna-kL?IhU?wL;40f@+|y@LBs-n+oP(rK>1{*~9~ z3hqC#R}m(n01{E$f8qec2cty{dyV#A;05a9WSncX|DECf3#>05@LhO`B+-Z>k+Ass z>g(&TZ@V6NJ@xuhXRf7AT3nn9mboo)=jg3qsZdyWy$gtE0I|Zl>#I(^sbIPAZHdzd zsYOg3A2>Qb$gWh^ut)$(O>{YN;m0%AQx`rj`riTMUwEM*k+9JPs1GLo;ibpg&I6hP UAAV-^b{t3mu{l2cTnl6Z09O{De*gdg diff --git a/pidrive/ROM#062000 b/pidrive/ROM#062000 deleted file mode 100755 index 260544fbe40fce6db4114559fe1f010ab74a899c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 204 zcmZ3auz+C^bDK@i%>xU#du|+(SJvb_sI&&>`(&AFsa(t;9h;RoI z3I~s`I`zcq!uJIX4;Vj4K4AKw`GDaA>q>PEi-bl07yJjxU-+USkpQG8x}3Q1p7YfsRW60G4=ffdBvi diff --git a/pidrive/makefile b/pidrive/makefile index 0dd7945..eab67c7 100755 --- a/pidrive/makefile +++ b/pidrive/makefile @@ -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 diff --git a/pidrive/piclock.s b/pidrive/piclock.s new file mode 100755 index 0000000..9bfc838 --- /dev/null +++ b/pidrive/piclock.s @@ -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 SRCH + 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 DEV1H,X + INY +INSDEV2: + LDA DEV2H,X + CMP #$DE + BNE INCDEV1 + 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 diff --git a/pidrive/pidrive.s b/pidrive/pidrive.s index 074f90c..1022035 100755 --- a/pidrive/pidrive.s +++ b/pidrive/pidrive.s @@ -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 diff --git a/pidrive/pidriveclock.s b/pidrive/pidriveclock.s deleted file mode 100755 index 002ccb9..0000000 --- a/pidrive/pidriveclock.s +++ /dev/null @@ -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 diff --git a/share/A2PI-1.4.PO b/share/A2PI-1.4.PO index 6a0a466c4d2bcc3813cc6084afb282e41b9a5cac..137aa0947145578f2bfa976239f6d725aaa6f241 100755 GIT binary patch delta 1845 zcmc&#Z%kWN6hHUgwwA&sxMnGfW>*n}r2H8yk$vC;hRts4hY1D~iOIu3(i%(%VYq!T zuO@r@umIZa1JF4oBoBFJoo{Kf1&6MH{pS|A{3$g?9cEdx56e=>W+Z0TdrLdS7(crA z^3FZy-gD0V-E)5LJS< zYn~bIKt>6CWqivt~Zs9(g&B z+D#V^Ao*`D>GU8J3D3>zC3+pkr`6!av!H=ghT2dsI)`q;OF~?9(|MkO z+i91UKi~^$g##CY{*j>Oq2ChfBjvG=7`91TDG&d8a0uuEp_K*=lsRR7!W)fxqw1n@ zDYc6l40H;Of;z`1)p>7JN0Ro+wxEooSvYoJ{f?y0Fw-b_XJwld`;+C5f|mBqM!mCq zvlj){nG|teLk@oqo_#ndj0#y`m9#qUlXX;<)mbI(pS2Fets1d)PIpc#D_eo|2TXs% zdeCDfU1KyenRybb9XoJowrm1TOB zMA`2g;JsDM9;gY?jiW?=frBdKpbGx6X^3yC;H}9goAOR2v=Gmxt_TqpA|iyyD2Y{B z)Z|Dk#14t72%{mi!Vct&noyY8b4E!h!uASdj2DjRR-t~+9tz#eOU8L&lj^A8c!KxkM&|n^C0%(Ou2n*7W3jikNxU6>Owt@LAdWR-tAUWqoRlO5@<6!N~g!w93lv12jlSInfJTfTVY ztLoPmEn&P6$GKu;*<$;xk($69R(I_AY&wRQ$;$&jqdpW1gz?$m>!bXd(7H@}BFT9- zgwUITCft=GVnb8BwVQOMiqUvBO=jv}Y!dl+wvA-dlOoy|cm?Y-^-;08p|O~4$ zW24j*zzomSccu8aV^gNiRrD8gk_Lf%{2t%kN zxD_W7P;P5CU!*I@z9__;UVtH>t-&1DAtDk#jou6H#G{D>$V?>oVm6I-1$X1)jj;&K zAaLO6MSE4dRSq$a?)2(}knHH{2%+`NV>JAI=7}2qH6w3)l7<(VPW(ZVKr5q7=V6UC zqcXFVG9`Hu85>Q8v*}`kGvR0q>ZgG*9!{K`rU;s2a`;2El-()+o9AVA_y6+<%@w8; zyBC;x*-swp1$@d5crUg!J^KQCs51MwGvl#ByboPtkJ95r;*sxR zmOc6K8@S7Ui;qVe=o<*b|IAz?_WR_amJ(+(r9nF=YW0$al)_kxHt+SsgVN#Xp zB_$tht4$5nLWFvM@IKv-4R1**J)}tPT~FPZ_K`m)QWGgj-$s-=|H*gAAyI-`5ci`Q zt}#SOtE%nYPLwH=8!$P;ERB=jV4ISsOmYptcq_R|xAo*F*p!mFsfPeL#TOsIlMmoa z3wWxBkZ!$XD*FriMN>IY&?il0prBtem3;-h&aZ4EDjG!jIzJGeTD>n>BxMi{whY4m zpu%0<)LpYdMchjyM@jv($2@1>*2|_6H%`K7*_1E_AB_5rrO0I~JZ*r<;}W)? z)say;Onjm=d&eTzXUi7(1xAMz(Fx(~fEvk*1{4qZjC)!uJwR}U=G~%sH$`a|(5kGq z1%e^;rdp*LE>x?BdORdA(I^?Ex?qBW7gWEN^n5{Wvx~T;7K_y-u8}EThL}B-7%yEr zuU5Hd+77ka^DdnySCLlZo_QYZd1P9c#=`y357FqBw8d1*DvO>xMPVImH*P>u2{0P!RfiZR{zN0HB0t%xlDz kcf=YfhiSS@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: