inc de\r
skipbl:\r
ld a,(de)\r
- cp ' '\r
- jr z,skipbl0\r
- cp TAB\r
+ call test_whitespace\r
jr z,skipbl0\r
or a\r
ret\r
call read_hexbyte ; symval L\r
ld l,a\r
add hl,de\r
- push hl ; symval\r
call read_byte\r
cp ' '\r
jr z,rs_4\r
- pop hl ; discard symval\r
rs_3: call read_byte\r
cp ' '\r
- jr c,rs_2\r
- jr rs_3\r
+ jr nc,rs_3\r
+ jr rs_2\r
\r
-rs_4: ld hl,(BDOS+1) ;\r
- ld d,0 ; setup symlen\r
-rs_5: dec hl ;\r
+rs_4:\r
+ push hl ; symval\r
+ ld hl,(BDOS+1) ;\r
+ ld b,0 ; setup symlen\r
+rs_5:\r
+ dec hl ;\r
call read_byte ; next char of symbol name\r
- cp TAB ; symbol term?\r
- jr z,rs_6 ;\r
- cp CR ;\r
- jr z,rs_6 ;\r
- cp '!' ; TODO: check for valid symbol char instead\r
- jr c,error3 ;\r
+ call test_sym_char ; valid char?\r
+ jr nz,rs_6\r
ld (hl),a ;\r
- inc d ; symlen++\r
- ld a,d ;\r
+ inc b ; symlen++\r
+ ld a,b ;\r
cp 10h+1 ;\r
jr c,rs_5 ;\r
error3:\r
jp ERROR ;\r
\r
-rs_6: push de ; symlen\r
- push hl ;\r
+rs_6:\r
+ call test_symterm_ch\r
+ jr nz,error3\r
+\r
+ push bc ; symlen\r
ex de,hl ;\r
ld hl,(BDOS+1) ;\r
inc hl ;\r
- ld e,(hl) ;\r
+ ld c,(hl) ;\r
inc hl ;\r
- ld d,(hl) ;\r
- pop hl ;\r
- ld (hl),d ;\r
+ ld b,(hl) ;\r
+ ex de,hl\r
+ ld (hl),b ;\r
dec hl ;\r
- ld (hl),e ;\r
+ ld (hl),c ;\r
dec hl ;\r
ld (hl),0c3h ;\r
\r
ld de,(max_load) ;\r
call cp_hl_de ;\r
jr c,error3 ;\r
-\r
ld de,(reg_sp) ;\r
call cp_hl_de ;\r
jr nc,rs_61 ;\r
ld (reg_sp),hl ;\r
rs_61:\r
-\r
ld de,(BDOS+1) ;\r
ld (BDOS+1),hl ;\r
ex de,hl ;\r
- pop af ;\r
- ld (hl),a ; symlen\r
+ pop af ; symlen\r
+ ld (hl),a ;\r
inc hl ;\r
pop de ; symval\r
ld (hl),e ;\r
jp rs_1 ;\r
\r
\r
+; test for valid character for symbols\r
+; return z if valid\r
+\r
+test_sym_char:\r
+ cp '$'\r
+ ret z\r
+ cp '%'\r
+ ret z\r
+ cp '.'\r
+ ret z\r
+ cp '_'\r
+ ret z\r
+ call test_alphanum\r
+ ret c ; cy == 1 --> z == 0\r
+ cp a ; return z\r
+ ret\r
+\r
+\r
+; check if char is in [0..9,?,@,A..Z,a..z]\r
+; return cy if invalid\r
+; return nc if valid alfanumeric char\r
+\r
+test_alphanum:\r
+ cp 'z'+1\r
+ ccf\r
+ ret c\r
+ cp 'a'\r
+ ret nc\r
+ cp 'Z'+1\r
+ ccf\r
+ ret c\r
+ cp '?'\r
+ ret nc\r
+test_numeral:\r
+ cp '9'+1\r
+ ccf\r
+ ret c\r
+ cp '0'\r
+ ret\r
+\r
+test_symterm_ch:\r
+ cp CR\r
+ ret z\r
+ cp LF\r
+ ret z\r
+test_whitespace:\r
+ cp ' '\r
+ ret z\r
+ cp TAB\r
+ ret\r
+\r
p_max_high0:\r
call assert_eol\r
p_max_high:\r