A2osX/SBIN/DESKTOP.S.txt
2016-07-22 16:11:13 +02:00

364 lines
6.2 KiB
Plaintext
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

PR#3
PREFIX /A2OSX.SRC
NEW
INC 1
AUTO 6
.LIST OFF
.OP 65C02
.OR $2000
.TF /A2OSX.BOOT/SBIN/DESKTOP
*--------------------------------------
.INB INC/MACROS.I
.INB INC/A2OSX.I
.INB INC/LIBGFX.I
*--------------------------------------
* File Header (16 Bytes)
*--------------------------------------
CS.START cld
jmp (.1,x)
.DA #$61 6502,Level 1 (65c02)
.DA #1 BIN Layout Version 1
.DA 0
.DA CS.END-CS.START
.DA 0
.DA 0
.DA 0
*--------------------------------------
* Relocation Table
*--------------------------------------
.1 .DA CS.INIT
.DA CS.RUN
.DA CS.DOEVENT
.DA CS.QUIT
L.LIBGFX .DA LIBGFX
L.DEVNAME.GFX .DA DEVNAME.GFX
L.DEVNAME.MOUSE .DA DEVNAME.MOUSE
L.MSG.INIT .DA MSG.INIT
L.SetPixel.X .DA SetPixel.X
L.DrawLine.X1 .DA DrawLine.X1
.DA 0
*--------------------------------------
CS.INIT >LDYA L.MSG.INIT
>SYSCALL SYS.PSTROutYA
>LDYA L.LIBGFX
>SYSCALL SYS.LoadLibYA
sta hLIBGFX
>LDYA L.DEVNAME.GFX
>SYSCALL SYS.GetDevByNameYA
bcc .10
rts
.10 stx hDevGFX
ldx pDev
phx
ldx pDev+1
phx
>STYA pDevGFX
>STYA pDev
ldx #DEVMGR.OPEN
jsr GoDevGFX
.11 >LDYA L.DEVNAME.MOUSE
>SYSCALL SYS.GetDevByNameYA
bcc .20
inc DEVNAME.MOUSE+4
lda DEVNAME.MOUSE+4
cmp #'8'
bne .11
beq .21 No mouse found, skip mouse init
.20 stx hDevMouse
>STYA pDevMouse
>STYA pDev
ldx #DEVMGR.OPEN
jsr GoDevMouse
.21 pla
sta pDev+1
pla
sta pDev
lda hDevGFX
>LIBCALL hLibGFX,LIBGFX.InitGFXA
lda (pPs)
ora #S.PS.F.EVENT Now accept events
sta (pPs)
jsr Destop.Paint
clc
rts
*--------------------------------------
CS.RUN clc
rts
*--------------------------------------
CS.DOEVENT lda hDevMouse Mouse is active ?
beq .1 go check KB
ldy #S.EVT.hDEV
cmp (pEvent),y Event coming from Mouse ?
bne .1
lda A2osX.ASCREEN GUI screen active ?
cmp #3
bne .98 no, discard mouse event & exit
ldy #S.EVT.DATALO
lda (pEvent),y
and #4 mouse move
beq .98
ldy #S.EVT.DATAW2
lda (pEvent),y
sta SetPixel.Y
dey
lda (pEvent),y X.HI
sta SetPixel.X+1
dey
lda (pEvent),y X.LO
sta SetPixel.X
lda #4
sta SetPixel.Mode
lda #15
sta SetPixel.Color
>LDYA L.SetPixel.X
ldx #DEVMGR.GFX.SETPIXEL
jsr GoDevGFX
.98 clc
rts
.1 lda (pEvent)
cmp #S.EVT.F.KEY
bne .99
ldy #S.EVT.DATAHI
lda (pEvent),y
bne .99 Open Apple ?
lda A2osX.ASCREEN
cmp #3
bne .98
jsr Destop.Paint
clc
rts
.99 sec
rts
*--------------------------------------
CS.QUIT clc
rts
*--------------------------------------
Destop.Paint lda #4
sta SetPixel.Mode
lda #0
sta SetPixel.Color
lda #0
sta SetPixel.Y
.1 lda #0
sta SetPixel.X
lda /0
sta SetPixel.X+1
.2 >LDYA L.SetPixel.X
ldx #DEVMGR.GFX.SETPIXEL
jsr GoDevGFX
lda SetPixel.X
clc
adc #4
sta SetPixel.X
bcc .3
inc SetPixel.X+1
.3 lda SetPixel.X
cmp #279
lda SetPixel.X+1
sbc /279
bcc .2
inc SetPixel.Y
lda SetPixel.Y
cmp #192
beq .8
and #$7
bne .1
inc SetPixel.Color
lda SetPixel.Color
cmp #16
bne .1
.8 rts
*--------------------------------------
* Midpoint algorithm
{
dx=x2-x1;
if (dx=0) => VLINE;
if(dx<0)
{
swap(&x1,&x2);
swap(&y1,&y2);
dx=-dx;
}
dy=y2-y1;
if (dy=0) => HLINE;
if (dy<0)
{
incY=-1;
dy=-dy;
}
else
{
incY=1;
}
if(dy>dx)
{
incE=2*dx;
d=incE-dy;
incNE=2*(dx-dy);
while(y1<y2)
{
if(d>0)
{
d=d+incNE;
x1=x1+incY;
}
else
d=d+incE;
y1++;
putpixel(x1,y1,COLOR);
}
}
else
{
incE=2*dy;
d=incE-dx;
incNE=2*(dy-dx);
while(x1<x2)
{
if(d>0)
{
d=d+incNE;
y1=y1+incY;
}
else
d=d+incE;
x1++;
putpixel(x1,y1,COLOR);
}
}
*--------------------------------------
DrawLine >STYA ZPBase
ldy #9
.1 lda (ZPBase),y
sta ZPCtrlBlk,y
dey
bpl .1
lda ZPCtrlBlk+4 X2.LO
sec
sbc ZPCtrlBlk X1.LO
sta DrawLine.DX
lda ZPCtrlBlk+5 X2.HI
sbc ZPCtrlBlk+1 X1.HI
sta DrawLine.DX+1
ora DrawLine.DX DX=0?
beq DrawLineV yes, call DRV.VLINE
bcs .2 is CS, X1<X2, no swap,no ABS
lda ZPCtrlBlk SWAP X1,X2
ldx ZPCtrlBlk+4
sta ZPCtrlBlk+4
stx ZPCtrlBlk
lda ZPCtrlBlk+1
ldx ZPCtrlBlk+5
sta ZPCtrlBlk+5
stx ZPCtrlBlk+1
lda ZPCtrlBlk+2 SWAP Y1,Y2
ldx ZPCtrlBlk+6
sta ZPCtrlBlk+6
stx ZPCtrlBlk+2
lda ZPCtrlBlk+3
ldx ZPCtrlBlk+7
sta ZPCtrlBlk+7
stx ZPCtrlBlk+3
lda #0 DX=-DX
sec
sbc DrawLine.DX
sta DrawLine.DX
lda #0
sbc DrawLine.DX+1
sta DrawLine.DX+1
.2 lda ZPCtrlBlk+6 Y2.LO
sec
sbc ZPCtrlBlk+2 Y1.LO
sta DrawLine.DY
lda ZPCtrlBlk+7 Y2.HI
sbc ZPCtrlBlk+3 Y1.HI
sta DrawLine.DY+1
ora DrawLine.DY DY=0?
beq DrawLineH yes, call DRV.HLINE
bcs .3 is CS, Y1<Y2
.3
*--------------------------------------
GoDevGFX jmp (pDevGFX)
GoDevMouse jmp (pDevMouse)
*--------------------------------------
CS.END
DEVNAME.GFX >PSTRING "GFX"
DEVNAME.MOUSE >PSTRING "MOU1"
LIBGFX >PSTRING "libgfx.o"
MSG.INIT >PSTRING "DESKTOP:Init...\n"
hLibGFX .BS 1
hDevGFX .BS 1
pDevGFX .BS 2
hDevMouse .BS 1
pDevMouse .BS 2
SetPixel.X .BS 2
SetPixel.Y .BS 2
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
MAN
SAVE SBIN/DESKTOP.S
ASM