msbasic/memory.s

155 lines
3.4 KiB
ArmAsm
Raw Normal View History

2008-10-16 06:53:45 +00:00
; generic stack and memory management code
; this code is identical across all versions of
; BASIC
2008-10-13 02:05:35 +00:00
.segment "CODE"
; ----------------------------------------------------------------------------
2008-10-13 02:14:07 +00:00
; CALLED BY "NEXT" AND "FOR" TO SCAN THROUGH
; THE STACK FOR A FRAME WITH THE SAME VARIABLE.
2008-10-13 02:05:35 +00:00
;
2008-10-13 02:14:07 +00:00
; (FORPNT) = ADDRESS OF VARIABLE IF "FOR" OR "NEXT"
; = $XXFF IF CALLED FROM "RETURN"
; <<< BUG: SHOULD BE $FFXX >>>
2008-10-13 02:05:35 +00:00
;
2008-10-13 02:14:07 +00:00
; RETURNS .NE. IF VARIABLE NOT FOUND,
; (X) = STACK PNTR AFTER SKIPPING ALL FRAMES
2008-10-13 02:05:35 +00:00
;
2008-10-13 02:14:07 +00:00
; .EQ. IF FOUND
; (X) = STACK PNTR OF FRAME FOUND
2008-10-13 02:05:35 +00:00
; ----------------------------------------------------------------------------
2008-10-13 02:14:07 +00:00
GTFORPNT:
tsx
inx
inx
inx
inx
L2279:
lda STACK+1,x
cmp #$81
bne L22A1
lda FORPNT+1
bne L228E
lda STACK+2,x
sta FORPNT
lda STACK+3,x
sta FORPNT+1
L228E:
cmp STACK+3,x
bne L229A
lda FORPNT
cmp STACK+2,x
beq L22A1
L229A:
2008-10-13 02:05:35 +00:00
txa
clc
2008-10-13 02:14:07 +00:00
adc #BYTES_PER_FRAME
tax
bne L2279
L22A1:
rts
2008-10-13 02:05:35 +00:00
; ----------------------------------------------------------------------------
2008-10-13 02:14:07 +00:00
; MOVE BLOCK OF MEMORY UP
2008-10-13 02:05:35 +00:00
;
2008-10-13 02:14:07 +00:00
; ON ENTRY:
; (Y,A) = (HIGHDS) = DESTINATION END+1
; (LOWTR) = LOWEST ADDRESS OF SOURCE
; (HIGHTR) = HIGHEST SOURCE ADDRESS+1
2008-10-13 02:05:35 +00:00
; ----------------------------------------------------------------------------
2008-10-13 02:14:07 +00:00
BLTU:
jsr REASON
sta STREND
sty STREND+1
BLTU2:
sec
lda HIGHTR
sbc LOWTR
sta INDEX
tay
lda HIGHTR+1
sbc LOWTR+1
tax
inx
tya
beq L22DD
lda HIGHTR
sec
sbc INDEX
sta HIGHTR
bcs L22C6
dec HIGHTR+1
2008-10-13 02:05:35 +00:00
sec
2008-10-13 02:14:07 +00:00
L22C6:
lda HIGHDS
sbc INDEX
sta HIGHDS
bcs L22D6
dec HIGHDS+1
bcc L22D6
L22D2:
lda (HIGHTR),y
sta (HIGHDS),y
L22D6:
dey
bne L22D2
lda (HIGHTR),y
sta (HIGHDS),y
L22DD:
dec HIGHTR+1
dec HIGHDS+1
dex
bne L22D6
2008-10-13 02:05:35 +00:00
rts
; ----------------------------------------------------------------------------
2008-10-13 02:14:07 +00:00
; CHECK IF ENOUGH ROOM LEFT ON STACK
; FOR "FOR", "GOSUB", OR EXPRESSION EVALUATION
2008-10-13 02:05:35 +00:00
; ----------------------------------------------------------------------------
2008-10-13 02:14:07 +00:00
CHKMEM:
asl a
adc #SPACE_FOR_GOSUB
bcs MEMERR
sta INDEX
2008-10-13 02:05:35 +00:00
tsx
2008-10-13 02:14:07 +00:00
cpx INDEX
bcc MEMERR
2008-10-13 02:05:35 +00:00
rts
; ----------------------------------------------------------------------------
2008-10-13 02:14:07 +00:00
; CHECK IF ENOUGH ROOM BETWEEN ARRAYS AND STRINGS
; (Y,A) = ADDR ARRAYS NEED TO GROW TO
2008-10-13 02:05:35 +00:00
; ----------------------------------------------------------------------------
2008-10-13 02:14:07 +00:00
REASON:
cpy FRETOP+1
bcc L231E
bne L22FC
cmp FRETOP
bcc L231E
L22FC:
pha
ldx #FAC-TEMP1-1
tya
L2300:
pha
lda TEMP1,x
dex
bpl L2300
jsr GARBAG
ldx #TEMP1-FAC+1
L230B:
pla
sta FAC,x
inx
bmi L230B
pla
tay
pla
cpy FRETOP+1
bcc L231E
bne MEMERR
cmp FRETOP
bcs MEMERR
L231E:
2008-10-13 02:05:35 +00:00
rts