CPU-Z80-Disassembler
view release on metacpan or search on metacpan
t/data/zx48_base.asm view on Meta::CPAN
;; STK-VAR
STK_VAR:
xor a ; clear A
ld b,a ; and B, the syntax dimension counter (256)
bit 7,c ; checking syntax ?
jr nz,SV_COUNT ; forward to SV-COUNT if so.
; runtime evaluation.
bit 7,(hl) ; will be reset if a simple string.
jr nz,SV_ARRAYS ; forward to SV-ARRAYS otherwise
inc a ; set A to 1, simple string.
;; SV-SIMPLE$
SV_SIMPLE_:
inc hl ; address length low
ld c,(hl) ; place in C
inc hl ; address length high
ld b,(hl) ; place in B
inc hl ; address start of string
ex de,hl ; DE = start now.
call STK_STO__ ; routine STK-STO-$ stacks string parameters
; DE start in variables area,
; BC length, A=1 simple string
; the only thing now is to consider if a slice is required.
rst 0x18 ; GET-CHAR puts character at CH_ADD in A
jp SV_SLICE_ ; jump forward to SV-SLICE? to test for '('
; --------------------------------------------------------
; the branch was here with string and numeric arrays in runtime.
;; SV-ARRAYS
SV_ARRAYS:
inc hl ; step past
inc hl ; the total length
inc hl ; to address Number of dimensions.
ld b,(hl) ; transfer to B overwriting zero.
bit 6,c ; a numeric array ?
jr z,SV_PTR ; forward to SV-PTR with numeric arrays
dec b ; ignore the final element of a string array
; the fixed string size.
jr z,SV_SIMPLE_ ; back to SV-SIMPLE$ if result is zero as has
; been created with DIM a$(10) for instance
; and can be treated as a simple string.
; proceed with multi-dimensioned string arrays in runtime.
ex de,hl ; save pointer to dimensions in DE
rst 0x18 ; GET-CHAR looks at the BASIC line
cp 0x28 ; is character '(' ?
jr nz,REPORT_3 ; to REPORT-3 if not
; 'Subscript wrong'
ex de,hl ; dimensions pointer to HL to synchronize
; with next instruction.
; runtime numeric arrays path rejoins here.
;; SV-PTR
SV_PTR:
ex de,hl ; save dimension pointer in DE
jr SV_COUNT ; forward to SV-COUNT with true no of dims
; in B. As there is no initial comma the
; loop is entered at the midpoint.
; ----------------------------------------------------------
; the dimension counting loop which is entered at mid-point.
;; SV-COMMA
SV_COMMA:
push hl ; save counter
rst 0x18 ; GET-CHAR
pop hl ; pop counter
cp 0x2C ; is character ',' ?
jr z,SV_LOOP ; forward to SV-LOOP if so
; in runtime the variable definition indicates a comma should appear here
bit 7,c ; checking syntax ?
jr z,REPORT_3 ; forward to REPORT-3 if not
; 'Subscript error'
; proceed if checking syntax of an array?
bit 6,c ; array of strings
jr nz,SV_CLOSE ; forward to SV-CLOSE if so
; an array of numbers.
cp 0x29 ; is character ')' ?
jr nz,SV_RPT_C ; forward to SV-RPT-C if not
; 'Nonsense in BASIC'
rst 0x20 ; NEXT-CHAR moves CH-ADD past the statement
ret ; return ->
; ---
; the branch was here with an array of strings.
;; SV-CLOSE
SV_CLOSE:
cp 0x29 ; as above ')' could follow the expression
jr z,SV_DIM ; forward to SV-DIM if so
cp 0xCC ; is it 'TO' ?
jr nz,SV_RPT_C ; to SV-RPT-C with anything else
; 'Nonsense in BASIC'
; now backtrack CH_ADD to set up for slicing routine.
; Note. in a BASIC line we can safely backtrack to a colour parameter.
( run in 1.953 second using v1.01-cache-2.11-cpan-39bf76dae61 )