LIST までは動くけど、NIBL のラインパーザが追いきれていない。ほかを投げ出したままなのも何なので一旦中断して TLCS-90の方をナントカするつもり。
--- /home/seiji/cross/SCAMP/scmp3_nibl-SBC-240326.asm 2025-04-26 22:44:51.000000000 +0900
+++ nibl3.asm 2025-05-26 22:55:29.221131413 +0900
@@ -73,7 +73,7 @@
RNDNUM: EQU 0xfff4 ; DW rnd number
TMPF6: EQU 0xfff6 ; DB,DW temporary
-UNUSE1: EQU 0xfff8 ; DW unused
+TMPFGO: EQU 0xfff8 ; DW temporary used fotr GOTO parsing
TMPFB: EQU 0xfffb ; DB,DW temporary
TMPFC: EQU 0xfffc ; DB,DW temporary (overlaps TMPFB)
TMPFE: EQU 0xfffe ; DW temporary, alias
@@ -222,7 +222,8 @@
;
; does not work if
;
- DB 0x85 ; not a number, skip to DIRECT
+; DB 0x85 ; not a number, skip to DIRECT
+ DB DIRECT - $ ; not a number, skip to DIRECT
; just counldn't understand following routine
LD EA, TXTBGN ; start of program
SUB EA, ONE ; minus 1
@@ -309,7 +310,28 @@
DIRECT: LD A, 0, P2 ; get char from buffer
XOR A, =CR ; is it a CR?
BZ MAINL7 ; yes, continue in main loop
- PLI P3, =CMDTB1 ; load first CMD table
+; ADDED for FAST GOTO by efialtes_htn
+ AND A,=0x80 ; is bit8=1 then internal codes.
+ BZ DIRECT6 ; not internal -- RAW code.
+; internal code parser
+; 0x80: GO TO -- 0x80, NADDRL, NADDRH, 0x20[, 0x20]*
+;
+ LD A, @1, P2 ; restore from buffer and increment pointer
+ XOR A, =0x80 ; GOTO
+ BNZ ICODEP1
+ LD A, =1, P2 ; UPPER
+ LD E,A
+ LD A, =0, P1 ; LOWER
+ LD P2,EA
+ CALL 6 ; ENDCMD
+;
+ICODEP1:
+ICODEPE:
+ CALL 15 ; ERROR
+ DB 1
+; end ADDED
+
+DIRECT6: PLI P3, =CMDTB1 ; load first CMD table
CALL 11 ; CMPTOK
; out of memory error
@@ -337,7 +359,8 @@
ST EA, TMPFB ; save temporary
CALL 9 ; GETCHR
CALL 13 ; NUMBER
- DB 0x18 ; skip if not number to FINDL4
+; DB 0x18 ; skip if not number to FINDL4
+ DB FINDL4 - $ ; skip if not number to FINDL4
CALL 5 ; APULL
SUB EA, -2, P3 ; subtract number from the one on stack (the line number found)
XCH A, E ; is larger?
@@ -366,14 +389,19 @@
;-----------------------------------------------------------------------------------
; set of DIRECT commands
CMDTB1: DB "LIST"
- DB 0x93 ; to LIST
+; DB 0x93 ; to LIST
+ DB 0x80 + LIST - $ - 1 ; to LIST
DB "NEW"
- DB 0x8a ; to NEW2
+; DB 0x8a ; to NEW2
+ DB 0x80 + NEW2 - $ - 1 ; to NEW2
DB "RUN"
- DB 0xb5 ; to RUN
+; DB 0xb5 ; to RUN
+ DB 0x80 + RUN - $ - 1 ; to RUN
DB "CONT"
- DB 0xa7 ; to CONT
- DB 0xd2 ; default case to EXEC1
+; DB 0xa7 ; to CONT
+ DB 0x80 + CONT - $ - 1 ; to CONT
+; DB 0xd2 ; default case to EXEC1
+ DB 0x80 + EXEC1 - $ - 1 ; default case to EXEC1
;-----------------------------------------------------------------------------------
; NEW command
@@ -386,7 +414,7 @@
;-----------------------------------------------------------------------------------
; LIST command
LIST: CALL 13 ; NUMBER
- DB 3 ; if no number, skip to LIST0
+ DB LIST0 - $ ; if no number, skip to LIST0
BRA LIST1
LIST0: LD EA, ZERO ; no number given, start with line 0
CALL 4 ; APUSH put on stack
@@ -394,10 +422,12 @@
LIST2: CALL 9 ; GETCHR from location found
PUSH P2
CALL 13 ; NUMBER
- DB 0x0a ; if error, goto LIST3
+; DB 0x0c ; if error, goto LIST3
+ DB LIST3 - $ ; if error, goto LIST3
CALL 5 ; APULL
POP P2
- CALL 14 ; PRTLN
+; CALL 14 ; PRTLN
+ JSR PRTLNL ; PRTLNL
CALL 8 ; CRLF
JSR CHKBRK ; test break
BRA LIST2
@@ -436,7 +466,8 @@
ST A, INPMOD
BRA MAIN1 ; back to mainloop
RUN4: CALL 13 ; parse line NUMBER
- DB 8 ; not found: syntax error, goto SNERR1
+; DB 8 ; not found: syntax error, goto SNERR1
+ DB SNERR1 - $ ; not found: syntax error, goto SNERR1
CALL 5 ; APULL line number
ST EA, CURRNT ; set as current line
@@ -477,21 +508,21 @@
BRA GOSUB1 ; jump into GOSUB (process interrupt)
CMDTB2: DB "LET"
- DB 0xa6 ; to LET
- DB "IF"
- DB 0xf3 ; to IFCMD
- DB "LINK"
- DB 0xf7 ; to LINK
+ DB 0x80 + LET - $ - 1 ; to LET
DB "NEXT"
- DB 0x9c ; to NEXT
- DB "UNTIL"
- DB 0xdb ; to UNTIL
+ DB 0x80 + NEXT - $ - 1 ; to NEXT
DB "GO"
- DB 0x96 ; to GOCMD
+ DB 0x80 + GOCMD - $ - 1 ; to GOCMD
DB "RETURN"
- DB 0xbd ; to RETURN
+ DB 0x80 + RETURN - $ - 1 ; to RETURN
DB "REM"
- DB 0xcf ; to REMCMD
+ DB 0x80 + REMCMD - $ - 1 ; to REMCMD
+ DB "UNTIL"
+ DB 0x80 + UNTIL - $ - 1 ; to UNTIL
+ DB "IF"
+ DB 0x80 + IFCMD - $ - 1 ; to IFCMD
+ DB "LINK"
+ DB 0x80 + LINK - $ - 1 ; to LINK
DB 0x80 ; default case to EXEC2
EXEC2: PLI P3, =CMDTB7 ; load table 7
@@ -508,22 +539,43 @@
;---------------------------------------------------------------
; handle GOTO or GOSUB
GOCMD: PLI P3, =CMDTB5 ; check for TO or SUB
+ LD EA, P2
+ ST EA, TMPFGO ; save for later use
CALL 11
CMDTB5: DB "TO"
- DB 0x85 ; to GOTO
+; DB 0x85 ; to GOTO
+ DB 0x80 + GOTOX - $ - 1 ; to GOTOX
DB "SUB"
- DB 0x8d
+; DB 0x8d
+ DB 0x80 + GOSUB - $ - 1 ; to GOSUB
DB 0x80 ; default case to GOTO
;---------------------------------------------------------------
; GOTO command
+; Note: should come just after "GO TO" sequence.
GOTOX CALL 0 ; RELEXP
GOTO: LD A, =1 ;
ST A, INPMOD ; set 'running mode'
JSR FINDLN ; find line in buffer
- BZ RUN4 ; skip to line number check
- CALL 15 ; error
+; BNZ RUN4 ; skip to line number check
+ BNZ GOTOERR ; skip to line number check
+ PUSH P3
+ LD EA,TMPFGO
+ SUB EA, =2
+ LD P3, EA
+ LD A,=0x80 ; internal code "GOTO"
+ ST A,@1,P3
+ LD EA,P2
+ ST A,@1,P3
+ LD A, E
+ ST A,@1,P3
+ LD A,=0x20 ; 'SPACE'
+ ST A,@1,P3
+ POP P3
+ JMP RUN4
+
+GOTOERR: CALL 15 ; error
DB 7 ; 7 (goto target does not exist)
;---------------------------------------------------------------
@@ -600,13 +653,17 @@
;---------------------------------------------------------------
CMDTB7: DB "FOR"
- DB 0xe4 ; to FOR
+; DB 0xe4 ; to FOR
+ DB 0x80 + FOR - $ - 1 ; to FOR
DB "DO"
- DB 0xa7 ; to DO
+; DB 0xa7 ; to DO
+ DB 0xa0 + DO - $ - 1 ; to DO
DB "ON"
- DB 0x8f ; to ON
+; DB 0x8f ; to ON
+ DB 0x80 + ON - $ - 1 ; to ON
DB "CLEAR"
- DB 0x85 ; to CLEAR
+; DB 0x85 ; to CLEAR
+ DB 0x80 + CLEAR - $ - 1 ; to CLEAR
DB 0x80 ; to EXEC3
;---------------------------------------------------------------
@@ -878,20 +935,28 @@
;---------------------------------------------------------------
; several more commands
CMDTB8: DB "DELAY"
- DB 0xa4 ; to DELAY
+; DB 0xa4 ; to DELAY
+ DB 0x80 + DELAY - $ - 1 ; to DELAY
DB "INPUT"
- DB 0x98 ; to INPUT
+; DB 0x98 ; to INPUT
+ DB 0x80 + INPUT - $ - 1 ; to INPUT
DB "PRINT"
- DB 0x95 ; to PRINT
+; DB 0x95 ; to PRINT
+ DB 0x80 + PRINT - $ - 1 ; to PRINT
DB "PR"
- DB 0x92 ; to PRINT
+; DB 0x92 ; to PRINT
+ DB 0x80 + PRINT - $ - 1 ; to PRINT
DB "STOP"
- DB 0x9b ; to STOP
+; DB 0x9b ; to STOP
+ DB 0x80 + STOP - $ - 1 ; to STOP
DB "MON"
- DB 0x9a ; to MON
+; DB 0x9a ; to MON
+ DB 0x80 + MON - $ - 1 ; to MON
DB "PUTC"
- DB 0x98 ; to PRINTCHR
- DB 0xa4 ; default to ASSIGN
+; DB 0x98 ; to PRINTCHR
+ DB 0x80 + PRINTCHR - $ - 1 ; to PRINTCHR
+; DB 0xa4 ; default to ASSIGN
+ DB 0x80 + ASSIGN - $ - 1 ; default to ASSIGN
;---------------------------------------------------------------
; INPUT cmd
@@ -926,12 +991,16 @@
;---------------------------------------------------------------
; left hand side (LHS) operators for assigment
CMDTB4: DB 'S','T','A','T'
- DB 0x89 ; to STATLH
+; DB 0x89 ; to STATLH
+ DB 0x80 + STATLH - $ - 1 ; to STATLH
DB '@'
- DB 0x92 ; to ATLH
+; DB 0x92 ; to ATLH
+ DB 0x80 + ATLH - $ - 1 ; to ATLH
DB '$'
+; DB 0xb1 ; to DOLALH
DB 0xb1 ; to DOLALH
- DB 0x9e ; default case to ASSIG1
+; DB 0x9e ; default case to ASSIG1
+ DB 0x80 + ASSIG1 - $ - 1 ; default case to ASSIG1
;---------------------------------------------------------------
; handle assignments
@@ -1144,6 +1213,40 @@
BP PRTLN ; if positive, loop
PRTLN1 RET ; exit
;---------------------------------------------------------------
+; print string pointed to by P2, until CR
+PRTLNL: LD A, @1, P2 ; get next char from buffer
+ XOR A, =CR ; is CR?
+ BZ PRTLN1 ; yes exit
+ XOR A, =CR ; make original char again
+ BP PRTLNL2 ; IF bit8 = 0 then output as it is
+;
+PRTLNL5: AND A,=0x7f ; reset first bits
+ XCH E,A
+ LD A,=0x00 ; SIGN Extend A to EA
+ XCH E,A
+ SL EA ;
+ ST EA,TMPFGO
+ SL EA ;
+ ADD EA,TMPFGO ; EA = EA * 6
+ PUSH P3
+ ST EA,TMPFGO
+ LD EA,=CODENAMES
+ ADD EA,TMPFGO
+ LD P3,EA
+PRTLNL3: LD A,@1,P3
+ BZ PRTLNL4
+ CALL 7
+ BRA PRTLNL3
+;
+PRTLNL4: POP P3
+ XCH P2,EA
+ ADD EA,=2 ; SKIP 2byte
+ XCH P2,EA
+PRTLNL2: CALL 7 ; PUTC emit it
+ BP PRTLNL ; if positive, loop
+PRTLNL1: RET ; exit
+;
+;---------------------------------------------------------------
; get next char from buffer
GETNXC: LD A, @1, P2 ; advance P2
;---------------------------------------------------------------
@@ -1504,7 +1607,8 @@
;---------------------------------------------------------------
; FACTOR (call 1) get a factor: number, var, function, (RELEXP)
FACTOR: CALL 13 ; NUMBER get number in sequence
- DB 2 ; if not found continue at FACTO2
+; DB 2 ; if not found continue at FACTO2
+ DB FACTO2 - $ ; if not found continue at FACTO2
FACTO1: RET ; has numeric operand on stack, done
FACTO2: PLI P3, =CMDT12 ; load table of standard functions
@@ -2205,7 +2309,14 @@
; DW 0x00d5 ; for 300 bd
; DW 0x0252 ; for 110 bd
;
- ORG 0xc00
+CODENAMES: DB "GO TO",0
+ DB "GOSUB",0
+ DB "PRINT",0
+ DB "UNTIL",0
+
+
+; *********** FROM THIS LINE AND BELOW ARE are UNIMON SOURCE ******************
+ ORG 0x1000
; unimon
RAM_B: EQU 0xb800 ; last area would be consumed by stack.
WORK_B: EQU 0xbbc0