diff --git a/client/BUILD/a2pi.wdc.s b/client/BUILD/a2pi.wdc.s index 7e2bc20..3475d3f 100755 --- a/client/BUILD/a2pi.wdc.s +++ b/client/BUILD/a2pi.wdc.s @@ -258,27 +258,34 @@ SENDMOD LDA $C062 * * ACIA SEND BYTE IN ACCUMULATOR * -SENDACC PHP - SEI ; Disable interrupts +SENDACC ;PHP + ;SEI ; Disable interrupts PHA LDA SSCSLOT ORA #$88+2 TAY - LDA #$07 - STA $C002-2,Y ; Enable transmit IRQ - LDA $C001-2,Y ; Clear any oustanding interrupts + ;LDA #$07 + ;STA $C002-2,Y ; Enable transmit IRQ + ;LDA $C001-2,Y ; Clear any oustanding interrupts PLA STA $C000-2,Y ; AVOID PHANTOM READ FROM $C0XX PHA -SENDWT LDA $C001-2,Y -; AND #$80 ; Check IRQ status - BPL SENDWT - LDA #$0B ; Disable transmit IRQ - STA $C002-2,Y -IRQWT LDA $C001-2,Y ; Wait for IRQ to clear - BMI IRQWT + TXA + PHA + LDA #$10 + JSR WAIT PLA - PLP ; Restore interrupts + TAX + ;PHA +;SENDWT LDA $C001-2,Y + ;AND #$80 ; Check IRQ status + ;BPL SENDWT + ;LDA #$0B ; Disable transmit IRQ + ;STA $C002-2,Y +;IRQWT LDA $C001-2,Y ; Wait for IRQ to clear + ;BMI IRQWT + PLA + ;PLP ; Restore interrupts RTS * * ACIA RECEIVE BYTE IN ACCUMULATOR diff --git a/client/BUILD/a2pluspi.wdc.s b/client/BUILD/a2pluspi.wdc.s index 9622f54..f9f92c8 100755 --- a/client/BUILD/a2pluspi.wdc.s +++ b/client/BUILD/a2pluspi.wdc.s @@ -227,27 +227,34 @@ SENDMOD LDA $C062 * * ACIA SEND BYTE IN ACCUMULATOR * -SENDACC PHP - SEI ; Disable interrupts +SENDACC ;PHP + ;SEI ; Disable interrupts PHA LDA SSCSLOT ORA #$88+2 TAY - LDA #$07 - STA $C002-2,Y ; Enable transmit IRQ - LDA $C001-2,Y ; Clear any oustanding interrupts + ;LDA #$07 + ;STA $C002-2,Y ; Enable transmit IRQ + ;LDA $C001-2,Y ; Clear any oustanding interrupts PLA STA $C000-2,Y ; AVOID PHANTOM READ FROM $C0XX -; PHA -SENDWT LDA $C001-2,Y -; AND #$80 ; Check IRQ status - BPL SENDWT - LDA #$0B ; Disable transmit IRQ - STA $C002-2,Y -IRQWT LDA $C001-2,Y ; Wait for IRQ to clear - BMI IRQWT -; PLA - PLP ; Restore interrupts + PHA + TXA + PHA + LDA #$10 + JSR WAIT + PLA + TAX + ;PHA +;SENDWT LDA $C001-2,Y + ;AND #$80 ; Check IRQ status + ;BPL SENDWT + ;LDA #$0B ; Disable transmit IRQ + ;STA $C002-2,Y +;IRQWT LDA $C001-2,Y ; Wait for IRQ to clear + ;BMI IRQWT + PLA + ;PLP ; Restore interrupts RTS * * ACIA RECEIVE BYTE IN ACCUMULATOR @@ -257,7 +264,7 @@ RECVACC ;LDA SSCSLOT ;TAY LDY SSCSLOT RECVWT ;LDA $C001-2,Y - LDA $C088,Y + LDA $C089,Y AND #$08 BEQ RECVWT ;LDA $C000-2,Y @@ -276,7 +283,6 @@ CHKEVENT LDA KEYBD ; CHECK FOR KEY PRESS LDA $C089,Y AND #$08 BEQ CHKMOU - ;LDA $C000-2,Y LDA $C088,Y JMP HOSTREQ CHKMOU DEC WAITEV ; CHECK FOR MOUSE UPDATE diff --git a/pidrive/Makefile b/pidrive/Makefile index 54e01b4..4abe14a 100755 --- a/pidrive/Makefile +++ b/pidrive/Makefile @@ -1,9 +1,10 @@ .SUFFIXES = AFLAGS = -o $@ -SIROM = SIROM\#062000 -PIROM = PIROM\#062000 -VDRV = PIDRIVE\#062000 -VCLK = PICLOCK\#062000 +SIROM = SIROM\#062000 +PIROM = PIROM\#062000 +VDRV = PIDRIVE\#062000 +VDRV.WDC = PIDRIVE.WDC\#062000 +VCLK = PICLOCK\#062000 # # Image filetypes for CiderPress # @@ -12,7 +13,7 @@ BINTYPE = \#060000 SYSTYPE = \#ff0000 TXTTYPE = \#040000 -all: $(SIROM) $(PIROM) $(VDRV) $(VCLK) +all: $(SIROM) $(PIROM) $(VDRV) $(VDRV.WDC) $(VCLK) clean: -rm $(SIROM) $(PIROM) $(VDRV) $(VCLK) *.o *~ @@ -29,6 +30,10 @@ $(VDRV): pidrive.s ca65 pidrive.s -o pidrive.o ld65 -o $(VDRV) -C drvr.cfg pidrive.o +$(VDRV.WDC): pidrive.wdc.s + ca65 pidrive.wdc.s -o pidrive.wdc.o + ld65 -o $(VDRV.WDC) -C drvr.cfg pidrive.wdc.o + $(VCLK): piclock.s ca65 piclock.s -o piclock.o ld65 -o $(VCLK) -C drvr.cfg piclock.o diff --git a/pidrive/pidrive.wdc.s b/pidrive/pidrive.wdc.s new file mode 100755 index 0000000..5ca592a --- /dev/null +++ b/pidrive/pidrive.wdc.s @@ -0,0 +1,306 @@ +.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 SLOTIDX + LSR + LSR + LSR + LSR + STA SLOTNUM + LDA #$60 + STA CLKJMP ; UNHOOK CLOCK DRIVER (WITH RTS) + 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 SLOTNUM + CLC + ADC (DSTPTR),Y + STA (DSTPTR),Y + DEX + BPL SFIXLP + BIT $C08A ; EBABLE ROM + LDA SLOTNUM + ASL + TAX + LDA DEV1H,X + CMP #$DE ; GNODEV + BNE INSDEV2 + LDA #DRVRDST + STA DEV1H,X + LDY #$00 +DEV1LP: LDA DEVLST,Y + BNE NXTDEV1 + LDA SLOTIDX + ORA #$01 + STA DEVLST,Y + INC DEVCNT + INC PIVDCNT + BNE INSDEV2 +NXTDEV1: + INY + CPY #14 + BNE DEV1LP + BEQ EXIT +INSDEV2: + LDA DEV2H,X + CMP #$DE + BNE PRSLOT + LDA #DRVRDST + STA DEV2H,X + INY +INCDEV2: + LDY #$00 +DEV2LP: LDA DEVLST,Y + BNE NXTDEV2 + LDA SLOTIDX + ORA #$81 + STA DEVLST,Y + INC DEVCNT + INC PIVDCNT + BNE PRSLOT +NXTDEV2: + INY + CPY #14 + BNE DEV2LP +PRSLOT: LDY PIVDCNT + BEQ EXIT ; NOTHING TO BE DONE HERE + LDA SLOTNUM + ORA #'0' + STA DR1 + STA DR2 + LDY #$00 + JSR PRMSG + DEC PIVDCNT + BEQ EXIT + INY +PRMSG: LDA MSG,Y + BEQ EXIT + ORA #$80 + JSR COUT + INY + BNE PRMSG +EXIT: RTS +MSG: DB "PIDRIVES AVAILABLE AT ,S" +DR1: DB "0,D1" + DB 0 + DB " AND ,S" +DR2: DB "0,D2" + DB 0 +SLOTNUM: DB 0 +PIVDCNT: DB 0 +;* +;* FIXUP TABLE +;* +IFIXUPTBL: + DW FIXUP1+1 + DW FIXUP2+1 + DW FIXUP3+1 +SFIXUPTBL: + DW FIXUP4+1 + DW FIXUP5+1 +DRVRELOC: +;* +;* PRODOS INTELLIGENT DEVICE ENTRYPOINT (OVERWRITE CLOCK DRIVER) +;* + .ORG DRVRDST +DOCMD: LDA PDUNIT + ASL + LDA PDCMD + ROL + ASL + ORA #$A0 + PHP +FIXUP4: STA PAD0 + SEI + JSR SENDACC + LDA PDBLKL + JSR SENDACC + LDA PDBLKH + JSR SENDACC +CHKACK: JSR RECVACC + TAX + DEX +FIXUP5: CPX PAD0 + BNE CHKACK + 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 +DOCLK: RTS ; NO OP CLOCK ROUTINE +STATUS: JSR RECVACC + TAX + JSR RECVACC + TAY +CMDEX: JSR RECVACC + BNE CMDERR + PLP + CLC + RTS +RDBLK: JSR RECVACC + STA (PDBUFF),Y + INY + BNE RDBLK + INC PDBUFH + DEX + BNE RDBLK + BEQ CMDEX +WRBLK: LDA (PDBUFF),Y + JSR SENDACC + INY + BNE WRBLK + INC PDBUFH + DEX + BNE WRBLK + BEQ CMDEX +;* +;* ACIA I/O ROUTINES +;* +SENDACC: +FIXUP1: STA ACIADR + TXA + PHA + LDA #$10 + JSR WAIT + PLA + TAX + RTS +RECVACC: +FIXUP2: +RECVWT: LDA ACIASR + AND #$08 + BEQ RECVWT +FIXUP3: LDA ACIADR + RTS + .ASSERT * - DOCMD <= DRVRLEN, error, "Driver too big" + .OUT .SPRINTF("Driver size %i", * - DOCMD) diff --git a/share/A2PI-WDC.1.7.PO b/share/A2PI-WDC.1.7.PO index a6a2b3a..afeef21 100644 Binary files a/share/A2PI-WDC.1.7.PO and b/share/A2PI-WDC.1.7.PO differ