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