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