NEW
PREFIX
AUTO 4,1
				.LIST OFF	
				.OP	65C02
				.OR $2000
				.TF DRV/GUI/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 ZPDRV
*--------------------------------------
*			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
				
				lda #$80
				sta DCB+S.DCB.GFX.S		$80=//c
				
				>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
				
				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
				>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 #191
				lda #0
				
.4				ldy BASEL,x
				sty ZPPtr
				ldy BASEH,x
				sty ZPPtr+1
				
				sta SETPAGE2
	
				ldy #39
				
.5				sta (ZPPtr),y
				dey
				bpl .5

				sta CLRPAGE2
	
				ldy #39
				
.6				sta (ZPPtr),y
				dey
				bpl .6
				
				dex
				bpl .4
				rts
*--------------------------------------
CS.END
MSG.DETECT		.AZ "Apple IIe/IIc DHGR Driver."
MSG.DETECT.IIC	.AZ "Apple //c detected, Assuming 'Le Chat Mauve' Mode."
MSG.DETECT.EVE	.AZ "'Le Chat Mauve EVE' Board Detected."
MSG.DETECT.80C	.AZ "No Specific H/W Found, Assuming 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			ldx #0					DEV.ID in A

.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 #1
				
.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
				cpx #12
				bne .1
				
				ldx #0						SHIFT.L1 = SHIFT.R6 !!!
				ldy #6
				
.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
				bne .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
				bmi .1					//c,EVE mode
				
				ldy #CONTROL.LCM-CONTROL.80C
				
.1				ldx CONTROL.SWTCHES,y
				bmi .8					Ending $ff
				
				sta $C000,x

				iny
				bra .1
.8
*--------------------------------------
CLOSE			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.SWTCHES
*				sta CLRTEXT
*				sta CLRMIXED
*				sta SETHIRES
*				sta CLR80STORE
*				sta CLRPAGE2
*				sta SETIOUDIS

CONTROL.80C
*				sta CLRMIXED	    	STA $CO52        ;Full Screen
*				sta SETHIRES	    	STA $C057        ;HIRES
*				sta CLRTEXT			    STA $C050        ;Graphics
*				sta CLR80DISP		    STA $C00C        ;80 Columns OFF
*				sta SETDHIRES		    STA $C05E        ;AN3 OFF
*				sta CLRDHIRES		    STA $C05F        ;AN3 ON
*				sta SETDHIRES		    STA $C05E        ;AN3 OFF
*				sta CLRDHIRES		    STA $C05F        ;AN3 ON
*				sta SET80DISP			STA $C00D        ;80 Columns ON
*				sta SETDHIRES		    STA $C05E        ;AN3 OFF
*				sta CLRDHIRES		    STA $C05F        ;AN3 ON
*				sta SETDHIRES		    STA $C05E        ;AN3 OFF

				.DA #CLRTEXT
*				.DA #CLRMIXED
				.DA #SETHIRES
*				.DA #CLR80STORE
*				.DA #CLRPAGE2
				.DA #SETIOUDIS

				.DA #CLR80DISP
				.DA #SETDHIRES
				.DA #CLRDHIRES
				.DA #SETDHIRES
				.DA #CLRDHIRES
				.DA #SET80DISP
				.DA #SETDHIRES
				.DA #CLRDHIRES
				.DA #SETDHIRES
				.DA #$FF
				
CONTROL.LCM
*				sta	CLRTEXT
*				sta CLRPAGE2
*               sta CLRMIXED
*               sta SETHIRES
*               sta CLRAN2
*               sta CLR80DISP
*               sta SETDHIRES
*               sta CLRDHIRES
*               sta SET80DISP
*               sta SETDHIRES
*               sta CLRDHIRES
*               sta SETDHIRES

				.DA #CLRTEXT
*				.DA #CLRMIXED
				.DA #SETHIRES
*				.DA #CLR80STORE
*				.DA #CLRPAGE2
				.DA #SETIOUDIS

				.DA #CLRAN2
				.DA #CLR80DISP
				.DA #SETDHIRES
				.DA #CLRDHIRES
				.DA #SET80DISP
				.DA #SETDHIRES
				.DA #CLRDHIRES
				.DA #SETDHIRES
				.DA #$ff
*--------------------------------------
Shift.L.LO		.BS 7
Shift.L.HI		.BS 7
Shift.R.LO		.BS 7
Shift.R.HI		.BS 7
*--------------------------------------
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
				.BS 1					STATUS
				.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
