fixed bug with "0BEEFH" -- it was "not a number", because of "0b" prefix
[bz80asm.git] / parser_stack.zas
blobe2035c0d750527914c034a751c58d34f613b2039
1 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
2 ;; math expression parser, general numeric stack management
3 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
5 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
6 ;;
7 ;; clear numeric stack, setup stack vars
8 ;; IN:
9 ;;   nothing
10 ;; OUT:
11 ;;   HL,DE: dead
13 EXPR_STACK_RESET:
14   ld    de,EXPR_STACK_SIZE+1
15   ld    hl,de
16   add   hl,hl
17   add   hl,de
18   ex    de,hl
19   ; DE=EXPR_STACK_SIZE*3
20   ld    hl,(EXPR_STACK_S0)
21   dec   hl
22   dec   hl
23   dec   hl
24   ld    (EXPR_STACK_SP),hl
25   add   hl,de
26   ld    (EXPR_STACK_END),hl
27   ret
30 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
32 ;; loads addess of the next numeric stack slot into HL
33 ;; increments numeric stack pointer
34 ;; checks for stack overflow
36 ;; IN:
37 ;;   nothing
38 ;; OUT:
39 ;;   HL: stack address
40 ;;   DE,flags: dead
42 EXPR_STACK_GET_NEXT_SLOT_HL:
43   ld    hl,(EXPR_STACK_SP)
44   inc   hl
45   inc   hl
46   inc   hl
47   ld    (EXPR_STACK_SP),hl
48   push  hl
49   ld    de,(EXPR_STACK_END)
50   or    a
51   sbc   hl,de
52   pop   hl
53   ret   c
54   ; stack overflow
55   ld    a,EXPR_ERR_STACK_OVERFLOW
56 EXPR_CALL_ERROR_CB:
57   ld    hl,(EXPR_ERROR_CB)
58   jp    (hl)
61 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
63 ;; loads addess of the last numeric stack slot into HL
64 ;; decrements numeric stack pointer
65 ;; checks for stack underfloaw
67 ;; IN:
68 ;;   nothing
69 ;; OUT:
70 ;;   HL: stack address
71 ;;   DE,flags: dead
73 EXPR_STACK_POP_LAST_SLOT_HL:
74   ld    hl,(EXPR_STACK_SP)
75   push  hl
76   dec   hl
77   dec   hl
78   dec   hl
79   ld    (EXPR_STACK_SP),hl
80   ld    de,(EXPR_STACK_S0)
81   pop   hl
82   push  hl
83   or    a
84   sbc   hl,de
85   pop   hl
86   ret   nc
87   ; stack underflow
88   ld    a,EXPR_ERR_STACK_UNDERFLOW
89   jp    EXPR_CALL_ERROR_CB
92 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
94 ;; push number to numeric stack
95 ;; IN:
96 ;;   HL: number
97 ;; OUT:
98 ;;   HL,DE,flags: dead
100 EXPR_PUSH_HL:
101   push  hl
102   call  EXPR_STACK_GET_NEXT_SLOT_HL
103   pop   de
104   ex    de,hl
105   ld    (hl),EXPR_STITEM_NUMBER
106   inc   hl
107   ld    (hl),e
108   inc   hl
109   ld    (hl),d
110   ret
113 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
115 ;; pop number from numeric stack
116 ;; raises error if stack is empty or TOS is not a number
117 ;; IN:
118 ;;   nothing
119 ;; OUT:
120 ;;   HL: number
121 ;;   DE,flags: dead
123 EXPR_POP_HL:
124   call  EXPR_STACK_POP_LAST_SLOT_HL
125   ld    a,(hl)
126   IF EXPR_STITEM_NUMBER == 0
127   or    a
128   ELSE
129   cp    EXPR_STITEM_NUMBER
130   ENDIF
131   ld    a,EXPR_ERR_INVALID
132   jp    nz,EXPR_CALL_ERROR_CB
133   inc   hl
134   ld    e,(hl)
135   inc   hl
136   ld    d,(hl)
137   ex    de,hl
138   ret