From 02760f10388d82f4a4020e95bd9d420166a87b03 Mon Sep 17 00:00:00 2001 From: David Schmenk Date: Sat, 10 Feb 2018 19:33:48 -0800 Subject: [PATCH 01/28] Thanks SteveF! --- src/vmsrc/plvm02.s | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/vmsrc/plvm02.s b/src/vmsrc/plvm02.s index 160f3e2..6cd48a7 100755 --- a/src/vmsrc/plvm02.s +++ b/src/vmsrc/plvm02.s @@ -1161,7 +1161,7 @@ SAW INY ;+INC_IP LDY IPY BMI + JMP DROP - JMP FIXDROP ++ JMP FIXDROP ;* ;* STORE VALUE TO ABSOLUTE ADDRESS WITHOUT POPPING STACK ;* From 5c56020c2bf0fe96ca417d8ecc579a7449a1934d Mon Sep 17 00:00:00 2001 From: David Schmenk Date: Sun, 11 Feb 2018 21:45:31 -0800 Subject: [PATCH 02/28] Apple /// graphics libary --- src/makefile | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/makefile b/src/makefile index 392864a..44c13d7 100755 --- a/src/makefile +++ b/src/makefile @@ -37,6 +37,7 @@ DHCP = DHCP\#FE1000 HTTPD = HTTPD\#FE1000 DGR = DGR\#FE1000 TONE = TONE\#FE1000 +GRAFIX = GRAFIX\#FE1000 PORTIO = PORTIO\#FE1000 ROGUE = ROGUE\#FE1000 ROGUEMAP= ROGUEMAP\#FE1000 @@ -73,7 +74,7 @@ TXTTYPE = .TXT #SYSTYPE = \#FF2000 #TXTTYPE = \#040000 -all: $(PLASM) $(PLVM) $(PLVM01) $(PLVM02) $(PLVM802) $(PLVM03) $(CMD) $(PLASMAPLASM) $(CODEOPT) $(ARGS) $(MEMMGR) $(MEMTEST) $(FIBER) $(FIBERTEST) $(LONGJMP) $(ED) $(MON) $(SOS) $(ROD) $(SIEVE) $(UTHERNET2) $(UTHERNET) $(ETHERIP) $(INET) $(DHCP) $(HTTPD) $(ROGUE) $(ROGUEMAP) $(ROGUECOMBAT) $(TONE) $(DGR) $(DGRTEST) $(FILEIO) $(CONIO) $(PORTIO) $(SPIPORT) $(SDFAT) $(FATCAT) $(FATGET) $(FATPUT) $(FATWDSK) $(FATRDSK) $(SANE) $(FPSTR) $(FPU) $(SANITY) $(RPNCALC) $(SNDSEQ) $(PLAYSEQ) +all: $(PLASM) $(PLVM) $(PLVM01) $(PLVM02) $(PLVM802) $(PLVM03) $(CMD) $(PLASMAPLASM) $(CODEOPT) $(ARGS) $(MEMMGR) $(MEMTEST) $(FIBER) $(FIBERTEST) $(LONGJMP) $(ED) $(MON) $(SOS) $(ROD) $(SIEVE) $(UTHERNET2) $(UTHERNET) $(ETHERIP) $(INET) $(DHCP) $(HTTPD) $(ROGUE) $(ROGUEMAP) $(ROGUECOMBAT) $(TONE) $(GRAFIX) $(DGR) $(DGRTEST) $(FILEIO) $(CONIO) $(PORTIO) $(SPIPORT) $(SDFAT) $(FATCAT) $(FATGET) $(FATPUT) $(FATWDSK) $(FATRDSK) $(SANE) $(FPSTR) $(FPU) $(SANITY) $(RPNCALC) $(SNDSEQ) $(PLAYSEQ) clean: -rm *FE1000 *FF2000 $(PLASM) $(PLVM) $(PLVM01) $(PLVM02) $(PLVM03) @@ -245,6 +246,10 @@ $(TONE): libsrc/tone.pla $(PLVM02) $(PLASM) ./$(PLASM) -AMOW < libsrc/tone.pla > libsrc/tone.a acme --setpc 4094 -o $(TONE) libsrc/tone.a +$(GRAFIX): libsrc/grafix.pla $(PLVM02) $(PLASM) + ./$(PLASM) -AMOW < libsrc/grafix.pla > libsrc/grafix.a + acme --setpc 4094 -o $(GRAFIX) libsrc/grafix.a + $(FATCAT): samplesrc/fatcat.pla $(PLVM02) $(PLASM) ./$(PLASM) -AMOW < samplesrc/fatcat.pla > samplesrc/fatcat.a acme --setpc 4094 -o $(FATCAT) samplesrc/fatcat.a From c9a5b251944b395c45975122c4bd0e1a41cadd9e Mon Sep 17 00:00:00 2001 From: David Schmenk Date: Sun, 11 Feb 2018 21:46:21 -0800 Subject: [PATCH 03/28] Apple /// graphics library --- src/libsrc/grafix.pla | 95 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 95 insertions(+) create mode 100644 src/libsrc/grafix.pla diff --git a/src/libsrc/grafix.pla b/src/libsrc/grafix.pla new file mode 100644 index 0000000..eba26c2 --- /dev/null +++ b/src/libsrc/grafix.pla @@ -0,0 +1,95 @@ +include "inc/cmdsys.plh" + +byte gfxref, gfxseg +byte params[8], cmd[10] + +export def pencolor(clr)#0 + params:4 = 2 + cmd.0 = 19 // Pen color + cmd.1 = clr + syscall($CB, @params) +end + +export def line(x1, y1, x2, y2)#0 + params:4 = 10 + cmd.0 = 26 // Move pen + cmd:1 = x1 + cmd:3 = y1 + cmd.5 = 24 // Move pen + cmd:6 = x1 + cmd:8 = y1 + syscall($CB, @params) +end + +export def rect(x1, y1, x2, y2)#0 + params:4 = 11 + cmd.0 = 2 // Set viewport + cmd:1 = x1 + cmd:3 = x2 + cmd:5 = y1 + cmd:7 = y2 + cmd.9 = 28 // Clear viewport + cmd.10 = 1 // Reset viewport + syscall($CB, @params) +end + +export def setmode(mode)#0 + if mode < 0 + // + // Free driver + // + params.0 = 1 + params.1 = gfxref + syscall($CC, @params) + gfxref = 0 + // + // Deaalocate bank 0 + // + params.0 = 1 + params.1 = gfxseg + syscall($45, @params) + ^$1907 = $00 // Unset graphics pages allocated + fin + if not gfxref + return + fin + params.0 = 3 + params.1 = gfxref + params:2 = @cmd + params:4 = 8 + cmd.0 = 16 // Set mode + cmd.1 = mode + cmd.2 = 19 // Pen color + cmd.3 = 0 + cmd.4 = 1 // Reset viewport + cmd.5 = 28 // Clear viewport + cmd.7 = 15 // Turn on screen + syscall($CB, @params) +end + +if MACHID <> $F2 + puts("Apple /// only.\n") + return -1 +fin +// +// Allocate bank 0 +// +params.0 = 4 +params:1 = $2000 +params:3 = $9F00 +params.5 = $10 +params.6 = $00 +syscall($40, @params) +gfxseg = params.6 +^$1907 = $80 // Set graphics pages allocated +// +// Open graphics driver +// +params.0 = 4 +params:1 = ".GRAFIX" +params.3 = 0 +params:4 = 0 +params.6 = 0 +syscall($C8, @params) +gfxref = params.3 +done From f266f1c0355ed216cb1e50f4312e48fa52d2ce1a Mon Sep 17 00:00:00 2001 From: David Schmenk Date: Mon, 12 Feb 2018 12:12:16 -0800 Subject: [PATCH 04/28] Apple 3 graphics demo --- src/inc/grafix.plh | 14 +++++ src/libsrc/grafix.pla | 91 +++++++++++++++++++++++++++++--- src/makefile | 7 ++- src/samplesrc/APPLE3.PIX#060000 | Bin 0 -> 26881 bytes src/samplesrc/gfxdemo.pla | 41 ++++++++++++++ 5 files changed, 146 insertions(+), 7 deletions(-) create mode 100644 src/inc/grafix.plh create mode 100644 src/samplesrc/APPLE3.PIX#060000 create mode 100644 src/samplesrc/gfxdemo.pla diff --git a/src/inc/grafix.plh b/src/inc/grafix.plh new file mode 100644 index 0000000..1dd05a8 --- /dev/null +++ b/src/inc/grafix.plh @@ -0,0 +1,14 @@ +import grafix + predef pencolor(clr)#0 + predef fillcolor(clr)#0 + predef fillscreen()#0 + predef penmove(x, y)#0 + predef plot(x, y)#0 + predef line(x1, y1, x2, y2)#0 + predef lineto(x, y)#0 + predef rect(x1, y1, x2, y2)#0 + predef fillrect(x1, y1, x2, y2)#0 + predef bitblt(blk, pitch, x, y, width, height)#0 + predef drawmode(mode)#0 + predef setmode(mode)#0 +end diff --git a/src/libsrc/grafix.pla b/src/libsrc/grafix.pla index eba26c2..6a610ab 100644 --- a/src/libsrc/grafix.pla +++ b/src/libsrc/grafix.pla @@ -1,7 +1,7 @@ include "inc/cmdsys.plh" byte gfxref, gfxseg -byte params[8], cmd[10] +byte params[8], cmd[16] export def pencolor(clr)#0 params:4 = 2 @@ -10,26 +10,105 @@ export def pencolor(clr)#0 syscall($CB, @params) end +export def fillcolor(clr)#0 + params:4 = 2 + cmd.0 = 20 // Fill color + cmd.1 = clr + syscall($CB, @params) +end + +export def fillscreen()#0 + params:4 = 1 + cmd.9 = 28 // Clear viewport + syscall($CB, @params) +end + +export def penmove(x, y)#0 + params:4 = 5 + cmd.0 = 26 // Move pen + cmd:1 = x + cmd:3 = y + syscall($CB, @params) +end + +export def plot(x, y)#0 + params:4 = 5 + cmd.0 = 25 // Plot + cmd:1 = x + cmd:3 = y + syscall($CB, @params) +end + export def line(x1, y1, x2, y2)#0 params:4 = 10 cmd.0 = 26 // Move pen cmd:1 = x1 cmd:3 = y1 - cmd.5 = 24 // Move pen - cmd:6 = x1 - cmd:8 = y1 + cmd.5 = 24 // Line + cmd:6 = x2 + cmd:8 = y2 + syscall($CB, @params) +end + +export def lineto(x, y)#0 + params:4 = 5 + cmd.0 = 24 // Line + cmd:1 = x + cmd:3 = y syscall($CB, @params) end export def rect(x1, y1, x2, y2)#0 + params:4 = 10 + cmd.0 = 26 // Move pen + cmd:1 = x1 + cmd:3 = y1 + cmd.5 = 24 // Line + cmd:6 = x2 + cmd:8 = y1 + syscall($CB, @params) + params:4 = 15 + cmd.0 = 24 // Line + cmd:1 = x2 + cmd:3 = y2 + cmd.5 = 24 // Line + cmd:6 = x1 + cmd:8 = y2 + cmd.10 = 24 // Line + cmd:11 = x1 + cmd:13 = y1 + syscall($CB, @params) +end + +export def fillrect(x1, y1, x2, y2)#0 params:4 = 11 - cmd.0 = 2 // Set viewport + cmd.0 = 2 // Set viewport cmd:1 = x1 cmd:3 = x2 cmd:5 = y1 cmd:7 = y2 cmd.9 = 28 // Clear viewport - cmd.10 = 1 // Reset viewport + cmd.10 = 1 // Reset viewport + syscall($CB, @params) +end + +export def bitblt(bits, pitch, x, y, width, height)#0 + params:4 = 14 + cmd.0 = 4 // Draw block + cmd:1 = bits + cmd.3 = ^$FFED & $8F + cmd:4 = pitch + cmd:6 = x + cmd:8 = y + cmd:10 = width + cmd:12 = height + syscall($CB, @params) +end + +export def drawmode(mode)#0 + params:4 = 2 + cmd.0 = 21 // Transfer mode + cmd.1 = mode syscall($CB, @params) end diff --git a/src/makefile b/src/makefile index 44c13d7..de32272 100755 --- a/src/makefile +++ b/src/makefile @@ -38,6 +38,7 @@ HTTPD = HTTPD\#FE1000 DGR = DGR\#FE1000 TONE = TONE\#FE1000 GRAFIX = GRAFIX\#FE1000 +GFXDEMO = GFXDEMO\#FE1000 PORTIO = PORTIO\#FE1000 ROGUE = ROGUE\#FE1000 ROGUEMAP= ROGUEMAP\#FE1000 @@ -74,7 +75,7 @@ TXTTYPE = .TXT #SYSTYPE = \#FF2000 #TXTTYPE = \#040000 -all: $(PLASM) $(PLVM) $(PLVM01) $(PLVM02) $(PLVM802) $(PLVM03) $(CMD) $(PLASMAPLASM) $(CODEOPT) $(ARGS) $(MEMMGR) $(MEMTEST) $(FIBER) $(FIBERTEST) $(LONGJMP) $(ED) $(MON) $(SOS) $(ROD) $(SIEVE) $(UTHERNET2) $(UTHERNET) $(ETHERIP) $(INET) $(DHCP) $(HTTPD) $(ROGUE) $(ROGUEMAP) $(ROGUECOMBAT) $(TONE) $(GRAFIX) $(DGR) $(DGRTEST) $(FILEIO) $(CONIO) $(PORTIO) $(SPIPORT) $(SDFAT) $(FATCAT) $(FATGET) $(FATPUT) $(FATWDSK) $(FATRDSK) $(SANE) $(FPSTR) $(FPU) $(SANITY) $(RPNCALC) $(SNDSEQ) $(PLAYSEQ) +all: $(PLASM) $(PLVM) $(PLVM01) $(PLVM02) $(PLVM802) $(PLVM03) $(CMD) $(PLASMAPLASM) $(CODEOPT) $(ARGS) $(MEMMGR) $(MEMTEST) $(FIBER) $(FIBERTEST) $(LONGJMP) $(ED) $(MON) $(SOS) $(ROD) $(SIEVE) $(UTHERNET2) $(UTHERNET) $(ETHERIP) $(INET) $(DHCP) $(HTTPD) $(ROGUE) $(ROGUEMAP) $(ROGUECOMBAT) $(TONE) $(GRAFIX) $(GFXDEMO) $(DGR) $(DGRTEST) $(FILEIO) $(CONIO) $(PORTIO) $(SPIPORT) $(SDFAT) $(FATCAT) $(FATGET) $(FATPUT) $(FATWDSK) $(FATRDSK) $(SANE) $(FPSTR) $(FPU) $(SANITY) $(RPNCALC) $(SNDSEQ) $(PLAYSEQ) clean: -rm *FE1000 *FF2000 $(PLASM) $(PLVM) $(PLVM01) $(PLVM02) $(PLVM03) @@ -250,6 +251,10 @@ $(GRAFIX): libsrc/grafix.pla $(PLVM02) $(PLASM) ./$(PLASM) -AMOW < libsrc/grafix.pla > libsrc/grafix.a acme --setpc 4094 -o $(GRAFIX) libsrc/grafix.a +$(GFXDEMO): samplesrc/gfxdemo.pla $(PLVM02) $(PLASM) + ./$(PLASM) -AMOW < samplesrc/gfxdemo.pla > samplesrc/gfxdemo.a + acme --setpc 4094 -o $(GFXDEMO) samplesrc/gfxdemo.a + $(FATCAT): samplesrc/fatcat.pla $(PLVM02) $(PLASM) ./$(PLASM) -AMOW < samplesrc/fatcat.pla > samplesrc/fatcat.a acme --setpc 4094 -o $(FATCAT) samplesrc/fatcat.a diff --git a/src/samplesrc/APPLE3.PIX#060000 b/src/samplesrc/APPLE3.PIX#060000 new file mode 100644 index 0000000000000000000000000000000000000000..23fee282bb56b1d3618f24cc117082f8da5093ff GIT binary patch literal 26881 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 literal 0 HcmV?d00001 diff --git a/src/samplesrc/gfxdemo.pla b/src/samplesrc/gfxdemo.pla new file mode 100644 index 0000000..ab08e08 --- /dev/null +++ b/src/samplesrc/gfxdemo.pla @@ -0,0 +1,41 @@ +include "inc/cmdsys.plh" +include "inc/args.plh" +include "inc/fileio.plh" +include "inc/grafix.plh" + +var arg +byte ref + +def showimage#0 + var row, x + byte scanline[140] + + for row = 0 to 191 + // + // Read one scanline at a time, scale it, and draw it + // + fileio:read(ref, @scanline, 140) + for x = 139 downto 0 + //scanline[x] = scanline[x] >> 4 + pencolor(scanline[x] >> 4) + plot(x, row) + next + next +end + +arg = argNext(argFirst) +if ^arg + ref = fileio:open(arg) + if ref + setmode(3) // 140 x 192 full color (or greyscale) + showimage + fileio:close(ref) + getc + setmode(-1) + else + puts("Unable to open "); puts(arg); putln + fin +else + puts("Usage: gfxdemo \n") +fin +done From efe08f8ea7e909ba6bc7722a4074f004ad213525 Mon Sep 17 00:00:00 2001 From: David Schmenk Date: Sat, 17 Feb 2018 10:34:09 -0800 Subject: [PATCH 05/28] Save a couple bytes and sync label names --- src/vmsrc/cmd.pla | 2 +- src/vmsrc/plvm01.s | 4 ++-- src/vmsrc/plvm02.s | 6 ++--- src/vmsrc/plvm03.s | 58 ++++++++++++++++++++++----------------------- src/vmsrc/plvm802.s | 6 ++--- 5 files changed, 37 insertions(+), 39 deletions(-) diff --git a/src/vmsrc/cmd.pla b/src/vmsrc/cmd.pla index feff331..68309fb 100755 --- a/src/vmsrc/cmd.pla +++ b/src/vmsrc/cmd.pla @@ -38,7 +38,7 @@ predef execmod(modfile)#1 // // Exported CMDSYS table // -word version = $0100 // 01.00 +word version = $0101 // 01.01 word syspath word syscmdln word = @execmod diff --git a/src/vmsrc/plvm01.s b/src/vmsrc/plvm01.s index 0ca40ec..3537703 100644 --- a/src/vmsrc/plvm01.s +++ b/src/vmsrc/plvm01.s @@ -64,7 +64,7 @@ MUL STY IPY LDA #$00 STA ESTKL+1,X ; PRODL ; STA ESTKH+1,X ; PRODH -MULLP LSR TMPH ; MULTPLRH +_MULLP LSR TMPH ; MULTPLRH ROR TMPL ; MULTPLRL BCS + STA ESTKH+1,X ; PRODH @@ -76,7 +76,7 @@ MULLP LSR TMPH ; MULTPLRH + ASL ESTKL,X ; MULTPLNDL ROL ESTKH,X ; MULTPLNDH DEY - BNE MULLP + BNE _MULLP STA ESTKH+1,X ; PRODH LDY IPY JMP DROP diff --git a/src/vmsrc/plvm02.s b/src/vmsrc/plvm02.s index 6cd48a7..1194c64 100755 --- a/src/vmsrc/plvm02.s +++ b/src/vmsrc/plvm02.s @@ -457,7 +457,7 @@ MUL STY IPY LDA #$00 STA ESTKL+1,X ; PRODL ; STA ESTKH+1,X ; PRODH -MULLP LSR TMPH ; MULTPLRH +_MULLP LSR TMPH ; MULTPLRH ROR TMPL ; MULTPLRL BCS + STA ESTKH+1,X ; PRODH @@ -469,7 +469,7 @@ MULLP LSR TMPH ; MULTPLRH + ASL ESTKL,X ; MULTPLNDL ROL ESTKH,X ; MULTPLNDH DEY - BNE MULLP + BNE _MULLP STA ESTKH+1,X ; PRODH LDY IPY JMP DROP @@ -1161,7 +1161,7 @@ SAW INY ;+INC_IP LDY IPY BMI + JMP DROP -+ JMP FIXDROP ++ JMP FIXDROP ;* ;* STORE VALUE TO ABSOLUTE ADDRESS WITHOUT POPPING STACK ;* diff --git a/src/vmsrc/plvm03.s b/src/vmsrc/plvm03.s index bf81b6f..9244fb2 100755 --- a/src/vmsrc/plvm03.s +++ b/src/vmsrc/plvm03.s @@ -135,6 +135,18 @@ PAGE0 = * VMCORE = * !PSEUDOPC $A000 { ;* +;* OPCODE TABLE +;* + !ALIGN 255,0 +OPTBL !WORD ZERO,ADD,SUB,MUL,DIV,MOD,INCR,DECR ; 00 02 04 06 08 0A 0C 0E + !WORD NEG,COMP,BAND,IOR,XOR,SHL,SHR,IDXW ; 10 12 14 16 18 1A 1C 1E + !WORD LNOT,LOR,LAND,LA,LLA,CB,CW,CS ; 20 22 24 26 28 2A 2C 2E + !WORD DROP,DUP,NEXTOP,DIVMOD,BRGT,BRLT,BREQ,BRNE ; 30 32 34 36 38 3A 3C 3E + !WORD ISEQ,ISNE,ISGT,ISLT,ISGE,ISLE,BRFLS,BRTRU ; 40 42 44 46 48 4A 4C 4E + !WORD BRNCH,IBRNCH,CALL,ICAL,ENTER,LEAVE,RET,CFFB ; 50 52 54 56 58 5A 5C 5E + !WORD LB,LW,LLB,LLW,LAB,LAW,DLB,DLW ; 60 62 64 66 68 6A 6C 6E + !WORD SB,SW,SLB,SLW,SAB,SAW,DAB,DAW ; 70 72 74 76 78 7A 7C 7E +;* ;* SYSTEM INTERPRETER ENTRYPOINT ;* INTERP PLA @@ -220,33 +232,6 @@ _DIVEX INX LDY IPY RTS ;* -;* INCREMENT TOS -;* -INCR INC ESTKL,X - BNE + - INC ESTKH,X -+ JMP NEXTOP -;* -;* DECREMENT TOS -;* -DECR LDA ESTKL,X - BNE + - DEC ESTKH,X -+ DEC ESTKL,X - JMP NEXTOP -;* -;* OPCODE TABLE -;* - !ALIGN 255,0 -OPTBL !WORD ZERO,ADD,SUB,MUL,DIV,MOD,INCR,DECR ; 00 02 04 06 08 0A 0C 0E - !WORD NEG,COMP,BAND,IOR,XOR,SHL,SHR,IDXW ; 10 12 14 16 18 1A 1C 1E - !WORD LNOT,LOR,LAND,LA,LLA,CB,CW,CS ; 20 22 24 26 28 2A 2C 2E - !WORD DROP,DUP,NEXTOP,DIVMOD,BRGT,BRLT,BREQ,BRNE ; 30 32 34 36 38 3A 3C 3E - !WORD ISEQ,ISNE,ISGT,ISLT,ISGE,ISLE,BRFLS,BRTRU ; 40 42 44 46 48 4A 4C 4E - !WORD BRNCH,IBRNCH,CALL,ICAL,ENTER,LEAVE,RET,CFFB ; 50 52 54 56 58 5A 5C 5E - !WORD LB,LW,LLB,LLW,LAB,LAW,DLB,DLW ; 60 62 64 66 68 6A 6C 6E - !WORD SB,SW,SLB,SLW,SAB,SAW,DAB,DAW ; 70 72 74 76 78 7A 7C 7E -;* ;* MUL TOS-1 BY TOS ;* MUL STY IPY @@ -260,7 +245,7 @@ MUL STY IPY LDA #$00 STA ESTKL+1,X ; PRODL ; STA ESTKH+1,X ; PRODH -MULLP LSR TMPH ; MULTPLRH +_MULLP LSR TMPH ; MULTPLRH ROR TMPL ; MULTPLRL BCS + STA ESTKH+1,X ; PRODH @@ -272,7 +257,7 @@ MULLP LSR TMPH ; MULTPLRH + ASL ESTKL,X ; MULTPLNDL ROL ESTKH,X ; MULTPLNDH DEY - BNE MULLP + BNE _MULLP STA ESTKH+1,X ; PRODH LDY IPY JMP DROP @@ -315,6 +300,21 @@ DIVMOD JSR _DIV BMI NEG JMP NEXTOP ;* +;* INCREMENT TOS +;* +INCR INC ESTKL,X + BNE + + INC ESTKH,X ++ JMP NEXTOP +;* +;* DECREMENT TOS +;* +DECR LDA ESTKL,X + BNE + + DEC ESTKH,X ++ DEC ESTKL,X + JMP NEXTOP +;* ;* ADD TOS TO TOS-1 ;* ADD LDA ESTKL,X diff --git a/src/vmsrc/plvm802.s b/src/vmsrc/plvm802.s index 179ac0a..5335412 100644 --- a/src/vmsrc/plvm802.s +++ b/src/vmsrc/plvm802.s @@ -529,12 +529,12 @@ MUL LDX #$10 EOR #$FFFF STA TMP LDA #$0000 -MULLP ASL +_MULLP ASL ASL TMP ; MULTPLR BCS + ADC TOS,S ; MULTPLD + DEX - BNE MULLP + BNE _MULLP STA NOS,S ; PROD JMP DROP ;* @@ -1006,7 +1006,6 @@ SLB INY ;+INC_IP TXY BMI + JMP NEXTOP -+ JMP FIXNEXT SLW INY ;+INC_IP LDA (IP),Y TYX @@ -1051,7 +1050,6 @@ SAB INY ;+INC_IP INY BMI + JMP NEXTOP -+ JMP FIXNEXT SAW INY ;+INC_IP LDA (IP),Y STA TMP From a2c83dfdc06afa1e0b00a6b96a6bfc76d3ae8872 Mon Sep 17 00:00:00 2001 From: Dave Schmenk Date: Mon, 19 Feb 2018 16:22:40 -0800 Subject: [PATCH 06/28] Update images --- PLASMA-BLD1.PO | Bin 143360 -> 143360 bytes PLASMA-DEM1.PO | Bin 143360 -> 143360 bytes PLASMA-SOS1.PO | Bin 143360 -> 143360 bytes PLASMA-SYS1.PO | Bin 143360 -> 143360 bytes src/mkrel | 7 +++++++ 5 files changed, 7 insertions(+) diff --git a/PLASMA-BLD1.PO b/PLASMA-BLD1.PO index 3ced5367b08348148d11c30a184a4cec6ecd020c..a9f17daaf5c64769b665e7fa489f9721eabfbbe1 100644 GIT binary patch delta 3214 zcmai0Yj7LY6~6astyQdSViKH4wrLh8u_ar!B|CvS#I9vYmPPeKQqnk&8Dwc?E373~ zQevAvyZ*^aNCeMU@-?ey-qU{A4-KN6rhlQ)2ccZ zI*FtOL9aR77RkQ+v09A?fTeE|Ok5Gv9rNm-IYtd~R<*+WF$G*eXY4NxQr39!ipjz~9ogAhg4g|c`A{PW5M61xE zR)nQ1Q#1_QeI_yfWhfPg0==P<(_Jy-7_|AyI4XrO+K=V1R-dOr6I2gECHfSX!qNn7 zhQj+@%TZP!V_ zG!Rn1g~BAOTf{!J%W89#2&vx#%pj{DK^=u$U1o1VnffDYM;m>b&`t5KWRxzn}V+gVJ7S_{GXs)Exv+_q8zkVBfP z2Re5ZT?1Ttm%S`YtpnIl6>L2mRXH@sVLiakSHT*~lcrD-4Zsp&s_BZsrA9ix*)1NZ z1QILUfL5aS>n}ZcHEOW?%tMY{B_OpK=nhq>>it%jmn9UUTA?JNOS_WPsfDFS3CTAS ze6)_>xyNX7l)i}w^nOePRq8Cx9U^4S<E-vO5v4HQmh}GK0 zrYk`1CkC3z)x}$B#;j}r#p;PD=svYL(L$Y5(=oY`*T9{$WuukX}O;xwFSzK2Ch`-Ec zL^bFwrM&kvW}n^PnJ#KVk8T0Fp6Y9B@wh8uL)2D)9jj7p9rErdNs1kRHK?AZ<*E(h z+^L|er>+6I!!p$@t|zB+JW;e6I-~(NH%U`R>0{8Sd(UC2%hcTi+ZXWM^|Vr;cZ&@k zxrhb&AQ-RuZ0|P7n7dJ#J52H`2_f72rFze=BP~Q|`PFf(_?&rABF;Td<)6o7jm0)( zA9h^(d8feSToar8Vj>CK=keSYrAkm5){qo+O>qH-72MU-@c!_G>qN{pMQ^edC+oy7k+)edqA)cYOEG%w2cill|WJ z@4fH-AN=sh0}tkoKJ=sfLa>8eO$6@g`$lrBi1Noj`RUId`8n_{;<+_UZKl6Zo82~m z)eEM3Knfqrt{%i%Fu#rS_u}r{6C{5YlNHZC|H6wez5L3nuYu)boWFqU<~p@fjLbp{ zi;rXSn>VBw=QrUNl7%fJUl<9Ull*uy!yF7I*kEFe8J$USY=Vn0j5s5bxnP)$$2hj= z!Uj`pkWED=ID@#yb8IwaV1uzRD_%)9nmrQ6_1T##@nz|OqK|6$81#;1Z4E)74e<+%vrofR*3+``IleCJ`*o#5f;M=;WxaWkm_MJoBIyWkZac zPDyOif{TTjj8WG_es^3de0HRX^jM4Iq(={diJ3s~rrvHga)9SqNt)F`Mq>$X214Mu zGJEMLn9ThFP4>kmQkx#*QlV1(Md}Vy!HMIOT*)|jAeGcL?}!CQp~z69IAqE;>#t!Y z0~~x|$;Tv*NHoTj+?QRG&;{GrvB-3on~1a9#jaSz!4T&9_r{v_47g-o*>*fXfJyTo z{`BTsC;t4GlYjl&+o%5i&OhG$=jr$U_3!sTIP;$mKl=FWxyADrK3Twv_)R=-#f(p2 tn$BQ_Qnexj{|IHFIWGzqH#ATS+7Iw4Olnuc_ELT|!TFCck=~7@{=X}&{3rkb delta 2360 zcmZWqX>e0j6u#%?HZN%jt)qFet7M3|J8`(RB0|jQ(*!R1_3Zswk@~cb%;Yj#Ty8J9_lc_rM--XFTAZmaA}5Hnprp#&+*JSKR5jF&2UM7bXT5XNNwhT>R7y+^jcOJT8mgiT1alG2l* zxye(P(iGF7q9ZCfTSc?i>o%vbjUt0dpH74YQY9X;IZa6y#P4hap;%iANma!aI^nQ5 zQi>Ax7-AaIoXB^$oC7tHXCZ1(%cKS0ij4BeVHFA3z59Vxzahg3H%<<#^0=KQqunHN1yC|OMTU?UisZNo-e#F? zNy&(P<0G6(bB<3L6Ms`REi6^EOJ^$cj$Hkjp~k_f(&iJ@DYWWy9JS6r7Ei2*9V%B z`q5*Gic3n%$}1|XFn0xnFSO{Nm7I{>+to$n^D<4MRcV=vw?bW}HF}zOl-8Wc5LS&B za-8f@8AzqcVdh%~fUFiBIIg_kCD4-{Wg$%oErlmH1t7)-AaS$ za3EMxfNVU%Hm5gdwb?B;aWW)S1lUBp@7rbb1-rAld2cG+WTZQjR<+FPp4HEVwy;M~ z>v>MDRcmuv#F5tTTm!N>MYcf7j5Ltpc9*khx5|kMc*ODfp00)R8#TC|wFl$mj{eIcVAaZG_+|~--jQ=eLaBLO|Tr3+?22#K~&AerW zIQbHU>`|<$P4laYciY7Nk~r3abRXaEml_XgU=kz_X&$n5$~Bdml;wOAhwk=t@?5XzUD>_!L>g@8bUi0+YbwRj1tf#e_PNY%a)vYbz zZlLt#jS_KeH&_ko8r+=d;Q|$QQT3}^UVDA(8*je#HU_UlWUn%(M;U`Y z$bLuIw*9^Ej-Bs!f3WMr-Frf?0Ce=ruMl<^VxNJ=6P&tVC(-uQ&4+_f@b!Uj4}SOk z4~KsI>F|-Ce>wW=vEP0_-uuU&C;s{y_nd_ALZ}y>qq!$fpE-N(pYs>~y?E*Jm8;kO zyM6=H7a;PyZcL9ZkDda0^A<+p5Y|!}-UL*AJAN03xPoN_f%b)pKZRpBEk}p9K#s7M zQl$#R@o+u`VLin_2(sy21yN^-;mCTFUfK=QLS2QlA+({8YC?;;p?%;_s?mg271Bm2 zXV%o#;*Z|Z(dpB#_AhN;>R+et?7-CuUzgtBq4)c`{CfWqpT5oKpW*Az-P^{uE??R1 MlN#u`TR>sx|2OplyZ`_I diff --git a/PLASMA-DEM1.PO b/PLASMA-DEM1.PO index 58fa81e7cae26d8506fc9cc9af67e30b87304301..d381d77cd6563d25d7e63a5a9cb1ca5dfd9bcbc2 100644 GIT binary patch delta 28946 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 EFZ_Sb?*IS* delta 12315 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 diff --git a/PLASMA-SOS1.PO b/PLASMA-SOS1.PO index 1db9bc388ce26f027382d438c197e1bbb5bdf092..6c8829017667c9ea27ad2b6614ef7ec6a885cb46 100644 GIT binary patch delta 2890 zcmZuyeQZq^^Ii#Ao=TC}l`mPB*{)^?qgGVk2y z1lY7E`@VC|J@=g7JzsC|iZpmdI@2M#9q>U7tn)8-OYm2KO@60qJS@IcE>w+M>=lH( zQ=>VZo8$fZ)TNh;#RH%3goKtlo=hek$!{jVoqRHRFu5lA%jEBpe@Wgj`ZW{-t-4)QU5$0 z(zokB&`+lx7MO>q9e+p_<{~@ZRAc59fzp8P>k$x9-|` zL%yMf4p-aDD{Pf^hqKBx&pm%!uzf0wf7iW3tX`x~TsY#>rzY)}&i>=bBAu^3?bxyI zih~nG0DL@JxaMX&t?$vtbt&^Ry(x1+-<^M5Pv+m&FXkupsrK;cjNNd9lS zw=k_YjTH4y3pK{6f@J)>aE~!lXf+NO?lZPzRvCvfH}%-qzw{Gh>y5)%*@$L08ZTzI z82#BNjEU@a<4iWECv||`20Hg~1o&vRR#){=YbFKi#N@dPN9r?&7iOj=CXdu458v?$>t#F8R+KSt#W0)H_JC|N-;y#FM=7=0Xo&pRA!N{g_q1WBgUX5= z6217J^HB-Ns7@|bl6id1c?%pzOjPvJDi2Z7Mv0$g=9Hp>vbn$j7nH=!I|jKyv2-(0 zKsrWnVL+amHZTX#tXu{V5gFlSk=SChFj1EH87A(c0weX#n3Z$Z1@<0k_Lwwx%*Lb$ zR$&4a%#iX_44_@pXS{?;#PU<=phs?it{J2I7W!6|wOJ(W1DvtPApFPT-CHHv9wn$& zqA4L!%N@=_pk#qs2-+wi=YH&r;7?T!WpIsScVQoy*W#NP;=A@iMHQ6ZR;fjX5#^bY z9#L)uCU(yl%2!5utesw2MH=p%VCj|pPdNG(KadE_LF+_oMowGtjV zAG3_Vs;X2R6ZMfq{nT>g}GfkkM77798j+| z)x>|5>kLA$5>pwh40@G6jCL-7wld$!4qrQ$d2ylbm~BjS_!q?x;OR&k&$R>VTFLCeAQ+HGncS^9l5}eeh?AG4(2fmJ(Ml5{Pm&TroC9hK7TEAS6FmPgF zqww~^`UlmC#T~v}M2a_}c5m~2uDj)?@TuljJ|-*z@UMiz&Y?CoDmTjo|Hq=K6(tc1 z$54l#7xP<$ljLSrevIENHXmC%R^5Hoh}EDtaHa)(>*dA3s(HK5$MJxrA=d(~PArf> zyi`1@(vS~@KPrZ;04Of?J#TYXgLQ9~bRD`>mgU>Z!}6L<8`k(RJzaZs9Coyg57j-K z#P9%>=saGS12aYlyZ8z4pyxXVyFWCxVU_V0!d2oovmtyVi^1EbILA08l7SD6@Owq* zUuIx?4m_y`hV_9sAKL>d9lBF`Z=l=2yzlKcU@g{LSGR#eJ6+93I_@IR`!ZaO1+`(_ zhUI<)s~j#U113U@87isrKhaWLS1zAZnnvh1I&k=>bY|`><7BIqZSmB;ob}96wgFRDa&9g!WGa) zRypu)AzuEA_~_|}Ok3HyjT_A?cR>b|!W+j_efV2E49PqPv11fz`cuW@EnrA7yxch6 WCOrLb*s9I5HvcGiFevCjBK-#;8aF2Z delta 2827 zcmZ8i4{Q_H8GrYDaU92XjN^b4oZ2n5vSt0oss4dRSI@qi|*Eje18EwNbQY zR+=)LGFYhu8|t;NE-P{z`|e^KJ1k_CT5Y1xs?b$hK%%IBgcz_kz`7ASRjSm@``$T$ zY?klc_kHhs-}igpzZ<+_8N6Z{Z{=MM)Z#&H{yOJUbPb_Re!qJn%KyHcE1xjgDll&H zC=SOD@g-Fe4{WatCBL{a`L45K+80v(bYQiz@}OIpIZ*%VD~@@8YvNAo_Ap8f4!=G8 z-teL1k>ttYrKwe^^{Hs;>C`V$&eXNkd#OUoGje&PmEKk`p>DRmotJnUA#r+$+u zQ`cl7nV)6e$UKvIIdeAicIGdc7WEl*tNLs8wED67T}m7I!^oWxb9!-lWjdFBCml(P z>3I6(^k?aRq-~k{C7FHKlg`QWn~M9toO~D7>Cy5EYo*QZsB$iFRl6rR>%TZ9`O4Ck zP*S*!d=DktZ;XFkqB38;K9!k%{Z!^g_^)$&hfTgv^22#M9|*T6iVM2=nmy{|sY3~M zddhb8#GONXRJJCR!-u;o{x*p@1i$B%nT0b6Ui(yaX}k0~ZLhvWyD;Y0P@ZTF`DX30 z{13E~`8C=n`BtqW|ETt2extTG+o^3S#I_f_b7T1>T(sy_2ir2fi z+SrMfBhpsVu!2U1cX5TGA=-iK@zyOfv|?pqg%5o29O0P#J`?%Kuno3E9yG_iUR%kN zO>}^!GPTC-_;b(kxCS}uF@U3{;Mjmfv;3zqNj6VCNz)rUsIa~?Qzs~ zO(i&p==EG!#LOz@WJK)igc{Ujx5EBaHHZkNrxUqw)IQ5{%#NW>?DWFe4t9>ayEl{z z#}G-lMXqEIOvuP4BZ-}o(JBc`%mGB+3Wx7`MeTwOkrg15kuwh2B-V|B)p%RzV~IQy zSVTnq*$Euro6MQ^Lu( z&Ji~=&b-jpW0^f>nLB2cEh1E55)_P(vQ!L!UBhRhgo=mqlgOZ3s7GC*-n|2SOLSxu z2-^T-Y;hF5T%5mEqHQq@Y9*Rr95dbHOc<3c5EBL)CFIPHO~&w-=uI8g1auelk#Q}y z2_c@hk0ek5>0K2MFfyjo*&be4fn>g0)Txr~F-N?Jyu=!g4_at28zyTZ`am}1AwjZP z^dQm0B4>ff?d&lVGiH(V$!5Nn-j`K=?yFr3yH_~WFTrhtYncsLcjS6-q!##~6gZ;M ziv^I)6yOazaV%ruDOiFKI69oGk1yVcD0t+6 z%+s67aD#i%P%h5PJn9gpizP=8A`g8|`KV!2phG7vOdlT$$NhoF^{x&b_k!oU{y|{t z@6eS88&_jGuJkt6;irx(2OF0--QzfFL$XV@V%bN1$CY;)>ze^+50Qw)Ed-EEY&&Hy z?s3aTp*fK3p3{xH=e8x7LuK^4F?-39pBpH zG6EyJoGgzn@d^wmY3ZWGvav`I1uG$y!OEbQK9GwnM4>X@!>zt%CiB8Vnjzbe=;)bZ z7{O^V#ByziI+r5lC~#h5Z4XiG!|d`r674W>O)=JEO$bAO!@5p5!5V__I9?Gm34ViF ziY0p=&%}N#^_6vRRKmwra1Bc5vDK~%W5gA+@XuOMOC@p;AHASJkgbqtKw=Df)qh_# z6giR{P{Gm9i$Jk%Q!e=*aL$(-!X?XAuvuW@5c?F+_fLX0bR)Ej!~`(tpua%I+NNaD z(28Nv#4cM4-w@-21LGo^6}B_@@oMPbcujY^9$y6F{o_r@*Dfqaat-V0YM23#f5C%b zbwCva5~T`}=Y~RvsIA}&>YpVs($VAkS$nsVXqCaM!seO_@KN+Sm o9a0gkKq0)=4tEQ)8ehT&O#jn*sBFU%Pqg^=27ejk)F8I}7aG6Y82|tP diff --git a/PLASMA-SYS1.PO b/PLASMA-SYS1.PO index 06d01477d497c70be59dba011bef9d2968ce855d..77a96e07a3d93354e023aee1ea2951fec6690d3b 100644 GIT binary patch delta 3416 zcmaKu4RjRM702&;JK3Fl5Z)#M6M~SCFIh?g)N-nDJceX932Z*d1_~IFwj@T1fXc_R z&@Sr-LZz`G6jWN#Elw#aVzv@QX)7T%lt3^fyAiB_R4FYgcUUydBJ5I_NU*^np73XHV=DI5E#YEjQMN(2M)uiRb%XFT|l^!eV z%cQZ+laNr@XQ&`fB%ty>Wfyu|orlUu6xqyDZEUsF?DK*-P{oogXmA z6+|*MWew5F=s_Z8C}m|9l;=8%<`~7*B=qrlgx;$$M?q<>(i=KfZzU5YmiM>yQziKL(>0;zSyY&3Rys~gv7ABWEXmS~jqG|T>ew|k> zf$oen&@RK3@5rs_*Qw=bB6Uy`nT{f-y{OdCsk118)>sC*jj`Ww%SfF^akMfOGHvim`ib8vNiM?V{kE6O6+v=gA1MSlC3&L8!lB_`0`GcyaIm%`kGee+yuu~?98{D`M z0X3D!#t0LyA{r-#P<`CC7@4Jd=Wu4@o?C=1-kmI}$vsloj%LOSEXss=+_;!aX;29~Zxo1?rV4h?sl5~alW)fMlMcu?C(VZfyB~PlTHha>- zJY~Z(@jI)2m!;S6oq+}OWNIzmcEfZ~ELt1Sjp;}j z4;kif_KfLWG=}lExyEA4b7IW4SZ$cpH>~EzZ52KFI6ZGS@|Gk>OC*}dZ6;$} zX0q@M6E<0!w9qH5ZJ&7et%5LV7>)L7y`~7;P&c|ZTIDrFwlAhRM^LuNUAAm-RZ31y zPRi0Hi&tk4!N!~4U5Pb_7vG~4PXfMoc!q2KiEvF4w!3@hRFfp!al*FFZAsGA*_P~{ zCl|($d$=IXioDv0mc9|g1^S~(J`PXkLQn-(gYDoT_zVau@wK1(t#`0d4m&-XYI8$m6o$Azu9@FHRbybSh& zH;~_td=ugpa16AA5cmL`1D`;15t=U%e+^V%V&sz<)kU*t-*CjqAO&Oq8_4nE>vnJl zL{lM}hPVJY!Avk4+yfSXDzFGF19s#R3E%dEL-~;QyQ!uFI(REumt9y-0zDDE@f+o-cTETnJ zbf8EV;?v+`a0UDqd=0JxZlbyfQ?xJAM7|gkZF_qsOZJ{XgzY=E+5qXGBi<-POoTkzwb{B&Ve_5C#uENZmYu*)pK4s?%J_AxI1 z?7<~Vmp%0GBN%s;DF;}resyDYo*A}{K<+krz%&Y(j}maD9&thBt(jMSIl z_QS!4mb}uEutNrU)j#5epEc-(KV0()6RNMGi96ZACdN6+CjVfjE z%B2_ex2bijzJtkGv{vWdaA?Uawig$N9Z1w>95XVlhMgV=%5;_FyX-TKJE6AWZ1d%S zv&}Z&LY5tnPF-W-@%2w`*!at*HvOvh>0j4vuHS;Yf0_9|9HrcaP5GN`&*1lUrcA@8 zT*$bx2g&Dt`@5cG1C#vMc*OHByy*WuGT*YDOjZ;qb}E19QS64|IWFzm{qieFV6Q!I zRy>T?3obQEBiJ=&-Lv=ghQOcR*w?uK%>!?}eelnJX|#@HpQkF7u=(qurXHIGs9udN zdidSHwH*2T(bi)~V~Z|gLaAlkeEh_F?I$}L*)H}CQ#P~MhG}+Ius*aUiyFlt2;M#ws)TEObBKKpAGH~&I>LIt_*Gn zHU^IbPX+%|zbS9IIrRRi(;xf;MZaMU4mhtTf1uN&TgMz!Y^lK{jM3~`z}0jp=R@imfj12OEVHA xtfF~y>=ecVQ)3Ua$Pdq+`{?|~pIrEtzBv9kd0z`-JitbDTl|L-m47qG{{Zl)Wkdh~ delta 1886 zcmaJ>Yj6`)6h7x>o1_6sf*lJ!z%)qC`eqX*O+W(u8hMsEAl!2%?}+#VRR} zDoA}mYpZ~OtE}koY-(4b3XW83eISqQ22d$5BkJIQjH3?1#=D!Q4XNY(k-hia?|$d? zoz!+4YrBoRM>7svvDXO+OK$`dn9bm{4>8-|ESOz(tEs`yjPi`}dx|)3Q7$)w3$R{* z=rBlyVQH{=4QNPEkp#xZVB;tB0Hc{;fXOCGXzqhGbTFeFM=4W+XBb=t1c1>@s%ve9 zu1iTZ5JNOHeBc>uYR5Ye#KLwwh(<%IX~4iiX@kXOc^Je7Gg%@WK%>xwMm{r*Pa}q* zH{5vB&BI4DSSDTwnTZKohHwU)7YYp9u5a6kESA*E>*b|#ovcU$ zPnF!c=hD7ybJlim7#A}%ZxwM&!e!mLIqS}K_FRfTiI~ptepe7+2b@hR`(hh>mOUs| zZEc%D+hE8}FRCa>Y>(mrgbvWUtaV3icNsW}edTUn?6vxk205&U^>VqzJ}0Yj z2KA4D1>lxmI!)bWkj(~4*$Q{BV63$mwPfx(}*vnjs|y%Nrq*)+#WWe zCdz7>YK@v|&>D*_R=UwH|AgDe<@JWAf0-r$nZ0y9!8u%hE|BPT3-x-wpI4j9KP?`Z z`c>YcgPdpXWm7lAR2EVu5+eAKFkYX3DwXRM6auK{e2q6cFZu48b_EN}2hQCDg zZ*LXe-S(b{6?hr>Kh421S`WLsoDC!tNZCcpXy{kQ43Dq8WQw;>3N2LjEBeVk%gcJb zs-%0C(n_nHWx1x>RDjp}eH8(Bux~z;k11UNCgbc}QF%&f+d8r(uPxI|b362DMOd%JV@o>*^J zA|vD>5mq5d4Smoie)!SeeeLw>FBIz0EL0-lClTEz2R;>XIa1X+jXY1t!OtlqiXjxD zC~QPx{Nl^5ufG1~+e6g+Hws%Yjn60KyCd|dAYVv?QtI<)Sfb~vD0ryP+o(Z4ej;Yb irvj6R@#GIbp6Wh*=B!4-pGa%#L?j_>qk8-mUH<~AAOBha diff --git a/src/mkrel b/src/mkrel index 8aabd61..72b2230 100755 --- a/src/mkrel +++ b/src/mkrel @@ -27,6 +27,7 @@ cp SNDSEQ#FE1000 prodos/sys/SNDSEQ.REL cp UTHERNET#FE1000 prodos/sys/UTHERNET.REL cp UTHERNET2#FE1000 prodos/sys/UTHERNET2.REL cp SOS#FE1000 prodos/sys/SOS.REL +cp GRAFIX#FE1000 prodos/sys/GRAFIX.REL cp ../sysfiles/FP6502.CODE#060000 prodos/sys/FP6502.CODE.BIN cp ../sysfiles/ELEMS.CODE#060000 prodos/sys/ELEMS.CODE.BIN @@ -50,6 +51,10 @@ cp FATPUT#FE1000 prodos/demos/sdutils/FATPUT.REL cp FATREADDSK#FE1000 prodos/demos/sdutils/FATREADDSK.REL cp FATWRITEDSK#FE1000 prodos/demos/sdutils/FATWRITEDSK.REL +mkdir prodos/demos/apple3 +cp GFXDEMO#FE1000 prodos/demos/apple3/GFXDEMO.REL +cp samplesrc/APPLE3.PIX#060000 prodos/demos/apple3/APPLE3.PIX.BIN + mkdir prodos/demos/net cp HTTPD#FE1000 prodos/demos/net/HTTPD.REL cp samplesrc/index.html prodos/demos/net/INDEX.HTML.TXT @@ -80,6 +85,7 @@ cp samplesrc/fatcat.pla prodos/bld/FATCAT.PLA.TXT cp samplesrc/rogue.pla prodos/bld/ROGUE.PLA.TXT cp samplesrc/rogue.map.pla prodos/bld/ROGUE.MAP.PLA.TXT cp samplesrc/rogue.combat.pla prodos/bld/ROGUE.COMBAT.PLA.TXT +cp samplesrc/gfxdemo.pla prodos/bld/GFXDEMO.PLA.TXT mkdir prodos/bld/inc cp inc/args.plh prodos/bld/inc/ARGS.PLH.TXT @@ -99,4 +105,5 @@ cp inc/sdfat.plh prodos/bld/inc/SDFAT.PLH.TXT cp inc/sndseq.plh prodos/bld/inc/SNDSEQ.PLH.TXT cp inc/spiport.plh prodos/bld/inc/SPIPORT.PLH.TXT cp inc/testlib.plh prodos/bld/inc/TESTLIB.PLH.TXT +cp inc/grafix.plh prodos/bld/inc/GRAFIX.PLH.TXT cp vmsrc/plvmzp.inc prodos/bld/inc/PLVMZP.INC.TXT From 3fbf2e4fbd5d8ed9bc9d611687020a1adedeb9ac Mon Sep 17 00:00:00 2001 From: Dave Schmenk Date: Tue, 20 Feb 2018 17:27:44 -0800 Subject: [PATCH 07/28] Support multiple architecture ports --- src/FIRE.PLA#040000 | 1 - src/libsrc/{ => apple}/conio.pla | 0 src/libsrc/{ => apple}/dgr.pla | 0 src/libsrc/{ => apple}/fileio.pla | 0 src/libsrc/{ => apple}/grafix.pla | 0 src/libsrc/{ => apple}/portio.pla | 0 src/libsrc/{ => apple}/sdfat.pla | 0 src/libsrc/{ => apple}/sndseq.pla | 0 src/libsrc/{ => apple}/sos.pla | 0 src/libsrc/{ => apple}/spiport.pla | 0 src/libsrc/{ => apple}/uthernet.pla | 0 src/libsrc/{ => apple}/uthernet2.pla | 0 src/libsrc/c64/conio.pla | 195 +++++++++++++++ src/libsrc/c64/fileio.pla | 77 ++++++ src/libsrc/tone.pla | 116 --------- src/makefile | 349 +++++++++++++++------------ src/mkrel | 86 +++---- src/rel/apple/A1PLASMA#060280 | Bin 0 -> 4798 bytes src/rel/apple/CMD#061000 | Bin 0 -> 4112 bytes src/rel/apple/CONIO#FE1000 | Bin 0 -> 1831 bytes src/rel/apple/DGR#FE1000 | Bin 0 -> 1886 bytes src/rel/apple/DGRTEST#FE1000 | Bin 0 -> 513 bytes src/rel/apple/FATCAT#FE1000 | Bin 0 -> 713 bytes src/rel/apple/FATGET#FE1000 | Bin 0 -> 1506 bytes src/rel/apple/FATPUT#FE1000 | Bin 0 -> 1131 bytes src/rel/apple/FATREADDSK#FE1000 | Bin 0 -> 1503 bytes src/rel/apple/FATWRITEDSK#FE1000 | Bin 0 -> 1507 bytes src/rel/apple/FILEIO#FE1000 | Bin 0 -> 1915 bytes src/rel/apple/GFXDEMO#FE1000 | Bin 0 -> 397 bytes src/rel/apple/GRAFIX#FE1000 | Bin 0 -> 1519 bytes src/rel/apple/MON#FE1000 | Bin 0 -> 87 bytes src/rel/apple/PLASMA.SYSTEM#FF2000 | Bin 0 -> 3609 bytes src/rel/apple/PLASMA16.SYSTEM#FF2000 | Bin 0 -> 2620 bytes src/rel/apple/PLAYSEQ#FE1000 | Bin 0 -> 324 bytes src/rel/apple/PORTIO#FE1000 | Bin 0 -> 314 bytes src/rel/apple/SDFAT#FE1000 | Bin 0 -> 801 bytes src/rel/apple/SNDSEQ#FE1000 | Bin 0 -> 4084 bytes src/rel/apple/SOS#FE1000 | Bin 0 -> 788 bytes src/rel/apple/SOS.INTERP#050000 | Bin 0 -> 6107 bytes src/rel/apple/SPIPORT#FE1000 | Bin 0 -> 1336 bytes src/rel/apple/UTHERNET#FE1000 | Bin 0 -> 1082 bytes src/rel/apple/UTHERNET2#FE1000 | Bin 0 -> 3953 bytes src/rel/c64/PLASMA | Bin 0 -> 4911 bytes src/samplesrc/examples/ex.1.pla | 14 ++ src/samplesrc/examples/ex.10.pla | 292 ++++++++++++++++++++++ src/samplesrc/examples/ex.11.pla | 245 +++++++++++++++++++ src/samplesrc/examples/ex.12.pla | 189 +++++++++++++++ src/samplesrc/examples/ex.13.pla | 59 +++++ src/samplesrc/examples/ex.14.pla | 111 +++++++++ src/samplesrc/examples/ex.15.pla | 30 +++ src/samplesrc/examples/ex.16.pla | 159 ++++++++++++ src/samplesrc/examples/ex.17.pla | 55 +++++ src/samplesrc/examples/ex.2.pla | 92 +++++++ src/samplesrc/examples/ex.3.pla | 83 +++++++ src/samplesrc/examples/ex.4.pla | 75 ++++++ src/samplesrc/examples/ex.5.pla | 40 +++ src/samplesrc/examples/ex.6.pla | 68 ++++++ src/samplesrc/examples/ex.7.pla | 65 +++++ src/samplesrc/examples/ex.8.pla | 71 ++++++ src/samplesrc/examples/ex.9.pla | 126 ++++++++++ src/vmsrc/{ => apple}/a1cmd.pla | 0 src/vmsrc/{ => apple}/cmd.pla | 0 src/vmsrc/{ => apple}/cmdstub.s | 2 +- src/vmsrc/{ => apple}/plvm01.s | 2 +- src/vmsrc/{ => apple}/plvm02.s | 0 src/vmsrc/{ => apple}/plvm03.s | 2 +- src/vmsrc/{ => apple}/plvm802.s | 0 src/vmsrc/{ => apple}/plvmzp.inc | 0 src/vmsrc/{ => apple}/soscmd.pla | 0 69 files changed, 2281 insertions(+), 323 deletions(-) delete mode 100755 src/FIRE.PLA#040000 rename src/libsrc/{ => apple}/conio.pla (100%) rename src/libsrc/{ => apple}/dgr.pla (100%) rename src/libsrc/{ => apple}/fileio.pla (100%) rename src/libsrc/{ => apple}/grafix.pla (100%) rename src/libsrc/{ => apple}/portio.pla (100%) rename src/libsrc/{ => apple}/sdfat.pla (100%) rename src/libsrc/{ => apple}/sndseq.pla (100%) rename src/libsrc/{ => apple}/sos.pla (100%) rename src/libsrc/{ => apple}/spiport.pla (100%) rename src/libsrc/{ => apple}/uthernet.pla (100%) rename src/libsrc/{ => apple}/uthernet2.pla (100%) create mode 100644 src/libsrc/c64/conio.pla create mode 100644 src/libsrc/c64/fileio.pla delete mode 100644 src/libsrc/tone.pla create mode 100644 src/rel/apple/A1PLASMA#060280 create mode 100644 src/rel/apple/CMD#061000 create mode 100644 src/rel/apple/CONIO#FE1000 create mode 100644 src/rel/apple/DGR#FE1000 create mode 100644 src/rel/apple/DGRTEST#FE1000 create mode 100644 src/rel/apple/FATCAT#FE1000 create mode 100644 src/rel/apple/FATGET#FE1000 create mode 100644 src/rel/apple/FATPUT#FE1000 create mode 100644 src/rel/apple/FATREADDSK#FE1000 create mode 100644 src/rel/apple/FATWRITEDSK#FE1000 create mode 100644 src/rel/apple/FILEIO#FE1000 create mode 100644 src/rel/apple/GFXDEMO#FE1000 create mode 100644 src/rel/apple/GRAFIX#FE1000 create mode 100644 src/rel/apple/MON#FE1000 create mode 100644 src/rel/apple/PLASMA.SYSTEM#FF2000 create mode 100644 src/rel/apple/PLASMA16.SYSTEM#FF2000 create mode 100644 src/rel/apple/PLAYSEQ#FE1000 create mode 100644 src/rel/apple/PORTIO#FE1000 create mode 100644 src/rel/apple/SDFAT#FE1000 create mode 100644 src/rel/apple/SNDSEQ#FE1000 create mode 100644 src/rel/apple/SOS#FE1000 create mode 100644 src/rel/apple/SOS.INTERP#050000 create mode 100644 src/rel/apple/SPIPORT#FE1000 create mode 100644 src/rel/apple/UTHERNET#FE1000 create mode 100644 src/rel/apple/UTHERNET2#FE1000 create mode 100644 src/rel/c64/PLASMA create mode 100644 src/samplesrc/examples/ex.1.pla create mode 100644 src/samplesrc/examples/ex.10.pla create mode 100644 src/samplesrc/examples/ex.11.pla create mode 100644 src/samplesrc/examples/ex.12.pla create mode 100644 src/samplesrc/examples/ex.13.pla create mode 100644 src/samplesrc/examples/ex.14.pla create mode 100644 src/samplesrc/examples/ex.15.pla create mode 100644 src/samplesrc/examples/ex.16.pla create mode 100644 src/samplesrc/examples/ex.17.pla create mode 100644 src/samplesrc/examples/ex.2.pla create mode 100644 src/samplesrc/examples/ex.3.pla create mode 100644 src/samplesrc/examples/ex.4.pla create mode 100644 src/samplesrc/examples/ex.5.pla create mode 100644 src/samplesrc/examples/ex.6.pla create mode 100644 src/samplesrc/examples/ex.7.pla create mode 100644 src/samplesrc/examples/ex.8.pla create mode 100644 src/samplesrc/examples/ex.9.pla rename src/vmsrc/{ => apple}/a1cmd.pla (100%) rename src/vmsrc/{ => apple}/cmd.pla (100%) rename src/vmsrc/{ => apple}/cmdstub.s (96%) rename src/vmsrc/{ => apple}/plvm01.s (99%) rename src/vmsrc/{ => apple}/plvm02.s (100%) rename src/vmsrc/{ => apple}/plvm03.s (99%) rename src/vmsrc/{ => apple}/plvm802.s (100%) rename src/vmsrc/{ => apple}/plvmzp.inc (100%) rename src/vmsrc/{ => apple}/soscmd.pla (100%) diff --git a/src/FIRE.PLA#040000 b/src/FIRE.PLA#040000 deleted file mode 100755 index 1dc87c4..0000000 --- a/src/FIRE.PLA#040000 +++ /dev/null @@ -1 +0,0 @@ -CONST FALSE = 0 CONST TRUE = NOT FALSE CONST SHOWLORES = $C056 CONST KEYBOARD = $C000 CONST KEYSTROBE = $C010 CONST EMPTY = 0 CONST TREE = 4 CONST FIRE = 13 CONST FORESTSIZE = 42*42 BYTE HELLOMSG[] = "PRESS ANY KEY TO BEGIN..." BYTE EXITMSG[] = "PRESS ANY KEY TO EXIT." BYTE GOODBYE[] = "THAT'S ALL FOLKS!" BYTE TREES1[FORESTSIZE] BYTE TREES2[FORESTSIZE] WORD RNDNUM DEF TEXTMODE CALL($FB39, 0, 0, 0, 0) END DEF HOME CALL($FC58, 0, 0, 0, 0) END DEF GOTOXY(X, Y) ^($24) = X CALL($FB5B, Y, 0, 0, 0) END DEF GRMODE CALL($FB40, 0, 0, 0, 0) ^SHOWLORES END DEF RANDOMIZE(SEED) RNDNUM = (SEED >> 8) + (SEED << 8) + SEED END DEF RND RNDNUM = (RNDNUM << 8) + RNDNUM + 12345 RETURN RNDNUM & $7FFF END DEF BYFIRE(TREEPTR) IF ^(TREEPTR - 43) == FIRE RETURN TRUE ELSIF ^(TREEPTR - 42) == FIRE RETURN TRUE ELSIF ^(TREEPTR - 41) == FIRE RETURN TRUE ELSIF ^(TREEPTR - 1) == FIRE RETURN TRUE ELSIF ^(TREEPTR + 1) == FIRE RETURN TRUE ELSIF ^(TREEPTR + 41) == FIRE RETURN TRUE ELSIF ^(TREEPTR + 42) == FIRE RETURN TRUE ELSIF ^(TREEPTR + 43) == FIRE RETURN TRUE FIN RETURN FALSE END DEF FORESTFIRE WORD NEWTREES, OLDTREES, NEWTREE, OLDTREE, YROW BYTE X, Y MEMSET(@TREES1, FORESTSIZE, EMPTY) MEMSET(@TREES2, FORESTSIZE, EMPTY) OLDTREES = @TREES1 NEWTREES = @TREES2 FOR Y = 1 TO 40 YROW = Y * 42 FOR X = 1 TO 40 IF RND < 8000 ^(OLDTREES + X + YROW) = TREE FIN NEXT NEXT WHILE ^$C000 < 128 FOR Y = 1 TO 40 YROW = Y * 42 FOR X = 1 TO 40 OLDTREE = OLDTREES + X + YROW NEWTREE = NEWTREES + X + YROW WHEN ^OLDTREE IS EMPTY IF RND < 5000 ^NEWTREE = TREE ELSE ^NEWTREE = EMPTY FIN BREAK IS TREE IF RND < 5 OR BYFIRE(OLDTREE) ^NEWTREE = FIRE ELSE ^NEWTREE = TREE FIN BREAK IS FIRE ^NEWTREE = EMPTY WEND CALL($F864, ^NEWTREE, 0, 0, 0) CALL($F800, Y - 1, 0, X - 1, 0) NEXT NEXT YROW = NEWTREES NEWTREES = OLDTREES OLDTREES = YROW LOOP ^$C010 END PRSTR(@HELLOMSG) WHILE ^$C000 < 128 RNDNUM = RNDNUM + 1 LOOP RANDOMIZE(RNDNUM) ^$C010 GRMODE HOME GOTOXY(10,22) PRSTR(@EXITMSG) FORESTFIRE TEXTMODE HOME PRSTR(@GOODBYE) DONE \ No newline at end of file diff --git a/src/libsrc/conio.pla b/src/libsrc/apple/conio.pla similarity index 100% rename from src/libsrc/conio.pla rename to src/libsrc/apple/conio.pla diff --git a/src/libsrc/dgr.pla b/src/libsrc/apple/dgr.pla similarity index 100% rename from src/libsrc/dgr.pla rename to src/libsrc/apple/dgr.pla diff --git a/src/libsrc/fileio.pla b/src/libsrc/apple/fileio.pla similarity index 100% rename from src/libsrc/fileio.pla rename to src/libsrc/apple/fileio.pla diff --git a/src/libsrc/grafix.pla b/src/libsrc/apple/grafix.pla similarity index 100% rename from src/libsrc/grafix.pla rename to src/libsrc/apple/grafix.pla diff --git a/src/libsrc/portio.pla b/src/libsrc/apple/portio.pla similarity index 100% rename from src/libsrc/portio.pla rename to src/libsrc/apple/portio.pla diff --git a/src/libsrc/sdfat.pla b/src/libsrc/apple/sdfat.pla similarity index 100% rename from src/libsrc/sdfat.pla rename to src/libsrc/apple/sdfat.pla diff --git a/src/libsrc/sndseq.pla b/src/libsrc/apple/sndseq.pla similarity index 100% rename from src/libsrc/sndseq.pla rename to src/libsrc/apple/sndseq.pla diff --git a/src/libsrc/sos.pla b/src/libsrc/apple/sos.pla similarity index 100% rename from src/libsrc/sos.pla rename to src/libsrc/apple/sos.pla diff --git a/src/libsrc/spiport.pla b/src/libsrc/apple/spiport.pla similarity index 100% rename from src/libsrc/spiport.pla rename to src/libsrc/apple/spiport.pla diff --git a/src/libsrc/uthernet.pla b/src/libsrc/apple/uthernet.pla similarity index 100% rename from src/libsrc/uthernet.pla rename to src/libsrc/apple/uthernet.pla diff --git a/src/libsrc/uthernet2.pla b/src/libsrc/apple/uthernet2.pla similarity index 100% rename from src/libsrc/uthernet2.pla rename to src/libsrc/apple/uthernet2.pla diff --git a/src/libsrc/c64/conio.pla b/src/libsrc/c64/conio.pla new file mode 100644 index 0000000..9bffc75 --- /dev/null +++ b/src/libsrc/c64/conio.pla @@ -0,0 +1,195 @@ +include "inc/cmdsys.plh" +// +// Handy constants. +// +const FULLMODE = 0 +const MIXMODE = 1 +// +// External interface. +// +struc t_conio + word keypressed + word getkey + word echo + word home + word gotoxy + word viewport + word texttype + word textmode + word grmode + word grcolor + word grplot + word tone + word rnd +end +// +// Predefined functions. +// +predef a2keypressed,a2home,a12echo(state),a2gotoxy(x,y),a2viewport(left, top, width, height),a2texttype(type) +predef a2textmode(cols),a2grmode(mix),a2grcolor(color),a2grplot(x,y),a2tone(duration, delay),a2rnd +// +// Exported function table. +// +word conio[] +// +// Function pointers. +// +word = @a2keypressed +word = @getc +word = @a12echo +word = @a2home +word = @a2gotoxy +word = @a2viewport +word = @a2texttype +word = @a2textmode +word = @a2grmode +word = @a2grcolor +word = @a2grplot +word = @a2tone +word = @a2rnd +// +// Screen row address arrays. +// +word txt1scrn[] = $0400,$0480,$0500,$0580,$0600,$0680,$0700,$0780 +word = $0428,$04A8,$0528,$05A8,$0628,$06A8,$0728,$07A8 +word = $0450,$04D0,$0550,$05D0,$0650,$06D0,$0750,$07D0 +word txt2scrn[] = $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 +// +// Text screen parameters. +// +//byte textcols = 40 +//byte curshpos = 0 +//byte cursvpos = 0 +// +// Apple 3 console codes. +// +byte textbwmode[] = 2, 16, 0 +byte textclrmode[] = 2, 16, 1 +byte grcharset[] = 1, 0, $7F, $7F, $7F, $7F, $00, $00, $00, $00 +// +// Random number for Apple 1 and III. +// +word randnum = 12345 +// +// Native routines. +// +asm equates + !SOURCE "vmsrc/plvmzp.inc" +end +// +// def grscrn(rowaddrs) +// +asm a2grscrn(rowaddrs) +GRSCRN = $26 +GRSCRNL = GRSCRN +GRSCRNH = GRSCRNL+1 + LDA ESTKL,X + STA GRSCRNL + LDA ESTKH,X + STA GRSCRNH + RTS +end +// +// def grcolor(color) +// +asm a2grcolor(color) +GRCLR = $30 + LDA #$0F + AND ESTKL,X + STA GRCLR + ASL + ASL + ASL + ASL + ORA GRCLR + STA GRCLR + RTS +end +// +// def grplot(x, y) +// +asm a2grplot(x, y) + STY IPY + LDA ESTKL,X + AND #$FE + CMP ESTKL,X + TAY + LDA (GRSCRN),Y + STA DSTL + INY + LDA (GRSCRN),Y + STA DSTH + LDY ESTKL+1,X + LDA (DST),Y + EOR GRCLR + STA TMPL + LDA #$FF + ADC #$00 + EOR #$F0 + AND TMPL + EOR GRCLR + STA (DST),Y + LDY IPY + INX + RTS +end +// +// Commodore 64 routines. +// +def a2keypressed + return ^keyboard >= 128 +end +def a2home + return call($FC58, 0, 0, 0, 0) // home() +end +def a2gotoxy(x, y) + ^$24 = x + ^$20 + return call($FB5B, y + ^$22, 0, 0, 0) +end +def a2viewport(left, top, width, height) + if !width or !height + left = 0 + top = 0 + width = 40 + height = 24 + fin + ^$20 = left + ^$21 = width + ^$22 = top + ^$23 = height + top - 1 + return a2gotoxy(0, 0) +end +def a2texttype(type) + ^$32 = type + return 0 +end +def a2textmode(columns) + call($FB39, 0, 0, 0, 0) // textmode() + return a2home +end +def a2grmode(mix) + call($FB2F, 0, 0, 0, 0) // initmode() + call($FB40, 0, 0, 0, 0) // grmode() + if !mix + ^showfull + fin + a2home + return a2grscrn(@txt1scrn) // point to lo-res screen +end +def a2tone(duration, delay) + byte i + + while duration + ^speaker // toggle speaker + for i = delay downto 0; next + duration-- + loop + return 0 +end +def a2rnd + *a2rndnum = (*a2rndnum << 1) + *a2rndnum + 123 + return *a2rndnum & $7FFF +end +done diff --git a/src/libsrc/c64/fileio.pla b/src/libsrc/c64/fileio.pla new file mode 100644 index 0000000..ed8491d --- /dev/null +++ b/src/libsrc/c64/fileio.pla @@ -0,0 +1,77 @@ +include "inc/cmdsys.plh" +// +// External interface +// +struc t_fileio + word getpfx + word setpfx + word getfileinfo + word geteof + word iobufalloc + word open + word close + word read + word write + word create + word destroy + word newline + word readblock + word writeblock +end +predef a2getpfx(path), a23setpfx(path), a2getfileinfo(path, fileinfo), a23geteof(refnum), a2iobufs(iobufs), a2open(path), a2close(refnum) +predef a23read(refnum, buf, len), a2write(refnum, buf, len), a2create(path, type, aux), a23destroy(path) +predef a2newline(refnum, emask, nlchar), a2readblock(unit, buf, block), a2writeblock(unit, buf, block) +// +// Exported function table. +// +word fileio[] +word = @a2getpfx, @a23setpfx, @a2getfileinfo, @a23geteof, @a2iobufs, @a2open, @a2close +word = @a23read, @a2write, @a2create, @a23destroy +word = @a2newline, @a2readblock, @a2writeblock +// +// SOS/ProDOS error code +// +export byte perr +def a2getpfx(path) + return path +end +def a23setpfx(path) + return path +end +def a2getfileinfo(path, fileinfo) + return perr +end +def a23geteof(refnum) + return 0 +end +def a2iobufs(iobufs) + return 0 +end +def a2open(path) + return 0 +end +def a2close(refnum) + return perr +end +def a23read(refnum, buf, len) + return len +end +def a2write(refnum, buf, len) + return len +end +def a2create(path, type, aux) + return perr +end +def a23destroy(path) + return perr +end +def a2newline(refnum, emask, nlchar) + return perr +end +def a2readblock(unit, buf, block) + return 0 +end +def, a2writeblock(unit, buf, block) + return 0 +end +done diff --git a/src/libsrc/tone.pla b/src/libsrc/tone.pla deleted file mode 100644 index 7440fa5..0000000 --- a/src/libsrc/tone.pla +++ /dev/null @@ -1,116 +0,0 @@ -export asm tone(pitch, duration) -!SOURCE "vmsrc/plvmzp.inc" - DEX - LDA ESTKL+1,X - STA ESTKL,X - LDA ESTKH+1,X - STA ESTKH,X - LDA #$00 - STA ESTKL+1,X - STA ESTKH+1,X -end -export asm tone2(pitch1, pitch2, duration)#0 - STX ESP - LDY ESTKH,X - LDA ESTKL,X - BEQ + - INY -+ STA DSTL - STY DSTH - LDY ESTKL+1,X - STY TMPL - LDA ESTKL+2,X - TAX - LDA #$00 - CPX TMPL - BNE + - TAX -+ STX TMPH - PHP - SEI -- CLC --- DEY - BNE + - LDY TMPL - BEQ ++ ; SILENCE - STA $C030 - BNE +++ -+ NOP - NOP -++ NOP - NOP - NOP -+++ DEX - BNE + - LDX TMPH - BEQ ++ ; SILENCE - STA $C030 - BNE +++ -+ NOP - NOP -++ NOP - NOP - NOP -+++ ADC #$01 - BNE -- - DEC DSTL - BNE - - DEC DSTH - BNE - - PLP - LDX ESP - INX - INX - INX - RTS -end -export asm tonePWM(sample, speed, len)#0 - STX ESP - LDY ESTKH,X - LDA ESTKL,X - BEQ + - INY -+ STY DSTH - STA DSTL - LDA ESTKL+2,X - STA SRCL - LDA ESTKH+2,X - STA SRCH - LDY ESTKL+1,X - INY - STY TMPL - LDY #$00 - PHP - SEI -- LDA (SRC),Y - SEC --- LDX TMPL ---- DEX - BNE --- - SBC #$01 - BCS -- - LDA $C030 - INY - BNE + - INC SRCH -+ DEC DSTL - BNE - - DEC DSTH - BNE - - PLP - LDX ESP - INX - INX - INX - RTS -++ -end -def toneTest#0 - byte t - for t = 2 to 128 - tone2(t, t >> 1, 10) - tone(t, 50) - next -end -toneTest() -done diff --git a/src/makefile b/src/makefile index de32272..f0f005c 100755 --- a/src/makefile +++ b/src/makefile @@ -1,64 +1,63 @@ .SUFFIXES = -AFLAGS = -o $@ -PLVM = plvm -PLVM01 = A1PLASMA\#060280 -PLVM02 = PLASMA.SYSTEM\#FF2000 -PLVM802 = PLASMA16.SYSTEM\#FF2000 -PLVM03 = SOS.INTERP\#050000 -CMD = CMD\#061000 -ED = ED\#FE1000 -SB = SB\#FF2000 -SOS = SOS\#FE1000 -ROD = ROD\#FE1000 -SIEVE = SIEVE\#FE1000 -ARGS = ARGS\#FE1000 -SPIPORT = SPIPORT\#FE1000 -SDFAT = SDFAT\#FE1000 -FATCAT = FATCAT\#FE1000 -FATGET = FATGET\#FE1000 -FATPUT = FATPUT\#FE1000 -FATWDSK = FATWRITEDSK\#FE1000 -FATRDSK = FATREADDSK\#FE1000 -FILEIO = FILEIO\#FE1000 -CONIO = CONIO\#FE1000 -SANE = SANE\#FE1000 -FPSTR = FPSTR\#FE1000 -FPU = FPU\#FE1000 -SNDSEQ = SNDSEQ\#FE1000 -PLAYSEQ = PLAYSEQ\#FE1000 -SANITY = SANITY\#FE1000 -RPNCALC = RPNCALC\#FE1000 -WIZNET = WIZNET\#FE1000 -UTHERNET2= UTHERNET2\#FE1000 -UTHERNET= UTHERNET\#FE1000 -ETHERIP = ETHERIP\#FE1000 -INET = INET\#FE1000 -DHCP = DHCP\#FE1000 -HTTPD = HTTPD\#FE1000 -DGR = DGR\#FE1000 -TONE = TONE\#FE1000 -GRAFIX = GRAFIX\#FE1000 -GFXDEMO = GFXDEMO\#FE1000 -PORTIO = PORTIO\#FE1000 -ROGUE = ROGUE\#FE1000 -ROGUEMAP= ROGUEMAP\#FE1000 -ROGUECOMBAT= ROGUECOMBAT\#FE1000 -HELLO = HELLO\#FE1000 -MON = MON\#FE1000 -DGRTEST = DGRTEST\#FE1000 -TEST = TEST\#FE1000 -TESTLIB = TESTLIB\#FE1000 -PROFILE = PROFILE\#FE1000 -MEMMGR = MEMMGR\#FE1000 -MEMTEST = MEMTEST\#FE1000 -FIBERTEST = FIBERTEST\#FE1000 -FIBER = FIBER\#FE1000 -LONGJMP = LONGJMP\#FE1000 -PLASM = plasm -PLASMAPLASM = PLASM\#FE1000 -CODEOPT = CODEOPT\#FE1000 -INCS = toolsrc/plasm.h toolsrc/tokens.h toolsrc/symbols.h toolsrc/lex.h toolsrc/parse.h toolsrc/codegen.h -OBJS = toolsrc/plasm.c toolsrc/parse.c toolsrc/lex.c toolsrc/codegen.c +AFLAGS = -o $@ +PLVM = plvm +PLVMZP_APL = vmsrc/plvmzp.inc +PLVM01 = rel/apple/A1PLASMA\#060280 +PLVM02 = rel/apple/PLASMA.SYSTEM\#FF2000 +PLVM802 = rel/apple/PLASMA16.SYSTEM\#FF2000 +PLVM03 = rel/apple/SOS.INTERP\#050000 +CMD = rel/apple/CMD\#061000 +PLVMZP_C64 = vmsrc/plvmzp.inc +PLVMC64 = rel/c64/PLASMA +ED = rel/ED\#FE1000 +SOS = rel/apple/SOS\#FE1000 +ROD = rel/ROD\#FE1000 +SIEVE = rel/SIEVE\#FE1000 +ARGS = rel/ARGS\#FE1000 +SPIPORT = rel/apple/SPIPORT\#FE1000 +SDFAT = rel/apple/SDFAT\#FE1000 +FATCAT = rel/apple/FATCAT\#FE1000 +FATGET = rel/apple/FATGET\#FE1000 +FATPUT = rel/apple/FATPUT\#FE1000 +FATWDSK = rel/apple/FATWRITEDSK\#FE1000 +FATRDSK = rel/apple/FATREADDSK\#FE1000 +FILEIO_APL = rel/apple/FILEIO\#FE1000 +CONIO_APL = rel/apple/CONIO\#FE1000 +SANE = rel/SANE\#FE1000 +FPSTR = rel/FPSTR\#FE1000 +FPU = rel/FPU\#FE1000 +SNDSEQ = rel/apple/SNDSEQ\#FE1000 +PLAYSEQ = rel/apple/PLAYSEQ\#FE1000 +SANITY = rel/SANITY\#FE1000 +RPNCALC = rel/RPNCALC\#FE1000 +UTHERNET2 = rel/apple/UTHERNET2\#FE1000 +UTHERNET = rel/apple/UTHERNET\#FE1000 +ETHERIP = rel/ETHERIP\#FE1000 +INET = rel/INET\#FE1000 +DHCP = rel/DHCP\#FE1000 +HTTPD = rel/HTTPD\#FE1000 +DGR = rel/apple/DGR\#FE1000 +GRAFIX = rel/apple/GRAFIX\#FE1000 +GFXDEMO = rel/apple/GFXDEMO\#FE1000 +PORTIO = rel/apple/PORTIO\#FE1000 +ROGUE = rel/ROGUE\#FE1000 +ROGUEMAP = rel/ROGUEMAP\#FE1000 +ROGUECOMBAT= rel/ROGUECOMBAT\#FE1000 +MON = rel/apple/MON\#FE1000 +DGRTEST = rel/apple/DGRTEST\#FE1000 +MEMMGR = rel/MEMMGR\#FE1000 +MEMTEST = rel/MEMTEST\#FE1000 +FIBERTEST = rel/FIBERTEST\#FE1000 +FIBER = rel/FIBER\#FE1000 +LONGJMP = rel/LONGJMP\#FE1000 +HELLO = HELLO\#FE1000 +TEST = TEST\#FE1000 +TESTLIB = TESTLIB\#FE1000 +PLASM = plasm +PLASMAPLASM = rel/PLASM\#FE1000 +CODEOPT = rel/CODEOPT\#FE1000 +INCS = toolsrc/plasm.h toolsrc/tokens.h toolsrc/symbols.h toolsrc/lex.h toolsrc/parse.h toolsrc/codegen.h +OBJS = toolsrc/plasm.c toolsrc/parse.c toolsrc/lex.c toolsrc/codegen.c # # Image filetypes for Virtual ][ # @@ -75,13 +74,29 @@ TXTTYPE = .TXT #SYSTYPE = \#FF2000 #TXTTYPE = \#040000 -all: $(PLASM) $(PLVM) $(PLVM01) $(PLVM02) $(PLVM802) $(PLVM03) $(CMD) $(PLASMAPLASM) $(CODEOPT) $(ARGS) $(MEMMGR) $(MEMTEST) $(FIBER) $(FIBERTEST) $(LONGJMP) $(ED) $(MON) $(SOS) $(ROD) $(SIEVE) $(UTHERNET2) $(UTHERNET) $(ETHERIP) $(INET) $(DHCP) $(HTTPD) $(ROGUE) $(ROGUEMAP) $(ROGUECOMBAT) $(TONE) $(GRAFIX) $(GFXDEMO) $(DGR) $(DGRTEST) $(FILEIO) $(CONIO) $(PORTIO) $(SPIPORT) $(SDFAT) $(FATCAT) $(FATGET) $(FATPUT) $(FATWDSK) $(FATRDSK) $(SANE) $(FPSTR) $(FPU) $(SANITY) $(RPNCALC) $(SNDSEQ) $(PLAYSEQ) +apple: $(PLVMZP_APL) $(PLASM) $(PLVM) $(PLVM01) $(PLVM02) $(PLVM802) $(PLVM03) $(CMD) $(PLASMAPLASM) $(CODEOPT) $(ARGS) $(MEMMGR) $(MEMTEST) $(FIBER) $(FIBERTEST) $(LONGJMP) $(ED) $(MON) $(SOS) $(ROD) $(SIEVE) $(UTHERNET2) $(UTHERNET) $(ETHERIP) $(INET) $(DHCP) $(HTTPD) $(ROGUE) $(ROGUEMAP) $(ROGUECOMBAT) $(GRAFIX) $(GFXDEMO) $(DGR) $(DGRTEST) $(FILEIO_APL) $(CONIO_APL) $(PORTIO) $(SPIPORT) $(SDFAT) $(FATCAT) $(FATGET) $(FATPUT) $(FATWDSK) $(FATRDSK) $(SANE) $(FPSTR) $(FPU) $(SANITY) $(RPNCALC) $(SNDSEQ) $(PLAYSEQ) + -rm vmsrc/plvmzp.inc + +c64: $(PLVMZP_C64) $(PLASM) $(PLVM) $(PLVMC64) + -rm vmsrc/plvmzp.inc + +all: apple c64 clean: -rm *FE1000 *FF2000 $(PLASM) $(PLVM) $(PLVM01) $(PLVM02) $(PLVM03) + -rm rel/* + -rm rel/apple/* + -rm rel/c64/* -rm toolsrc/*.o toolsrc/*~ toolsrc/*.a + -rm toolsrc/apple/*.o toolsrc/apple/*~ toolsrc/apple/*.a + -rm toolsrc/c64/*.o toolsrc/c64/*~ toolsrc/c64/*.a -rm vmsrc/*.o vmsrc/*~ vmsrc/*.a vmsrc/*.sym - -rm samplesrc/*.o samplesrc/*~ samplesrc/*.a + -rm vmsrc/apple/*.o vmsrc/apple/*~ vmsrc/apple/*.a vmsrc/apple/*.sym + -rm vmsrc/c64/*.o vmsrc/c64/*~ vmsrc/c64/*.a vmsrc/c64/*.sym + -rm libsrc/*.o libsrc/*~ libsrc/*.a + -rm libsrc/apple/*.o libsrc/apple/*~ libsrc/apple/*.a + -rm libsrc/c64/*.o libsrc/c64/*~ libsrc/c64/*.a + -rm libsrc/*.o libsrc/*~ libsrc/*.a # # PLASMA compiler: plasm @@ -103,27 +118,41 @@ $(CODEOPT): toolsrc/codeopt.pla toolsrc/codeseq.plh $(PLVM): vmsrc/plvm.c cc vmsrc/plvm.c -o $(PLVM) -vmsrc/a1cmd.a: vmsrc/a1cmd.pla $(PLASM) - ./$(PLASM) -AOW < vmsrc/a1cmd.pla > vmsrc/a1cmd.a +$(PLVMZP_APL): + -rm $(PLVMZP_APL) + -ln -s apple/plvmzp.inc $(PLVMZP_APL) -$(PLVM01): vmsrc/plvm01.s vmsrc/a1cmd.a - acme -o $(PLVM01) -l vmsrc/plvm01.sym vmsrc/plvm01.s +$(PLVMZP_C64): + -rm $(PLVMZP_C64) + -ln -s c64/plvmzp.inc $(PLVMZP_C64) -$(CMD): vmsrc/cmd.pla vmsrc/cmdstub.s $(PLVM02) $(PLASM) - ./$(PLASM) -AOW < vmsrc/cmd.pla > vmsrc/cmd.a - acme --setpc 8192 -o $(CMD) vmsrc/cmdstub.s +vmsrc/c64/cmd.a: vmsrc/c64/cmd.pla $(PLASM) + ./$(PLASM) -AOW < vmsrc/c64/cmd.pla > vmsrc/c64/cmd.a -$(PLVM02): vmsrc/plvm02.s - acme -o $(PLVM02) -l vmsrc/plvm02.sym vmsrc/plvm02.s +$(PLVMC64): vmsrc/c64/plvmc64.s vmsrc/c64/cmd.a + acme -o $(PLVMC64) -l vmsrc/c64/plvmc64.sym vmsrc/c64/plvmc64.s -$(PLVM802): vmsrc/plvm802.s - acme -o $(PLVM802) -l vmsrc/plvm802.sym vmsrc/plvm802.s +vmsrc/apple/a1cmd.a: vmsrc/apple/a1cmd.pla $(PLASM) + ./$(PLASM) -AOW < vmsrc/apple/a1cmd.pla > vmsrc/apple/a1cmd.a -vmsrc/soscmd.a: vmsrc/soscmd.pla $(PLASM) - ./$(PLASM) -AOW < vmsrc/soscmd.pla > vmsrc/soscmd.a +$(PLVM01): vmsrc/apple/plvm01.s vmsrc/apple/a1cmd.a + acme -o $(PLVM01) -l vmsrc/apple/plvm01.sym vmsrc/apple/plvm01.s -$(PLVM03): vmsrc/plvm03.s vmsrc/soscmd.a - acme -o $(PLVM03) -l vmsrc/plvm03.sym vmsrc/plvm03.s +$(CMD): vmsrc/apple/cmd.pla vmsrc/apple/cmdstub.s $(PLVM02) $(PLASM) + ./$(PLASM) -AOW < vmsrc/apple/cmd.pla > vmsrc/apple/cmd.a + acme --setpc 8192 -o $(CMD) vmsrc/apple/cmdstub.s + +$(PLVM02): vmsrc/apple/plvm02.s + acme -o $(PLVM02) -l vmsrc/apple/plvm02.sym vmsrc/apple/plvm02.s + +$(PLVM802): vmsrc/apple/plvm802.s + acme -o $(PLVM802) -l vmsrc/apple/plvm802.sym vmsrc/apple/plvm802.s + +vmsrc/apple/soscmd.a: vmsrc/apple/soscmd.pla $(PLASM) + ./$(PLASM) -AOW < vmsrc/apple/soscmd.pla > vmsrc/apple/soscmd.a + +$(PLVM03): vmsrc/apple/plvm03.s vmsrc/apple/soscmd.a + acme -o $(PLVM03) -l vmsrc/apple/plvm03.sym vmsrc/apple/plvm03.s # # Sample code @@ -139,10 +168,6 @@ $(ED): toolsrc/ed.pla $(PLVM02) $(PLASM) toolsrc/ed.pla ./$(PLASM) -AMOW < toolsrc/ed.pla > toolsrc/ed.a acme --setpc 4094 -o $(ED) toolsrc/ed.a -$(SB): toolsrc/sb.pla $(PLVM02) $(PLASM) toolsrc/sb.pla - ./$(PLASM) -AOW < toolsrc/sb.pla > toolsrc/sb.a - acme --setpc 8192 -o $(SB) toolsrc/sb.a - $(ARGS): libsrc/args.pla $(PLVM02) $(PLASM) ./$(PLASM) -AMOW < libsrc/args.pla > libsrc/args.a acme --setpc 4094 -o $(ARGS) libsrc/args.a @@ -163,26 +188,26 @@ $(FIBERTEST): samplesrc/fibertest.pla $(PLVM02) $(PLASM) ./$(PLASM) -AMOW < samplesrc/fibertest.pla > samplesrc/fibertest.a acme --setpc 4094 -o $(FIBERTEST) samplesrc/fibertest.a -$(SNDSEQ): libsrc/sndseq.pla $(PLVM02) $(PLASM) - ./$(PLASM) -AMOW < libsrc/sndseq.pla > libsrc/sndseq.a - acme --setpc 4094 -o $(SNDSEQ) libsrc/sndseq.a - -$(PLAYSEQ): samplesrc/playseq.pla $(PLVM02) $(PLASM) - ./$(PLASM) -AMOW < samplesrc/playseq.pla > samplesrc/playseq.a - acme --setpc 4094 -o $(PLAYSEQ) samplesrc/playseq.a - $(LONGJMP): libsrc/longjmp.pla $(PLVM02) $(PLASM) ./$(PLASM) -AMOW < libsrc/longjmp.pla > libsrc/longjmp.a acme --setpc 4094 -o $(LONGJMP) libsrc/longjmp.a -$(MON): samplesrc/mon.pla $(PLVM02) $(PLASM) - ./$(PLASM) -AMOW < samplesrc/mon.pla > samplesrc/mon.a - acme --setpc 4094 -o $(MON) samplesrc/mon.a +$(ROGUE): samplesrc/rogue.pla $(PLVM02) $(PLASM) + ./$(PLASM) -AMOW < samplesrc/rogue.pla > samplesrc/rogue.a + acme --setpc 4094 -o $(ROGUE) samplesrc/rogue.a -$(SOS): libsrc/sos.pla $(PLVM02) $(PLASM) - ./$(PLASM) -AMO < libsrc/sos.pla > libsrc/sos.a - acme --setpc 4094 -o $(SOS) libsrc/sos.a +$(ROGUECOMBAT): samplesrc/rogue.combat.pla $(PLVM02) $(PLASM) + ./$(PLASM) -AMOW < samplesrc/rogue.combat.pla > samplesrc/rogue.combat.a + acme --setpc 4094 -o $(ROGUECOMBAT) samplesrc/rogue.combat.a +$(ROGUEMAP): samplesrc/rogue.map.pla $(PLVM02) $(PLASM) + ./$(PLASM) -AMOW < samplesrc/rogue.map.pla > samplesrc/rogue.map.a + acme --setpc 4094 -o $(ROGUEMAP) samplesrc/rogue.map.a + +hello: samplesrc/hello.pla $(PLVM) $(PLASM) + ./$(PLASM) -AMOW < samplesrc/hello.pla > samplesrc/hello.a + acme --setpc 4094 -o $(HELLO) samplesrc/hello.a + ./$(PLVM) HELLO $(ROD): samplesrc/rod.pla $(PLVM02) $(PLASM) ./$(PLASM) -AMO < samplesrc/rod.pla > samplesrc/rod.a acme --setpc 4094 -o $(ROD) samplesrc/rod.a @@ -191,38 +216,6 @@ $(SIEVE): samplesrc/sieve.pla $(PLVM02) $(PLASM) ./$(PLASM) -AMW < samplesrc/sieve.pla > samplesrc/sieve.a acme --setpc 4094 -o $(SIEVE) samplesrc/sieve.a -$(UTHERNET): libsrc/uthernet.pla $(PLVM02) $(PLASM) - ./$(PLASM) -AMOW < libsrc/uthernet.pla > libsrc/uthernet.a - acme --setpc 4094 -o $(UTHERNET) libsrc/uthernet.a - -$(UTHERNET2): libsrc/uthernet2.pla $(PLVM02) $(PLASM) - ./$(PLASM) -AMOW < libsrc/uthernet2.pla > libsrc/uthernet2.a - acme --setpc 4094 -o $(UTHERNET2) libsrc/uthernet2.a - -$(ETHERIP): libsrc/etherip.pla $(PLVM02) $(PLASM) - ./$(PLASM) -AMOW < libsrc/etherip.pla > libsrc/etherip.a - acme --setpc 4094 -o $(ETHERIP) libsrc/etherip.a - -$(INET): libsrc/inet.pla $(PLVM02) $(PLASM) - ./$(PLASM) -AMOW < libsrc/inet.pla > libsrc/inet.a - acme --setpc 4094 -o $(INET) libsrc/inet.a - -$(DHCP): libsrc/dhcp.pla $(PLVM02) $(PLASM) - ./$(PLASM) -AMOW < libsrc/dhcp.pla > libsrc/dhcp.a - acme --setpc 4094 -o $(DHCP) libsrc/dhcp.a - -$(HTTPD): samplesrc/httpd.pla $(PLVM02) $(PLASM) - ./$(PLASM) -AMOW < samplesrc/httpd.pla > samplesrc/httpd.a - acme --setpc 4094 -o $(HTTPD) samplesrc/httpd.a - -$(FILEIO): libsrc/fileio.pla $(PLVM02) $(PLASM) - ./$(PLASM) -AMOW < libsrc/fileio.pla > libsrc/fileio.a - acme --setpc 4094 -o $(FILEIO) libsrc/fileio.a - -$(CONIO): libsrc/conio.pla $(PLVM02) $(PLASM) - ./$(PLASM) -AMOW < libsrc/conio.pla > libsrc/conio.a - acme --setpc 4094 -o $(CONIO) libsrc/conio.a - $(SANE): libsrc/sane.pla $(PLVM02) $(PLASM) ./$(PLASM) -AMOW < libsrc/sane.pla > libsrc/sane.a acme --setpc 4094 -o $(SANE) libsrc/sane.a @@ -239,17 +232,61 @@ $(SANITY): samplesrc/sanity.pla $(PLVM02) $(PLASM) ./$(PLASM) -AMOW < samplesrc/sanity.pla > samplesrc/sanity.a acme --setpc 4094 -o $(SANITY) samplesrc/sanity.a -$(RPNCALC): samplesrc/rpncalc.pla libsrc/fpu.pla inc/fpu.plh libsrc/fpstr.pla inc/fpstr.plh libsrc/conio.pla inc/conio.plh $(PLVM02) $(PLASM) +$(RPNCALC): samplesrc/rpncalc.pla libsrc/fpu.pla inc/fpu.plh libsrc/fpstr.pla inc/fpstr.plh inc/conio.plh $(PLVM02) $(PLASM) ./$(PLASM) -AMOW < samplesrc/rpncalc.pla > samplesrc/rpncalc.a acme --setpc 4094 -o $(RPNCALC) samplesrc/rpncalc.a -$(TONE): libsrc/tone.pla $(PLVM02) $(PLASM) - ./$(PLASM) -AMOW < libsrc/tone.pla > libsrc/tone.a - acme --setpc 4094 -o $(TONE) libsrc/tone.a +$(ETHERIP): libsrc/etherip.pla $(PLVM02) $(PLASM) + ./$(PLASM) -AMOW < libsrc/etherip.pla > libsrc/etherip.a + acme --setpc 4094 -o $(ETHERIP) libsrc/etherip.a -$(GRAFIX): libsrc/grafix.pla $(PLVM02) $(PLASM) - ./$(PLASM) -AMOW < libsrc/grafix.pla > libsrc/grafix.a - acme --setpc 4094 -o $(GRAFIX) libsrc/grafix.a +$(INET): libsrc/inet.pla $(PLVM02) $(PLASM) + ./$(PLASM) -AMOW < libsrc/inet.pla > libsrc/inet.a + acme --setpc 4094 -o $(INET) libsrc/inet.a + +$(DHCP): libsrc/dhcp.pla $(PLVM02) $(PLASM) + ./$(PLASM) -AMOW < libsrc/dhcp.pla > libsrc/dhcp.a + acme --setpc 4094 -o $(DHCP) libsrc/dhcp.a + +$(HTTPD): samplesrc/httpd.pla $(PLVM02) $(PLASM) + ./$(PLASM) -AMOW < samplesrc/httpd.pla > samplesrc/httpd.a + acme --setpc 4094 -o $(HTTPD) samplesrc/httpd.a + +$(UTHERNET): libsrc/apple/uthernet.pla $(PLVM02) $(PLASM) + ./$(PLASM) -AMOW < libsrc/apple/uthernet.pla > libsrc/apple/uthernet.a + acme --setpc 4094 -o $(UTHERNET) libsrc/apple/uthernet.a + +$(UTHERNET2): libsrc/apple/uthernet2.pla $(PLVM02) $(PLASM) + ./$(PLASM) -AMOW < libsrc/apple/uthernet2.pla > libsrc/apple/uthernet2.a + acme --setpc 4094 -o $(UTHERNET2) libsrc/apple/uthernet2.a + +$(FILEIO_APL): libsrc/apple/fileio.pla $(PLVM02) $(PLASM) + ./$(PLASM) -AMOW < libsrc/apple/fileio.pla > libsrc/apple/fileio.a + acme --setpc 4094 -o $(FILEIO_APL) libsrc/apple/fileio.a + +$(CONIO_APL): libsrc/apple/conio.pla $(PLVM02) $(PLASM) + ./$(PLASM) -AMOW < libsrc/apple/conio.pla > libsrc/apple/conio.a + acme --setpc 4094 -o $(CONIO_APL) libsrc/apple/conio.a + +$(FILEIO_C64): libsrc/c64/fileio.pla $(PLVM02) $(PLASM) + ./$(PLASM) -AMOW < libsrc/c64/fileio.pla > libsrc/c64/fileio.a + acme --setpc 4094 -o $(FILEIO_C64) libsrc/c64/fileio.a + +$(CONIO_C64): libsrc/c64/conio.pla $(PLVM02) $(PLASM) + ./$(PLASM) -AMOW < libsrc/c64/conio.pla > libsrc/c64/conio.a + acme --setpc 4094 -o $(CONIO_C64) libsrc/c64/conio.a + +$(SNDSEQ): libsrc/apple/sndseq.pla $(PLVM02) $(PLASM) + ./$(PLASM) -AMOW < libsrc/apple/sndseq.pla > libsrc/apple/sndseq.a + acme --setpc 4094 -o $(SNDSEQ) libsrc/apple/sndseq.a + +$(PLAYSEQ): samplesrc/playseq.pla $(PLVM02) $(PLASM) + ./$(PLASM) -AMOW < samplesrc/playseq.pla > samplesrc/playseq.a + acme --setpc 4094 -o $(PLAYSEQ) samplesrc/playseq.a + +$(GRAFIX): libsrc/apple/grafix.pla $(PLVM02) $(PLASM) + ./$(PLASM) -AMOW < libsrc/apple/grafix.pla > libsrc/apple/grafix.a + acme --setpc 4094 -o $(GRAFIX) libsrc/apple/grafix.a $(GFXDEMO): samplesrc/gfxdemo.pla $(PLVM02) $(PLASM) ./$(PLASM) -AMOW < samplesrc/gfxdemo.pla > samplesrc/gfxdemo.a @@ -275,39 +312,31 @@ $(FATRDSK): samplesrc/fatreaddsk.pla $(PLVM02) $(PLASM) ./$(PLASM) -AMOW < samplesrc/fatreaddsk.pla > samplesrc/fatreaddsk.a acme --setpc 4094 -o $(FATRDSK) samplesrc/fatreaddsk.a -$(SDFAT): libsrc/sdfat.pla $(PLVM02) $(PLASM) - ./$(PLASM) -AMOW < libsrc/sdfat.pla > libsrc/sdfat.a - acme --setpc 4094 -o $(SDFAT) libsrc/sdfat.a +$(SDFAT): libsrc/apple/sdfat.pla $(PLVM02) $(PLASM) + ./$(PLASM) -AMOW < libsrc/apple/sdfat.pla > libsrc/apple/sdfat.a + acme --setpc 4094 -o $(SDFAT) libsrc/apple/sdfat.a -$(SPIPORT): libsrc/spiport.pla $(PLVM02) $(PLASM) - ./$(PLASM) -AMOW < libsrc/spiport.pla > libsrc/spiport.a - acme --setpc 4094 -o $(SPIPORT) libsrc/spiport.a +$(SPIPORT): libsrc/apple/spiport.pla $(PLVM02) $(PLASM) + ./$(PLASM) -AMOW < libsrc/apple/spiport.pla > libsrc/apple/spiport.a + acme --setpc 4094 -o $(SPIPORT) libsrc/apple/spiport.a -$(PORTIO): libsrc/portio.pla $(PLVM02) $(PLASM) - ./$(PLASM) -AMOW < libsrc/portio.pla > libsrc/portio.a - acme --setpc 4094 -o $(PORTIO) libsrc/portio.a +$(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 -$(DGR): libsrc/dgr.pla $(PLVM02) $(PLASM) - ./$(PLASM) -AMOW < libsrc/dgr.pla > libsrc/dgr.a - acme --setpc 4094 -o $(DGR) libsrc/dgr.a +$(DGR): libsrc/apple/dgr.pla $(PLVM02) $(PLASM) + ./$(PLASM) -AMOW < libsrc/apple/dgr.pla > libsrc/apple/dgr.a + acme --setpc 4094 -o $(DGR) libsrc/apple/dgr.a $(DGRTEST): samplesrc/dgrtest.pla $(PLVM02) $(PLASM) ./$(PLASM) -AMOW < samplesrc/dgrtest.pla > samplesrc/dgrtest.a acme --setpc 4094 -o $(DGRTEST) samplesrc/dgrtest.a -$(ROGUE): samplesrc/rogue.pla $(PLVM02) $(PLASM) - ./$(PLASM) -AMOW < samplesrc/rogue.pla > samplesrc/rogue.a - acme --setpc 4094 -o $(ROGUE) samplesrc/rogue.a +$(MON): samplesrc/mon.pla $(PLVM02) $(PLASM) + ./$(PLASM) -AMOW < samplesrc/mon.pla > samplesrc/mon.a + acme --setpc 4094 -o $(MON) samplesrc/mon.a -$(ROGUECOMBAT): samplesrc/rogue.combat.pla $(PLVM02) $(PLASM) - ./$(PLASM) -AMOW < samplesrc/rogue.combat.pla > samplesrc/rogue.combat.a - acme --setpc 4094 -o $(ROGUECOMBAT) samplesrc/rogue.combat.a +$(SOS): libsrc/apple/sos.pla $(PLVM02) $(PLASM) + ./$(PLASM) -AMO < libsrc/apple/sos.pla > libsrc/apple/sos.a + acme --setpc 4094 -o $(SOS) libsrc/apple/sos.a -$(ROGUEMAP): samplesrc/rogue.map.pla $(PLVM02) $(PLASM) - ./$(PLASM) -AMOW < samplesrc/rogue.map.pla > samplesrc/rogue.map.a - acme --setpc 4094 -o $(ROGUEMAP) samplesrc/rogue.map.a - -hello: samplesrc/hello.pla $(PLVM) $(PLASM) - ./$(PLASM) -AMOW < samplesrc/hello.pla > samplesrc/hello.a - acme --setpc 4094 -o $(HELLO) samplesrc/hello.a - ./$(PLVM) HELLO diff --git a/src/mkrel b/src/mkrel index 72b2230..30651e4 100755 --- a/src/mkrel +++ b/src/mkrel @@ -1,73 +1,73 @@ -cp CMD#061000 prodos/CMD.BIN -cp PLASMA.SYSTEM#FF2000 prodos/PLASMA.SYSTEM.SYS -cp PLASMA16.SYSTEM#FF2000 prodos/PLASMA16.SYSTEM.SYS -cp SOS.INTERP#050000 prodos/SOS.INTERP.\$05 +cp rel/apple/CMD#061000 prodos/CMD.BIN +cp rel/apple/PLASMA.SYSTEM#FF2000 prodos/PLASMA.SYSTEM.SYS +cp rel/apple/PLASMA16.SYSTEM#FF2000 prodos/PLASMA16.SYSTEM.SYS +cp rel/apple/SOS.INTERP#050000 prodos/SOS.INTERP.\$05 cp ../doc/Editor.md prodos/EDITOR.README.TXT rm -rf prodos/sys mkdir prodos/sys -cp ARGS#FE1000 prodos/sys/ARGS.REL -cp CONIO#FE1000 prodos/sys/CONIO.REL -cp DGR#FE1000 prodos/sys/DGR.REL -cp DHCP#FE1000 prodos/sys/DHCP.REL -cp ED#FE1000 prodos/sys/ED.REL -cp ETHERIP#FE1000 prodos/sys/ETHERIP.REL -cp FIBER#FE1000 prodos/sys/FIBER.REL -cp FILEIO#FE1000 prodos/sys/FILEIO.REL -cp FPSTR#FE1000 prodos/sys/FPSTR.REL -cp FPU#FE1000 prodos/sys/FPU.REL -cp INET#FE1000 prodos/sys/INET.REL -cp LONGJMP#FE1000 prodos/sys/LONGJMP.REL -cp MEMMGR#FE1000 prodos/sys/MEMMGR.REL -cp PORTIO#FE1000 prodos/sys/PORTIO.REL -cp SANE#FE1000 prodos/sys/SANE.REL -cp SDFAT#FE1000 prodos/sys/SDFAT.REL -cp SPIPORT#FE1000 prodos/sys/SPIPORT.REL -cp SNDSEQ#FE1000 prodos/sys/SNDSEQ.REL -cp UTHERNET#FE1000 prodos/sys/UTHERNET.REL -cp UTHERNET2#FE1000 prodos/sys/UTHERNET2.REL -cp SOS#FE1000 prodos/sys/SOS.REL -cp GRAFIX#FE1000 prodos/sys/GRAFIX.REL +cp rel/ARGS#FE1000 prodos/sys/ARGS.REL +cp rel/apple/CONIO#FE1000 prodos/sys/CONIO.REL +cp rel/apple/DGR#FE1000 prodos/sys/DGR.REL +cp rel/DHCP#FE1000 prodos/sys/DHCP.REL +cp rel/apple/ED#FE1000 prodos/sys/ED.REL +cp rel/ETHERIP#FE1000 prodos/sys/ETHERIP.REL +cp rel/FIBER#FE1000 prodos/sys/FIBER.REL +cp rel/apple/FILEIO#FE1000 prodos/sys/FILEIO.REL +cp rel/FPSTR#FE1000 prodos/sys/FPSTR.REL +cp rel/FPU#FE1000 prodos/sys/FPU.REL +cp rel/INET#FE1000 prodos/sys/INET.REL +cp rel/LONGJMP#FE1000 prodos/sys/LONGJMP.REL +cp rel/MEMMGR#FE1000 prodos/sys/MEMMGR.REL +cp rel/apple/PORTIO#FE1000 prodos/sys/PORTIO.REL +cp rel/SANE#FE1000 prodos/sys/SANE.REL +cp rel/apple/SDFAT#FE1000 prodos/sys/SDFAT.REL +cp rel/apple/SPIPORT#FE1000 prodos/sys/SPIPORT.REL +cp rel/apple/SNDSEQ#FE1000 prodos/sys/SNDSEQ.REL +cp rel/apple/UTHERNET#FE1000 prodos/sys/UTHERNET.REL +cp rel/apple/UTHERNET2#FE1000 prodos/sys/UTHERNET2.REL +cp rel/apple/SOS#FE1000 prodos/sys/SOS.REL +cp rel/apple/GRAFIX#FE1000 prodos/sys/GRAFIX.REL cp ../sysfiles/FP6502.CODE#060000 prodos/sys/FP6502.CODE.BIN cp ../sysfiles/ELEMS.CODE#060000 prodos/sys/ELEMS.CODE.BIN rm -rf prodos/demos mkdir prodos/demos -cp DGRTEST#FE1000 prodos/demos/DGRTEST.REL -cp RPNCALC#FE1000 prodos/demos/RPNCALC.REL -cp ROD#FE1000 prodos/demos/ROD.REL +cp rel/apple/DGRTEST#FE1000 prodos/demos/DGRTEST.REL +cp rel/RPNCALC#FE1000 prodos/demos/RPNCALC.REL +cp rel/ROD#FE1000 prodos/demos/ROD.REL mkdir prodos/demos/rogue -cp ROGUE#FE1000 prodos/demos/rogue/ROGUE.REL -cp ROGUECOMBAT#FE1000 prodos/demos/rogue/ROGUECOMBAT.REL -cp ROGUEMAP#FE1000 prodos/demos/rogue/ROGUEMAP.REL +cp rel/ROGUE#FE1000 prodos/demos/rogue/ROGUE.REL +cp rel/ROGUECOMBAT#FE1000 prodos/demos/rogue/ROGUECOMBAT.REL +cp rel/ROGUEMAP#FE1000 prodos/demos/rogue/ROGUEMAP.REL cp samplesrc/LEVEL0#040000 prodos/demos/rogue/LEVEL0.TXT cp samplesrc/LEVEL1#040000 prodos/demos/rogue/LEVEL1.TXT mkdir prodos/demos/sdutils -cp FATCAT#FE1000 prodos/demos/sdutils/FATCAT.REL -cp FATGET#FE1000 prodos/demos/sdutils/FATGET.REL -cp FATPUT#FE1000 prodos/demos/sdutils/FATPUT.REL -cp FATREADDSK#FE1000 prodos/demos/sdutils/FATREADDSK.REL -cp FATWRITEDSK#FE1000 prodos/demos/sdutils/FATWRITEDSK.REL +cp rel/apple/FATCAT#FE1000 prodos/demos/sdutils/FATCAT.REL +cp rel/apple/FATGET#FE1000 prodos/demos/sdutils/FATGET.REL +cp rel/apple/FATPUT#FE1000 prodos/demos/sdutils/FATPUT.REL +cp rel/apple/FATREADDSK#FE1000 prodos/demos/sdutils/FATREADDSK.REL +cp rel/apple/FATWRITEDSK#FE1000 prodos/demos/sdutils/FATWRITEDSK.REL mkdir prodos/demos/apple3 -cp GFXDEMO#FE1000 prodos/demos/apple3/GFXDEMO.REL +cp rel/apple/GFXDEMO#FE1000 prodos/demos/apple3/GFXDEMO.REL cp samplesrc/APPLE3.PIX#060000 prodos/demos/apple3/APPLE3.PIX.BIN mkdir prodos/demos/net -cp HTTPD#FE1000 prodos/demos/net/HTTPD.REL +cp rel/HTTPD#FE1000 prodos/demos/net/HTTPD.REL cp samplesrc/index.html prodos/demos/net/INDEX.HTML.TXT mkdir prodos/demos/music -cp PLAYSEQ#FE1000 prodos/demos/music/PLAYSEQ.REL +cp rel/apple/PLAYSEQ#FE1000 prodos/demos/music/PLAYSEQ.REL cp mockingboard/ultima3.seq prodos/demos/music/ULTIMA3.SEQ.BIN cp mockingboard/startrek.seq prodos/demos/music/STARTREK.SEQ.BIN rm -rf prodos/bld mkdir prodos/bld -cp PLASM#FE1000 prodos/bld/PLASM.REL -cp CODEOPT#FE1000 prodos/bld/CODEOPT.REL +cp rel/PLASM#FE1000 prodos/bld/PLASM.REL +cp rel/CODEOPT#FE1000 prodos/bld/CODEOPT.REL cp samplesrc/dgrtest.pla prodos/bld/DGRTEST.PLA.TXT cp samplesrc/hello.pla prodos/bld/HELLO.PLA.TXT cp samplesrc/hgr1test.pla prodos/bld/HGR1TEST.PLA.TXT @@ -106,4 +106,4 @@ cp inc/sndseq.plh prodos/bld/inc/SNDSEQ.PLH.TXT cp inc/spiport.plh prodos/bld/inc/SPIPORT.PLH.TXT cp inc/testlib.plh prodos/bld/inc/TESTLIB.PLH.TXT cp inc/grafix.plh prodos/bld/inc/GRAFIX.PLH.TXT -cp vmsrc/plvmzp.inc prodos/bld/inc/PLVMZP.INC.TXT +cp vmsrc/apple/plvmzp.inc prodos/bld/inc/PLVMZP.INC.TXT diff --git a/src/rel/apple/A1PLASMA#060280 b/src/rel/apple/A1PLASMA#060280 new file mode 100644 index 0000000000000000000000000000000000000000..c72950b4d82498fb7f909cbd057f9a10b95e0ecb GIT binary patch literal 4798 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 Vs-Y)&aUYwTc%e{GKiPvU{{zyEu2}#8 literal 0 HcmV?d00001 diff --git a/src/rel/apple/CMD#061000 b/src/rel/apple/CMD#061000 new file mode 100644 index 0000000000000000000000000000000000000000..1b371ce80303fee6dcdceeb7f51858e03d16d434 GIT binary patch literal 4112 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 HncVwdzem_K literal 0 HcmV?d00001 diff --git a/src/rel/apple/CONIO#FE1000 b/src/rel/apple/CONIO#FE1000 new file mode 100644 index 0000000000000000000000000000000000000000..7c30fb3b48035e5b17b0567ccbc3aeee6892c3f2 GIT binary patch literal 1831 zcmZ{le~1-T6vxlpxo_T&S=KxA)>hqI-)`&dIBhr>iAHFp+Yi}ZLoTxIuK5%lMq7el z*i&Kq;a7h*!_=1P-zkyE0W zAg!oTvY51ancInS!q&=~oh&CkUg2J%lJK;O<|QjhN)=O-E~Y6{%#dEx?Nm8sr^{(O zQ_k3WS@%+vl$Wlgy-X$J=@p#`VnR`9KOVxf)}1JntO>8wSva=fsY1!k;7Pb8xA5NZ zL}A507YpSRRw;iDuUEg>ej?xPmPU_Nchk!^mydS4asKn+YXu67ic@@Pu#YL!&-xUi zA#$46q^Y5o$h%c_sbA^i42n-Z3&_dUT8$&*-KMUZ4F1jJvms7T zYt-o7uDU+SxNC?@1T-l}?dtnWE(AFTF^Eq=j@VcSbq(C{Squ{kk>E>FGi{4KJylabUp}?JVAF{A3a$$S&w2I-yoW1OwJatv~Hx2gb zs-q5Lro%~}4X1oQl6DT*8dlw}KdkTF|N0aP(&Qv;>fL6#J7p!9A}u;B8_a&@Jc=B( zt#cOD>VlWEShi%r>gD;reRCA)yhJ+7{jWthGVHF+=d7`2_qAHXQK4Z|kD3qE+xkFA zA9C!CI2?%eFp-m{>orKlt}FFfV*6ADX9CmD;uL5&Wg}!Amho~)h7}8}$t9-=aa<;; z#|`0FtjSRWim;Ql?m$*VSOX6z-dxp%L6%5GiGoYjA?{2*GIpuz%Vp`;9MDZ-xQW<2`mX~O zwpP#q9N>c0U;})%fxX}mI0BA>lb|U}Yzf!|j)N(1IZF{PzBo%-w2&xj28%%pSPGVb zHh>Q=S`IqF3i$s?YMfNm*icx!OUcBMl8L@kD82|e3waH;-_gdm9&wOl6b~>x9tHcM zAA}x5ehm33WAQO?9DEJF1wVs%@C*12+yJ-0-#}AYtg9>%Dn+d-#ce8&R-wHf?QYoL zfZVR~cqeST!4MdQZ6EsHhx|}AqK_aygZvVGUxCwL8e9NBp>JN*qAO_s3T{Hbttyeq zDbhe1G=K%b1Pj3;&;nXP8|VO?zyVJH7d#18gSFrpupT@QUI8B147PyR!64WMc7R4&qh bYINrGRFBBe%6x>=0>|QCcp{)R literal 0 HcmV?d00001 diff --git a/src/rel/apple/DGR#FE1000 b/src/rel/apple/DGR#FE1000 new file mode 100644 index 0000000000000000000000000000000000000000..ccf32b7ef987c1597d097852df379407ef19fa8f GIT binary patch literal 1886 zcmaJDV6r#qAMFRn|@^BP&1)tWyz z81X|!83+nJXg`dtV@fIr3cangw2f6;Q(`^pA696$F_;Ll;)l(#cAI#Q4u0?b zp67j@=l%WOyWcsc)dfu+E3{XPPfyG~2m!EZ7PvGAmb3+|X{(>jvVJbh`7K$C-kTikPbSc=^XQyOP;+jbgl5{@!CgmL&-=+Fw zVgF!!Q8JmuhSjhU79Y(A`yTjLLq-`qk(cYUBipWnx7wA#o|5VnF4@cF z`hC4@E^-}snjZDhY`-tEQM$5T>iSnHrm+;WSlYWKH|pzUa`b*T47Z@+5E@p{@CTJ` zL`nl0lceEEy=fqccAW!KoAsI7+D&eiOp2uHvw8pLa8X*fH$pZ9Kg%%vzQxpH zYA`;K67Qq&d;Z1bVsaoUUPSAk6pi1-$7s`AjAMGpi0O)PQjg+YMvSm7dqFl-RD?P$ zy1EcG?|)p`W*LeYO0^3sqqs&d!QP)0UD1P-MD=KK-btKy1m|g3)w+3}g7b8AE-n~B zI)jGjUA$9NGyGgme2NSIGy<{1IWZPQ$cS)Ggw%&QNI7z`6FD(Z(j060XSxixAQyW# zC+u#M9g%~B`vxS4Qi7L8%M zY_bDRtYL&Z7-_6V{wfeOqOok3eZ4@SI~b|98m6mEwd3kgZL0lE={#sIsFSvX#&kI~ zOM+3I35&)eCkYlg(F8srsAZ~yO;lhDzC84N)h@jOng?5VgNDsDnu~F2Z1^URT3k$m z!4m~0!LHXjyX=}rt6&ly*@*|1p<+*Qlze543f(U`ic`=P9U<$W3IDIk#iIs?T1Hjb z>5HloRNH1%8e4-ZoZ%<`RfV-qys^Jk31tZZRnbvY72fYNRd{(g;`p|sRg5o=qXMpS zCgRI%umE{}Yl88!xZ%Yws^N$Av*Bg;@v0a=V5K}TazJ_&cD?A>U9%UbQ{0oN9gLRC{OZnOzQSj`8@zKrWE3lQ@u9*G{Z8`)&x`U-EQaEUqsIl%E%T z+uhxBZn{=^P*(S(fRef&3Y4!Dxz)WBN_<=0fl{0d%}kRAnA3=Jh+)K4#A_AM(*e+P z2B5!hi>)WhLeCe7Ul98^=sAEuDg6p3^t^}f(_BgarySd3VEzi?8sY|G3^9SYgSd;B zMwp0M!~)_0;vwQ&#P^6F5KD+<#AC!yIQv)54bx-eQ~85@37GS9A)bZtv4X_gV0vq71?PI=4Pj6j*xSdjn5Qjf@GM|LjGPYxmrvX KCdYyVuklY)uc+Gq literal 0 HcmV?d00001 diff --git a/src/rel/apple/DGRTEST#FE1000 b/src/rel/apple/DGRTEST#FE1000 new file mode 100644 index 0000000000000000000000000000000000000000..566baadceb11bfe29214d410b1c4e884a7f56983 GIT binary patch literal 513 zcmZ9Gy-EW?6ot=BTsFH|*GXk(VG(3360F2p(-=(*K}Ezu)Q@Y8%-JJ3tPz0AdGE#d@8djXx#VS zPxyvRPGwx}d4rF6+^KU4Oun1g_{{qWIX^pIFyWgbFnz{v zDQl@pO<SmO;)??|c-;voiQGDA5mr52do zC^Mklxo`#>dl+L{D5*b1xq(a^>>jW7gqvQh_Clky}s(?35?~oZXPjc)pv7e_ek`+=SYvc=A zCx(0@-$|ML;LHYhZPNcFTM9TiKYP!INI9C2Hmhmzp|)46oJ>mqe3<)(r}d2VTYJ2B Mk&zIZFIB?8BSkNlyZ`_I literal 0 HcmV?d00001 diff --git a/src/rel/apple/FATGET#FE1000 b/src/rel/apple/FATGET#FE1000 new file mode 100644 index 0000000000000000000000000000000000000000..f528da56f7de58053895761579698f573bce50cc GIT binary patch literal 1506 zcmZ`(?@L=(7=ClkG2R3Dx(`+8H3q{no*&c7AvH~Mbub|sOB+Ec7&<0m{q4npHH2}kiOp}kb%gC z$Az^nkz*r4lp=Oy$xxx8PHKZ}uvv9(G}T0tcz!!d+7a6jDi%y@s2D3nG;6_45Ew|f zP;hFtl8pvC1A_-woEgQo)<&PhE(}Ixq1gbju~d|Bl*5x@(l|7R&vj8IAEvQXH))~6 z%n#LJQO06?&mV>0u=M>SEwaXRObn2zjI%B1lQ+`+lz28>D49;a@b3JAsf&(dE<4MG z;#yy8W0-44*_dXzC}oz~QX^!y5+GGlz7&xa62lu~;Y$`K1=Hf z>tt=gCn!17uX+uYIk}^8_R%#q` zHG27X`?psx4qkq%j(37vKW%I(M|CuP=O`D)nkKQ|XZ}0;r8lj{{C-WpAf6{nZLExf zje)&!LFO*V+0+!_=r?8mdD;K6v<`h1a-zu`9v<;m1`TiJn+xY9wx- zupTcCoMysPOt`Nw@`hQ=8;53rUje_$dfhVkHE6;I$zgp6y;Nva(i2eco19>_C literal 0 HcmV?d00001 diff --git a/src/rel/apple/FATPUT#FE1000 b/src/rel/apple/FATPUT#FE1000 new file mode 100644 index 0000000000000000000000000000000000000000..52fa9dc8b6b285d47244ab98904e293a8de3c372 GIT binary patch literal 1131 zcmZ`(O=}xR7=HKN(MFMFdt@A(6eU?D5X`2iA{0VJ9bDq%kchR26=5r($gn$3guOCy zDu{3T2}64+^wL{SDHIAl#VF3&709iz+tNUxv{1;YkZUNo&+dkPKqKbS`~C5Z#N>T3< z>@i9aeq*d*E~Z%VKlS2uy@=|CClswK%617kNt6FcXrvaWSkZL4C8+KO7}yL%U^zzl z1dSopD0~N0;zSLyL5?#wVudH=tWxeCIO{px$ z$q+=>s#+l0wW6I{C#fD-G*@{mUXPyYsLx`uBPxidq?}uV&oqRGdtRwAcM0 zBBJiE`sIJqDdy%8iv6}9agL++K(#Crwj=nFuC^wqUb#qKMhPs`8jDy|#$pb&ja*>4 zjQ!nTk6M#dFIBPT)PLt*|Dcx4Mo$&}eQ>-?D~oIuaVt?{B=K(AvSrI=ZYfm?>DmmxjF(jOZIJv2u3AFyA- z|H{bgQ!MlupuncS3|Z#Wy%{Dw3;QM)^b+TL3ibx{PZ0kU_zbbnIjMz;u zeZ|!K8rTA!0wFL!-4OXdvgkdB{xkGn*zEm=*zdp#_%f!@qozswKYV{xawLYXjLiip zXg7q{qHn_fet$UpZo5Am?7DI^b{vGmuzz?>j?-Sax4pk4Cn$L;WS;iJgIn@6;nCO` W930l<*+~61{HZ2wieC{~Ao>f~Ssls% literal 0 HcmV?d00001 diff --git a/src/rel/apple/FATREADDSK#FE1000 b/src/rel/apple/FATREADDSK#FE1000 new file mode 100644 index 0000000000000000000000000000000000000000..55178ae441cb75ffd7e205d0ece025294fd4bc95 GIT binary patch literal 1503 zcmZ`(Ur1Y582|3MH#gBma~kTjqVq(e*t>8Sbwejb?Tm%uB?gmP%~pvs_nO$4D@hu) zW3W7|FJprPg>4TV3 z|IXzOD8vL9p(@<*?jG%(JdExiRx5|I<>Q0s$=-fB2I7|hXl-#n*WBcCst!dak_Q%K z$pTI3(mZFiAjuHz)sWEyNuoJPfg}m?@c4hv;&PpjQTP-@G%^<_@o#&w7Y`i-GK%II z^?}(S`F*t$AVIa7mcm37QjwA=?^gmqvdB z&4o3M6r>nz`9Y_1=5jKfU1e`(?3L^JF@~{LYn?zf=jepkgQZ$jYr;*mT9k;fj6Tr4 zg2sLa&~Tv`H_{v&PFIII9+7tG>H8*VN;eXcAHu*Y%^A-*=Cfl883j|el?da zm@K`%ylOHloiQ7!#C(m80T)cg9tZ?eermh|y6efdG0j@9NT$2-YVCCv%B71YLkC7` z&Ms|Gyql5pp!Y^MOf$&}X1>5Sab047!Iy_;Sixq|5L;Q!B}E!%%ay!1LLCziB}f7_ zZFaI@wAQW2q~B-*P1@?Cx*EyZq1mV?;>AYM<3y7U>%$^jJF|01GpDmDJBt->m=kPZ z@ul$j*d{eRq5yW8>Z38wnP6lI^#1z05Q@$`xk@pSm9aNAwi|CqQcNeVRS#Ur<7JPr z7cX6m%}rkn3DSjUnD`Qmv)2a$LxI>eL4Y^N2nDiMlK$fIpJt(q9sk z{z1KqD7=q!^AO6*2!qJ{8X-J^a)tQ#E%d#I_yFw>iHCnedibY=l|Ca-`W*2E;!DI= z1o$`T{~q-p5qpRl;t#~1c=j(*N|Fp*krm!1E2R$9eKO%QXkSG;j`p(LR$4`AqkIeH zE%d*S@?(@=%TW3Ov4bch_R#+~a{Y<|wFmd7C=sF>rm~PxTK8V24mhabp$b1$%C&N} zdT+N}Jv<20mb&A(QmvFvrl|*xDo4AuMe2q7_a4-0l{wl5jn6aff?DNxj&=insP_+# VPhzx3s6SVJjZp^mFE{l8{09*eg315@ literal 0 HcmV?d00001 diff --git a/src/rel/apple/FATWRITEDSK#FE1000 b/src/rel/apple/FATWRITEDSK#FE1000 new file mode 100644 index 0000000000000000000000000000000000000000..204e2e69e1e2d673effbf39fe02759ce8033d040 GIT binary patch literal 1507 zcmZ`(U1(cX9RJ^QZ<5>EHfM2NZE5LgZA*6-ujwjmmeEy~4aZ^{nyg>b(%RhH@1!JI z*A9lugD-oLBfg0b3W755K@gncBzEZsv@Y}m6nqh1d{sojm-;(NrM`H%zxzMG|M`EP z!wnkDA-cf5^kHCq_sRZ`@r~`B;`U%+Z!^CCWTTKE^-L1g)z&;yU1j>b9z$oEpGI}f zCCg~G{HLuDTV&SD;YbxFndM_SmSph5_W$mU>t%mf;ms*)c#aL=vo_FUxb81XPS-9wHDHeSG8^3)wyaXSYs$jA#`qcg@6moKoEK zT^vwDa!r?8RTxv9%h`Mr(xUQbRS-uc=dugJ$z;-*KGA^?v#9$5#{#{_zBvlTTF5># zS+|tyHBiy+~r(&;KbX9rR;L{#COLoIm6-P{GoT+ko?qYg*d96~On#OU|#-q?l z)6mVIrr}U5NOohzKfUavRCgx{`&6pq2<4Hg0|?Q000Qq_!RG~^jI?SHciR>Dk2Xl) zHIvr){%W#Hs~tSnNLHdB?P2b@{u;tex$2ftXtsk#ddW8b9WcVox2s@wwaBGKI5W56 z2vFErzGkaO-OkuKvOD6-j*}EQCz})KKB>y@d8zjX?nHV?#KU5GDw9-Ue6=^TY7=V& zK0nDOv9bmSDx|K=VgntKdR&mzPHuZ+nRIwCuF?chC^SA$(QEgrXbmErNje!@TuG-e z@!QU2(LMHJ^lah|kN8yr)H&P96aG`7*aX>~l_L+wZye7SEmh8_at)HIJ$0=13pcYk z>^^bs+AE2Xq3emO%IDIFqq+tC;#N=ad@%8b@}Sq*1y1Y^fUCy}fd3T95n?h6+#^HY zC$D^)^!!62`G^AYXKIs8TCKdK8S=8G%L%PbE@~`)UnBV`bf0OS{8v~XYR&RD@ISPc z{9oXI!?u+fvYWNYS0P^mVoaA)jL9VA3~Q4QpnC^+7yNzZmmjfK`7smuPZ;GN0-pn4 z0ADhaUqk;G>jJO^900!pzhjT-M&6^7G<8EZVBLiE^E#7*;J3ghz#Y9lzW|wqd<*gc z^b+y|$VWQmzXiSnioh21f5NxhFsO8RaD_7^cA{KYGS17|>)b<|MQnO$t5_%%c6Oew z7k0KcqrA4P*emW73;S2OpLUD8>!mRspo6D}rBZQ-*Hh&e&6}xI+#BL8grD`s_TGMi Tx2om$#UBz}Q2Fo8+lc-F7FmQP literal 0 HcmV?d00001 diff --git a/src/rel/apple/FILEIO#FE1000 b/src/rel/apple/FILEIO#FE1000 new file mode 100644 index 0000000000000000000000000000000000000000..a9d3b1acec61f69c7b4639b1f37a351b38e16ef2 GIT binary patch literal 1915 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 literal 0 HcmV?d00001 diff --git a/src/rel/apple/PLASMA16.SYSTEM#FF2000 b/src/rel/apple/PLASMA16.SYSTEM#FF2000 new file mode 100644 index 0000000000000000000000000000000000000000..c7bbe55e1eda8c53917652e9fa21b6e513e04fc9 GIT binary patch literal 2620 zcmds2ZA=qq9KY)oMTF$R&4ut`d)N!=M(|*pY34r6AX(A!uGv_Yh%v;A*@w!+6SHLJ z;7B!th)M!u%Q`BiB{Wh9(~fLyiqivMcG&9`*ghya!(_@?z-hpB|GO)Q*-Y3zu4(?y z|Lys|{GR`FPs(gpv7PX)#Y+4N4&Qksh*NIDkM6pW9}~WcG;A~y>TkoFIVL)Ly}D#= zz&SCAp=gcvC?c-kMvMnVCtX=uY=tMm{m#y~cMr z*{8hLndS3l`_@ej^eAyQG)<>^U-z|S`xHtLXWYnFpYC%f`|8*Du4MT#YW(nbCGi$l z8lP_`Y71NJR-Y%}K`4BynC+h(xI_d?I`x{Au`s92b5${7!gPI6J&MToT?B zJ{9(czYRAGpBqjX`B|zC9S&U$T@O7gzaqED9r6eA9(liPlh4Ql@~Au^$1{BOft1+* zW>Wb`UDbDW2iwHD`*y-|k619-$sW?iN0Svyah2s+<+%jg(K&6~tNqkb>IP*>XKmut$$jPcY_OfJp_n6E zx{4qxh#*|!x^h4m!>6ixi_N_|&AmnD-g0vQgZUbF)TkvOk8EjYV?3q0GEL=7QxVg& zlW8grVAu~;sy%4kkg2itt=I}NG>&;m_h6{lniE?)lz0c3FeuLHZXL=>2RT4+dj`da zx<*;m?#;2_PApAnZ$N29<@69iDf6Inq-RReJAqC|`{3p52f%ZFi5n+0H- zO%)M7V(yMO7ligop8e6UwI49Ivt}-1-Y0+| zjj4j=0uT#W=sBgLlCLz6VNay7(&mqfe}F{;tItj}kKrCNfNRKB$P020AQ5AmA*61F zYztaY_K*vT<`lJTdsLujwEj{mtXhkGo`}<9RU1}=3A*^0S9`ERkS84GmAacJ!n06Z zHygkjKmZiacC(Lpy*$+pfgYwM!|78&b2>=PXWl~X|eB zq?oiYOCU_a^y+g4Gi+T(-%zfj-|5@RI2vJ8jgcNgztE%TqAsC+`U<*4f3Hc)=z!u! z9{RN6MrRpuwV)TF&z1I;G2(=JT*6-U#7KCbAir`)l+`kBDL=(xUZ6+mek8|YdX+P1 zkQS8l=(K*+jCS7IZq5jR32;i<447s&=0!~v2e+uS%Gq(VN?EDj&heX7;*1m-?Q5?# zuf_ZIH}zm`6$8&HKUK%VdwY&m68i@A8-J4(XVk}7dxQU5BA9{2xnMq)kPhB#4Hd}> z1wm)}-7%?mhqsPl&?wI&IN|G5WNWncmX8A!r|PN#*iHeKf;uT&ytdRE{5-oD4Hb+e g=OQ%v0{Engo0YF*c&lkvt+pJheiFpLZ`1t#0uJ(rRR910 literal 0 HcmV?d00001 diff --git a/src/rel/apple/PLAYSEQ#FE1000 b/src/rel/apple/PLAYSEQ#FE1000 new file mode 100644 index 0000000000000000000000000000000000000000..632054af4bad4d69804ee415c139a09074258c6d GIT binary patch literal 324 zcmXAkF-yZ>5Qbku29YSYIkjmiNkOnG2yTLdE)Cj{PzVH3utlS!APV9jWOXQfKPj|n z4K_6-spzlKi#fjg?s=b^ZVYJvXe42WCdoAavBGR_&EiEApXbYI9+@cX2D0)D*|hf)Eb?KNF1_oe7)q9L_FOam8*3Ex6^F0U4#y473alg PkMxS?QSlKu)CT?l+&pbF literal 0 HcmV?d00001 diff --git a/src/rel/apple/PORTIO#FE1000 b/src/rel/apple/PORTIO#FE1000 new file mode 100644 index 0000000000000000000000000000000000000000..ba03b1e9337f336dd19d19a836a67a25d077c51f GIT binary patch literal 314 zcmXv|F;2rk5L_=Nv0R<3lPfD#s+9|iH-yd|6y_A63k1u*$Q$y3)M+T`?-Yl~k|D@g zLcE0(+?|tRq@CHB(Yyn`07PsA0K1R+`}Yo@KrfZ51iIoVX*CmANk!v?JYFpnjS@m$ zJt?|Q$mi9wB0r&k$8kI_d`ycWd4naI0HVxsb)7 luVdG{bIQ(-pRVa|gWP?Fd&%^tZjT4&+pv1y>W9EI{{ubPT!#Pv literal 0 HcmV?d00001 diff --git a/src/rel/apple/SDFAT#FE1000 b/src/rel/apple/SDFAT#FE1000 new file mode 100644 index 0000000000000000000000000000000000000000..1397f90c7777e08b8ddb59b7cb33e4b51421d650 GIT binary patch literal 801 zcmZ|N&ubGw6bJCPFB4i~(KiQcEV4;#5gAGeQba_gXzHN^4;myc0ee{Y(jY}@FA5Su zDWQ}wV5uMh52E0I(KZo!FqXt0*rSJ@J$VxJJ82>ok?_fT^W8VI8?tXazE3nONowew z_s#Ct+ugn0y$_uNvIVJ1P3p2Co6?qjIS{22dQMmMieA+mZDnU+*U{n4^Azh?4rLKZ4_ z3myqo?-nZJ#ZU!tY%`;nZ%FSzb865lJj9<{pLBbo-ov2_lu4qLikRU^;#_`+P?p)8 z?wuVwGHr&(upWKDl*=dZBM*;>I8guWA6ztUM>hP=If0_m-ybvXrU9urKInN?h!>y= zHK@Y|Y(g9M;Q*8-PQV;gVFgy925Ybmb+CYcjvGRiBvEAy&VUbTI13YS4$gytNtl8x zT!3k~2$$e8T!E`F1J{V`P4ew6O4)mqv5zQiA7lL#>({7nQMV~m`Hb0bnEj6HKal?f z@=|ul^Q{jPU|genZe?&U}y8)R$(|P^c$kJw7CEP literal 0 HcmV?d00001 diff --git a/src/rel/apple/SNDSEQ#FE1000 b/src/rel/apple/SNDSEQ#FE1000 new file mode 100644 index 0000000000000000000000000000000000000000..d7fc4acde576a2d3eb5f1af17761569b0d24e9ad GIT binary patch literal 4084 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 P(75c>4{oj;p%TDfbE*4d literal 0 HcmV?d00001 diff --git a/src/rel/apple/SOS.INTERP#050000 b/src/rel/apple/SOS.INTERP#050000 new file mode 100644 index 0000000000000000000000000000000000000000..33291d985020e8caec34b7064c4527066e5980a0 GIT binary patch literal 6107 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 literal 0 HcmV?d00001 diff --git a/src/samplesrc/examples/ex.1.pla b/src/samplesrc/examples/ex.1.pla new file mode 100644 index 0000000..a92a665 --- /dev/null +++ b/src/samplesrc/examples/ex.1.pla @@ -0,0 +1,14 @@ +// +// THE SIMPLE "HELLO, WORLD." PROGRAM! +// +// THIS IS A COMMENT, EVEYTHING IS +// IGNORED FOR THE REST OF THE LINE +// FOLLOWING "//" +// +// TO RUN, PRESS 'ESC', THEN "X" FROM +// COMMAND MODE. PRESS ANY KEY ONCE IT +// HAS SUCCESSFULLY COMPILED AND TOLD +// YOU HOW BIG THE RESULTANT PROGRAM IS. +// + +PUTS("HELLO, WORLD.") diff --git a/src/samplesrc/examples/ex.10.pla b/src/samplesrc/examples/ex.10.pla new file mode 100644 index 0000000..4d19745 --- /dev/null +++ b/src/samplesrc/examples/ex.10.pla @@ -0,0 +1,292 @@ +// RADAR SCOPE +// +// HERE IS ANOTHER LO-RES DEMO WITH +// A LITTLE MORE ON THE ALGORITHMIC +// SIDE OF THINGS. ON A IIGS, YOU WILL +// NEED TO ENABLE THE ALTERNATE DISPLAY +// OPTION IN THE CONTROL PANEL (ROM 01 +// ONLY). THIS PROGRAM COPIES THE PAGE1 +// LORES GRAPHICS TO THE PAGE2 FOR A +// FLICKER-FREE DISPLAY. +// +// NOTICE HOW SOME OF THE FUNCTIONS +// RETURN A VALUE THAT ISN'T USED. THIS +// IS CALLED "CASCADING THE RETURN". +// IN PLASMA, ALL FUNCTION DEFINITIONS +// RETURN A VALUE, EVEN IF IT ISN'T +// EXPLICITY SHOWN. A VALUE OF ZERO +// WILL BE SILENTLY ADDED IF NONE IS +// SPECIFIED. BY RETURNING A VALUE OF +// A FUNCTION OR SOFTSWITCH REFERENCE AT +// THE END OF THE DEFINTION IS A SLIGHT +// OPTIMIZATION IN THAT PLASMA WILL +// JUST PASS THE LAST VALUE BACK TO THE +// CALLER, WITHOUT DROPPING THE VALUE +// ON THE STACK AND PUSHING A ZERO BACK +// ON. +// + +CONST SHOWGR = $C050 +CONST SHOWFULL = $C052 +CONST SHOWPG1 = $C054 +CONST SHOWPG2 = $C055 +CONST SHOWLORES = $C056 +CONST RADIUS = 19 +CONST XORG = 19 +CONST YORG = 23 + +BYTE[RADIUS] OCTANT +BYTE NUMPOINTS + +DEF TEXTMODE + ^SHOWPG1 + RETURN CALL($FB39, 0, 0, 0, 0) +END + +DEF CPYBUF + RETURN MEMCPY($0800, $0400, 1024) +END + +DEF GRMODE + CALL($F832, 0, 0, 0, 0) + ^SHOWGR + ^SHOWFULL + CPYBUF + ^SHOWPG2 + RETURN ^SHOWLORES +END + +DEF COLOR(CLR) + RETURN CALL($F864, CLR, 0, 0, 0) +END + +DEF HLIN(LEFT, RIGHT, VERT) + ^$2C = RIGHT + RETURN CALL($F819, VERT, 0, LEFT, 0) +END + +DEF VLIN(TOP, BOTTOM, HORZ) + ^$2D = BOTTOM + RETURN CALL($F828, TOP, 0, HORZ, 0) +END + +// +// MODIFIED BRESENHAM TO DRAW SYMETRICAL +// SPANS FROM BOTH ENDS (DOUBLE SPEED) +// +DEF LINE(X1, Y1, X2, Y2) + BYTE DX, DY, DX2, DY2, PP, S + 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 + DY = (DY + 1) >> 1 + SX = 1 + WHILE DY + IF ERR < 0 + // + // DRAW TOP AND BOTTOM SPANS AT + // SAME TIME + // + IF Y2 - Y1 == SY + // + // THIS FIXES ANY OFF-BY-ONE + // PIXELS ON LAST REMAINING + // ADJACENT SPANS + // + HLIN(X1, X1 + SX - 1, Y1) + HLIN(X1 + SX, X2, Y2) + ELSE + HLIN(X1, X1 + SX - 1, Y1) + HLIN(X2 - SX + 1, X2, Y2) + FIN + X1 = X1 + SX + X2 = X2 - SX + Y1 = Y1 + SY + Y2 = Y2 - SY + DY = DY - 1 + SX = 1 + ERR = ERR + DD2 + ELSE + SX = SX + 1 + ERR = ERR - DY2 + FIN + LOOP + IF Y2 == Y1 + HLIN(X1, X2, Y2) + 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 + DX = (DX + 1) >> 1 + SY = 1 + WHILE DX + IF ERR < 0 + // + // DRAW RIGHT AND LEFT SPANS + // AT THE SAME TIME + // + IF X2 - X1 == SX + // + // THIS FIXES ANY OFF-BY-ONE + // PIXELS ON LAST REMAINING + // ADJACENT SPANS + // + VLIN(Y1, Y1 + SY - 1, X1) + VLIN(Y1 + SY, Y2, X2) + ELSE + VLIN(Y1, Y1 + SY - 1, X1) + VLIN(Y2 - SY + 1, Y2, X2) + FIN + X1 = X1 + SX + X2 = X2 - SX + Y1 = Y1 + SY + Y2 = Y2 - SY + DX = DX - 1 + SY = 1 + ERR = ERR + DD2 + ELSE + SY = SY + 1 + ERR = ERR - DX2 + FIN + LOOP + IF X2 == X1 + VLIN(Y1, Y2, X2) + FIN + FIN +END + +DEF RADAR(C) + BYTE I + + FOR I = 1 TO NUMPOINTS + COLOR(C) + LINE(XORG, YORG, XORG + I, YORG - OCTANT[I]) + CPYBUF + COLOR(0) + LINE(XORG, YORG, XORG + I, YORG - OCTANT[I]) + NEXT + FOR I = NUMPOINTS - 1 DOWNTO 0 + COLOR(C) + LINE(XORG, YORG, XORG + OCTANT[I], YORG - I) + CPYBUF + COLOR(0) + LINE(XORG, YORG, XORG + OCTANT[I], YORG - I) + NEXT + FOR I = 1 TO NUMPOINTS + COLOR(C) + LINE(XORG, YORG, XORG + OCTANT[I], YORG + I) + CPYBUF + COLOR(0) + LINE(XORG, YORG, XORG + OCTANT[I], YORG + I) + NEXT + FOR I = NUMPOINTS - 1 DOWNTO 0 + COLOR(C) + LINE(XORG, YORG, XORG + I, YORG + OCTANT[I]) + CPYBUF + COLOR(0) + LINE(XORG, YORG, XORG + I, YORG + OCTANT[I]) + NEXT + FOR I = 1 TO NUMPOINTS + COLOR(C) + LINE(XORG, YORG, XORG - I, YORG + OCTANT[I]) + CPYBUF + COLOR(0) + LINE(XORG, YORG, XORG - I, YORG + OCTANT[I]) + NEXT + FOR I = NUMPOINTS - 1 DOWNTO 0 + COLOR(C) + LINE(XORG, YORG, XORG - OCTANT[I], YORG + I) + CPYBUF + COLOR(0) + LINE(XORG, YORG, XORG - OCTANT[I], YORG + I) + NEXT + FOR I = 1 TO NUMPOINTS + COLOR(C) + LINE(XORG, YORG, XORG - OCTANT[I], YORG - I) + CPYBUF + COLOR(0) + LINE(XORG, YORG, XORG - OCTANT[I], YORG - I) + NEXT + FOR I = NUMPOINTS - 1 DOWNTO 0 + COLOR(C) + LINE(XORG, YORG, XORG - I, YORG - OCTANT[I]) + CPYBUF + COLOR(0) + LINE(XORG, YORG, XORG - I, YORG - OCTANT[I]) + NEXT +END + +// +// USE BRESENHAM CIRCLE ALG TO CALC +// FIRST OCTANT +// +DEF CIRCALC + BYTE X, Y + WORD ERR + + X = 0 + Y = RADIUS + ERR = 3 - (RADIUS << 1) + WHILE X <= Y + IF ERR <= 0 + ERR = ERR + (X << 2) + 6 + ELSE + ERR = ERR + ((X - Y) << 2) + 10 + Y = Y - 1 + FIN + OCTANT[X] = Y + X = X + 1 + LOOP + NUMPOINTS = X - 1 +END + +CIRCALC +GRMODE +REPEAT + RADAR(15) +UNTIL ^$C000 > 127 +^$C010 +TEXTMODE +DONE diff --git a/src/samplesrc/examples/ex.11.pla b/src/samplesrc/examples/ex.11.pla new file mode 100644 index 0000000..fbf2637 --- /dev/null +++ b/src/samplesrc/examples/ex.11.pla @@ -0,0 +1,245 @@ +CONST FALSE = 0 +CONST TRUE = 1 +// +// HERE IS AN INTERACTIVE EXAMPLE. +// +// SET AUTOPLAY TO FALSE TO USE THE +// PADDLE CONTROL AND PLAY YOURSELF. +// + +BYTE AUTOPLAY = TRUE + +// +// THE BUILT-IN FUNCTION CALL() +// RETURNS A STRUCTURE THAT CAN BE +// USED TO READ THE REGISTER RESULTS. +// CHECK OUT THE PADDLE() FUNCTION. +// +STRUC S_CALL + BYTE AREG + BYTE XREG + BYTE YREG + BYTE FLAGS +END + +CONST SHOWLORES = $C056 +CONST KEYBOARD = $C000 +CONST KEYSTROBE = $C010 +CONST SPEAKER = $C030 +BYTE PDLPOS, PDLSIZE, PDLMID, MISS +BYTE XSCRN, YSCRN +BYTE[3] SCORE +WORD XBALL, YBALL, XSPEED, YSPEED +PREDEF INCSCORE + +DEF BEEP(TONE, DURATION) + BYTE I, J + + FOR J = DURATION DOWNTO 0 + FOR I = TONE DOWNTO 0 + NEXT + ^SPEAKER + NEXT +END + +DEF KEYPRESSED + RETURN ^KEYBOARD > 127 +END + +DEF GETKEY + BYTE KEY + + REPEAT + KEY = ^KEYBOARD + UNTIL KEY > 127 + ^KEYSTROBE + RETURN KEY +END + +DEF TEXTMODE + CALL($FB39, 0, 0, 0, 0) + RETURN HOME +END + +DEF PUTSXY(X, Y, STRPTR) + GOTOXY(X, Y) + RETURN PUTS(STRPTR) +END + +DEF GRMODE + CALL($FB40, 0, 0, 0, 0) + ^SHOWLORES + RETURN HOME +END + +DEF COLOR(CLR) + RETURN CALL($F864, CLR, 0, 0, 0) +END + +DEF PLOT(X, Y) + RETURN CALL($F800, Y, 0, X, 0) +END + +DEF HLIN(LEFT, RIGHT, VERT) + ^($2C) = RIGHT + RETURN CALL($F819, VERT, 0, LEFT, 0) +END + +DEF VLIN(TOP, BOTTOM, HORZ) + ^($2D) = BOTTOM + RETURN CALL($F828, TOP, 0, HORZ, 0) +END + +DEF PADDLE(NUM) + RETURN CALL($FB1E, 0, NUM, 0, 0)->YREG +END + +DEF BUTTON(NUM) + RETURN ^($C060 + NUM) > 127 +END + +DEF UPDTPDL + IF AUTOPLAY + IF PDLPOS + PDLMID > XSCRN + IF PDLPOS > 0 + PDLPOS = PDLPOS - 1 + FIN + ELSIF PDLPOS + PDLMID + 1 < XSCRN + IF PDLPOS + PDLSIZE < 39 + PDLPOS = PDLPOS + 1 + FIN + FIN + ELSE + PDLPOS = PADDLE(0) / 5 + FIN + IF PDLPOS + PDLSIZE > 39 + PDLPOS = 39 - PDLSIZE + FIN + IF PDLPOS + COLOR(0) + HLIN(0, PDLPOS - 1, 39) + FIN + COLOR(1) + HLIN(PDLPOS, PDLPOS + PDLSIZE, 39) + IF PDLPOS + PDLSIZE < 38 + COLOR(0) + HLIN(PDLPOS + PDLSIZE + 1, 39, 39) + FIN +END + +DEF UPDTBALL + BYTE XNEW, YNEW + + // + // UPDATE HORIZONTAL POSITION + // + XBALL = XBALL + XSPEED + IF XBALL > 623 + XBALL = 623 + XSPEED = -XSPEED + BEEP(4, 10) + ELSIF XBALL < 16 + XBALL = 16 + XSPEED = -XSPEED + BEEP(4, 10) + FIN + XNEW = XBALL >> 4 + // + // UPDATE VERTICAL POSITION + // + YBALL = YBALL + YSPEED + IF YBALL > 623 + // + // CHECK FOR PADDLE HIT + // + IF XNEW >= PDLPOS AND XNEW <= PDLPOS + PDLSIZE + YBALL = 623 + YSPEED = -YSPEED - 2 + XSPEED = XSPEED + (XNEW - (PDLPOS + PDLMID - 1)) + IF XSPEED == 0 + IF PDLPOS + PDLMID > 19 + XSPEED = 1 + ELSE + XSPEED = -1 + FIN + FIN + INCSCORE + BEEP(4, 10) + ELSE + MISS = 1 + BEEP(14, 40) + FIN + ELSIF YBALL < 16 + YBALL = 16 + YSPEED = -YSPEED + BEEP(4, 10) + FIN + YNEW = YBALL >> 4 + // + // UPDATE ON-SCREEN BALL + // + IF XNEW <> XSCRN OR YNEW <> YSCRN + COLOR(8) + PLOT(XNEW, YNEW) + COLOR(0) + PLOT(XSCRN, YSCRN) + XSCRN = XNEW + YSCRN = YNEW + FIN +END + +DEF PUTSCORE + PUTC(SCORE[2]) + PUTC(SCORE[1]) + PUTC(SCORE[0]) +END + +DEF INCSCORE + SCORE[0] = SCORE[0] + 1 + IF SCORE[0] > '9' + SCORE[0] = '0' + SCORE[1] = SCORE[1] + 1 + IF SCORE[1] > '9' + SCORE[1] = '0' + SCORE[2] = SCORE[2] + 1 + FIN + FIN + GOTOXY(17, 2) + PUTSCORE +END + +DEF INITSCORE + SCORE[0] = '0' + SCORE[1] = '0' + SCORE[2] = '0' + GOTOXY(17, 2) + PUTSCORE +END + +PUTS("1=HARD 2=MED 3=EASY ?") +PDLSIZE = (GETKEY - $B0) * 3 +PDLMID = PDLSIZE >> 1 +GRMODE +COLOR(15) +HLIN(0, 39, 0) +VLIN(1, 38, 0) +VLIN(1, 38, 39) +XBALL = PADDLE(0) + 16 +YBALL = PADDLE(1) + 16 +XSCRN = XBALL >> 4 +YSCRN = YBALL >> 4 +XSPEED = 1 +YSPEED = 1 +MISS = 0 +INITSCORE +REPEAT + UPDTPDL + UPDTBALL +UNTIL KEYPRESSED OR MISS +TEXTMODE +HOME +PUTS("YOUR SCORE WAS ") +PUTSCORE +PUTC($0D) +PUTS("THAT'S ALL FOLKS!") +DONE diff --git a/src/samplesrc/examples/ex.12.pla b/src/samplesrc/examples/ex.12.pla new file mode 100644 index 0000000..59c6bba --- /dev/null +++ b/src/samplesrc/examples/ex.12.pla @@ -0,0 +1,189 @@ +// +// This is a simple combat simulator +// +// Many of the different structure, +// address, an pointer operations are +// demonstrated. A few of the many +// flow control constructs are shown, +// including loops, tests, and function +// calls. +// +// A note about in-line strings. When a +// string is encountered in-line, space +// is allocated on the fly for the string +// in memory. PLASMA doesn't have garbage +// collection, so that memory adds up +// until the function exits (or the +// proram ends in the main function). +// If you use strings inside a loop, you +// may overflow memory. Try moving the +// string outside the loop, or into +// initialized memory. +// +const rndnum = $4E // ZP location of RND +const rndl = $4E +const rndh = $4F + +struc t_player + byte name[32] + word morality + byte health + byte stamina + byte strength + byte skill +end + +byte[32] player = "Player" +word = 0 // morality +byte = 0 // health +byte = 10 // stamina +byte = 50 // strength +byte = 20 // skill + +struc t_actor + byte kind + byte life + byte power + word ethics + word next_actor +end + +byte preacher = "Preacher", 200 +byte zombie = "Zombie", 0 +byte cowboy = "Cowboy", 129 +byte clerk = "Clerk", 128 +byte merchant = "Merchant", 192 +byte rustler = "Rustler", 60 +byte traveler = "Traveler", 132 +byte rogue = "Rogue", 30 + +// +// Notice how the array is initialized +// with the addresses of prior records. +// +word actors = @preacher, @zombie, @cowboy +word = @clerk, @merchant, @rustler +word = @traveler, @rogue, 0 + +byte fightstr = "F)ight or R)un?" +byte whostr = "Whom do you want to fight (0=quit)?" +byte numactors +word choice + +def rnd + *rndnum = (*rndnum << 1) + *rndnum + 251 + return *rndnum & $7FFF +end + +// +// Apple //e and //c computers can input +// lower-case, so convert all input into +// upper-case for easier testing. +// +def toupper(c) + if c >= 'a' and c <= 'z' + c = c - ('a' - 'A') + fin + return c +end + +def putstats(other) + home() + gotoxy(0, 0) + puts(@player.name) + if player.health == 0 + puts(" Died!") + fin + gotoxy(1, 1) + puts("Morality:"); puti(player:morality) + gotoxy(1, 2) + puts("Skill :"); puti(player.skill) + gotoxy(1, 3) + puts("Stamina :"); puti(player.stamina) + gotoxy(1, 4) + puts("Strength:"); puti(player.strength) + gotoxy(1, 5) + puts("Health :"); puti(player.health) + + gotoxy(20, 0) + puts(actors[other->kind]) + if other->life == 0 + puts("Died!") + fin + gotoxy(21, 1) + puts("Ethics :"); puti(other=>ethics) + gotoxy(21, 2) + puts("Power :"); puti(other->power) + gotoxy(21, 3) + puts("Life :"); puti(other->life) +end + +def fight(who) + byte[t_actor] enemy + byte quit + word p_atck, e_atck + + enemy.kind = who + enemy:ethics = ^(actors[who] + ^(actors[who]) + 1) - 128 + enemy.power = 64 + (rnd & 191) + enemy.life = 128 + (rnd & 127) + + quit = 0 + repeat + putstats(@enemy) + gotoxy(12, 8); puts(@fightstr) + if toupper(getc()) == 'F' + p_atck = player.skill * player.strength / enemy.power + p_atck = p_atck + (rnd() & 15) + if enemy.life > p_atck + enemy.life = enemy.life - p_atck + else + player:morality = player:morality - enemy:ethics + enemy.life = 0 + p_atck = player.skill + enemy.power / 10 + if p_atck > 255 // Limit skill + p_atck = 255 + fin + player.skill = p_atck + quit = 1 + fin + e_atck = enemy.power / player.stamina + e_atck = e_atck + (rnd() & 15) + if player.health > e_atck + player.health = player.health - e_atck + else + player.health = 0 + quit = 1 + fin + else + quit = 1 + fin + until quit + putstats(@enemy) +end + +// +// This is the main loop. Know when to +// walk away, know when to run. +// +home() +repeat + player.health = 192 + (rnd & 63) + numactors = 0 + repeat + gotoxy(10, 10 + numactors) + puti(numactors + 1); putc(' ') + puts(actors[numactors]) + numactors = numactors + 1 + until not actors[numactors] + gotoxy(2, 11 + numactors) + puts(@whostr) + choice = getc() - '0' + if choice > 0 and choice <= numactors + fight(choice - 1) + elsif choice == 0 + player.health = 0 + fin +until player.health == 0 +gotoxy(0, 21); puts("That's all, folks!") +done diff --git a/src/samplesrc/examples/ex.13.pla b/src/samplesrc/examples/ex.13.pla new file mode 100644 index 0000000..9af1caa --- /dev/null +++ b/src/samplesrc/examples/ex.13.pla @@ -0,0 +1,59 @@ +// +// SIEVE OF ERATOSTHENESE +// +// PRIME NUMBER FINDER SHOWING OFF SOME +// OF PLASMA'S BIT MANIPULATION +// OPERATIONS. +// +// THE APPLE ][ CANNOT DISPLAY THE +// TWO SYMBOLS USED FOR BIT COMPLIMENT +// AND INCLUSIVE OR: THE TILDE AND THE +// BAR. SO ALIASES FOR THESE OPERATORS +// ARE: +// +// ~ : BITWISE COMPLIMENT (CTRL-Y) +// | : BITWISE INCLUSIVE OR (CTRL-B) +// +// ON THE APPLE ][, THESE SHOW UP AS AN +// INVERTED ^ AND AN INVERTED \. +// +// IN THIS EXAMPLE, AN ARRAY IS USED TO +// HOLD THE FLAGS USED TO IDENTIFY NON- +// PRIME VALUES. THIS IS MORE MEMORY +// EFFICIENT THAN USING A WHOLE BYTE FOR +// EACH FLAG, BUT REQUIRES BITWISE TESTS +// FOR ONE OF THE EIGHT FLAGS IN EACH +// BYTE. SHIFTING RIGHT IS A FAST WAY +// TO DIVIDE BY POWERS OF TWO: +// X >> 3 IS THE SAME AS X / 8 +// SHIFTING LEFT IS A FAST WAY TO +// MULTIPLY BY POWERS OF TWO: +// X << 2 IS THE SAME AS X * 4 +// + +CONST FALSE = 0 +CONST TRUE = NOT FALSE +CONST IMAX = 8192 +CONST IMAXM1 = IMAX-1 +CONST SIZEF = IMAX/8 +CONST CR = $0D + +BYTE[SIZEF] FLAGS +WORD PRIME, I, K, COUNT = 0 + +MEMSET(@FLAGS, 0, SIZEF) +FOR I = 0 TO IMAXM1 + IF NOT (FLAGS[I >> 3] & (1 << (I&7))) + PRIME = I + I + 3 + FOR K = PRIME + I TO IMAXM1 STEP PRIME + FLAGS[K >> 3] = FLAGS[K >> 3] | (1 << (K&7)) + NEXT + COUNT = COUNT + 1 + PUTI(PRIME) + PUTC(CR) + FIN +NEXT +PUTI(COUNT) +PUTS(" PRIMES BETWEEN 0 AND ") +PUTI(IMAX << 1) +DONE diff --git a/src/samplesrc/examples/ex.14.pla b/src/samplesrc/examples/ex.14.pla new file mode 100644 index 0000000..30db369 --- /dev/null +++ b/src/samplesrc/examples/ex.14.pla @@ -0,0 +1,111 @@ +// PRODOS +// +// I HOPE YOUR INTRODUCTION TO PLASMA +// HAS INSPIRED YOU TO PLAY AROUND WITH +// PROGRAMMING YOUR APPLE II. +// +// THIS NEXT EXAMPLE SHOWS HOW TO CALL +// PRODOS TO DISPLAY A CATALOG. YOU MAY +// WANT TO CONSULT THE PRODOS TECH REF +// TO UNDERSTAND ALL THE PARAMETERS AND +// STRUCTURE OFFSETS. +// + +BYTE PERR = 0 +BYTE[512] DATABUFF + +DEF GETPFX(PATH) + BYTE[3] PARAMS + + ^PATH = 0 + PARAMS.0 = 1 + PARAMS:1 = PATH + PERR = SYSCALL($C7, @PARAMS) + RETURN PATH +END + +DEF OPEN(PATH, IOBUFF) + BYTE[6] PARAMS + + PARAMS.0 = 3 + PARAMS:1 = PATH + PARAMS:3 = IOBUFF + PARAMS.5 = 0 + SYSCALL($C8, @PARAMS) + RETURN PARAMS.5 +END + +DEF READ(REFNUM, BUFF, LEN) + BYTE[8] PARAMS + + PARAMS.0 = 4 + PARAMS.1 = REFNUM + PARAMS:2 = BUFF + PARAMS:4 = LEN + PARAMS:6 = 0 + PERR = SYSCALL($CA, @PARAMS) + RETURN PARAMS:6 +END + +DEF CLOSE(REFNUM) + BYTE[2] PARAMS + + PARAMS.0 = 1 + PARAMS.1 = REFNUM + PERR = SYSCALL($CC, @PARAMS) + RETURN PERR +END + +DEF CATALOG + BYTE[64] PATH + BYTE REFNUM + BYTE FIRSTBLK + BYTE ENTRYLEN, ENTRIESBLK + BYTE I, TYPE, LEN + WORD ENTRY, FILECNT + + GETPFX(@PATH) + PUTS(@PATH) + PUTC($0D) + REFNUM = OPEN(@PATH, $0800) // SAFE IO BUFFER LOCATION + IF PERR; RETURN PERR; FIN + FIRSTBLK = 1 // FIRST BLOCK IS TREATED SPECIAL + REPEAT + IF READ(REFNUM, @DATABUFF, 512) == 512 + ENTRY = @DATABUFF.$04 + IF FIRSTBLK + ENTRYLEN = DATABUFF.$23 + ENTRIESBLK = DATABUFF.$24 + FILECNT = DATABUFF:$25 + ENTRY = ENTRY + ENTRYLEN + FIN + FOR I = FIRSTBLK TO ENTRIESBLK + TYPE = ^ENTRY + IF TYPE + LEN = TYPE & $0F + ^ENTRY = LEN + PUTS(ENTRY) + IF ENTRY->$10 == $D0 // IS IT A DIRECTORY? + PUTC('/') + LEN = LEN + 1 + ELSIF ENTRY->$10 == $FF // IS IT A SYSTEM FILE? + PUTC('*') + LEN = LEN + 1 + FIN + FOR LEN = 19 - LEN DOWNTO 0 + PUTC(' ') + NEXT + FILECNT = FILECNT - 1 + FIN + ENTRY = ENTRY + ENTRYLEN + NEXT + FIRSTBLK = 0 // DONE WITH FIRST BLOCK + ELSE + FILECNT = 0 + FIN + UNTIL FILECNT == 0 + RETURN CLOSE(REFNUM) +END + +CATALOG() +DONE diff --git a/src/samplesrc/examples/ex.15.pla b/src/samplesrc/examples/ex.15.pla new file mode 100644 index 0000000..09e5fd7 --- /dev/null +++ b/src/samplesrc/examples/ex.15.pla @@ -0,0 +1,30 @@ +// +// THIS EXAMPLE SHOWS HOW TO CALL +// MACHINE CODE INSIDE YOUR PLASMA +// CODE. THIS MACHINE CODE IS EMBEDDED +// INSIDE THE DATA AND MUST BE POSITION +// INDEPENDENT. FUNCTIONS ARE EXPECTED +// TO RETURN A VALUE ON THE PLASMA +// EVALUATION STACK, INDEXED BY THE +// X-REGISTER. IT MUST BE CONSISTENT: +// INX FOR EVERY ARGUMENT, DEX FOR THE +// RETURN VALUE. THE ACTUAL VALUES ARE +// LOCATED IN ZERO PAGE: +// +// $C0,X = EVAL STACK LO BYTE +// $D0,X = EVAL STACK HI BYTE +// +// IF THE RETURN VALUE IS TO BE IGNORED, +// YOU CAN SKIP THE ACTUAL SETTING OF THE +// EVAL STACK AND JUST UPDATE THE X-REG. +// +BYTE CLICK = $AD, $30, $C0 // LDA $C030 +BYTE = $CA // DEX +BYTE = $60 // RTS + +BYTE I + +FOR I=0 TO 200 + (@CLICK)() +NEXT +DONE diff --git a/src/samplesrc/examples/ex.16.pla b/src/samplesrc/examples/ex.16.pla new file mode 100644 index 0000000..f68c927 --- /dev/null +++ b/src/samplesrc/examples/ex.16.pla @@ -0,0 +1,159 @@ +// +// Check github for fully commented code +// +const MAX_FIBERS = 3 +const MAX_FIBER = MAX_FIBERS-1 +const FIBER_UNAVAIL = 0 +const FIBER_FREE = 1 +const FIBER_HALT = 2 +const FIBER_RUN = 3 +byte fbrState[MAX_FIBERS] +word fbrVMState[MAX_FIBERS] +byte fbrNext[MAX_FIBERS] = 0 +byte fbrRunning = 0 +struc t_vm + byte estklo[$10] + byte estkhi[$10] + byte esp + word ifp + word pp + byte hwsp + byte fill[9] + byte drop + byte nextop[$10] + byte frame[$40] + byte hwstk[$80] +end +word fbrPool[t_vm*MAX_FIBERS] + +byte fbrSwap = $B5 +byte = $C0,$85,$06,$B5,$D0,$85,$07,$E8 +byte = $B5,$C0,$85,$08,$B5,$D0,$85,$09 +byte = $86,$E0,$BA,$86,$E5,$A0,$26,$B9 +byte = $C0,$00,$91,$08,$B1,$06,$99,$C0 +byte = $00,$88,$10,$F3,$8A,$A8,$B9,$00 +byte = $01,$91,$08,$C8,$D0,$F8,$A4,$E5 +byte = $B1,$06,$99,$00,$01,$C8,$D0,$F8 +byte = $A6,$E5,$9A,$A6,$E0,$60 + +byte fbrLoad = $B5,$C0 +byte = $85,$06,$B5,$D0,$85,$07,$A0,$26 +byte = $B1,$06,$99,$C0,$00,$88,$10,$F8 +byte = $A4,$E5,$B1,$06,$99,$00,$01,$C8 +byte = $D0,$F8,$A6,$E5,$9A,$A6,$E0,$60 + +def fbrInit + byte i + word pool + + pool = @fbrPool + t_vm + for i = MAX_FIBER downto 1 + fbrState[i] = FIBER_FREE + fbrVMState[i] = pool + pool = pool + t_vm + next + fbrState = FIBER_RUN + fbrVMState = @fbrPool +end +def fbrStop(fid) + byte i + + if fid + fbrState[fid] = FIBER_FREE + i = 0 + while fbrNext[i] <> fid + i = fbrNext[i] + loop + fbrNext[i] = fbrNext[fid] + if fid == fbrRunning + fbrRunning = fbrNext[fbrRunning] + return (@fbrLoad)(fbrVMState[fbrRunning]) + fin + fin +end +def fbrExit + fbrStop(fbrRunning) +end +def fbrStart(defaddr, param) + byte i + word vmstate + + for i = MAX_FIBER downto 1 + if fbrState[i] == FIBER_FREE + fbrState[i] = FIBER_RUN + vmstate = fbrVMState[i] + vmstate=>ifp = vmstate + hwstk + vmstate=>pp = vmstate + hwstk + vmstate->esp = $0E + vmstate->estklo.$0F = i + vmstate->estkhi.$0F = 0 + vmstate->estklo.$0E = param.0 // param lo byte + vmstate->estkhi.$0E = param.1 // param hi byte + vmstate->hwsp = $FB + vmstate=>$FE = @fbrExit - 1 + vmstate=>$FC = defaddr - 1 + fbrNext[i] = fbrNext[fbrRunning] + fbrNext[fbrRunning] = i + return i + fin + next +end +def fbrYield + byte prev + + if fbrNext[fbrRunning] <> fbrRunning + prev = fbrRunning + fbrRunning = fbrNext[fbrRunning] + return (@fbrSwap)(fbrVMState[prev], fbrVMState[fbrRunning]) + fin +end +def fbrHalt + byte i + + if fbrRunning + i = 0 + while fbrNext[i] <> fbrRunning + i = fbrNext[i] + loop + fbrState[fbrRunning] = FIBER_HALT + fbrNext[i] = fbrNext[fbrRunning] + i = fbrRunning + fbrRunning = fbrNext[fbrRunning] + return (@fbrSwap)(fbrVMState[i], fbrVMState[fbrRunning]) + fin +end +def fbrResume(fid) + if fbrState[fid] == FIBER_HALT + fbrState[fid] = FIBER_RUN + fbrNext[fid] = fbrNext[fbrRunning] + fbrNext[fbrRunning] = fid + fin +end +// +// Test Fibers +// +def fbrTest(fid, param) + byte x + word i + + i = 1 + x = fid * 8 + while 1 + gotoxy(x, fid) + puts(param) + x = x + i + if x < 1 or x > 32 + i = -i + fin + fbrYield + loop +end + +fbrInit +fbrStart(@fbrTest, " World ") +fbrStart(@fbrTest, " Hello ") +while ^$C000 < 128 + fbrYield +loop +^$C010 +done diff --git a/src/samplesrc/examples/ex.17.pla b/src/samplesrc/examples/ex.17.pla new file mode 100644 index 0000000..a640382 --- /dev/null +++ b/src/samplesrc/examples/ex.17.pla @@ -0,0 +1,55 @@ +// +// GAME PORT I/O LIBRARY +// BASED ON THE WIRING LIBRARY +// +CONST ANN0 = $C058 +CONST ANN1 = $C05A +CONST ANN2 = $C05C +CONST ANN3 = $C05E +CONST OFF = 0 +CONST ON = 1 +CONST STROBE = $C040 +CONST FLAG0 = $C060 +CONST FLAG1 = $C061 +CONST FLAG2 = $C062 +CONST FLAG3 = $C063 +CONST PREAD = $FB1E +CONST WAIT = $FCA8 + +DEF DIGITALREAD(PIN) + RETURN FLAG0[PIN&3] > 127 +END + +DEF PORTREAD + RETURN (^FLAG0>>7)&1|(^FLAG1>>6)&2|(^FLAG2>>5)&4|(^FLAG3>>4)&8 +END + +DEF DIGITALWRITE(PIN, VAL) + RETURN ^ANN0[((PIN&3)<<1)+VAL&1] +END + +DEF PORTWRITE(VAL) + ^ANN0[VAL&1] + ^ANN1[(VAL>>1)&1] + ^ANN2[(VAL>>2)&1] + RETURN ^ANN3[(VAL>>3)&1] +END + +DEF ANALOGREAD(PIN) + RETURN CALL(PREAD,0,PIN&3,0,0).2 +END + +DEF DELAY(TIME) + RETURN CALL(WAIT,TIME,0,0,0) +END + +// +// OUTPUT THE ANALOG INPUT TO +// THE DIGITAL PORT +// +WHILE ^$C000 < 128 + PORTWRITE((255 - ANALOGREAD(2)) / 16) +LOOP +^$C010 + +DONE diff --git a/src/samplesrc/examples/ex.2.pla b/src/samplesrc/examples/ex.2.pla new file mode 100644 index 0000000..1d04962 --- /dev/null +++ b/src/samplesrc/examples/ex.2.pla @@ -0,0 +1,92 @@ +// +// PLASMA UNDERSTANDS TWO TYPES OF DATA: +// BYTES (UNSIGNED 8 BIT VALUES), AND +// WORDS (SIGNED 16 BIT VALUES). FROM +// THESE TWO TYPES, EVERYTHING MUST BE +// BUILT. BUT, PLASMA HELPS OUT WITH +// DEFINING DATA, INCLUDING ARRAYS, +// STRUCTURES, STRINGS, AND POINTERS. +// YOU'VE ALREADY SEEN A STRING IN THE +// FIRST EXAMPLE. HERE ARE SOME MORE... +// + +BYTE[16] FILENAME // RESERVES 16 BYTES + +// +// THE FOLLOWING RESERVES A MINUMUM +// AMOUNT OF SPACE FOR A STRING, PLUS +// IT INITIALIZES IT WITH A VALUE. +// + +BYTE[32] PREFIX = "/EXAMPLES" + +// +// ARRAY DEFINITIONS WITH NO SIZE DON'T +// RESERVE ANY SPACE, BUT ARE USEFUL FOR +// LABELS. ARRAY DEFINITIONS WITHOUT A +// NAMED VARIABLE JUST INITIALIZE THE +// MEMORY WITH VALUES. +// + +BYTE[] ALIAS // ALIAS HAS SAME +WORD MYVAR = 1 // ADDRESS AS MYVAR +WORD = 2, 3, 4// BUT DIFFERENT TYPE + +// +// PLASMA ALLOWS FLEXIBLE ARRAY SYNTAX, +// MORE TRADITIONAL ARRAYS LOOK LIKE: +// + +WORD MYARRAY[2] // PICK ONE STYLE AND + // STICK WITH IT + +// +// PLASMA ALSO HELPS OUT WITH CONSTANTS +// THAT CAN BE GIVEN A NAME TO MAKE THE +// CODE MORE READABLE. +// + +CONST SPEAKER = $C030 // HEX VALUES START WITH '$' + +// +// OF COURSE PLASMA HAS LOOPING +// CONSTRUCTS INCLUDING FOR/NEXT, +// REPEAT/UNTIL, WHILE/LOOP. +// +// THE FOR/NEXT IS THE MOST FLEXIBLE, +// TAKING THE EXPANDED FORM OF: +// +// FOR VAR = LO TO HI STEP INC +// +// FOR VAR = HI DOWNTO LO STEP DEC +// + +FOR MYVAR = 0 TO 1000 + ^SPEAKER // ACCESS SPEAKER TO MAKE NOISE +NEXT + +// +// HERE IS THE SAME THING USING A WHILE +// LOOP AND THE INCREMENT STATEMENT. THE +// TONE IS SLIGHTLY LOWER THAN ABOVE DUE +// TO THE 'WHILE' EXECUTING SLIGHTLY +// SLOWER THAN THE 'FOR' LOOP. +// + +MYVAR = 0 +WHILE MYVAR <= 1000 + ^SPEAKER + MYVAR++ // INCREMENT VARIABLE +LOOP + +// +// AND TO BE THOROUGH, PLASMA PROGRAMS +// SHOULD END WITH A "DONE" SO THE +// COMPILER KNOWS WHEN TO STOP. ANYTHING +// FOLLOWING "DONE" IS IGNORED. +// + +DONE + +THIS CAN BE HANDY TO HAVE ARBITRARY TEXT +FOLLOWING THE PROGRAM CODE. diff --git a/src/samplesrc/examples/ex.3.pla b/src/samplesrc/examples/ex.3.pla new file mode 100644 index 0000000..92fdd21 --- /dev/null +++ b/src/samplesrc/examples/ex.3.pla @@ -0,0 +1,83 @@ +// +// THE PLASMA SANDBOX CAN'T LOAD +// MODULES LIKE THE FULL VERSION, BUT +// IT HAS SOME BUILT-IN FUNCTIONS THAT +// ALLOW EXTENSIVE ACCESS TO THE APPLE'S +// HARDWARE AND SOFTWARE ENVIRONMENT. +// OTHERS ARE JUST CONVENIENT OR ADD +// PERFORMANCE WHERE PLASMA MAY BE TOO +// SLOW +// + +CONST TEXTSCREEN = $0400 +CONST SCREENSIZE = 1024 + +BYTE[SCREENSIZE] SAVETXT +BYTE I +WORD NAME + +// +// BUILT-IN FUNTIONS: +// +// SYSCALL(CMD,PARAMS) : CALL PRODOS +// CALL(ADDR,AREG,XREG,YREG,PSP) : CALL 6502 ROUTINE WITH REG VALUES +// MEMSET(DSTADDR, VALUE, SIZE) : FILL DSTADDR TO DSTADDR + SIZE WITH VALUE +// MEMCPY(DSTADDR, SRCADDR, SIZE) : COPY SRCADDR TO DSTADDR, SIZE BYTES +// PUTC(CHAR) : PRINT CHAR +// GETC() : READ CHAR FROM KEYBOARD +// PUTI(NUM) : PRINT INTEGER NUMBER +// PUTS(ADDR) : PRINT STRING AT ADDR +// GETS(CHAR) : READ STRING FROM KEYBOARD, PROMPTING WITH CHAR +// HOME() : CLEAR SCREEN AND HOME CURSOR +// GOTOXY(X,Y) : SET CURSOR TO X,Y +// + +// +// SAVE THE TEXT SCREEN IN A BIG (1024) ARRAY +// +MEMCPY(@SAVETXT, TEXTSCREEN, SCREENSIZE) // SAVE TEXT SCREEN + +// +// CLEAR SCREEN, HOME CURSOR. FOR +// FUNCTIONS WITHOUT PARAMETERS, THE +// "()" ARE OPTIONAL, BUT HELP CLARIFY +// THE FUNCTION CALL IS NOT A VARIABLE +// REFERENCE: HOME VS HOME() +// +HOME() + +FOR I = 0 TO 23 + // + // MOVE CURSOR TO POSITION X, Y + // + GOTOXY(I, I) + // + // OUTPUT A CHARACTER AND A SPACE + // + PUTC('A' + I) + PUTC(' ') + // + // OUTPUT AN INTEGER + // + PUTI(I) +NEXT + +// +// NOTICE THE '@' IN SOME OF THE FUNCTION +// ARGUMENTS? DID YOU NOTICE THE '^' IN +// THE PREVIOUS EXAMPLE? ALL WILL BE +// EXPLAINED IN EX.4.PLA! +// + +GOTOXY(10, 5) +PUTS("WHAT IS YOUR NAME") +NAME = GETS($BF) // GETS NEEDS PROMPT CHAR: '?' + 128 +GOTOXY(12, 7) +PUTS("NICE TO MEET YOU, ") +PUTS(NAME) +GOTOXY(16, 10) +PUTS("PRESS ANY KEY TO EXIT.") +GETC() +GOTOXY(0, 5) +MEMCPY(TEXTSCREEN, @SAVETXT, SCREENSIZE) +DONE diff --git a/src/samplesrc/examples/ex.4.pla b/src/samplesrc/examples/ex.4.pla new file mode 100644 index 0000000..8653393 --- /dev/null +++ b/src/samplesrc/examples/ex.4.pla @@ -0,0 +1,75 @@ +// +// IN PLASMA, ANY VALUE CAN BE USED +// AS A CHARACTER, INTEGER, ADDRESS, +// OFFSET, ETC. JUST LIKE IN ASSEMBLY +// LANGUAGE, THERE ARE NO RESTRICTIONS. +// WITH GREAT FLEXIBILITY COMES GREAT +// RESPONSIBILITY. IN THE FIRST EXAMPLE, +// YOU SAW WHERE A STRING WAS PRINTED. +// THE LINE LOOKED LIKE: PUTS(@HELLO) +// HOWEVER, THE STRING NAME WAS JUST +// "HELLO", WITHOUT THE '@'. SO WHAT +// DOES THAT '@' DO? IT IS THE +// ADDRESS-OF OPERATOR. IT TAKES THE +// ADDRESS WHERE THE VARIABLE IS STORED +// FOR ITS VALUE, NOT THE VALUE OF THE +// VARIABLE. WHEN OUTPUTTING THE STRING, +// THE ADDRESS OF THE STRING IS PASSED +// IN, NOT THE ENTIRE STRING. THIS IS +// MUCH MORE EFFICIENT. WHEN AN ADDRESS +// IS PASSED AROUND, IT IS REFERED TO +// AS A "POINTER". IT "POINTS" TO +// SOMETHING. +// +// THE COROLLARY TO THE ADDRESS-OF +// OPERATOR IS THE POINTER-TO OPERATOR. +// NOW, IN PLASMA, A POINTER IS JUST AN +// ADDRESS, THERE IS NO IDEA OF WHAT IT +// POINTS TO. PLASMA ONLY KNOWS ABOUT +// BYTES AND WORDS, SO THERE ARE TWO +// POINTER-TO OPERATORS: +// +// ^ POINTER-TO-BYTE +// * POINTER-TO-WORD +// +// NOW THE '*' OPERATOR LOOKS JUST LIKE +// THE MULTIPLICATION OPERATOR, BUT IT +// BEHAVES DIFFERENTLY DEPENDING ON +// WHERE IT IS PLACED. THESE OPERATORS +// ARE PRE-OPS; THEY COME BEFORE THE +// OPERAND. +// +// NOTE THAT ADDRESSES, THUS POINTERS, +// ARE 16 BIT VALUES ON THE APPLE II. +// IF YOU ARE GOING TO SAVE AN ADDRESS +// IN A VARIABLE, IT MUST BE A WORD +// VARIABLE TO HOLD THE FULL PRECISION. +// +// HERE IS AN EXAMPLE TO PLAY WITH: +// + +BYTE MYBYTE = 26 +WORD MYWORD = 75 +WORD MYPTR + +MYPTR = @MYBYTE +PUTI(^MYPTR) + +PUTC($8D) // THIS IS A CARRIAGE-RETURN CHARACTER + +MYPTR = @MYWORD +PUTI(*MYPTR) + +DONE // EVERYTHING AFTER "DONE" IS IGNORED + +TRY PLAYING AROUND WITH THE CODE. GO +AHEAD. YOU CAN'T REALLY BREAK THE +COMPUTER. IF IT LOCKS UP AND CTRL-RESET +DOESN'T GET YOU BACK TO THE EDITOR, JUST +REBOOT THE MACHINE. + +HOPEFULLY YOU SEE THAT THE VARIABLE +NAMES IN PLASMA ARE JUST LABELS APPLIED +TO ADDRESSES. SPACE IS SET ASIDE +DEPENDING ON THE SIZE OF THE VARIABLE,IF +ITS AN ARRAY, AND IF IT IS INITIALIZED. diff --git a/src/samplesrc/examples/ex.5.pla b/src/samplesrc/examples/ex.5.pla new file mode 100644 index 0000000..f1ae353 --- /dev/null +++ b/src/samplesrc/examples/ex.5.pla @@ -0,0 +1,40 @@ +// +// YOU'VE ALREADY SEEN SOME OF THE +// BUILT-IN FUNCTIONS IN PLASMA, NOW +// IT IS TIME TO DEFINE OUR OWN. THE +// REAL POWER OF PLASMA COMES FROM +// FUNCTION DEFINITIONS THAT USE LOCAL +// VARIABLES, AND THE ABILITY FOR +// RECURSION - FUNCTIONS THAT CAN CALL +// THEMSELVES. THE APPLE II DOES LIMIT +// THESE ABILITIES SOMEWHAT, BUT SOME +// COMPLEX ALGORITHMS WORK JUST FINE +// WITH THESE LIMITATION (INCLUDING +// THE PLASMA COMPILER, ITSELF). +// +// A FUNCTION DEFINITION HAS OPTIONAL +// ARGUMENTS, OPTIONAL LOCAL VARIABLES, +// AND AN OPTIONAL RETURN VALUE. +// +DEF ADD(A, B) + WORD C + + C = A + B + RETURN C +END + +PUTI(ADD(1, 2)) +DONE + +IN THE ABOVE EXAMPLE, THE RETURN COULD +BE SIMPLIFIED TO "RETURN A + B" BUT +I WAS TRYING TO SHOW HOW TO USE LOCAL +VARIABLES. ARRAYS CAN ALSO BE PLACED +IN THE LOCAL VARIABLES, BUT NOTE THAT +THE MAXIMUM SIZE OF LOCAL VARIABLES HAS +TO BE 255 BYTES OR LESS, PER DEFINITION. + +ALSO, DUE TO THE NATURE OF THE 6502 CALL +STACK, ONLY A CALL DEPTH OF ABOUT 96 IS +AVAILABLE. AFTER THAT, THE STACK +OVERFLOWS AND UNEXPECTED THINGS HAPPEN. diff --git a/src/samplesrc/examples/ex.6.pla b/src/samplesrc/examples/ex.6.pla new file mode 100644 index 0000000..f53e026 --- /dev/null +++ b/src/samplesrc/examples/ex.6.pla @@ -0,0 +1,68 @@ +// +// INSTEAD OF USING HARD-TO-REMEMBER +// NUMBERS, PLASMA ALLOWS YOU TO +// REPLACE THOSE WITH SYMBOLIC VALUES +// +CONST CR = $8D +CONST MALE = 0 +CONST FEMALE = 1 + +// +// STRUCTURES ARE SYNTACTICAL CANDY +// FOR CREATING OFFSETS. IN THE FOLLOWING +// EXAMPLE, MYSTRUC IS A CONSTANT VALUE +// OF THE SIZE OF THE STRUCTURE. THE +// ELEMENTS WILL BE CONSTANTS REPRESENTING +// THE OFFSETS INTO THE STRUCTURE. +// +STRUC MYSTRUC + BYTE[32] FIRST + BYTE[32] LAST + BYTE AGE + WORD SEX +END + +BYTE MALESTR = "MALE" +BYTE FEMALESTR = "FEMALE" + +// +// INITIALIZE A SAMPLE RECORD. +// +BYTE[] RECORD +BYTE[32] = "STEVE" +BYTE[32] = "WOZNIAK" +BYTE = 61 +WORD = @MALESTR + +// +// HERE IS A NEW WAY TO USE POINTERS: AS +// A POINTER TO A STRUCTURE. AGAIN, +// SINCE POINTERS DON'T KNOW WHAT THEY +// POINT TO, THERE ARE TWO OPERATORS TO +// POINT TO A BYTE, OR POINT TO A WORD. +// '->' POINTS TO A BYTE USING A POINTER +// AND AN OFFSET. '=>' POINTS TO A WORD +// USING A POINTER AND AN OFFSET. IN +// THE FOLLOWING EXAMPLE, THE OFFSETS +// COME FROM THE 'MYSTRUC' DEFINITION. +// +DEF PUTREC(RECPTR) + PUTS(@RECPTR->FIRST) // ADDRESS OF FIRST NAME + PUTC(CR) + PUTS(@RECPTR->LAST) // ADDRESS OF LAST NAME + PUTC(CR) + PUTI(RECPTR->AGE) // AGE (BYTE) + PUTC(CR) + PUTS(RECPTR=>SEX) // POINTER TO STRING (WORD) +END + +PUTS("STRUCTURE SIZE:") +PUTI(MYSTRUC) // THIS IS JUST THE SIZE OF THE STRUCTURE +PUTC(CR) + +// +// PASS THE ADDRESS OF A SAMPLE RECORD +// TO BE PRINTED OUT. +// +PUTREC(@RECORD) +DONE diff --git a/src/samplesrc/examples/ex.7.pla b/src/samplesrc/examples/ex.7.pla new file mode 100644 index 0000000..99f8a14 --- /dev/null +++ b/src/samplesrc/examples/ex.7.pla @@ -0,0 +1,65 @@ +// +// RETURNING BACK TO ARRAYS AND STRINGS. +// SINGLE DIMENSION ARRAYS CAN BE +// ACCESSED WITH INDICES, USING THE TYPE +// THE ARRAY WAS DEFINED WITH. NOTICE +// THAT WITH INITIALIZED ARRAYS, THE "[]" +// IS OPTIONAL. ONLY IF A MINIMUM SIZE +// IS SPECIFIED (OR THERE ARE NO +// INITIALIZERS) ARE THE "[]" REQUIRED. +// +BYTE[] ASTRING = "PLASMA IS COOL!" +// +// MULTI-DIMENSIONAL ARRAYS ARE DEFINED +// AS POINTERS TO ARRAYS. THIS HAS THE +// BENEFIT OF CREATING SPARSE ARRAYS AND +// NON-CONTIGUOUS ARRAYS. THE APPLE II +// SCREEN MEMORY, FOR INSTANCE, WORKS +// WELL AS AN ARRAY OF POINTERS TO BYTES. +// +// BECAUSE POINTERS ARE 16 BITS, THE +// MULTI-DIMENSIONAL ARRAY IS DEFINED AS +// 'WORDS'. BUT HOW TO REPRESENT BYTE +// ARRAYS VS WORD ARRAYS? AGAIN, THERE +// ARE TWO SIZE OPERATORS THAT DEFINE +// BYTE ARRAYS AND WORD ARRAYS. '.' SETS +// THE ARRAY TYPE TO 'BYTE' AND ':' SETS +// THE ARRAY TYPE TO 'WORD'. +// +// +// '.' AND ':' CAN ALSO HAVE CONSTANTS +// FOLLOWING THEM, TO ACCESS FIXED +// OFFSETS FROM THE ARRAY, FOR STRUCTURE +// ELEMENT ACCESS. CHECK OUT THE ACCESS +// TO THE STRING LENGTH, IN BYTE OFFSET +// 0 (ASSIGNED TO CONSTANT STRLEN). +// +CONST STRLEN = 0 + +WORD[] TEXTSCREEN +WORD = $400, $480, $500, $580, $600, $680, $700, $780 +WORD = $428, $4A8, $528, $5A8, $628, $6A8, $728, $7A8 +WORD = $450, $4D0, $550, $5D0, $650, $6D0, $750, $7D0 +// +// STRINGS IN PLASMA ARE PRODOS +// COMPATIBLE "PASCAL" STRINGS. STRINGS +// WITH THE LENGTH ENCODED IN THE FIRST +// BYTE, FOLLOWED BY THE CHARACTERS. +// +WORD P +BYTE I + +HOME() +FOR I = 1 TO ASTRING.STRLEN // THE LENGTH OF THE STRING + TEXTSCREEN.[I, I] = ASTRING[I] | $80 +NEXT +GOTOXY(0, ASTRING.STRLEN+2) +PUTS("THE STRING LENGTH IS:") +PUTI(ASTRING.STRLEN) +DONE + +NOTE THAT THE HIGH BIT IS SET WHEN +WRITING CHARACTERS TO THE SCREEN. PLASMA +AND PRODOS USE 0..128 FOR ASCII VALUES, +BUT THE APPLE II SCREEN USES 128..255 FOR +NORMAL CHARACTERS. diff --git a/src/samplesrc/examples/ex.8.pla b/src/samplesrc/examples/ex.8.pla new file mode 100644 index 0000000..cd77544 --- /dev/null +++ b/src/samplesrc/examples/ex.8.pla @@ -0,0 +1,71 @@ +// +// PLASMA DOESN'T REQUIRE UPPER CASE. +// HOWEVER, DUE TO THE NATURE OF THE +// APPLE ][ AND ][+, UPPER CASE WILL +// LOOK BEST ON ALL APPLE II COMPUTERS. +// IF YOU PRINT LOWER CASE TEXT ON AN +// APPLE ][ OR ][+ USING PUTS, IT WILL +// BE AUTOMATICALLY SHIFTED TO UPPER +// CASE. +// +// Here is the PLASMA version of +// Rod's Colors from the DOS System +// Master disk using the built-in call +// function to call ROM routines: +// +const showlores = $C056 +const keyboard = $C000 +const keystrobe = $C010 +byte i, j, k, w, fmi, fmk, color + +def textmode + call($FB39, 0, 0, 0, 0) + return home +end + +def grmode + call($FB40, 0, 0, 0, 0) + ^showlores + return home +end + +def colors + while 1 + for w = 3 to 50 + for i = 1 to 19 + for j = 0 to 19 + k = i + j + color = (j * 3) / (i + 3) + i * w / 12 + fmi = 40 - i + fmk = 40 - k + call($F864, color, 0, 0, 0) //grcolor(color); + call($F800, k, 0, i, 0) //grplot(i, k); + call($F800, i, 0, k, 0) //grplot(k, i); + call($F800, fmk, 0, fmi, 0) //grplot(fmi, fmk); + call($F800, fmi, 0, fmk, 0) //grplot(fmk, fmi); + call($F800, fmi, 0, k, 0) //grplot(k, fmi); + call($F800, k, 0, fmi, 0) //grplot(fmi, k); + call($F800, fmk, 0, i, 0) //grplot(i, fmk); + call($F800, i, 0, fmk, 0) //grplot(fmk, i); + if ^keyboard >= 128 + return ^keystrobe + fin + next + next + next + loop +end + + +grmode +gotoxy(10,2) // X,Y offsets from the text window +puts("Press any key to exit.") +colors +textmode +puts("That's all, folks!") +done + +This program skips the optional "()" on +parameter-less functions. You decide if +this is a style you prefer. Regardless, +be consistent in your source code. diff --git a/src/samplesrc/examples/ex.9.pla b/src/samplesrc/examples/ex.9.pla new file mode 100644 index 0000000..7ed08c2 --- /dev/null +++ b/src/samplesrc/examples/ex.9.pla @@ -0,0 +1,126 @@ +// +// THIS IS A FOREST FIRE SIMULATION. +// +// WRITTEN IS A SLIGHTLY DIFFERENT STYLE. +// +CONST FALSE = 0 +CONST TRUE = NOT FALSE +CONST SHOWLORES = $C056 +CONST KEYBOARD = $C000 +CONST KEYSTROBE = $C010 +CONST EMPTY = 0 +CONST TREE = 4 +CONST FIRE = 13 +CONST FORESTSIZE = 42*42 +CONST RNDNUM = $4E +CONST RNDL = $4E +CONST RNDH = $4F +BYTE TREES1[FORESTSIZE] // ALT ARRAY SIZE SPECIFIER +BYTE TREES2[FORESTSIZE] + +DEF TEXTMODE + CALL($FB39, 0, 0, 0, 0) + RETURN HOME +END + +DEF GRMODE + CALL($FB40, 0, 0, 0, 0) + ^SHOWLORES + RETURN HOME +END + +// +// RANDOM NUMBERS +// +DEF RND + *RNDNUM = (*RNDNUM << 1) + *RNDNUM + 251 + RETURN *RNDNUM & $7FFF +END + +// +// CHECK IF A FIRE IS BURNING AROUND TREE +// +DEF BYFIRE(TREEPTR) + IF ^(TREEPTR - 43) == FIRE + RETURN TRUE + ELSIF ^(TREEPTR - 42) == FIRE + RETURN TRUE + ELSIF ^(TREEPTR - 41) == FIRE + RETURN TRUE + ELSIF ^(TREEPTR - 1) == FIRE + RETURN TRUE + ELSIF ^(TREEPTR + 1) == FIRE + RETURN TRUE + ELSIF ^(TREEPTR + 41) == FIRE + RETURN TRUE + ELSIF ^(TREEPTR + 42) == FIRE + RETURN TRUE + ELSIF ^(TREEPTR + 43) == FIRE + RETURN TRUE + FIN + RETURN FALSE +END + +DEF FORESTFIRE + WORD NEWTREES, OLDTREES, NEWTREE, OLDTREE, YROW + BYTE X, Y + + MEMSET(@TREES1, EMPTY, FORESTSIZE) + MEMSET(@TREES2, EMPTY, FORESTSIZE) + OLDTREES = @TREES1 + NEWTREES = @TREES2 + + FOR Y = 1 TO 40 + YROW = Y * 42 + FOR X = 1 TO 40 + IF RND < 8000 + ^(OLDTREES + X + YROW) = TREE + FIN + NEXT + NEXT + WHILE ^KEYBOARD < 128 + FOR Y = 1 TO 40 + YROW = Y * 42 + FOR X = 1 TO 40 + OLDTREE = OLDTREES + X + YROW + NEWTREE = NEWTREES + X + YROW + WHEN ^OLDTREE + IS EMPTY + IF RND < 5000 + ^NEWTREE = TREE + ELSE + ^NEWTREE = EMPTY + FIN + BREAK + IS TREE + IF RND < 5 OR BYFIRE(OLDTREE) + ^NEWTREE = FIRE + ELSE + ^NEWTREE = TREE + FIN + BREAK + IS FIRE + ^NEWTREE = EMPTY + WEND + CALL($F864, ^NEWTREE, 0, 0, 0) + CALL($F800, Y - 1, 0, X - 1, 0) + NEXT + NEXT + YROW = NEWTREES + NEWTREES = OLDTREES + OLDTREES = YROW + LOOP + RETURN ^KEYSTROBE +END + +PUTS("PRESS ANY KEY TO BEGIN...") +GETC +GRMODE +HOME +GOTOXY(10,2) +PUTS("PRESS ANY KEY TO EXIT.") +FORESTFIRE +TEXTMODE +HOME +PUTS("THAT'S ALL FOLKS!") +DONE diff --git a/src/vmsrc/a1cmd.pla b/src/vmsrc/apple/a1cmd.pla similarity index 100% rename from src/vmsrc/a1cmd.pla rename to src/vmsrc/apple/a1cmd.pla diff --git a/src/vmsrc/cmd.pla b/src/vmsrc/apple/cmd.pla similarity index 100% rename from src/vmsrc/cmd.pla rename to src/vmsrc/apple/cmd.pla diff --git a/src/vmsrc/cmdstub.s b/src/vmsrc/apple/cmdstub.s similarity index 96% rename from src/vmsrc/cmdstub.s rename to src/vmsrc/apple/cmdstub.s index bd8db37..deae3cc 100644 --- a/src/vmsrc/cmdstub.s +++ b/src/vmsrc/apple/cmdstub.s @@ -43,6 +43,6 @@ LCBNK1 = $08 JMP $1000 _CMDBEGIN = * !PSEUDOPC $1000 { - !SOURCE "vmsrc/cmd.a" + !SOURCE "vmsrc/apple/cmd.a" _CMDEND = * } diff --git a/src/vmsrc/plvm01.s b/src/vmsrc/apple/plvm01.s similarity index 99% rename from src/vmsrc/plvm01.s rename to src/vmsrc/apple/plvm01.s index 3537703..b391d3c 100644 --- a/src/vmsrc/plvm01.s +++ b/src/vmsrc/apple/plvm01.s @@ -902,7 +902,7 @@ LEAVE INY ;+INC_IP RTS + INC IFPH RET RTS -A1CMD !SOURCE "vmsrc/a1cmd.a" +A1CMD !SOURCE "vmsrc/apple/a1cmd.a" SEGEND = * VMINIT LDY #$10 ; INSTALL PAGE 0 FETCHOP ROUTINE - LDA PAGE0-1,Y diff --git a/src/vmsrc/plvm02.s b/src/vmsrc/apple/plvm02.s similarity index 100% rename from src/vmsrc/plvm02.s rename to src/vmsrc/apple/plvm02.s diff --git a/src/vmsrc/plvm03.s b/src/vmsrc/apple/plvm03.s similarity index 99% rename from src/vmsrc/plvm03.s rename to src/vmsrc/apple/plvm03.s index 9244fb2..40e8e64 100755 --- a/src/vmsrc/plvm03.s +++ b/src/vmsrc/apple/plvm03.s @@ -1084,6 +1084,6 @@ LEAVE INY ;+INC_IP STA IFPH RET RTS SOSCMD = * - !SOURCE "vmsrc/soscmd.a" + !SOURCE "vmsrc/apple/soscmd.a" } SEGEND = * diff --git a/src/vmsrc/plvm802.s b/src/vmsrc/apple/plvm802.s similarity index 100% rename from src/vmsrc/plvm802.s rename to src/vmsrc/apple/plvm802.s diff --git a/src/vmsrc/plvmzp.inc b/src/vmsrc/apple/plvmzp.inc similarity index 100% rename from src/vmsrc/plvmzp.inc rename to src/vmsrc/apple/plvmzp.inc diff --git a/src/vmsrc/soscmd.pla b/src/vmsrc/apple/soscmd.pla similarity index 100% rename from src/vmsrc/soscmd.pla rename to src/vmsrc/apple/soscmd.pla From 3a448329d047ca3d7924807cfa79e47a84d584e1 Mon Sep 17 00:00:00 2001 From: Dave Schmenk Date: Tue, 20 Feb 2018 22:38:46 -0800 Subject: [PATCH 08/28] opy ED from rel --- src/mkrel | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/mkrel b/src/mkrel index 30651e4..66b8572 100755 --- a/src/mkrel +++ b/src/mkrel @@ -10,7 +10,7 @@ cp rel/ARGS#FE1000 prodos/sys/ARGS.REL cp rel/apple/CONIO#FE1000 prodos/sys/CONIO.REL cp rel/apple/DGR#FE1000 prodos/sys/DGR.REL cp rel/DHCP#FE1000 prodos/sys/DHCP.REL -cp rel/apple/ED#FE1000 prodos/sys/ED.REL +cp rel/ED#FE1000 prodos/sys/ED.REL cp rel/ETHERIP#FE1000 prodos/sys/ETHERIP.REL cp rel/FIBER#FE1000 prodos/sys/FIBER.REL cp rel/apple/FILEIO#FE1000 prodos/sys/FILEIO.REL From eb4bb099f190aa6030e73cf912ad75a4ae7949a4 Mon Sep 17 00:00:00 2001 From: Dave Schmenk Date: Tue, 20 Feb 2018 22:56:55 -0800 Subject: [PATCH 09/28] Get proper link for plvmzp.inc established --- src/makefile | 18 ++++++++++-------- src/rel/apple/A1PLASMA#060280 | Bin 4798 -> 4798 bytes src/rel/apple/CMD#061000 | Bin 4112 -> 4112 bytes src/rel/apple/CONIO#FE1000 | Bin 1831 -> 1831 bytes src/rel/apple/DGR#FE1000 | Bin 1886 -> 1886 bytes src/rel/apple/PLASMA.SYSTEM#FF2000 | Bin 3609 -> 3609 bytes src/rel/apple/PLASMA16.SYSTEM#FF2000 | Bin 2620 -> 2620 bytes src/rel/apple/SNDSEQ#FE1000 | Bin 4084 -> 4084 bytes src/rel/apple/SOS#FE1000 | Bin 788 -> 788 bytes src/rel/apple/SOS.INTERP#050000 | Bin 6107 -> 6107 bytes src/rel/apple/SPIPORT#FE1000 | Bin 1336 -> 1336 bytes src/rel/apple/UTHERNET#FE1000 | Bin 1082 -> 1082 bytes src/rel/apple/UTHERNET2#FE1000 | Bin 3953 -> 3953 bytes src/rel/c64/PLASMA | Bin 4911 -> 0 bytes 14 files changed, 10 insertions(+), 8 deletions(-) delete mode 100644 src/rel/c64/PLASMA diff --git a/src/makefile b/src/makefile index f0f005c..ede2039 100755 --- a/src/makefile +++ b/src/makefile @@ -1,13 +1,13 @@ .SUFFIXES = AFLAGS = -o $@ PLVM = plvm -PLVMZP_APL = vmsrc/plvmzp.inc +PLVMZP_APL = vmsrc/apple/plvmzp.inc PLVM01 = rel/apple/A1PLASMA\#060280 PLVM02 = rel/apple/PLASMA.SYSTEM\#FF2000 PLVM802 = rel/apple/PLASMA16.SYSTEM\#FF2000 PLVM03 = rel/apple/SOS.INTERP\#050000 CMD = rel/apple/CMD\#061000 -PLVMZP_C64 = vmsrc/plvmzp.inc +PLVMZP_C64 = vmsrc/c64/plvmzp.inc PLVMC64 = rel/c64/PLASMA ED = rel/ED\#FE1000 SOS = rel/apple/SOS\#FE1000 @@ -118,13 +118,15 @@ $(CODEOPT): toolsrc/codeopt.pla toolsrc/codeseq.plh $(PLVM): vmsrc/plvm.c cc vmsrc/plvm.c -o $(PLVM) -$(PLVMZP_APL): - -rm $(PLVMZP_APL) - -ln -s apple/plvmzp.inc $(PLVMZP_APL) +$(PLVMZP_APL): FORCE + -rm vmsrc/plvmzp.inc + -ln -s apple/plvmzp.inc vmsrc/plvmzp.inc -$(PLVMZP_C64): - -rm $(PLVMZP_C64) - -ln -s c64/plvmzp.inc $(PLVMZP_C64) +$(PLVMZP_C64): FORCE + -rm vmsrc/plvmzp.inc + -ln -s c64/plvmzp.inc vmsrc/plvmzp.inc + +FORCE: vmsrc/c64/cmd.a: vmsrc/c64/cmd.pla $(PLASM) ./$(PLASM) -AOW < vmsrc/c64/cmd.pla > vmsrc/c64/cmd.a diff --git a/src/rel/apple/A1PLASMA#060280 b/src/rel/apple/A1PLASMA#060280 index c72950b4d82498fb7f909cbd057f9a10b95e0ecb..15a72e8759184f99582b2423fcb8dd93ec1bcf49 100644 GIT binary patch delta 2184 zcmZ`)&u<$=6yDm-dc8!jX>nx~6>>?{NJZ?WQTPL>QYpsUYY?R8hf_Cw6RF@HpS_MLjtLHtqQtvYD3{*-mIPU2Vlvw`@Z?! zd*94^Gg}@m59{%F+$rMaL#9i1GB`9d6WhY5%BSHM@4{A+LSlDOhJ|aP4$tRM z3-bjw$fN9O%CUfPtjBQTff?U5Cj)b`YtC*_SeA56UUYI+UdTBOX~CDNBXb3R8BVZ) zJ(99$uj|VTdz7RO}c|Pi36N`GmL!RjFeD zwTy0Ev^WD9=OD1FSk>-Zv2(O2R1IdEO@o(hK9OpYrXH&Ag)_Zv>o7t=;QXAYgwHXjG*X-6p z)eJC$;a>T|W0;K-d!SL~$|~o|)xF#Z5SI_$thSXGOc$qY)9v|iq0~8D@p#pH@6 zVi#+(?z5YaLU!ZAmihvc9|1OH0UAbhJ}>O;-4moh^}xTJ&O8^1YhBG0PM5nbyK+%2 zCUkjx7qjNNv%Mt-^k5_Yn;sOQ=D;9jH4EZ<9YF!X?Et*TkF{ZG7?(OVY?Br{6;amJ zhT^Kgd6c!RQxWyLa!0KxNh^WUvns``IS+-c zqSOkC|5QD%SxTp z121oojZ*05CQ|(8cL^2NKwlX;nY z9!U!Ln-FxmMkIQb#1_Giv>EmT^9K{u$x7?sKWqEZQge)2CBGhn*1E>vcZ{9HKV6A0 z`KRbD+?R5zq93KJ7^XsE^cE3mnM4;?Fx(Oz1~Dty5UI!N(e)MBUSERWl5{1_*-L5U zC(z(7OKEhv8M_(Hcj$^AYAYdoF?ODxLK(n zPDhBS|A2A7!_Q{#n=KhmA!b;Ze+~0r#bmgjv6<&5?suw}20;1yk^&=I_X58Bg)B=i g)@L`0Gi0;4pNPdciJn&`-j_W4`%Z`a@tzR=2XdSGp8x;= delta 2184 zcmZ`)&2Jk;6yMrTn=BFCw74>g3cjRjq#}H26#f9JR9f%OmIf}QnN2Yyh=YUTt|O2( z6&dh>ptb6Ss3*6os~AzqOEVxu6;-0GHWordk<$w&kX%<4bmP>9!oj>*JMITy$>Vvy z_j?~R@4fNb(Atm{e#@99>3qO3$W{iHdPd$97U%L3)sMD_K{Z&@MZwmOq~A13{kBGN zO1E{2QrbQ|f->y3tzDRt?+H!J0!<`)0)@>6+Q6_aw#KoIVMR8|zMnDYOD_T%Ee8vR zjSFcT73O36+sKi5D;T{JEI*#4{Vn>LVaDFfm3)xSIV^yD*0-j%**w*5E8u z=kau^K|Ei^;s|<@a@c1a?lAPQFNU|pabFy7i;HsdWQYkxooP3HGpv#d4Xcf);n2-QJ5=s zcA+xWZA>-0T^BQqmZEQ3s$2P%8`~^%nCrNg zvQO$t%cGpiOS6*LB3m|c>MOva*jCS}9PWhnMH4qwZx`U)Q4@7GPegO-bH#1ZkV)VBusd8pdg7fJV5aF)aYadvo)$#kXK<}wZ-p!vB<9ZB31oN z&&DW3&D9{WNk~SYB>VK3EPCpU)3f)5BuSP6H)et2?G{%k%4Cxi*I;E^`5>eT3TRUx?ZDO9%bPu)?J)6& zsn4VR*2PpU50jNcxR<`MG%C{LOD~BOkFDzTTFwZ%dl1k-z9YTm`$4N+{(2uJ;AsfM@P z=KnC>g23uDAZN9a=m&w3*ZBlU@D3teE}nsr4#4vd1yrDbFt(7HM*L%}FASTen^j5; z=((&?^RNF&B9z6Ey?rZ=99@5k?ec&67BX3d-FM`U#jv@qTRYd^D+TU6Z{uz(=rIU} z{9uZ==SP|Cb;Z(sN8xXY0!i7}HW79dDd@5X%aNI2LLrKE6AJSKZ@3z_*5bG-dy$}atu_uy{ ziELW8s&V#Hj(6T8>B`>AV?0zOb&@EKoO*?*)58*rtvCu`Q^atT)Uk?Y^^-Ikg#Sss z6fUHpx&Sh_Yk=lCh_x<{BCc}{if9-f4n0E{{d-?L302A diff --git a/src/rel/apple/CMD#061000 b/src/rel/apple/CMD#061000 index 1b371ce80303fee6dcdceeb7f51858e03d16d434..59a11fd0440726f30474ac6435b10c8f34d6de63 100644 GIT binary patch delta 992 zcmZ8f-%Aux6rOeU&K;@PRg47#=b^v_AA}%$=m!{qLG%Yi4;v(CMESB$J&c4`BrqAum0|x_8xN6jsl!u0{0F4|ZpwtVvucNVYS(7S+I9m~X!CJLfz1B-Di3 zYxXf>s!UEvWAt%oT(L-!+VGb)M&U`|Zl4&NUM zyBsEOg;gmlNs6+EkXCuzDmosyE&^{@F~o`yu%XL?6xErMwQXHXA4k)*I|kpoFoTe+4XD|gaO zAG>hLe%Hb!YYYx8sMl5?&~CS;cP*-ejfaTofQLmxLEPu*$Z&9wGMXsj#;l>zak+*= z_dWa;>LjldM{h?%9hLfZQ8E!`7=V<)QH5{zx>cXIU!BF%Z)-PiHg{PNW7FvG+h&&cJ delta 992 zcmZ8fT}TvB6rOecr(#zz77Uz+0vGmSAqXG(0V6QDb7$6iidOHg3K~&XOe6F#OL#>h zW0xH8C0K$Hr>7nA(nEyOkBmOZ&034-wPmBMNn9yNwlljH)xg|g&i%gcobQ~I7Sm$X z>Y~UJsgxDQ@%_MrY@-Zz_>Y2AkXQJo^%ibBs5E|ceAHT?*XR{HI_T5MyfSq;czZNh zWMt}6P!tvfK`;nuWP?;=XXzLtJ@W}R(8H2NcqY^b!;zbdo#J(&F_K!OXhIst!&IJC zEtCb`w9-l79tk3xt6TnyKg%phG3%xBJaKEcm8`%Nw>`uX8N5#1eY)c|P!vMy4|BqljTD&Bs9wyjES-7UY7o9_QcICB8ve zT=meB3iuHGcoazm(vrL+Wy>t?)@(~2ak6`{%xk?UaK8fg6JZH@G^7%GoWAy2Ri!@I9+~Ra#SgFC%wf*BsQrI00(}5-Aj<-2+quxMQQp%tF*JerRn< zi5ol5HU1gsMZy&Ed&>$V6;bis&a7Gu6MDEBy0CMn?0Zu7h4p)7-%6l#YgRRgbms4Tg$>3aRCM#rc(Hrx>I30jRZx-(UIU9jn-cb28r6x0&Z`o*<64sX!>H6gx zxtfn1uw=h;!R}QX2NKwAd5L(d)12F~u|XU-6k-rKY#i{zKF@?k{6m=H^crl;DloMo z)1m2}hF3xbOw<^qV$`B#9vMCTCa?`V)#@K5Y9Ovb%0_Usb{D>91ig4oQ)xtq?(P@ z-h3>*hmP@fQ_ClEZRQv(o~dQ9iAHKc_%R4SDw-PP8#5FW8wpc3Vvs)x`FkJYx~I** E0MA|Nvj6}9 diff --git a/src/rel/apple/CONIO#FE1000 b/src/rel/apple/CONIO#FE1000 index 7c30fb3b48035e5b17b0567ccbc3aeee6892c3f2..04b6ce6f3b12e090ff1b4b9b581aca47197cfbb6 100644 GIT binary patch delta 74 zcmZ3^x14Xn0{aWCYFiJqswb@EH@(nmzy$=X2CW7OEl;*y(ENAx!itS*tsEzS1m~8E e8#!DJTA#1{pUL3)LG`(-!9Ip0PO%qxTxPXAwpw%FurDSV@=D({6D>kaN`keq0{#z0^ c`nejkmaqJu$>8}xwcOQUqTiB|jrTp+05V=4O#lD@ diff --git a/src/rel/apple/DGR#FE1000 b/src/rel/apple/DGR#FE1000 index ccf32b7ef987c1597d097852df379407ef19fa8f..2d64e12666ee5e1fc9db1316cecda5b95e9dca1f 100644 GIT binary patch delta 695 zcmZ9IKZw&%9LHntE_p6(!NHE1V#+OV6bEr}>D0+h=paZz1c#G?L#F2-6w=|rErKT` z^bUj;?>8Q#NscoPlK0y5yuspNhQnW8sq40~=gmwS1C&l?#1U9WSd)XVbN zD60dbvq6_@wDup0Wkj)RA=}^a#zw#5mA`nSJVoUIl_e^_YIF&GiOK?%pR>HYKIIc9 zN8zfYcC~-L54U_JD@d<3jLi4Sk-GL9k4O}J)Cu@D=Zup5(XR4jy@$)0gR1dDYCEVdepgTSU3 zxJK}VU2+G)2Je*zDJ+bIgo7Md7_63n2x&|yzP%V>onn~z=6m0JznK^3#qcojfC&TI z!UVhadpI(L{t34mKp)sKQMsm&YV0i*3;VSPU36OLq=M(&r%Xkqei#$<$KHyavX4Cc zx%^SZ%6zHHb8P}z2ev7rKxcONeK}v3fsOr|*l%An;J&yA&ZJp>QSlggCfm@Rkg_AK zibu&~*~00p2?yBzRlX<*Xqgwi@cw;!sCnqDU!YVFu8uFXtk2Snk%*Cj^E!I5A^=_*gjLr znLN@nb)efD>vC-^{bxlPt*8d*?Qe}odcQEvzIcP&MPv(+86v-`xGH&x$P|&E3qQN| zWGnI!xELAk)qlKqbG%G&mDh)p>O1AgSo0<7X5zm}U?zoup7NB(Uc|{cqJOETe(Fa) zIYRh1m*}5yfh)W4NLuhzGU!Q)-)TcfHZ`RQ4vvI_?n>u^PR|c2?(T^VtX4uN#ho52 rH-9n7WIH=hNiXwynD=lG1D~L6KOe|2P$E0IfOZy=UFnD0TiW&?_G>-Z diff --git a/src/rel/apple/PLASMA.SYSTEM#FF2000 b/src/rel/apple/PLASMA.SYSTEM#FF2000 index 1c1df911c3b3e29f441b983a751254fa69849568..b6ff1c4d9386bc0a22949581beea63d756d6587e 100644 GIT binary patch literal 3609 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 diff --git a/src/rel/apple/PLASMA16.SYSTEM#FF2000 b/src/rel/apple/PLASMA16.SYSTEM#FF2000 index c7bbe55e1eda8c53917652e9fa21b6e513e04fc9..0e4e4113ecaabc0f25e56fdabc81807b9dcea22e 100644 GIT binary patch delta 1031 zcma)5&1(}u6yMF-eAPmWMN2^#5sHdJFT#RHJ#1?ZB0UOLBrt!1dP%gI5DJ#0AyDWg zB#mr5Wm5uT3U0TG+ny%2An0Y>W;1CoO}Dfl72-_RH0?q0vipAT{oePRmEo1)WPZ$B zyn=jLA?7b)6wtgWzlnb~e2qXMuukw^%v-D>A5*V?zQ6Nq)2-#6ITbXt^adxsmldddrF3ez< z(P5?rGpp&TzS@+9=qFN=EimWN%XCiCzc?7E3}_tG9NeG4`-P@bpi1;+mt%nIZ9xvx zs8M!QCbC>3VGCJ`1vDpRrJsABM2N!5Gpm}TYJ^dg#UAX*JP%=c&Jemvm!>(0E?A&U z4WO7j23M46PhMbr*Ukc+sJ*mPZ2Gb9R)iQ}aeT=2t*S6Z7RM!qLXWw-B4$H&i0B|r*`T3KadyX`O+&-uP2Q24C8CY1?DiU11;)^GK5$bk(g-dWhIKBtRt%Jp} z0D8BP!_%BJ(_iq5RR$n{tw`Yk02{qgO2a~FR4Dm{Qa~^en71N{8yD&s*qQzuPPj5h zxl$@1rTkKAR7wr2BTefgA%Z{21>Q!po=OqVa+NQRg){&<1?!I08n^ay6G9FPkvk2J zfo|0pK8Pbm(a}JJTwTEs2?;jRon%OzY#t5E0+eT#bw|@>pa=`6@KmOGWXN-l&``QG z-6441Mn!BO!K5*$qKHrBdEmQt2y~)u#`R*=rx)*rWdkkrcDTM}O-jlOy&NF%$yc*X zE7r1Xl5!dh3jY9tB^%8_ZnF^pG;`QI2|%l{QI@T98s$+)Yn4`5t1Yj#dMl6dd{@vR z4u5>Vuf_+b`sr8E-fk<^R(B`6+lqC#>3l2aCWV`5+`Y!Bs3O53l7kqAOZ|wem&$AI zqPMYnt>tR?|HHyK&PIk={VTY2NZ&|i1D*y8*S{%4dYHVsYo6|!$Tl*=x>LRE)8GdE z@uXY|?84VNh$#k2bKqvu=|;Tu-)m2W;Iqxs-rKY@&6f?dNc)jVNFp+SOv?>G+2?0= M&do=MR-ahlH#JTN0{{R3 diff --git a/src/rel/apple/SNDSEQ#FE1000 b/src/rel/apple/SNDSEQ#FE1000 index d7fc4acde576a2d3eb5f1af17761569b0d24e9ad..4dbff29998be6af13f3f977bacf0e3c7169d856b 100644 GIT binary patch delta 292 zcmY+;v5LY#5XSLDB-u1_opzR5SXlZ9a!+vOwmyK6&L$B{QwUdDNFY|qWw>@#kRS*X zeFb&btt*L=6Ce}o7K-Fz>pMP;Uh7vZRn%Z#q?6F9W5;u}b zIg)@`v7FaZ$lyTfx=6ok{oE{tS(+idWdsfkQ7Jw=rvmV1XCVu`bOm{F%0SJNf97kw zusS=ejj-Bki&)Oo)n4c=L%sFza`UuqS)yI~xHjXnX$4+b{OZuJZklI-oLbCZI-OV& X_D9BpxC~1dmn=oriGZKI-KabPZU3j$ delta 292 zcmew&|3!Yn_WFdC3{wLVwkEvr&`79Ah)CF)+*-ahxV2&d1q>V&8+|O6l>-g?3pC?9(6|#9 Vn4b9p&3XYe>j}_+&1V_a`2Z?0k-Y!_ diff --git a/src/rel/apple/SOS#FE1000 b/src/rel/apple/SOS#FE1000 index 4a2b000487aa7a983c3bd66e22db3773487d8bb4..3df3d0e24fcf93b345e380acbcc5250eb0ae1af6 100644 GIT binary patch delta 157 zcmW;DJqp4w7=U3Z<@<4Ta&hwz;t9NkQ=x-*aQeV8LI=kT<^UPGcQJI#B}@V$#uL=k z<%M^6I_N-c&t9M(1ohIwD0G<1|3(XvZo38qR29(B0}MY=ZSFDGA?byMD~-Mm9MDDo xb;-Z;-o%E4OlnwoU8d+VDCpRso=nVDNVB{Qldm1G+>Ad3zgpo|=tQCQr?p~+MXFD$&jhAtzDxa%`YiQ- z>N`PpN%;qsXB7(=Hu_BTJ8^;Kng282W91h<9;>+U_Jh^Z@>IW8zoiwa{;mEJKn_qh zkmK9xd(8is?}GnJ%RewZs{rZjIPm`h%Q1hUV<64%ftp`uwEAbX`sMg-+#1gW09TDp Ag8%>k diff --git a/src/rel/apple/SOS.INTERP#050000 b/src/rel/apple/SOS.INTERP#050000 index 33291d985020e8caec34b7064c4527066e5980a0..cc3c3795853088ea1801f23a3d03996831d32c06 100644 GIT binary patch delta 2377 zcmZuzO>7fK6kZau-c3`w9BfQ;AgTl+DiW?LqV&>RQ6h2WP^kxVaFtZ5#KpbzutCaD zAFyOMSvBoxkyzxVwDp#ZdVs{Ufl$Y4$ZU|qfl9TL;2jH5Ha0e;7x&HD2??qX>zVKU zzxn3p@#)8>(}N#XQ!JbchEsAlwHZ!T!lr;WP}$VcCaRbhkZ2B~pe{^FfXJ4ZkqY!x zHCUAmIrHg{symLD-fOw3MmTA?sKGz=4(9uix?(Dlc=T~ z9Q;|Y*08O}3`WIjjRr!FcRcJ2+sX8+6YdFSxFu?^CP~W(#!ZUckzp>S8|>N^cc@@z zOl>0<+hc9SOhI$bvd`UIzh+~aa5M*#gdL{CBuQP(zP5Glxd4&QdBWfw{cJ7Q=!^_k zgD4s?YSGG$EZxgf+9UZLBrQsNS_B3d2J2*<`a?Cc6G^in0CsrM4z{6ae@^>`$$k~H zeV(_aeIDAvT{vfagEL(NC*)5JSiET#MAoEcjeW}KR&X1zY_^zpX* zt2us=T_t7Co^i;eE~F16XY7%hl=b?ty*&BFS5A`t(`^WLLN>rOM7$oetvTJKLnOon z;x1Igjz+QF$r!Y0ABZSSRZl2F=lReR%=Rf$C~Bl&)ivIp*+{&O>gk?pLvI(N+eHp@ z8P_fPO1rb!5w2yA8TvLcM#OShB&yKYt@eQ=W8y(+7n;Nm|nT;fA)0Yr3%ll5X{M9_?XSb-%w3YXQ z0P_r6gb$|w>OG>Cxn8{D!(czPl`UF6rV(hlC+xurAlL=91zuqO>Oyfh5CF*K9|jDD z#6eQ9+^z{v3Okqbj8myQ#&%21dtwJ{k z?a7)u>DoXgZ!8&P4<)Ej1E!Z2IxhC454JA1bs>wHjWhlaftC zyF|kjz-=FV%6GI+$d9p80`@h@#elLNttoDlay?9%_QgQ-p7JPKQWjn#%CFHS*(k-WmfaF8*)TB7tG z&XDplg_>j$OxO`b+V{vz1Y!JPM0B)*j*fg=5&~FRB3Mz0;S)B$+8=%HT^IdM~60 zf=IlKHaJ1i<~S;kqspzS`0W9e&XLr+*((ECNGNqQE5J{OtvW+u5{A?$-$~1A@Oo>N*YJ<^(Us-u{jyTYe>S2NS>o!pha{66K^1bos6_jy+Z{r zn5&OqJLgqp+FU2}Z>BO9V-R5_H1A!+51=Ir&3yV4UIjOKB;yB2#0w}mw*v0wVJrAI zOQ0%OgX=4Fdwrfhi{X_7*Pc&+egr1mWIh2#_vQORy^UAAp4L1!^z|xYc63{dE((H*#NJ>Ab$~mJ9pX^tUl QHpE|p_=~q5y%p&H51nFhBLDyZ delta 2377 zcmZuzPi)gx7&mPxZP#t)kPy}b)g%zrkjOMqb(h_STFJ4WJ8_t_!gHrg?W9TRpWswG zxJZ302O=e-*4R!)!YF2Ji$|Y!08L0xmPXU`*pzZ$(zG3d5n`Bxgt1HZJtr+KS`N

}xJNWj=Oe&m-g)>SxGZ)UxgdKs*l7wTCIWpsDL~;g6%o3JlKonQX z$wl_8600b-l6(JaL!TlktJBppwQ$PS=I;+{!)iMF?0|kCW$R^Zr|Kx%OJH5cL?0RETK1QB zVV(yRsWxUbiB8qACP_JhsU1yyq!;>4mExpkY7`~aFdjx}cF$BV%uA01$Rzo~;5F;$ zLZQ}L*}4f?Ok^)a|J=}JJ9$Z4G(Ul+fmufb!GgkK9j)VFX+$IAr)X8LVkzS zG_`ioAr#_@?oFsfH4{^{RWVqzK2Tv04PPk15swFlQe;2^K!Up1tvww8%F%sM^J`=#;zcimOxdCP(7`ZQO!HS^R1WlPYsGOHe zn~4A*I)9{q!B9A8imu*v;YCsHl;UwJwbxW_7>eKB0vo9H-%3bvE^%Q#x)-dU14W7g zv=h*Cmaw@6+l;nU&4aXkppzH24626~4CsO4Q*tZBmh!<@=e{~rvE0(OTMo>F!Ti5@ zumfd{4Nz28S!k1J6a)A;03Yx-Iw0gbR4W7f>L}4Au1D{S_o9s3QB+qGUD2E3ooHG7 z@i`)XA6*r1L@#f6oppB(7)s~_d!<;6Rv@!Sxl|1}2c+SgOMO!d!!hXUz@sW`2oR~3 zK9dT=LFUmDWz23;rHuTa*|nBSu?;=HKKk0t!=**~{7=_IoYmRXK!Z951m&^d>zuK3l zD4k1C?7@@OtWGEo6p?s>%yNQ~xhayEA~RPi-JkC;@CwSjmOnF)hk`PD^8)-VcvY7X z?xAp+Qbbaq8TD4MN3~H1dOCS&>fqo>p@&GPV@vWBQ7$GOspWGJ(@7%JaiXkXzpH^P zfg*n(LbaT{j{R4P{;ooGgsKI-AC)Wn;%$lTDfShfxH9ll&QAr2gK>eUD_3No zXW^;S5toUa{iUK5j1o}cA!nKgEyQ2}RB|P;6TTn(fubuFheW^Il~#3scM;x2C@cGW z1F>ICxJ~ee3-3f)8)W<8BSV7sPz1*^V!bw)+c7Y7x+8IkNZC7;82fFRvzuoE_jo`m z|6M3oDn^nY64{lK?-6BcNMzBxD+4x3bXQJ}m(^@P+#3V%#i12Kb_)1p>p9t$rn?~U cRS5ipxA`?7o0_edD&(Jp{Nq>dywuhIANf74J^%m! diff --git a/src/rel/apple/SPIPORT#FE1000 b/src/rel/apple/SPIPORT#FE1000 index 330e74ec1ba4283d0bdc1333a95c7c87520ef503..9bf38d0695589c01a3505bf6ea9f95ec1758621d 100644 GIT binary patch delta 279 zcmdnNwS#MdBIAXLhRGAH_~l;lB_8OFKA<)Af<^*I#agoi9-8&NW(Rts4lH2UdSS90 zqx8i4Q4{YAO}1p@7Qc`Ilme;Sda;#b>%msetrtEpeLFBYn$bz0tO2`eBirNxCdhh}}R*@51u0}B|oCQO!N zl%9A$YT|vN$(D@V;t3f*DUiCYiLHKH16%#KCVXJ}7BD%Q(MjL$#092j{?`&NY`Ye4 zVbco~(@>Q!U;vsv`2nN#wh9Ju)!ZptaYM%W9$r>M^HNFsQz;4>;Gr54ta&j({ xiaAi{GasO(zCcU+f%>{JEJf9PYZ1o+2B7{2OkzA>eZPPjuU!k+%*1TQ1OQI;e?0&I diff --git a/src/rel/apple/UTHERNET#FE1000 b/src/rel/apple/UTHERNET#FE1000 index ddf832fe50bdb5b7352958405acf9b2e59ebf3f1..26cc722fb0c8ad53db68dc3e5e3f0fa8179753d9 100644 GIT binary patch delta 147 zcmdnRv5RAZM*W3eh67s<0EvWCYZ(qqy|9vDDvSx@A4pihu=Qdq+t!1v>|qDCUdYO1 zn0ny@%SwrF2R8iP$OhDR0zzJ3dd7b3!i6{24qSNg0-}insEHFp6VTL&948>;1tyMX MoDf|b*LO1m0D@Fci2wiq delta 147 zcmdnRv5RAZMtwpr!-1^|0ZpCgcLG9QVB&b@ L57D)8eK#`zHo{1y diff --git a/src/rel/apple/UTHERNET2#FE1000 b/src/rel/apple/UTHERNET2#FE1000 index 249082503a3d9f72f7c099acfe217529d59f9e57..8e5cfb72669ddff596fa046e8c72f316db0e89a8 100644 GIT binary patch delta 139 zcmew;_fc*_YyE{S2c{mFav@>sfnJ6KTQ2~K1PFO*EyIDS7gjP%J&*uq9su(bwq9&y z+j_8-eanRpEDIRE9oWbQ)N Pn9>+3`ZlvL=JEjmm}pGX delta 139 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 From ac78dad38f6c1978b2e39c8a7f3c1e00c7e356f7 Mon Sep 17 00:00:00 2001 From: Dave Schmenk Date: Wed, 21 Feb 2018 07:25:22 -0800 Subject: [PATCH 10/28] Seed Commodore 64 code --- src/vmsrc/c64/cmd.pla | 1209 ++++++++++++++++++++++++++++++++++++++ src/vmsrc/c64/plvmc64.s | 929 +++++++++++++++++++++++++++++ src/vmsrc/c64/plvmzp.inc | 29 + 3 files changed, 2167 insertions(+) create mode 100755 src/vmsrc/c64/cmd.pla create mode 100644 src/vmsrc/c64/plvmc64.s create mode 100755 src/vmsrc/c64/plvmzp.inc diff --git a/src/vmsrc/c64/cmd.pla b/src/vmsrc/c64/cmd.pla new file mode 100755 index 0000000..9688a77 --- /dev/null +++ b/src/vmsrc/c64/cmd.pla @@ -0,0 +1,1209 @@ +const RELADDR = $1000 +const inbuff = $200 +const freemem = $0006 +// +// System flags: memory allocator screen holes. +// +const restxt1 = $0001 +const restxt2 = $0002 +const resxtxt1 = $0004 +const resxtxt2 = $0008 +const reshgr1 = $0010 +const reshgr2 = $0020 +const resxhgr1 = $0040 +const resxhgr2 = $0080 +// +// Module don't free memory +// +const modkeep = $1000 +const modinitkeep = $2000 +// +// CFFA1 addresses. +// +const CFFADest = $00 +const CFFAFileName = $02 +const CFFAOldName = $04 +const CFFAFileType = $06 +const CFFAAuxType = $07 +const CFFAFileSize = $09 +const CFFAEntryPtr = $0B +// +// Pedefined functions. +// +predef syscall(cmd,null)#1, call(addr,areg,xreg,yreg,status)#1 +predef crout()#0, cout(c)#0, prstr(s)#0, print(i)#0, prbyte(b)#0, prword(w)#0 +predef cin()#1, rdstr(p)#1, toupper(c)#1, strcpy(dst,src)#1, strcat(dst,src)#1 +predef markheap()#1, allocheap(size)#1, allocalignheap(size, pow2, freeaddr), releaseheap(newheap)#1, availheap()#1 +predef memset(addr,value,size)#0, memcpy(dst,src,size)#0 +predef uword_isgt(a,b)#1, uword_isge(a,b)#1, uword_islt(a,b)#1, uword_isle(a,b)#1 +predef sext(a)#1, divmod(a,b)#2, execmod(modfile)#1 +// +// Exported CMDSYS table +// +word version = $0100 // 01.00 +word syspath +word syscmdln +word = @execmod +word systemflags = 0 +word heap +word symtbl, lastsym +byte perr, refauto +// +// String pool. +// +byte autorun[] = "AUTORUN" +byte verstr[] = "\nPLASMA " +byte freestr[] = "MEM FREE:$" +byte errorstr[] = "ERR:$" +byte prompt[] = "PLASMA" +byte okstr[] = "OK" +byte huhstr[] = "?\n" +byte hexchar[] = '0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F' +// +// Exported Machine ID. +// +byte machid = $08 // Apple 1 (NA in ProDOS Tech Ref) +// +// Command line pointer +// +word cmdptr = @hexchar // make it point to a zero +// +// Standard Library exported functions. +// +byte syslibstr[] = "CMDSYS" +byte machidstr[] = "MACHID" +byte putcstr[] = "PUTC" +byte putlnstr[] = "PUTLN" +byte putsstr[] = "PUTS" +byte putistr[] = "PUTI" +byte putbstr[] = "PUTB" +byte putwstr[] = "PUTH" +byte getcstr[] = "GETC" +byte getsstr[] = "GETS" +byte toupstr[] = "TOUPPER" +byte strcpystr[] = "STRCPY" +byte strcatstr[] = "STRCAT" +byte sysstr[] = "SYSCALL" +byte callstr[] = "CALL" +byte hpmarkstr[] = "HEAPMARK" +byte hpalignstr[] = "HEAPALLOCALIGN" +byte hpallocstr[] = "HEAPALLOC" +byte hprelstr[] = "HEAPRELEASE" +byte hpavlstr[] = "HEAPAVAIL" +byte memsetstr[] = "MEMSET" +byte memcpystr[] = "MEMCPY" +byte uisgtstr[] = "ISUGT" +byte uisgestr[] = "ISUGE" +byte uisltstr[] = "ISULT" +byte uislestr[] = "ISULE" +byte sextstr[] = "SEXT" +byte divmodstr[] = "DIVMOD" +word exports[] = @syslibstr, @version +word = @sysstr, @syscall +word = @callstr, @call +word = @putcstr, @cout +word = @putlnstr, @crout +word = @putsstr, @prstr +word = @putistr, @print +word = @putbstr, @prbyte +word = @putwstr, @prword +word = @getcstr, @cin +word = @getsstr, @rdstr +word = @toupstr, @toupper +word = @hpmarkstr, @markheap +word = @hpallocstr,@allocheap +word = @hpalignstr,@allocalignheap +word = @hprelstr, @releaseheap +word = @hpavlstr, @availheap +word = @memsetstr, @memset +word = @memcpystr, @memcpy +word = @strcpystr, @strcpy +word = @strcatstr, @strcat +word = @uisgtstr, @uword_isgt +word = @uisgestr, @uword_isge +word = @uisltstr, @uword_islt +word = @uislestr, @uword_isle +word = @sextstr, @sext +word = @divmodstr, @divmod +word = @machidstr, @machid +word = 0 +word syslibsym = @exports +// +// Utility functions +// +asm saveX#0 + STX XREG+1 +end +asm restoreX#0 +XREG LDX #$00 + RTS +end +// +// CALL API ENTRYPOINT +// SYSCALL(CMD, 0) +// +asm syscall(cmd, null)#1 + LDA ESTKL,X + STX ESP + TAX + JSR $900C + LDX ESP + INX + LDY #$00 + STA ESTKL,X + STY ESTKH,X + RTS +end +// +// CALL 6502 ROUTINE +// CALL(ADDR, AREG, XREG, YREG, STATUS) +// +asm call(addr,areg,xreg,yreg,sstatus)#1 + PHP + LDA ESTKL+4,X + STA CALL6502+1 + LDA ESTKH+4,X + STA CALL6502+2 + LDA ESTKL,X + PHA + LDY ESTKL+1,X + LDA ESTKL+3,X + PHA + LDA ESTKL+2,X + INX + INX + INX + INX + STX ESP + TAX + PLA + PLP +CALL6502 JSR $FFFF + PHP + STA REGVALS+0 + STX REGVALS+1 + STY REGVALS+2 + PLA + STA REGVALS+3 + LDX ESP + LDA #REGVALS + STA ESTKL,X + STY ESTKH,X + PLP + RTS +REGVALS !FILL 4 +end +// +// QUIT TO MONITOR +// +asm quit()#0 + JMP $9000 +end +// +// SET MEMORY TO VALUE +// MEMSET(ADDR, VALUE, SIZE) +// With optimizations from Peter Ferrie +// +asm memset(addr,value,size)#0 + LDA ESTKL+2,X + STA DSTL + LDA ESTKH+2,X + STA DSTH + LDY ESTKL,X + BEQ + + INC ESTKH,X + LDY #$00 ++ LDA ESTKH,X + BEQ SETMEX +SETMLPL CLC + LDA ESTKL+1,X +SETMLPH STA (DST),Y + DEC ESTKL,X + BEQ ++ +- INY + BEQ + +-- BCS SETMLPL + SEC + LDA ESTKH+1,X + BCS SETMLPH ++ INC DSTH + BNE -- +++ DEC ESTKH,X + BNE - +SETMEX INX + INX + INX + RTS +end +// +// COPY MEMORY +// MEMCPY(DSTADDR, SRCADDR, SIZE) +// +asm memcpy(dst,src,size)#0 + INX + INX + INX + LDA ESTKL-3,X + ORA ESTKH-3,X + BEQ CPYMEX + LDA ESTKL-2,X + CMP ESTKL-1,X + LDA ESTKH-2,X + SBC ESTKH-1,X + BCC REVCPY +; +; FORWARD COPY +; + LDA ESTKL-1,X + STA DSTL + LDA ESTKH-1,X + STA DSTH + LDA ESTKL-2,X + STA SRCL + LDA ESTKH-2,X + STA SRCH + LDY ESTKL-3,X + BEQ FORCPYLP + INC ESTKH-3,X + LDY #$00 +FORCPYLP LDA (SRC),Y + STA (DST),Y + INY + BNE + + INC DSTH + INC SRCH ++ DEC ESTKL-3,X + BNE FORCPYLP + DEC ESTKH-3,X + BNE FORCPYLP + RTS +; +; REVERSE COPY +; +REVCPY ;CLC + LDA ESTKL-3,X + ADC ESTKL-1,X + STA DSTL + LDA ESTKH-3,X + ADC ESTKH-1,X + STA DSTH + CLC + LDA ESTKL-3,X + ADC ESTKL-2,X + STA SRCL + LDA ESTKH-3,X + ADC ESTKH-2,X + STA SRCH + DEC DSTH + DEC SRCH + LDY #$FF + LDA ESTKL-3,X + BEQ REVCPYLP + INC ESTKH-3,X +REVCPYLP LDA (SRC),Y + STA (DST),Y + DEY + CPY #$FF + BNE + + DEC DSTH + DEC SRCH ++ DEC ESTKL-3,X + BNE REVCPYLP + DEC ESTKH-3,X + BNE REVCPYLP +CPYMEX RTS +end +// +// Unsigned word comparisons. +// +asm uword_isge(a,b)#1 + LDA ESTKL+1,X + CMP ESTKL,X + LDA ESTKH+1,X + SBC ESTKH,X + LDA #$FF + ADC #$00 + EOR #$FF + STA ESTKL+1,X + STA ESTKH+1,X + INX + RTS +end +asm uword_isle(a,b)#1 + LDA ESTKL,X + CMP ESTKL+1,X + LDA ESTKH,X + SBC ESTKH+1,X + LDA #$FF + ADC #$00 + EOR #$FF + STA ESTKL+1,X + STA ESTKH+1,X + INX + RTS +end +asm uword_isgt(a,b)#1 + LDA ESTKL,X + CMP ESTKL+1,X + LDA ESTKH,X + SBC ESTKH+1,X + LDA #$FF + ADC #$00 + STA ESTKL+1,X + STA ESTKH+1,X + INX + RTS +end +asm uword_islt(a,b)#1 + LDA ESTKL+1,X + CMP ESTKL,X + LDA ESTKH+1,X + SBC ESTKH,X + LDA #$FF + ADC #$00 + STA ESTKL+1,X + STA ESTKH+1,X + INX + RTS +end +asm divmod(a,b)#2 + JSR INTERP ; CALL DINTERP + !BYTE $36, $5C ; DIVMOD, RET +end +asm sext(a)#1 + LDY #$00 + LDA ESTKL,X + BPL + + DEY ++ STY ESTKH,X + RTS +end +// +// Addresses of internal routines. +// +asm interp()#1 + DEX + LDA #IINTERP + STA ESTKH,X + RTS +end +// +// A DCI string is one that has the high bit set for every character except the last. +// More efficient than C or Pascal strings. +// +//def dcitos(dci, str) +// byte len, c +// len = 0 +// repeat +// c = (dci).[len] +// len = len + 1 +// (str).[len] = c & $7F +// until !(c & $80) +// ^str = len +// return len +//end +asm dcitos(dci, str)#1 + LDA ESTKL,X + STA DSTL + LDA ESTKH,X + STA DSTH + LDA ESTKL+1,X + STA SRCL + LDA ESTKH+1,X + STA SRCH + LDY #$00 +- LDA (SRC),Y + CMP #$80 + AND #$7F + INY + STA (DST),Y + BCS - + TYA + LDY #$00 + STA (DST),Y + INX + STA ESTKL,X + STY ESTKH,X + RTS +end +//def stodci(str, dci) +// byte len, c +// len = ^str +// if len == 0 +// return +// fin +// c = toupper((str).[len]) & $7F +// len = len - 1 +// (dci).[len] = c +// while len +// c = toupper((str).[len]) | $80 +// len = len - 1 +// (dci).[len] = c +// loop +// return ^str +//end +asm stodci(str, dci)#1 + LDA ESTKL,X + STA DSTL + LDA ESTKH,X + STA DSTH + LDA ESTKL+1,X + STA SRCL + LDA ESTKH+1,X + STA SRCH + INX + LDY #$00 + LDA (SRC),Y + BEQ ++ + TAY + LDA (SRC),Y + JSR TOUPR + BNE + +- LDA (SRC),Y + JSR TOUPR + ORA #$80 ++ DEY + STA (DST),Y + BNE - + LDA (SRC),Y +++ STA ESTKL,X + STY ESTKH,X + RTS +end +asm toupper(c)#1 + LDA ESTKL,X +TOUPR AND #$7F + CMP #'a' + BCC + + CMP #'z'+1 + BCS + + SBC #$1F ++ STA ESTKL,X + RTS +end +// +// Module symbols are entered into the symbol table +// pre-pended with a '#' to differentiate them +// from normal symbols. +// +// +// Lookup routines. +// +//def lookuptbl(dci, tbl) +// word match +// while ^tbl +// match = dci +// while ^tbl == ^match +// if !(^tbl & $80) +// return (tbl):1 +// fin +// tbl = tbl + 1 +// match = match + 1 +// loop +// while (^tbl & $80) +// tbl = tbl + 1 +// loop +// tbl = tbl + 3 +// loop +// return 0 +asm lookuptbl(dci, tbl)#1 + LDA ESTKL,X + STA DSTL + LDA ESTKH,X + STA DSTH + INX + LDA ESTKL,X + STA SRCL + LDA ESTKH,X + STA SRCH +-- LDY #$00 +- LDA (DST),Y + BEQ + + CMP (SRC),Y + BNE ++ + INY + ASL + BCS - + LDA (DST),Y + STA ESTKL,X ; MATCH + INY + LDA (DST),Y + STA ESTKH,X + RTS ++ STA ESTKL,X ; NO MATCH + STA ESTKH,X + RTS +++ +- LDA (DST),Y ; NEXT ENTRY + BPL + + INY + BNE - ++ TYA + CLC + ADC #$03 + ADC DSTL + STA DSTL + BCC -- + INC DSTH + BNE -- +end +// def lookupidx(esd, index) +// word sym +// while ^esd +// sym = esd +// esd = sym + dcitos(sym, @str) +// if esd->0 & $10 and esd->1 == index +// return sym +// fin +// esd = esd + 3 +// loop +//end +asm lookupidx(esd, index)#1 + LDA ESTKL,X + STA TMPL + INX +--- LDA ESTKH,X + STA SRCH + LDA ESTKL,X +-- STA SRCL + LDY #$00 +- LDA (SRC),Y + BPL + + INY + BNE - ++ BEQ ++ ; END OF ESD + INY + LDA (SRC),Y + INY + AND #$10 ; EXTERN FLAG? + BEQ + + LDA (SRC),Y + CMP TMPL + BEQ +++ ; MATCH ++ INY + TYA + SEC + ADC SRCL + STA ESTKL,X ; SYM PTRL + BCC -- + INC ESTKH,X ; SYM PTRH + BNE --- +++ STA ESTKL,X ; END OF ESD + STA ESTKH,X ++++ RTS +end +//def lookupdef(addr, deftbl)#1 +// while deftbl->0 == $20 +// if deftbl=>3 == addr +// return deftbl +// fin +// deftbl = deftbl + 5 +// loop +// return 0 +//end +asm lookupdef(addr, deftbl)#1 + LDA ESTKH,X + STA SRCH + LDA ESTKL,X + STA SRCL + INX +- LDY #$00 + LDA (SRC),Y + CMP #$20 ; JSR OPCODE? + BNE ++ + LDY #$03 + LDA (SRC),Y + CMP ESTKL,X + BNE + + INY + LDA (SRC),Y + CMP ESTKH,X + BNE + + LDA SRCL ; MATCH + STA ESTKL,X + LDA SRCH + STA ESTKH,X + RTS ++ LDA #$05 + CLC + ADC SRCL + STA SRCL + BCC - + INC SRCH + BNE - +++ STY ESTKL,X + STY ESTKH,X + RTS +end +// +// Reloc internal data +// +//def reloc(modfix, modofst, bytecode, rld)#3 +// word addr, fixup +// while ^rld +// if ^rld & $10 // EXTERN reference. +// return rld, addr, fixup +// fin +// addr = rld=>1 + modfix +// fixup = *addr + modofst +// if uword_isge(fixup, bytecode) // Bytecode address. +// return rld, addr, fixup +// fin +// *addr = fixup +// rld = rld + 4 +// loop +// return rld, addr, fixup +//end +asm reloc(modfix, modofst, bytecode, rld)#3 + LDA ESTKL,X + STA SRCL + LDA ESTKH,X + STA SRCH + LDY #$00 +- LDA (SRC),Y + BEQ RLDEX ; END OF RLD + PHA + INY + LDA (SRC),Y + INY + CLC + ADC ESTKL+3,X ; ADDR=ENTRY=>1+MODFIX + STA DSTL + LDA (SRC),Y + ADC ESTKH+3,X + STA DSTH + PLA + AND #$10 ; EXTERN REF - EXIT + BNE RLDEX + TAY ; FIXUP=*ADDR+MODOFST + LDA (DST),Y + INY + CLC + ADC ESTKL+2,X + STA TMPL + LDA (DST),Y + ADC ESTKH+2,X + CMP ESTKH+1,X ; FIXUP >= BYTECODE? + BCC + + STA TMPH + BNE RLDEX ; YEP, EXIT + LDA TMPL + CMP ESTKL+1,X + BCS RLDEX ; YEP, EXIT + LDA TMPH ++ STA (DST),Y ; *ADDR=FIXUP + DEY + LDA TMPL + STA (DST),Y + LDA SRCL ; NEXT ENTRY +; CLC + ADC #$04 + STA SRCL + BCC - + INC SRCH + BNE - +RLDEX INX + LDA TMPL + STA ESTKL,X + LDA TMPH + STA ESTKH,X + LDA DSTL + STA ESTKL+1,X + LDA DSTH + STA ESTKH+1,X + LDA SRCL + STA ESTKL+2,X + LDA SRCH + STA ESTKH+2,X + RTS +end +// +// CONSOLE I/O +// +asm cout(c)#0 + LDA ESTKL,X + JSR TOUPR + ORA #$80 + JMP $FFEF +end +asm cin()#1 + DEX +- LDA $D011 + BPL - + LDA $D010 + AND #$7F + STA ESTKL,X + LDA #$00 + STA ESTKH,X + RTS +end +def crout()#0 + cout($0D) +end +def prstr(str)#0 + byte i + for i = 1 to ^str + cout(^(str + i)) + next +end +def print(i)#0 + if i < 0; cout('-'); i = -i; fin + if i >= 10; print(i / 10); fin + cout(i % 10 + '0') +end +def rdstr(prompt)#1 + byte ch, maxlen + maxlen = 0 + inbuff.0 = 0 + cout(prompt) + repeat + ch = cin + when ch + is $15 // right arrow + if ^inbuff < maxlen //inbuff.0 < maxlen + inbuff.0++ + ch = inbuff[inbuff.0] + cout(ch) + fin + break + is $08 // left arrow + if inbuff.0 + cout('\\') + cout(inbuff[inbuff.0]) + inbuff.0-- + fin + break + is $04 // ctrl-d + if inbuff.0 + cout('#') + cout(inbuff[inbuff.0]) + memcpy(inbuff + inbuff.0, inbuff + inbuff.0 + 1, maxlen - inbuff.0) + maxlen-- + inbuff.0-- + fin + break + is $0C // ctrl-l + crout + prstr(inbuff) + break + is $0D // return + is $18 // ctrl-x + crout + inbuff.0 = 0 + break + is $9B // escape + inbuff.0 = 0 + ch = $0D + break + otherwise + if ch >= ' ' + cout(ch) + inbuff.0++ + inbuff[inbuff.0] = ch + if inbuff.0 > maxlen + maxlen = inbuff.0 + fin + fin + wend + until ch == $0D or inbuff.0 == $7F + cout($0D) + return inbuff +end +def prbyte(v)#0 + cout(hexchar[(v >> 4) & $0F]) + cout(hexchar[v & $0F]) +end +def prword(v)#0 + prbyte(v >> 8) + prbyte(v) +end +// +// String routines. +// +def strcpy(dst, src)#1 + memcpy(dst+1, src+1, ^src) + ^dst = ^src + return dst +end +def strcat(dst, src)#1 + memcpy(dst + ^dst + 1, src + 1, ^src) + ^dst = ^dst + ^src + return dst +end +// +// CFFA1 routines +// FILE I/O +// +//def opendir +// perr = syscall($10, 0) +// return perr +//end +//def readdir +// perr = syscall($12, 0) +// return *CFFAEntryPtr +//end +def finddirentry(filename)#1 + *CFFAFileName = filename + perr = syscall($14, 0) + return *CFFAEntryPtr +end +def readfile(filename, buffer)#1 + *CFFADest = buffer + *CFFAFileName = filename + perr = syscall($22, 0) + return perr +end +// +// Heap routines. +// +def availheap()#1 + byte fp + return @fp - heap +end +def allocheap(size)#1 + word addr + addr = heap + heap = heap + size + if uword_isge(heap, @addr) + return 0 + fin + return addr +end +def allocalignheap(size, pow2, freeaddr)#1 + word align, addr + if freeaddr + *freeaddr = heap + fin + align = (1 << pow2) - 1 + addr = (heap | align) + 1 + heap = addr + size + if uword_isge(heap, @addr) + return 0 + fin + return addr +end +def markheap()#1 + return heap +end +def releaseheap(newheap)#1 + heap = newheap + return @newheap - heap +end +// +// Symbol table routines. +// +def addsym(sym, addr)#0 + while ^sym & $80 + ^lastsym = ^sym + lastsym = lastsym + 1 + sym = sym + 1 + loop + lastsym->0 = ^sym + lastsym=>1 = addr + lastsym = lastsym + 3 + ^lastsym = 0 +end +// +// Module routines. +// +def lookupextern(esd, index)#1 + word sym, addr + byte str[16] + while ^esd + sym = esd + esd = sym + dcitos(sym, @str) + if esd->0 & $10 and esd->1 == index + addr = lookuptbl(sym, symtbl) + if !addr + perr = $81 + cout('?') + prstr(@str) + crout + fin + return addr + fin + esd = esd + 3 + loop + return 0 +end +def adddef(addr, deflast)#1 + word defentry + defentry = *deflast + *deflast = defentry + 5 + defentry->0 = $20 + defentry=>1 = interp + defentry=>3 = addr + defentry->5 = 0 // null out next entry + return defentry +end +def loadmod(mod)#1 + word rdlen, modsize, bytecode, defofst, defcnt, init, fixup + word addr, modaddr, modfix, modofst, modend + word deftbl, deflast + word moddep, rld, esd, sym + byte type, str[17], filename[17] + byte header[128] + // + // Read the RELocatable module header (first 128 bytes) + // + dcitos(mod, @filename) + rdlen = finddirentry(@filename)=>$15 + if perr + return -perr + fin + if rdlen > 0 + readfile(@filename, heap) + memcpy(@header, heap, 128) + modsize = header:0 + moddep = @header.1 + defofst = modsize + RELADDR + init = 0 + if rdlen > 4 and heap=>2 == $6502 // magic number + // + // This is an EXTended RELocatable (data+bytecode) module. + // + defofst = header:6 + defcnt = header:8 + init = header:10 + moddep = @header.12 + // + // Load module dependencies. + // + while ^moddep + if !lookuptbl(moddep, symtbl) + if loadmod(moddep) < 0 + return -perr + fin + fin + moddep = moddep + dcitos(moddep, @str) + loop + // + // Init def table. + // + deftbl = allocheap(defcnt * 5 + 1) + deflast = deftbl + ^deflast = 0 + // + // Re-read file + // + readfile(@filename, heap) + fin + // + // Alloc heap space for relocated module (data + bytecode). + // + moddep = moddep + 1 - @header + heap + modfix = moddep - (heap + 2) // Adjust to skip header + modsize = modsize - modfix + rdlen = rdlen - modfix - 2 + modaddr = allocheap(modsize) + memcpy(modaddr, moddep, rdlen) + // + // Add module to symbol table. + // + addsym(mod, modaddr) + // + // Apply all fixups and symbol import/export. + // + modfix = modaddr - modfix + modofst = modfix - RELADDR + modend = modaddr + modsize + bytecode = defofst + modofst + defofst = bytecode - defofst + rld = modend // Re-Locatable Directory + esd = rld // Extern+Entry Symbol Directory + while ^esd // Scan to end of ESD + esd = esd + 4 + loop + esd = esd + 1 + // + // Run through the DeFinition Dictionary. + // + while ^rld == $02 + // + // This is a bytcode def entry - add it to the def directory. + // + adddef(rld=>1 + defofst, @deflast) + rld = rld + 4 + loop + // + // Run through the Re-Location Dictionary. + // + while ^rld + rld, addr, fixup = reloc(modfix, modofst, bytecode, rld) + if ^rld + *addr = ^rld & $10 ?? *addr + lookupextern(esd, rld->3) :: lookupdef(fixup + defofst, deftbl) + rld = rld + 4 + fin + loop + // + // Run through the External/Entry Symbol Directory. + // + while ^esd + sym = esd + esd = esd + dcitos(esd, @str) + if ^esd & $08 + // + // EXPORT symbol - add it to the global symbol table. + // + addr = esd=>1 + modofst + if uword_isge(addr, bytecode) + // + // Use the def directory address for bytecode. + // + addr = lookupdef(addr + defofst, deftbl) + fin + addsym(sym, addr) + fin + esd = esd + 3 + loop + fin + if perr + return -perr + fin + // + // Free up the end-of-module in main memory. + // + releaseheap(modend) + // + // Call init routine if it exists. + // + fixup = 0 + if init + init = init - defofst + bytecode + fixup = adddef(init, @deflast)() + if fixup < 0 + perr = -fixup + fin + if !(systemflags & modinitkeep) + releaseheap(init) + fin + fin + return fixup | (systemflags & modkeep) +end +// +// Command mode +// +def stripchars(strptr)#1 + while ^strptr and ^(strptr + 1) <> ' ' + memcpy(strptr + 1, strptr + 2, ^strptr) + ^strptr-- + loop + return ^strptr +end +def stripspaces(strptr)#0 + while ^strptr and ^(strptr + ^strptr) <= ' ' + ^strptr-- + loop + while ^strptr and ^(strptr + 1) <= ' ' + memcpy(strptr + 1, strptr + 2, ^strptr) + ^strptr-- + loop +end +def striptrail(strptr)#0 + byte i + + for i = 1 to ^strptr + if (strptr)[i] == ' ' + ^strptr = i - 1 + return + fin + next +end +def parsecmd(strptr)#1 + byte cmd + + cmd = 0 + stripspaces(strptr) + if ^strptr + cmd = ^(strptr + 1) + memcpy(strptr + 1, strptr + 2, ^strptr) + ^strptr-- + fin + stripspaces(strptr) + return cmd +end +def execmod(modfile)#1 + byte moddci[17] + word saveheap, savesym, saveflags + + perr = 1 + if stodci(modfile, @moddci) + saveheap = heap + savesym = lastsym + saveflags = systemflags + if loadmod(@moddci) < modkeep + lastsym = savesym + heap = saveheap + fin + ^lastsym = 0 + systemflags = saveflags + fin + return -perr +end +// +// Get heap start. +// +heap = *freemem +// +// Print PLASMA version +// +prstr(@verstr); prbyte(version.1); cout('.'); prbyte(version.0); crout +// +// Init symbol table. +// +symtbl = allocheap($200) +lastsym = symtbl +^lastsym = 0 +while *syslibsym + stodci(syslibsym=>0, heap) + addsym(heap, syslibsym=>2) + syslibsym = syslibsym + 4 +loop +// +// Try to load autorun. +// +cmdptr = heap +memset(cmdptr, 0, 128) +readfile(@autorun, cmdptr + 1) +while ^(cmdptr + ^cmdptr + 1) >= ' ' + ^cmdptr++ +loop +perr = 0 +// +// Print some startup info. +// +if not ^cmdptr + prstr(@freestr) + prword(availheap) + crout +fin +// +// Handle commands. +// +while 1 + if ^cmdptr + when toupper(parsecmd(cmdptr)) + is 'Q' + quit + is '+' + execmod(cmdptr) + break + otherwise + prstr(@huhstr) + wend + if perr + prstr(@errorstr) + prbyte(perr) + perr = 0 + else + prstr(@okstr) + fin + crout() + fin + prstr(@prompt) + cmdptr = rdstr($BA) +loop +done diff --git a/src/vmsrc/c64/plvmc64.s b/src/vmsrc/c64/plvmc64.s new file mode 100644 index 0000000..ae2b0c7 --- /dev/null +++ b/src/vmsrc/c64/plvmc64.s @@ -0,0 +1,929 @@ +;********************************************************** +;* +;* COMMODORE 64 PLASMA INTERPETER +;* +;* SYSTEM ROUTINES AND LOCATIONS +;* +;********************************************************** +;* +;* VM ZERO PAGE LOCATIONS +;* + !SOURCE "vmsrc/plvmzp.inc" +DVSIGN = TMP+2 +DROP = $EF +NEXTOP = $F0 +FETCHOP = NEXTOP+1 +IP = FETCHOP+1 +IPL = IP +IPH = IPL+1 +OPIDX = FETCHOP+6 +OPPAGE = OPIDX+1 +;* +;* INTERPRETER HEADER+INITIALIZATION +;* + *= $0800 +SEGBEGIN JMP VMINIT +;* +;* SYSTEM INTERPRETER ENTRYPOINT +;* +INTERP PLA + CLC + ADC #$01 + STA IPL + PLA + ADC #$00 + STA IPH + LDY #$00 + JMP FETCHOP +;* +;* ENTER INTO USER BYTECODE INTERPRETER +;* +IINTERP PLA + STA TMPL + PLA + STA TMPH + LDY #$02 + LDA (TMP),Y + STA IPH + DEY + LDA (TMP),Y + STA IPL + DEY + JMP FETCHOP +;* +;* MUL TOS-1 BY TOS +;* +MUL STY IPY + LDY #$10 + LDA ESTKL+1,X + EOR #$FF + STA TMPL + LDA ESTKH+1,X + EOR #$FF + STA TMPH + LDA #$00 + STA ESTKL+1,X ; PRODL +; STA ESTKH+1,X ; PRODH +_MULLP LSR TMPH ; MULTPLRH + ROR TMPL ; MULTPLRL + BCS + + STA ESTKH+1,X ; PRODH + LDA ESTKL,X ; MULTPLNDL + ADC ESTKL+1,X ; PRODL + STA ESTKL+1,X + LDA ESTKH,X ; MULTPLNDH + ADC ESTKH+1,X ; PRODH ++ ASL ESTKL,X ; MULTPLNDL + ROL ESTKH,X ; MULTPLNDH + DEY + BNE _MULLP + STA ESTKH+1,X ; PRODH + LDY IPY + JMP DROP +;* +;* INCREMENT TOS +;* +INCR INC ESTKL,X + BNE + + INC ESTKH,X ++ JMP NEXTOP +;* +;* DECREMENT TOS +;* +DECR LDA ESTKL,X + BNE + + DEC ESTKH,X ++ DEC ESTKL,X + JMP NEXTOP +;* +;* BITWISE COMPLIMENT TOS +;* +COMP LDA #$FF + EOR ESTKL,X + STA ESTKL,X + LDA #$FF + EOR ESTKH,X + STA ESTKH,X + JMP NEXTOP +;* +;* OPCODE TABLE +;* + !ALIGN 255,0 +OPTBL !WORD ZERO,ADD,SUB,MUL,DIV,MOD,INCR,DECR ; 00 02 04 06 08 0A 0C 0E + !WORD NEG,COMP,BAND,IOR,XOR,SHL,SHR,IDXW ; 10 12 14 16 18 1A 1C 1E + !WORD LNOT,LOR,LAND,LA,LLA,CB,CW,CS ; 20 22 24 26 28 2A 2C 2E + !WORD DROP,DUP,NEXTOP,DIVMOD,BRGT,BRLT,BREQ,BRNE ; 30 32 34 36 38 3A 3C 3E + !WORD ISEQ,ISNE,ISGT,ISLT,ISGE,ISLE,BRFLS,BRTRU ; 40 42 44 46 48 4A 4C 4E + !WORD BRNCH,IBRNCH,CALL,ICAL,ENTER,LEAVE,RET,CFFB ; 50 52 54 56 58 5A 5C 5E + !WORD LB,LW,LLB,LLW,LAB,LAW,DLB,DLW ; 60 62 64 66 68 6A 6C 6E + !WORD SB,SW,SLB,SLW,SAB,SAW,DAB,DAW ; 70 72 74 76 78 7A 7C 7E +;* +;* DIV TOS-1 BY TOS +;* +DIV JSR _DIV + LSR DVSIGN ; SIGN(RESULT) = (SIGN(DIVIDEND) + SIGN(DIVISOR)) & 1 + BCS NEG + JMP NEXTOP +;* +;* MOD TOS-1 BY TOS +;* +MOD JSR _DIV + LDA TMPL ; REMNDRL + STA ESTKL,X + LDA TMPH ; REMNDRH + STA ESTKH,X + LDA DVSIGN ; REMAINDER IS SIGN OF DIVIDEND + BMI NEG + JMP NEXTOP +;* +;* DIVMOD TOS-1 BY TOS +;* +DIVMOD JSR _DIV + LSR DVSIGN ; SIGN(RESULT) = (SIGN(DIVIDEND) + SIGN(DIVISOR)) & 1 + BCC + + JSR _NEG ++ DEX + LDA TMPL ; REMNDRL + STA ESTKL,X + LDA TMPH ; REMNDRH + STA ESTKH,X + LDA DVSIGN ; REMAINDER IS SIGN OF DIVIDEND + BMI NEG + JMP NEXTOP +;* +;* NEGATE TOS +;* +NEG JSR _NEG + JMP NEXTOP +;* +;* INTERNAL DIVIDE ALGORITHM +;* +_NEG LDA #$00 + SEC + SBC ESTKL,X + STA ESTKL,X + LDA #$00 + SBC ESTKH,X + STA ESTKH,X + RTS +_DIV STY IPY + LDY #$11 ; #BITS+1 + LDA #$00 + STA TMPL ; REMNDRL + STA TMPH ; REMNDRH + LDA ESTKH,X + AND #$80 + STA DVSIGN + BPL + + JSR _NEG + INC DVSIGN ++ LDA ESTKH+1,X + BPL + + INX + JSR _NEG + DEX + INC DVSIGN + BNE _DIV1 ++ ORA ESTKL+1,X ; DVDNDL + BEQ _DIVEX +_DIV1 ASL ESTKL+1,X ; DVDNDL + ROL ESTKH+1,X ; DVDNDH + DEY + BCC _DIV1 +_DIVLP ROL TMPL ; REMNDRL + ROL TMPH ; REMNDRH + LDA TMPL ; REMNDRL + CMP ESTKL,X ; DVSRL + LDA TMPH ; REMNDRH + SBC ESTKH,X ; DVSRH + BCC + + STA TMPH ; REMNDRH + LDA TMPL ; REMNDRL + SBC ESTKL,X ; DVSRL + STA TMPL ; REMNDRL + SEC ++ ROL ESTKL+1,X ; DVDNDL + ROL ESTKH+1,X ; DVDNDH + DEY + BNE _DIVLP +_DIVEX INX + LDY IPY + RTS +;* +;* ADD TOS TO TOS-1 +;* +ADD LDA ESTKL,X + CLC + ADC ESTKL+1,X + STA ESTKL+1,X + LDA ESTKH,X + ADC ESTKH+1,X + STA ESTKH+1,X + JMP DROP +;* +;* SUB TOS FROM TOS-1 +;* +SUB LDA ESTKL+1,X + SEC + SBC ESTKL,X + STA ESTKL+1,X + LDA ESTKH+1,X + SBC ESTKH,X + STA ESTKH+1,X + JMP DROP +; +;* +;* SHIFT TOS LEFT BY 1, ADD TO TOS-1 +;* +IDXW LDA ESTKL,X + ASL + ROL ESTKH,X + CLC + ADC ESTKL+1,X + STA ESTKL+1,X + LDA ESTKH,X + ADC ESTKH+1,X + STA ESTKH+1,X + JMP DROP +;* +;* BITWISE AND TOS TO TOS-1 +;* +BAND LDA ESTKL+1,X + AND ESTKL,X + STA ESTKL+1,X + LDA ESTKH+1,X + AND ESTKH,X + STA ESTKH+1,X + JMP DROP +;* +;* INCLUSIVE OR TOS TO TOS-1 +;* +IOR LDA ESTKL+1,X + ORA ESTKL,X + STA ESTKL+1,X + LDA ESTKH+1,X + ORA ESTKH,X + STA ESTKH+1,X + JMP DROP +;* +;* EXLUSIVE OR TOS TO TOS-1 +;* +XOR LDA ESTKL+1,X + EOR ESTKL,X + STA ESTKL+1,X + LDA ESTKH+1,X + EOR ESTKH,X + STA ESTKH+1,X + JMP DROP +;* +;* SHIFT TOS-1 LEFT BY TOS +;* +SHL STY IPY + LDA ESTKL,X + CMP #$08 + BCC + + LDY ESTKL+1,X + STY ESTKH+1,X + LDY #$00 + STY ESTKL+1,X + SBC #$08 ++ TAY + BEQ + + LDA ESTKL+1,X +- ASL + ROL ESTKH+1,X + DEY + BNE - + STA ESTKL+1,X ++ LDY IPY + JMP DROP +;* +;* SHIFT TOS-1 RIGHT BY TOS +;* +SHR STY IPY + LDA ESTKL,X + CMP #$08 + BCC ++ + LDY ESTKH+1,X + STY ESTKL+1,X + CPY #$80 + LDY #$00 + BCC + + DEY ++ STY ESTKH+1,X + SEC + SBC #$08 +++ TAY + BEQ + + LDA ESTKH+1,X +- CMP #$80 + ROR + ROR ESTKL+1,X + DEY + BNE - + STA ESTKH+1,X ++ LDY IPY + JMP DROP +;* +;* LOGICAL AND +;* +LAND LDA ESTKL+1,X + ORA ESTKH+1,X + BEQ ++ + LDA ESTKL,X + ORA ESTKH,X + BEQ + + LDA #$FF ++ STA ESTKL+1,X + STA ESTKH+1,X +++ JMP DROP +;* +;* LOGICAL OR +;* +LOR LDA ESTKL,X + ORA ESTKH,X + ORA ESTKL+1,X + ORA ESTKH+1,X + BEQ + + LDA #$FF + STA ESTKL+1,X + STA ESTKH+1,X ++ JMP DROP +;* +;* DUPLICATE TOS +;* +DUP DEX + LDA ESTKL+1,X + STA ESTKL,X + LDA ESTKH+1,X + STA ESTKH,X + JMP NEXTOP +;* +;* LOGICAL NOT +;* +LNOT LDA ESTKL,X + ORA ESTKH,X + BNE + + LDA #$FF + STA ESTKL,X + STA ESTKH,X + JMP NEXTOP +;* +;* CONSTANT +;* +ZERO DEX ++ LDA #$00 + STA ESTKL,X + STA ESTKH,X + JMP NEXTOP +CFFB LDA #$FF + !BYTE $2C ; BIT $00A9 - effectively skips LDA #$00, no harm in reading this address +CB LDA #$00 + DEX + STA ESTKH,X + INY ;+INC_IP + LDA (IP),Y + STA ESTKL,X + JMP NEXTOP +;* +;* LOAD ADDRESS & LOAD CONSTANT WORD (SAME THING, WITH OR WITHOUT FIXUP) +;* +- TYA ; RENORMALIZE IP + CLC + ADC IPL + STA IPL + BCC + + INC IPH ++ LDY #$FF +LA INY ;+INC_IP + BMI - + DEX + LDA (IP),Y + STA ESTKL,X + INY + LDA (IP),Y + STA ESTKH,X + JMP NEXTOP +CW DEX + INY ;+INC_IP + LDA (IP),Y + STA ESTKL,X + INY + LDA (IP),Y + STA ESTKH,X + JMP NEXTOP +;* +;* CONSTANT STRING +;* +CS DEX + ;INY ;+INC_IP + TYA ; NORMALIZE IP AND SAVE STRING ADDR ON ESTK + SEC + ADC IPL + STA IPL + STA ESTKL,X + LDA #$00 + TAY + ADC IPH + STA IPH + STA ESTKH,X + LDA (IP),Y + TAY + JMP NEXTOP +;* +;* LOAD VALUE FROM ADDRESS TAG +;* +LB LDA ESTKL,X + STA ESTKH-1,X + LDA (ESTKH-1,X) + STA ESTKL,X + LDA #$00 + STA ESTKH,X + JMP NEXTOP +LW LDA ESTKL,X + STA ESTKH-1,X + LDA (ESTKH-1,X) + STA ESTKL,X + INC ESTKH-1,X + BEQ + + LDA (ESTKH-1,X) + STA ESTKH,X + JMP NEXTOP ++ INC ESTKH,X + LDA (ESTKH-1,X) + STA ESTKH,X + JMP NEXTOP +;* +;* LOAD ADDRESS OF LOCAL FRAME OFFSET +;* +- TYA ; RENORMALIZE IP + CLC + ADC IPL + STA IPL + BCC + + INC IPH ++ LDY #$FF +LLA INY ;+INC_IP + BMI - + LDA (IP),Y + DEX + CLC + ADC IFPL + STA ESTKL,X + LDA #$00 + ADC IFPH + STA ESTKH,X + JMP NEXTOP +;* +;* LOAD VALUE FROM LOCAL FRAME OFFSET +;* +LLB INY ;+INC_IP + LDA (IP),Y + STY IPY + TAY + DEX + LDA (IFP),Y + STA ESTKL,X + LDA #$00 + STA ESTKH,X + LDY IPY + JMP NEXTOP +LLW INY ;+INC_IP + LDA (IP),Y + STY IPY + TAY + DEX + LDA (IFP),Y + STA ESTKL,X + INY + LDA (IFP),Y + STA ESTKH,X + LDY IPY + JMP NEXTOP +;* +;* LOAD VALUE FROM ABSOLUTE ADDRESS +;* +LAB INY ;+INC_IP + LDA (IP),Y + STA ESTKH-2,X + INY ;+INC_IP + LDA (IP),Y + STA ESTKH-1,X + LDA (ESTKH-2,X) + DEX + STA ESTKL,X + LDA #$00 + STA ESTKH,X + JMP NEXTOP +LAW INY ;+INC_IP + LDA (IP),Y + STA TMPL + INY ;+INC_IP + LDA (IP),Y + STA TMPH + STY IPY + LDY #$00 + LDA (TMP),Y + DEX + STA ESTKL,X + INY + LDA (TMP),Y + STA ESTKH,X + LDY IPY + JMP NEXTOP +;* +;* STORE VALUE TO ADDRESS +;* +SB LDA ESTKL,X + STA ESTKH-1,X + LDA ESTKL+1,X + STA (ESTKH-1,X) + INX + JMP DROP +SW LDA ESTKL,X + STA ESTKH-1,X + LDA ESTKL+1,X + STA (ESTKH-1,X) + LDA ESTKH+1,X + INC ESTKH-1,X + BEQ + + STA (ESTKH-1,X) + INX + JMP DROP ++ INC ESTKH,X + STA (ESTKH-1,X) + INX + JMP DROP +;* +;* STORE VALUE TO LOCAL FRAME OFFSET +;* +SLB INY ;+INC_IP + LDA (IP),Y + STY IPY + TAY + LDA ESTKL,X + STA (IFP),Y + LDY IPY + BMI FIXDROP + JMP DROP +SLW INY ;+INC_IP + LDA (IP),Y + STY IPY + TAY + LDA ESTKL,X + STA (IFP),Y + INY + LDA ESTKH,X + STA (IFP),Y + LDY IPY + BMI FIXDROP + JMP DROP +FIXDROP TYA + LDY #$00 + CLC + ADC IPL + STA IPL + BCC + + INC IPH ++ JMP DROP +;* +;* STORE VALUE TO LOCAL FRAME OFFSET WITHOUT POPPING STACK +;* +DLB INY ;+INC_IP + LDA (IP),Y + STY IPY + TAY + LDA ESTKL,X + STA (IFP),Y + LDY IPY + JMP NEXTOP +DLW INY ;+INC_IP + LDA (IP),Y + STY IPY + TAY + LDA ESTKL,X + STA (IFP),Y + INY + LDA ESTKH,X + STA (IFP),Y + LDY IPY + JMP NEXTOP +;* +;* STORE VALUE TO ABSOLUTE ADDRESS +;* +- TYA ; RENORMALIZE IP + CLC + ADC IPL + STA IPL + BCC + + INC IPH ++ LDY #$FF +SAB INY ;+INC_IP + BMI - + LDA (IP),Y + STA ESTKH-2,X + INY ;+INC_IP + LDA (IP),Y + STA ESTKH-1,X + LDA ESTKL,X + STA (ESTKH-2,X) + JMP DROP +SAW INY ;+INC_IP + LDA (IP),Y + STA TMPL + INY ;+INC_IP + LDA (IP),Y + STA TMPH + STY IPY + LDY #$00 + LDA ESTKL,X + STA (TMP),Y + INY + LDA ESTKH,X + STA (TMP),Y + LDY IPY + BMI FIXDROP + JMP DROP +;* +;* STORE VALUE TO ABSOLUTE ADDRESS WITHOUT POPPING STACK +;* +DAB INY ;+INC_IP + LDA (IP),Y + STA ESTKH-2,X + INY ;+INC_IP + LDA (IP),Y + STA ESTKH-1,X + LDA ESTKL,X + STA (ESTKH-2,X) + JMP NEXTOP +DAW INY ;+INC_IP + LDA (IP),Y + STA TMPL + INY ;+INC_IP + LDA (IP),Y + STA TMPH + STY IPY + LDY #$00 + LDA ESTKL,X + STA (TMP),Y + INY + LDA ESTKH,X + STA (TMP),Y + LDY IPY + JMP NEXTOP +;* +;* COMPARES +;* +ISEQ LDA ESTKL,X + CMP ESTKL+1,X + BNE ISFLS + LDA ESTKH,X + CMP ESTKH+1,X + BNE ISFLS +ISTRU LDA #$FF + STA ESTKL+1,X + STA ESTKH+1,X + JMP DROP +; +ISNE LDA ESTKL,X + CMP ESTKL+1,X + BNE ISTRU + LDA ESTKH,X + CMP ESTKH+1,X + BNE ISTRU +ISFLS LDA #$00 + STA ESTKL+1,X + STA ESTKH+1,X + JMP DROP +; +ISGE LDA ESTKL+1,X + CMP ESTKL,X + LDA ESTKH+1,X + SBC ESTKH,X + BVS + + BPL ISTRU + BMI ISFLS ++ BPL ISFLS + BMI ISTRU +; +ISGT LDA ESTKL,X + CMP ESTKL+1,X + LDA ESTKH,X + SBC ESTKH+1,X + BVS + + BMI ISTRU + BPL ISFLS ++ BMI ISFLS + BPL ISTRU +; +ISLE LDA ESTKL,X + CMP ESTKL+1,X + LDA ESTKH,X + SBC ESTKH+1,X + BVS + + BPL ISTRU + BMI ISFLS ++ BPL ISFLS + BMI ISTRU +; +ISLT LDA ESTKL+1,X + CMP ESTKL,X + LDA ESTKH+1,X + SBC ESTKH,X + BVS + + BMI ISTRU + BPL ISFLS ++ BMI ISFLS + BPL ISTRU +;* +;* BRANCHES +;* +BRTRU INX + LDA ESTKH-1,X + ORA ESTKL-1,X + BNE BRNCH +NOBRNCH INY ;+INC_IP + INY ;+INC_IP + BMI FIXNEXT + JMP NEXTOP +FIXNEXT TYA + LDY #$00 + CLC + ADC IPL + STA IPL + BCC + + INC IPH ++ JMP NEXTOP +BRFLS INX + LDA ESTKH-1,X + ORA ESTKL-1,X + BNE NOBRNCH +BRNCH TYA ; FLATTEN IP + SEC + ADC IPL + STA TMPL + LDA #$00 + TAY + ADC IPH + STA TMPH ; ADD BRANCH OFFSET + LDA (TMP),Y + ;CLC ; BETTER NOT CARRY OUT OF IP+Y + ADC TMPL + STA IPL + INY + LDA (TMP),Y + ADC TMPH + STA IPH + DEY + JMP FETCHOP +BREQ INX + LDA ESTKL-1,X + CMP ESTKL,X + BNE NOBRNCH + LDA ESTKH-1,X + CMP ESTKH,X + BEQ BRNCH + BNE NOBRNCH +BRNE INX + LDA ESTKL-1,X + CMP ESTKL,X + BNE BRNCH + LDA ESTKH-1,X + CMP ESTKH,X + BEQ NOBRNCH + BNE BRNCH +BRGT INX + LDA ESTKL-1,X + CMP ESTKL,X + LDA ESTKH-1,X + SBC ESTKH,X + BVS + + BPL NOBRNCH + BMI BRNCH ++ BPL BRNCH + BMI NOBRNCH +BRLT INX + LDA ESTKL,X + CMP ESTKL-1,X + LDA ESTKH,X + SBC ESTKH-1,X + BVS + + BPL NOBRNCH + BMI BRNCH ++ BPL BRNCH + BMI NOBRNCH +IBRNCH TYA ; FLATTEN IP + CLC + ADC IPL + STA TMPL + LDA #$00 + TAY + ADC IPH + STA TMPH ; ADD BRANCH OFFSET + LDA TMPL + ;CLC ; BETTER NOT CARRY OUT OF IP+Y + ADC ESTKL,X + STA IPL + LDA TMPH + ADC ESTKH,X + STA IPH + JMP DROP +;* +;* INDIRECT CALL TO ADDRESS (NATIVE CODE) +;* +ICAL LDA ESTKL,X + STA TMPL + LDA ESTKH,X + STA TMPH + INX + BNE _CALL +;* +;* CALL INTO ABSOLUTE ADDRESS (NATIVE CODE) +;* +CALL INY ;+INC_IP + LDA (IP),Y + STA TMPL + INY ;+INC_IP + LDA (IP),Y + STA TMPH +_CALL TYA + CLC + ADC IPL + PHA + LDA IPH + ADC #$00 + PHA + JSR JMPTMP + PLA + STA IPH + PLA + STA IPL + LDY #$01 + JMP FETCHOP +;* +;* ENTER FUNCTION WITH FRAME SIZE AND PARAM COUNT +;* +ENTER INY + LDA (IP),Y + EOR #$FF + SEC + ADC IFPL + STA IFPL + BCS + + DEC IFPH ++ INY + LDA (IP),Y + BEQ + + ASL + TAY +- LDA ESTKH,X + DEY + STA (IFP),Y + LDA ESTKL,X + INX + DEY + STA (IFP),Y + BNE - ++ LDY #$03 + JMP FETCHOP +;* +;* LEAVE FUNCTION +;* +LEAVE INY ;+INC_IP + LDA (IP),Y + CLC + ADC IFPL + STA IFPL + BCS + + RTS ++ INC IFPH +RET RTS +CMD !SOURCE "vmsrc/c64/cmd.a" +SEGEND = * +VMINIT LDY #$10 ; INSTALL PAGE 0 FETCHOP ROUTINE +- LDA PAGE0-1,Y + STA DROP-1,Y + DEY + BNE - + LDA #$4C ; SET JMPTMP OPCODE + STA JMPTMP + STY IFPL ; INIT FRAME POINTER + LDA #$80 + STA IFPH + LDA #SEGEND + STA SRCH + LDX #ESTKSZ/2 ; INIT EVAL STACK INDEX + JMP CMD +PAGE0 = * + !PSEUDOPC DROP { +;* +;* INTERP BYTECODE INNER LOOP +;* + INX ; DROP + INY ; NEXTOP + LDA $FFFF,Y ; FETCHOP @ $F3, IP MAPS OVER $FFFF @ $F4 + STA OPIDX + JMP (OPTBL) +} diff --git a/src/vmsrc/c64/plvmzp.inc b/src/vmsrc/c64/plvmzp.inc new file mode 100755 index 0000000..148b288 --- /dev/null +++ b/src/vmsrc/c64/plvmzp.inc @@ -0,0 +1,29 @@ +;********************************************************** +;* +;* VM ZERO PAGE LOCATIONS +;* +;********************************************************** +SRC = $4C +SRCL = SRC +SRCH = SRC+1 +DST = SRC+2 +DSTL = DST +DSTH = DST+1 +ESGUARD = $4E +ESTKSZ = $20 +ESTK = $50 +ESTKH = ESTK +ESTKL = ESTK+ESTKSZ/2 +VMZP = ESTK+ESTKSZ +IFP = VMZP +IFPL = IFP +IFPH = IFP+1 +PP = IFP+2 +PPL = PP +PPH = PP+1 +IPY = PP+2 +ESP = IPY+1 +JMPTMP = ESP+1 +TMP = JMPTMP+1 +TMPL = TMP +TMPH = TMP+1 From da8fce2f96ff372d30a6f025ff536f6bbf5f833f Mon Sep 17 00:00:00 2001 From: Dave Schmenk Date: Wed, 21 Feb 2018 07:27:00 -0800 Subject: [PATCH 11/28] Don't want built binaries in repo --- src/rel/apple/A1PLASMA#060280 | Bin 4798 -> 0 bytes src/rel/apple/CMD#061000 | Bin 4112 -> 0 bytes src/rel/apple/CONIO#FE1000 | Bin 1831 -> 0 bytes src/rel/apple/DGR#FE1000 | Bin 1886 -> 0 bytes src/rel/apple/DGRTEST#FE1000 | Bin 513 -> 0 bytes src/rel/apple/FATCAT#FE1000 | Bin 713 -> 0 bytes src/rel/apple/FATGET#FE1000 | Bin 1506 -> 0 bytes src/rel/apple/FATPUT#FE1000 | Bin 1131 -> 0 bytes src/rel/apple/FATREADDSK#FE1000 | Bin 1503 -> 0 bytes src/rel/apple/FATWRITEDSK#FE1000 | Bin 1507 -> 0 bytes src/rel/apple/FILEIO#FE1000 | Bin 1915 -> 0 bytes src/rel/apple/GFXDEMO#FE1000 | Bin 397 -> 0 bytes src/rel/apple/GRAFIX#FE1000 | Bin 1519 -> 0 bytes src/rel/apple/MON#FE1000 | Bin 87 -> 0 bytes src/rel/apple/PLASMA.SYSTEM#FF2000 | Bin 3609 -> 0 bytes src/rel/apple/PLASMA16.SYSTEM#FF2000 | Bin 2620 -> 0 bytes src/rel/apple/PLAYSEQ#FE1000 | Bin 324 -> 0 bytes src/rel/apple/PORTIO#FE1000 | Bin 314 -> 0 bytes src/rel/apple/SDFAT#FE1000 | Bin 801 -> 0 bytes src/rel/apple/SNDSEQ#FE1000 | Bin 4084 -> 0 bytes src/rel/apple/SOS#FE1000 | Bin 788 -> 0 bytes src/rel/apple/SOS.INTERP#050000 | Bin 6107 -> 0 bytes src/rel/apple/SPIPORT#FE1000 | Bin 1336 -> 0 bytes src/rel/apple/UTHERNET#FE1000 | Bin 1082 -> 0 bytes src/rel/apple/UTHERNET2#FE1000 | Bin 3953 -> 0 bytes 25 files changed, 0 insertions(+), 0 deletions(-) delete mode 100644 src/rel/apple/A1PLASMA#060280 delete mode 100644 src/rel/apple/CMD#061000 delete mode 100644 src/rel/apple/CONIO#FE1000 delete mode 100644 src/rel/apple/DGR#FE1000 delete mode 100644 src/rel/apple/DGRTEST#FE1000 delete mode 100644 src/rel/apple/FATCAT#FE1000 delete mode 100644 src/rel/apple/FATGET#FE1000 delete mode 100644 src/rel/apple/FATPUT#FE1000 delete mode 100644 src/rel/apple/FATREADDSK#FE1000 delete mode 100644 src/rel/apple/FATWRITEDSK#FE1000 delete mode 100644 src/rel/apple/FILEIO#FE1000 delete mode 100644 src/rel/apple/GFXDEMO#FE1000 delete mode 100644 src/rel/apple/GRAFIX#FE1000 delete mode 100644 src/rel/apple/MON#FE1000 delete mode 100644 src/rel/apple/PLASMA.SYSTEM#FF2000 delete mode 100644 src/rel/apple/PLASMA16.SYSTEM#FF2000 delete mode 100644 src/rel/apple/PLAYSEQ#FE1000 delete mode 100644 src/rel/apple/PORTIO#FE1000 delete mode 100644 src/rel/apple/SDFAT#FE1000 delete mode 100644 src/rel/apple/SNDSEQ#FE1000 delete mode 100644 src/rel/apple/SOS#FE1000 delete mode 100644 src/rel/apple/SOS.INTERP#050000 delete mode 100644 src/rel/apple/SPIPORT#FE1000 delete mode 100644 src/rel/apple/UTHERNET#FE1000 delete mode 100644 src/rel/apple/UTHERNET2#FE1000 diff --git a/src/rel/apple/A1PLASMA#060280 b/src/rel/apple/A1PLASMA#060280 deleted file mode 100644 index 15a72e8759184f99582b2423fcb8dd93ec1bcf49..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4798 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 diff --git a/src/rel/apple/CMD#061000 b/src/rel/apple/CMD#061000 deleted file mode 100644 index 59a11fd0440726f30474ac6435b10c8f34d6de63..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4112 zcmZ`+e{37o9e+Nb&*#K7&vt&eO$w(hjoiZo5B8%1R+1)elX6Y2$+cbZqaCWNG6qT!K^@Yhs8cF}Cas=o4Q)!}LSbn~%cZ5ILi_=%(s&v$!`f<-0Ppk8 zaX@24&Aa!$@B8EP{l4#yW_n#lnpQIINpes=Mh|(i(h+&i`p)+hBFeI5Ev`_pd7U9on3OMBl#KE7$!wBC+(t$S0C zXZcvocYQG}*4`g0Q@6KwYtok3mj0N*KTziC?%%e_u-6!0HG8kc#QxY0L+b3_zNNQQ z+S1<9)!pd^W|+`KzSK}B{VRRge~FIx*U%RODt#f)K+goC^j6@zv=~rmeeHcT8+eeq zgPrtRFixMU8>a8p{)G0`?W5y$hv}QO&(TxD(`-N ze4$LXGWV8A1D`)za?F$*Yxn=AMnwXzB z4UN|2`CR_y>2IPfaeYOyOi?W7_a5QUspBx5fD1BQ@E}SO0)#@&N@owO-9L9kK5_Ht zBsn4%Y-j(MufQ3LbuVQlM9M-0?0_9UB3n1I(vrm5{bzqXE}eb+gz)z}kbe~w$iH&f zph7MN<|QjQS9Rh>R-Ultu;ddH7M83`o#-S-LytOl%Ncq6BC_cMBo_-j;#>tsVDl6k z5cj#Yv?yhz*B6WaxuffL1H<@xxAN9STUkZKMtxSX)=WCH(q+q{5WJkXJX2twa>MGh zE3{k6NaOEZcUza9=db(~uu?JB#Vv(KFJ211Y7yoN6Zt85Vt&dqaT?|?!u+cVJkAcm z!3f!?d5LnyuEk9SOQ33aHfy=lB)iEM6V!D_R7LAAfdwcwh z#NGT(cBsw~0e8*_kxdsFajSD-q0EzX$7RkVIv@|85vTg5eYda29~b$J(d5^mf~ zFl8p1RmAkF=fcvG5pUeb*&HNH273Ks+)-ACy(wT}L>TM!4`_as)@V(H2@%p}q=LAK z5XIOYY}Qr~kkYVSVN@!Ni3(%eGGk(yvDXirtwGI2NL*w>8Elo4iJHuTFmYIQFkzL? zl=w-i^QL8(cmiT_MXZX+@hZRt!y_Cu4?MswIbz3EbPR0ej%>9Z*=jrDsNj>04ME&Q zh`5YTF5@dR3Kd3gg;8E+^nR7Gt-{z=VfrFH2ysG% zh7i&yG0^WH!moF%AD($lqF*a5QJKK$!&p?OfNR28%i-lJyiCBqgzVwE@Y|jLY z7XnO*he$lc-$%yl?n+ClOW?1oFbSIR+L8C1x{E}vIGN-fW&)Fddzj$k5{4jc=l5rL z+VBHhIo6-n4yrvXaSrcmd5#*{deF|-W#PcWPGb0y|gU6R*$w>EvdsSu_NCDon)$Ip>} z39QMRZVEpknjt2#kZ9ti@lgd4m_;sJ$C?msJXD<-U;!owW+17u0Nf}$CXmfqp;X3% zm#H(-^{fsm(jl;j<|-US!E9tzY?WY2tTEkewy>52IumPAanquIT4F6;vn6$OR*lxE z(KfA~ppV?inwcaTzpXQCm}EBU9zsBqaKc$c6RBZU=p(E-p$cspq5=W$E>}n$R`^xfy0HOTkXJBviRZYXKGZR|#ok8?PH5v{rN=bYT|Yp=p5)`20#K zd8g(l+!w@MVs)ZuJQlz+e)*V<#&}(nn3VanO@#U2ndyU*KHIGb+I?+f{-%>`zRI@VT8d#&4)y$K`%i(HJO1jn!1BfRv=+=Hj zl5XG`l$mFUc>qIIFikwb0hsGOz&GO7R}rlfPgf}^@M=R3iLa=%cXTXoLRC7OwN>bXUd&Me zP08+NB;iA^(%<8Kusl@xJb(bY8bmfX^SobTDsZNiKA@MRBkohO#|{*h(~6yJ0p!=YYhgb*o#~ z+WWV(E6A&qNR3+owH4Wsa`G+SeqghI7b={8U=p^Y_~3+x--W8?J5dw1|OIlulCQ9ITnbhtRwpg&GjeZ7yL)HjTW zYNPr9>SKL`q^?rm-m4Tp1d(G$4{sHEA1b#HZtO3> Uh7%&A{>g9$`IGB+l*l9h1wZ-(xc~qF diff --git a/src/rel/apple/CONIO#FE1000 b/src/rel/apple/CONIO#FE1000 deleted file mode 100644 index 04b6ce6f3b12e090ff1b4b9b581aca47197cfbb6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1831 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 Jcq74U{1eQ@Y8%-JJ3tPz0AdGE#d@8djXx#VS zPxyvRPGwx}d4rF6+^KU4Oun1g_{{qWIX^pIFyWgbFnz{v zDQl@pO<SmO;)??|c-;voiQGDA5mr52do zC^Mklxo`#>dl+L{D5*b1xq(a^>>jW7gqvQh_Clky}s(?35?~oZXPjc)pv7e_ek`+=SYvc=A zCx(0@-$|ML;LHYhZPNcFTM9TiKYP!INI9C2Hmhmzp|)46oJ>mqe3<)(r}d2VTYJ2B Mk&zIZFIB?8BSkNlyZ`_I diff --git a/src/rel/apple/FATGET#FE1000 b/src/rel/apple/FATGET#FE1000 deleted file mode 100644 index f528da56f7de58053895761579698f573bce50cc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1506 zcmZ`(?@L=(7=ClkG2R3Dx(`+8H3q{no*&c7AvH~Mbub|sOB+Ec7&<0m{q4npHH2}kiOp}kb%gC z$Az^nkz*r4lp=Oy$xxx8PHKZ}uvv9(G}T0tcz!!d+7a6jDi%y@s2D3nG;6_45Ew|f zP;hFtl8pvC1A_-woEgQo)<&PhE(}Ixq1gbju~d|Bl*5x@(l|7R&vj8IAEvQXH))~6 z%n#LJQO06?&mV>0u=M>SEwaXRObn2zjI%B1lQ+`+lz28>D49;a@b3JAsf&(dE<4MG z;#yy8W0-44*_dXzC}oz~QX^!y5+GGlz7&xa62lu~;Y$`K1=Hf z>tt=gCn!17uX+uYIk}^8_R%#q` zHG27X`?psx4qkq%j(37vKW%I(M|CuP=O`D)nkKQ|XZ}0;r8lj{{C-WpAf6{nZLExf zje)&!LFO*V+0+!_=r?8mdD;K6v<`h1a-zu`9v<;m1`TiJn+xY9wx- zupTcCoMysPOt`Nw@`hQ=8;53rUje_$dfhVkHE6;I$zgp6y;Nva(i2eco19>_C diff --git a/src/rel/apple/FATPUT#FE1000 b/src/rel/apple/FATPUT#FE1000 deleted file mode 100644 index 52fa9dc8b6b285d47244ab98904e293a8de3c372..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1131 zcmZ`(O=}xR7=HKN(MFMFdt@A(6eU?D5X`2iA{0VJ9bDq%kchR26=5r($gn$3guOCy zDu{3T2}64+^wL{SDHIAl#VF3&709iz+tNUxv{1;YkZUNo&+dkPKqKbS`~C5Z#N>T3< z>@i9aeq*d*E~Z%VKlS2uy@=|CClswK%617kNt6FcXrvaWSkZL4C8+KO7}yL%U^zzl z1dSopD0~N0;zSLyL5?#wVudH=tWxeCIO{px$ z$q+=>s#+l0wW6I{C#fD-G*@{mUXPyYsLx`uBPxidq?}uV&oqRGdtRwAcM0 zBBJiE`sIJqDdy%8iv6}9agL++K(#Crwj=nFuC^wqUb#qKMhPs`8jDy|#$pb&ja*>4 zjQ!nTk6M#dFIBPT)PLt*|Dcx4Mo$&}eQ>-?D~oIuaVt?{B=K(AvSrI=ZYfm?>DmmxjF(jOZIJv2u3AFyA- z|H{bgQ!MlupuncS3|Z#Wy%{Dw3;QM)^b+TL3ibx{PZ0kU_zbbnIjMz;u zeZ|!K8rTA!0wFL!-4OXdvgkdB{xkGn*zEm=*zdp#_%f!@qozswKYV{xawLYXjLiip zXg7q{qHn_fet$UpZo5Am?7DI^b{vGmuzz?>j?-Sax4pk4Cn$L;WS;iJgIn@6;nCO` W930l<*+~61{HZ2wieC{~Ao>f~Ssls% diff --git a/src/rel/apple/FATREADDSK#FE1000 b/src/rel/apple/FATREADDSK#FE1000 deleted file mode 100644 index 55178ae441cb75ffd7e205d0ece025294fd4bc95..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1503 zcmZ`(Ur1Y582|3MH#gBma~kTjqVq(e*t>8Sbwejb?Tm%uB?gmP%~pvs_nO$4D@hu) zW3W7|FJprPg>4TV3 z|IXzOD8vL9p(@<*?jG%(JdExiRx5|I<>Q0s$=-fB2I7|hXl-#n*WBcCst!dak_Q%K z$pTI3(mZFiAjuHz)sWEyNuoJPfg}m?@c4hv;&PpjQTP-@G%^<_@o#&w7Y`i-GK%II z^?}(S`F*t$AVIa7mcm37QjwA=?^gmqvdB z&4o3M6r>nz`9Y_1=5jKfU1e`(?3L^JF@~{LYn?zf=jepkgQZ$jYr;*mT9k;fj6Tr4 zg2sLa&~Tv`H_{v&PFIII9+7tG>H8*VN;eXcAHu*Y%^A-*=Cfl883j|el?da zm@K`%ylOHloiQ7!#C(m80T)cg9tZ?eermh|y6efdG0j@9NT$2-YVCCv%B71YLkC7` z&Ms|Gyql5pp!Y^MOf$&}X1>5Sab047!Iy_;Sixq|5L;Q!B}E!%%ay!1LLCziB}f7_ zZFaI@wAQW2q~B-*P1@?Cx*EyZq1mV?;>AYM<3y7U>%$^jJF|01GpDmDJBt->m=kPZ z@ul$j*d{eRq5yW8>Z38wnP6lI^#1z05Q@$`xk@pSm9aNAwi|CqQcNeVRS#Ur<7JPr z7cX6m%}rkn3DSjUnD`Qmv)2a$LxI>eL4Y^N2nDiMlK$fIpJt(q9sk z{z1KqD7=q!^AO6*2!qJ{8X-J^a)tQ#E%d#I_yFw>iHCnedibY=l|Ca-`W*2E;!DI= z1o$`T{~q-p5qpRl;t#~1c=j(*N|Fp*krm!1E2R$9eKO%QXkSG;j`p(LR$4`AqkIeH zE%d*S@?(@=%TW3Ov4bch_R#+~a{Y<|wFmd7C=sF>rm~PxTK8V24mhabp$b1$%C&N} zdT+N}Jv<20mb&A(QmvFvrl|*xDo4AuMe2q7_a4-0l{wl5jn6aff?DNxj&=insP_+# VPhzx3s6SVJjZp^mFE{l8{09*eg315@ diff --git a/src/rel/apple/FATWRITEDSK#FE1000 b/src/rel/apple/FATWRITEDSK#FE1000 deleted file mode 100644 index 204e2e69e1e2d673effbf39fe02759ce8033d040..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1507 zcmZ`(U1(cX9RJ^QZ<5>EHfM2NZE5LgZA*6-ujwjmmeEy~4aZ^{nyg>b(%RhH@1!JI z*A9lugD-oLBfg0b3W755K@gncBzEZsv@Y}m6nqh1d{sojm-;(NrM`H%zxzMG|M`EP z!wnkDA-cf5^kHCq_sRZ`@r~`B;`U%+Z!^CCWTTKE^-L1g)z&;yU1j>b9z$oEpGI}f zCCg~G{HLuDTV&SD;YbxFndM_SmSph5_W$mU>t%mf;ms*)c#aL=vo_FUxb81XPS-9wHDHeSG8^3)wyaXSYs$jA#`qcg@6moKoEK zT^vwDa!r?8RTxv9%h`Mr(xUQbRS-uc=dugJ$z;-*KGA^?v#9$5#{#{_zBvlTTF5># zS+|tyHBiy+~r(&;KbX9rR;L{#COLoIm6-P{GoT+ko?qYg*d96~On#OU|#-q?l z)6mVIrr}U5NOohzKfUavRCgx{`&6pq2<4Hg0|?Q000Qq_!RG~^jI?SHciR>Dk2Xl) zHIvr){%W#Hs~tSnNLHdB?P2b@{u;tex$2ftXtsk#ddW8b9WcVox2s@wwaBGKI5W56 z2vFErzGkaO-OkuKvOD6-j*}EQCz})KKB>y@d8zjX?nHV?#KU5GDw9-Ue6=^TY7=V& zK0nDOv9bmSDx|K=VgntKdR&mzPHuZ+nRIwCuF?chC^SA$(QEgrXbmErNje!@TuG-e z@!QU2(LMHJ^lah|kN8yr)H&P96aG`7*aX>~l_L+wZye7SEmh8_at)HIJ$0=13pcYk z>^^bs+AE2Xq3emO%IDIFqq+tC;#N=ad@%8b@}Sq*1y1Y^fUCy}fd3T95n?h6+#^HY zC$D^)^!!62`G^AYXKIs8TCKdK8S=8G%L%PbE@~`)UnBV`bf0OS{8v~XYR&RD@ISPc z{9oXI!?u+fvYWNYS0P^mVoaA)jL9VA3~Q4QpnC^+7yNzZmmjfK`7smuPZ;GN0-pn4 z0ADhaUqk;G>jJO^900!pzhjT-M&6^7G<8EZVBLiE^E#7*;J3ghz#Y9lzW|wqd<*gc z^b+y|$VWQmzXiSnioh21f5NxhFsO8RaD_7^cA{KYGS17|>)b<|MQnO$t5_%%c6Oew z7k0KcqrA4P*emW73;S2OpLUD8>!mRspo6D}rBZQ-*Hh&e&6}xI+#BL8grD`s_TGMi Tx2om$#UBz}Q2Fo8+lc-F7FmQP diff --git a/src/rel/apple/FILEIO#FE1000 b/src/rel/apple/FILEIO#FE1000 deleted file mode 100644 index a9d3b1acec61f69c7b4639b1f37a351b38e16ef2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1915 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 b;8PlIVIjf^VavQ$?H;K5aS;E$P51i?6~Vr( diff --git a/src/rel/apple/PLAYSEQ#FE1000 b/src/rel/apple/PLAYSEQ#FE1000 deleted file mode 100644 index 632054af4bad4d69804ee415c139a09074258c6d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 324 zcmXAkF-yZ>5Qbku29YSYIkjmiNkOnG2yTLdE)Cj{PzVH3utlS!APV9jWOXQfKPj|n z4K_6-spzlKi#fjg?s=b^ZVYJvXe42WCdoAavBGR_&EiEApXbYI9+@cX2D0)D*|hf)Eb?KNF1_oe7)q9L_FOam8*3Ex6^F0U4#y473alg PkMxS?QSlKu)CT?l+&pbF diff --git a/src/rel/apple/PORTIO#FE1000 b/src/rel/apple/PORTIO#FE1000 deleted file mode 100644 index ba03b1e9337f336dd19d19a836a67a25d077c51f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 314 zcmXv|F;2rk5L_=Nv0R<3lPfD#s+9|iH-yd|6y_A63k1u*$Q$y3)M+T`?-Yl~k|D@g zLcE0(+?|tRq@CHB(Yyn`07PsA0K1R+`}Yo@KrfZ51iIoVX*CmANk!v?JYFpnjS@m$ zJt?|Q$mi9wB0r&k$8kI_d`ycWd4naI0HVxsb)7 luVdG{bIQ(-pRVa|gWP?Fd&%^tZjT4&+pv1y>W9EI{{ubPT!#Pv diff --git a/src/rel/apple/SDFAT#FE1000 b/src/rel/apple/SDFAT#FE1000 deleted file mode 100644 index 1397f90c7777e08b8ddb59b7cb33e4b51421d650..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 801 zcmZ|N&ubGw6bJCPFB4i~(KiQcEV4;#5gAGeQba_gXzHN^4;myc0ee{Y(jY}@FA5Su zDWQ}wV5uMh52E0I(KZo!FqXt0*rSJ@J$VxJJ82>ok?_fT^W8VI8?tXazE3nONowew z_s#Ct+ugn0y$_uNvIVJ1P3p2Co6?qjIS{22dQMmMieA+mZDnU+*U{n4^Azh?4rLKZ4_ z3myqo?-nZJ#ZU!tY%`;nZ%FSzb865lJj9<{pLBbo-ov2_lu4qLikRU^;#_`+P?p)8 z?wuVwGHr&(upWKDl*=dZBM*;>I8guWA6ztUM>hP=If0_m-ybvXrU9urKInN?h!>y= zHK@Y|Y(g9M;Q*8-PQV;gVFgy925Ybmb+CYcjvGRiBvEAy&VUbTI13YS4$gytNtl8x zT!3k~2$$e8T!E`F1J{V`P4ew6O4)mqv5zQiA7lL#>({7nQMV~m`Hb0bnEj6HKal?f z@=|ul^Q{jPU|genZe?&U}y8)R$(|P^c$kJw7CEP diff --git a/src/rel/apple/SNDSEQ#FE1000 b/src/rel/apple/SNDSEQ#FE1000 deleted file mode 100644 index 4dbff29998be6af13f3f977bacf0e3c7169d856b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4084 zcmbu>4{Q_H9S88AFBkj#FL_R~g!~}{(inOKFl{M;7Knf#7LIUD3`#P{oYa`q3r=QC z=2oIzm5Kn zzeQ{fdy?+;Y@60D8htUfKIL`mMN5{&Yd&q7ZF<9)YTPHKNfJpUl7N3wW+-8p5+RkvfNWcNsc|yTs1n?#KW?)5p$6B2xEdH2sh_ zJv3$erHL(jCbpc|uzOOo$pJ@3T)VzJ+0z}lryJ;yb{bFic3Y7@J7@_9>KZX z<`z+|O|CX1@oW0=YaY?L-{#iytA=VpC%1V>P7zuN2eZ&3qrWV~k4aj!rNu)QS4Aet zA`04xES4&I^r#i^A3;1stI^L;{*>ZFwK9|Nh^UZq1g9x&#~!Ank#`T1+xcl|FXKJc zl_cwY=v1&)C!adxBY>hP`ik%AaqZmILU z!Y9fUNZ~K_DaA_OBHXvoDyar4j<&T*I1fF|D8Rfk8Oo(fm(E+rEUqS#+@7JFC7j@G zx|+<5ds&8T$O~B9W;r!O@e?&!WvL{KEcQ*zZOLzNTk~BNn0oxb9d)>^vawXLkvk<| zb*ETlqbZQ08mVzMvjk@|w+T_CoXqjAe)|E`A~FJ*WHC=RWaQa95`q2d^YQWKOd8K^ zDpjTsO$dVlQZN9&i%8TFdpfl@@fbc)IY=InKiVoS9}IFH-VmR-*jwf$YwQNZjQABj z&UJb6w8Xgu0owS9iWr#XQvQkb(ITM~kA%{sNI0Jq3FnB!!_1(@VlBa^v%0ABW_DdP zRK%aaS(#H84KOuRyZt0#M5~t2$pMwb#T$pjI zoFwo$w~kLugHO*_Mk=|j@ph%kwWwQfe^%?XTq!2|9&N&DeBvA224_D@G-^q7ZL!aL z!jWR_;v+4Hk2EJSk}N!CD6JJAO6%KVpZ|nI#oEP(S{NVdg|VSxi!uI)viO*RwLW}c zEmDix^@t~sEDA^}S;!NyP;hR+%hA$AaLJ_^6?xQ1J#yPh#Yo!AvXHleETIZgKaGy9 zO%GpZ=L=@f5QF=01|RXuhOsORDR>fHE< zMPnoKwV#2tuZ{1Yu$xmv82Se8@}4dqv8u0O-qry$V}c*JsqtT@q56#kI_oSOm;_lD3_@c*-vGm zK=_d$m1L4dn|CqaPxdv;jiWjobxgR3Y0@rk8@uQcg2hPu9n%>mT)RcgICe6^Ze5#f z-=B@>8}TUo-r863rGi`X=CTdy*U?7S<3N3_*hnM~WXL^BZDfzwLQ|Rjt}Qf;sR!{~ zOABajdR6mwpSxhYZ`<~kmS%rovwN=9Nm!U0RX?t-ZGQPjulTksZ?5;d3#yu$1B?09 zxz@4@XIW*zl7fn6-{x42qk#V{DX4n6-lx^1&Y!a|R)cN@g}hGw03V_03~A+37|$+? zOLmCPb!nk}Oclt%=Wvx$Nc^E?b4fN*;Q())-+c9w7dhWsBi+o_%0pK!s#0Z6tlWR; nYX4wgnUu?hA|GA8a&fRsnyM8eAFq|BF|82-ebiqgVbA#w+}tD; diff --git a/src/rel/apple/SOS#FE1000 b/src/rel/apple/SOS#FE1000 deleted file mode 100644 index 3df3d0e24fcf93b345e380acbcc5250eb0ae1af6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 788 zcmYjP-%Aux6h3!$oFBT$?L|ddck&@}i`gXzVv&AWO46Xi?j*LEC^(xgi<&=zM2dxm zdI|?$dNgREr@&C?(Ls0JMU7$CBA=t(g^H|yU^{pBp@#dN^L^)>Z{`f#c8)UvHmL`= z(>sT|#p9?`*o$WK2bug3)SoTa61KK2alLUv$XU`Y7UfzjZwOZ9)n!w#gjKF2rlpLK zmcNOszBlC)zEoL<4Z)UjE?<&MVz%u5&Q{!?C*gG2lq@M-F=b0`LxFA-q9tbKthioH zmruA-g*jhrS6!YJ(fbR%-={2j%94^2jPN8t7P&YqdIEjtI0Ik>AjXe0U}-$gjbGEc z0a=m{kZ?OR$6=D^u+CzyCO`;c4f@w=XsjA*Ksp5w_|vO(f!cO`ZZ2sm!C+8{4n>uD z^WoC;yg8|!!Y_HOo>Jqe&VCr8WaCD+iFb?hC}tb>IsI~Tkv?7 z{WRgD2|t@pG_w&@Ud#ari_LQ^s1jRX(1_^9KGj-qkPU#bNkhzdhU%T5whqoNDidr~ zbzsowi|9&xI%(Fn)muTO{iu`~oQcma&D8%w?*_H&&ceh4Gpw9vpXmALzM|aIBYph? zBlp>+Fv@LG;PxrlyU=9sfns|IvCk6TzCe6-kaVUl5=dP_^boMG5`XFj@&V);_J)v0 z5O-0JVs8TTBzlvGS>jDCVDAy)G1gZIwV&e5Gvv=Pzr^|);x+2GsNW%fkJv(eg#I6h z7LJEQXD64xNeQ^0j-r%@;&E}uInZbmgUv}yTH&cjE1>i5wyZDO$ diff --git a/src/rel/apple/SOS.INTERP#050000 b/src/rel/apple/SOS.INTERP#050000 deleted file mode 100644 index cc3c3795853088ea1801f23a3d03996831d32c06..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6107 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 QCvr=5BNq4EpUE@-2fzhPivR!s diff --git a/src/rel/apple/SPIPORT#FE1000 b/src/rel/apple/SPIPORT#FE1000 deleted file mode 100644 index 9bf38d0695589c01a3505bf6ea9f95ec1758621d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1336 zcmchWPiPZS5XNWUF3H=V?WUVhK~M`J=+Z+#C>~4wgM}Ol4W&&}sSragg(Booa?u>> zMWTk{p$Ikzf(LtOARhFxX&PyzmNiLZD_#T%MNm9>C~E!QZmli$;GuNkxBJb!w{O0g zYyt|qMx^R0ebP&B7OLyLmMxD%{X*{q_5A%uH z4)gMvo0$%Cub&wFWQNRLmJT=L)OKu+z@4yKcst1p#YwebePiE+zo?j--A<=zh_3$s zf&R06(P9m?ZduRkrj_5=GmZUf#mw!AWDY`!-u_ycfrW<~yE=8DQ@7Kp{maa`c6}P2 z1J`iVaA6#7jN=}>-1%o5dkwvR%yTs7^4xbmUwa@qdTo8(IcO6n)p1f~yQ_XCC1}*E z^+g$E`_mr@@lS{lAyyNMTpJl4=4>02jjgV*n?i9ps>E5ur-ynzY$3ucMks-e zob5=DkYXc60(z`pVa8Diu^IOSv+tB(qdLkfV)@9v%YJ)VB1)2N)#&VsQy{ESoSKrT zXq#wk#VIO{44R>lAu|-o>#_EeztD;y2|F?yHY8uTm4dBW%Buyty(zyIJlm4ewH_Y@ zAKA%gcJif2M%MHgQ*~lK5CG#K38p|Etm%|)mMMEm_M|&xN_Ru|$}D>YT$fq;268EI z3)}{G!8DiwPrxjA0an0Ay!!>`Y(oD8q)=K0E}(*D&;tD67&s12fHsB5TCJVe7?q04 zVa-ETYiaFOxiY_AyU0}?(L#B-IKX{ER?90FctEI1xzxwUg?d+6s+H$gFY%<4FD{5+ Q>Q6Ah^Ny^RBOD$72Krq5jQ{`u diff --git a/src/rel/apple/UTHERNET#FE1000 b/src/rel/apple/UTHERNET#FE1000 deleted file mode 100644 index 26cc722fb0c8ad53db68dc3e5e3f0fa8179753d9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1082 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 Date: Wed, 21 Feb 2018 07:31:52 -0800 Subject: [PATCH 12/28] Clean up samplesrc --- src/makefile | 1 + 1 file changed, 1 insertion(+) diff --git a/src/makefile b/src/makefile index ede2039..e87f9f1 100755 --- a/src/makefile +++ b/src/makefile @@ -87,6 +87,7 @@ clean: -rm rel/* -rm rel/apple/* -rm rel/c64/* + -rm samplesrc/*.o samplesrc/*~ samplesrc/*.a -rm toolsrc/*.o toolsrc/*~ toolsrc/*.a -rm toolsrc/apple/*.o toolsrc/apple/*~ toolsrc/apple/*.a -rm toolsrc/c64/*.o toolsrc/c64/*~ toolsrc/c64/*.a From 4204d47d3c975b7eba52cfd55eb32e352662b994 Mon Sep 17 00:00:00 2001 From: David Schmenk Date: Wed, 21 Feb 2018 09:44:59 -0800 Subject: [PATCH 13/28] formatting --- src/libsrc/apple/dgr.pla | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/libsrc/apple/dgr.pla b/src/libsrc/apple/dgr.pla index 001cf97..2d29f7d 100755 --- a/src/libsrc/apple/dgr.pla +++ b/src/libsrc/apple/dgr.pla @@ -600,7 +600,7 @@ export def dgrLine(buff, x1, y1, x2, y2)#0 sx = 1 dy-- err = err + dd2 - else + else sx++ err = err - dy2 fin @@ -630,7 +630,7 @@ export def dgrLine(buff, x1, y1, x2, y2)#0 sy = 1 dx-- err = err + dd2 - else + else sy++ err = err - dx2 fin From e241719ea53f305a77bece01a3ef40b41ba61c14 Mon Sep 17 00:00:00 2001 From: Dave Schmenk Date: Wed, 21 Feb 2018 09:53:11 -0800 Subject: [PATCH 14/28] Update line drawer with new PLASMA-isms --- src/libsrc/apple/dgr.pla | 29 +++++++++-------------------- 1 file changed, 9 insertions(+), 20 deletions(-) diff --git a/src/libsrc/apple/dgr.pla b/src/libsrc/apple/dgr.pla index 2d29f7d..d76d49e 100755 --- a/src/libsrc/apple/dgr.pla +++ b/src/libsrc/apple/dgr.pla @@ -506,7 +506,7 @@ asm _dgrFillTile RTS end // -// Wait for VLB - Doens't work on //c +// Wait for VLB - Shouldn't work on //c, but seems to. // asm vlbWait#0 - LDA $C019 @@ -525,7 +525,6 @@ export def dgrMode#1 ^showpage1 ^ena80 = 0 ^show80 = 0 -// ^mapaux = 0 ^an3on return 1 end @@ -578,16 +577,11 @@ export def dgrLine(buff, x1, y1, x2, y2)#0 fin dx2 = dx << 1 dy2 = dy << 1 - if dx >= dy - // Horizontal line + if dx >= dy // Horizontal line if sx < 0 - pp = x1 - x1 = x2 - x2 = pp - pp = y1 - y1 = y2 - y2 = pp - sy = -sy + x1, x2 = x2, x1 + y1, y2 = y2, y1 + sy = -sy fin dd2 = dx2 - dy2 err = dx - dy2 @@ -608,16 +602,11 @@ export def dgrLine(buff, x1, y1, x2, y2)#0 if y2 == y1 dgrHLin(buff, x1, x2, y1) fin - else - // Vertical line + else // Vertical line if sy < 0 - pp = x1 - x1 = x2 - x2 = pp - pp = y1 - y1 = y2 - y2 = pp - sx = -sx + x1, x2 = x2, x1 + y1, y2 = y2, y1 + sx = -sx fin dd2 = dy2 - dx2 err = dy - dx2 From 44e307325cd986f9aa3ce7a916b52bc8e06f8f0a Mon Sep 17 00:00:00 2001 From: David Schmenk Date: Thu, 22 Feb 2018 08:09:37 -0800 Subject: [PATCH 15/28] Create rel directories --- src/makefile | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/makefile b/src/makefile index e87f9f1..717e8a3 100755 --- a/src/makefile +++ b/src/makefile @@ -120,10 +120,14 @@ $(PLVM): vmsrc/plvm.c cc vmsrc/plvm.c -o $(PLVM) $(PLVMZP_APL): FORCE + -mkdir rel + -mkdir rel/apple -rm vmsrc/plvmzp.inc -ln -s apple/plvmzp.inc vmsrc/plvmzp.inc $(PLVMZP_C64): FORCE + -mkdir rel + -mkdir rel/c64 -rm vmsrc/plvmzp.inc -ln -s c64/plvmzp.inc vmsrc/plvmzp.inc From ea5bdccb822aba95a4e065945b7e0eaf935cc472 Mon Sep 17 00:00:00 2001 From: David Schmenk Date: Fri, 23 Feb 2018 09:29:22 -0800 Subject: [PATCH 16/28] Joystick dual axis read + buzz in constant time --- src/inc/joybuzz.plh | 4 +++ src/libsrc/apple/joybuzz.pla | 53 ++++++++++++++++++++++++++++++++++++ src/makefile | 7 ++++- src/mkrel | 2 ++ 4 files changed, 65 insertions(+), 1 deletion(-) create mode 100644 src/inc/joybuzz.plh create mode 100644 src/libsrc/apple/joybuzz.pla diff --git a/src/inc/joybuzz.plh b/src/inc/joybuzz.plh new file mode 100644 index 0000000..3c3d4b9 --- /dev/null +++ b/src/inc/joybuzz.plh @@ -0,0 +1,4 @@ +import joybuzz + const MAX_JOY = 64 + predef joypos(buzz)#3 +end diff --git a/src/libsrc/apple/joybuzz.pla b/src/libsrc/apple/joybuzz.pla new file mode 100644 index 0000000..22b2bfd --- /dev/null +++ b/src/libsrc/apple/joybuzz.pla @@ -0,0 +1,53 @@ +asm asmdefs + !SOURCE "vmsrc/plvmzp.inc" +SPEAKER = $C030 +GCSTRB = $C070 +GC0 = $C064 +GC1 = $C065 +GCPB1 = $C061 +GCPB2 = $C062 +GCMAX = 64 ; MAX VALUE FOR GAME CONTROLLER +end +// +// Read both game controllers in parallel +// +export asm joypos(buzz)#3 + DEX + DEX + LDA #$00 + STA ESTKH,X + STA ESTKH+1,X + STA ESTKH+2,X + LDA #GCMAX + STA TMPL + STA ESTKL,X + STA ESTKL+1,X + LDY ESTKL+2,X ; BUZZ TONE + BIT GCSTRB +JOYZZLP DEY + BEQ + + NOP ; TIMING + NOP + NOP + NOP + BNE ++ ++ BIT SPEAKER + LDY ESTKL+2,X ; BUZZ TONE +++ LDA #$FF + ASL GC0 + ADC ESTKL,X + ASL GC1 + STA ESTKL,X + LDA #$FF + ADC ESTKL+1,X + STA ESTKL+1,X + DEC TMPL + BNE JOYZZLP + ASL GCPB1 ; READ GC BUTTONS + LDA GCPB2 + ROR + AND #$C0 + STA ESTKL+2,X + RTS +end +done diff --git a/src/makefile b/src/makefile index 717e8a3..24393dd 100755 --- a/src/makefile +++ b/src/makefile @@ -39,6 +39,7 @@ HTTPD = rel/HTTPD\#FE1000 DGR = rel/apple/DGR\#FE1000 GRAFIX = rel/apple/GRAFIX\#FE1000 GFXDEMO = rel/apple/GFXDEMO\#FE1000 +JOYBUZZ = rel/apple/JOYBUZZ\#FE1000 PORTIO = rel/apple/PORTIO\#FE1000 ROGUE = rel/ROGUE\#FE1000 ROGUEMAP = rel/ROGUEMAP\#FE1000 @@ -74,7 +75,7 @@ TXTTYPE = .TXT #SYSTYPE = \#FF2000 #TXTTYPE = \#040000 -apple: $(PLVMZP_APL) $(PLASM) $(PLVM) $(PLVM01) $(PLVM02) $(PLVM802) $(PLVM03) $(CMD) $(PLASMAPLASM) $(CODEOPT) $(ARGS) $(MEMMGR) $(MEMTEST) $(FIBER) $(FIBERTEST) $(LONGJMP) $(ED) $(MON) $(SOS) $(ROD) $(SIEVE) $(UTHERNET2) $(UTHERNET) $(ETHERIP) $(INET) $(DHCP) $(HTTPD) $(ROGUE) $(ROGUEMAP) $(ROGUECOMBAT) $(GRAFIX) $(GFXDEMO) $(DGR) $(DGRTEST) $(FILEIO_APL) $(CONIO_APL) $(PORTIO) $(SPIPORT) $(SDFAT) $(FATCAT) $(FATGET) $(FATPUT) $(FATWDSK) $(FATRDSK) $(SANE) $(FPSTR) $(FPU) $(SANITY) $(RPNCALC) $(SNDSEQ) $(PLAYSEQ) +apple: $(PLVMZP_APL) $(PLASM) $(PLVM) $(PLVM01) $(PLVM02) $(PLVM802) $(PLVM03) $(CMD) $(PLASMAPLASM) $(CODEOPT) $(ARGS) $(MEMMGR) $(MEMTEST) $(FIBER) $(FIBERTEST) $(LONGJMP) $(ED) $(MON) $(SOS) $(ROD) $(SIEVE) $(UTHERNET2) $(UTHERNET) $(ETHERIP) $(INET) $(DHCP) $(HTTPD) $(ROGUE) $(ROGUEMAP) $(ROGUECOMBAT) $(GRAFIX) $(GFXDEMO) $(DGR) $(DGRTEST) $(FILEIO_APL) $(CONIO_APL) $(JOYBUZZ) $(PORTIO) $(SPIPORT) $(SDFAT) $(FATCAT) $(FATGET) $(FATPUT) $(FATWDSK) $(FATRDSK) $(SANE) $(FPSTR) $(FPU) $(SANITY) $(RPNCALC) $(SNDSEQ) $(PLAYSEQ) -rm vmsrc/plvmzp.inc c64: $(PLVMZP_C64) $(PLASM) $(PLVM) $(PLVMC64) @@ -327,6 +328,10 @@ $(SPIPORT): libsrc/apple/spiport.pla $(PLVM02) $(PLASM) ./$(PLASM) -AMOW < libsrc/apple/spiport.pla > libsrc/apple/spiport.a acme --setpc 4094 -o $(SPIPORT) libsrc/apple/spiport.a +$(JOYBUZZ): libsrc/apple/joybuzz.pla $(PLVM02) $(PLASM) + ./$(PLASM) -AMOW < libsrc/apple/joybuzz.pla > libsrc/apple/joybuzz.a + acme --setpc 4094 -o $(JOYBUZZ) libsrc/apple/joybuzz.a + $(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 diff --git a/src/mkrel b/src/mkrel index 66b8572..687e882 100755 --- a/src/mkrel +++ b/src/mkrel @@ -20,6 +20,7 @@ cp rel/INET#FE1000 prodos/sys/INET.REL cp rel/LONGJMP#FE1000 prodos/sys/LONGJMP.REL cp rel/MEMMGR#FE1000 prodos/sys/MEMMGR.REL cp rel/apple/PORTIO#FE1000 prodos/sys/PORTIO.REL +cp rel/apple/JOYBUZZ#FE1000 prodos/sys/JOYBUZZ.REL cp rel/SANE#FE1000 prodos/sys/SANE.REL cp rel/apple/SDFAT#FE1000 prodos/sys/SDFAT.REL cp rel/apple/SPIPORT#FE1000 prodos/sys/SPIPORT.REL @@ -100,6 +101,7 @@ cp inc/inet.plh prodos/bld/inc/INET.PLH.TXT cp inc/longjmp.plh prodos/bld/inc/LONGJMP.PLH.TXT cp inc/memmgr.plh prodos/bld/inc/MEMMGR.PLH.TXT cp inc/sane.plh prodos/bld/inc/SANE.PLH.TXT +cp inc/joybuzz.plh prodos/bld/inc/JOYBUZZ.PLH.TXT cp inc/portio.plh prodos/bld/inc/PORTIO.PLH.TXT cp inc/sdfat.plh prodos/bld/inc/SDFAT.PLH.TXT cp inc/sndseq.plh prodos/bld/inc/SNDSEQ.PLH.TXT From 6eb842e4729a1cc90def037f1ec45cd3911ffd78 Mon Sep 17 00:00:00 2001 From: David Schmenk Date: Fri, 23 Feb 2018 15:23:42 -0800 Subject: [PATCH 17/28] More precision for axis --- src/inc/joybuzz.plh | 4 +- src/libsrc/apple/joybuzz.pla | 83 +++++++++++++++++++----------------- 2 files changed, 47 insertions(+), 40 deletions(-) diff --git a/src/inc/joybuzz.plh b/src/inc/joybuzz.plh index 3c3d4b9..9bdc6d2 100644 --- a/src/inc/joybuzz.plh +++ b/src/inc/joybuzz.plh @@ -1,4 +1,4 @@ import joybuzz - const MAX_JOY = 64 - predef joypos(buzz)#3 + const MAX_JOY = 79 + predef joypos(buzz)#4 end diff --git a/src/libsrc/apple/joybuzz.pla b/src/libsrc/apple/joybuzz.pla index 22b2bfd..2c831ec 100644 --- a/src/libsrc/apple/joybuzz.pla +++ b/src/libsrc/apple/joybuzz.pla @@ -1,53 +1,60 @@ asm asmdefs !SOURCE "vmsrc/plvmzp.inc" -SPEAKER = $C030 +SPEAKER = $C030 GCSTRB = $C070 GC0 = $C064 GC1 = $C065 -GCPB1 = $C061 -GCPB2 = $C062 -GCMAX = 64 ; MAX VALUE FOR GAME CONTROLLER +GCPB1 = $C061 +GCPB2 = $C062 +GCMAX = 79 ; MAX VALUE FOR GAME CONTROLLER end // // Read both game controllers in parallel -// -export asm joypos(buzz)#3 +// +export asm joypos(buzz)#4 + LDY ESTKL,X ; BUZZ TONE + STY TMPH + DEX DEX DEX LDA #$00 - STA ESTKH,X - STA ESTKH+1,X - STA ESTKH+2,X - LDA #GCMAX - STA TMPL - STA ESTKL,X - STA ESTKL+1,X - LDY ESTKL+2,X ; BUZZ TONE - BIT GCSTRB -JOYZZLP DEY - BEQ + - NOP ; TIMING - NOP - NOP - NOP - BNE ++ -+ BIT SPEAKER - LDY ESTKL+2,X ; BUZZ TONE -++ LDA #$FF - ASL GC0 - ADC ESTKL,X - ASL GC1 - STA ESTKL,X - LDA #$FF - ADC ESTKL+1,X - STA ESTKL+1,X - DEC TMPL - BNE JOYZZLP - ASL GCPB1 ; READ GC BUTTONS - LDA GCPB2 - ROR - AND #$C0 STA ESTKL+2,X + STA ESTKH+2,X + STA ESTKL+3,X + STA ESTKH+3,X + LDA #GCMAX + SEC + BIT GCSTRB +BUZZ DEY + BNE BUZZDLY + BIT SPEAKER + LDY TMPH ; BUZZ TONE +GC0READ BIT GC0 + BPL GC0DLY + INC ESTKL+3,X +GC1READ BIT GC1 + BPL GC1DLY + INC ESTKL+2,X +JOYLP SBC #$01 + BNE BUZZ + TAY ; LDY #$00 + BIT GCPB1 ; READ GC BUTTONS + BPL + + DEY ++ STY ESTKL+1,X + STY ESTKH+1,X + TAY ; LDY #$00 + BIT GCPB2 + BPL + + DEY ++ STY ESTKL,X + STY ESTKH,X RTS +GC0DLY NOP ; TIMING + BPL GC1READ +GC1DLY NOP ; TIMING + BPL JOYLP +BUZZDLY BNE + ; TIMING ++ BNE GC0READ end done From 03923a982576bfdb5b3abbee1e77a504d3b755d2 Mon Sep 17 00:00:00 2001 From: David Schmenk Date: Fri, 23 Feb 2018 17:11:55 -0800 Subject: [PATCH 18/28] Uthernet II found! Fix HTTPD! --- src/samplesrc/httpd.pla | 25 ++++++++++++------------- 1 file changed, 12 insertions(+), 13 deletions(-) diff --git a/src/samplesrc/httpd.pla b/src/samplesrc/httpd.pla index ab73a90..067dcc6 100644 --- a/src/samplesrc/httpd.pla +++ b/src/samplesrc/httpd.pla @@ -11,13 +11,13 @@ include "inc/cmdsys.plh" include "inc/inet.plh" include "inc/fileio.plh" +include "inc/conio.plh" word socketHTTP -byte[65] prefix -word filebuff, iobuff -byte fileInfo[12] = 0 // used for get_file_info() -byte hello = "Apple II Web Server - 12 Nov 15\n" -byte defhtml = "INDEX.HTML" +byte[65] prefix +word filebuff +byte[15] fileInfo = 0 // used for get_file_info() +byte defhtml = "INDEX.HTML" byte[200] okhdr // combined response header // // HTTP response codes @@ -78,7 +78,7 @@ def strcat2(dst, src1, src2) return dst end def itos(dst, i) - if i < 0; ^dst = '-'; i = -i; dst = dst + 1; fin + if i < 0; ^dst = '-'; i = -i; dst++; fin if i < 10 ^dst = i + '0' else @@ -141,7 +141,6 @@ def servHTTP(remip, remport, lclport, data, len, param) // Get file info // //puts("getting file info "); // debug - fileio:getfileinfo(@filename) refnum = fileio:open(@filename) // try to open this file with ProDOS if refnum // file was opened OK filelen = fileio:geteof(refnum) // get length of file for Content-Length @@ -152,7 +151,8 @@ def servHTTP(remip, remport, lclport, data, len, param) // // Content type header // - if fileInfo.4 == $03 OR fileInfo.4 == $04 + fileio:getfileinfo(@filename, @fileInfo) + if fileInfo.1 == $03 OR fileInfo.1 == $04 // // this a text file // @@ -181,8 +181,8 @@ def servHTTP(remip, remport, lclport, data, len, param) else // file couldn't be opened, so return 404 on this puts("404 Not Found");putln // debug iNet:sendTCP(socketHTTP, @httpNOTFOUND + 1, httpNOTFOUND) - fin // if refnum - break // return + fin // refnum + break fin next else @@ -196,7 +196,7 @@ end if !iNet:initIP() return -1 fin -puts(@hello) +puts("PLASMA Web Server, Version 1.0\n") fileio:getpfx(@prefix) // // Alloc aligned file/io buffers @@ -213,7 +213,6 @@ repeat socketHTTP = iNet:listenTCP(80, @servHTTP, 0) fin iNet:serviceIP() -until ^$C000 > 127 -^$C010 +until conio:keypressed() done From 47217c0d9373a526414f62cc4e1ff0844196f2ec Mon Sep 17 00:00:00 2001 From: David Schmenk Date: Fri, 23 Feb 2018 17:47:32 -0800 Subject: [PATCH 19/28] Add some useful links --- src/samplesrc/index.html | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/src/samplesrc/index.html b/src/samplesrc/index.html index 5b16ba7..29f2954 100755 --- a/src/samplesrc/index.html +++ b/src/samplesrc/index.html @@ -1,5 +1,11 @@ -Hello from the Apple II! +

Hello from PLASMA!

+ +

Useful links:

+
PLASMA Language +
Facebook Apple II Enthusiasts +
comp.sys.apple2 + - \ No newline at end of file + From e79d17c14a1ce7fbd86b3b3f465c14a3357db008 Mon Sep 17 00:00:00 2001 From: David Schmenk Date: Fri, 23 Feb 2018 18:25:16 -0800 Subject: [PATCH 20/28] Update images --- PLASMA-BLD1.PO | Bin 143360 -> 143360 bytes PLASMA-DEM1.PO | Bin 143360 -> 143360 bytes PLASMA-SYS1.PO | Bin 143360 -> 143360 bytes 3 files changed, 0 insertions(+), 0 deletions(-) diff --git a/PLASMA-BLD1.PO b/PLASMA-BLD1.PO index a9f17daaf5c64769b665e7fa489f9721eabfbbe1..bb1d25479ab4c0e69fae7455f9a2bd7d08c0b334 100644 GIT binary patch delta 1998 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 delta 1663 zcmaJ=du&r>6hG&_+7;+-DO2PRS=n5b=qAfzmd22D>+LA^wYEd>fo?)YQDMTSg4$Jd zzL8OpsR&r`iZ4VixH%MgO>lyuD2h%unJ7Vniy01ayYsZ&+HOm{$uIYu@B4kf^F7Y5 zu2Wmrsohq}ja!gYVAMhvfIn9+M!cN02@P<53g{w@nC#G36DzgfJT8{UgNam; zGv}50taiujAr`2Y00)2a@ja$$db1}L#cCu+M3`Xpm8BO@Cj&xj;&4e?WPSFe(1?Y( zwi%_~WIX`YOchNdDvEHK-BBX>Qasg7v<`0g#)#&(*{y*znh#hov1v3mcH5OEW2gdn zSguK%p$QSDNVe2!iqsomJk**-(ypio%#eI;DNvYTt9L;LRA-K)<=D#7_DpIuRCI2< z=(P0P%dvYa(#xvL=tT>~;c`m9iJcmCGi=^-yR8Nd>nKXbf|1yy@n-x7=D;b=$o8!P^(yai?M^>?UgSfJwXX?t2z3 zuD*8((a&SFT|cIuXXa-@xlsd)lrd+{A-A;lzWZsm54WE+GNwidW`f;08G_7GeNd=n z=ILvNAV;ybmZMl3xw5;)v<8BP|79sH-7_&XJqyCs0O2J74XapPxRQhLWEbgkyx`gcF2zLI>d_;S}LC z5Bl)$6r3gWkoZ55hQC^v=~)qEHbwttG9Fm|;6o3G>cWrE;d?Q9L0sL#g{DeQ$>q;4 z_1L8N%L$Kx0U$g1WN{P5`qt|Yr1gOM0`=`5qx$w@r^j73)0H%W`Xbq9#R&U|aQRT% zL1?h=UM4xqC^@qfYfnc?ZUYEVkdfS6JP^U`_d2{DU(zq?Yot~@+IyuQx5Ja_PxTGp zi@`j~I~T>Y(unFibO;L$uNtX5XAHedrh+NSiNU+db&#P_WkB6a+tG|VT%JpExzc>4 zwvt)$3`w=Y!{zziHosJ!)KkA8i}u7Vs!MrqZMX>Yn>Zczq4;S1<4-*K)YH#AyYjhJ z4XY#1({p#DtjBD2&Dusv`cb|bwd_mlUP&Yt6!`TUUyW{}^k0-qP{(eTUr)@rQQ)?` z`PSQ%^`Sfqb%w3m-rKJ1*!g}_^9L=vKKy9+$4!P}?8YXn!T}SzXW#zB!g>@k4t#R( z(5G#m9X>)sy(q85@!HRie)-k0ufI7?Bj-_$q9}ZO;`<-kf28~Z$~$mu#!sC;pX@sI b>u;wMi}s-)w;>}RA{<6-bk9Wj4BGz#=i8H3 From b6bb431ac23214a5c44d9284ec28f2ca60c8d822 Mon Sep 17 00:00:00 2001 From: David Schmenk Date: Sat, 24 Feb 2018 10:28:52 -0800 Subject: [PATCH 21/28] Remove apple II-isms from sndseq --- src/libsrc/apple/sndseq.pla | 48 +++++++++++++++++++++++++++---------- src/samplesrc/playseq.pla | 2 +- 2 files changed, 36 insertions(+), 14 deletions(-) diff --git a/src/libsrc/apple/sndseq.pla b/src/libsrc/apple/sndseq.pla index 1989cd0..52f9d39 100755 --- a/src/libsrc/apple/sndseq.pla +++ b/src/libsrc/apple/sndseq.pla @@ -67,12 +67,14 @@ predef musicStop#0 predef spkrSequence(yield, func)#0 predef a2spkrTone(pitch, duration)#0 predef a2spkrPWM(sample, speed, len)#0 +predef a2keypressed // // Static sequencer values // export word musicSequence = @spkrSequence export word spkrTone = @a2spkrTone export word spkrPWM = @a2spkrPWM +word keypressed = @a2keypressed word instr[] // Overlay with other variables word seqTrack, seqEvent, seqTime, eventTime, updateTime @@ -328,6 +330,30 @@ asm a2spkrPWM(sample, speed, len)#0 INX RTS end +asm a2keypressed + INC $004E ; rndseed + BNE + + INC $004F ++ DEX + LDY #$00 + BIT $C000 + BPL + + DEY ++ STY ESTKL,X + STY ESTKH,X + RTS +end +def a3keypressed + byte count + byte params[5] + + params.0 = 3 + params.1 = cmdsys.devcons + params.2 = 5 + params:3 = @count + syscall($82, @params) + return count +end def a3spkrTone(pitch, duration)#0 byte env @@ -591,8 +617,7 @@ def mbSequence(yield, func)#0 // seqTime++ while !(mbVIA1->IFR & $40) // Wait for T1 interrupt - if ^$C000 > 127; quit = TRUE; break; fin - *rndseed++ + if a2keypressed(); quit = TRUE; break; fin loop mbVIA1->IFR = $40 // Clear interrupt if yieldTime <= seqTime; func()#0; yieldTime = seqTime + yield; fin @@ -703,7 +728,6 @@ def spkrSequence(yield, func)#0 if notes1[i] spkrTone(periods1[i], arpeggioDuration[numNotes])#0 fin - *rndseed++ next seqTime++ else @@ -713,13 +737,12 @@ def spkrSequence(yield, func)#0 period = periods1[i] break; fin - *rndseed++ next duration = eventTime - seqTime seqTime = duration + seqTime spkrTone(period, DUR16TH * duration)#0 fin - if ^$C000 > 127; return; fin + if keypressed(); return; fin if yieldTime <= seqTime; func()#0; yieldTime = seqTime + yield; fin until FALSE end @@ -737,9 +760,8 @@ def noSequence(yield, func)#0 repeat seqTime++ if seqTime < 0; seqTime = 1; fin // Capture wrap-around - *rndseed++ - a2spkrTone(0, DUR16TH) // Waste 16th of a second playing silence - if ^$C000 > 127; return; fin + spkrTone(0, DUR16TH) // Waste 16th of a second playing silence + if keypressed(); return; fin if yield == seqTime; func()#0; seqTime = 0; fin until FALSE end @@ -782,17 +804,17 @@ end // Play until keystroke // export def musicGetKey(yield, backgroundProc)#1 - while ^$C000 < 128 + while not keypressed() musicSequence(yield, backgroundProc)#0 // Call background proc every half second loop - ^$C010 - return ^$C000 + return getc end when MACHID & MACHID_MODEL is MACHID_III - spkrTone = @a3spkrTone - spkrPWM = @a3spkrPWM + spkrTone = @a3spkrTone + spkrPWM = @a3spkrPWM + keypressed = @a3keypressed break is MACHID_I puts("Sound unsupported.\n") diff --git a/src/samplesrc/playseq.pla b/src/samplesrc/playseq.pla index f3af6c6..087dad9 100644 --- a/src/samplesrc/playseq.pla +++ b/src/samplesrc/playseq.pla @@ -12,7 +12,7 @@ word ref // Sample background process to show it's working // def backgroundProc#0 - ^$0400++ + putc('.') end arg = argNext(argFirst) From c5d4d7d35f07d27a7b6a494d464b2bd377eb5fc0 Mon Sep 17 00:00:00 2001 From: David Schmenk Date: Sat, 24 Feb 2018 12:29:47 -0800 Subject: [PATCH 22/28] Update images for Apple 3 sound sequencer --- PLASMA-DEM1.PO | Bin 143360 -> 143360 bytes PLASMA-SYS1.PO | Bin 143360 -> 143360 bytes 2 files changed, 0 insertions(+), 0 deletions(-) diff --git a/PLASMA-DEM1.PO b/PLASMA-DEM1.PO index a49015ad43712e918f3a6ffbd732db87180dde35..62ca12c48ea175ca4584b8b441a33af9119cebcc 100644 GIT binary patch delta 174 zcmZp8z|ru4V}lP1ON5Fn&*lIYJ1#+AMurF#DIR5p#|&Tw`({R_B*x8*0{^wSdl;Bf z85mRrm>9GtbKA(UYUzbAFih67Ne|OtV4A4IAUjc?L9Wq=fuYe9h;0}cCfYN|H#!5^ zo6^?bKA(UXE3nvR4}ki*0D+V)?<*JXviSfXu`nIXb!}73=9(;8RQ#XfoyLe z+mC@~VjzRS#1NoZB#c+L#UG=P{^HEMicb*u}uI`K66C<75FQ&Sn<7 L?JRbTe?9^Lb;2jg diff --git a/PLASMA-SYS1.PO b/PLASMA-SYS1.PO index 0b9c70a50b2f150e98e434f6fe1735c543a3919c..792faacd08f5d6321ac568e49d83ac760f76abd4 100644 GIT binary patch delta 3404 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 mw9Yn@WyF(HS2bHzGv From 86408f5157fe60f6a1ee01d2b97c2cc75f19919b Mon Sep 17 00:00:00 2001 From: David Schmenk Date: Sat, 24 Feb 2018 18:11:06 -0800 Subject: [PATCH 23/28] First Commodore 64 version! --- PLASMA.D64 | Bin 0 -> 174848 bytes src/makefile | 2 +- src/vmsrc/c64/cmd.pla | 140 +++++++++------------------------------- src/vmsrc/c64/plvmc64.s | 22 ++++--- 4 files changed, 46 insertions(+), 118 deletions(-) create mode 100644 PLASMA.D64 diff --git a/PLASMA.D64 b/PLASMA.D64 new file mode 100644 index 0000000000000000000000000000000000000000..36f4096c8766a518699243700aa6308b55320cf4 GIT binary patch literal 174848 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 vmsrc/c64/cmd.a $(PLVMC64): vmsrc/c64/plvmc64.s vmsrc/c64/cmd.a - acme -o $(PLVMC64) -l vmsrc/c64/plvmc64.sym vmsrc/c64/plvmc64.s + acme -f cbm -o $(PLVMC64) -l vmsrc/c64/plvmc64.sym vmsrc/c64/plvmc64.s vmsrc/apple/a1cmd.a: vmsrc/apple/a1cmd.pla $(PLASM) ./$(PLASM) -AOW < vmsrc/apple/a1cmd.pla > vmsrc/apple/a1cmd.a diff --git a/src/vmsrc/c64/cmd.pla b/src/vmsrc/c64/cmd.pla index 9688a77..d457d4f 100755 --- a/src/vmsrc/c64/cmd.pla +++ b/src/vmsrc/c64/cmd.pla @@ -1,6 +1,6 @@ const RELADDR = $1000 -const inbuff = $200 -const freemem = $0006 +const freemem = $0100 +//const inbuff = $0200 // // System flags: memory allocator screen holes. // @@ -18,16 +18,6 @@ const resxhgr2 = $0080 const modkeep = $1000 const modinitkeep = $2000 // -// CFFA1 addresses. -// -const CFFADest = $00 -const CFFAFileName = $02 -const CFFAOldName = $04 -const CFFAFileType = $06 -const CFFAAuxType = $07 -const CFFAFileSize = $09 -const CFFAEntryPtr = $0B -// // Pedefined functions. // predef syscall(cmd,null)#1, call(addr,areg,xreg,yreg,status)#1 @@ -51,13 +41,9 @@ byte perr, refauto // // String pool. // +byte inbuff[128] byte autorun[] = "AUTORUN" byte verstr[] = "\nPLASMA " -byte freestr[] = "MEM FREE:$" -byte errorstr[] = "ERR:$" -byte prompt[] = "PLASMA" -byte okstr[] = "OK" -byte huhstr[] = "?\n" byte hexchar[] = '0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F' // // Exported Machine ID. @@ -195,12 +181,6 @@ CALL6502 JSR $FFFF REGVALS !FILL 4 end // -// QUIT TO MONITOR -// -asm quit()#0 - JMP $9000 -end -// // SET MEMORY TO VALUE // MEMSET(ADDR, VALUE, SIZE) // With optimizations from Peter Ferrie @@ -725,16 +705,15 @@ end // asm cout(c)#0 LDA ESTKL,X - JSR TOUPR - ORA #$80 - JMP $FFEF + INX + JMP $FFD2 end asm cin()#1 DEX -- LDA $D011 - BPL - - LDA $D010 + STX ESP + JSR $FFCF AND #$7F + LDX ESP STA ESTKL,X LDA #$00 STA ESTKH,X @@ -755,62 +734,19 @@ def print(i)#0 cout(i % 10 + '0') end def rdstr(prompt)#1 - byte ch, maxlen - maxlen = 0 + byte ch inbuff.0 = 0 cout(prompt) - repeat + for inbuff = 0 to 127 ch = cin - when ch - is $15 // right arrow - if ^inbuff < maxlen //inbuff.0 < maxlen - inbuff.0++ - ch = inbuff[inbuff.0] - cout(ch) - fin - break - is $08 // left arrow - if inbuff.0 - cout('\\') - cout(inbuff[inbuff.0]) - inbuff.0-- - fin - break - is $04 // ctrl-d - if inbuff.0 - cout('#') - cout(inbuff[inbuff.0]) - memcpy(inbuff + inbuff.0, inbuff + inbuff.0 + 1, maxlen - inbuff.0) - maxlen-- - inbuff.0-- - fin - break - is $0C // ctrl-l - crout - prstr(inbuff) - break - is $0D // return - is $18 // ctrl-x - crout - inbuff.0 = 0 - break - is $9B // escape - inbuff.0 = 0 - ch = $0D - break - otherwise - if ch >= ' ' - cout(ch) - inbuff.0++ - inbuff[inbuff.0] = ch - if inbuff.0 > maxlen - maxlen = inbuff.0 - fin - fin - wend - until ch == $0D or inbuff.0 == $7F - cout($0D) - return inbuff + if ch == $0D + break + fin + inbuff.0++ + inbuff[inbuff.0] = ch + next + crout + return @inbuff end def prbyte(v)#0 cout(hexchar[(v >> 4) & $0F]) @@ -834,27 +770,13 @@ def strcat(dst, src)#1 return dst end // -// CFFA1 routines -// FILE I/O +// C64 FILE I/O // -//def opendir -// perr = syscall($10, 0) -// return perr -//end -//def readdir -// perr = syscall($12, 0) -// return *CFFAEntryPtr -//end def finddirentry(filename)#1 - *CFFAFileName = filename - perr = syscall($14, 0) - return *CFFAEntryPtr + return 0 end def readfile(filename, buffer)#1 - *CFFADest = buffer - *CFFAFileName = filename - perr = syscall($22, 0) - return perr + return 0 end // // Heap routines. @@ -1150,7 +1072,7 @@ heap = *freemem // // Print PLASMA version // -prstr(@verstr); prbyte(version.1); cout('.'); prbyte(version.0); crout +prstr("\nPRELIM PLASMA "); prbyte(version.1); cout('.'); prbyte(version.0); crout // // Init symbol table. // @@ -1176,7 +1098,7 @@ perr = 0 // Print some startup info. // if not ^cmdptr - prstr(@freestr) + prstr("MEM FREE:$") prword(availheap) crout fin @@ -1186,24 +1108,24 @@ fin while 1 if ^cmdptr when toupper(parsecmd(cmdptr)) - is 'Q' - quit + is 'C' + break is '+' execmod(cmdptr) break otherwise - prstr(@huhstr) + cout('?') wend if perr - prstr(@errorstr) + prstr("ERR:$") prbyte(perr) perr = 0 else - prstr(@okstr) + prstr("OK") fin - crout() + crout fin - prstr(@prompt) - cmdptr = rdstr($BA) + prstr("C64 PLASMA") + cmdptr = rdstr(':') loop done diff --git a/src/vmsrc/c64/plvmc64.s b/src/vmsrc/c64/plvmc64.s index ae2b0c7..bfaa45c 100644 --- a/src/vmsrc/c64/plvmc64.s +++ b/src/vmsrc/c64/plvmc64.s @@ -10,8 +10,8 @@ ;* !SOURCE "vmsrc/plvmzp.inc" DVSIGN = TMP+2 -DROP = $EF -NEXTOP = $F0 +DROP = $7F +NEXTOP = $80 FETCHOP = NEXTOP+1 IP = FETCHOP+1 IPL = IP @@ -21,7 +21,7 @@ OPPAGE = OPIDX+1 ;* ;* INTERPRETER HEADER+INITIALIZATION ;* - *= $0800 + *= $1000 SEGBEGIN JMP VMINIT ;* ;* SYSTEM INTERPRETER ENTRYPOINT @@ -900,21 +900,27 @@ LEAVE INY ;+INC_IP RET RTS CMD !SOURCE "vmsrc/c64/cmd.a" SEGEND = * -VMINIT LDY #$10 ; INSTALL PAGE 0 FETCHOP ROUTINE +VMINIT JSR $FFE7 ; CLOSE ALL CHANNELS + LDY #$10 ; INSTALL PAGE 0 FETCHOP ROUTINE - LDA PAGE0-1,Y STA DROP-1,Y DEY BNE - LDA #$4C ; SET JMPTMP OPCODE STA JMPTMP - STY IFPL ; INIT FRAME POINTER - LDA #$80 + STY IFPL ; INIT FRAME POINTER TO $D000 + LDA #$D0 STA IFPH LDA #SEGEND - STA SRCH + STA $0101 + LDX #$FF ; INIT STACK POINTER + TXS LDX #ESTKSZ/2 ; INIT EVAL STACK INDEX + LDA $01 + AND #$FE ; SWAP OUT BASIC ROM + STA $01 JMP CMD PAGE0 = * !PSEUDOPC DROP { From 0b37080b649bdc2d74433d96b5519dfb9a4f5a9e Mon Sep 17 00:00:00 2001 From: David Schmenk Date: Mon, 26 Feb 2018 06:40:42 -0800 Subject: [PATCH 24/28] Update Version 1.0.md --- doc/Version 1.0.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/Version 1.0.md b/doc/Version 1.0.md index 86ee8da..a16180e 100644 --- a/doc/Version 1.0.md +++ b/doc/Version 1.0.md @@ -4,7 +4,7 @@ Welcome to PLASMA: the Grand Unifying Platform for the Apple 1, ][, and ///. Download the four disk images (three if you don't plan to boot an Apple ///): -[PLASMA 1.0 System](https://github.com/dschmenk/PLASMA/blob/master/PLASMA-SYS1.PO?raw=true) +[PLASMA 1.0 System and ProDOS boot](https://github.com/dschmenk/PLASMA/blob/master/PLASMA-SYS1.PO?raw=true) [PLASMA 1.0 Build Tools](https://github.com/dschmenk/PLASMA/blob/master/PLASMA-BLD1.PO?raw=true) From b96c08fb5963df810bdf0eb44513bcacfb04fea7 Mon Sep 17 00:00:00 2001 From: David Schmenk Date: Mon, 26 Feb 2018 06:41:03 -0800 Subject: [PATCH 25/28] Update Version 1.0.md --- doc/Version 1.0.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/Version 1.0.md b/doc/Version 1.0.md index a16180e..a24595c 100644 --- a/doc/Version 1.0.md +++ b/doc/Version 1.0.md @@ -4,7 +4,7 @@ Welcome to PLASMA: the Grand Unifying Platform for the Apple 1, ][, and ///. Download the four disk images (three if you don't plan to boot an Apple ///): -[PLASMA 1.0 System and ProDOS boot](https://github.com/dschmenk/PLASMA/blob/master/PLASMA-SYS1.PO?raw=true) +[PLASMA 1.0 System and ProDOS Boot](https://github.com/dschmenk/PLASMA/blob/master/PLASMA-SYS1.PO?raw=true) [PLASMA 1.0 Build Tools](https://github.com/dschmenk/PLASMA/blob/master/PLASMA-BLD1.PO?raw=true) From 8ebe11621a06f97e0bd70757906b3da764b30aeb Mon Sep 17 00:00:00 2001 From: David Schmenk Date: Mon, 26 Feb 2018 11:31:59 -0800 Subject: [PATCH 26/28] Better MockingBoard detection --- PLASMA-SYS1.PO | Bin 143360 -> 143360 bytes src/libsrc/apple/sndseq.pla | 72 +++++++++++++++++++++++++++--------- 2 files changed, 55 insertions(+), 17 deletions(-) diff --git a/PLASMA-SYS1.PO b/PLASMA-SYS1.PO index 792faacd08f5d6321ac568e49d83ac760f76abd4..29003b1f4da3d651216be8e6c45103adfb69badf 100644 GIT binary patch delta 1573 zcmYM!e@xVM9LMp`=X=L-+yUMlNqQ&00x{1_;?mW^>85PiaNO|9WE8a!e{9taDc!Ak ze7CTvVX@G!SV|rW2u@%(LR>N~REEJkIK)|PQb>ratuj+vL{EQgZQsZH{rbMY-#2^_3e{chKu2Qdw$b3w@)_hX_&aUKU_0(LhSF^A9_;Dt&>&8OGCqvk;|i3f>OCF zwc$GX^nrj(l4V*lEw9^JV%TwQrZD(t+`rJ~TlqwNmJ6pPokbFU@OCbsUiI4cy7S34b$S&ya(|4;7* zLrR< zU84wf6W+%#F5`Rri0iQFggP4zq#*;#k&Cr>1;yA5FSf&vkMJpKaTozK;w0L2!liZ) zx^NaDoJT(fFoaQz;U;e3ADwp8Eff8zdZA{)h3AojRd8biwxJI7IE5|@U>vt0qJ*kP zJgj&ei;#__$iWKaAs|=(1x$@HA1+60gU1YjNv+N z;#W+=Vi4+lWMesUQGoS$1DoJ8_=Wlj;R`gP4QKHUzQr&m@He8PIX)yI6$`NpFJLwD z@iK}~jJHsVZK%XP9K>;)L@PS{l+)-&2z|JSFs|S`jA0y8_yvF94unytF_?#^umssy ziX5y#F}9!@pQ8@P(1LFGhbY(ZGj8Gz^f5v;VHRe?j#Q*06N~T+R$(nXSdSu^(Il>Y%)~0nxuM$_p>IKPTcp$XF=&(P?k&#PoW0f{i)Fr;k3uj_1h;K HMrGlDDjvvT delta 1674 zcmYM#e@v8h9KiAK_u=G@yF;J5Tj2r9*_|}c!LG3Rdl_NYx(K_QDQQWd2?<>4G|%br zl*JUCTn(OSrHm94P1(?4Yq7}C(ICV_O{?YN#~}YmHx*ksdJAnmdtRUK=lglS-{+6- z_xtRrxM8ZeVQM;HFf8|^TAL3VB1W0kJk{DYY&VOgs#xwxwz@^17)zQT+>QHUda*@W zBgBv`QS44W*Y$nuTHt&~XM4xXZI>1E!;hm_21dTc~V+OoUf0DA6N4xh+uI`_Yv73Wsko3sH|WZue2zkmU~BKiZqTm z$Hz=QCT-HP&Jj*g^GqUrI7y$?C|Al8dbCl_beQbnDQddM9!^u!hiu_#YF>@r-6$W6 zY!I1_m&yy@E-rg3yS!jSkt?vieAB$dpb(jfi*tjEUvVvT<(8MN8L#+U53hx;Kw&}I zSY^@^8MDVLOmn#(*1WBRuv;y0tE>I0pkaZ0hG3;Vyid(jgs)_uDxUMZh1lU%b@OrQ z${2A9r8rqA!%0FJvI)gx7m5ejsD#lWlyx}4xRCzpap{iSk|HVW9c;!nRNw>biW3oSFG&_#vF8)+{Mne6{ZpASRU)`&NCJ36ME&7N+_A1 LL6dB_BJ=+RiDk*| diff --git a/src/libsrc/apple/sndseq.pla b/src/libsrc/apple/sndseq.pla index 52f9d39..e0da4aa 100755 --- a/src/libsrc/apple/sndseq.pla +++ b/src/libsrc/apple/sndseq.pla @@ -213,6 +213,36 @@ asm psgWrite(pVIA, reg, val)#0 INX RTS end +asm viaCheck(pVIA)#2 + PHP + SEI + LDA ESTKL,X + STA TMPL + LDA ESTKH,X + STA TMPH + STX ESP + LDX #$80 + LDY #$04 +- LDA (TMP),Y + BMI + + DEX + BNE - + TXA ; TIMEOUT + BEQ ++ ++ TAX + LDA (TMP),Y +++ TAY + TXA + LDX ESP + DEX + STA ESTKL,X + STY ESTKL+1,X + LDA #$00 + STA ESTKH,X + STA ESTKH+1,X + PLP + RTS +end // // Apple II speaker tone generator routines // @@ -374,14 +404,21 @@ end // Search slots for MockingBoard // def mbTicklePSG(pVIA) - pVIA->IER = $7F // Mask all interrupts - pVIA->ACR = $00 // Stop T1 countdown - pVIA->DDRB = $FF // Output enable port A and B - pVIA->DDRA = $FF - pVIA->IORA = $00 // Reset MockingBoard - if pVIA->IORA == $00 + byte tmrBegin, tmrEnd + word tmrDiff + + tmrBegin, tmrEnd = viaCheck(pVIA) + tmrDiff = tmrEnd - tmrBegin + //puts("VIA address: $"); puth(pVIA); puts(" Timer Diff = "); puti(tmrDiff); putln + if tmrDiff == 10 + pVIA->IER = $7F // Mask all interrupts + //pVIA->ACR = $00 // Stop T1 countdown + pVIA->DDRB = $FF // Output enable port A and B + pVIA->DDRA = $FF + pVIA->IORA = $00 // Reset MockingBoard + //if pVIA->IORA == $00 pVIA->IORA = $04 // Inactive MockingBoard control lines - if pVIA->IORA == $04 + //if pVIA->IORA == $04 // // At least we know we have some sort of R/W in the ROM // address space. Most likely a MockingBoard or John Bell @@ -392,7 +429,7 @@ def mbTicklePSG(pVIA) //if mbReadP(pVIA, 2) == $7E and mbReadP(pVIA, 3) == $0A return pVIA //fin - fin + //fin fin return 0 end @@ -632,7 +669,7 @@ def mbSequence(yield, func)#0 psgWrite(mbVIA2, BENVAMP, $00) psgWrite(mbVIA2, CENVAMP, $00) fin - mbVIA1->ACR = $00 // Stop T1 countdown + //mbVIA1->ACR = $00 // Stop T1 countdown mbVIA1->IER = $7F // Mask all interrupts mbVIA1->IFR = $40 // Clear interrupt setStatusReg(status) @@ -821,14 +858,15 @@ when MACHID & MACHID_MODEL return -1 break otherwise - puts("MockingBoard Slot:\n") - puts("ENTER = None\n") - puts("0 = Scan\n") - puts("1-7 = Slot #\n") - instr = gets('>'|$80) - if ^instr - mbSlot = mbSearch(^(instr + 1) - '0') - fin + //puts("MockingBoard Slot:\n") + //puts("ENTER = None\n") + //puts("0 = Scan\n") + //puts("1-7 = Slot #\n") + //instr = gets('>'|$80) + //if ^instr + // mbSlot = mbSearch(^(instr + 1) - '0') + //fin + mbSlot = mbSearch(0) break wend if mbSlot < 0 From 8f408c8bbb1582dbebd7d2cdb0f7389da059971a Mon Sep 17 00:00:00 2001 From: Dave Schmenk Date: Mon, 26 Feb 2018 19:32:20 -0800 Subject: [PATCH 27/28] more robust MB check --- PLASMA-SYS1.PO | Bin 143360 -> 143360 bytes src/libsrc/apple/sndseq.pla | 22 ++++++---------------- 2 files changed, 6 insertions(+), 16 deletions(-) diff --git a/PLASMA-SYS1.PO b/PLASMA-SYS1.PO index 29003b1f4da3d651216be8e6c45103adfb69badf..0437ae0e35da7fcbce78345146f6c9ce5f34a118 100644 GIT binary patch delta 1440 zcmYM!e@xVM9LMp`=gV>Ty#wNV-&3KpLsJ5|a57=pj4fA8*C1lM8#YR%t!!Y^QHva! zci#<*b@K=Lt;I5+>~EhYh2`Ymy`;{#?hPxmYrtl9nTTt{>}<$NT;IzQ2Eb z{&;`B-(W%wCe)5=liFyysLJ-ZR52?44#%b@lMX$Um7=^PM7o|P+T48uUk_dIeH%aZ zP5hY?XZn4@lDWnibKY_8kV>)nLW`W7{%Ggb0_%5!zrS-`xp6h}^RB_eVpp&E>IZVG zt$Lzd3?@xP4oJncg=L9cW0r-b#}jkDXkGu)y(-(Yid-%HB~GupJU=NGsDtZAkM56@QI67M2D7PF?>`vs>j@n%7mkMJrPU)$ff>|4@D+Q+4;s zdkwi-MY8ZW#!k1%h?I9?_3d)MwCV1DrkRJOQ#wMfhM8K0Dsn7lVN|Y={bqAiKAg5d zZ}4b2rFz3GEhpWKM`gZ@n!iP5(R|%4ltx%Gg_5odWdTZ2gDAW%p@h(XKiypZk(?XI zP(<@QCB=9`5k@uE;SI!b3TJR0mtap4Mk;hbEzhcEib4)TzXLOg;eu@pX3q8h953SL7!-b4^vupRH?0NU{}j-e+& zIgUOIUhL<&Vv-k3sbPBuzNTmrz(2ZUI delta 1436 zcmYMxe@xVM9LMp`=X=N9ad>feyO9h^LoGE|GnSU z5mR-<)H%Os{W)F~uS$$d5mVxy(7m*%JHI+DPT3=b!)_5B&cSO}CcfJ~G(38BxL{!X z%k9FlqRQ51i`qVtN{;s8CvtIR*X>NhNcjHIySiZ4?ej;QXGR*r^<%A~p}%23d%028 zHh(G=!TV&9{q+W7hO)#Z#%>49Lv? zx(WYxT}^V@;!dcjvF4iuugBf9?5ymN%UsSEqP{e1VT|z9^bDPo%~D2tUTu-5q|xR4 zw;SIoZPHwy;B#3EO(NBzr3d9M8P?tp$_z`k-Ir)hEwcNPtf>yIKPcDAZf!m&*FWZR z3Z({?6+&^?g_4aTRH7U11fkR;{4l?^txcx*A5lczIwelsq6l>_-o!Yr<0ful8g`vf zm&1ieu?o4^jIDSMr6@-w4#JQ3@F7m(Gy-TrJGykjtzIBpL@x$#6~h?C7;YefIV|80 zopz>BI{e9cp=QF3Cy|3qD8%#Fk47}10~axhDJ(+72vv^u& z_Tlvy;aA@vybV9z#St9GNi?Gso%kGIU;slH#SQ#`2&OTIc`U(d5bA1VAs3rbgdNz8 zz3>_QLj8d7FGZI;KhC%MlDX@9NH1W z1?}=@GQmGW4C7mTj|iqPi(l|7?m?J@8jF=!i*?At2IOE1O0f@hIE6->MH~7shDrQ{ zIovaG1bwVf&4|ZxIFXDLq#^^4V-vQ*gB>VA8Oq_qJE(_-(>Q}Rgm4L0@FQk0iv`?| zeYu6`+2PeMyy3kakb%bP=tk-UZq_eqG GR{sTEYMJc- diff --git a/src/libsrc/apple/sndseq.pla b/src/libsrc/apple/sndseq.pla index e0da4aa..152d951 100755 --- a/src/libsrc/apple/sndseq.pla +++ b/src/libsrc/apple/sndseq.pla @@ -213,7 +213,7 @@ asm psgWrite(pVIA, reg, val)#0 INX RTS end -asm viaCheck(pVIA)#2 +asm viaCheck(pVIA)#1 PHP SEI LDA ESTKL,X @@ -223,23 +223,18 @@ asm viaCheck(pVIA)#2 STX ESP LDX #$80 LDY #$04 + SEC - LDA (TMP),Y BMI + DEX BNE - TXA ; TIMEOUT BEQ ++ -+ TAX - LDA (TMP),Y -++ TAY - TXA - LDX ESP - DEX ++ SBC (TMP),Y +++ LDX ESP STA ESTKL,X - STY ESTKL+1,X LDA #$00 STA ESTKH,X - STA ESTKH+1,X PLP RTS end @@ -404,13 +399,8 @@ end // Search slots for MockingBoard // def mbTicklePSG(pVIA) - byte tmrBegin, tmrEnd - word tmrDiff - - tmrBegin, tmrEnd = viaCheck(pVIA) - tmrDiff = tmrEnd - tmrBegin - //puts("VIA address: $"); puth(pVIA); puts(" Timer Diff = "); puti(tmrDiff); putln - if tmrDiff == 10 + //puts("VIA address: $"); puth(pVIA); puts(" Timer Diff = "); puti(viaCheck(pVIA)); putln + if viaCheck(pVIA) == 8 and viaCheck(pVIA) == 8 // Check twice pVIA->IER = $7F // Mask all interrupts //pVIA->ACR = $00 // Stop T1 countdown pVIA->DDRB = $FF // Output enable port A and B From 28f6e11606fc54c0d79cc276d49e2caaaf634df4 Mon Sep 17 00:00:00 2001 From: Dave Schmenk Date: Fri, 2 Mar 2018 21:54:03 -0800 Subject: [PATCH 28/28] Don't over-copy 65C02 routines --- src/vmsrc/apple/plvm02.s | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/vmsrc/apple/plvm02.s b/src/vmsrc/apple/plvm02.s index 1194c64..77d2d58 100755 --- a/src/vmsrc/apple/plvm02.s +++ b/src/vmsrc/apple/plvm02.s @@ -1884,7 +1884,7 @@ OPCPY STA DST INC SRC BNE + INC SRC+1 -+ ++ DEY - LDA (SRC),Y STA (DST),Y DEY