From b9c5a8cb2379c9f7c9e0bc809deff9e5eb2d9612 Mon Sep 17 00:00:00 2001 From: Dave Schmenk <dschmenk@gmail.com> Date: Thu, 19 Dec 2019 14:27:08 -0800 Subject: [PATCH] More WIP for the graphics libraries --- src/inc/dgrlib.plh | 1 - src/libsrc/apple/dgrlib.pla | 2 +- src/makefile | 13 ++- src/mkrel | 4 + src/samplesrc/hgrtest.pla | 178 +++++++++++++++++++++++++----------- src/tftpbld | 7 +- src/tftpdemos | 1 + src/tftpsys | 4 +- src/toolsrc/ed.pla | 38 +++++++- 9 files changed, 189 insertions(+), 59 deletions(-) diff --git a/src/inc/dgrlib.plh b/src/inc/dgrlib.plh index ac52049..a378993 100644 --- a/src/inc/dgrlib.plh +++ b/src/inc/dgrlib.plh @@ -1,5 +1,4 @@ import dgrlib - word[] dgrbuff predef dgrPlot(x, y)#0 predef dgrHLin(x1, x2, y)#0 predef dgrVLin(y1, y2, x)#0 diff --git a/src/libsrc/apple/dgrlib.pla b/src/libsrc/apple/dgrlib.pla index d4bd709..d523f8c 100755 --- a/src/libsrc/apple/dgrlib.pla +++ b/src/libsrc/apple/dgrlib.pla @@ -29,7 +29,7 @@ word = $0450,$04D0,$0550,$05D0,$0650,$06D0,$0750,$07D0 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[] dgrbuff = @dgr1rows, @dgr2rows word drawbufptr byte drawpage // diff --git a/src/makefile b/src/makefile index e055016..e8d27d9 100755 --- a/src/makefile +++ b/src/makefile @@ -47,6 +47,7 @@ INET = rel/INET\#FE1000 DHCP = rel/DHCP\#FE1000 HTTPD = rel/HTTPD\#FE1000 TFTPD = rel/TFTPD\#FE1000 +GRLIB = rel/apple/GRLIB\#FE1000 DGRLIB = rel/apple/DGRLIB\#FE1000 LINESPANS = rel/apple/LINESPANS\#FE1000 GRAFIX = rel/apple/GRAFIX\#FE1000 @@ -57,6 +58,7 @@ ROGUE = rel/ROGUE\#FE1000 ROGUEMAP = rel/ROGUEMAP\#FE1000 ROGUECOMBAT= rel/ROGUECOMBAT\#FE1000 MON = rel/apple/MON\#FE1000 +GRTEST = rel/apple/GRTEST\#FE1000 DGRTEST = rel/apple/DGRTEST\#FE1000 HGRTEST = rel/apple/HGRTEST\#FE1000 MEMMGR = rel/MEMMGR\#FE1000 @@ -88,7 +90,8 @@ 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) $(LINESPANS) $(DGRLIB) $(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) $(GRLIB) $(DGRLIB) $(GRTEST) $(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) @@ -382,10 +385,18 @@ $(PORTIO): libsrc/apple/portio.pla $(PLVM02) $(PLASM) ./$(PLASM) -AMOW < libsrc/apple/portio.pla > libsrc/apple/portio.a acme --setpc 4094 -o $(PORTIO) libsrc/apple/portio.a +$(GRLIB): libsrc/apple/grlib.pla $(PLVM02) $(PLASM) + ./$(PLASM) -AMOW < libsrc/apple/grlib.pla > libsrc/apple/grlib.a + acme --setpc 4094 -o $(GRLIB) libsrc/apple/grlib.a + $(DGRLIB): libsrc/apple/dgrlib.pla $(PLVM02) $(PLASM) ./$(PLASM) -AMOW < libsrc/apple/dgrlib.pla > libsrc/apple/dgrlib.a acme --setpc 4094 -o $(DGRLIB) libsrc/apple/dgrlib.a +$(GRTEST): samplesrc/grtest.pla $(PLVM02) $(PLASM) + ./$(PLASM) -AMOW < samplesrc/grtest.pla > samplesrc/grtest.a + acme --setpc 4094 -o $(GRTEST) samplesrc/grtest.a + $(DGRTEST): samplesrc/dgrtest.pla $(PLVM02) $(PLASM) ./$(PLASM) -AMOW < samplesrc/dgrtest.pla > samplesrc/dgrtest.a acme --setpc 4094 -o $(DGRTEST) samplesrc/dgrtest.a diff --git a/src/mkrel b/src/mkrel index 1c7d30e..f82a996 100755 --- a/src/mkrel +++ b/src/mkrel @@ -10,6 +10,7 @@ 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/GRLIB#FE1000 prodos/sys/GRLIB.REL cp rel/apple/DGRLIB#FE1000 prodos/sys/DGRLIB.REL cp rel/ARGS#FE1000 prodos/sys/ARGS.REL cp rel/ED#FE1000 prodos/sys/ED.REL @@ -54,6 +55,7 @@ cp ../sysfiles/ELEMS.CODE#060000 prodos/fpsos/sys/ELEMS.CODE.BIN rm -rf prodos/demos mkdir prodos/demos +cp rel/apple/GRTEST#FE1000 prodos/demos/GRTEST.REL cp rel/apple/DGRTEST#FE1000 prodos/demos/DGRTEST.REL cp rel/apple/HGRTEST#FE1000 prodos/demos/HGRTEST.REL cp rel/apple/ROD#FE1000 prodos/demos/ROD.REL @@ -98,6 +100,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/grtest.pla prodos/bld/samples/GRTEST.PLA.TXT cp samplesrc/dgrtest.pla prodos/bld/samples/DGRTEST.PLA.TXT cp samplesrc/hgrtest.pla prodos/bld/samples/HGRTEST.PLA.TXT cp samplesrc/fibertest.pla prodos/bld/samples/FIBERTEST.PLA.TXT @@ -138,6 +141,7 @@ 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/grlib.plh prodos/bld/inc/GRLIB.PLH.TXT cp inc/dgrlib.plh prodos/bld/inc/DGRLIB.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/hgrtest.pla b/src/samplesrc/hgrtest.pla index f933cee..b865f24 100644 --- a/src/samplesrc/hgrtest.pla +++ b/src/samplesrc/hgrtest.pla @@ -52,13 +52,58 @@ byte hrmask = $81,$83,$87,$8F,$9F,$BF,$FF word curhclr word ball0[9] = $0000, $1800, $3C00, $7E00, $7E00, $3C00, $1800, $0000 -var err, dx2, dy2, sx, sy +asm grInc(buff) +!SOURCE "vmsrc/plvmzp.inc" +GBASL = $26 +GBASH = $27 +GBASE = GBASL +GCLR = $30 +end +asm divmod7(x)#2 + LDA ESTKL,X ; X COORD LSB + LDY ESTKH,X ; X COORD MSB + BNE + ; MUST BE >= 140 + CMP #140 + BCC ++ ++ SEC + SBC #140 + LDY #20 +++ CMP #70 + BCC + + SBC #70 + STA ESTKL,X + TYA + ADC #9 + TAY + LDA ESTKL,X ++ CMP #35 + BCC + + SBC #35 + STA ESTKL,X + TYA + ADC #4 + TAY + LDA ESTKL,X ++ +- CMP #7 + BCC + + SBC #7 + INY + BNE - ++ DEX + STA ESTKL,X ; REMAINDER + STY ESTKL+1,X ; QUOTIENT + LDA #$00 + STA ESTKH,X + STA ESTKH+1,X + RTS +end def hgrPlot(x, y)#0 word pptr byte ofst, pixofst, pmask - ofst, pixofst = divmod(x, 7) + ofst, pixofst = divmod7(x) pptr = (hgrscan[y] | hgr1) + ofst pmask = hbmask[pixofst] ^pptr = (^pptr & ~pmask) | (curhclr.[ofst & 1] & pmask) @@ -71,9 +116,9 @@ def hgrHlin(x1, x2, y)#0 if x1 == x2 hgrPlot(x1, y) else - lofst, lpixofst = divmod(x1, 7) + lofst, lpixofst = divmod7(x1) pptr = (hgrscan[y] | hgr1) + lofst - rofst, rpixofst = divmod(x2, 7) + rofst, rpixofst = divmod7(x2) lpmask = hlmask[lpixofst] rpmask = hrmask[rpixofst] if lofst == rofst @@ -94,14 +139,18 @@ def hgrVlin(y1, y2, x)#0 word pptr, y byte ofst, pixofst, pmask, cmask - ofst, pixofst = divmod(x, 7) - pmask = hbmask[pixofst] - cmask = curhclr.[ofst & 1] & pmask - pmask = ~pmask - for y = y1 to y2 - pptr = (hgrscan[y] | hgr1) + ofst - ^pptr = (^pptr & pmask) | cmask - next + if y1 == y2 + hgrPlot(x, y1) + else + ofst, pixofst = divmod7(x) + pmask = hbmask[pixofst] + cmask = curhclr.[ofst & 1] & pmask + pmask = ~pmask + for y = y1 to y2 + pptr = (hgrscan[y] | hgr1) + ofst + ^pptr = (^pptr & pmask) | cmask + next + fin end def hgrColor(c)#0 curhclr = hcolor[c & $07] @@ -120,39 +169,11 @@ 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 + var err, dx2, dy2, sx, sy, x, y + word pptr + byte ofst, pixofst, pmask, clr + sx = 1 sy = 1 dx2 = (x2 - x1) * 2 @@ -163,10 +184,65 @@ def simpleline(x1, y1, x2, y2)#0 if dy2 < 0 sy = -1; dy2 = -dy2 fin + if dx2 >= dy2 - phline(x1, x2, y1) - else - pvline(y1, y2, x1) + if sx < 0 + sy = -sy; x1, x2 = x2, x1 + fin + err = dy2 - dx2 / 2 + ofst, pixofst = divmod7(x1) + pptr = (hgrscan[y1] | hgr1) + ofst + clr = curhclr.[ofst & 1] + for x = x1 to x2 + pmask = hbmask[pixofst] + ^pptr = (^pptr & ~pmask) | (clr & pmask) + pixofst++ + if pixofst > 7 + pixofst = 0 + pptr++ + ofst++ + clr = curhclr.[ofst & 1] + fin + if err >= 0 + err = err - dx2 + y1 = y1 + sy + pptr = (hgrscan[y1] | hgr1) + ofst + fin + err = err + dy2 + next + else + if sy < 0 + sx = -sx; y1, y2 = y2, y1 + fin + err = dx2 - dy2 / 2 + ofst, pixofst = divmod7(x1) + clr = curhclr.[ofst & 1] + pmask = hbmask[pixofst] + for y = y1 to y2 + pptr = (hgrscan[y] | hgr1) + ofst + ^pptr = (^pptr & ~pmask) | (clr & pmask) + if err >= 0 + err = err - dy2 + if sx > 0 + pixofst++ + if pixofst > 7 + pixofst = 0 + ofst++ + clr = curhclr.[ofst & 1] + fin + else + if pixofst == 0 + pixofst = 7 + ofst-- + clr = curhclr.[ofst & 1] + else + pixofst-- + fin + fin + pmask = hbmask[pixofst] + fin + err = err + dx2 + next fin end @@ -175,10 +251,10 @@ def testline#0 setlinespans(@hgrHlin, @hgrVlin) hgrColor(2) - for i = 0 to 191 - simpleline(0, 0, i, 191) - simpleline(0, 0, 191, i) - next + //for i = 0 to 191 + // simpleline(0, 0, i, 191) + // simpleline(0, 0, 191, i) + //next memset(hgr1, 0, $2000) // Clear HGR page 1 hgrColor(1); for i = 0 to 191 diff --git a/src/tftpbld b/src/tftpbld index e5d03d3..b083725 100755 --- a/src/tftpbld +++ b/src/tftpbld @@ -8,7 +8,9 @@ echo "BLD/CODEOPT"; atftp $1 --put -l rel/CODEOPT#FE1000 -r $2/BLD/CODEOPT#FE10 echo "BLD/INC/ARGS.PLH"; atftp $1 --put -l inc/args.plh -r $2/BLD/INC/ARGS.PLH#040000 echo "BLD/INC/CMDSYS.PLH"; atftp $1 --put -l inc/cmdsys.plh -r $2/BLD/INC/CMDSYS.PLH#040000 echo "BLD/INC/CONIO.PLH"; atftp $1 --put -l inc/conio.plh -r $2/BLD/INC/CONIO.PLH#040000 -echo "BLD/INC/DGR.PLH"; atftp $1 --put -l inc/dgr.plh -r $2/BLD/INC/DGR.PLH#040000 +echo "BLD/INC/LINESPANS.PLH"; atftp $1 --put -l inc/linespans.plh -r $2/BLD/INC/LINESPANS.PLH#040000 +echo "BLD/INC/GRLIB.PLH"; atftp $1 --put -l inc/grlib.plh -r $2/BLD/INC/GRLIB.PLH#040000 +echo "BLD/INC/DGRLIB.PLH"; atftp $1 --put -l inc/dgrlib.plh -r $2/BLD/INC/DGRLIB.PLH#040000 echo "BLD/INC/FIBER.PLH"; atftp $1 --put -l inc/fiber.plh -r $2/BLD/INC/FIBER.PLH#040000 echo "BLD/INC/FILEIO.PLH"; atftp $1 --put -l inc/fileio.plh -r $2/BLD/INC/FILEIO.PLH#040000 echo "BLD/INC/FPSTR.PLH"; atftp $1 --put -l inc/fpstr.plh -r $2/BLD/INC/FPSTR.PLH#040000 @@ -34,8 +36,9 @@ echo "BLD/SAMPLES/TEST.PLA"; atftp $1 --put -l samplesrc/test.pla -r $ echo "BLD/SAMPLES/FIBERTEST.PLA"; atftp $1 --put -l samplesrc/fibertest.pla -r $2/BLD/SAMPLES/FIBERTEST.PLA#040000 echo "BLD/SAMPLES/MOUSETEST.PLA"; atftp $1 --put -l samplesrc/mousetest.pla -r $2/BLD/SAMPLES/MOUSETEST.PLA#040000 echo "BLD/SAMPLES/ROD.PLA"; atftp $1 --put -l samplesrc/rod.pla -r $2/BLD/SAMPLES/ROD.PLA#040000 +echo "BLD/SAMPLES/GRTEST.PLA"; atftp $1 --put -l samplesrc/grtest.pla -r $2/BLD/SAMPLES/GRTEST.PLA#040000 echo "BLD/SAMPLES/DGRTEST.PLA"; atftp $1 --put -l samplesrc/dgrtest.pla -r $2/BLD/SAMPLES/DGRTEST.PLA#040000 -echo "BLD/SAMPLES/HGR1TEST.PLA"; atftp $1 --put -l samplesrc/hgr1test.pla -r $2/BLD/SAMPLES/HGR1TEST.PLA#040000 +echo "BLD/SAMPLES/HGRTEST.PLA"; atftp $1 --put -l samplesrc/hgrtest.pla -r $2/BLD/SAMPLES/HGRTEST.PLA#040000 echo "BLD/SAMPLES/PLAYSEQ.PLA"; atftp $1 --put -l samplesrc/playseq.pla -r $2/BLD/SAMPLES/PLAYSEQ.PLA#040000 echo "BLD/SAMPLES/RPNCALC.PLA"; atftp $1 --put -l samplesrc/rpncalc.pla -r $2/BLD/SAMPLES/RPNCALC.PLA#040000 echo "BLD/SAMPLES/SIEVE.PLA"; atftp $1 --put -l samplesrc/sieve.pla -r $2/BLD/SAMPLES/SIEVE.PLA#040000 diff --git a/src/tftpdemos b/src/tftpdemos index 5a9bca3..159f871 100755 --- a/src/tftpdemos +++ b/src/tftpdemos @@ -5,6 +5,7 @@ echo "DEMOS/RPNCALC"; atftp $1 --put -l rel/RPNCALC#FE1000 echo "DEMOS/LZ4CAT"; atftp $1 --put -l rel/LZ4CAT#FE1000 -r $2/DEMOS/LZ4CAT#FE1000 echo "DEMOS/SIEVE"; atftp $1 --put -l rel/SIEVE#FE1000 -r $2/DEMOS/SIEVE#FE1000 echo "DEMOS/ROD"; atftp $1 --put -l rel/apple/ROD#FE1000 -r $2/DEMOS/ROD#FE1000 +echo "DEMOS/GRTEST"; atftp $1 --put -l rel/apple/GRTEST#FE1000 -r $2/DEMOS/GRTEST#FE1000 echo "DEMOS/DGRTEST"; atftp $1 --put -l rel/apple/DGRTEST#FE1000 -r $2/DEMOS/DGRTEST#FE1000 # Music demo diff --git a/src/tftpsys b/src/tftpsys index 78b1609..e517321 100755 --- a/src/tftpsys +++ b/src/tftpsys @@ -23,7 +23,9 @@ echo "SYS/LONGJUMP"; atftp $1 --put -l rel/LONGJMP#FE1000 -r $2/SYS/LONGJMP#FE10 echo "SYS/LZ4"; atftp $1 --put -l rel/LZ4#FE1000 -r $2/SYS/LZ4#FE1000 echo "SYS/MEMMGR"; atftp $1 --put -l rel/MEMMGR#FE1000 -r $2/SYS/MEMMGR#FE1000 echo "SYS/CONIO"; atftp $1 --put -l rel/apple/CONIO#FE1000 -r $2/SYS/CONIO#FE1000 -echo "SYS/DGR"; atftp $1 --put -l rel/apple/DGR#FE1000 -r $2/SYS/DGR#FE1000 +echo "SYS/LINESPANS"; atftp $1 --put -l rel/apple/LINESPANS#FE1000 -r $2/SYS/LINESPANS#FE1000 +echo "SYS/GRLIB"; atftp $1 --put -l rel/apple/GRLIB#FE1000 -r $2/SYS/GRLIB#FE1000 +echo "SYS/DGRLIB"; atftp $1 --put -l rel/apple/DGRLIB#FE1000 -r $2/SYS/DGRLIB#FE1000 echo "SYS/FILEIO"; atftp $1 --put -l rel/apple/FILEIO#FE1000 -r $2/SYS/FILEIO#FE1000 echo "SYS/JOYBUZZ"; atftp $1 --put -l rel/apple/JOYBUZZ#FE1000 -r $2/SYS/JOYBUZZ#FE1000 echo "SYS/SNDSEQ"; atftp $1 --put -l rel/apple/SNDSEQ#FE1000 -r $2/SYS/SNDSEQ#FE1000 diff --git a/src/toolsrc/ed.pla b/src/toolsrc/ed.pla index 9b0afb0..1778f57 100755 --- a/src/toolsrc/ed.pla +++ b/src/toolsrc/ed.pla @@ -770,8 +770,25 @@ def cursleft#0 fin end def pgleft#0 + word i, strptr + + strptr = txtlinbuf=>[cursrow] + if curscol > ^strptr + i = ^strptr + else + for i = 1 to ^strptr + if ^(strptr + i) <> keyspace + break + fin + next + i-- + if i >= curscol + i = 0 + fin + fin cursoff - if curshpos(curscol - 8) + if curshpos(i) + //if curshpos(curscol - 8) drawscrn(scrntop, scrnleft) else if flags & selection @@ -794,8 +811,25 @@ def cursright#0 fin end def pgright#0 + word i, strptr + + strptr = txtlinbuf=>[cursrow] + if curscol >= ^strptr + i = curscol + 8 + else + for i = 1 to ^strptr + if ^(strptr + i) <> keyspace + break + fin + next + i-- + if curscol >= i + i = ^strptr + fin + fin cursoff - if curshpos(curscol + 8) + if curshpos(i) + //if curshpos(curscol + 8) drawscrn(scrntop, scrnleft) else if flags & selection