msbasic/program.s

812 lines
17 KiB
ArmAsm
Raw Normal View History

2008-10-18 06:44:54 +00:00
; error
; line input, line editing
; tokenize
; detokenize
; BASIC program memory management
2008-10-18 06:38:54 +00:00
; MICROTAN has some nonstandard extension to LIST here
2008-10-13 02:05:35 +00:00
.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
2008-10-16 06:53:45 +00:00
.ifdef CONFIG_FILE
2008-10-18 21:14:22 +00:00
lda CURDVC ; output
2008-10-13 02:05:35 +00:00
beq LC366 ; is screen
jsr CLRCH ; otherwise redirect output back to screen
lda #$00
2008-10-18 21:14:22 +00:00
sta CURDVC
2008-10-13 02:05:35 +00:00
LC366:
.endif
jsr CRDO
jsr OUTQUES
L2329:
lda ERROR_MESSAGES,x
2014-02-14 06:40:56 +00:00
.ifndef CONFIG_SMALL_ERROR
2008-10-13 02:05:35 +00:00
pha
and #$7F
.endif
jsr OUTDO
2014-02-14 06:40:56 +00:00
.ifdef CONFIG_SMALL_ERROR
2008-10-13 02:05:35 +00:00
lda ERROR_MESSAGES+1,x
2008-10-16 07:12:27 +00:00
.ifdef KBD
2008-10-13 02:05:35 +00:00
and #$7F
2008-10-16 07:12:27 +00:00
.endif
2008-10-13 02:05:35 +00:00
jsr OUTDO
.else
inx
pla
bpl L2329
.endif
jsr STKINI
lda #<QT_ERROR
ldy #>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:
2008-10-16 07:42:48 +00:00
jsr INLIN
2008-10-13 02:05:35 +00:00
LE28E:
bpl RESTART
.else
lsr Z14
2014-02-14 06:40:56 +00:00
.ifndef AIM65
2008-10-13 02:05:35 +00:00
lda #<QT_OK
ldy #>QT_OK
2008-10-16 07:12:27 +00:00
.ifdef CONFIG_CBM_ALL
2008-10-13 02:05:35 +00:00
jsr STROUT
2008-10-16 07:12:27 +00:00
.else
jsr GOSTROUT
.endif
2014-02-14 06:40:56 +00:00
.else
jsr GORESTART
.endif
2008-10-13 02:05:35 +00:00
L2351:
jsr INLIN
.endif
stx TXTPTR
sty TXTPTR+1
jsr CHRGET
.ifdef CONFIG_11
2008-10-16 07:42:48 +00:00
; bug in pre-1.1: CHRGET sets Z on '\0'
; and ':' - a line starting with ':' in
; direct mode gets ignored
2008-10-13 02:05:35 +00:00
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
2008-10-13 11:05:37 +00:00
jsr FNDLIN2
2008-10-13 02:05:35 +00:00
lda JMPADRS+1
sta LOWTR
2008-10-16 07:42:48 +00:00
sta Z96
2008-10-13 02:05:35 +00:00
lda JMPADRS+2
sta LOWTR+1
2008-10-16 07:42:48 +00:00
sta Z96+1
lda LINNUM
sta L06FE
lda LINNUM+1
sta L06FE+1
inc LINNUM
2008-10-13 02:05:35 +00:00
bne LE2D2
2008-10-16 07:42:48 +00:00
inc LINNUM+1
2008-10-13 02:05:35 +00:00
bne LE2D2
jmp SYNERR
LE2D2:
jsr LF457
2008-10-16 07:42:48 +00:00
ldx #Z96
jsr CMPJMPADRS
2008-10-13 02:05:35 +00:00
bcs LE2FD
LE2DC:
ldx #$00
lda (JMPADRS+1,x)
2008-10-16 07:42:48 +00:00
sta (Z96,x)
2008-10-13 02:05:35 +00:00
inc JMPADRS+1
bne LE2E8
inc JMPADRS+2
LE2E8:
2008-10-16 07:42:48 +00:00
inc Z96
2008-10-13 02:05:35 +00:00
bne LE2EE
2008-10-16 07:42:48 +00:00
inc Z96+1
2008-10-13 02:05:35 +00:00
LE2EE:
2008-10-16 07:42:48 +00:00
ldx #VARTAB
jsr CMPJMPADRS
2008-10-13 02:05:35 +00:00
bne LE2DC
2008-10-16 07:42:48 +00:00
lda Z96
2008-10-13 02:05:35 +00:00
sta VARTAB
2008-10-16 07:42:48 +00:00
lda Z96+1
2008-10-13 02:05:35 +00:00
sta VARTAB+1
LE2FD:
jsr SETPTRS
jsr LE33D
2008-10-16 07:12:27 +00:00
lda INPUTBUFFER
2008-10-13 02:05:35 +00:00
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:
2008-10-16 09:28:49 +00:00
.ifndef KBD
.ifdef CONFIG_2
2008-10-13 02:05:35 +00:00
jsr SETPTRS
jsr LE33D
lda INPUTBUFFER
beq L2351
clc
2008-10-16 09:28:49 +00:00
.else
2008-10-13 02:05:35 +00:00
lda INPUTBUFFER
beq FIX_LINKS
lda MEMSIZ
ldy MEMSIZ+1
sta FRETOP
sty FRETOP+1
2008-10-13 11:05:37 +00:00
.endif
2008-10-13 02:05:35 +00:00
.endif
lda VARTAB
sta HIGHTR
adc EOLPNTR
sta HIGHDS
ldy VARTAB+1
sty HIGHTR+1
bcc L23D6
iny
L23D6:
sty HIGHDS+1
jsr BLTU
2008-10-18 05:18:45 +00:00
.ifdef CONFIG_INPUTBUFFER_0200
2008-10-13 02:05:35 +00:00
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
2008-10-13 20:26:42 +00:00
.ifdef CONFIG_2
2008-10-13 02:05:35 +00:00
jsr LE33D
jmp L2351
LE33D:
.endif
lda TXTTAB
ldy TXTTAB+1
sta INDEX
sty INDEX+1
clc
L23FA:
ldy #$01
lda (INDEX),y
2008-10-13 20:26:42 +00:00
.ifdef CONFIG_2
2008-10-13 02:05:35 +00:00
beq RET3
.else
2008-10-20 08:58:09 +00:00
jeq L2351
2008-10-13 11:05:37 +00:00
.endif
2008-10-13 02:05:35 +00:00
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
2008-10-13 11:05:37 +00:00
bcc L23FA ; always
; ----------------------------------------------------------------------------
2008-10-13 02:05:35 +00:00
.ifdef KBD
2008-10-18 06:38:54 +00:00
.include "kbd_loadsave.s"
2008-10-13 11:05:37 +00:00
.endif
2008-10-16 09:28:49 +00:00
.ifdef CONFIG_2
2008-10-18 06:38:54 +00:00
; !!! kbd_loadsave.s requires an RTS here!
2008-10-13 11:05:37 +00:00
RET3:
rts
.endif
2008-10-18 08:22:00 +00:00
.include "inline.s"
2008-10-13 02:05:35 +00:00
; ----------------------------------------------------------------------------
; 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
2008-10-13 10:42:49 +00:00
jsr GET_UPPER
2008-10-13 02:05:35 +00:00
.else
lda INPUTBUFFERX,x
2008-10-16 09:28:49 +00:00
.ifndef CONFIG_2
2008-10-13 02:05:35 +00:00
cmp #$20
beq L2497
2008-10-13 10:42:49 +00:00
.endif
2008-10-13 02:05:35 +00:00
.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
2008-10-18 05:18:45 +00:00
.ifdef CONFIG_NO_INPUTBUFFER_ZP
2008-10-13 02:05:35 +00:00
dec TXTPTR+1
.endif
lda #<INPUTBUFFER-1
sta TXTPTR
rts
; ----------------------------------------------------------------------------
; SEARCH FOR LINE
;
; (LINNUM) = LINE # TO FIND
; IF NOT FOUND: CARRY = 0
; LOWTR POINTS AT NEXT LINE
; IF FOUND: CARRY = 1
; LOWTR POINTS AT LINE
; ----------------------------------------------------------------------------
FNDLIN:
.ifdef KBD
jsr CHRGET
jmp LE444
LE440:
php
jsr LINGET
LE444:
jsr LF457
ldx #$FF
plp
beq LE464
jsr CHRGOT
beq L2520
cmp #$A5
bne L2520
jsr CHRGET
beq LE464
bcs LE461
jsr LINGET
beq L2520
LE461:
jmp SYNERR
LE464:
2008-10-16 07:42:48 +00:00
stx LINNUM
stx LINNUM+1
2008-10-13 02:05:35 +00:00
.else
lda TXTTAB
ldx TXTTAB+1
FL1:
ldy #$01
sta LOWTR
stx LOWTR+1
lda (LOWTR),y
beq L251F
iny
iny
lda LINNUM+1
cmp (LOWTR),y
bcc L2520
beq L250D
dey
bne L2516
L250D:
lda LINNUM
dey
cmp (LOWTR),y
bcc L2520
beq L2520
L2516:
dey
lda (LOWTR),y
tax
dey
lda (LOWTR),y
bcs FL1
L251F:
clc
.endif
L2520:
rts
; ----------------------------------------------------------------------------
; "NEW" STATEMENT
; ----------------------------------------------------------------------------
NEW:
bne L2520
SCRTCH:
lda #$00
tay
sta (TXTTAB),y
iny
sta (TXTTAB),y
lda TXTTAB
2008-10-13 20:26:42 +00:00
.ifdef CONFIG_2
2008-10-13 02:05:35 +00:00
clc
.endif
adc #$02
sta VARTAB
lda TXTTAB+1
adc #$00
sta VARTAB+1
; ----------------------------------------------------------------------------
SETPTRS:
jsr STXTPT
2008-10-18 08:22:00 +00:00
.ifdef CONFIG_11A
2008-10-13 02:05:35 +00:00
lda #$00
; ----------------------------------------------------------------------------
; "CLEAR" STATEMENT
; ----------------------------------------------------------------------------
CLEAR:
bne L256A
.endif
CLEARC:
.ifdef KBD
lda #<CONST_MEMSIZ
ldy #>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
2008-10-13 20:26:42 +00:00
.ifdef CONFIG_2
2008-10-13 02:05:35 +00:00
tay
.else
2008-10-18 08:22:00 +00:00
sta STACK+STACK_TOP+1
2008-10-13 02:05:35 +00:00
.endif
pla
2008-10-13 20:26:42 +00:00
.ifndef CONFIG_2
2008-10-18 08:22:00 +00:00
sta STACK+STACK_TOP+2
2008-10-13 02:05:35 +00:00
.endif
ldx #STACK_TOP
txs
2008-10-13 20:26:42 +00:00
.ifdef CONFIG_2
2008-10-13 02:05:35 +00:00
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
2008-10-13 20:26:42 +00:00
; ----------------------------------------------------------------------------
2008-10-13 02:05:35 +00:00
.ifdef KBD
LE4C0:
ldy #<LE444
ldx #>LE444
LE4C4:
jsr LFFD6
jsr LFFED
lda $0504
clc
adc #$08
sta $0504
rts
2008-10-16 07:42:48 +00:00
CMPJMPADRS:
lda 1,x
2008-10-13 02:05:35 +00:00
cmp JMPADRS+2
bne LE4DE
2008-10-16 07:42:48 +00:00
lda 0,x
2008-10-13 02:05:35 +00:00
cmp JMPADRS+1
LE4DE:
rts
2008-10-13 20:26:42 +00:00
.endif
2008-10-13 02:05:35 +00:00
; ----------------------------------------------------------------------------
; "LIST" STATEMENT
; ----------------------------------------------------------------------------
LIST:
2008-10-13 20:26:42 +00:00
.ifdef KBD
2008-10-13 02:05:35 +00:00
jsr LE440
bne LE4DE
pla
pla
L25A6:
jsr CRDO
.else
2014-02-14 06:40:56 +00:00
.ifdef AIM65
pha
lda #$00
LB4BF:
sta INPUTFLG
pla
.endif
2008-10-14 09:23:44 +00:00
.ifdef MICROTAN
2008-10-13 20:26:42 +00:00
php
2008-10-18 06:38:54 +00:00
jmp LE21C ; patch
2014-02-14 06:40:56 +00:00
LC57E:
2014-02-15 02:46:36 +00:00
.elseif .def(AIM65) || .def(SYM1)
2014-02-14 06:40:56 +00:00
php
jsr LINGET
2008-10-13 20:26:42 +00:00
LC57E:
2008-10-14 09:23:44 +00:00
.else
2008-10-13 02:05:35 +00:00
bcc L2581
beq L2581
cmp #TOKEN_MINUS
bne L256A
L2581:
jsr LINGET
2008-10-14 09:23:44 +00:00
.endif
2008-10-13 02:05:35 +00:00
jsr FNDLIN
2014-02-15 02:46:36 +00:00
.if .def(MICROTAN) || .def(AIM65) || .def(SYM1)
2008-10-13 20:26:42 +00:00
plp
2008-10-18 06:38:54 +00:00
beq L2598
2008-10-14 09:23:44 +00:00
.endif
2008-10-13 02:05:35 +00:00
jsr CHRGOT
2014-02-15 02:46:36 +00:00
.if .def(MICROTAN) || .def(AIM65) || .def(SYM1)
2008-10-15 05:28:25 +00:00
beq L25A6
.else
2008-10-13 02:05:35 +00:00
beq L2598
2008-10-15 05:28:25 +00:00
.endif
2008-10-13 02:05:35 +00:00
cmp #TOKEN_MINUS
bne L2520
jsr CHRGET
2014-02-15 02:46:36 +00:00
.if .def(MICROTAN) || .def(AIM65) || .def(SYM1)
2008-10-18 06:38:54 +00:00
beq L2598
2008-10-13 20:26:42 +00:00
jsr LINGET
beq L25A6
rts
2008-10-14 09:23:44 +00:00
.else
2008-10-13 02:05:35 +00:00
jsr LINGET
bne L2520
2008-10-14 09:23:44 +00:00
.endif
2008-10-13 02:05:35 +00:00
L2598:
2014-02-15 02:46:36 +00:00
.if !(.def(MICROTAN) || .def(AIM65) || .def(SYM1))
2008-10-13 02:05:35 +00:00
pla
pla
lda LINNUM
ora LINNUM+1
bne L25A6
2008-10-14 09:23:44 +00:00
.endif
2008-10-13 02:05:35 +00:00
lda #$FF
sta LINNUM
sta LINNUM+1
2008-10-14 09:23:44 +00:00
L25A6:
2014-02-15 02:46:36 +00:00
.if .def(MICROTAN) || .def(AIM65) || .def(SYM1)
2008-10-13 20:26:42 +00:00
pla
pla
2008-10-14 09:23:44 +00:00
.endif
2008-10-15 05:28:25 +00:00
L25A6X:
2008-10-13 02:05:35 +00:00
.endif
ldy #$01
2008-10-18 21:14:22 +00:00
.ifdef CONFIG_DATAFLG
2008-10-13 02:05:35 +00:00
sty DATAFLG
.endif
lda (LOWTRX),y
beq L25E5
2008-10-14 09:23:44 +00:00
.ifdef MICROTAN
2008-10-20 08:58:09 +00:00
jmp LE21F
2008-10-15 05:28:25 +00:00
LC5A9:
2008-10-14 09:23:44 +00:00
.else
2008-10-13 02:05:35 +00:00
jsr ISCNTC
2008-10-14 09:23:44 +00:00
.endif
2008-10-13 02:05:35 +00:00
.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
2008-10-18 21:14:22 +00:00
.ifdef CONFIG_DATAFLG
2008-10-13 02:05:35 +00:00
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
2014-02-15 02:46:36 +00:00
.if .def(MICROTAN) || .def(AIM65) || .def(SYM1)
2008-10-15 05:28:25 +00:00
bne L25A6X
.else
2008-10-13 02:05:35 +00:00
bne L25A6
2008-10-15 05:28:25 +00:00
.endif
2008-10-13 02:05:35 +00:00
L25E5:
2014-02-14 06:40:56 +00:00
.ifdef AIM65
lda INPUTFLG
beq L25E5a
jsr CRDO
jsr CRDO
lda #$1a
jsr OUTDO
jsr $e50a
L25E5a:
.endif
2008-10-13 02:05:35 +00:00
jmp RESTART
L25E8:
bpl L25CE
2008-10-18 21:14:22 +00:00
.ifdef CONFIG_DATAFLG
2008-10-13 02:05:35 +00:00
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
2008-10-16 06:53:45 +00:00
bne L25FD ; always
2008-10-13 02:05:35 +00:00