NEW
  AUTO 3,1
				.LIST OFF	
				.OP	65C02
				.OR $2000
				.TF drv/dhgr.drv
*--------------------------------------
				.INB INC/MACROS.I
				.INB INC/A2OSX.I
				.INB INC/MLI.I
				.INB INC/MLI.E.I
				.INB INC/IO.I
				.INB INC/GFX.I
				.INB INC/GFX.EVE.I
*--------------------------------------
ZPPtr			.EQ ZPBIN
*--------------------------------------
*			File Header (16 Bytes)
*--------------------------------------
CS.START		cld
				jmp Dev.Detect			cld,jmp abs=DRV
				.DA #$61				6502,Level 1 (65c02)
				.DA #1					DRV Layout Version 1
				.DA 0
				.DA CS.END-CS.START			Code Length
				.DA 0
				.DA 0
				.DA 0
*--------------------------------------
* Relocation Table
*--------------------------------------
L.MSG.DETECT	.DA MSG.DETECT
L.MSG.DETECT.IIC	.DA MSG.DETECT.IIC
L.MSG.DETECT.EVE	.DA MSG.DETECT.EVE
L.MSG.DETECT.80C	.DA MSG.DETECT.80C
L.DRV.CS.START	.DA DRV.CS.START
L.FD.DEV		.DA FD.DEV
L.FD.DEV.NAME	.DA FD.DEV.NAME
				.DA 0					End Of Reloc Table
*--------------------------------------
Dev.Detect		>LDYA L.MSG.DETECT
				>SYSCALL puts
				lda MACHID
				and #MACHID.T
				cmp #MACHID.T.IIc
				bne .1
*				stz DCB+S.DCB.GFX.S		//c : 80c Mode
				>LDYA L.MSG.DETECT.IIC
				bra .3
.1				php
				sei
				sta SET80STORE
				sta SETPAGE2
				ldx $400				Save Aux $400
				lda #$ff				Make sure !=1 for comparing later
				sta $400

				sta CLRPAGE2
				ldy $400				Save Main $400
				lda #$01				Select Foreground/BKgrnd Colors
				sta TXT16.ON			Activate 16 color mode
				sta $400				Store something in Main
				sta SETPAGE2
				eor $400				read back AUX, If EVE, must be F/BG colors
				bne .2
				dec
				sta DCB+S.DCB.GFX.S		0=80C,$ff=EVE

.2				stx $400				Set back Aux $400
				sta CLRPAGE2
				sty $400				Set back Main $400
				sta TXT16.OFF
				plp
				>LDYA L.MSG.DETECT.EVE

				bit DCB+S.DCB.GFX.S
				bmi .3
				>LDYA L.MSG.DETECT.80C
.3				>SYSCALL puts			

				>PUSHWI DRV.END
				>PUSHWI DRV.CS.END-DRV.CS.START
				>PUSHWI DRV.CS.START
				>LDYA L.DRV.CS.START
				>SYSCALL InsDrv
				bcs .9
				>STYA FD.DEV+S.FD.DEV.DRVPTR
				>PUSHW L.FD.DEV.NAME
				>LDYA L.FD.DEV
				>SYSCALL MKDEV
				bcs .9
				php
				sei
				>LDYAI $4000
				>STYA $800
				sta SETWRITEAUX
				>STYA $800
				sta CLRWRITEAUX
				sta SETHIRES
				sta SET80STORE

				jsr ClrScr
				plp

.9				rts
*--------------------------------------
ClrScr			ldx #0
				txa						lda #0
.1				ldy BASEL,x
				sty ZPPtr
				ldy BASEH,x
				sty ZPPtr+1
				sta SETPAGE2
	
				jsr .2
				sta CLRPAGE2
	
				jsr .2
				inx
				cpx #192
				bne .1

				rts

.2				ldy #39
.3				sta (ZPPtr),y
				dey
				bpl .3
				rts
*--------------------------------------
CS.END
MSG.DETECT		.AZ "Apple IIe/IIc DHGR Driver."
MSG.DETECT.IIC	.AZ "Apple //c : 'LCM Feline/80c' Mode."
MSG.DETECT.EVE	.AZ "Apple //e : 'LCM Eve' Board Detected."
MSG.DETECT.80C	.AZ "No Specific H/W Found, 'Video7 80c' Mode."
*--------------------------------------
*			Device Header (16 Bytes)
*--------------------------------------
FD.DEV			.DA #S.FD.T.CDEV
				.DA #0					HANDLER
				.DA #0					BUSID
				.DA #0					DEVID
				.DA 0					BUSPTR
				.BS 2					DRVPTR
				.DA 0					DCBPTR
				.DA 0					BUFPTR
FD.DEV.NAME		.AZ "GFX"
*--------------------------------------
*			Driver Code
*--------------------------------------
ZPIOCTL			.EQ ZPDRV
ZPBasePtr		.EQ ZPDRV+2
ZPBMShiftPtr	.EQ ZPDRV+4
ZPScrShiftPtr	.EQ ZPDRV+6
ZPBMDataPtr		.EQ ZPDRV+8
ZPBMMaskPtr		.EQ ZPDRV+10
ZPBMSavePtr		.EQ ZPDRV+12
*--------------------------------------
ZPTmpWord		.EQ ZPDRV+14
*--------------------------------------
LBUF.C1			.EQ ZPDRV+16
LBUF.C1.MASK	.EQ ZPDRV+17			Bits to CLR in VMEM : 11100000 00000000 00111111
LBUF.C1.DATA	.EQ ZPDRV+18			Bits to SET/ORA/XOR : 000ccccc cccccccc cc000000
LBUF.C2			.EQ ZPDRV+19					        				C1				  C2
LBUF.C2.MASK	.EQ ZPDRV+20
LBUF.C2.DATA	.EQ ZPDRV+21
*--------------------------------------
BLT.BMMaskPtr	.EQ ZPDRV+22
BLT.BMDataPtr	.EQ ZPDRV+24
BLT.BMBitOfs	.EQ ZPDRV+26
BLT.BMBitOfsL	.EQ ZPDRV+27
BLT.ScrBitOfs	.EQ ZPDRV+28
BLT.ScrColIdx	.EQ ZPDRV+29
BLT.CMASK		.EQ ZPDRV+30
*--------------------------------------
ZPTmpByte		.EQ ZPDRV+31
*--------------------------------------
DRV.CS.START	cld
				jmp (.1,x)
.1				.DA STATUS
				.DA A2osX.BADCALL
				.DA A2osX.BADCALL
				.DA A2osX.BADCALL
				.DA CONTROL
				.DA A2osX.BADCALL
				.DA OPEN
				.DA CLOSE
				.DA A2osX.BADCALL
				.DA WRITE
*--------------------------------------
J.Cmds			.DA SETPIXEL
				.DA GETPIXEL
				.DA HLINE
				.DA VLINE
				.DA FILLRECT
				.DA BITBLT
				.DA GETRECTBUFSIZE
*--------------------------------------
J.LBUF.DrawAtY	.DA LBUF.DrawAtY.XOR
				.DA LBUF.DrawAtY.SET
				.DA LBUF.DrawAtY.ORA
				.DA $ffff
				.DA LBUF.DrawAtY.AND.XOR
				.DA LBUF.DrawAtY.AND.SET
				.DA LBUF.DrawAtY.AND.ORA
L.SHIFT			.DA SHIFT.L1
				.DA SHIFT.L2
				.DA SHIFT.L3
				.DA SHIFT.L4
				.DA SHIFT.L5
				.DA SHIFT.L6
L.Color.Pixels	.DA Color.Pixels
				.DA 0					end or relocation
*--------------------------------------
STATUS			>STYA ZPIOCTL

				ldy #S.IOCTL.BUFPTR
				lda (ZPIOCTL),y
				sta ZPBasePtr
				iny 
				lda (ZPIOCTL),y
				sta ZPBasePtr+1

				ldy #S.IOCTL.STATCODE
				lda (ZPIOCTL),y
				beq .1
				cmp #S.IOCTL.STATCODE.GETDIB
				bne STATUS.DCB
				ldy #S.DIB-1
				.HS 2C					bit abs
.1				ldy #3
.2				lda DIB,y
				sta (ZPBasePtr),y
				dey
				bpl .2
				clc
				rts

STATUS.DCB		cmp #S.IOCTL.STATCODE.GETDCB
				bne STATUS.9

				ldy #S.DCB.GFX-1
.2				lda DCB,y
				sta (ZPBasePtr),y
				dey
				bpl .2

				clc
				rts
STATUS.9		lda #MLI.E.BADCTL
				sec
				rts
*--------------------------------------
OPEN			tax						DEV.ID in A

				lda #S.DIB.S.OPENED
				bit DIB+S.DIB.S
				bne CLOSE.IOE
	
				txa
				ldx #0
.10				ldy A2osX.SCRNDEVS,x
				beq .20
				inx
				cpx #K.SCR.MAX
				bne .10
				lda #E.OOH
				sec
				rts
.20				sta A2osX.SCRNDEVS,x
				sta DCB+S.DCB.GFX.DEVID

				lda #S.DIB.S.OPENED
				tsb DIB+S.DIB.S
				ldx #0
				ldy #0
.1				lda L.SHIFT,x				Get relocated LO BYTE
				sta Shift.L.LO,y
				inx

				lda L.SHIFT,x				Get relocated HI BYTE
				sta Shift.L.HI,y
				inx
				iny
				cpy #6
				bne .1
				ldx #0						SHIFT.L1 = SHIFT.R6 !!!
				ldy #5
.2				lda L.SHIFT,x				Get relocated LO BYTE
				sta Shift.R.LO,y
				inx

				lda L.SHIFT,x				Get relocated HI BYTE
				sta Shift.R.HI,y
				inx
				dey
				bpl .2
*--------------------------------------
CONTROL			lda DCB+S.DCB.GFX.DEVID		NON STANDARD
				cmp A2osX.ASCREEN
				beq .8
				sta A2osX.ASCREEN
				ldy #0

				bit DCB+S.DCB.GFX.S
				bpl .1					//c,EVE mode
				ldy #CONTROL.EVE-CONTROL.80C
.1				ldx CONTROL.80C,y
				beq .8					Ending 0
				sta $C000,x

				iny
				bra .1

.8				clc
				rts
CLOSE.IOE		lda #MLI.E.IO
				sec
				rts
*--------------------------------------
CLOSE			lda #S.DIB.S.OPENED
				bit DIB+S.DIB.S
				beq CLOSE.IOE
				trb DIB+S.DIB.S
				ldx #0
				lda DCB+S.DCB.GFX.DEVID
.1				cmp A2osX.SCRNDEVS,x
				bne .2

				stz A2osX.SCRNDEVS,x
.2				inx
				cpx #K.SCR.MAX
				bne .1
				clc
				rts
*--------------------------------------
WRITE			>STYA ZPIOCTL			NON STANDARD
				sta SET80STORE
				lda (ZPIOCTL)			Get Cmd

.1				tax
				ldy CB.CmdLen,x
.2				lda (ZPIOCTL),y
				sta CB.Cache,y
				dey
				bpl .2
.3				jsr .10
				clc
				rts
.10				jmp (J.Cmds,x)
*--------------------------------------
* IN:
* Y = LO
* A = HI
* OUT:
* A = DIV
* X = MOD
*--------------------------------------
DIVMOD7YA		dec
				bmi .2
				clc
				beq .1
				lda DIV7.512,y
				adc #$49
				ldx MOD7.512,y
				rts

.1				lda DIV7.256,y
				adc #$24
				ldx MOD7.256,y
				rts
.2				lda DIV7.0,y
				ldx MOD7.0,y
				rts
*--------------------------------------
* IN:
* Y,A = num1 (16)
* X = num2 (8)
* OUT:
* Y,A = (Y,A) * X
*--------------------------------------
YAMultX			stx ZPTmpByte

				sty ZPTmpWord
				sta ZPTmpWord+1
				ldy #0					Result LO
				tya						Result HI
				bra .3
.1				pha
				tya
				clc
				adc ZPTmpWord
				tay
				pla
				adc ZPTmpWord+1
.2				asl ZPTmpWord
				rol ZPTmpWord+1
.3				lsr ZPTmpByte
				bcs .1
				bne .2
				rts
*--------------------------------------
				.INB USR/SRC/DRV/DHGR.DRV.S.BLT
				.INB USR/SRC/DRV/DHGR.DRV.S.LBUF
				.INB USR/SRC/DRV/DHGR.DRV.S.LINE
				.INB USR/SRC/DRV/DHGR.DRV.S.PIX
				.INB USR/SRC/DRV/DHGR.DRV.S.RECT
*--------------------------------------
DRV.CS.END
*--------------------------------------
				.INB USR/SRC/DRV/DHGR.DRV.G
*--------------------------------------
CONTROL.80C		.DA #SETIOUDIS
				.DA #CLRTEXT
				.DA #SETHIRES
				.DA #CLR80DISP
				.DA #SETAN3
				.DA #CLRAN3
				.DA #SETAN3
				.DA #CLRAN3

				.DA #SET80DISP
				.DA #SETAN3
				.DA #CLRAN3
				.DA #SETAN3

				.DA #0
CONTROL.EVE		.DA #SETIOUDIS
				.DA #CLRTEXT
				.DA #SETHIRES
				.DA #HR1.OFF
				.DA #HR2.ON
				.DA #HR3.ON
				.DA #0
*--------------------------------------
Shift.L.LO		.BS 6
Shift.L.HI		.BS 6
Shift.R.LO		.BS 6
Shift.R.HI		.BS 6
*--------------------------------------
CB.CmdLen		.DA S.CB.Y1+1			SETPIXEL
				.DA S.CB.Y1+1			GETPIXEL
				.DA S.CB.X2+1			HLINE
				.DA S.CB.Y2+1			VLINE
				.DA S.CB.Y2+1			FILLRECT
				.DA S.CB.DstPtr+1		BITBLT
				.DA S.CB.DstPtr+1		GETRECTBUFSIZE
*--------------------------------------
CB.Cache		.BS S.CB
BM.Cache		.BS S.BM
*--------------------------------------
LBUF.MASK		.BS 81					81 because of sta LBUF.DATA+1,x!!!
LBUF.DATA		.BS 81
*--------------------------------------
DIB				.DA #0
				.DA #0,#0,#0
				>PSTR "Apple II DHGR"
				.BS 3
				.DA #S.DIB.T.GFX
				.DA #0
				.DA K.VER
*--------------------------------------
DCB				.DA #S.DCB.T.GFX
				.BS 1					DEV.ID
				.DA #0					S.DCB.GFX.S default to 0
				.DA #S.CB.M.MONO+S.CB.M.C16	F
				.DA 560					W
				.DA 192					H
*--------------------------------------
DRV.END
				.LIST ON
DRV.CS.SIZE		.EQ DRV.CS.END-DRV.CS.START
DRV.SIZE		.EQ DRV.END-DRV.CS.START
				.LIST OFF
MAN
SAVE USR/SRC/DRV/DHGR.DRV.S
ASM
