mirror of
https://github.com/dschmenk/PLASMA.git
synced 2024-08-22 13:29:01 +00:00
Add line drawer
This commit is contained in:
parent
20e033c07f
commit
34c6ddf2cb
@ -1,5 +1,5 @@
|
|||||||
import cmdsys
|
import cmdsys
|
||||||
predef memset, memcpy, heapmark, heapalloc, heaprelease
|
predef memset, memcpy, heapmark, heapalloc, heaprelease, call
|
||||||
byte MACHID
|
byte MACHID
|
||||||
//
|
//
|
||||||
// System flags: memory allocator screen holes.
|
// System flags: memory allocator screen holes.
|
||||||
@ -62,10 +62,10 @@ byte[] = $5,$A,$F,$F,$F,$F,$A,$5
|
|||||||
byte[] = $0,$5,$A,$A,$A,$A,$5,$0
|
byte[] = $0,$5,$A,$A,$A,$A,$5,$0
|
||||||
byte[] = $0,$0,$5,$5,$5,$5,$0,$0
|
byte[] = $0,$0,$5,$5,$5,$5,$0,$0
|
||||||
|
|
||||||
byte[] tile1 = $81,$12,$81,$12,$81,$12,$81,$12
|
byte[] tile1 = $88,$11,$88,$11,$88,$11,$AA,$00
|
||||||
byte[] = $98,$13,$98,$13,$98,$13,$98,$13
|
byte[] = $88,$11,$88,$11,$88,$11,$AA,$00
|
||||||
byte[] = $8E,$DB,$8E,$DB,$8E,$DB,$8E,$DB
|
byte[] = $88,$11,$88,$11,$88,$11,$AA,$00
|
||||||
byte[] = $A8,$57,$A8,$57,$A8,$57,$A8,$57
|
byte[] = $0A,$05,$0A,$05,$0A,$05,$0A,$00
|
||||||
|
|
||||||
asm dgrInc(buff)
|
asm dgrInc(buff)
|
||||||
!SOURCE "vmsrc/plvmzp.inc"
|
!SOURCE "vmsrc/plvmzp.inc"
|
||||||
@ -200,11 +200,15 @@ asm dgrBLT(buff, x, y, width, height, src)
|
|||||||
LDA ESTKH+5,X
|
LDA ESTKH+5,X
|
||||||
STA DSTH
|
STA DSTH
|
||||||
LDA ESTKL+4,X ; X1 COORD
|
LDA ESTKL+4,X ; X1 COORD
|
||||||
|
CMP #80
|
||||||
|
BPL ++++
|
||||||
CLC
|
CLC
|
||||||
ADC ESTKL+2,X
|
ADC ESTKL+2,X
|
||||||
BMI ++++
|
BMI ++++
|
||||||
STA ESTKH+2,X ; X2 COORD
|
STA ESTKH+2,X ; X2 COORD
|
||||||
LDA ESTKL+3,X ; Y1 COORD
|
LDA ESTKL+3,X ; Y1 COORD
|
||||||
|
CMP #48
|
||||||
|
BPL ++++
|
||||||
STA ESTKH+3,X ; Y COORD
|
STA ESTKH+3,X ; Y COORD
|
||||||
CLC
|
CLC
|
||||||
ADC ESTKL+1,X
|
ADC ESTKL+1,X
|
||||||
@ -350,11 +354,15 @@ asm dgrTile(buff, x, y, src)
|
|||||||
LDA ESTKH+3,X
|
LDA ESTKH+3,X
|
||||||
STA DSTH
|
STA DSTH
|
||||||
LDA ESTKL+2,X ; X1 COORD
|
LDA ESTKL+2,X ; X1 COORD
|
||||||
|
CMP #80
|
||||||
|
BPL ++++
|
||||||
CLC
|
CLC
|
||||||
ADC #$08
|
ADC #$08
|
||||||
BMI ++++
|
BMI ++++
|
||||||
STA ESTKH+2,X ; X2 COORD
|
STA ESTKH+2,X ; X2 COORD
|
||||||
LDA ESTKL+1,X ; Y1 COORD
|
LDA ESTKL+1,X ; Y1 COORD
|
||||||
|
CMP #48
|
||||||
|
BPL ++++
|
||||||
STA TMPL ; Y COORD
|
STA TMPL ; Y COORD
|
||||||
CLC
|
CLC
|
||||||
ADC #$08
|
ADC #$08
|
||||||
@ -379,9 +387,9 @@ asm dgrTile(buff, x, y, src)
|
|||||||
STA GBASH
|
STA GBASH
|
||||||
LDA ESTKL+2,X ; X1 COORD
|
LDA ESTKL+2,X ; X1 COORD
|
||||||
STA TMPH ; X COORD
|
STA TMPH ; X COORD
|
||||||
-- CMP #80
|
-- LSR
|
||||||
LSR
|
|
||||||
TAY
|
TAY
|
||||||
|
CMP #40
|
||||||
PHP
|
PHP
|
||||||
SEI
|
SEI
|
||||||
LDX #$00
|
LDX #$00
|
||||||
@ -453,6 +461,7 @@ def txtMode
|
|||||||
^show40 = 0
|
^show40 = 0
|
||||||
^^mapmain = 0
|
^^mapmain = 0
|
||||||
^an3on
|
^an3on
|
||||||
|
return call($FC58, 0, 0, 0, 0) // home()
|
||||||
end
|
end
|
||||||
//
|
//
|
||||||
// Set display page, return other page
|
// Set display page, return other page
|
||||||
@ -469,6 +478,91 @@ def dgrColor(clr)
|
|||||||
^$30 = clr & $0F
|
^$30 = clr & $0F
|
||||||
end
|
end
|
||||||
//
|
//
|
||||||
|
// Draw line
|
||||||
|
//
|
||||||
|
def dgrLine(buff, x1, y1, x2, y2)
|
||||||
|
byte dx, dy, dx2, dy2, pp
|
||||||
|
word sx, sy, err, dd2
|
||||||
|
|
||||||
|
if x1 < x2
|
||||||
|
sx = 1
|
||||||
|
dx = x2 - x1
|
||||||
|
else
|
||||||
|
sx = -1
|
||||||
|
dx = x1 - x2
|
||||||
|
fin
|
||||||
|
if y1 < y2
|
||||||
|
sy = 1
|
||||||
|
dy = y2 - y1
|
||||||
|
else
|
||||||
|
sy = -1
|
||||||
|
dy = y1 - y2
|
||||||
|
fin
|
||||||
|
dx2 = dx << 1
|
||||||
|
dy2 = dy << 1
|
||||||
|
if dx >= dy
|
||||||
|
// Horizontal line
|
||||||
|
if sx < 0
|
||||||
|
pp = x1
|
||||||
|
x1 = x2
|
||||||
|
x2 = pp
|
||||||
|
pp = y1
|
||||||
|
y1 = y2
|
||||||
|
y2 = pp
|
||||||
|
sy = -sy
|
||||||
|
fin
|
||||||
|
dd2 = dx2 - dy2
|
||||||
|
err = dx - dy2
|
||||||
|
sx = 1
|
||||||
|
while dy
|
||||||
|
if err < 0
|
||||||
|
dgrHLin(buff, x1, x1 + sx - 1, y1)
|
||||||
|
x1 = x1 + sx
|
||||||
|
y1 = y1 + sy
|
||||||
|
sx = 1
|
||||||
|
dy--
|
||||||
|
err = err + dd2
|
||||||
|
else
|
||||||
|
sx++
|
||||||
|
err = err - dy2
|
||||||
|
fin
|
||||||
|
loop
|
||||||
|
if y2 == y1
|
||||||
|
dgrHLin(buff, x1, x2, y1)
|
||||||
|
fin
|
||||||
|
else
|
||||||
|
// Vertical line
|
||||||
|
if sy < 0
|
||||||
|
pp = x1
|
||||||
|
x1 = x2
|
||||||
|
x2 = pp
|
||||||
|
pp = y1
|
||||||
|
y1 = y2
|
||||||
|
y2 = pp
|
||||||
|
sx = -sx
|
||||||
|
fin
|
||||||
|
dd2 = dy2 - dx2
|
||||||
|
err = dy - dx2
|
||||||
|
sy = 1
|
||||||
|
while dx
|
||||||
|
if err < 0
|
||||||
|
dgrVLin(buff, x1, y1, y1 + sy - 1)
|
||||||
|
x1 = x1 + sx
|
||||||
|
y1 = y1 + sy
|
||||||
|
sy = 1
|
||||||
|
dx--
|
||||||
|
err = err + dd2
|
||||||
|
else
|
||||||
|
sy++
|
||||||
|
err = err - dx2
|
||||||
|
fin
|
||||||
|
loop
|
||||||
|
if x2 == x1
|
||||||
|
dgrVLin(buff, x1, y1, y2)
|
||||||
|
fin
|
||||||
|
fin
|
||||||
|
end
|
||||||
|
//
|
||||||
// Clear the buffer
|
// Clear the buffer
|
||||||
//
|
//
|
||||||
def dgrClear(buff, clr)
|
def dgrClear(buff, clr)
|
||||||
@ -479,11 +573,11 @@ def dgrClear(buff, clr)
|
|||||||
dgrHLin(buff, 0, 79, y)
|
dgrHLin(buff, 0, 79, y)
|
||||||
next
|
next
|
||||||
end
|
end
|
||||||
def dgrFill(buff, tile)
|
def dgrFill(buff, ox, oy, tile)
|
||||||
byte x, y
|
byte x, y
|
||||||
|
|
||||||
for y = 0 to 47 step 8
|
for y = -oy to 47 step 8
|
||||||
for x = 0 to 79 step 8
|
for x = -ox to 79 step 8
|
||||||
dgrTile(buff, x, y, tile)
|
dgrTile(buff, x, y, tile)
|
||||||
next
|
next
|
||||||
next
|
next
|
||||||
@ -492,19 +586,29 @@ end
|
|||||||
// Test routine
|
// Test routine
|
||||||
//
|
//
|
||||||
def dgrTest
|
def dgrTest
|
||||||
byte b, l
|
byte b, l, k
|
||||||
word i, j, ii, ij
|
word i, j, ii, ij
|
||||||
|
|
||||||
b = dgrMode
|
b = dgrMode
|
||||||
ii = 1
|
for l = 0 to 79
|
||||||
|
dgrColor(l)
|
||||||
|
dgrLine(dgrbuff[0], 0, 0, l, 47)
|
||||||
|
next
|
||||||
|
for l = 47 downto 0
|
||||||
|
dgrColor(l)
|
||||||
|
dgrLine(dgrbuff[0], 0, 0, 79, l)
|
||||||
|
next
|
||||||
|
k = 0
|
||||||
|
ii = 2
|
||||||
ij = -1
|
ij = -1
|
||||||
i = 40
|
i = 40
|
||||||
j = 10
|
j = 10
|
||||||
^$C010
|
^$C010
|
||||||
while ^$C000 < 128
|
while ^$C000 < 128
|
||||||
//dgrClear(dgrbuff[b], j)
|
dgrFill(dgrbuff[b], k, k, @tile1)
|
||||||
dgrFill(dgrbuff[b], @tile1)
|
|
||||||
dgrBLT(dgrbuff[b], i, j, 8, 8, @sprite1)
|
dgrBLT(dgrbuff[b], i, j, 8, 8, @sprite1)
|
||||||
|
b = dgrShow(b)
|
||||||
|
k = (k + 1) & $07
|
||||||
i = i + ii
|
i = i + ii
|
||||||
if i < -3 or i > 75
|
if i < -3 or i > 75
|
||||||
ii = -ii
|
ii = -ii
|
||||||
@ -513,11 +617,6 @@ def dgrTest
|
|||||||
if j < -3 or j > 43
|
if j < -3 or j > 43
|
||||||
ij = -ij
|
ij = -ij
|
||||||
fin
|
fin
|
||||||
for l = 0 to 47
|
|
||||||
dgrColor(l)
|
|
||||||
dgrPlot(dgrbuff[b], l, l)
|
|
||||||
next
|
|
||||||
b = dgrShow(b)
|
|
||||||
loop
|
loop
|
||||||
^$C010
|
^$C010
|
||||||
txtMode
|
txtMode
|
||||||
|
Loading…
Reference in New Issue
Block a user