NEW
  AUTO 3,1
				.LIST OFF
				.OP	65C02
				.OR $2000
				.TF drv/dhgr.drv
*--------------------------------------
				.INB inc/macros.i
				.INB inc/a2osx.i
				.INB inc/kernel.i
				.INB inc/mli.i
				.INB inc/mli.e.i
				.INB inc/io.i
				.INB inc/gfx.i
				.INB inc/gfx.eve.i
*--------------------------------------
				.MA X2PageY
				txa
				lsr
				ldy #IO.SETPAGE2		col 0,2,4...in AUX mem
				bcc :1					col 1,3,5...in MAIN mem

				dey						CLRPAGE2

:1				sta $C000,y

				tay
				.EM
*--------------------------------------
ZPPtr1			.EQ ZPBIN
ZPPtr2			.EQ ZPBIN+2
ZPPtr3			.EQ ZPBIN+4
*--------------------------------------
*			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
*--------------------------------------
L.OSD			.DA OSD
				.DA 0					End Of Reloc Table
*--------------------------------------
Dev.Detect		>LDYA L.MSG.DETECT
				>SYSCALL PutS
				lda A2osX.HWT
				cmp #A2osX.HWT.IIc
				bcc .1

*				stz DCB+S.DCB.GFX.S		//c : 80c Mode
				>LDYA L.MSG.DETECT.IIC
				bra .3

.1				php
				sei
				sta IO.SET80STORE
				sta IO.SETPAGE2
				ldx $400				Save Aux $400
				lda #$ff				Make sure !=1 for comparing later
				sta $400

				sta IO.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 IO.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 IO.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

				jsr DrvReloc

				>PUSHW L.FD.DEV
				>PUSHW L.FD.DEV.NAME
				>SYSCALL MKDev
				bcs .9

				php
				sei
				>LDYAI $4000
				>STYA $800
				sta IO.SETWRITEAUX
				>STYA $800
				sta IO.CLRWRITEAUX

				jsr ClrScr

				jsr OSD.install

				plp

.9				rts
*--------------------------------------
DrvReloc		lda FD.DEV+S.FD.DEV.DRVPTR
				sec
				sbc #DRV.CS.START
				sta ZPPtr1

				lda FD.DEV+S.FD.DEV.DRVPTR+1
				sbc /DRV.CS.START
				sta ZPPtr1+1

				lda ZPPtr1
				clc
				adc #Shift.L.LO
				sta ZPPtr2

				lda ZPPtr1+1
				adc /Shift.L.LO+1
				sta ZPPtr2+1

				lda ZPPtr1
				clc
				adc #Shift.L.HI
				sta ZPPtr3

				lda ZPPtr1+1
				adc /Shift.L.HI+1
				sta ZPPtr3+1

				ldy #5

.1				lda (ZPPtr2),y
				clc
				adc ZPPtr1
				sta (ZPPtr2),y

				lda (ZPPtr3),y
				adc ZPPtr1+1
				sta (ZPPtr3),y

				dey
				bpl .1

				lda ZPPtr1
				clc
				adc #Shift.R.LO
				sta ZPPtr2

				lda ZPPtr1+1
				adc /Shift.R.LO+1
				sta ZPPtr2+1

				lda ZPPtr1
				clc
				adc #Shift.R.HI
				sta ZPPtr3

				lda ZPPtr1+1
				adc /Shift.R.HI+1
				sta ZPPtr3+1

				ldy #5

.2				lda (ZPPtr2),y
				clc
				adc ZPPtr1
				sta (ZPPtr2),y

				lda (ZPPtr3),y
				adc ZPPtr1+1
				sta (ZPPtr3),y

				dey
				bpl .2

				rts
*--------------------------------------
OSD.install		>LDYA L.OSD
				>STYA ZPPtr1

				>LDYAI X.OSD
				>STYA ZPPtr2

				lda /X.OSD.LEN
				eor #$ff
				pha

				lda #X.OSD.LEN
				eor #$ff
				tax

				ldy #0

				sta IO.SETWRITEAUX

.1				inx
				bne .2

				pla
				inc
				beq .3

				pha

.2				lda (ZPPtr1),y
				sta (ZPPtr2),y

				iny
				bne .1

				inc ZPPtr1+1
				inc ZPPtr2+1
				bra .1

.3				sta IO.CLRWRITEAUX
				rts
*--------------------------------------
ClrScr			lda #$55

				ldx #0

				sta IO.SETHIRES
				sta IO.SET80STORE

.1				ldy BASEL,x
				sty ZPPtr1
				ldy BASEH,x
				sty ZPPtr1+1

				sta IO.SETPAGE2
				jsr .2

				eor #$7F

				sta IO.CLRPAGE2
				jsr .2

				inx
				cpx #192
				bne .1

				rts

.2				ldy #39

.3				sta (ZPPtr1),y
				dey
				bpl .3

				rts
*--------------------------------------
CS.END
MSG.DETECT		.AZ "Apple IIe/IIc DHGR Driver."
MSG.DETECT.IIC	.AZ "Apple //c,IIgs : '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 $ffff
				.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.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.S
				lda (ZPIOCTL),y
				beq .1
				cmp #S.IOCTL.S.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.S.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

				lda A2osX.SCRNDEVS+9
				beq .1

				lda #E.OOH
				sec
				rts

.1				stx A2osX.SCRNDEVS+9
				stx DCB+S.DCB.GFX.DEVID

				lda #S.DIB.S.OPENED
				tsb DIB+S.DIB.S
*--------------------------------------
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

				stz A2osX.SCRNDEVS+9

				clc
				rts
*--------------------------------------
WRITE			>STYA ZPIOCTL			NON STANDARD

				lda (ZPIOCTL)			Get Cmd
				bmi .2

				pha

				lsr
				tax
				ldy CB.CmdLen-1,x

.1				lda (ZPIOCTL),y
				sta CB.Cache,y
				dey
				bpl .1

				plx
				jmp (J.Cmds-2,x)

.2				sta IO.SETWRITEAUX

				and #$7f
				sta CBX.Cache

				lsr
				tax
				ldy CB.CmdLen-1,x

.3				lda (ZPIOCTL),y
				sta CBX.Cache,y
				dey
				bne .3

				sta IO.SETREADAUX
				jsr X.OSD
				sta IO.CLRREADAUX
				sta IO.CLRWRITEAUX
				rts
*--------------------------------------
* 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 #IO.SETIOUDIS
				.DA #IO.CLRTEXT
*				.DA #IO.SETHIRES

				.DA #IO.CLR80DISP
				.DA #IO.SETAN3
				.DA #IO.CLRAN3
				.DA #IO.SETAN3
				.DA #IO.CLRAN3

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

				.DA #0

CONTROL.EVE		.DA #IO.SETIOUDIS
				.DA #IO.CLRTEXT
*				.DA #IO.SETHIRES
				.DA #HR1.OFF
				.DA #HR2.ON
				.DA #HR3.ON

				.DA #0
*--------------------------------------
Shift.L.LO		.DA #SHIFT.L1
				.DA #SHIFT.L2
				.DA #SHIFT.L3
				.DA #SHIFT.L4
				.DA #SHIFT.L5
				.DA #SHIFT.L6
Shift.L.HI		.DA /SHIFT.L1
				.DA /SHIFT.L2
				.DA /SHIFT.L3
				.DA /SHIFT.L4
				.DA /SHIFT.L5
				.DA /SHIFT.L6
Shift.R.LO		.DA #SHIFT.L6
				.DA #SHIFT.L5
				.DA #SHIFT.L4
				.DA #SHIFT.L3
				.DA #SHIFT.L2
				.DA #SHIFT.L1
Shift.R.HI		.DA /SHIFT.L6
				.DA /SHIFT.L5
				.DA /SHIFT.L4
				.DA /SHIFT.L3
				.DA /SHIFT.L2
				.DA /SHIFT.L1
*--------------------------------------
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
				.DA #S.CB.TxtPtr+1		DRAWTEXT
				.DA #S.CB.TxtPtr+1		GETTEXTSIZE
*--------------------------------------
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
*LBUF.MASK		.EQ $240
*LBUF.DATA		.EQ $2A0
*--------------------------------------
DIB				.DA #0
				.DA #0,#0,#0
				.PS "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
*--------------------------------------
OSD				.PH $1000
				.INB usr/src/drv/dhgr.drv.s.osd
				.EP
*--------------------------------------
				.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
