Merge pull request #319 from chr15m/refactor-php-web-runner
[jackhill/mal.git] / basic / debug.in.bas
CommitLineData
6420f327 1REM CHECK_FREE_LIST() -> P2
a742287e
JM
2CHECK_FREE_LIST:
3 REM start and accumulator
bbab5c5d
JM
4 P1=ZK
5 P2=0
a742287e 6 CHECK_FREE_LIST_LOOP:
7895453b
JM
7 IF P1>=ZI THEN RETURN
8 REM MEMORY DEBUGGING:
9 REM IF (Z%(P1)AND 31)<>15 THEN PRINT "corrupt free:"+STR$(P1):END
d7a6c2d6
JM
10 P2=P2+(Z%(P1)AND-32)/32
11 P1=Z%(P1+1)
a742287e 12 GOTO CHECK_FREE_LIST_LOOP
a742287e 13
9d59cdb3 14PR_MEMORY_SUMMARY_SMALL:
6420f327
JM
15 #cbm P0=FRE(0)
16
9d59cdb3
JM
17 GOSUB CHECK_FREE_LIST
18 #cbm PRINT "Free:"+STR$(FRE(0))+", ";
19 PRINT "Values:"+STR$(ZI-1-P2)+", Emptys:";
e0bcd3fb
JM
20 FOR P=0 TO 4 STEP 2:GOSUB PR_MEMORY_SUMMARY_SMALL_1:NEXT P
21 FOR P=6 TO 12 STEP 3:GOSUB PR_MEMORY_SUMMARY_SMALL_1:NEXT P
9e8f5211 22 PRINT
9e8f5211 23 RETURN
d7a6c2d6 24 PR_MEMORY_SUMMARY_SMALL_1:
e0bcd3fb 25 PRINT STR$(INT(Z%(P)/32))+",";
d7a6c2d6 26 RETURN
9e8f5211 27
9d59cdb3
JM
28REM REM COUNT_STRINGS() -> P2
29REM COUNT_STRINGS:
30REM P1=0
31REM P2=0
32REM COUNT_STRINGS_LOOP:
33REM IF P1>S-1 THEN RETURN
34REM IF S%(P1)>0 THEN P2=P2+1
35REM P1=P1+1
36REM GOTO COUNT_STRINGS_LOOP
37REM
38REM PR_MEMORY_SUMMARY:
39REM #cbm P0=FRE(0)
40REM
41REM PRINT
42REM #cbm PRINT "Free (FRE) :"+STR$(P0)
43REM GOSUB CHECK_FREE_LIST: REM get count in P2
44REM PRINT "Values (Z%) :"+STR$(ZI-1-P2)+" /"+STR$(Z1)
45REM REM PRINT " max:"+STR$(ZI-1);
46REM REM PRINT ", freed:"+STR$(P2)+", after repl_env:"+STR$(ZT)
47REM GOSUB COUNT_STRINGS
48REM PRINT "Strings (S$) :"+STR$(P2)+" /"+STR$(Z2)
49REM #qbasic PRINT "Stack (X%) :"+STR$(X+1)+" /"+STR$(Z3)
50REM #cbm PRINT "Stack :"+STR$(X+2-Z3)+" / 1920"
51REM RETURN
7895453b
JM
52REM
53REM #cbm PR_MEMORY_MAP:
54REM #cbm PRINT
55REM #cbm P1=PEEK(43)+PEEK(44)*256
56REM #cbm P2=PEEK(45)+PEEK(46)*256
57REM #cbm P3=PEEK(47)+PEEK(48)*256
58REM #cbm P4=PEEK(49)+PEEK(50)*256
59REM #cbm P5=PEEK(51)+PEEK(52)*256
60REM #cbm P6=PEEK(53)+PEEK(54)*256
61REM #cbm P7=PEEK(55)+PEEK(56)*256
62REM #cbm PRINT "BASIC beg. :"STR$(P1)
63REM #cbm PRINT "Variable beg.:"STR$(P2)
64REM #cbm PRINT "Array beg. :"STR$(P3)
65REM #cbm PRINT "Array end :"STR$(P4)
66REM #cbm PRINT "String beg. :"STR$(P5)
67REM #cbm PRINT "String cur. :"STR$(P6)
68REM #cbm PRINT "BASIC end :"STR$(P7)
69REM #cbm PRINT
70REM #cbm PRINT "Program Code :"STR$(P2-P1)
71REM #cbm PRINT "Variables :"STR$(P3-P2)
72REM #cbm PRINT "Arrays :"STR$(P4-P3)
73REM #cbm PRINT "String Heap :"STR$(P7-P5)
74REM #cbm RETURN
75REM
d7a6c2d6
JM
76REM REM PR_MEMORY_VALUE(I) -> J:
77REM REM - I is memory value to print
78REM REM - I is returned as last byte of value printed
79REM REM - J is returned as type
80REM PR_MEMORY_VALUE:
81REM J=Z%(I)AND 31
82REM P3=Z%(I+1)
83REM PRINT " "+STR$(I)+": type:"+STR$(J);
84REM IF J<>15 THEN PRINT ", refs:"+STR$((Z%(I)-J)/32);
85REM IF J=15 THEN PRINT ", size:"+STR$((Z%(I)AND-32)/32);
86REM PRINT ", ["+STR$(Z%(I));+" |"+STR$(P3);
87REM IF J<6 OR J=9 OR J=12 OR J=15 THEN PRINT " | --- | --- ]";:GOTO PR_MEM_SKIP
88REM PRINT " |"+STR$(Z%(I+2));
89REM IF J=6 OR J=7 OR J=13 OR J=14 THEN PRINT " | --- ]";:GOTO PR_MEM_SKIP
90REM PRINT " |"+STR$(Z%(I+3))+" ]";
91REM PR_MEM_SKIP:
92REM PRINT " >> ";
93REM ON J+1 GOTO PR_ENTRY_NIL,PR_ENTRY_BOOL,PR_ENTRY_INT,PR_ENTRY_FLOAT,PR_ENTRY_STR,PR_ENTRY_SYM,PR_ENTRY_LIST,PR_ENTRY_VECTOR,PR_ENTRY_HASH_MAP,PR_ENTRY_FN,PR_ENTRY_MALFN,PR_ENTRY_MAC,PR_ENTRY_ATOM,PR_ENTRY_ENV,PR_ENTRY_META,PR_ENTRY_FREE
94REM PRINT "Unknown type:"+STR$(J):END
95REM
96REM PR_ENTRY_NIL:
97REM PRINT "nil"
98REM I=I+1
99REM RETURN
100REM PR_ENTRY_BOOL:
101REM IF P3=0 THEN PRINT "false"
102REM IF P3=1 THEN PRINT "true"
103REM I=I+1
104REM RETURN
105REM PR_ENTRY_INT:
106REM PR_ENTRY_FLOAT:
107REM PRINT STR$(P3)
108REM I=I+1
109REM RETURN
110REM PR_ENTRY_STR:
111REM PRINT "'"+S$(P3)+"'"
112REM I=I+1
113REM RETURN
114REM PR_ENTRY_SYM:
115REM PRINT S$(P3)
116REM I=I+1
117REM RETURN
118REM PR_ENTRY_LIST:
119REM I=I+2
120REM IF I<16 THEN PRINT "()":RETURN
121REM PRINT "(..."+STR$(Z%(I))+" ...)"
122REM RETURN
123REM PR_ENTRY_VECTOR:
124REM I=I+2
125REM IF I<16 THEN PRINT "[]":RETURN
126REM PRINT "[..."+STR$(Z%(I))+" ...]"
127REM RETURN
128REM PR_ENTRY_HASH_MAP:
129REM I=I+3
130REM IF I<16 THEN PRINT "{}":RETURN
131REM IF J=8 THEN PRINT "{... key:"+STR$(Z%(I-1))+", val:"+STR$(Z%(I))+" ...}"
132REM RETURN
133REM PR_ENTRY_FN:
134REM PRINT "#<fn"+STR$(P3)+">"
135REM I=I+1
136REM RETURN
137REM PR_ENTRY_MALFN:
138REM PR_ENTRY_MAC:
139REM IF I=11 THEN PRINT "MACRO ";
140REM PRINT "(fn* param:"+STR$(Z%(I))+", env:"+STR$(Z%(I+1))+")"
141REM I=I+3
142REM RETURN
143REM PR_ENTRY_ATOM:
144REM PRINT "(atom val:"+STR$(P3)+")"
145REM I=I+1
146REM RETURN
147REM PR_ENTRY_ENV:
148REM PRINT "#<env hm:"+STR$(P3)+", outer:"+STR$(Z%(I+2))+">"
149REM I=I+2
150REM RETURN
151REM PR_ENTRY_META:
152REM PRINT "#<meta obj:"+STR$(P3)+", meta:"+STR$(Z%(I+2))+">"
153REM I=I+2
154REM RETURN
155REM PR_ENTRY_FREE:
156REM PRINT "FREE next:"+STR$(P3);
157REM IF I=ZK THEN PRINT " (free list start)";
158REM PRINT
159REM I=I-1+(Z%(I)AND-32)/32
160REM RETURN
161REM
162REM REM PR_OBJECT(P1) -> nil
163REM PR_OBJECT:
164REM RD=0
165REM
166REM IF P1=-1 THEN PRINT " "+STR$(-1)+": ---":RETURN
167REM RD=RD+1
168REM Q=P1:GOSUB PUSH_Q
169REM
170REM PR_OBJ_LOOP:
171REM IF RD=0 THEN RETURN
172REM RD=RD-1
173REM
174REM GOSUB PEEK_Q:I=Q
175REM REM IF I<15 THEN GOSUB POP_Q:GOTO PR_OBJ_LOOP
176REM GOSUB PR_MEMORY_VALUE
177REM REM J holds type now
178REM GOSUB POP_Q:I=Q
179REM
180REM IF J<6 OR J=9 THEN GOTO PR_OBJ_LOOP: REM no contained references
181REM REM reference in first position
182REM IF Z%(I+1)<>0 THEN RD=RD+1:Q=Z%(I+1):GOSUB PUSH_Q
183REM IF J=12 OR J=15 THEN PR_OBJ_LOOP: REM no more reference
184REM REM reference in second position
185REM IF Z%(I+2)<>0 THEN RD=RD+1:Q=Z%(I+2):GOSUB PUSH_Q
186REM IF J=6 OR J=7 OR J=13 OR J=14 THEN PR_OBJ_LOOP: REM no more references
187REM IF Z%(I+3)<>0 THEN RD=RD+1:Q=Z%(I+3):GOSUB PUSH_Q
188REM GOTO PR_OBJ_LOOP
189REM
bbab5c5d 190REM REM PR_MEMORY(P1, P2) -> nil
9e8f5211 191REM PR_MEMORY:
bbab5c5d 192REM IF P2<P1 THEN P2=ZI-1
d7a6c2d6 193REM PRINT "Values (Z%)"+STR$(P1)+" ->"+STR$(P2);
cc9dbd92 194REM PRINT " (ZI: "+STR$(ZI)+", ZK: "+STR$(ZK)+"):"
bbab5c5d
JM
195REM IF P2<P1 THEN PRINT " ---":GOTO PR_MEMORY_AFTER_VALUES
196REM I=P1
9e8f5211 197REM PR_MEMORY_VALUE_LOOP:
bbab5c5d 198REM IF I>P2 THEN GOTO PR_MEMORY_AFTER_VALUES
d7a6c2d6
JM
199REM GOSUB PR_MEMORY_VALUE
200REM I=I+1
201REM GOTO PR_MEMORY_VALUE_LOOP
9e8f5211 202REM PR_MEMORY_AFTER_VALUES:
bbab5c5d
JM
203REM PRINT "S$ String Memory (S: "+STR$(S)+"):"
204REM IF S<=0 THEN PRINT " ---":GOTO PR_MEMORY_SKIP_STRINGS
205REM FOR I=0 TO S-1
cc9dbd92 206REM PRINT " "+STR$(I)+": '"+S$(I)+"'"
9e8f5211
JM
207REM NEXT I
208REM PR_MEMORY_SKIP_STRINGS:
bbab5c5d 209REM PRINT "X% Stack Memory (X: "+STR$(X)+"):"
9d59cdb3
JM
210REM #cbm IF X<Z3 THEN PRINT " ---":GOTO PR_MEMORY_SKIP_STACK
211REM #cbm FOR I=Z3 TO X
212REM #cbm PRINT " "+STR$(I)+": "+STR$(PEEK(X)+PEEK(X+1)*256)
213REM #cbm NEXT I
214REM #qbasic IF X<0 THEN PRINT " ---":GOTO PR_MEMORY_SKIP_STACK
215REM #qbasic FOR I=0 TO X
216REM #qbasic #qbasic PRINT " "+STR$(I)+": "+STR$(X%(I))
217REM #qbasic NEXT I
9e8f5211 218REM PR_MEMORY_SKIP_STACK:
9e8f5211 219REM RETURN
70f29a2b 220REM