diff --git a/src/libsrc/sos.pla b/src/libsrc/sos.pla new file mode 100644 index 0000000..69a41af --- /dev/null +++ b/src/libsrc/sos.pla @@ -0,0 +1,155 @@ +include "inc/cmdsys.plh" +include "inc/args.plh" +include "inc/fileio.plh" + +word arg, ref, interp + +asm equates + !SOURCE "vmsrc/plvmzp.inc" +end +// +// Exec SOS.INTERP image +// +asm sosexec(addr)#0 + LDA ESTKL,X ; PULL ADDRESSES FROM INTERP HEADER + STA SRCL + LDA ESTKH,X + STA SRCH + LDY #$0A + LDA (SRC),Y + INY + STA DSTL + PHA + LDA (SRC),Y + INY + STA DSTH + PHA + LDA (SRC),Y + INY + STA TMPL + LDA (SRC),Y + STA TMPH + TYA ; SKIP INTERP HEADER FOR SRC + SEC + ADC SRCL + STA SRCL + BCC + + INC SRCH ++ LDA DSTL + CMP SRCL + LDA DSTH + SBC SRCH + BCC REVCPY +; +; FORWARD COPY +; + LDY TMPL + BEQ FORCPYLP + INC TMPH + LDY #$00 +FORCPYLP LDA (SRC),Y + STA (DST),Y + INY + BNE + + INC DSTH + INC SRCH ++ DEC TMPL + BNE FORCPYLP + DEC TMPH + BNE FORCPYLP + BEQ CPYMEX +; +; REVERSE COPY +; +REVCPY ;CLC + LDA TMPL + ADC DSTL + STA DSTL + LDA TMPH + ADC DSTH + STA DSTH + CLC + LDA TMPL + ADC SRCL + STA SRCL + LDA TMPH + ADC SRCH + STA SRCH + DEC DSTH + DEC SRCH + LDY #$FF + LDA TMPL + BEQ REVCPYLP + INC TMPH +REVCPYLP LDA (SRC),Y + STA (DST),Y + DEY + CPY #$FF + BNE + + DEC DSTH + DEC SRCH ++ DEC TMPL + BNE REVCPYLP + DEC TMPH + BNE REVCPYLP +CPYMEX PLA + STA DSTH + PLA + STA DSTL + JMP (DST) ; JUMP TO INTERP + +end +def seg_release(segnum)#1 + byte params[2] + + params.0 = 1 + params.1 = segnum + perr = syscall($45, @params) + return perr +end +def strcmp(str1, str2) + byte i + if (^str1 == ^str2) + for i = ^str1 downto 1 + if ^(str1 + i) <> ^(str2 + i) + return FALSE + fin + next + return TRUE + fin + return FALSE +end +if MACHID <> $F2 + puts("Apple /// SOS required.\n") + return -1 +fin +arg = argNext(argFirst) +if ^arg + ref = fileio:open(arg) + if ref + arg = argNext(arg) + if ^arg + fileio:setpfx(arg) + puts(arg); puts("/:\n") + fin + interp = heapmark()+1 + fileio:read(ref, interp, heapavail()) + fileio:close(ref) + ^(interp - 1) = 8 + if strcmp(interp - 1, "SOS NTRP") + //puts("INTERP opt hdr: $"); puth(interp=>$08); putln + //puts("INTERP address: $"); puth(interp=>$0A); putln + //puts("INTERP size: $"); puth(interp=>$0C); putln + fileio:close(0) // Close all files + seg_release(0) // Free all segments + sosexec(interp) + else + puts("Not a SOS.INTERP file.\n") + fin + else + puts("File not found.\n") + fin +else + puts("Usage: +SOS [PREFIX]\n") +fin +done diff --git a/src/makefile b/src/makefile index 3cfe7b4..392864a 100755 --- a/src/makefile +++ b/src/makefile @@ -8,6 +8,7 @@ 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 @@ -72,7 +73,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) $(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) $(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) @@ -176,6 +177,10 @@ $(MON): samplesrc/mon.pla $(PLVM02) $(PLASM) ./$(PLASM) -AMOW < samplesrc/mon.pla > samplesrc/mon.a acme --setpc 4094 -o $(MON) samplesrc/mon.a +$(SOS): libsrc/sos.pla $(PLVM02) $(PLASM) + ./$(PLASM) -AMO < libsrc/sos.pla > libsrc/sos.a + acme --setpc 4094 -o $(SOS) libsrc/sos.a + $(ROD): samplesrc/rod.pla $(PLVM02) $(PLASM) ./$(PLASM) -AMO < samplesrc/rod.pla > samplesrc/rod.a acme --setpc 4094 -o $(ROD) samplesrc/rod.a diff --git a/src/mkrel b/src/mkrel index e8be6fd..8aabd61 100755 --- a/src/mkrel +++ b/src/mkrel @@ -26,6 +26,7 @@ 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 ../sysfiles/FP6502.CODE#060000 prodos/sys/FP6502.CODE.BIN cp ../sysfiles/ELEMS.CODE#060000 prodos/sys/ELEMS.CODE.BIN