diff --git a/src/inc/dgr.plh b/src/inc/dgr.plh index 0449a16..57106dc 100644 --- a/src/inc/dgr.plh +++ b/src/inc/dgr.plh @@ -1,16 +1,25 @@ import dgr word[] dgrbuff - predef dgrPlot(buff, x, y)#0 - predef dgrHLin(buff, x1, x2, y)#0 - predef dgrVLin(buff, x, y1, y2)#0 - predef dgrBLT(buff, x, y, width, height, src)#0 - predef dgrTile(buff, x, y, src)#0 - predef dgrTileStr(buff, x, y, tilestr, strlen, tilebuff)#0 - predef dgrFill(buff, x, y, tile)#0 + predef dgrPlotBuf(x, y, bufptr)#0 + predef dgrHLinBuf(x1, x2, y, bufptr)#0 + predef dgrVLinBuf(x, y1, y2, bufptr)#0 + predef dgrBLTBuf(bufptr, x, y, width, height, src)#0 + predef dgrTileBuf(bufptr, x, y, src)#0 + predef dgrTileStrBuf(bufptr, x, y, tilestr, strlen, tilebuff)#0 + predef dgrFillBuf(bufptr, x, y, tile)#0 predef dgrMode#1 predef txtMode#0 predef dgrShow(page)#1 + predef dgrSwap#0 + predef dgrDrawBuf(page)#0 + predef dgrClearBuf(bufptr, clr)#0 + predef dgrClear(clr)#0 + predef dgrPlot(x, y)#0 predef dgrColor(clr)#0 - predef dgrLine(buff, x1, y1, x2, y2)#0 - predef dgrClear(buff, clr)#0 + predef dgrHLin(x1, x2, y)#0 + predef dgrVLin(y1, y2, x)#0 + predef dgrBLT(x, y, width, height, src)#0 + predef dgrTile(x, y, src)#0 + predef dgrTileStr(x, y, tilestr, strlen, tilebuff)#0 + predef dgrFill(x, y, tile)#0 end diff --git a/src/inc/linespans.plh b/src/inc/linespans.plh new file mode 100644 index 0000000..3145d3f --- /dev/null +++ b/src/inc/linespans.plh @@ -0,0 +1,4 @@ +import linespans + predef setlinespans(h, v)#0 + predef linetospans(x1, y1, x2, y2)#0 +end diff --git a/src/libsrc/apple/dgr.pla b/src/libsrc/apple/dgr.pla index d76d49e..a0063dd 100755 --- a/src/libsrc/apple/dgr.pla +++ b/src/libsrc/apple/dgr.pla @@ -31,6 +31,8 @@ word[] dgr2rows = $0800,$0880,$0900,$0980,$0A00,$0A80,$0B00,$0B80 word = $0828,$08A8,$0928,$09A8,$0A28,$0AA8,$0B28,$0BA8 word = $0850,$08D0,$0950,$09D0,$0A50,$0AD0,$0B50,$0BD0 export word[] dgrbuff = @dgr1rows, @dgr2rows +word drawbufptr +byte drawpage // // Color mapping. // @@ -49,7 +51,7 @@ end // // Plot pixel // -export asm dgrPlot(buff, x, y)#0 +export asm dgrPlotBuf(bufptr, x, y)#0 ; GET BUFFER ADDRESS STX ESP LDA ESTKL+2,X @@ -82,16 +84,23 @@ end // // Plot horizontal row of pixels // -export asm dgrHLin(buff, x1, x2, y)#0 +export asm dgrHLin(x1, x2, y)#0 + DEX + LDA $3000 + STA ESTKL,X + LDA $3001 + STA ESTKH,X +end +export asm dgrHLinBuf(x1, x2, y, bufptr)#0 ; GET BUFFER ADDRESS STX ESP - LDA ESTKL+3,X + LDA ESTKL,X STA SRCL - LDA ESTKH+3,X + LDA ESTKH,X STA SRCH - LDA ESTKL+1,X ; X2 COORD + LDA ESTKL+2,X ; X2 COORD STA TMPH - LDA ESTKL,X ; Y COORD + LDA ESTKL+1,X ; Y COORD AND #$FE TAY LDA (SRC),Y @@ -99,10 +108,10 @@ export asm dgrHLin(buff, x1, x2, y)#0 INY LDA (SRC),Y STA GBASH - LDY ESTKL+2,X ; X1 COORD + LDY ESTKL+3,X ; X1 COORD PHP SEI -- LDA ESTKL,X +- LDA ESTKL+1,X ; Y COORD LSR TYA LDX GCLR ; COLOR @@ -110,8 +119,8 @@ end asm _dgrHLinPix JSR $3000 ; _dgrSetPix LDX ESP - INC ESTKL+2,X ; X1 COORD - LDY ESTKL+2,X + INC ESTKL+3,X ; X1 COORD + LDY ESTKL+3,X CPY TMPH ; X2 COORD BCC - BEQ - @@ -125,14 +134,21 @@ end // // Plot horizontal row of pixels // -export asm dgrVLin(buff, x, y1, y2)#0 +export asm dgrVLin(y1, y2, x)#0 + DEX + LDA $3000 + STA ESTKL,X + LDA $3001 + STA ESTKH,X +end +export asm dgrVLinBuf(y1, y2, x, bufptr)#0 ; GET BUFFER ADDRESS STX ESP - LDA ESTKL+3,X + LDA ESTKL,X STA SRCL - LDA ESTKH+3,X + LDA ESTKH,X STA SRCH - LDA ESTKL+1,X ; Y1 COORD + LDA ESTKL+3,X ; Y1 COORD PHP SEI - AND #$FE @@ -142,17 +158,17 @@ export asm dgrVLin(buff, x, y1, y2)#0 INY LDA (SRC),Y STA GBASH - LDA ESTKL+1,X + LDA ESTKL+3,X LSR - LDA ESTKL+2,X ; X COORD + LDA ESTKL+1,X ; X COORD LDX GCLR ; COLOR end asm _dgrVLinPix JSR $3000 ; _dgrSetPix LDX ESP - INC ESTKL+1,X ; Y1 COORD - LDA ESTKL+1,X - CMP ESTKL,X ; Y2 COORD + INC ESTKL+3,X ; Y1 COORD + LDA ESTKL+3,X + CMP ESTKL+2,X ; Y2 COORD BCC - BEQ - PLP @@ -165,7 +181,7 @@ end // // Draw sprite // -export asm dgrBLT(buff, x, y, width, height, src)#0 +export asm dgrBLTBuf(bufptr, x, y, width, height, src)#0 LDA ESTKL,X ; SPRITE STA SRCL LDA ESTKH,X @@ -326,7 +342,7 @@ end // // Draw 8x8 tile (forced to 2x2 block address) // -export asm dgrTile(buff, x, y, src)#0 +export asm dgrTileBuf(bufptr, x, y, src)#0 STX ESP LDA ESTKL,X ; TILE STA SRCL @@ -413,7 +429,7 @@ end // // Draw a string of tiles // -export asm dgrTileStr(buff, x, y, tilestr, strlen, tilebuff)#0 +export asm dgrTileStrBuf(bufptr, x, y, tilestr, strlen, tilebuff)#0 - DEX DEX DEX @@ -450,7 +466,7 @@ end // // Fill a buffer with tiles // -export asm dgrFill(buff, x, y, tile)#0 +export asm dgrFillBuf(bufptr, x, y, tile)#0 LDA ESTKL+2,X AND #$0F STA ESTKL+2,X @@ -526,6 +542,8 @@ export def dgrMode#1 ^ena80 = 0 ^show80 = 0 ^an3on + drawpage = 1 + drawbufptr = dgrbuff[1] return 1 end // @@ -548,6 +566,15 @@ export def dgrShow(page)#1 ^(showpage1 + page) return page ^ 1 end +export def dgrSwap#0 + ^(showpage1 + drawpage) + drawpage = drawpage ^ 1 + drawbufptr = dgrbuff[drawpage] +end +export def dgrDrawBuf(page)#0 + drawpage = page + drawbufptr = dgrbuff[drawpage] +end // // Set color for clear & plot routines // @@ -555,89 +582,39 @@ export def dgrColor(clr)#0 ^$30 = clr & $0F end // -// Draw line -// -export def dgrLine(buff, x1, y1, x2, y2)#0 - 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 - x1, x2 = x2, x1 - y1, y2 = y2, y1 - 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 - x1, x2 = x2, x1 - y1, y2 = y2, y1 - 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 // -export def dgrClear(buff, clr)#0 +export def dgrClearBuf(bufptr, clr)#0 byte[32] clrtile clr = evnclr[clr&$0F] | (oddclr[clr&$0F] << 8) memset(@clrtile, clr, 32) - dgrFill(buff, 0, 0, @clrtile) + dgrFillBuf(bufptr, 0, 0, @clrtile) +end +export def dgrClear(clr)#0 + byte[32] clrtile + + clr = evnclr[clr&$0F] | (oddclr[clr&$0F] << 8) + memset(@clrtile, clr, 32) + dgrFillBuf(drawbufptr, 0, 0, @clrtile) +end +// +// Draw functions +// +export def dgrPlot(x, y)#0 + dgrPlotBuf(drawbufptr, x, y) +end +export def dgrBLT(x, y, width, height, src)#0 + dgrBLTBuf(drawbufptr, x, y, width, height, src) +end +export def dgrTile(x, y, src)#0 + dgrTileBuf(drawbufptr, x, y, src) +end +export def dgrTileStr(x, y, tilestr, strlen, tilebuff)#0 + dgrTileStrBuf(drawbufptr, x, y, tilestr, strlen, tilebuff) +end +export def dgrFill(x, y, tile)#0 + dgrFillBuf(drawbufptr, x, y, tile) end // // Make sure we are a 128K //e or //c @@ -655,12 +632,19 @@ _dgrPlotPix:1 = @_dgrSetPix _dgrHLinPix:1 = @_dgrSetPix _dgrVLinPix:1 = @_dgrSetPix _dgrBLTPix:1 = @_dgrSetPix -_dgrTileTile:1 = @dgrTile -_dgrFillTile:1 = @dgrTile +_dgrTileTile:1 = @dgrTileBuf +_dgrFillTile:1 = @dgrTileBuf _dgrSetEvnEvn:1 = @evnclr _dgrSetEvnOdd:1 = @oddclr _dgrSetOddEvn:1 = @evnclr _dgrSetOddOdd:1 = @oddclr +// +// Fixups for drawbufptr +// +dgrHLin:2 = @drawbufptr +dgrHLin:7 = @drawbufptr+1 +dgrVLin:2 = @drawbufptr +dgrVLin:7 = @drawbufptr+1 // Put read AUX mem routine in scary location memcpy($0100, @auxRead, 9) done diff --git a/src/libsrc/line.pla b/src/libsrc/linespans.pla similarity index 80% rename from src/libsrc/line.pla rename to src/libsrc/linespans.pla index b1ebd91..d63ba80 100644 --- a/src/libsrc/line.pla +++ b/src/libsrc/linespans.pla @@ -1,19 +1,20 @@ +include "inc/cmdsys.plh" var hspan, vspan var err, shorterr, shortlen, longerr, longlen -export def linespans(h, v)#0 +export def setlinespans(h, v)#0 hspan = h vspan = v end -def majorline(ps, major, majorend, minor, dir, majorspan)#0 +def majorline(majorstart, major, majorend, minor, dir, majorspan)#0 // // Initial half-span step // err = err + shorterr repeat - majorspan(ps, major, minor)#0 - minor = minor + dir // Move to next span - ps = major + 1 // Start of next span = end of previous + 1 + majorspan(majorstart, major, minor)#0 + minor = minor + dir // Move to next span + majorstart = major + 1 // Start of next span = end of previous + 1 if err >= 0 // Short span err = err + shorterr major = major + shortlen @@ -25,9 +26,9 @@ def majorline(ps, major, majorend, minor, dir, majorspan)#0 // // Final half-span step // - majorspan(ps, majorend, minor)#0 + majorspan(majorstart, majorend, minor)#0 end -export def line(x1, y1, x2, y2)#0 +export def linetospans(x1, y1, x2, y2)#0 var dx, dy, dx2, dy2, halflen, rem, sx, sy sx = 1 @@ -68,19 +69,9 @@ export def line(x1, y1, x2, y2)#0 shortlen = longlen - 1 shorterr = longerr - dy2 // - // Initial half-span step - // - err = err + shorterr - ps = x1 - x1 = x1 + halflen - // // JIT optimize inner loop // majorline(x1, x1 + halflen, x2, y1, sy, hspan) - // - // Final half-span step - // - hspan(ps, x2, y2)#0 else if sy < 0 x1, x2 = x2, x1; sx = -sx diff --git a/src/makefile b/src/makefile index b245a4f..417399e 100755 --- a/src/makefile +++ b/src/makefile @@ -48,6 +48,7 @@ DHCP = rel/DHCP\#FE1000 HTTPD = rel/HTTPD\#FE1000 TFTPD = rel/TFTPD\#FE1000 DGR = rel/apple/DGR\#FE1000 +LINESPANS = rel/apple/LINESPANS\#FE1000 GRAFIX = rel/apple/GRAFIX\#FE1000 GFXDEMO = rel/apple/GFXDEMO\#FE1000 JOYBUZZ = rel/apple/JOYBUZZ\#FE1000 @@ -87,7 +88,7 @@ TXTTYPE = .TXT #SYSTYPE = \#FF2000 #TXTTYPE = \#040000 -apple: $(PLVMZP_APL) $(PLASM) $(PLVM) $(PLVM01) $(PLVM02) $(PLVMJIT) $(PLVM802) $(PLVM03) $(CMD) $(CMDJIT) $(JIT) $(JIT16) $(JITUNE) $(SOSCMD) $(PLASMAPLASM) $(CODEOPT) $(ARGS) $(MEMMGR) $(MEMTEST) $(FIBER) $(FIBERTEST) $(LONGJMP) $(ED) $(MON) $(SOS) $(ROD) $(SIEVE) $(PRIMEGAP) $(MOUSE) $(UTHERNET2) $(UTHERNET) $(ETHERIP) $(INET) $(DHCP) $(HTTPD) $(TFTPD) $(ROGUE) $(ROGUEMAP) $(ROGUECOMBAT) $(GRAFIX) $(GFXDEMO) $(DGR) $(DGRTEST) $(HGRTEST) $(FILEIO_APL) $(CONIO_APL) $(JOYBUZZ) $(PORTIO) $(SPIPORT) $(SDFAT) $(FATCAT) $(FATGET) $(FATPUT) $(FATWDSK) $(FATRDSK) $(SANE) $(FPSTR) $(FPU) $(SANITY) $(LZ4) $(LZ4CAT) $(RPNCALC) $(SNDSEQ) $(PLAYSEQ) +apple: $(PLVMZP_APL) $(PLASM) $(PLVM) $(PLVM01) $(PLVM02) $(PLVMJIT) $(PLVM802) $(PLVM03) $(CMD) $(CMDJIT) $(JIT) $(JIT16) $(JITUNE) $(SOSCMD) $(PLASMAPLASM) $(CODEOPT) $(ARGS) $(MEMMGR) $(MEMTEST) $(FIBER) $(FIBERTEST) $(LONGJMP) $(ED) $(MON) $(SOS) $(ROD) $(SIEVE) $(PRIMEGAP) $(MOUSE) $(UTHERNET2) $(UTHERNET) $(ETHERIP) $(INET) $(DHCP) $(HTTPD) $(TFTPD) $(ROGUE) $(ROGUEMAP) $(ROGUECOMBAT) $(GRAFIX) $(GFXDEMO) $(LINESPANS) $(DGR) $(DGRTEST) $(HGRTEST) $(FILEIO_APL) $(CONIO_APL) $(JOYBUZZ) $(PORTIO) $(SPIPORT) $(SDFAT) $(FATCAT) $(FATGET) $(FATPUT) $(FATWDSK) $(FATRDSK) $(SANE) $(FPSTR) $(FPU) $(SANITY) $(LZ4) $(LZ4CAT) $(RPNCALC) $(SNDSEQ) $(PLAYSEQ) -rm vmsrc/plvmzp.inc c64: $(PLVMZP_C64) $(PLASM) $(PLVM) $(PLVMC64) @@ -213,6 +214,10 @@ $(FIBER): libsrc/fiber.pla $(PLVM02) $(PLASM) ./$(PLASM) -AMOW < libsrc/fiber.pla > libsrc/fiber.a acme --setpc 4094 -o $(FIBER) libsrc/fiber.a +$(LINESPANS): libsrc/linespans.pla $(PLVM02) $(PLASM) + ./$(PLASM) -AMOW < libsrc/linespans.pla > libsrc/linespans.a + acme --setpc 4094 -o $(LINESPANS) libsrc/linespans.a + $(FIBERTEST): samplesrc/fibertest.pla $(PLVM02) $(PLASM) ./$(PLASM) -AMOW < samplesrc/fibertest.pla > samplesrc/fibertest.a acme --setpc 4094 -o $(FIBERTEST) samplesrc/fibertest.a diff --git a/src/mkrel b/src/mkrel index b9c750e..4669219 100755 --- a/src/mkrel +++ b/src/mkrel @@ -9,6 +9,7 @@ rm -rf prodos/sys mkdir prodos/sys cp rel/apple/FILEIO#FE1000 prodos/sys/FILEIO.REL cp rel/apple/CONIO#FE1000 prodos/sys/CONIO.REL +cp rel/apple/LINESPANS#FE1000 prodos/sys/LINESPANS.REL cp rel/apple/DGR#FE1000 prodos/sys/DGR.REL cp rel/ARGS#FE1000 prodos/sys/ARGS.REL cp rel/ED#FE1000 prodos/sys/ED.REL @@ -54,7 +55,8 @@ cp ../sysfiles/ELEMS.CODE#060000 prodos/fpsos/sys/ELEMS.CODE.BIN rm -rf prodos/demos mkdir prodos/demos cp rel/apple/DGRTEST#FE1000 prodos/demos/DGRTEST.REL -cp rel/apple/ROD#FE1000 prodos/demos/ROD.REL +cp rel/apple/HGRTEST#FE1000 prodos/demos/HGRTEST.REL +cp rel/apple/ROD#FE1000 prodos/demos/ROD.REL cp rel/RPNCALC#FE1000 prodos/demos/RPNCALC.REL cp rel/LZ4CAT#FE1000 prodos/demos/LZ4CAT.REL cp rel/PRIMEGAP#FE1000 prodos/demos/PRIMEGAP.REL @@ -97,7 +99,7 @@ cp rel/CODEOPT#FE1000 prodos/bld/CODEOPT.REL mkdir prodos/bld/samples cp samplesrc/hello.pla prodos/bld/samples/HELLO.PLA.TXT cp samplesrc/dgrtest.pla prodos/bld/samples/DGRTEST.PLA.TXT -cp samplesrc/hgr1test.pla prodos/bld/samples/HGR1TEST.PLA.TXT +cp samplesrc/hgrtest.pla prodos/bld/samples/HGRTEST.PLA.TXT cp samplesrc/fibertest.pla prodos/bld/samples/FIBERTEST.PLA.TXT cp samplesrc/mousetest.pla prodos/bld/samples/MOUSETEST.PLA.TXT cp samplesrc/mon.pla prodos/bld/samples/MON.PLA.TXT @@ -135,6 +137,7 @@ mkdir prodos/bld/inc cp inc/args.plh prodos/bld/inc/ARGS.PLH.TXT cp inc/cmdsys.plh prodos/bld/inc/CMDSYS.PLH.TXT cp inc/conio.plh prodos/bld/inc/CONIO.PLH.TXT +cp inc/linespans.plh prodos/bld/inc/LINESPANS.PLH.TXT cp inc/dgr.plh prodos/bld/inc/DGR.PLH.TXT cp inc/fiber.plh prodos/bld/inc/FIBER.PLH.TXT cp inc/fileio.plh prodos/bld/inc/FILEIO.PLH.TXT diff --git a/src/samplesrc/dgrtest.pla b/src/samplesrc/dgrtest.pla index d3412c6..41ffdb4 100644 --- a/src/samplesrc/dgrtest.pla +++ b/src/samplesrc/dgrtest.pla @@ -1,4 +1,5 @@ include "inc/dgr.plh" +include "inc/linespans.plh" byte[] sprite1 = $80,$80,$00,$00,$00,$00,$80,$80 byte[] = $80,$00,$0A,$0A,$0A,$0A,$00,$80 @@ -22,26 +23,29 @@ def dgrTest#0 word i, j, ii, ij b = dgrMode() + dgrDrawBuf(0) for k = 15 downto 0 - dgrClear(dgrbuff[0], k) + dgrClear(k) next + setlinespans(@dgrHLin, @dgrVLin) for l = 0 to 79 dgrColor(l) - dgrLine(dgrbuff[0], 0, 0, l, 47) + linetospans(0, 0, l, 47) next for l = 47 downto 0 dgrColor(l) - dgrLine(dgrbuff[0], 0, 0, 79, l) + linetospans(0, 0, 79, l) next ii = 2 ij = -1 i = 40 j = 10 ^$C010 + dgrDrawBuf(1) while ^$C000 < 128 - dgrFill(dgrbuff[b], k, k, @tile1) - dgrBLT(dgrbuff[b], i, j, 8, 8, @sprite1) - b = dgrShow(b) + dgrFill(k, k, @tile1) + dgrBLT(i, j, 8, 8, @sprite1) + dgrSwap k++ i = i + ii if i < -3 or i > 75 diff --git a/src/samplesrc/hgr1test.pla b/src/samplesrc/hgr1test.pla deleted file mode 100644 index be149cc..0000000 --- a/src/samplesrc/hgr1test.pla +++ /dev/null @@ -1,263 +0,0 @@ -include "inc/cmdsys.plh" -sysflags reshgr1 // Reserve HGR page 1 - -// -// Hardware addresses -// -const speaker = $C030 -const showgraphics = $C050 -const showtext = $C051 -const showfull = $C052 -const showmix = $C053 -const showpage1 = $C054 -const showpage2 = $C055 -const showlores = $C056 -const showhires = $C057 -const keyboard = $C000 -const keystrobe = $C010 -const hgr1 = $2000 -const hgr2 = $4000 -const page1 = 0 -const page2 = 1 -word hgrpage[] = hgr1, hgr2 -byte hgradrl[] = $00,$00,$00,$00,$00,$00,$00,$00 -word = $80,$80,$80,$80,$80,$80,$80,$80 -word = $00,$00,$00,$00,$00,$00,$00,$00 -word = $80,$80,$80,$80,$80,$80,$80,$80 -word = $00,$00,$00,$00,$00,$00,$00,$00 -word = $80,$80,$80,$80,$80,$80,$80,$80 -word = $00,$00,$00,$00,$00,$00,$00,$00 -word = $80,$80,$80,$80,$80,$80,$80,$80 -word = $28,$28,$28,$28,$28,$28,$28,$28 -word = $A8,$A8,$A8,$A8,$A8,$A8,$A8,$A8 -word = $28,$28,$28,$28,$28,$28,$28,$28 -word = $A8,$A8,$A8,$A8,$A8,$A8,$A8,$A8 -word = $28,$28,$28,$28,$28,$28,$28,$28 -word = $A8,$A8,$A8,$A8,$A8,$A8,$A8,$A8 -word = $28,$28,$28,$28,$28,$28,$28,$28 -word = $A8,$A8,$A8,$A8,$A8,$A8,$A8,$A8 -word = $50,$50,$50,$50,$50,$50,$50,$50 -word = $D0,$D0,$D0,$D0,$D0,$D0,$D0,$D0 -word = $50,$50,$50,$50,$50,$50,$50,$50 -word = $D0,$D0,$D0,$D0,$D0,$D0,$D0,$D0 -word = $50,$50,$50,$50,$50,$50,$50,$50 -word = $D0,$D0,$D0,$D0,$D0,$D0,$D0,$D0 -word = $50,$50,$50,$50,$50,$50,$50,$50 -word = $D0,$D0,$D0,$D0,$D0,$D0,$D0,$D0 -byte hgradrh[] = $00,$04,$08,$0C,$10,$14,$18,$1C -word = $00,$04,$08,$0C,$10,$14,$18,$1C -word = $01,$05,$09,$0D,$11,$15,$19,$1D -word = $01,$05,$09,$0D,$11,$15,$19,$1D -word = $02,$06,$0A,$0E,$12,$16,$1A,$1E -word = $02,$06,$0A,$0E,$12,$16,$1A,$1E -word = $03,$07,$0B,$0F,$13,$17,$1B,$1F -word = $03,$07,$0B,$0F,$13,$17,$1B,$1F -word = $00,$04,$08,$0C,$10,$14,$18,$1C -word = $00,$04,$08,$0C,$10,$14,$18,$1C -word = $01,$05,$09,$0D,$11,$15,$19,$1D -word = $01,$05,$09,$0D,$11,$15,$19,$1D -word = $02,$06,$0A,$0E,$12,$16,$1A,$1E -word = $02,$06,$0A,$0E,$12,$16,$1A,$1E -word = $03,$07,$0B,$0F,$13,$17,$1B,$1F -word = $03,$07,$0B,$0F,$13,$17,$1B,$1F -word = $00,$04,$08,$0C,$10,$14,$18,$1C -word = $00,$04,$08,$0C,$10,$14,$18,$1C -word = $01,$05,$09,$0D,$11,$15,$19,$1D -word = $01,$05,$09,$0D,$11,$15,$19,$1D -word = $02,$06,$0A,$0E,$12,$16,$1A,$1E -word = $02,$06,$0A,$0E,$12,$16,$1A,$1E -word = $03,$07,$0B,$0F,$13,$17,$1B,$1F -word = $03,$07,$0B,$0F,$13,$17,$1B,$1F -word hgrscan[] = $0000,$0400,$0800,$0C00,$1000,$1400,$1800,$1C00 -word = $0080,$0480,$0880,$0C80,$1080,$1480,$1880,$1C80 -word = $0100,$0500,$0900,$0D00,$1100,$1500,$1900,$1D00 -word = $0180,$0580,$0980,$0D80,$1180,$1580,$1980,$1D80 -word = $0200,$0600,$0A00,$0E00,$1200,$1600,$1A00,$1E00 -word = $0280,$0680,$0A80,$0E80,$1280,$1680,$1A80,$1E80 -word = $0300,$0700,$0B00,$0F00,$1300,$1700,$1B00,$1F00 -word = $0380,$0780,$0B80,$0F80,$1380,$1780,$1B80,$1F80 -word = $0028,$0428,$0828,$0C28,$1028,$1428,$1828,$1C28 -word = $00A8,$04A8,$08A8,$0CA8,$10A8,$14A8,$18A8,$1CA8 -word = $0128,$0528,$0928,$0D28,$1128,$1528,$1928,$1D28 -word = $01A8,$05A8,$09A8,$0DA8,$11A8,$15A8,$19A8,$1DA8 -word = $0228,$0628,$0A28,$0E28,$1228,$1628,$1A28,$1E28 -word = $02A8,$06A8,$0AA8,$0EA8,$12A8,$16A8,$1AA8,$1EA8 -word = $0328,$0728,$0B28,$0F28,$1328,$1728,$1B28,$1F28 -word = $03A8,$07A8,$0BA8,$0FA8,$13A8,$17A8,$1BA8,$1FA8 -word = $0050,$0450,$0850,$0C50,$1050,$1450,$1850,$1C50 -word = $00D0,$04D0,$08D0,$0CD0,$10D0,$14D0,$18D0,$1CD0 -word = $0150,$0550,$0950,$0D50,$1150,$1550,$1950,$1D50 -word = $01D0,$05D0,$09D0,$0DD0,$11D0,$15D0,$19D0,$1DD0 -word = $0250,$0650,$0A50,$0E50,$1250,$1650,$1A50,$1E50 -word = $02D0,$06D0,$0AD0,$0ED0,$12D0,$16D0,$1AD0,$1ED0 -word = $0350,$0750,$0B50,$0F50,$1350,$1750,$1B50,$1F50 -word = $03D0,$07D0,$0BD0,$0FD0,$13D0,$17D0,$1BD0,$1FD0 -word hcolor[] = $0000,$552A,$2A55,$7F7F,$8080,$D5AA,$AAD5,$FFFF -word hmask = $8081,$8082,$8084,$8088,$8090,$80A0,$80C0 - = $8180,$8280,$8480,$8880,$9080,$A080,$C080 -word curhclr -word ball0[9] = $0000, $1800, $3C00, $7E00, $7E00, $3C00, $1800, $0000 - -var hspan, vspan -export def spans(h, v)#0 - hspan = h - vspan = v -end -export def line(x1, y1, x2, y2)#0 - var dx2, dy2, err, sx, sy, ps - var shorterr, shortlen, longerr, longlen, halflen - - sx = sy = 1 - dx2 = (x2 - x1) * 2 - if dx2 < 0 - sx = -1; dx2 = -dx2 - fin - dy2 = (y2 - y1) * 2 - if dy2 < 0 - sy = -1; dy2 = -dy2 - fin - if dx2 >= dy2 - if sx < 0 - x1, x2 = x2, x1; sy = -sy - fin - if dy2 == 0 - hspan(x1, x2, y1)#0; return - fin - ps = x1 - for err = dy2 - dx2 / 2 to 0 step dy2 // Find first half-span length and error - x1++ - next - longlen = (x1 - ps + 1) * 2 // Long-span length = half-span length * 2 - longerr = err * 2 - if longerr >= dy2 - longerr = longerr - dy2 - longlen-- - fin - shortlen = longlen - 1 // Short-span length = long-span length - 1 - shorterr = longerr - dy2 - err = err + shorterr // Do a short-span step - while x1 < x2 - hspan(ps, x1, y1)#0 - y1 = y1 + sy // Move to next span - ps = x1 + 1 // Start of next span = end of previous span + 1 - if err >= 0 // Short span - err = err + shorterr - x1 = x1 + shortlen - else // Long span - err = err + longerr - x1 = x1 + longlen - fin - loop - hspan(ps, x2, y2)#0 // Final span - else - if sy < 0 - x1, x2 = x2, x1; sx = -sx - fin - if dx2 == 0 - vspan(x1, y1, y2)#0; return - fin - ps = y1 - for err = dx2 - dy2 / 2 to 0 step dx2 // Find first half-span length and error - y1++ - next - longlen = (y1 - ps + 1) * 2 - longerr = err * 2 - if longerr >= dx2 - longerr -= longerr - dx2 - longlen-- - fin - shortlen = longlen - 1 - shorterr = longerr - dx2 - err = err + shorterr - while y1 < y2 - vspan(x1, ps, y1)#0 - x1 = x1 + sx - ps = y1 + 1 - if err >= 0 // Short span - err = err + shorterr - y1 = y1 + shortlen - else // Long span - err = err + longerr - y1 = y1 + longlen - fin - loop - vspan(x2, ps, y2)#0 // Final span - fin -end -def hgrPlot(x, y)#0 - var pscan, bytofst, pixofst, pmask, pword - - pscan = hgrscan[y] | hgr1 - wrdofst, pixofst = divmod(x, 14) - pmask = hmask[pixofst] - pword = pscan=>[wrdofst] & ~pmask - pscan=>[wrdofst] = pword | (curhclr & pmask) -end -def hgrHlin(x1, x2, y)#0 - var pscan, bytofst, pixofst, pmask, pword - - pscan = hgrscan[y] | hgr1 - wrdofst, pixofst = divmod(x1, 14) - repeat - pmask = hmask[pixofst] - pword = pscan=>[wrdofst] & ~pmask - pscan=>[wrdofst] = pword | (curhclr & pmask) - pixofst++ - if pixofst > 13 - pixofst = 0 - wrdofst++ - fin - x1++ - until x1 > x2 -end -def hgrVlin(x, y1, y2)#0 - var pscan, bytofst, pixofst, pmask, pword, cmask - - wrdofst, pixofst = divmod(x, 14) - pmask = hmask[pixofst] - cmask = curhclr & pmask - pmask = ~pmask - repeat - pscan = hgrscan[y1] | hgr1 - pword = pscan=>[wrdofst] & pmask - pscan=>[wrdofst] = pword | cmask - y1++ - until y1 > y2 -end -def hgrColor(c)#0 - curhclr = hcolor[c & 0x07] -end -def hgrBLT(page, x, y, w, h, pSrc)#0 - word pDst - byte i - - repeat - pDst = hgrscan[y] | page + x - for i = 0 to w - 1 - pDst->[i] = pSrc->[i] - next - pSrc = pSrc + w - y++ - h-- - until not h -end -def testline - var i - - spans(@hgrHlin, @hgrVlin) - hgrColor(7) - for i = 0 to 100 - hgrPlot(i, i) - next -end -memset(hgr1, 0, $2000) // Clear HGR page 1 -^showpage1 -^showfull -^showhires -^showgraphics -testline -hgrBlt(hgrpage[0], 20, 100, 2, 8, @ball0) -getc -^showpage1 -^showtext -done diff --git a/src/samplesrc/hgrtest.pla b/src/samplesrc/hgrtest.pla index 1d48881..f933cee 100644 --- a/src/samplesrc/hgrtest.pla +++ b/src/samplesrc/hgrtest.pla @@ -1,4 +1,5 @@ include "inc/cmdsys.plh" +include "inc/linespans.plh" sysflags reshgr1 // Reserve HGR page 1 // // Hardware addresses @@ -51,160 +52,7 @@ byte hrmask = $81,$83,$87,$8F,$9F,$BF,$FF word curhclr word ball0[9] = $0000, $1800, $3C00, $7E00, $7E00, $3C00, $1800, $0000 -var pixel, hspan, vspan -var err, shorterr, shortlen, longerr, longlen -var dx2, dy2, sx, sy - -export def linefuncs(p, h, v)#0 - pixel = p - hspan = h - vspan = v -end -def phline(x1, x2, y)#0 - var x - - if sx < 0 - sy = -sy; x1, x2 = x2, x1 - fin - err = dy2 - dx2 / 2 - for x = x1 to x2 - pixel(x, y)#0 - if err >= 0 - err = err - dx2 - y = y + sy - fin - err = err + dy2 - next -end -def pvline(y1, y2, x)#0 - var y - - if sy < 0 - sx = -sx; y1, y2 = y2, y1 - fin - err = dx2 - dy2 / 2 - for y = y1 to y2 - pixel(x, y)#0 - if err >= 0 - err = err - dy2 - x = x + sx - fin - err = err + dx2 - next -end -def pline(x1, y1, x2, y2)#0 - sx = 1 - sy = 1 - dx2 = (x2 - x1) * 2 - if dx2 < 0 - sx = -1; dx2 = -dx2 - fin - dy2 = (y2 - y1) * 2 - if dy2 < 0 - sy = -1; dy2 = -dy2 - fin - if dx2 >= dy2 - phline(x1, x2, y1) - else - pvline(y1, y2, x1) - fin -end -def majorline(ps, major, majorend, minor, dir, majorspan)#0 - // - // Initial half-span step - // - err = err + shorterr - repeat - majorspan(ps, major, minor)#0 - minor = minor + dir // Move to next span - ps = major + 1 // Start of next span = end of previous + 1 - if err >= 0 // Short span - err = err + shorterr - major = major + shortlen - else // Long span - err = err + longerr - major = major + longlen - fin - until major >= majorend - // - // Final half-span step - // - majorspan(ps, majorend, minor)#0 -end -export def sline(x1, y1, x2, y2)#0 - var dx, dy, dx2, dy2, halflen, rem, sx, sy - - sx = 1 - sy = 1 - dx = x2 - x1 - if dx < 0 - sx = -1; dx = -dx - fin - dy = y2 - y1 - if dy < 0 - sy = -1; dy = -dy - fin - if dx >= dy - if sx < 0 - x1, x2 = x2, x1; sy = -sy - fin - if dy == 0 - hspan(x1, x2, y1)#0; return - fin - // - // Half-span length and error - // - dy2 = dy * 2 - halflen, rem = divmod(dx, dy2) - err = dy2 - rem - // - // Long-span length = half-span length * 2 - // - longlen = (halflen + 1) * 2 - longerr = err * 2 - if longerr >= dy2 - longerr = longerr - dy2 - longlen-- - fin - // - // Short-span length = long-span length - 1 - // - shortlen = longlen - 1 - shorterr = longerr - dy2 - // - // JIT optimize inner loop - // - majorline(x1, x1 + halflen, x2, y1, sy, hspan) - else - if sy < 0 - x1, x2 = x2, x1; sx = -sx - fin - if dx == 0 - vspan(y1, y2, x1)#0; return - fin - // - // Half-span length and error - // - dx2 = dx * 2 - halflen, rem = divmod(dy, dx2) - err = dx2 - rem - // - // Long-span length = half-span length * 2 - // - longlen = (halflen + 1) * 2 - longerr = err * 2 - if longerr >= dx2 - longerr = longerr - dx2 - longlen-- - fin - shortlen = longlen - 1 - shorterr = longerr - dx2 - // - // JIT optimize inner loop - // - majorline(y1, y1 + halflen, y2, x1, sx, vspan) - fin -end +var err, dx2, dy2, sx, sy def hgrPlot(x, y)#0 word pptr @@ -272,19 +120,70 @@ def hgrBLT(page, x, y, w, h, pSrc)#0 h-- until not h end +def phline(x1, x2, y)#0 + var x + + if sx < 0 + sy = -sy; x1, x2 = x2, x1 + fin + err = dy2 - dx2 / 2 + for x = x1 to x2 + hgrPlot(x, y) + if err >= 0 + err = err - dx2 + y = y + sy + fin + err = err + dy2 + next +end +def pvline(y1, y2, x)#0 + var y + + if sy < 0 + sx = -sx; y1, y2 = y2, y1 + fin + err = dx2 - dy2 / 2 + for y = y1 to y2 + hgrPlot(x, y) + if err >= 0 + err = err - dy2 + x = x + sx + fin + err = err + dx2 + next +end +def simpleline(x1, y1, x2, y2)#0 + sx = 1 + sy = 1 + dx2 = (x2 - x1) * 2 + if dx2 < 0 + sx = -1; dx2 = -dx2 + fin + dy2 = (y2 - y1) * 2 + if dy2 < 0 + sy = -1; dy2 = -dy2 + fin + if dx2 >= dy2 + phline(x1, x2, y1) + else + pvline(y1, y2, x1) + fin +end + def testline#0 var i - linefuncs(@hgrPlot, @hgrHlin, @hgrVlin) - hgrColor(3) + setlinespans(@hgrHlin, @hgrVlin) + hgrColor(2) for i = 0 to 191 - pline(0, 0, i, 191) - pline(0, 0, 191, i) + simpleline(0, 0, i, 191) + simpleline(0, 0, 191, i) next - hgrColor(0); + memset(hgr1, 0, $2000) // Clear HGR page 1 + hgrColor(1); for i = 0 to 191 - sline(0, 0, i, 191) - sline(0, 0, 191, i) + linetospans(0, 0, i, 191) + linetospans(0, 0, 191, i) next end memset(hgr1, 0, $2000) // Clear HGR page 1