; error ; line input, line editing ; tokenize ; detokenize ; BASIC program memory management ; MICROTAN has some nonstandard extension to LIST here .segment "CODE" MEMERR: ldx #ERR_MEMFULL ; ---------------------------------------------------------------------------- ; HANDLE AN ERROR ; ; (X)=OFFSET IN ERROR MESSAGE TABLE ; (ERRFLG) > 128 IF "ON ERR" TURNED ON ; (CURLIN+1) = $FF IF IN DIRECT MODE ; ---------------------------------------------------------------------------- ERROR: lsr Z14 .ifdef CONFIG_FILE lda CURDVC ; output beq LC366 ; is screen jsr CLRCH ; otherwise redirect output back to screen lda #$00 sta CURDVC LC366: .endif jsr CRDO jsr OUTQUES L2329: lda ERROR_MESSAGES,x .ifndef CONFIG_SMALL_ERROR pha and #$7F .endif jsr OUTDO .ifdef CONFIG_SMALL_ERROR lda ERROR_MESSAGES+1,x .ifdef KBD and #$7F .endif jsr OUTDO .else inx pla bpl L2329 .endif jsr STKINI lda #QT_ERROR ; ---------------------------------------------------------------------------- ; PRINT STRING AT (Y,A) ; PRINT CURRENT LINE # UNLESS IN DIRECT MODE ; FALL INTO WARM RESTART ; ---------------------------------------------------------------------------- PRINT_ERROR_LINNUM: jsr STROUT ldy CURLIN+1 iny beq RESTART jsr INPRT ; ---------------------------------------------------------------------------- ; WARM RESTART ENTRY ; ---------------------------------------------------------------------------- RESTART: .ifdef KBD jsr CRDO nop L2351X: jsr OKPRT L2351: jsr INLIN LE28E: bpl RESTART .else lsr Z14 .ifndef AIM65 lda #QT_OK .ifdef CONFIG_CBM_ALL jsr STROUT .else jsr GOSTROUT .endif .else jsr GORESTART .endif L2351: jsr INLIN .endif stx TXTPTR sty TXTPTR+1 jsr CHRGET .ifdef CONFIG_11 ; bug in pre-1.1: CHRGET sets Z on '\0' ; and ':' - a line starting with ':' in ; direct mode gets ignored tax .endif .ifdef KBD beq L2351X .else beq L2351 .endif ldx #$FF stx CURLIN+1 bcc NUMBERED_LINE jsr PARSE_INPUT_LINE jmp NEWSTT2 ; ---------------------------------------------------------------------------- ; HANDLE NUMBERED LINE ; ---------------------------------------------------------------------------- NUMBERED_LINE: jsr LINGET jsr PARSE_INPUT_LINE sty EOLPNTR .ifdef KBD jsr FNDLIN2 lda JMPADRS+1 sta LOWTR sta Z96 lda JMPADRS+2 sta LOWTR+1 sta Z96+1 lda LINNUM sta L06FE lda LINNUM+1 sta L06FE+1 inc LINNUM bne LE2D2 inc LINNUM+1 bne LE2D2 jmp SYNERR LE2D2: jsr LF457 ldx #Z96 jsr CMPJMPADRS bcs LE2FD LE2DC: ldx #$00 lda (JMPADRS+1,x) sta (Z96,x) inc JMPADRS+1 bne LE2E8 inc JMPADRS+2 LE2E8: inc Z96 bne LE2EE inc Z96+1 LE2EE: ldx #VARTAB jsr CMPJMPADRS bne LE2DC lda Z96 sta VARTAB lda Z96+1 sta VARTAB+1 LE2FD: jsr SETPTRS jsr LE33D lda INPUTBUFFER LE306: beq LE28E cmp #$A5 beq LE306 clc .else jsr FNDLIN bcc PUT_NEW_LINE ldy #$01 lda (LOWTR),y sta INDEX+1 lda VARTAB sta INDEX lda LOWTR+1 sta DEST+1 lda LOWTR dey sbc (LOWTR),y clc adc VARTAB sta VARTAB sta DEST lda VARTAB+1 adc #$FF sta VARTAB+1 sbc LOWTR+1 tax sec lda LOWTR sbc VARTAB tay bcs L23A5 inx dec DEST+1 L23A5: clc adc INDEX bcc L23AD dec INDEX+1 clc L23AD: lda (INDEX),y sta (DEST),y iny bne L23AD inc INDEX+1 inc DEST+1 dex bne L23AD .endif ; ---------------------------------------------------------------------------- PUT_NEW_LINE: .ifndef KBD .ifdef CONFIG_2 jsr SETPTRS jsr LE33D lda INPUTBUFFER beq L2351 clc .else lda INPUTBUFFER beq FIX_LINKS lda MEMSIZ ldy MEMSIZ+1 sta FRETOP sty FRETOP+1 .endif .endif lda VARTAB sta HIGHTR adc EOLPNTR sta HIGHDS ldy VARTAB+1 sty HIGHTR+1 bcc L23D6 iny L23D6: sty HIGHDS+1 jsr BLTU .ifdef CONFIG_INPUTBUFFER_0200 lda LINNUM ldy LINNUM+1 sta INPUTBUFFER-2 sty INPUTBUFFER-1 .endif lda STREND ldy STREND+1 sta VARTAB sty VARTAB+1 ldy EOLPNTR dey ; ---COPY LINE INTO PROGRAM------- L23E6: lda INPUTBUFFER-4,y sta (LOWTR),y dey bpl L23E6 ; ---------------------------------------------------------------------------- ; CLEAR ALL VARIABLES ; RE-ESTABLISH ALL FORWARD LINKS ; ---------------------------------------------------------------------------- FIX_LINKS: jsr SETPTRS .ifdef CONFIG_2 jsr LE33D jmp L2351 LE33D: .endif lda TXTTAB ldy TXTTAB+1 sta INDEX sty INDEX+1 clc L23FA: ldy #$01 lda (INDEX),y .ifdef CONFIG_2 beq RET3 .else jeq L2351 .endif ldy #$04 L2405: iny lda (INDEX),y bne L2405 iny tya adc INDEX tax ldy #$00 sta (INDEX),y lda INDEX+1 adc #$00 iny sta (INDEX),y stx INDEX sta INDEX+1 bcc L23FA ; always ; ---------------------------------------------------------------------------- .ifdef KBD .include "kbd_loadsave.s" .endif .ifdef CONFIG_2 ; !!! kbd_loadsave.s requires an RTS here! RET3: rts .endif .include "inline.s" ; ---------------------------------------------------------------------------- ; TOKENIZE THE INPUT LINE ; ---------------------------------------------------------------------------- PARSE_INPUT_LINE: ldx TXTPTR ldy #$04 sty DATAFLG L246C: lda INPUTBUFFERX,x .ifdef CONFIG_CBM_ALL bpl LC49E cmp #$FF beq L24AC inx bne L246C LC49E: .endif cmp #$20 beq L24AC sta ENDCHR cmp #$22 beq L24D0 bit DATAFLG bvs L24AC cmp #$3F bne L2484 lda #TOKEN_PRINT bne L24AC L2484: cmp #$30 bcc L248C cmp #$3C bcc L24AC ; ---------------------------------------------------------------------------- ; SEARCH TOKEN NAME TABLE FOR MATCH STARTING ; WITH CURRENT CHAR FROM INPUT LINE ; ---------------------------------------------------------------------------- L248C: sty STRNG2 ldy #$00 sty EOLPNTR dey stx TXTPTR dex L2496: iny L2497: inx L2498: .ifdef KBD jsr GET_UPPER .else lda INPUTBUFFERX,x .ifndef CONFIG_2 cmp #$20 beq L2497 .endif .endif sec sbc TOKEN_NAME_TABLE,y beq L2496 cmp #$80 bne L24D7 ora EOLPNTR ; ---------------------------------------------------------------------------- ; STORE CHARACTER OR TOKEN IN OUTPUT LINE ; ---------------------------------------------------------------------------- L24AA: ldy STRNG2 L24AC: inx iny sta INPUTBUFFER-5,y lda INPUTBUFFER-5,y beq L24EA sec sbc #$3A beq L24BF cmp #$49 bne L24C1 L24BF: sta DATAFLG L24C1: sec sbc #TOKEN_REM-':' bne L246C sta ENDCHR ; ---------------------------------------------------------------------------- ; HANDLE LITERAL (BETWEEN QUOTES) OR REMARK, ; BY COPYING CHARS UP TO ENDCHR. ; ---------------------------------------------------------------------------- L24C8: lda INPUTBUFFERX,x beq L24AC cmp ENDCHR beq L24AC L24D0: iny sta INPUTBUFFER-5,y inx bne L24C8 ; ---------------------------------------------------------------------------- ; ADVANCE POINTER TO NEXT TOKEN NAME ; ---------------------------------------------------------------------------- L24D7: ldx TXTPTR inc EOLPNTR L24DB: iny lda MATHTBL+28+1,y bpl L24DB lda TOKEN_NAME_TABLE,y bne L2498 lda INPUTBUFFERX,x bpl L24AA ; ---END OF LINE------------------ L24EA: sta INPUTBUFFER-3,y .ifdef CONFIG_NO_INPUTBUFFER_ZP dec TXTPTR+1 .endif lda #CONST_MEMSIZ .else lda MEMSIZ ldy MEMSIZ+1 .endif sta FRETOP sty FRETOP+1 .ifdef CONFIG_CBM_ALL jsr CLALL .endif lda VARTAB ldy VARTAB+1 sta ARYTAB sty ARYTAB+1 sta STREND sty STREND+1 jsr RESTORE ; ---------------------------------------------------------------------------- STKINI: ldx #TEMPST stx TEMPPT pla .ifdef CONFIG_2 tay .else sta STACK+STACK_TOP+1 .endif pla .ifndef CONFIG_2 sta STACK+STACK_TOP+2 .endif ldx #STACK_TOP txs .ifdef CONFIG_2 pha tya pha .endif lda #$00 sta OLDTEXT+1 sta SUBFLG L256A: rts ; ---------------------------------------------------------------------------- ; SET TXTPTR TO BEGINNING OF PROGRAM ; ---------------------------------------------------------------------------- STXTPT: clc lda TXTTAB adc #$FF sta TXTPTR lda TXTTAB+1 adc #$FF sta TXTPTR+1 rts ; ---------------------------------------------------------------------------- .ifdef KBD LE4C0: ldy #LE444 LE4C4: jsr LFFD6 jsr LFFED lda $0504 clc adc #$08 sta $0504 rts CMPJMPADRS: lda 1,x cmp JMPADRS+2 bne LE4DE lda 0,x cmp JMPADRS+1 LE4DE: rts .endif ; ---------------------------------------------------------------------------- ; "LIST" STATEMENT ; ---------------------------------------------------------------------------- LIST: .ifdef KBD jsr LE440 bne LE4DE pla pla L25A6: jsr CRDO .else .ifdef AIM65 pha lda #$00 LB4BF: sta INPUTFLG pla .endif .ifdef MICROTAN php jmp LE21C ; patch LC57E: .elseif .def(AIM65) || .def(SYM1) php jsr LINGET LC57E: .else bcc L2581 beq L2581 cmp #TOKEN_MINUS bne L256A L2581: jsr LINGET .endif jsr FNDLIN .if .def(MICROTAN) || .def(AIM65) || .def(SYM1) plp beq L2598 .endif jsr CHRGOT .if .def(MICROTAN) || .def(AIM65) || .def(SYM1) beq L25A6 .else beq L2598 .endif cmp #TOKEN_MINUS bne L2520 jsr CHRGET .if .def(MICROTAN) || .def(AIM65) || .def(SYM1) beq L2598 jsr LINGET beq L25A6 rts .else jsr LINGET bne L2520 .endif L2598: .if !(.def(MICROTAN) || .def(AIM65) || .def(SYM1)) pla pla lda LINNUM ora LINNUM+1 bne L25A6 .endif lda #$FF sta LINNUM sta LINNUM+1 L25A6: .if .def(MICROTAN) || .def(AIM65) || .def(SYM1) pla pla .endif L25A6X: .endif ldy #$01 .ifdef CONFIG_DATAFLG sty DATAFLG .endif lda (LOWTRX),y beq L25E5 .ifdef MICROTAN jmp LE21F LC5A9: .else jsr ISCNTC .endif .ifndef KBD jsr CRDO .endif iny lda (LOWTRX),y tax iny lda (LOWTRX),y cmp LINNUM+1 bne L25C1 cpx LINNUM beq L25C3 L25C1: bcs L25E5 ; ---LIST ONE LINE---------------- L25C3: sty FORPNT jsr LINPRT lda #$20 L25CA: ldy FORPNT and #$7F L25CE: jsr OUTDO .ifdef CONFIG_DATAFLG cmp #$22 bne LA519 lda DATAFLG eor #$FF sta DATAFLG LA519: .endif iny .ifdef CONFIG_11 beq L25E5 .endif lda (LOWTRX),y bne L25E8 tay lda (LOWTRX),y tax iny lda (LOWTRX),y stx LOWTRX sta LOWTRX+1 .if .def(MICROTAN) || .def(AIM65) || .def(SYM1) bne L25A6X .else bne L25A6 .endif L25E5: .ifdef AIM65 lda INPUTFLG beq L25E5a jsr CRDO jsr CRDO lda #$1a jsr OUTDO jsr $e50a L25E5a: .endif jmp RESTART L25E8: bpl L25CE .ifdef CONFIG_DATAFLG cmp #$FF beq L25CE bit DATAFLG bmi L25CE .endif sec sbc #$7F tax sty FORPNT ldy #$FF L25F2: dex beq L25FD L25F5: iny lda TOKEN_NAME_TABLE,y bpl L25F5 bmi L25F2 L25FD: iny lda TOKEN_NAME_TABLE,y bmi L25CA jsr OUTDO bne L25FD ; always