PR#3 PREFIX /A2OSX.SRC NEW INC 1 AUTO 6 .LIST OFF .OP 65C02 .OR $2000 .TF /A2OSX.BOOT/DRV/DHGR.DRV *-------------------------------------- .INB /A2OSX.DEV/INC/MACROS.I .INB /A2OSX.DEV/INC/A2OSX.I .INB /A2OSX.DEV/INC/IO.I .INB /A2OSX.DEV/INC/LIBGFX.I *-------------------------------------- ZPBase .EQ ZPDRV ZPShiftLo .EQ ZPDRV+2 ZPShiftHi .EQ ZPDRV+4 ZPCtrlBlk .EQ ZPDRV+8 limited to 8 bytes for now...have to modify kernel *-------------------------------------- * 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 DEV.HEADER-CS.START Device Header Offset .DA DRV.CS.START-CS.START Driver Code Offset .DA DRV.CS.END-DRV.CS.START Drv Code Length *-------------------------------------- * Relocation Table *-------------------------------------- L.MSG.DETECT .DA MSG.DETECT .DA 0 End Of Reloc Table *-------------------------------------- Dev.Detect >LDYA L.MSG.DETECT >SYSCALL CPrintFYA ldx #0 .1 txa stz Shift0.hi,x asl rol Shift0.hi,x lsr sta Shift0.lo,x inx bpl .1 ldx #0 .2 lda Shift0.hi,x sta Shift1.hi,x lda Shift0.lo,x asl asl rol Shift1.hi,x lsr sta Shift1.lo,x inx bpl .2 ldx #0 .3 lda Shift1.hi,x sta Shift2.hi,x lda Shift1.lo,x asl asl rol Shift2.hi,x lsr sta Shift2.lo,x inx bpl .3 ldx #0 .4 lda Shift2.hi,x sta Shift3.hi,x lda Shift2.lo,x asl asl rol Shift3.hi,x lsr sta Shift3.lo,x inx bpl .4 ldx #0 .5 lda Shift3.hi,x sta Shift4.hi,x lda Shift3.lo,x asl asl rol Shift4.hi,x lsr sta Shift4.lo,x inx bpl .5 ldx #0 .6 lda Shift4.hi,x sta Shift5.hi,x lda Shift4.lo,x asl asl rol Shift5.hi,x lsr sta Shift5.lo,x inx bpl .6 ldx #0 .7 lda Shift5.hi,x sta Shift6.hi,x lda Shift5.lo,x asl asl rol Shift6.hi,x lsr sta Shift6.lo,x inx bpl .7 clc rts CS.END MSG.DETECT >CSTR "\nApple IIe/IIc DHGR Driver.\n" *-------------------------------------- * Device Header (16 Bytes) *-------------------------------------- DEV.HEADER cld jmp (DRV.CS.START,x) .HS 00 DevID .DA #S.DEV.F.EVENT >PSTR "GFX" NAME .HS 00 NAME must Be 5 bytes long .HS 00 .HS 00.00.00.00 *-------------------------------------- * Driver Code *-------------------------------------- DRV.CS.START .DA OPEN .DA GETEVENT .DA COUT .DA CLOSE .DA GETINFO .DA IRQ .DA SELECT .DA SETPIXEL .DA GETPIXEL .DA HLINE .DA VLINE .DA BITBLT .DA FILLREC .DA SETCURPOS .DA SETCUR .DA HIDECUR .DA SHOWCUR L.DEVINFO .DA DEVINFO L.DIV7.0 .DA DIV7.0 L.MOD7.0 .DA MOD7.0 L.Shift0.Lo .DA Shift0.lo L.Shift0.Hi .DA Shift0.hi .DA 0 end or relocation *-------------------------------------- OPEN ldy #S.DEV.ID lda (pDev),y sta A2osX.SCRNDEVS+2 lda #3 sta A2osX.ASCREEN jsr SELECT lda L.DIV7.0+1 sta DIV7.hi inc sta DIV7.hi+1 inc sta DIV7.hi+2 ldy #0 ldx #0 .1 lda L.MOD7.0,y sta MOD7.lo,x iny lda L.MOD7.0,y sta MOD7.hi,x iny inx cpx #3 bne .1 ldx #7 lda L.Shift0.Lo+1 .10 sta Shiftlo.hi,x inc dex bne .10 ldx #7 lda L.Shift0.hi+1 .11 sta Shifthi.hi,x inc dex bne .11 .8 clc rts *-------------------------------------- GETEVENT lda A2osX.ASCREEN cmp #3 is HGR1 screen active? bne .9 no....exit .9 lda #0 Error = no event sec rts *-------------------------------------- COUT IRQ sec rts *-------------------------------------- CLOSE clc rts *-------------------------------------- GETINFO >LDYA L.DEVINFO clc rts *-------------------------------------- SELECT sta CLRTEXT sta CLRMIXED sta SETHIRES sta CLR80STORE sta CLRPAGE2 sta SETIOUDIS sta SETDHIRES * sta CLR80DISP * sta SETDHIRES * sta CLRDHIRES * sta SET80DISP * sta SETDHIRES * sta CLRDHIRES * sta SETDHIRES clc rts *-------------------------------------- * SETPIXEL * In : YA = Ptr to CtrlBlk : * 0 : X * 2 : Y * 4 : Mode * 00000000=xor * 00000001=b/w (1 bit/pixel) * 00000100=16 colors (4 bits/pixel) * 00001000=256 colors (8 bits/pixel) * 5 : Color *-------------------------------------- SETPIXEL >STYA ZPBase ldy #5 .1 lda (ZPBase),y sta ZPCtrlBlk,y dey bpl .1 sta SET80STORE lda ZPCtrlBlk+4 bit #%00000100 bne .7 *-----B&W ----------------------------- ldx ZPCtrlBlk+1 X.HI lda DIV7.hi,x sta .2+2 lda MOD7.lo,x sta .4+1 lda MOD7.hi,x sta .4+2 ldx ZPCtrlBlk X.LO .2 lda DIV7.0,x A=Col*2+AuxBit eor #1 toggle last bit : 0=Aux, 1=Main lsr .3+1 reset CLRPAGE2 address lsr CS=Aux rol .3+1 if CS, -> SETPAGE2 .3 sta CLRPAGE2 adc BASEL,y setup line Base Ptr (A=Col) sta ZPBase lda BASEH,y sta ZPBase+1 .4 ldy MOD7.0,x x = X.LO dec ZPCtrlBlk+4 get mode bne .5 lda (ZPBase) Mode=0, XOR eor Mono.Masks,y y = mod 7 sta (ZPBase) sta CLR80STORE rts .5 lda (ZPBase) ldx ZPCtrlBlk+5 mode=1, get color bne .6 and Mono.NMasks,y includes And $7F for mono sta (ZPBase) sta CLR80STORE rts .6 and #$7F switch back this byte to mono ora Mono.Masks,y sta (ZPBase) sta CLR80STORE rts *-----16 Colors ----------------------- .7 lda ZPCtrlBlk X.LO lsr ZPCtrlBlk+1 divide by 4 ror lsr ZPCtrlBlk+1 ror tay Y=CX/4 (range 0->139) lda DIV7.0,y A=CX/4/7 (range 0->19) asl times 2 (range 0->38) ldx ZPCtrlBlk+2 adc BASEL,x setup line Base Ptr (cc by asl) sta ZPBase ZPBase now point to first of... lda BASEH,x sta ZPBase+1 ...the 4 columns lda MOD7.0,y get MOD asl times 4 to compute index in MASK tables asl tax set in X for Masks,NMasks lda ZPCtrlBlk+5 get COLOR asl times 4 to compute index in PIXELS table asl tay lda Color.Masks,x bits in 1st byte to light? beq .10 and Color.Pixels,y apply color sta GBYTE sta SETPAGE2 lda (ZPBase) and Color.NMasks,x reset existing pixel, ora GBYTE sta (ZPBase) .10 inx iny lda Color.Masks,x beq .11 and Color.Pixels,y apply color sta GBYTE sta CLRPAGE2 lda (ZPBase) and Color.NMasks,x reset existing pixel, ora GBYTE sta (ZPBase) .11 inc ZPBase inx iny lda Color.Masks,x beq .12 and Color.Pixels,y apply color sta GBYTE sta SETPAGE2 lda (ZPBase) and Color.NMasks,x reset existing pixel, ora GBYTE sta (ZPBase) .12 inx iny lda Color.Masks,x beq .13 and Color.Pixels,y apply color sta GBYTE sta CLRPAGE2 lda (ZPBase) and Color.NMasks,x reset existing pixel, ora GBYTE sta (ZPBase) .13 sta CLR80STORE rts *-------------------------------------- GETPIXEL rts *-------------------------------------- HLINE rts *-------------------------------------- VLINE rts *-------------------------------------- FILLREC rts *-------------------------------------- * BitBlt * In : YA = Ptr to CtrlBlk : * 0 : Operation * %00000001 : Save * %00000010 : Replace * %00000100 : AND with Src BitMask * %00001000 : ORA with Src BitMap * %00010000 : XOR * 2 : SavePTR * 4 : SrcAX * 6 : SrcAY * 8 : SrcBX * 10 : SrcBY * 12 : DestX * 14 : DestY * 16 : BM Struct *-------------------------------------- BITBLT >STYA ZPCtrlBlk lda (ZPCtrlBlk) clc rts *-------------------------------------- * Y,A = pPoint *-------------------------------------- SETCURPOS >STYA ZPBase ldy #3 .1 lda (ZPBase),y sta CUR.X,y dey bpl .1 bit CUR.State bpl .2 jsr HIDECUR.I jsr SHOWCUR.I .2 clc rts *-------------------------------------- * Y,A = pCur *-------------------------------------- SETCUR >STYA ZPBase ldy #S.CUR-1 .1 lda (ZPBase),y sta CUR.Buf,y dey bpl .1 bit CUR.State bpl .2 jsr HIDECUR.I jsr SHOWCUR.I .2 clc rts *-------------------------------------- SHOWCUR bit CUR.State bpl SHOWCUR.I clc rts SHOWCUR.I sta SET80STORE ldx CUR.X+1 lda DIV7.hi,x sta .71+2 lda MOD7.hi,x sta .72+2 ldx CUR.X .71 lda DIV7.0,x lsr sta SB.StartCol lda #0 sbc #0 sta SB.StartPage .72 ldy MOD7.0,x lda Shiftlo.Hi,y sta ZPShiftLo+1 lda ShiftHi.Hi,y sta ZPShiftHi+1 lda L.Shift0.Lo sta ZPShiftLo lda L.Shift0.hi sta ZPShifthi lda CUR.Y sta CY ldx #0 index to CUR data/mask .1 ldy CY lda BaseL,y clc adc SB.StartCol sta ZPBase lda BaseH,y sta ZPBase+1 lda SB.StartPage sta SB.Page lda SB.Page tay eor #1 sta SB.Page sta CLRPAGE2,y lda (ZPBase) ldy CUR.Buf+S.CUR.MASK,x and (ZPShiftLo),y ldy CUR.Buf+S.CUR.DATA,x ora (ZPShiftLo),y sta (ZPBase) lda SB.Page tay eor #1 sta SB.Page sta CLRPAGE2,y beq .3 inc ZPBase .3 lda (ZPBase) ldy CUR.Buf+S.CUR.MASK,x and (ZPShiftHi),y ldy CUR.Buf+S.CUR.DATA,x ora (ZPShiftHi),y inx ldy CUR.Buf+S.CUR.MASK,x and (ZPShiftLo),y ldy CUR.Buf+S.CUR.DATA,x ora (ZPShiftLo),y sta (ZPBase) lda SB.Page tay eor #1 sta SB.Page sta CLRPAGE2,y beq .4 inc ZPBase .4 lda (ZPBase) ldy CUR.Buf+S.CUR.MASK,x and (ZPShiftHi),y ldy CUR.Buf+S.CUR.DATA,x ora (ZPShiftHi),y sta (ZPBase) inx cpx #32 bne .1 sta CLR80STORE sec ror CUR.State SHOWCUR.RTS clc rts *-------------------------------------- HIDECUR bit CUR.State bpl HIDECUR.RTS HIDECUR.I clc ror CUR.State HIDECUR.RTS clc rts *-------------------------------------- DRV.CS.END *-------------------------------------- Shift0.lo .BS 128 Shift0.hi .BS 128 Shift1.lo .BS 128 Shift1.hi .BS 128 Shift2.lo .BS 128 Shift2.hi .BS 128 Shift3.lo .BS 128 Shift3.hi .BS 128 Shift4.lo .BS 128 Shift4.hi .BS 128 Shift5.lo .BS 128 Shift5.hi .BS 128 Shift6.lo .BS 128 Shift6.hi .BS 128 *-------------------------------------- .INB DRV/DHGR.DRV.T *-------------------------------------- DIV7.hi .BS 3 MOD7.lo .BS 3 MOD7.hi .BS 3 Shiftlo.hi .BS 7 Shifthi.hi .BS 7 *-------------------------------------- CX .BS 2 CY .BS 1 COL .BS 1 GBYTE .BS 1 *-------------------------------------- CUR.State .BS 1 CUR.X .BS 2 CUR.Xdiv7 .BS 1 CUR.Xmod7 .BS 1 CUR.Y .BS 2 CUR.Buf .BS S.CUR CUR.SaveCol .BS 1 CUR.SaveColCnt .BS 1 CUR.SaveRow .BS 1 CUR.SaveRowCnt .BS 1 CUR.SaveBuf .BS 3*16 MAX 3 bytes*16 rows SB.StartPage .BS 1 SB.Page .BS 1 SB.StartCol .BS 1 SB.Col .BS 1 *-------------------------------------- DEVINFO .DA #S.DEVINFO.TYPE.GFX type of DEVINFO STRUCT DEVINFO.MODES .DA #%10000011 XOR,16 & B/W DEVINFO.W .DA 560 X.SIZE DEVINFO.H .DA 192 Y.SIZE .LIST ON *-------------------------------------- DRV.SIZE .EQ *-DRV.CS.START *-------------------------------------- .LIST OFF MAN SAVE DRV/DHGR.DRV.S ASM