mirror of
https://github.com/mist64/msbasic.git
synced 2024-12-22 08:29:21 +00:00
243 lines
5.3 KiB
ArmAsm
243 lines
5.3 KiB
ArmAsm
.segment "CODE"
|
|
|
|
; ----------------------------------------------------------------------------
|
|
; "DIM" STATEMENT
|
|
; ----------------------------------------------------------------------------
|
|
NXDIM:
|
|
jsr CHKCOM
|
|
DIM:
|
|
tax
|
|
jsr PTRGET2
|
|
jsr CHRGOT
|
|
bne NXDIM
|
|
rts
|
|
|
|
; ----------------------------------------------------------------------------
|
|
; PTRGET -- GENERAL VARIABLE SCAN
|
|
;
|
|
; SCANS VARIABLE NAME AT TXTPTR, AND SEARCHES THE
|
|
; VARTAB AND ARYTAB FOR THE NAME.
|
|
; IF NOT FOUND, CREATE VARIABLE OF APPROPRIATE TYPE.
|
|
; RETURN WITH ADDRESS IN VARPNT AND Y,A
|
|
;
|
|
; ACTUAL ACTIVITY CONTROLLED SOMEWHAT BY TWO FLAGS:
|
|
; DIMFLG -- NONZERO IF CALLED FROM "DIM"
|
|
; ELSE = 0
|
|
;
|
|
; SUBFLG -- = $00
|
|
; = $40 IF CALLED FROM "GETARYPT"
|
|
; ----------------------------------------------------------------------------
|
|
PTRGET:
|
|
ldx #$00
|
|
jsr CHRGOT
|
|
PTRGET2:
|
|
stx DIMFLG
|
|
PTRGET3:
|
|
sta VARNAM
|
|
jsr CHRGOT
|
|
jsr ISLETC
|
|
bcs NAMOK
|
|
SYNERR3:
|
|
jmp SYNERR
|
|
NAMOK:
|
|
ldx #$00
|
|
stx VALTYP
|
|
.ifndef CONFIG_SMALL
|
|
stx VALTYP+1
|
|
.endif
|
|
jsr CHRGET
|
|
bcc L2ECD
|
|
jsr ISLETC
|
|
bcc L2ED8
|
|
L2ECD:
|
|
tax
|
|
L2ECE:
|
|
jsr CHRGET
|
|
bcc L2ECE
|
|
jsr ISLETC
|
|
bcs L2ECE
|
|
L2ED8:
|
|
cmp #$24
|
|
.ifdef CONFIG_SMALL
|
|
bne L2EF9
|
|
.else
|
|
bne L2EE2
|
|
.endif
|
|
lda #$FF
|
|
sta VALTYP
|
|
.ifndef CONFIG_SMALL
|
|
bne L2EF2
|
|
L2EE2:
|
|
cmp #$25
|
|
bne L2EF9
|
|
lda SUBFLG
|
|
bne SYNERR3
|
|
lda #$80
|
|
sta VALTYP+1
|
|
ora VARNAM
|
|
sta VARNAM
|
|
L2EF2:
|
|
.endif
|
|
txa
|
|
ora #$80
|
|
tax
|
|
jsr CHRGET
|
|
L2EF9:
|
|
stx VARNAM+1
|
|
sec
|
|
ora SUBFLG
|
|
sbc #$28
|
|
bne L2F05
|
|
jmp ARRAY
|
|
L2F05:
|
|
lda #$00
|
|
sta SUBFLG
|
|
lda VARTAB
|
|
ldx VARTAB+1
|
|
ldy #$00
|
|
L2F0F:
|
|
stx LOWTR+1
|
|
L2F11:
|
|
sta LOWTR
|
|
cpx ARYTAB+1
|
|
bne L2F1B
|
|
cmp ARYTAB
|
|
beq NAMENOTFOUND
|
|
L2F1B:
|
|
lda VARNAM
|
|
cmp (LOWTR),y
|
|
bne L2F29
|
|
lda VARNAM+1
|
|
iny
|
|
cmp (LOWTR),y
|
|
beq SET_VARPNT_AND_YA
|
|
dey
|
|
L2F29:
|
|
clc
|
|
lda LOWTR
|
|
adc #BYTES_PER_VARIABLE
|
|
bcc L2F11
|
|
inx
|
|
bne L2F0F
|
|
|
|
; ----------------------------------------------------------------------------
|
|
; CHECK IF (A) IS ASCII LETTER A-Z
|
|
;
|
|
; RETURN CARRY = 1 IF A-Z
|
|
; = 0 IF NOT
|
|
; ----------------------------------------------------------------------------
|
|
ISLETC:
|
|
cmp #$41
|
|
bcc L2F3C
|
|
sbc #$5B
|
|
sec
|
|
sbc #$A5
|
|
L2F3C:
|
|
rts
|
|
|
|
; ----------------------------------------------------------------------------
|
|
; VARIABLE NOT FOUND, SO MAKE ONE
|
|
; ----------------------------------------------------------------------------
|
|
NAMENOTFOUND:
|
|
pla
|
|
pha
|
|
cmp #<FRM_VARIABLE_CALL
|
|
bne MAKENEWVARIABLE
|
|
.ifdef CONFIG_SAFE_NAMENOTFOUND
|
|
tsx
|
|
lda STACK+2,x
|
|
cmp #>FRM_VARIABLE_CALL
|
|
bne MAKENEWVARIABLE
|
|
.endif
|
|
LD015:
|
|
lda #<C_ZERO
|
|
ldy #>C_ZERO
|
|
rts
|
|
|
|
; ----------------------------------------------------------------------------
|
|
.ifndef CONFIG_2
|
|
C_ZERO:
|
|
.byte $00,$00
|
|
.endif
|
|
|
|
; ----------------------------------------------------------------------------
|
|
; MAKE A NEW SIMPLE VARIABLE
|
|
;
|
|
; MOVE ARRAYS UP 7 BYTES TO MAKE ROOM FOR NEW VARIABLE
|
|
; ENTER 7-BYTE VARIABLE DATA IN THE HOLE
|
|
; ----------------------------------------------------------------------------
|
|
MAKENEWVARIABLE:
|
|
.ifdef CONFIG_CBM_ALL
|
|
lda VARNAM
|
|
ldy VARNAM+1
|
|
cmp #$54
|
|
bne LD02F
|
|
cpy #$C9
|
|
beq LD015
|
|
cpy #$49
|
|
bne LD02F
|
|
LD02C:
|
|
jmp SYNERR
|
|
LD02F:
|
|
cmp #$53
|
|
bne LD037
|
|
cpy #$54
|
|
beq LD02C
|
|
LD037:
|
|
.endif
|
|
lda ARYTAB
|
|
ldy ARYTAB+1
|
|
sta LOWTR
|
|
sty LOWTR+1
|
|
lda STREND
|
|
ldy STREND+1
|
|
sta HIGHTR
|
|
sty HIGHTR+1
|
|
clc
|
|
adc #BYTES_PER_VARIABLE
|
|
bcc L2F68
|
|
iny
|
|
L2F68:
|
|
sta HIGHDS
|
|
sty HIGHDS+1
|
|
jsr BLTU
|
|
lda HIGHDS
|
|
ldy HIGHDS+1
|
|
iny
|
|
sta ARYTAB
|
|
sty ARYTAB+1
|
|
ldy #$00
|
|
lda VARNAM
|
|
sta (LOWTR),y
|
|
iny
|
|
lda VARNAM+1
|
|
sta (LOWTR),y
|
|
lda #$00
|
|
iny
|
|
sta (LOWTR),y
|
|
iny
|
|
sta (LOWTR),y
|
|
iny
|
|
sta (LOWTR),y
|
|
iny
|
|
sta (LOWTR),y
|
|
.ifndef CONFIG_SMALL
|
|
iny
|
|
sta (LOWTR),y
|
|
.endif
|
|
|
|
; ----------------------------------------------------------------------------
|
|
; PUT ADDRESS OF VALUE OF VARIABLE IN VARPNT AND Y,A
|
|
; ----------------------------------------------------------------------------
|
|
SET_VARPNT_AND_YA:
|
|
lda LOWTR
|
|
clc
|
|
adc #$02
|
|
ldy LOWTR+1
|
|
bcc L2F9E
|
|
iny
|
|
L2F9E:
|
|
sta VARPNT
|
|
sty VARPNT+1
|
|
rts
|