From d0d356419ff4fcaebe139395d7050220c1a9c90d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?R=C3=A9my=20GIBERT?= Date: Fri, 9 Jun 2017 17:36:05 +0200 Subject: [PATCH] Kernel version 0.9 : Cleanup in DHGR stuff, adding primitives (DrawLine,....etc...) --- DRV/DHGR.DRV.S.txt | 308 +++++++++++++--------------------------- Floppies/A2OSX.BOOT.po | Bin 143360 -> 143360 bytes Floppies/A2OSX.BUILD.po | Bin 819200 -> 819200 bytes Floppies/A2OSX.SRC.po | Bin 819200 -> 819200 bytes INC/A2osX.I.txt | 3 +- INC/LIBGFX.I.txt | 49 ++++++- LIB/LIBGFX.S.txt | 186 +++++++++++++++++++++++- SBIN/DESKTOP.S.txt | 67 ++++++--- 8 files changed, 365 insertions(+), 248 deletions(-) diff --git a/DRV/DHGR.DRV.S.txt b/DRV/DHGR.DRV.S.txt index 7b3ecff4..2e88a6b8 100644 --- a/DRV/DHGR.DRV.S.txt +++ b/DRV/DHGR.DRV.S.txt @@ -17,7 +17,6 @@ AUTO 6 ZPBase .EQ ZPDRV ZPShiftLo .EQ ZPDRV+2 ZPShiftHi .EQ ZPDRV+4 -ZPCtrlBlk .EQ ZPDRV+8 *-------------------------------------- * File Header (16 Bytes) *-------------------------------------- @@ -153,12 +152,8 @@ DRV.CS.START .DA STATUS .DA GETPIXEL .DA HLINE .DA VLINE + .DA FILLRECT .DA BITBLT - .DA FILLREC - .DA SETCURPOS - .DA SETCUR - .DA HIDECUR - .DA SHOWCUR *-------------------------------------- L.STAT .DA STAT L.DIV7.0 .DA DIV7.0 @@ -241,29 +236,26 @@ CLOSE clc *-------------------------------------- * 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 +* 1 : OP (XOR only) +* 2 : Mode +* 3 : Color +* 4 : SrcX1 +* 6 : SrcY1 *-------------------------------------- SETPIXEL >STYA ZPBase - ldy #5 + ldy #S.CB.Y1 Skip S.CB.Y1+1.....always 0 .1 lda (ZPBase),y - sta ZPCtrlBlk,y + sta CB.Cache,y dey bpl .1 sta SET80STORE - lda ZPCtrlBlk+4 - bit #%00000100 - bne .7 -*-----B&W ----------------------------- - ldx ZPCtrlBlk+1 X.HI + lda CB.Cache+S.CB.MODE + bit #S.CB.MODE.C16 + bne SETPIXEL.C16 +*---- MONO ---------------------------- + ldx CB.Cache+S.CB.X1+1 lda DIV7.hi,x sta .2+2 @@ -272,7 +264,7 @@ SETPIXEL >STYA ZPBase lda MOD7.hi,x sta .4+2 - ldx ZPCtrlBlk X.LO + ldx CB.Cache+S.CB.X1 .2 lda DIV7.0,x A=Col*2+AuxBit eor #1 toggle last bit : 0=Aux, 1=Main @@ -281,6 +273,8 @@ SETPIXEL >STYA ZPBase rol .3+1 if CS, -> SETPAGE2 .3 sta CLRPAGE2 + ldy CB.Cache+S.CB.Y1 + adc BASEL,y setup line Base Ptr (A=Col) sta ZPBase lda BASEH,y @@ -288,10 +282,10 @@ SETPIXEL >STYA ZPBase .4 ldy MOD7.0,x x = X.LO - dec ZPCtrlBlk+4 get mode - bne .5 + lda CB.Cache+S.CB.OP + beq .5 - lda (ZPBase) Mode=0, XOR + lda (ZPBase) XOR eor Mono.Masks,y y = mod 7 sta (ZPBase) @@ -299,7 +293,7 @@ SETPIXEL >STYA ZPBase rts .5 lda (ZPBase) - ldx ZPCtrlBlk+5 mode=1, get color + ldx CB.Cache+S.CB.COLOR get color bne .6 and Mono.NMasks,y includes And $7F for mono @@ -313,17 +307,17 @@ SETPIXEL >STYA ZPBase sta CLR80STORE rts *-----16 Colors ----------------------- -.7 lda ZPCtrlBlk X.LO - lsr ZPCtrlBlk+1 divide by 4 +SETPIXEL.C16 lda CB.Cache+S.CB.X1 + lsr CB.Cache+S.CB.X1+1 divide by 4 ror - lsr ZPCtrlBlk+1 + lsr CB.Cache+S.CB.X1+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 + ldx CB.Cache+S.CB.Y1 adc BASEL,x setup line Base Ptr (cc by asl) sta ZPBase ZPBase now point to first of... lda BASEH,x @@ -335,7 +329,7 @@ SETPIXEL >STYA ZPBase asl tax set in X for Masks,NMasks - lda ZPCtrlBlk+5 get COLOR + lda CB.Cache+S.CB.COLOR asl times 4 to compute index in PIXELS table asl @@ -402,187 +396,86 @@ SETPIXEL >STYA ZPBase .13 sta CLR80STORE rts *-------------------------------------- +* GETPIXEL +*-------------------------------------- GETPIXEL rts *-------------------------------------- -HLINE rts +* HLINE X1,X2 at Y1 *-------------------------------------- -VLINE rts +HLINE >STYA ZPBase + ldy #S.CB.X2+1 + +.1 lda (ZPBase),y + sta CB.Cache,y + dey + bpl .1 + + lda CB.Cache+S.CB.MODE + bit #S.CB.MODE.C16 + bne HLINE.C16 +*----- MONO --------------------------- + + + +HLINE.C16 + rts *-------------------------------------- -FILLREC rts +* VLINE Y1,Y2 at X1 +*-------------------------------------- +VLINE >STYA ZPBase + ldy #S.CB.Y2 + +.1 lda (ZPBase),y + sta CB.Cache,y + dey + bpl .1 + +VLINE.I + + rts +*-------------------------------------- +* FILLRECT +* 2 : Mode +* 3 : Color +* 4 : SrcX1 +* 6 : SrcY1 +* 8 : SrcX2 +* 10 : SrcY2 +*-------------------------------------- +FILLRECT >STYA ZPBase + ldy #S.CB.Y2 + +.1 lda (ZPBase),y + sta CB.Cache,y + dey + bpl .1 + + +.2 jsr VLINE.I + + lda CB.Cache+S.CB.Y1 + cmp CB.Cache+S.CB.Y2 + beq .8 + + inc CB.Cache+S.CB.Y1 + bra .2 +.8 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 +* 1 : OP +* 4 : SrcX1 +* 6 : SrcY1 +* 8 : SrcX2 +* 10 : SrcY2 * 12 : DestX * 14 : DestY -* 16 : BM Struct +* 16 : BM Struct Ptr +* 18 : Save Ptr *-------------------------------------- -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 - +BITBLT >STYA ZPBase 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 @@ -610,22 +503,13 @@ MOD7.hi .BS 3 Shiftlo.hi .BS 7 Shifthi.hi .BS 7 *-------------------------------------- +CB.Cache .BS S.CB +*-------------------------------------- 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 @@ -639,7 +523,7 @@ STAT .DA #0 .DA #0 .DA $0900 *-------------------------------------- -DEVSTAT.MODES .DA #%10000011 XOR,16 & B/W +DEVSTAT.MODES .DA #S.CB.MODE.MONO+S.CB.MODE.C16 DEVSTAT.W .DA 560 X.SIZE DEVSTAT.H .DA 192 Y.SIZE *-------------------------------------- diff --git a/Floppies/A2OSX.BOOT.po b/Floppies/A2OSX.BOOT.po index 3c35821c2c52297e035e1776b0070a7287d684ba..b48d249c42851392877e3c2b905f9107cedd07e0 100644 GIT binary patch delta 4367 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 TC-isD59Ozus4AO*|CajlqYvZJ)WrTyR3a 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 Uk5%fiM)p{vdaQ=6*66nX2gzyW+yDRo diff --git a/INC/A2osX.I.txt b/INC/A2osX.I.txt index a3229963..ec485271 100644 --- a/INC/A2osX.I.txt +++ b/INC/A2osX.I.txt @@ -373,7 +373,8 @@ DEVMGR.GFX.SETPIXEL .EQ 22 DEVMGR.GFX.GETPIXEL .EQ 24 DEVMGR.GFX.HLINE .EQ 26 DEVMGR.GFX.VLINE .EQ 28 -DEVMGR.GFX.BITBLT .EQ 30 +DEVMGR.GFX.FILLRECT .EQ 30 +DEVMGR.GFX.BITBLT .EQ 32 *-------------------------------------- S.DEVSTAT.S .EQ 0 S.DEVSTAT.S.BLOCK .EQ %10000000 diff --git a/INC/LIBGFX.I.txt b/INC/LIBGFX.I.txt index 2766984c..2882ec52 100644 --- a/INC/LIBGFX.I.txt +++ b/INC/LIBGFX.I.txt @@ -6,6 +6,41 @@ AUTO 6 .LIST OFF .OP 65C02 *-------------------------------------- +S.CB.hDC .EQ 0 +S.CB.OP .EQ 1 +S.CB.OP.SAVE .EQ %00000001 +S.CB.OP.REPLACE .EQ %00000010 +S.CB.OP.AND .EQ %00000100 +S.CB.OP.ORA .EQ %00001000 +S.CB.OP.XOR .EQ %00010000 +S.CB.MODE .EQ 2 +S.CB.MODE.MONO .EQ %00000001 b/w (1 bit/pixel) +*S.CB.MODE.C4 .EQ %00000010 +*S.CB.MODE.C8 .EQ %00000100 +S.CB.MODE.C16 .EQ %00001000 16 colors (4 bits/pixel) +S.CB.MODE.C256 .EQ %00010000 256 colors (8 bits/pixel) +S.CB.COLOR .EQ 3 +S.CB.X1 .EQ 4 +S.CB.Y1 .EQ 6 +S.CB.X2 .EQ 8 +S.CB.Y2 .EQ 10 +S.CB.DestX .EQ 12 +S.CB.DestY .EQ 14 +S.CB.SrcPtr .EQ 16 +S.CB.DstPtr .EQ 18 +* +S.CB .EQ 20 +*-------------------------------------- +S.DC.hDev .EQ 0 +S.DC.hMem .EQ 1 +S.DC.Parent .EQ 2 +S.DC.X .EQ 4 +S.DC.Y .EQ 6 +S.DC.W .EQ 8 +S.DC.H .EQ 10 +* +S.DC .EQ 12 +*-------------------------------------- S.CUR.HotPointX .EQ 0 S.CUR.HotPointY .EQ 1 S.CUR.DATA .EQ 2 16x16 bits = 32 bytes @@ -15,8 +50,8 @@ S.CUR .EQ 66 S.BM.F .EQ 0 S.BM.F.BBP1 .EQ %00000001 S.BM.F.BBP2 .EQ %00000010 -S.BM.F.BBP4 .EQ %00000100 -S.BM.F.BBP8 .EQ %00001000 +S.BM.F.BBP4 .EQ %00001000 +S.BM.F.BBP8 .EQ %00010000 S.BM.RowBytes .EQ 1 S.BM.W .EQ 2 S.BM.H .EQ 4 @@ -24,10 +59,12 @@ S.BM.MASK.OFFSET .EQ 6 S.BM.DATA .EQ 8 *-------------------------------------- LIBGFX.InitGFXA .EQ 4 -LIBGFX.SetCursorPos .EQ 6 -LIBGFX.SetCursorYA .EQ 8 -LIBGFX.HideCursor .EQ 10 -LIBGFX.ShowCursor .EQ 12 +LIBGFX.CloseGFX .EQ 4 +LIBGFX.SetCursorPos .EQ 8 +LIBGFX.SetCursorYA .EQ 10 +LIBGFX.HideCursor .EQ 12 +LIBGFX.ShowCursor .EQ 14 +LIBGFX.DrawLine .EQ 16 *-------------------------------------- MAN SAVE /A2OSX.BUILD/INC/LIBGFX.I diff --git a/LIB/LIBGFX.S.txt b/LIB/LIBGFX.S.txt index 48fcb923..f90b0470 100644 --- a/LIB/LIBGFX.S.txt +++ b/LIB/LIBGFX.S.txt @@ -12,7 +12,28 @@ AUTO 6 .INB /A2OSX.BUILD/INC/A2OSX.I .INB /A2OSX.BUILD/INC/LIBGFX.I *-------------------------------------- -ZPPtr1 .EQ ZPLIB + .MA SWAP16 + lda ]1 + ldx ]2 + stx ]1 + sta ]2 + lda ]1+1 + ldx ]2+1 + stx ]1+1 + sta ]2+1 + .EM + .MA NOT16 + sec + lda #0 + sbc ]1 + sta ]1 + lda #0 + sbc ]1+1 + sta ]1+1 + .EM +*-------------------------------------- +ZPCBPtr .EQ ZPLIB +ZPDCPtr .EQ ZPLIB+2 *-------------------------------------- * File Header (16 Bytes) *-------------------------------------- @@ -31,22 +52,28 @@ CS.START cld .1 .DA LIB.LOAD .DA LIB.UNLOAD .DA InitGFXA + .DA CloseGFX .DA InitCursor .DA SetCursorYA .DA HideCursor .DA ShowCursor + .DA DrawLine +L.CB.Cache .DA CB.Cache .DA 0 *-------------------------------------- LIB.LOAD LIB.UNLOAD clc rts - *-------------------------------------- InitGFXA sta hDev + >SYSCALL GetDevByIDA + >STYA GoDevGFX.1+1 + clc - rts - -.9 stz hDev + rts +*-------------------------------------- +CloseGFX + stz hDev sec rts *-------------------------------------- @@ -61,11 +88,158 @@ ShowCursor clc rts *-------------------------------------- -* .INB LIB/LIBGFX.S.CUR +* In: Control Block +* hDC +* OP +* MODE +* COLOR +* X1 +* Y1 +* X2 +* Y2 +*-------------------------------------- +DrawLine ldy #S.CB.Y2+1 + jsr GetCB + + sec + + lda CB.Cache+S.CB.X2 + sbc CB.Cache+S.CB.X1 + sta DX + + lda CB.Cache+S.CB.X2+1 + sbc CB.Cache+S.CB.X1+1 + sta DX+1 DX% = X2% - X1% + + bmi .1 DX < 0.... + + ora DX + bne .2 DX > 0... + + ldx #DEVMGR.GFX.VLINE + jmp GoDevGFX DX=0 : VLIN Y1,Y2 At X1 + +.1 >SWAP16 CB.Cache+S.CB.X1,CB.Cache+S.CB.X2 + >SWAP16 CB.Cache+S.CB.Y1,CB.Cache+S.CB.Y2 + >NOT16 DX swap X1/X2, Y1/Y2, set DX=-DX + +.2 stz IY + + sec + + lda CB.Cache+S.CB.Y2 + sbc CB.Cache+S.CB.Y1 + sta DY + + lda CB.Cache+S.CB.Y2+1 + sbc CB.Cache+S.CB.Y1+1 + sta DY+1 DY% = Y2% - Y1% + + bmi .3 DY < 0 ... + + ora DY + bne .4 + + ldx #DEVMGR.GFX.HLINE + jmp GoDevGFX DY=0 : HLIN X1,X2 At Y1 + +.3 >NOT16 DY set DY=-DY + dec IY + +.4 ldx #DEVMGR.GFX.SETPIXEL + jsr GoDevGFX + + sec + lda DX + sbc DY + sta DXY + + lda DX+1 + sbc DY+1 + sta DXY+1 + bmi DrawLine.IncY DY is greater than DX, we will increase on Y axis + + ora DXY + bne DrawLine.IncX DY is lower than DX, we will increase on X axis + +DrawLine.XY lda DX DX=DY + eor #$ff + sta Counter + lda DX+1 + eor #$ff + sta Counter+1 + +.1 inc Counter + bne .2 + inc Counter+1 + beq .8 + +.2 inc CB.Cache+S.CB.X1 + bne .3 + inc CB.Cache+S.CB.X1+1 + +.3 bit IY + bmi .4 + + inc CB.Cache+S.CB.Y1 + bne .5 + inc CB.Cache+S.CB.Y1+1 + bra .5 + +.4 sec + lda CB.Cache+S.CB.Y1 + sbc #1 + sta CB.Cache+S.CB.Y1 + bcs .5 + + dec CB.Cache+S.CB.Y1+1 + +.5 ldx #DEVMGR.GFX.SETPIXEL + jsr GoDevGFX + bra .1 + +.8 rts + +DrawLine.IncY lda DY + eor #$ff + sta Counter + lda DY+1 + eor #$ff + sta Counter+1 + + rts + +DrawLine.IncX lda DX + eor #$ff + sta Counter + lda DX+1 + eor #$ff + sta Counter+1 + + rts +*-------------------------------------- +GetCB >PULLW ZPCBPtr + +.1 lda (ZPCBPtr),y Y=Byte count to cache + sta CB.Cache,y + dey + bpl .1 + rts +*-------------------------------------- +GoDevGFX >LDYA L.CB.Cache +GoDevGFX.1 jmp $ffff *-------------------------------------- CS.END hDev .BS 1 *-------------------------------------- +DX .BS 2 +DY .BS 2 +IY .BS 1 +DXY .BS 2 +Counter .BS 2 +*-------------------------------------- +CB.Cache .BS S.CB +*-------------------------------------- CUR.Arrow .DA #0 .DA #0 CUR.Arrow.DATA .DA %00000001.000000000 diff --git a/SBIN/DESKTOP.S.txt b/SBIN/DESKTOP.S.txt index dab2afdd..ac24632a 100644 --- a/SBIN/DESKTOP.S.txt +++ b/SBIN/DESKTOP.S.txt @@ -39,8 +39,9 @@ L.DEVNAME.MOUSE .DA DEVNAME.MOUSE L.MSG.INIT .DA MSG.INIT L.MouseClamp .DA MouseClamp L.MouseData .DA MouseData -L.SetPixel.X .DA SetPixel.X -L.DrawLine.X1 .DA DrawLine.X1 +L.SetPixel.CB .DA SetPixel.CB +L.DrawLine1.CB .DA DrawLine1.CB +L.DrawLine2.CB .DA DrawLine2.CB .DA 0 *-------------------------------------- CS.INIT >LDYA L.MSG.INIT @@ -117,9 +118,7 @@ CS.INIT >LDYA L.MSG.INIT clc rts *-------------------------------------- -CS.RUN ldy #S.EVT.hDEV - - lda A2osX.ASCREEN GUI screen active ? +CS.RUN lda A2osX.ASCREEN GUI screen active ? cmp #3 bne .8 no, exit.... @@ -147,13 +146,15 @@ CS.RUN ldy #S.EVT.hDEV lda MouseData+4 sta SetPixel.Y+1 - lda #4 + lda #0 S.CB.OP.XOR + sta SetPixel.OP + lda #S.CB.MODE.MONO sta SetPixel.Mode - lda #15 + lda #1 sta SetPixel.Color - >LDYA L.SetPixel.X + >LDYA L.SetPixel.CB ldx #DEVMGR.GFX.SETPIXEL jsr GoDevGFX clc @@ -176,21 +177,21 @@ CS.DOEVENT sec CS.QUIT clc rts *-------------------------------------- -Destop.Paint lda #4 +Destop.Paint lda #S.CB.MODE.C16 sta SetPixel.Mode lda #0 sta SetPixel.Color - lda #0 + lda #20 sta SetPixel.Y -.1 lda #0 +.1 lda #20 sta SetPixel.X - lda /0 + lda /20 sta SetPixel.X+1 -.2 >LDYA L.SetPixel.X +.2 >LDYA L.SetPixel.CB ldx #DEVMGR.GFX.SETPIXEL jsr GoDevGFX @@ -203,9 +204,9 @@ Destop.Paint lda #4 inc SetPixel.X+1 .3 lda SetPixel.X - cmp #279 + cmp #79 lda SetPixel.X+1 - sbc /279 + sbc /79 bcc .2 inc SetPixel.Y @@ -220,6 +221,11 @@ Destop.Paint lda #4 cmp #16 bne .1 + >PUSHW L.DrawLine1.CB + >LIBCALL hLibGFX,LIBGFX.DrawLine + >PUSHW L.DrawLine2.CB + >LIBCALL hLibGFX,LIBGFX.DrawLine + .8 rts *-------------------------------------- *-------------------------------------- @@ -237,16 +243,31 @@ hDevGFX .BS 1 hDevMouse .BS 1 MouseClamp .BS 8 MouseData .BS 5 -SetPixel.X .BS 2 -SetPixel.Y .BS 2 +*-------------------------------------- +SetPixel.CB .BS 1 hDC +SetPixel.OP .BS 1 SetPixel.Mode .BS 1 SetPixel.Color .BS 1 -DrawLine.X1 .BS 2 -DrawLine.Y1 .BS 2 -DrawLine.X2 .BS 2 -DrawLine.Y2 .BS 2 -DrawLine.Mode .BS 1 -DrawLine.Color .BS 1 +SetPixel.X .BS 2 +SetPixel.Y .BS 2 +*-------------------------------------- +DrawLine1.CB .BS 1 hDC +DrawLine1.OP .DA #0 +DrawLine1.Mode .DA #S.CB.MODE.MONO +DrawLine1.Color .DA #1 +DrawLine1.X1 .DA 200 +DrawLine1.Y1 .DA 0 +DrawLine1.X2 .DA 200+191 +DrawLine1.Y2 .DA 191 +*-------------------------------------- +DrawLine2.CB .BS 1 hDC +DrawLine2.OP .DA #0 +DrawLine2.Mode .DA #S.CB.MODE.C16 +DrawLine2.Color .DA #8 +DrawLine2.X1 .DA 220 +DrawLine2.Y1 .DA 0 +DrawLine2.X2 .DA 220+191 +DrawLine2.Y2 .DA 191 MAN SAVE /A2OSX.SRC/SBIN/DESKTOP.S ASM