1
0
mirror of https://github.com/dschmenk/PLASMA.git synced 2025-04-09 16:40:38 +00:00

Simplified set destination surface API

This commit is contained in:
David Schmenk 2024-09-15 14:47:36 -07:00
parent 70a067d134
commit ff89556104
3 changed files with 339 additions and 213 deletions

View File

@ -1,4 +1,6 @@
import dcgrlib
const DST_SCREEN = 0
const DST_MEMORY = 1
const SCR_WIDTH7 = 20
const SCR_WIDTH = 140
const SCR_HEIGHT = 192
@ -25,24 +27,17 @@ import dcgrlib
const DCLR_WHITE = 15
predef dcgrColor(c)#0
predef dcgrPlotScr(x, y)#0
predef dcgrHLinScr(x1, x2, y)#0
predef dcgrVlinScr(y1, y2, x)#0
predef dcgrBitScr(x, y, bitw, bith, bitptr)#0
predef dcgrPixScr(x, y, pixw, pixh, pixptr)#0
predef dcgrPlotMem(x, y, memptr, memspan)#0
predef dcgrHLinMem(x1, x2, y, memptr, memspan)#0
predef dcgrVLinMem(y1, y2, x, memptr, memspan)#0
predef dcgrBitMem(x, y, bitw, bith, bitptr, memw, memh, memptr, memspan)#0
predef dcgrPixMem(x, y, pixw, pixh, pixptr, memw, memh, memptr, memspan)#0
predef dcgrScrBl7Mem(x7, y, w7, h, memptr, memspan)#0
predef dcgrMemBl7Scr(x7, y, w7, h, memptr, memspan)#0
predef dcgrMemBl7Mem(x7, y, srcw7, srch, srcptr, srcspan, dstw7, dsth, dstptr)#0
predef dcgrClearBl7Scr(x7, y, w7, h)#0
predef dcgrClearBl7Mem(x7, y, w7, h, memptr, memspan)#0
predef dcgrPlot(x, y)#0
predef dcgrHLin(x1, x2, y)#0
predef dcgrVlin(y1, y2, x)#0
predef dcgrBitmap(x, y, bitw, bith, bitptr)#0
predef dcgrPixmap(x, y, pixw, pixh, pixptr)#0
predef dcgrScrBl7(x7, y, w7, h)#0
predef dcgrMemBl7(x7, y, w7, h, memptr, memspan)#0
predef dcgrClearBl7(x7, y, w7, h)#0
predef dcgrVLB#0
predef dcgrOpScr(op)#0
predef dcgrOpMem(op)#0
predef dcgrAllocBl7Mem(w, h)#2
predef dcgrOp(op)#0
predef dcgrSurfScr(op)#0
predef dcgrSurfMem(op, memh, memptr, memspan)#0
predef dcgrMode(mode)
end

View File

@ -193,11 +193,47 @@ byte = 224+0, 224+1, 224+2, 224+3, 224+4, 224+5, 224+6
byte = 232+0, 232+1, 232+2, 232+3, 232+4, 232+5, 232+6
byte = 240+0, 240+1, 240+2, 240+3, 240+4, 240+5, 240+6
byte = 248+0, 248+1, 248+2, 248+3, 248+4, 248+5, 248+6
///
// Destination surface values
//
const DST_SCREEN = 0
const DST_MEMORY = 1
word surfWidth, surfWidth7, surfHeight, surfPtr, surfSpan
byte dcgrSurface, opScr, opMem
//
// Surface independent entrypoints
//
asm plvmzp#0
!SOURCE "vmsrc/plvmzp.inc"
end
export asm dcgrPlot(x, y)#0
JMP $1000
end
export asm dcgrHLin(x1, x2, y)#0
JMP $1000
end
export asm dcgrVlin(y1, y2, x)#0
JMP $1000
end
export asm dcgrBitmap(x, y, bitw, bith, bitptr)#0
JMP $1000
end
export asm dcgrPixmap(x, y, pixw, pixh, pixptr)#0
JMP $1000
end
export asm dcgrScrBl7(x7, y, w7, h)#0
JMP $1000
end
export asm dcgrMemBl7(x7, y, w7, h, memptr, memspan)#0
JMP $1000
end
export asm dcgrClearBl7(x7, y, w7, h)#0
JMP $1000
end
//
// Internal routine to clip x7 and width7 to destination width in A REG
//
asm _clipX#0
!SOURCE "vmsrc/plvmzp.inc"
STA TMPL ; DST_WIDTH
LDA ESTKH-1,X ; X COORD
BMI NEGX ; IS NEG?
@ -321,7 +357,7 @@ end
//
// Screen functions
//
export asm dcgrPlotScr(x, y)#0
asm dcgrPlotScr(x, y)#0
INX
INX
STX ESP
@ -459,7 +495,7 @@ asm _dcgrOpPlotScrH
LDX ESP
RTS
end
export asm dcgrHLinScr(x1, x2, y)#0
asm dcgrHLinScr(x1, x2, y)#0
INX
INX
INX
@ -484,7 +520,7 @@ asm _dcgrHLinScrB
BNE -
RTS
end
export asm dcgrVLinScr(y1, y2, x)#0
asm dcgrVLinScr(y1, y2, x)#0
INX
INX
INX
@ -509,7 +545,7 @@ asm _dcgrVLinScrB
BNE -
RTS
end
export asm dcgrBitScr(x, y, bitw, bith, bitptr)#0
asm dcgrBitmapScr(x, y, bitw, bith, bitptr)#0
INX
INX
INX
@ -538,7 +574,7 @@ YBITS LDY ESTKL-2,X ; Y COORD
STA SRCH
BNE NXTBITS ; BRA
end
asm _dcgrBitScrA
asm _dcgrBitmapScrA
+ LDA $1000,Y ; HGRSCANL
STA DSTL
LDA $2000,Y ; HGRSCANH
@ -561,7 +597,7 @@ BITSCR LDY ESTKH-1,X ; CURRENT X COORD
BCS +
PHA
end
asm _dcgrBitScrB
asm _dcgrBitmapScrB
JSR $1000 ; PLOT PIXEL
PLA
+ INC ESTKH-1,X ; X++
@ -572,7 +608,7 @@ NXTBITS DEC ESTKL-4,X ; HEIGHT
BNE YBITS ; NEXT ROW
RETBITS RTS
end
export asm dcgrPixScr(x, y, pixw, pixh, pixptr)#0
asm dcgrPixmapScr(x, y, pixw, pixh, pixptr)#0
INX
INX
INX
@ -600,7 +636,7 @@ YPIXS LDY ESTKL-2,X ; Y COORD
STA SRCH
BNE NXTPIXS ; BRA
end
asm _dcgrPixScrA
asm _dcgrPixmapScrA
+ LDA $1000,Y ; HGRSCANL
STA DSTL
LDA $2000,Y ; HGRSCANH
@ -616,11 +652,11 @@ PIXSCRL CMP #140 ; OFF SCREEN?
BEQ PIXSCRH
TAY
end
asm _dcgrPixScrB
asm _dcgrPixmapScrB
JSR $2000 ; SET COLOR
LDY TMPL
end
asm _dcgrPixScrC
asm _dcgrPixmapScrC
JSR $1000 ; PLOT PIXEL
PIXSCRH INC TMPL
LDA TMPL
@ -638,11 +674,11 @@ PIXSCRH INC TMPL
BEQ +
TAY
end
asm _dcgrPixScrD
asm _dcgrPixmapScrD
JSR $2000 ; SET COLOR
LDY TMPL
end
asm _dcgrPixScrE
asm _dcgrPixmapScrE
JSR $1000 ; PLOT PIXEL
+ INC SRCL
BNE +
@ -659,7 +695,7 @@ end
// Memory destination functions
// Memory Block format: AUX scanline followed by MAIN scanline
//
export asm dcgrPlotMem(x, y, memptr, memspan)#0
asm dcgrPlotMem(x, y, memptr, memspan)#0
INX
INX
INX
@ -812,7 +848,7 @@ asm _dcgrOpPlotMemH
LDX ESP
RTS
end
export asm dcgrHLinMem(x1, x2, y, memptr, memspan)#0
asm dcgrHLinMem(x1, x2, y, memptr, memspan)#0
INX
INX
INX
@ -849,7 +885,7 @@ asm _dcgrHLinMemB
BNE -
RTS
end
export asm dcgrVLinMem(y1, y2, x, memptr, memspan)#0
asm dcgrVLinMem(y1, y2, x, memptr, memspan)#0
INX
INX
INX
@ -889,7 +925,7 @@ asm _dcgrVLinMemB
BNE YVM
+ RTS
end
export asm dcgrBitMem(x, y, bitw, bith, bitptr, memw, memh, memptr, memspan)#0
asm dcgrBitmapMem(x, y, bitw, bith, bitptr, memw, memh, memptr, memspan)#0
TXA
CLC
ADC #9
@ -954,7 +990,7 @@ BITMEM LDA ESTKH-1,X ; CURRENT X COORD
BCC +
LDA ESTKL-9,X ; SPAN
end
asm _dcgrBitMemA
asm _dcgrBitmapMemA
JSR $1000 ; PLOT PIXEL
+ INC ESTKH-1,X ; X++
DEC TMPL
@ -972,7 +1008,7 @@ NXTBITM CLC
BNE YBITM ; NEXT ROW
RETBITM RTS
end
export asm dcgrPixMem(x, y, pixw, pixh, pixptr, memw, memh, memptr, memspan)#0
asm dcgrPixmapMem(x, y, pixw, pixh, pixptr, memw, memh, memptr, memspan)#0
TXA
CLC
ADC #9
@ -1014,7 +1050,7 @@ YPIXM LDA ESTKL-2,X ; Y COORD
STA SRCH
BNE NXTPIXM ; BRA
end
asm _dcgrPixMemA
asm _dcgrPixmapMemA
+ LDA ESTKL-1,X ; X COORD
STA TMPL
PIXMEML CMP ESTKL-6,X ; OUT OF DST BOUNDS?
@ -1026,12 +1062,12 @@ PIXMEML CMP ESTKL-6,X ; OUT OF DST BOUNDS?
BEQ PIXMEMH
TAY
end
asm _dcgrPixMemB
asm _dcgrPixmapMemB
JSR $2000 ; SET COLOR
LDA ESTKL-9,X ; SPAN
LDY TMPL
end
asm _dcgrPixMemC
asm _dcgrPixmapMemC
JSR $1000 ; PLOT PIXEL
PIXMEMH INC TMPL
LDA TMPL
@ -1049,12 +1085,12 @@ PIXMEMH INC TMPL
BEQ +
TAY
end
asm _dcgrPixMemD
asm _dcgrPixmapMemD
JSR $2000 ; SET COLOR
LDA ESTKL-9,X ; SPAN
LDY TMPL
end
asm _dcgrPixMemE
asm _dcgrPixmapMemE
JSR $1000 ; PLOT PIXEL
+ INC SRCL ; PIXPTR
BNE +
@ -1082,7 +1118,7 @@ end
//
// Screen -> Memory Block7 Transfer
//
export asm dcgrScrBl7Mem(x7, y, w7, h, memptr, memspan)#0
asm dcgrScrBl7Mem(x7, y, w7, h, memptr, memspan)#0
TXA
CLC
ADC #6
@ -1149,7 +1185,7 @@ end
//
// Memory -> Screen Block7 Transfer
//
export asm dcgrMemBl7Scr(x7, y, w7, h, memptr, memspan)#0
asm dcgrMemBl7Scr(x7, y, w7, h, memptr, memspan)#0
TXA
CLC
ADC #6
@ -1306,7 +1342,7 @@ end
//
// Memory -> Memory Block7 function
//
export asm dcgrMemBl7Mem(x7, y, srcw7, srch, srcptr, srcspan, dstw7, dsth, dstptr)#0
asm dcgrMemBl7Mem(x7, y, srcw7, srch, srcptr, srcspan, dstw7, dsth, dstptr)#0
TXA
CLC
ADC #9
@ -1505,7 +1541,7 @@ end
//
// Clear Screen/Memory Block7
//
export asm dcgrClearBl7Scr(x7, y, w7, h)#0
asm dcgrClearBl7Scr(x7, y, w7, h)#0
INX
INX
INX
@ -1563,7 +1599,7 @@ asm _dcgrClearBl7ScrC
BNE YFILS
RETFILS RTS
end
export asm dcgrClearBl7Mem(x7, y, w7, h, memptr, memspan)#0
asm dcgrClearBl7Mem(x7, y, w7, h, memptr, memspan)#0
TXA
CLC
ADC #6
@ -1652,7 +1688,34 @@ export asm dcgrVLB#0
PLP
RTS
end
export def dcgrOpScr(op)#0
//
// Hack to extend parameters for memory functions
//
def extPlotMem#0
(@dcgrPlotMem)(surfPtr, surfSpan)#0
end
def extHLinMem#0
(@dcgrHLinMem)(surfPtr, surfSpan)#0
end
def extVLinMem#0
(@dcgrVLinMem)(surfPtr, surfSpan)#0
end
def extBitmapMem#0
(@dcgrBitmapMem)(surfWidth, surfHeight, surfPtr, surfSpan)#0
end
def extPixmapMem#0
(@dcgrPixmapMem)(surfWidth, surfHeight, surfPtr, surfSpan)#0
end
def extScrBl7Mem#0
(@dcgrScrBl7Mem)(surfPtr, surfSpan)#0
end
def extMemBl7Mem#0
(@dcgrMemBl7Mem)(surfWidth7, surfHeight, surfPtr)#0
end
def extClearBl7Mem#0
(@dcgrClearBl7Mem)(surfPtr, surfSpan)#0
end
def dcgrOpScr(op)#0
byte opcode
//
@ -1668,9 +1731,9 @@ export def dcgrOpScr(op)#0
_jmpOpPlotScr:1 = @_dcgrOpPlotScrB
_dcgrHLinScrB:1 = @_dcgrOpPlotScrB
_dcgrVLinScrB:1 = @_dcgrOpPlotScrB
_dcgrBitScrB:1 = @_dcgrOpPlotScrB
_dcgrPixScrC:1 = @_dcgrOpPlotScrB
_dcgrPixScrE:1 = @_dcgrOpPlotScrB
_dcgrBitmapScrB:1 = @_dcgrOpPlotScrB
_dcgrPixmapScrC:1 = @_dcgrOpPlotScrB
_dcgrPixmapScrE:1 = @_dcgrOpPlotScrB
_dcgrOpPlotScrD.3 = opcode
_dcgrOpPlotScrE.3 = opcode
_dcgrOpPlotScrG.3 = opcode
@ -1680,17 +1743,17 @@ export def dcgrOpScr(op)#0
_dcgrOpMemBl7ScrD.0 = opcode
break
otherwise // OP_SRC
_jmpOpPlotScr:1 = @_dcgrPlotScrB
_dcgrHLinScrB:1 = @_dcgrPlotScrB
_dcgrVLinScrB:1 = @_dcgrPlotScrB
_dcgrBitScrB:1 = @_dcgrPlotScrB
_dcgrPixScrC:1 = @_dcgrPlotScrB
_dcgrPixScrE:1 = @_dcgrPlotScrB
_jmpOpMemBl7Scr:1 = @_dcgrMemBl7ScrA
_jmpOpPlotScr:1 = @_dcgrPlotScrB
_dcgrHLinScrB:1 = @_dcgrPlotScrB
_dcgrVLinScrB:1 = @_dcgrPlotScrB
_dcgrBitmapScrB:1 = @_dcgrPlotScrB
_dcgrPixmapScrC:1 = @_dcgrPlotScrB
_dcgrPixmapScrE:1 = @_dcgrPlotScrB
_jmpOpMemBl7Scr:1 = @_dcgrMemBl7ScrA
wend
end
export def dcgrOpMem(op)#0
def dcgrOpMem(op)#0
byte opcode
//
@ -1706,9 +1769,9 @@ export def dcgrOpMem(op)#0
_jmpOpPlotMem:1 = @_dcgrOpPlotMemB
_dcgrHLinMemB:1 = @_dcgrOpPlotMemB
_dcgrVLinMemB:1 = @_dcgrOpPlotMemB
_dcgrBitMemA:1 = @_dcgrOpPlotMemB
_dcgrPixMemC:1 = @_dcgrOpPlotMemB
_dcgrPixMemE:1 = @_dcgrOpPlotMemB
_dcgrBitmapMemA:1 = @_dcgrOpPlotMemB
_dcgrPixmapMemC:1 = @_dcgrOpPlotMemB
_dcgrPixmapMemE:1 = @_dcgrOpPlotMemB
_dcgrOpPlotMemD.3 = opcode
_dcgrOpPlotMemE.3 = opcode
_dcgrOpPlotMemG.3 = opcode
@ -1720,21 +1783,70 @@ export def dcgrOpMem(op)#0
_dcgrOpMemBl7MemD.7 = opcode
break
otherwise // OP_SRC
_jmpOpPlotMem:1 = @_dcgrPlotMemB
_dcgrHLinMemB:1 = @_dcgrPlotMemB
_dcgrVLinMemB:1 = @_dcgrPlotMemB
_dcgrBitMemA:1 = @_dcgrPlotMemB
_dcgrPixMemC:1 = @_dcgrPlotMemB
_dcgrPixMemE:1 = @_dcgrPlotMemB
_jmpOpMemBl7Mem:1 = @_dcgrMemBl7MemB
_jmpOpPlotMem:1 = @_dcgrPlotMemB
_dcgrHLinMemB:1 = @_dcgrPlotMemB
_dcgrVLinMemB:1 = @_dcgrPlotMemB
_dcgrBitmapMemA:1 = @_dcgrPlotMemB
_dcgrPixmapMemC:1 = @_dcgrPlotMemB
_dcgrPixmapMemE:1 = @_dcgrPlotMemB
_jmpOpMemBl7Mem:1 = @_dcgrMemBl7MemB
wend
end
export def dcgrAllocBl7Mem(w, h)#2
word memblk, span
span = (w+13)/7 << 2
memblk = heapalloc(span * h)
return memblk, span
export def dcgrOp(op)#0
if dcgrSurface // Memory
if op <> opMem
opMem = op
dcgrOpMem(opMem)
fin
else // Screen
if op <> opScr
opScr = op
dcgrOpScr(opScr)
fin
fin
end
export def dcgrSurfScr(op)#0
surfWidth = 140
surfWidth7 = 20
surfHeight = 192
surfPtr = $2000
surfSpan = 40
if dcgrSurface == DST_MEMORY
dcgrSurface = DST_SCREEN
dcgrPlot:1 = @dcgrPlotScr
dcgrHLin:1 = @dcgrHLinScr
dcgrVLin:1 = @dcgrVLinScr
dcgrBitmap:1 = @dcgrBitmapScr
dcgrPixmap:1 = @dcgrPixmapScr
dcgrMemBl7:1 = @dcgrMemBl7Scr
dcgrClearBl7:1 = @dcgrClearBl7Scr
fin
if op <> opScr
opScr = op
dcgrOpScr(opScr)
fin
end
export def dcgrSurfMem(op, memh, memptr, memspan)#0
surfWidth7 = memspan >> 2
surfWidth = surfWidth7 * 7
surfHeight = memh
surfPtr = memptr
surfSpan = memspan
if dcgrSurface == DST_SCREEN
dcgrSurface = DST_MEMORY
dcgrPlot:1 = @extPlotMem
dcgrHLin:1 = @extHLinMem
dcgrVLin:1 = @extVLinMem
dcgrBitmap:1 = @extBitmapMem
dcgrPixmap:1 = @extPixmapMem
dcgrScrBl7:1 = @extScrBl7Mem
dcgrMemBl7:1 = @extMemBl7Mem
dcgrClearBl7:1 = @extClearBl7Mem
fin
if op <> opMem
opMem = op
dcgrOpMem(opMem)
fin
end
export def dcgrMode(mode)
if mode >= 0
@ -1771,60 +1883,60 @@ fin
//
// Assembly symbol fixups
//
_dcgrColorA:1 = @auxclrsl
_dcgrColorA:4 = @auxclrl
_dcgrColorA:7 = @auxclrsh
_dcgrColorA:10 = @auxclrh
_dcgrColorA:13 = @memclrsl
_dcgrColorA:16 = @memclrl
_dcgrColorA:19 = @memclrsh
_dcgrColorA:22 = @memclrh
_dcgrColorA:1 = @auxclrsl
_dcgrColorA:4 = @auxclrl
_dcgrColorA:7 = @auxclrsh
_dcgrColorA:10 = @auxclrh
_dcgrColorA:13 = @memclrsl
_dcgrColorA:16 = @memclrl
_dcgrColorA:19 = @memclrsh
_dcgrColorA:22 = @memclrh
//
// Screen function fixups
//
_dcgrPlotScrA:1 = @hgrscanl
_dcgrPlotScrA:6 = @hgrscanh
_dcgrPlotScrB:1 = @divmod7
_dcgrPlotScrC:1 = @auxclrmsk
_dcgrPlotScrD:1 = @auxclrl
_dcgrPlotScrD:6 = @auxclrmsk
_dcgrPlotScrE:1 = @auxclrh
_dcgrPlotScrE:6 = @auxclrmsk
_dcgrPlotScrF:1 = @memclrmsk
_dcgrPlotScrG:1 = @memclrl
_dcgrPlotScrG:6 = @memclrmsk
_dcgrPlotScrH:1 = @memclrh
_dcgrPlotScrH:6 = @memclrmsk
_dcgrOpPlotScrB:1 = @divmod7
_dcgrOpPlotScrC:1 = @auxclrmsk
_dcgrOpPlotScrD:1 = @auxclrl
_dcgrOpPlotScrE:1 = @auxclrh
_dcgrOpPlotScrF:1 = @memclrmsk
_dcgrOpPlotScrG:1 = @memclrl
_dcgrOpPlotScrH:1 = @memclrh
_dcgrHLinScrA:1 = @hgrscanl
_dcgrHLinScrA:6 = @hgrscanh
_dcgrHLinScrB:1 = @_dcgrPlotScrB
_dcgrVLinScrA:1 = @hgrscanl
_dcgrVLinScrA:6 = @hgrscanh
_dcgrVLinScrB:1 = @_dcgrPlotScrB
_dcgrBitScrA:1 = @hgrscanl
_dcgrBitScrA:6 = @hgrscanh
_dcgrBitScrB:1 = @_dcgrPlotScrB
_dcgrPixScrA:1 = @hgrscanl
_dcgrPixScrA:6 = @hgrscanh
_dcgrPixScrB:1 = @_dcgrColorA
_dcgrPixScrC:1 = @_dcgrPlotScrB
_dcgrPixScrD:1 = @_dcgrColorA
_dcgrPixScrE:1 = @_dcgrPlotScrB
_clipXClearBl7Scr:1 = @_clipX
_clipYClearBl7Scr:1 = @_clipY
_dcgrClearBl7ScrA:1 = @hgrscanl
_dcgrClearBl7ScrA:8 = @hgrscanh
_dcgrClearBl7ScrB:1 = @auxclrh
_dcgrClearBl7ScrB:7 = @auxclrl
_dcgrClearBl7ScrC:1 = @memclrh
_dcgrClearBl7ScrC:7 = @memclrl
_dcgrPlotScrA:1 = @hgrscanl
_dcgrPlotScrA:6 = @hgrscanh
_dcgrPlotScrB:1 = @divmod7
_dcgrPlotScrC:1 = @auxclrmsk
_dcgrPlotScrD:1 = @auxclrl
_dcgrPlotScrD:6 = @auxclrmsk
_dcgrPlotScrE:1 = @auxclrh
_dcgrPlotScrE:6 = @auxclrmsk
_dcgrPlotScrF:1 = @memclrmsk
_dcgrPlotScrG:1 = @memclrl
_dcgrPlotScrG:6 = @memclrmsk
_dcgrPlotScrH:1 = @memclrh
_dcgrPlotScrH:6 = @memclrmsk
_dcgrOpPlotScrB:1 = @divmod7
_dcgrOpPlotScrC:1 = @auxclrmsk
_dcgrOpPlotScrD:1 = @auxclrl
_dcgrOpPlotScrE:1 = @auxclrh
_dcgrOpPlotScrF:1 = @memclrmsk
_dcgrOpPlotScrG:1 = @memclrl
_dcgrOpPlotScrH:1 = @memclrh
_dcgrHLinScrA:1 = @hgrscanl
_dcgrHLinScrA:6 = @hgrscanh
_dcgrHLinScrB:1 = @_dcgrPlotScrB
_dcgrVLinScrA:1 = @hgrscanl
_dcgrVLinScrA:6 = @hgrscanh
_dcgrVLinScrB:1 = @_dcgrPlotScrB
_dcgrBitmapScrA:1 = @hgrscanl
_dcgrBitmapScrA:6 = @hgrscanh
_dcgrBitmapScrB:1 = @_dcgrPlotScrB
_dcgrPixmapScrA:1 = @hgrscanl
_dcgrPixmapScrA:6 = @hgrscanh
_dcgrPixmapScrB:1 = @_dcgrColorA
_dcgrPixmapScrC:1 = @_dcgrPlotScrB
_dcgrPixmapScrD:1 = @_dcgrColorA
_dcgrPixmapScrE:1 = @_dcgrPlotScrB
_clipXClearBl7Scr:1 = @_clipX
_clipYClearBl7Scr:1 = @_clipY
_dcgrClearBl7ScrA:1 = @hgrscanl
_dcgrClearBl7ScrA:8 = @hgrscanh
_dcgrClearBl7ScrB:1 = @auxclrh
_dcgrClearBl7ScrB:7 = @auxclrl
_dcgrClearBl7ScrC:1 = @memclrh
_dcgrClearBl7ScrC:7 = @memclrl
//
// Memory function fixups
//
@ -1848,11 +1960,11 @@ _dcgrOpPlotMemG:1 = @memclrl
_dcgrOpPlotMemH:1 = @memclrh
_dcgrHLinMemB:1 = @_dcgrPlotMemB
_dcgrVLinMemB:1 = @_dcgrPlotMemB
_dcgrBitMemA:1 = @_dcgrPlotMemB
_dcgrPixMemB:1 = @_dcgrColorA
_dcgrPixMemC:1 = @_dcgrPlotMemB
_dcgrPixMemD:1 = @_dcgrColorA
_dcgrPixMemE:1 = @_dcgrPlotMemB
_dcgrBitmapMemA:1 = @_dcgrPlotMemB
_dcgrPixmapMemB:1 = @_dcgrColorA
_dcgrPixmapMemC:1 = @_dcgrPlotMemB
_dcgrPixmapMemD:1 = @_dcgrColorA
_dcgrPixmapMemE:1 = @_dcgrPlotMemB
_dcgrClearBl7MemB:1 = @auxclrh
_dcgrClearBl7MemB:6 = @memclrh
_dcgrClearBl7MemB:12 = @auxclrl
@ -1860,17 +1972,17 @@ _dcgrClearBl7MemB:17 = @memclrl
//
// Memory <-> Screen Block Transfer fixups
//
_dcgrScrBl7MemA:1 = @hgrscanl
_dcgrScrBl7MemA:8 = @hgrscanh
_clipXMemBl7Src:1 = @_clipX
_clipYMemBl7Scr:1 = @_clipY
_dcgrMemBl7ScrB:1 = @hgrscanl
_dcgrMemBl7ScrB:8 = @hgrscanh
_dcgrOpMemBl7ScrB:1 = @hgrscanl
_dcgrOpMemBl7ScrB:8 = @hgrscanh
_dcgrScrBl7MemA:1 = @hgrscanl
_dcgrScrBl7MemA:8 = @hgrscanh
_clipXMemBl7Src:1 = @_clipX
_clipYMemBl7Scr:1 = @_clipY
_dcgrMemBl7ScrB:1 = @hgrscanl
_dcgrMemBl7ScrB:8 = @hgrscanh
_dcgrOpMemBl7ScrB:1 = @hgrscanl
_dcgrOpMemBl7ScrB:8 = @hgrscanh
//
// Memory <-> Memory Block Transfer fixups
//
_clipXMemBl7Mem:1 = @_clipX
_clipYMemBl7Mem:1 = @_clipY
_clipXMemBl7Mem:1 = @_clipX
_clipYMemBl7Mem:1 = @_clipY
done

View File

@ -138,6 +138,8 @@ byte = $00,$2C,$1A,$00,$00,$00,$00,$00,$00,$2A,$14,$2A,$14,$2A,$00,$00
//
// Test sprite
//
const SPR_WIDTH = 16
const SPR_HEIGHT = 16
byte[] sprite = $55,$55,$55,$05,$50,$55,$55,$55
byte[] = $55,$55,$00,$00,$00,$00,$55,$55
byte[] = $55,$00,$00,$AA,$AA,$00,$00,$55
@ -154,79 +156,87 @@ byte[] = $05,$00,$AA,$AA,$AA,$AA,$00,$50
byte[] = $55,$00,$00,$AA,$AA,$00,$00,$55
byte[] = $55,$55,$00,$00,$00,$00,$55,$55
byte[] = $55,$55,$55,$05,$50,$55,$55,$55
word sprite7mask[7]
word sprite7msk[7]
word sprite7[7]
word sprite7span, sprite7width
word sprite7span, sprite7w
//
// Sliding sprite Y coordinate
//
const SLIDE_Y = 170
//
// Utility functions
//
def dcgrAllocBl7Mem(w, h)#2
word memblk, span
def dcgrStrScr(x, y, strptr)#0
span = (w+13)/7 << 2
memblk = heapalloc(span * h)
return memblk, span
end
def dcgrStr(x, y, strptr)#0
byte i
for i = 1 to ^strptr
dcgrBitScr(x, y, 7, 8, @fontBits + (^(strptr + i) + 128) * 8)
dcgrBitmap(x, y, 7, 8, @fontBits + (^(strptr + i) + 128) * 8)
x = x + 7
next
end
def dcgrBoldStrScr(x, y, strptr)#0
def dcgrBoldStr(x, y, strptr)#0
byte h, v
for v = y - 1 to y + 1
for h = x - 1 to x + 1
dcgrStrScr(h, v, strptr)
dcgrStr(h, v, strptr)
next
next
dcgrColor(DCLR_BLACK)
dcgrStrScr(x, y, strptr)
dcgrStr(x, y, strptr)
end
def dcgrRectMem(x, y, w, h, dstptr, dstspan)#0
def dcgrRect(x, y, w, h)#0
byte x2, y2, v
if x < 0; w = w + x; x = 0; fin
if y < 0; h = h + y; y = 0; fin
x2 = x + w - 1
y2 = y + h - 1
for v = y to y2
dcgrHLinMem(x, x2, v, dstptr, dstspan)
next
end
def dcgrStrMem(x, y, strptr, dstw, dsth, dstptr, dstspan)#0
byte i
for i = 1 to ^strptr
dcgrBitMem(x, y, 7, 8, @fontBits + (^(strptr + i) + 128) * 8, dstw, dsth, dstptr, dstspan)
x = x + 7
dcgrHLin(x, x2, v)
next
end
////////////////////////////////////////////////////////////////
// //
// Test Harness //
// //
////////////////////////////////////////////////////////////////
def compileSprite#0
byte i
for i = 0 to 6
dcgrOpMem(OP_SRC)
sprite7[i], sprite7span = dcgrAllocBl7Mem(16, 16)
sprite7mask[i], sprite7span = dcgrAllocBl7Mem(16, 16)
sprite7width = sprite7span >> 2
sprite7[i], sprite7span = dcgrAllocBl7Mem(SPR_WIDTH, SPR_HEIGHT)
sprite7msk[i], sprite7span = dcgrAllocBl7Mem(SPR_WIDTH, SPR_HEIGHT)
sprite7w = sprite7span >> 2
dcgrSurfMem(OP_SRC, SPR_HEIGHT, sprite7[i], sprite7span)
dcgrColor(DCLR_BLACK)
dcgrClearBl7Mem(0, 0, sprite7width, 16, sprite7[i], sprite7span)
dcgrClearBl7(0, 0, sprite7w, SPR_HEIGHT)
dcgrPixmap(i + 2, 0, SPR_WIDTH, SPR_HEIGHT, @sprite)
dcgrSurfMem(OP_SRC, SPR_HEIGHT, sprite7msk[i], sprite7span)
dcgrColor(DCLR_WHITE)
dcgrClearBl7Mem(0, 0, sprite7width, 16, sprite7mask[i], sprite7span)
dcgrPixMem(i + 2, 0, 16, 16, @sprite, sprite7width * 7, 16, sprite7[i], sprite7span)
dcgrPixMem(i + 2, 0, 16, 16, @sprite, sprite7width * 7, 16, sprite7mask[i], sprite7span)
dcgrOpMem(OP_XOR)
dcgrPixMem(i + 2, 0, 16, 16, @sprite, sprite7width * 7, 16, sprite7mask[i], sprite7span)
dcgrMemBl7Scr(0, i*16, sprite7width, 16, sprite7[i], sprite7span)
dcgrMemBl7Scr(4, i*16, sprite7width, 16, sprite7mask[i], sprite7span)
dcgrClearBl7(0, 0, sprite7w, SPR_HEIGHT)
dcgrPixmap(i + 2, 0, SPR_WIDTH, SPR_HEIGHT, @sprite)
dcgrOp(OP_XOR)
dcgrPixmap(i + 2, 0, SPR_WIDTH, SPR_HEIGHT, @sprite)
dcgrSurfScr(OP_SRC)
dcgrMemBl7(0, i * SPR_HEIGHT, sprite7w, SPR_HEIGHT, sprite7[i], sprite7span)
dcgrMemBl7(sprite7w, i * SPR_HEIGHT, sprite7w, SPR_HEIGHT, sprite7msk[i], sprite7span)
next
dcgrOpMem(OP_SRC)
end
def dcgrTest#0
word i, j, k, i7, im7, k7, km7, s7w, inci, incj, inck
word backblk, backspan, backw7, backofst
word restrblk, restrspan, restrw7, restrw
word backblk, backspan
word restrblk, restrspan, restr7w, restrw
byte mode
setlineplot(@dcgrPlotScr)
setlinespans(@dcgrHLinScr, @dcgrVLinScr)
dcgrSurfScr(OP_SRC)
setlineplot(@dcgrPlot)
setlinespans(@dcgrHLin, @dcgrVLin)
for i = 0 to 191 step 2
dcgrColor(i)
linespans(0, 0, 139, i)
@ -236,22 +246,22 @@ def dcgrTest#0
linespans(0, 0, i, 191)
next
dcgrColor(DCLR_BLACK)
dcgrClearBl7Scr(21/7, 30, 100/7, 132)
dcgrClearBl7(21/7, 30, 100/7, 132)
dcgrColor(DCLR_WHITE)
dcgrHLinScr((21/7)*7-1, (21/7)*7+(100/7)*7, 29)
dcgrHLinScr((21/7)*7-1, (21/7)*7+(100/7)*7, 29+133)
dcgrVLinScr(29, 29+133, (21/7)*7-1)
dcgrVLinScr(29, 29+133, (21/7)*7+(100/7)*7)
dcgrBoldStrScr(30, 10, "Hello, DCGR!")
dcgrHLin((21/7)*7-1, (21/7)*7+(100/7)*7, 29)
dcgrHLin((21/7)*7-1, (21/7)*7+(100/7)*7, 29+133)
dcgrVLin(29, 29+133, (21/7)*7-1)
dcgrVLin(29, 29+133, (21/7)*7+(100/7)*7)
dcgrBoldStr(30, 10, "Hello, DCGR!")
i = 64; j = 64; k = 86
k7 = k/7
inci = 1; incj = 1; inck = 2
backblk, backspan = dcgrAllocBl7Mem(SCR_WIDTH, 16)
backw7 = backspan >> 2
dcgrScrBl7Mem(0, 170, backw7, 16, backblk, backspan)
restrblk, restrspan = dcgrAllocBl7Mem(16, 16)
restrw7 = restrspan >> 2
restrw = restrw7 * 7
backblk, backspan = dcgrAllocBl7Mem(SCR_WIDTH, SPR_HEIGHT)
dcgrSurfMem(OP_SRC, SPR_HEIGHT, backblk, backspan)
dcgrScrBl7(0, SLIDE_Y, backspan >> 2, SPR_HEIGHT)
restrblk, restrspan = dcgrAllocBl7Mem(SPR_WIDTH, SPR_HEIGHT)
restr7w = restrspan >> 2
restrw = restr7w * 7
mode = 8
while mode
if ^$C000 >= 128
@ -259,50 +269,59 @@ def dcgrTest#0
fin
k7, km7 = divmod(k, 7)
i7, im7 = divmod(i, 7)
if i7 + sprite7width < (21/7)+(100/7)
s7w = sprite7width
if i7 + sprite7w < (21/7)+(100/7)
s7w = sprite7w
else
s7w = (21/7)+(100/7) - i7
fin
dcgrOpMem(OP_SRC)
when mode
is 1
dcgrMemBl7Scr(i7, j, s7w, 16, sprite7[im7], sprite7span)
dcgrSurfScr(OP_SRC)
dcgrMemBl7(i7, j, s7w, SPR_HEIGHT, sprite7[im7], sprite7span)
is 2
if k < 0 and km7 // Handle off left edge special case
k7--
km7 = 7 + km7
fin
dcgrMemBl7Mem(0, 0, restrw7, 16, backblk + (k7 << 1), backspan, restrw7, 16, restrblk)
dcgrOpMem(OP_AND)
dcgrMemBl7Mem(0, 0, sprite7width, 16, sprite7mask[km7], sprite7span, restrw7, 16, restrblk)
dcgrOpMem(OP_XOR)
dcgrMemBl7Mem(0, 0, sprite7width, 16, sprite7[km7], sprite7span, restrw7, 16, restrblk)
dcgrOpMem(OP_SRC)
dcgrMemBl7Scr(k7, 170, restrw7, 16, restrblk, restrspan)
dcgrSurfMem(OP_SRC, SPR_HEIGHT, restrblk, restrspan)
dcgrMemBl7(0, 0, restr7w, SPR_HEIGHT, backblk + (k7 << 1), backspan)
dcgrOp(OP_AND)
dcgrMemBl7(0, 0, sprite7w, SPR_HEIGHT, sprite7msk[km7], sprite7span)
dcgrOp(OP_XOR)
dcgrMemBl7(0, 0, sprite7w, SPR_HEIGHT, sprite7[km7], sprite7span)
dcgrSurfScr(OP_SRC)
dcgrMemBl7(k7, SLIDE_Y, restr7w, SPR_HEIGHT, restrblk, restrspan)
break
is 3
dcgrPixScr(i + 2, j, 16, 16, @sprite)
dcgrSurfScr(OP_SRC)
dcgrPixmap(i, j, SPR_WIDTH, SPR_HEIGHT, @sprite)
is 4
dcgrMemBl7Mem(0, 0, restrw7, 16, backblk + (k7 << 1), backspan, restrw7, 16, restrblk)
dcgrPixMem(km7 + 2, 0, 16, 16, @sprite, restrw, 16, restrblk, restrspan)
dcgrMemBl7Scr(k7, 170, restrw7, 16, restrblk, restrspan)
dcgrSurfMem(OP_SRC, SPR_HEIGHT, restrblk, restrspan)
dcgrMemBl7(0, 0, restr7w, SPR_HEIGHT, backblk + (k7 << 1), backspan)
dcgrPixmap(km7 + 2, 0, SPR_HEIGHT, SPR_HEIGHT, @sprite)
dcgrSurfScr(OP_SRC)
dcgrMemBl7(k7, SLIDE_Y, restr7w, SPR_HEIGHT, restrblk, restrspan)
break
is 5
dcgrPixScr(i + 2, j, 16, 16, @sprite)
dcgrSurfScr(OP_SRC)
dcgrPixmap(i, j, SPR_WIDTH, SPR_HEIGHT, @sprite)
is 6
dcgrMemBl7Mem(0, 0, restrw7, 16, backblk + (k7 << 1), backspan, restrw7, 16, restrblk)
dcgrSurfMem(OP_SRC, SPR_HEIGHT, restrblk, restrspan)
dcgrMemBl7(0, 0, restr7w, SPR_HEIGHT, backblk + (k7 << 1), backspan)
dcgrColor(DCLR_BLACK)
dcgrRectMem(km7 + 2, 3, 14 + 2, 10, restrblk, restrspan)
dcgrRect(km7 + 2, 3, 14 + 2, 10)
dcgrColor(DCLR_WHITE)
dcgrStrMem(km7 + 3, 4, "DC", restrw, 16, restrblk, restrspan)
dcgrMemBl7Scr(k7, 170, restrw7, 16, restrblk, restrspan)
dcgrStr(km7 + 3, 4, "DC")
dcgrSurfScr(OP_SRC)
dcgrMemBl7(k7, SLIDE_Y, restr7w, SPR_HEIGHT, restrblk, restrspan)
break
is 7
dcgrMemBl7Scr(i7, j, s7w, 16, sprite7[im7], sprite7span)
dcgrSurfScr(OP_SRC)
dcgrMemBl7(i7, j, s7w, SPR_HEIGHT, sprite7[im7], sprite7span)
break
is 8
dcgrPixScr(i, j, 16, 16, @sprite)
dcgrSurfScr(OP_SRC)
dcgrPixmap(i, j, SPR_WIDTH, SPR_HEIGHT, @sprite)
break
wend
if k > 136 or k < -16; inck = -inck; fin