defb/defw fix
[bz80asm.git] / labman.zas
blob43cd0c4be3c2c44e9da84eac738b42deb4cfa0e0
1 ; label manager
3 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
4 ;;
5 ;; create new label
6 ;; this is called from assembler to create a new label (or replace an existing one)
7 ;; the assembler doesn't try to check for duplicate labels
8 ;; IY points to the first char of label name
9 ;; after parsing, IY should point right after the parsed label
10 ;; it doesn't matter what this subroutine returns, it only
11 ;; has to parse and create a label
12 ;; all registers expect IY can be trashed
14 ;; IN:
15 ;;   IY: text input buffer
16 ;;   HL: label value
17 ;; OUT:
18 ;;   IY: text input buffer after the label
19 ;;   others (including alternate sets) are dead
21 DEFLABEL:
22   push  hl
23   ld    hl,msg_getvar
24   call  printstr
26   pop   hl
27   push  hl
28   ld    a,h
29   call  HEX
30   pop   hl
31   ld    a,l
32   call  HEX
33   ld    a,':'
34   call  EMIT
36   ld    a,(iy)
37   call  isAlpha
38   jp    c,.error_identifier_expected
39   ld    b,0
40   push  iy
41 .idloop:
42   ld    a,(iy)
43   call  isIdChar
44   jr    c,.idend
45   inc   b
46   inc   iy
47   jr    .idloop
48 .idend:
49   ; print id
50   pop   iy
51 .iddumploop:
52   ld    a,(iy)
53   call  EMIT
54   inc   iy
55   djnz  .iddumploop
56   ld    a,'>'
57   call  EMIT
58   ld    a,13
59   call  EMIT
61   ret
63 .error_identifier_expected:
64   ld    a,EXPR_ERR_ID_EXPECTED
65   jp    PARSE_EXPR_ERROR_A
67 msg_getvar: defx "NEWLABEL:<"
70 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
71 ;; check if A is an alpha char
72 ;; carry set: not an alpha char
74 isAlpha:
75   cp    'a'
76   jr    c,.notlower
77   cp    'z'+1
78   jr    nc,.notlower
79   or    a
80   ret
81 .notlower:
82   cp    'A'
83   ret   c
84   cp    'Z'+1
85   ccf
86   ret
89 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
90 ;; check if A is a decimal digit
91 ;; carry set: not a digit char
93 isDigit:
94   cp    '0'
95   ret   c
96   cp    '9'+1
97   ccf
98   ret
101 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
102 ;; check if A is a valid identifier char (including digits)
103 ;; carry set: not an id char
105 isIdChar:
106   call  isAlpha
107   ret   nc
108   call  isDigit
109   ret   nc
110   cp    '_'
111   jr    z,.goodchar
112   cp    '$'
113   jr    z,.goodchar
114   scf
115   ret
116 .goodchar:
117   or    a
118   ret