.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
