From 689e0542cee072c8c51d0ab273758b2f8a5260de Mon Sep 17 00:00:00 2001 From: David Schmenk Date: Tue, 6 May 2014 19:18:36 -0700 Subject: [PATCH] simple command launch for BYE command --- PLASMA/src/cmd.pla | 29 ++--- PLASMA/src/cmdexec.pla | 234 +++++++++++++++++++++++++++++++++++++++++ PLASMA/src/codegen.c | 6 ++ PLASMA/src/loadcmd.s | 62 ----------- PLASMA/src/makefile | 11 +- PLASMA/src/parse.c | 1 - PLASMA/src/plvm02.s | 175 +++++++++++++++++++----------- 7 files changed, 373 insertions(+), 145 deletions(-) create mode 100644 PLASMA/src/cmdexec.pla delete mode 100644 PLASMA/src/loadcmd.s diff --git a/PLASMA/src/cmd.pla b/PLASMA/src/cmd.pla index 92894936..dabe7ec7 100644 --- a/PLASMA/src/cmd.pla +++ b/PLASMA/src/cmd.pla @@ -37,8 +37,9 @@ end ; CALL LOADED SYSTEM PROGRAM ; asm exec - LDX #$FF + LDX #$FE TXS + LDX ESTKSZ/2 BIT ROMEN JMP $2000 end @@ -64,8 +65,7 @@ SETMLP DEC ESTKL,X BNE SETMLP INC DSTH BNE SETMLP -+ INX - INX +++ INX RTS end ; @@ -139,7 +139,6 @@ FORCPYLP DEC ESTKH,X BNE FORCPYLP MEMEXIT INX - INX INX RTS end @@ -149,11 +148,9 @@ end ; asm cout LDA ESTKL,X - INX ORA #$80 - BIT ROMIN + BIT ROMEN JSR $FDED - BIT LCBNK2 RTS end ; @@ -161,11 +158,10 @@ end ; RDKEY() ; asm cin - BIT ROMIN + BIT ROMEN STX ESP JSR $FD0C LDX ESP - BIT LCBNK2 DEX STA ESTKL,X LDY #$00 @@ -182,7 +178,7 @@ asm prstr STA SRCL LDA ESTKH,X STA SRCH - BIT ROMIN + BIT ROMEN LDA (SRC),Y STA ESTKL,X BEQ + @@ -193,20 +189,16 @@ asm prstr TYA CMP ESTKL,X BNE - -+ INX - BIT LCBNK2 - RTS ++ RTS end ; ; PRINT BYTE ; asm prbyte LDA ESTKL,X - INX STX ESP - BIT ROMIN + BIT ROMEN JSR $FDDA - BIT LCBNK2 LDX ESP RTS end @@ -218,9 +210,8 @@ asm rdstr LDA ESTKL,X STA $33 STX ESP - BIT ROMIN + BIT ROMEN JSR $FD6A - BIT LCBNK2 STX $01FF - LDA $01FF,X AND #$7F @@ -249,7 +240,7 @@ end ; EXIT ; asm reboot - BIT ROMIN + BIT ROMEN LDA #$00 STA $3F4 ; INVALIDATE POWER-UP BYTE JMP ($FFFC) ; RESET diff --git a/PLASMA/src/cmdexec.pla b/PLASMA/src/cmdexec.pla new file mode 100644 index 00000000..6a12c377 --- /dev/null +++ b/PLASMA/src/cmdexec.pla @@ -0,0 +1,234 @@ +const iobuffer = $0800 +const databuff = $0C00 +const memmap = $BF58 +const autorun = $01FF +byte cmdline[] = "CMD" +word cmd = @cmdline +byte syshalt[] = "SYSTEM HALTED..." +byte perr + +; +; Utility functions +; +; CALL PRODOS +; SYSCALL(CMD, PARAMS) +; +asm prodos + LDA ESTKL,X + LDY ESTKH,X + STA PARAMS + STY PARAMS+1 + INX + LDA ESTKL,X + STA CMD + STX ESP + JSR $BF00 +CMD: !BYTE 00 +PARAMS: !WORD 0000 + LDX ESP + STA ESTKL,X + LDY #$00 + STY ESTKH,X + RTS +end +; +; CALL LOADED SYSTEM PROGRAM +; +asm exec + LDX #$FE + TXS + LDX ESTKSZ/2 + BIT ROMEN + JMP $2000 +end +; +; SET MEMORY TO 0 +; MEMCLR(ADDR, SIZE) +; +asm memclr + LDY #$00 + LDA ESTKL+1,X + STA DSTL + LDA ESTKH+1,X + STA DSTH + INC ESTKL,X + INC ESTKH,X + TYA +SETMLP DEC ESTKL,X + BNE + + DEC ESTKH,X + BEQ ++ ++ STA (DST),Y + INY + BNE SETMLP + INC DSTH + BNE SETMLP +++ INX + RTS +end +; +; COPY MEMORY +; MEMCPY(DSTADDR, SRCADDR, SIZE) +; +asm memcpy + LDY #$00 + LDA ESTKL,X + BNE + + LDA ESTKH,X + BEQ MEMEXIT ++ LDA ESTKL+2,X + STA DSTL + LDA ESTKH+2,X + STA DSTH + LDA ESTKL+1,X + STA SRCL + LDA ESTKH+1,X + STA SRCH + INC ESTKH,X +CPYLP LDA (SRC),Y + STA (DST),Y + INC DSTL + BNE + + INC DSTH ++ INC SRCL + BNE + + INC SRCH ++ DEC ESTKL,X + BNE CPYLP + DEC ESTKH,X + BNE CPYLP +MEMEXIT INX + INX + RTS +end +; +; CHAR OUT +; COUT(CHAR) +; +asm cout + LDA ESTKL,X + ORA #$80 + BIT ROMEN + JSR $FDED + RTS +end +; +; CHAR IN +; RDKEY() +; +asm cin + BIT ROMEN + STX ESP + JSR $FD0C + LDX ESP + DEX + STA ESTKL,X + LDY #$00 + STY ESTKH,X + RTS +end +; +; PRINT STRING +; PRSTR(STR) +; +asm prstr + LDY #$00 + LDA ESTKL,X + STA SRCL + LDA ESTKH,X + STA SRCH + BIT ROMEN + LDA (SRC),Y + STA ESTKL,X + BEQ + +- INY + LDA (SRC),Y + ORA #$80 + JSR $FDED + TYA + CMP ESTKL,X + BNE - ++ RTS +end +; +; EXIT +; +asm reboot + BIT ROMEN + LDA #$00 + STA $3F4 ; INVALIDATE POWER-UP BYTE + JMP ($FFFC) ; RESET +end +def crout + cout($0D) +end +; +; ProDOS routines +; +def open(path, buff) + byte params[6] + + params.0 = 3 + params:1 = path + params:3 = buff + params.5 = 0 + perr = prodos($C8, @params) + return params.5 +end +def close(refnum) + byte params[2] + + params.0 = 1 + params.1 = refnum + perr = prodos($CC, @params) + return perr +end +def read(refnum, buff, len) + byte params[8] + + params.0 = 4 + params.1 = refnum + params:2 = buff + params:4 = len + params:6 = 0 + perr = prodos($CA, @params) + return params:6 +end +def resetmemfiles + ; + ; Close all files + ; + ^$BFD8 = 0 + close(0) + ; + ; Set memory bitmap + ; + memclr(memmap, 24) + ^memmap.0 = $CF + ^memmap.23 = $01 +end +def execsys(sysfile) + byte refnum + + if ^sysfile + memcpy($280, sysfile, ^sysfile + 1) + refnum = open(sysfile, iobuffer) + if refnum + if read(refnum, $2000, $FFFF) + resetmemfiles() + memcpy($280, sysfile, ^$280 + 1) + exec() + fin + fin + fin +end + +resetmemfiles() +if ^autorun + cmd = autorun +fin +execsys(cmd) +prstr(@syshalt) +cin() +reboot() +done \ No newline at end of file diff --git a/PLASMA/src/codegen.c b/PLASMA/src/codegen.c index e0fe4d15..9b58a3b5 100755 --- a/PLASMA/src/codegen.c +++ b/PLASMA/src/codegen.c @@ -306,6 +306,12 @@ void emit_header(void) printf("\t%s\t_SUBSEG\t\t\t; BYTECODE SUB-SEGMENT\n", DW); printf("\t%s\t_INIT\t\t\t; MODULE INITIALIZATION ROUTINE\n", DW); } + else + { + printf("\tJSR\t$3D0\n"); + printf("\t%s\t$00\t\t\t; MODULE INITIALIZATION ROUTINE\n", DB); + printf("\t%s\t_INIT\t\t\t;\n", DW); + } } void emit_rld(void) { diff --git a/PLASMA/src/loadcmd.s b/PLASMA/src/loadcmd.s deleted file mode 100644 index 7f95ead9..00000000 --- a/PLASMA/src/loadcmd.s +++ /dev/null @@ -1,62 +0,0 @@ -SRC = TMP -SRCL = SRC -SRCH = SRC+1 -DST = SRC+2 -DSTL = DST -DSTH = DST+1 -ESP = DST+2 - !PSEUDOPC $1000 { -;* -;* CLEAR COMMAND LINE LENGTH BYTE IF CALLED FROM 'BYE' -;* - LDY #$00 - LDX #$FE ; LEAVE ROOM FOR COMMAND LINE LENGTH BYTE - TXS - BVS + - STY $01FF ; CLEAR AUTORUN COMMAND WHEN CALLED FROM 'BYE' -;* -;* MOVE REST OF CMD FROM LANGUAGE CARD -;* -+ STY $06 - STY $08 - LDA #$D2 - STA $07 - LDA #$11 - STA $09 - BIT LCRDEN+LCBNK2 -- LDA ($06),Y - STA ($08),Y - INY - BNE - - INC $07 - INC $09 - LDA $07 - CMP #$E0 - BNE - -;* -;* DEACTIVATE 80 COL CARDS -;* - BIT ROMEN - LDY #4 -- LDA DISABLE80,Y - JSR $FDED - DEY - BPL - - BIT $C054 ; SET TEXT MODE - BIT $C051 - BIT $C058 - JSR $FC58 ; HOME -;* -;* JUMP TO INTERPRETER -;* - BIT LCRDEN+LCBNK2 - LDX #$00 - LDA #$BF - STX IFPL - STA IFPH - JSR INTERP - !BYTE 0 - !WORD START -DISABLE80 !BYTE 21, 13, '1', 26, 13 - !SOURCE "cmd.a" -} \ No newline at end of file diff --git a/PLASMA/src/makefile b/PLASMA/src/makefile index af6aac25..9683aa75 100755 --- a/PLASMA/src/makefile +++ b/PLASMA/src/makefile @@ -2,6 +2,7 @@ AFLAGS = -o $@ LFLAGS = -C default.cfg PLVM = plvm +PLVM02 = PLVM02.SYS PLASM = plasm INCS = tokens.h symbols.h lex.h parse.h codegen.h OBJS = plasm.c parse.o lex.o codegen.o @@ -20,10 +21,10 @@ TXTTYPE = .TXT #SYSTYPE = \#ff0000 #TXTTYPE = \#040000 -all: $(PLASM) $(PLVM) TESTLIB +all: $(PLASM) $(PLVM) $(PLVM02) TESTLIB clean: - -rm *.o *~ *.a *.BIN TESTLIB $(PLASM) $(PLVM) + -rm *.o *~ *.a *.SYM *.SYS *.BIN TESTLIB $(PLASM) $(PLVM) $(PLASM): $(OBJS) $(INCS) cc $(OBJS) -o $(PLASM) @@ -31,6 +32,12 @@ $(PLASM): $(OBJS) $(INCS) $(PLVM): plvm.c cc plvm.c -o $(PLVM) +cmdexec.a: cmdexec.pla $(PLASM) + ./$(PLASM) -A < cmdexec.pla > cmdexec.a + +$(PLVM02): plvm02.s cmdexec.a + acme -o $(PLVM02) -l PLVM02.SYM plvm02.s + TESTLIB: testlib.pla $(PLVM) $(PLASM) ./$(PLASM) -AM < testlib.pla > testlib.a acme --setpc 4096 -o TESTLIB testlib.a diff --git a/PLASMA/src/parse.c b/PLASMA/src/parse.c index ca908b63..a5eafe79 100755 --- a/PLASMA/src/parse.c +++ b/PLASMA/src/parse.c @@ -879,7 +879,6 @@ int parse_stmnt(void) scantoken = ID_TOKEN; else scan(); - printf("Structure offset = %d\n", elem_offset); } if (scantoken == SET_TOKEN) { diff --git a/PLASMA/src/plvm02.s b/PLASMA/src/plvm02.s index 5603aa6d..35562840 100644 --- a/PLASMA/src/plvm02.s +++ b/PLASMA/src/plvm02.s @@ -42,7 +42,7 @@ VMZP = ESTK+ESTKSZ IFP = VMZP IFPL = IFP IFPH = IFP+1 -IP = IFP+2 +IP = IFP+2 IPL = IP IPH = IP+1 IPY = IP+2 @@ -53,6 +53,13 @@ TMPX = TMP+2 NPARMS = TMPL FRMSZ = TMPH DVSIGN = TMPX +SRC = $06 +SRCL = SRC +SRCH = SRC+1 +DST = SRC+2 +DSTL = DST +DSTH = DST+1 +ESP = DST+2 ;********************************************************** ;* ;* INTERPRETER INSTRUCTION POINTER INCREMENT MACRO @@ -69,9 +76,8 @@ DVSIGN = TMPX ;* ;*********************************************** * = $2000 - CLD - BIT LCRWEN+LCBNK2 - BIT LCRWEN+LCBNK2 + LDX #$FE + TXS ;* ;* INSTALL PAGE 3 VECTORS ;* @@ -83,86 +89,81 @@ DVSIGN = TMPX ;* ;* MOVE VM INTO LANGUAGE CARD ;* + BIT LCRWEN+LCBNK2 + BIT LCRWEN+LCBNK2 LDA #VMCORE - STA $07 + STA SRCH LDA #$00 - STA $08 + STA DSTL LDA #$D0 - STA $09 + STA DSTH LDY #$00 -- LDA ($06),Y ; COPY VM+CMD INTO LANGUAGE CARD - STA ($08),Y +- LDA (SRC),Y ; COPY VM+CMD INTO LANGUAGE CARD + STA (DST),Y INY BNE - - INC $07 - INC $09 - LDA $09 + INC SRCH + INC DSTH + LDA DSTH CMP #$E0 BNE - ;* -;* INIT STACKS, FRAMES, AND HEAPS -;* - LDX #$FE - TXS - LDX #$00 - STX $01FF - LDX #ESTKSZ/2 -;* ;* LOOK FOR STARTUP FILE ;* - JSR PRODOS ; OPEN AUTORUN - !BYTE $C8 - !WORD OPENPARMS - BCC + - JMP EXIT -+ LDA REFNUM - STA NLPARMS+1 - JSR PRODOS - !BYTE $C9 - !WORD NLPARMS - BCC + - JMP EXIT -+ LDA REFNUM - STA READPARMS+1 - JSR PRODOS - !BYTE $CA - !WORD READPARMS - BCC + - JMP EXIT -+ LDX READPARMS+6 - STX $01FF -EXIT JSR PRODOS - !BYTE $CC - !WORD CLOSEPARMS + JSR PRODOS ; OPEN AUTORUN + !BYTE $C8 + !WORD OPENPARMS + BCC + + JMP NOAUTO ++ LDA REFNUM + STA NLPARMS+1 + JSR PRODOS + !BYTE $C9 + !WORD NLPARMS + BCC + + JMP NOAUTO ++ LDA REFNUM + STA READPARMS+1 + JSR PRODOS + !BYTE $CA + !WORD READPARMS + BCC + + JMP NOAUTO ++ LDX READPARMS+6 + STX $01FF +NOAUTO JSR PRODOS + !BYTE $CC + !WORD CLOSEPARMS LDY #$00 - STY $06 + STY SRCL LDA #$D1 - STA $07 -- LDA ($06),Y ; LOAD FIRST PAGE OF CMD INTO PLACE + STA SRCH +- LDA (SRC),Y ; LOAD FIRST PAGE OF CMD INTO PLACE STA $1000,Y INY BNE - LDA #$7F ADC #$01 ; SET V FLAG JMP $1007 ; CALL CMD -AUTORUN !BYTE 7,"AUTORUN" +AUTORUN !BYTE 7 + !TEXT "AUTORUN" OPENPARMS !BYTE 3 - !WORD AUTORUN - !WORD $0800 + !WORD AUTORUN + !WORD $0800 REFNUM !BYTE 0 NLPARMS !BYTE 3 - !BYTE 0 - !BYTE $7F - !BYTE $0D + !BYTE 0 + !BYTE $7F + !BYTE $0D READPARMS !BYTE 4 - !BYTE 0 - !WORD $0200 - !WORD $0080 - !WORD 0 + !BYTE 0 + !WORD $0200 + !WORD $0080 + !WORD 0 CLOSEPARMS !BYTE 1 - !BYTE 0 + !BYTE 0 PAGE3 = * !PSEUDOPC $03D0 { ;* @@ -202,8 +203,59 @@ OPXTBL !WORD ZEROX,ADDX,SUBX,MULX,DIVX,MODX,INCRX,DECRX ; 00 02 04 06 08 0 ;* ;* COMMAND PROCESSING ;* - !SOURCE loadcmd.s -; !BINARY CMDLINE.BIN + !PSEUDOPC $1000 { +;* +;* CLEAR COMMAND LINE LENGTH BYTE IF CALLED FROM 'BYE' +;* + LDY #$00 + LDX #$FE ; LEAVE ROOM FOR COMMAND LINE LENGTH BYTE + TXS + BVS + + STY $01FF ; CLEAR AUTORUN COMMAND WHEN CALLED FROM 'BYE' +;* +;* MOVE REST OF CMD FROM LANGUAGE CARD +;* ++ STY SRCL + STY DSTL + LDA #$D2 + STA SRCH + LDA #$11 + STA DSTH + BIT LCRDEN+LCBNK2 +- LDA (SRC),Y + STA (DST),Y + INY + BNE - + INC SRCL + INC DSTL + LDA SRCL + CMP #$E0 + BNE - +;* +;* DEACTIVATE 80 COL CARDS +;* + BIT ROMEN + LDY #4 +- LDA DISABLE80,Y + JSR $FDED + DEY + BPL - + BIT $C054 ; SET TEXT MODE + BIT $C051 + BIT $C058 + JSR $FC58 ; HOME + JMP START +DISABLE80 !BYTE 21, 13, '1', 26, 13 +;* +;* JUMP TO INTERPRETER +;* +START LDA #$00 + STA IFPL + LDA #$BF + STA IFPH + LDX ESTKSZ/2 + !SOURCE "cmdexec.a" +} ;* ;* ENTER INTO BYTECODE INTERPRETER ;* @@ -1872,4 +1924,5 @@ LEAVEX STA ALTRDOFF RETX STA ALTRDOFF CLI RTS +VMEND = * } \ No newline at end of file