Kernel version 0.9 : DHGR.DRV, primitives,

LIBGFX : DrawLine working....
This commit is contained in:
Rémy GIBERT 2017-06-15 17:36:25 +02:00
parent ad99363574
commit 34d100b807
6 changed files with 431 additions and 58 deletions

View File

@ -17,6 +17,7 @@ AUTO 6
ZPBase .EQ ZPDRV ZPBase .EQ ZPDRV
ZPShiftLo .EQ ZPDRV+2 ZPShiftLo .EQ ZPDRV+2
ZPShiftHi .EQ ZPDRV+4 ZPShiftHi .EQ ZPDRV+4
ZPCount .EQ ZPDRV+6
*-------------------------------------- *--------------------------------------
* File Header (16 Bytes) * File Header (16 Bytes)
*-------------------------------------- *--------------------------------------
@ -262,20 +263,20 @@ SETPIXEL >STYA ZPBase
SETPIXEL.MONO ldx CB.Cache+S.CB.X1+1 Get X Hi byte.... SETPIXEL.MONO ldx CB.Cache+S.CB.X1+1 Get X Hi byte....
lda DIV7.lo,x lda DIV7.lo,x
sta .2+1 sta .1+1
lda DIV7.hi,x lda DIV7.hi,x
sta .2+2 sta .1+2
lda MOD7.lo,x lda MOD7.lo,x
sta .4+1 sta .2+1
lda MOD7.hi,x lda MOD7.hi,x
sta .4+2 sta .2+2
lda DIV7.BASE,x lda DIV7.BASE,x
ldx CB.Cache+S.CB.X1 ldx CB.Cache+S.CB.X1
clc clc
.2 adc $ffff,x DIV7 : x = X.LO, a = X DIV 7 .1 adc $ffff,x DIV7 : x = X.LO, a = X DIV 7
pha save X DIV 7 pha save X DIV 7
lsr lsr
@ -290,7 +291,7 @@ SETPIXEL.MONO ldx CB.Cache+S.CB.X1+1 Get X Hi byte....
tay tay
sta $c000,y sta $c000,y
.4 ldy $ffff,x MOD7 : x = X.LO, y = X MOD 7 .2 ldy $ffff,x MOD7 : x = X.LO, y = X MOD 7
lda CB.Cache+S.CB.OP lda CB.Cache+S.CB.OP
beq .5 beq .5
@ -322,8 +323,8 @@ SETPIXEL.C16 lda CB.Cache+S.CB.X1
ror ror
lsr CB.Cache+S.CB.X1+1 lsr CB.Cache+S.CB.X1+1
ror ror
tay Y=CX/4 (range 0->139) tay Y=X/4 (range 0->139)
lda DIV7.0,y A=CX/4/7 (range 0->19) lda DIV7.0,y A=X/4/7 (range 0->19)
asl times 2 (range 0->38) asl times 2 (range 0->38)
@ -424,9 +425,56 @@ HLINE.I lda CB.Cache+S.CB.MODE
bit #S.CB.MODE.C16 bit #S.CB.MODE.C16
bne HLINE.C16 bne HLINE.C16
HLINE.MONO HLINE.MONO lda CB.Cache+S.CB.X2 Count=X2-X1
sec
sbc CB.Cache+S.CB.X1
eor #$ff
sta ZPCount
lda CB.Cache+S.CB.X2+1
sbc CB.Cache+S.CB.X1+1
eor #$ff
sta ZPCount+1
ldx CB.Cache+S.CB.X1+1 Get X Hi byte....
lda DIV7.lo,x
sta .1+1
lda DIV7.hi,x
sta .1+2
lda MOD7.lo,x
sta .2+1
lda MOD7.hi,x
sta .2+2
lda DIV7.BASE,x
ldx CB.Cache+S.CB.X1
clc
.1 adc $ffff,x DIV7 : x = X.LO, a = X DIV 7
pha save X DIV 7
lsr
ldy CB.Cache+S.CB.Y1
clc
adc BASEL,y setup line Base Ptr (A=Col)
sta ZPBase
lda BASEH,y
sta ZPBase+1
ply
lda COL.BANK,y
tay
sta $c000,y
.2 ldy $ffff,x MOD7 : x = X.LO, y = X MOD 7
HLINE.C16 HLINE.C16
rts rts
*-------------------------------------- *--------------------------------------
@ -440,8 +488,163 @@ VLINE >STYA ZPBase
dey dey
bpl .1 bpl .1
sta SET80STORE
VLINE.MONO ldx CB.Cache+S.CB.X1+1 Get X Hi byte....
lda DIV7.lo,x
sta .1+1
lda DIV7.hi,x
sta .1+2
lda MOD7.lo,x
sta .2+1
lda MOD7.hi,x
sta .2+2
lda DIV7.BASE,x
ldx CB.Cache+S.CB.X1
clc
.1 adc $ffff,x DIV7 : x = X.LO, a = X DIV 7
sta XDIV7 save X DIV 7
.2 lda $ffff,x MOD7 : x = X.LO, y = X MOD 7
sta XMOD7
lda CB.Cache+S.CB.OP
beq .4
ldx CB.Cache+S.CB.Y1
.3 lda XDIV7
tay
lsr
clc
adc BASEL,x
sta ZPBase
lda BASEH,x
sta ZPBase+1
ldx COL.BANK,y
sta $C000,x
ldy XMOD7
lda (ZPBase) XOR
eor Mono.Masks,y y = mod 7
sta (ZPBase)
inc CB.Cache+S.CB.Y1
ldx CB.Cache+S.CB.Y1
cpx CB.Cache+S.CB.Y2
bne .3
sta CLR80STORE
rts
.4 lda (ZPBase)
ldx CB.Cache+S.CB.COLOR 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
VLINE.C16 lda CB.Cache+S.CB.X1
lsr CB.Cache+S.CB.X1+1 divide by 4
ror
lsr CB.Cache+S.CB.X1+1
ror
tay Y=X/4 (range 0->139)
lda DIV7.0,y A=X/4/7 (range 0->19)
asl times 2 (range 0->38)
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
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 CB.Cache+S.CB.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 rts
*-------------------------------------- *--------------------------------------
* FILLRECT * FILLRECT
@ -516,16 +719,10 @@ Shifthi.hi .BS 7
*-------------------------------------- *--------------------------------------
CB.Cache .BS S.CB CB.Cache .BS S.CB
*-------------------------------------- *--------------------------------------
CX .BS 2 XDIV7 .BS 1
CY .BS 1 XMOD7 .BS 1
COL .BS 1
GBYTE .BS 1 GBYTE .BS 1
*-------------------------------------- *--------------------------------------
SB.StartPage .BS 1
SB.Page .BS 1
SB.StartCol .BS 1
SB.Col .BS 1
*--------------------------------------
STAT .DA #0 STAT .DA #0
.DA #0,#0,#0 .DA #0,#0,#0
>PSTR "Apple II DHGR" >PSTR "Apple II DHGR"

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

@ -120,19 +120,26 @@ DrawLine ldy #S.CB.Y2+1
jmp GoDevGFX DX=0 : VLIN Y1,Y2 At X1 jmp GoDevGFX DX=0 : VLIN Y1,Y2 At X1
.1 >SWAP16 CB.Cache+S.CB.X1,CB.Cache+S.CB.X2 .1 >SWAP16 CB.Cache+S.CB.X1,CB.Cache+S.CB.X2
>SWAP16 CB.Cache+S.CB.Y1,CB.Cache+S.CB.Y2 * >SWAP16 CB.Cache+S.CB.Y1,CB.Cache+S.CB.Y2
>NOT16 DX swap X1/X2, Y1/Y2, set DX=-DX lda CB.Cache+S.CB.Y1
ldx CB.Cache+S.CB.Y2
stx CB.Cache+S.CB.Y1
sta CB.Cache+S.CB.Y2
.2 stz IY >NOT16 DX swap X1/X2, Y1/Y2, set DX=-DX (DX positive)
sec .2 lda #1
sta IY
lda CB.Cache+S.CB.Y2 lda CB.Cache+S.CB.Y2
sec
sbc CB.Cache+S.CB.Y1 sbc CB.Cache+S.CB.Y1
sta DY sta DY
lda CB.Cache+S.CB.Y2+1 * lda CB.Cache+S.CB.Y2+1
sbc CB.Cache+S.CB.Y1+1 lda #0
* sbc CB.Cache+S.CB.Y1+1
sbc #0
sta DY+1 DY% = Y2% - Y1% sta DY+1 DY% = Y2% - Y1%
bmi .3 DY < 0 ... bmi .3 DY < 0 ...
@ -144,25 +151,28 @@ DrawLine ldy #S.CB.Y2+1
jmp GoDevGFX DY=0 : HLIN X1,X2 At Y1 jmp GoDevGFX DY=0 : HLIN X1,X2 At Y1
.3 >NOT16 DY set DY=-DY .3 >NOT16 DY set DY=-DY
dec IY lda #$ff
sta IY set IY=-1
.4 ldx #DEVMGR.GFX.SETPIXEL .4 ldx #DEVMGR.GFX.SETPIXEL
jsr GoDevGFX jsr GoDevGFX
sec
lda DX lda DX
sec
sbc DY sbc DY
sta DXY tax
lda DX+1 lda DX+1
sbc DY+1 * sbc DY+1
sta DXY+1 sbc #0
bmi DrawLine.IncY DY is greater than DX, we will increase on Y axis bmi DrawLine.IncY DY is greater than DX, we will increase on Y axis
ora DXY txa
bne DrawLine.IncX DY is lower than DX, we will increase on X axis beq DrawLine.IncXY DX=DY, go inc X & Y
jmp DrawLine.IncX DY is lower than DX, we will increase on X axis
DrawLine.XY lda DX DX=DY DrawLine.IncXY lda DX DX=DY
eor #$ff eor #$ff
sta Counter sta Counter
lda DX+1 lda DX+1
@ -178,23 +188,12 @@ DrawLine.XY lda DX DX=DY
bne .3 bne .3
inc CB.Cache+S.CB.X1+1 inc CB.Cache+S.CB.X1+1
.3 bit IY .3 lda CB.Cache+S.CB.Y1 Y1=Y1+IY
bmi .4 clc
adc IY
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 sta CB.Cache+S.CB.Y1
bcs .5
dec CB.Cache+S.CB.Y1+1 ldx #DEVMGR.GFX.SETPIXEL
.5 ldx #DEVMGR.GFX.SETPIXEL
jsr GoDevGFX jsr GoDevGFX
bra .1 bra .1
@ -207,7 +206,82 @@ DrawLine.IncY lda DY
eor #$ff eor #$ff
sta Counter+1 sta Counter+1
rts lda DX IE=2*DX
asl
sta IE
pha
lda DX+1
rol
sta IE+1
tax
pla D=IE-DY
sec
sbc DY
sta D
txa
sbc DY+1
sta D+1
lda DX INE=2*(DX-DY)
sec
sbc DY
pha
lda DX+1
sbc DY+1
tax
pla
asl
sta INE
txa
rol
sta INE+1
.1 inc Counter
bne .2
inc Counter+1
beq .8
.2 lda D+1 IF D < 0 ...
bmi .4
lda D D > 0 : D=D+INE
clc
adc INE
sta D
lda D+1
adc INE+1
sta D+1
inc CB.Cache+S.CB.X1 X1=X1+1
bne .5
inc CB.Cache+S.CB.X1+1
bra .5
.4 lda D D > 0 : D=D+IE
clc
adc IE
sta D
lda D+1
adc IE+1
sta D+1
.5 lda CB.Cache+S.CB.Y1 Y1=Y1+IY
clc
adc IY
sta CB.Cache+S.CB.Y1
ldx #DEVMGR.GFX.SETPIXEL
jsr GoDevGFX
bra .1
.8 rts
DrawLine.IncX lda DX DrawLine.IncX lda DX
eor #$ff eor #$ff
@ -216,7 +290,83 @@ DrawLine.IncX lda DX
eor #$ff eor #$ff
sta Counter+1 sta Counter+1
rts lda DY IE=2*DY
asl
sta IE
pha
* lda DY+1
lda #0
rol
sta IE+1
tax
pla D=IE-DX
sec
sbc DX
sta D
txa
sbc DX+1
sta D+1
lda DY INE=2*(DY-DX)
sec
sbc DX
pha
* lda DY+1
lda #0
sbc DX+1
tax
pla
asl
sta INE
txa
rol
sta INE+1
.1 inc Counter
bne .2
inc Counter+1
beq .8
.2 lda D+1 ID D < 0 ....
bmi .4
lda D D > 0 : D=D+INE
clc
adc INE
sta D
lda D+1
adc INE+1
sta D+1
lda CB.Cache+S.CB.Y1 Y1=Y1+IY
clc
adc IY
sta CB.Cache+S.CB.Y1
bra .5
.4 lda D D < 0 : D=D+IE
clc
adc IE
sta D
lda D+1
adc IE+1
sta D+1
.5 inc CB.Cache+S.CB.X1 X1=X1+1
bne .6
inc CB.Cache+S.CB.X1+1
.6 ldx #DEVMGR.GFX.SETPIXEL
jsr GoDevGFX
bra .1
.8 rts
*-------------------------------------- *--------------------------------------
GetCB >PULLW ZPCBPtr GetCB >PULLW ZPCBPtr
@ -235,7 +385,9 @@ hDev .BS 1
DX .BS 2 DX .BS 2
DY .BS 2 DY .BS 2
IY .BS 1 IY .BS 1
DXY .BS 2 IE .BS 2
D .BS 2
INE .BS 2
Counter .BS 2 Counter .BS 2
*-------------------------------------- *--------------------------------------
CB.Cache .BS S.CB CB.Cache .BS S.CB

View File

@ -42,6 +42,8 @@ L.MouseData .DA MouseData
L.SetPixel.CB .DA SetPixel.CB L.SetPixel.CB .DA SetPixel.CB
L.DrawLine1.CB .DA DrawLine1.CB L.DrawLine1.CB .DA DrawLine1.CB
L.DrawLine2.CB .DA DrawLine2.CB L.DrawLine2.CB .DA DrawLine2.CB
L.DrawLine3.CB .DA DrawLine3.CB
L.DrawLine4.CB .DA DrawLine4.CB
.DA 0 .DA 0
*-------------------------------------- *--------------------------------------
CS.INIT >LDYA L.MSG.INIT CS.INIT >LDYA L.MSG.INIT
@ -225,6 +227,10 @@ Destop.Paint lda #S.CB.MODE.C16
>LIBCALL hLibGFX,LIBGFX.DrawLine >LIBCALL hLibGFX,LIBGFX.DrawLine
>PUSHW L.DrawLine2.CB >PUSHW L.DrawLine2.CB
>LIBCALL hLibGFX,LIBGFX.DrawLine >LIBCALL hLibGFX,LIBGFX.DrawLine
>PUSHW L.DrawLine3.CB
>LIBCALL hLibGFX,LIBGFX.DrawLine
>PUSHW L.DrawLine4.CB
>LIBCALL hLibGFX,LIBGFX.DrawLine
.8 rts .8 rts
*-------------------------------------- *--------------------------------------
@ -253,21 +259,39 @@ SetPixel.Y .BS 2
*-------------------------------------- *--------------------------------------
DrawLine1.CB .BS 1 hDC DrawLine1.CB .BS 1 hDC
DrawLine1.OP .DA #0 DrawLine1.OP .DA #0
DrawLine1.Mode .DA #S.CB.MODE.MONO DrawLine1.Mode .DA #S.CB.MODE.C16
DrawLine1.Color .DA #1 DrawLine1.Color .DA #1
DrawLine1.X1 .DA 200 DrawLine1.X1 .DA 80
DrawLine1.Y1 .DA 0 DrawLine1.Y1 .DA 191
DrawLine1.X2 .DA 200+191 DrawLine1.X2 .DA 80+191
DrawLine1.Y2 .DA 191 DrawLine1.Y2 .DA 0
*-------------------------------------- *--------------------------------------
DrawLine2.CB .BS 1 hDC DrawLine2.CB .BS 1 hDC
DrawLine2.OP .DA #0 DrawLine2.OP .DA #0
DrawLine2.Mode .DA #S.CB.MODE.C16 DrawLine2.Mode .DA #S.CB.MODE.MONO
DrawLine2.Color .DA #8 DrawLine2.Color .DA #8
DrawLine2.X1 .DA 220 DrawLine2.X1 .DA 90
DrawLine2.Y1 .DA 0 DrawLine2.Y1 .DA 0
DrawLine2.X2 .DA 220+191 DrawLine2.X2 .DA 140
DrawLine2.Y2 .DA 191 DrawLine2.Y2 .DA 191
*--------------------------------------
DrawLine3.CB .BS 1 hDC
DrawLine3.OP .DA #0
DrawLine3.Mode .DA #S.CB.MODE.MONO
DrawLine3.Color .DA #8
DrawLine3.X1 .DA 100
DrawLine3.Y1 .DA 0
DrawLine3.X2 .DA 100+191
DrawLine3.Y2 .DA 191
*--------------------------------------
DrawLine4.CB .BS 1 hDC
DrawLine4.OP .DA #0
DrawLine4.Mode .DA #S.CB.MODE.MONO
DrawLine4.Color .DA #8
DrawLine4.X1 .DA 110
DrawLine4.Y1 .DA 0
DrawLine4.X2 .DA 559
DrawLine4.Y2 .DA 191
MAN MAN
SAVE /A2OSX.SRC/SBIN/DESKTOP.S SAVE /A2OSX.SRC/SBIN/DESKTOP.S
ASM ASM