0 'Club 100 Library - 415/939-1246 BBS, 937-5039 Newsletter, 932-8856 Voice 1 'QBUG by Jay Holovacs 8/30/85 Revised DEBUG by Robert Benson 3/10/88 (Ver1.3) 2 'Incorperates QBUG M/L routine Ver 1.1 When making M/L support changes verify lines 10,116,120,328; Variables MC,PC!,SK,ST 10 HX$="0123456789ABCDEF":DEFINT R,P,Q:DEFSNG D,B,H:DIM B1(3):MC=64704:SK=64706:PC!=64722:ST=64732 12 'MC = Beginning of M/L support; SK = Stack count pointer; PC! = Base address of register transfer area; ST = Start routine 14 GOSUB312 16 IF (CL AND 32)=32 THEN BEEP:PRINT"Please depress CAPS/LOCK":LINEINPUT"Press [ENTER] to Continue";R$:GOTO14 18 DC=MC:GOSUB208 20 CLS:PRINT" LOAD YOUR CO PROGRAM AND ADJUST HIMEM" 22 PRINT@81,"before running this DEBUG-ing program" 24 PRINT@162,"All values will be in HEX-A-DECIMAL" 26 PRINT@249,"Hit any key to Continue" 28 R$=INKEY$:IF R$=""GOTO28:INPUT R$ 30 IF HIMEM<62960 THEN34 ELSE BEEP:CLS:PRINT@81,"M/L Program not present or not located" 32 PRINT@165,"Please reload and adjust HIMEM":END 34 GOSUB316' Load M/L support in machine memory 36 CLS:PRINT"B: Set/Change BREAKPOINT "CHR$(27)"p COMMANDS:"CHR$(27)"q" 38 PRINT"R: View/Change REGISTERS" 40 PRINT"M: View/Change MEMORY" 42 PRINT"S: View USER STACK" 44 PRINT"E: EXECUTE PROGRAM" 46 PRINT"H: Hex-to-Decimal" 48 PRINT"D: Decimal-to-Hex" 50 PRINT"Q: QUIT Debugger"; 52 R$=INKEY$:IF R$=""THEN52 54 R=INSTR("RMBEQSHD",R$):IF R=0 THEN52 56 ON R GOSUB58,124,88,160,234,268,290,302:GOTO36 58 'Load Registers 60 RESTORE86 62 CLS:PRINT@9,"*** LOAD REGISTERS ***" 64 PRINT@124,"Press [ENTER] alone for NO CHANGE":GOSUB314:CLS 66 FOR N=1 TO 8:READ RG$,R 68 DC=PEEK(PC!+R):GOSUB208 70 PRINT RG$;"-";RIGHT$(H$,2);" >";:GOSUB248 72 GOSUB222:IF H$=""THEN78' Skip POKE if no change 74 IF DC>255 OR DC<0 THEN BEEP:PRINTTAB(42)"ERROR: Value must be 00 - FF":GOTO68 76 POKE PC!+R,DC 78 PRINT 80 IF N<>7 THEN84 ELSE PRINT@183,"Status Flags":PRINT@220,"S Z * * * PV * C" 82 PRINT@260,"8 4 2 1 8 4 2 1":LINE (115,30)-(225,60),1,B 84 NEXT N:RETURN 86 DATA A REG,2,B REG,3,C REG,4,D REG,5,E REG,6,H REG,8,L REG,7,FLAGS,9 88 'Set-up Breakpoint 90 CLS:RESTORE120:IF B1(3)<>0 THEN DC=B1(3):GOSUB208:GOTO92 ELSE100 92 PRINT" Set a new BREAKPOINT to clear this one" 94 PRINT@245,"Press [ENTER] alone to Return" 96 PRINT@86,"CURRENT BREAKPOINT = ";H$ 98 PRINT@170,"SET BREAKPOINT ->";:GOSUB248:GOTO106 100 PRINT@11,"*** BREAKPOINT ***" 102 PRINT@245,"Press [ENTER] alone to Return" 104 PRINT@130,"SET BREAKPOINT ->";:GOSUB248 106 IF H$=""THEN RETURN 108 GOSUB222 110 IF DC<=HIMEM OR DC>62957 THEN BEEP:CLS:PRINT@131,"OUTSIDE OF PROGRAM":GOSUB314:GOTO90 112 GOSUB244' Clear old Breakpoint 114 B1(3)=DC:FOR P=0 TO 2:B1(P)=PEEK(B1(3)+P) 116 'Insert Jump instruction; JMP = 64792 118 READ N:POKE B1(3)+P,N:NEXT P 120 DATA 195,24,253 122 RETURN 124 'Load Memory 126 CLS:PRINT@10,"*** LOAD MEMORY ***" 128 PRINT@81,"To CHANGE a value; type it and move on" 130 PRINT" To leave it UNCHANGED, move on without" 132 PRINT" typing a value. Press [ESC] to Return" 134 PRINT" Cursor functions: "CHR$(152);" = Last Address" 136 PRINTTAB(19)CHR$(153);" = NEXT ADDRESS" 138 PRINT@281,"LOCATION? ";:GOSUB258:PRINT:GOSUB222:ML$=H$:ML=DC 140 MV=PEEK(ML):DC=MV:GOSUB208 142 PRINT" LOCATION: "ML$;" >";RIGHT$(H$,2);" ";:IF MV>32 THEN PRINT CHR$(MV);" ";ELSE PRINT" "; 144 GOSUB258 146 IF H$=""THEN150 ELSE IF LEN(H$)<3 AND ML>HIMEM AND ML<62960 THEN GOSUB222:POKE ML,DC:GOTO150 148 IF LEN(H$)>2 THEN BEEP:PRINTTAB(41)"ERROR: Value must be 00 - FF":GOTO140 ELSE BEEP:PRINTTAB(41)"Address outside program area":GOTO140 150 PRINT 152 IF ASC(R$)=27 THEN RETURN 154 IF ASC(R$)=30 THEN ML=ML-1:GOTO158 156 IF ASC(R$)=31 THEN ML=ML+1 158 DC=ML:GOSUB208:ML$=H$:GOTO140 160 'Execute Program 162 CLS:IF B1(3)=0 THEN BEEP:PRINT@133,"NO BREAKPOINT!":GOSUB314:GOTO88 164 PRINT@9,"*** EXECUTE PROGRAM ***" 166 PRINT@246,"Press [ENTER] alone to Abort" 168 PRINT@126,"Enter starting address ->";:GOSUB248:IF H$=""THEN RETURN 170 GOSUB222 172 IF DC62957 THEN BEEP:CLS:PRINT@131,"OUTSIDE OF PROGRAM":GOSUB314:GOTO162 174 'Load starting address 176 HB=INT(DC/256):POKE PC!+1,HB:POKE PC!,DC-HB*256 178 CLS 180 N=0:PRINT@126,"Enter "CHR$(34)"0"CHR$(34)" to bypass this step" 182 PRINT@41,"PUSH 1,2,3,4,5 items onto the Stack? ";:N$=INPUT$(1) 184 N=VAL(N$):IF N>5 THEN BEEP:GOTO180 186 N=N*2:POKE SK,N:IF N=0 THEN202 188 CLS:PRINT@2,"Start with the item you want on top:" 190 PRINT' Loop below will interate once even if N=0 192 FOR QQ=2 TO N STEP2:PRINT"->";:GOSUB248:PRINT:H$=RIGHT$("0000"+H$,4):HB$=LEFT$(H$,2) 194 LB$=RIGHT$(H$,2):H$=LB$:GOSUB222 196 POKE SK+QQ,DC' POKE LO byte value 198 H$=HB$:GOSUB222 200 POKE SK+QQ+1,DC:NEXT QQ' POKE HIGH byte value 202 CALL ST 204 GOSUB244' Clear Breakpoint 206 RETURN 208 'Dec-Hex conversion 210 'Enter: DC = Decimal 212 IF DC>65535 THEN BEEP:H$="ERROR":RETURN 214 HV=4096:H$="" 216 Q%=INT(DC/HV):H$=H$+MID$(HX$,Q%+1,1) 218 IF HV>1 THEN DC=DC-Q%*HV:HV=HV/16:GOTO216 220 RETURN' Exit: H$ = Hex value (4 digit format) 222 'Hex-Dec conversion 224 'Enter: H$ = Hex 226 P=1:DC=0 228 DC=DC+INSTR(HX$,MID$(H$,P,1))-1 230 IF P"Y" THEN RETURN 240 GOSUB244 242 MENU 244 'Clear existing Breakpoint 246 IF B1(3)<>0 THEN FOR P=0 TO 2:POKE B1(3)+P,B1(P):NEXT P:B1(3)=0:RETURN ELSE RETURN 248 'Accept Hex string #1 250 H$="" 252 R$=INPUT$(1):IF INSTR(HX$,R$)THEN H$=H$+R$:PRINT R$;:GOTO252 254 IF ASC(R$)=8 AND LEN(H$)>0 THEN PRINT CHR$(8);" ";CHR$(8);:H$=LEFT$(H$,LEN(H$)-1) 256 IF ASC(R$)=13 THEN RETURN ELSE252' Returns Hex in H$ 258 'Accept Hex string #2 260 H$="" 262 R$=INPUT$(1):IF INSTR(HX$,R$)THEN H$=H$+R$:PRINT R$;:GOTO262 264 IF ASC(R$)=8 AND LEN(H$)>0 THEN PRINT CHR$(8);" ";CHR$(8);:H$=LEFT$(H$,LEN(H$)-1) 266 IF ASC(R$)=27 OR ASC(R$)=30 OR ASC(R$)=31 THEN RETURN ELSE262' Returns Hex in H$ 268 'View User Stack 270 CLS:N=PEEK(SK):IF N=0 THEN BEEP:PRINT@132,"USER STACK EMPTY":GOSUB314:RETURN 272 PRINT" *** USER STACK at LAST BREAKPOINT ***" 274 PRINT@84,"Most accessable listed first:"; 276 FOR P=2 TO N STEP2 278 LB=PEEK(P+SK):HB=PEEK(P+SK+1) 280 DC=LB:GOSUB208:SK$=RIGHT$(H$,2) 282 DC=HB:GOSUB208:SK$=RIGHT$(H$,2)+SK$ 284 PRINTTAB(33)SK$:NEXT P 286 PRINT@169,"Hit any key to Return" 288 R$=INKEY$:IF R$=""THEN288 ELSE36 290 'Hex-Dec 292 CLS 294 PRINT" *** Hex to Decimal Converter ***" 296 PRINTTAB(43)"Hit [ENTER] alone to Return?"; 298 PRINTTAB(32);:GOSUB248:PRINTTAB(71):IF H$=""THEN RETURN 300 GOSUB222:PRINT DC:GOTO296 302 'Dec-Hex 304 CLS:PRINT" *** Decimal to Hex Converter ***" 306 PRINTTAB(43)"Hit [ENTER] alone to Return"; 308 DC=0:INPUT DC:IF DC=0 THEN RETURN 310 GOSUB208;:PRINTTAB(32)H$:GOTO306 312 CALL30300:OUT185,255:CL=INP(186):OUT186,CL AND 252:CL=INP(232):CALL29756:RETURN 314 FOR Z=1 TO 850:NEXT Z:RETURN 316 'Support Routine 318 DATA0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,33,0,0,57,34,206,252,33,0,0,229,33,194,252,126,254,0,202,254,252 320 DATA133,111,78,35,70,197,33,194,252,53,53,195,234,252,42,210,252,229,33,219,252,94,33,212,252,86,213,35,70,35,78,35,86,35 322 DATA94,42,217,252,241,201,245,34,217,252,33,212,252,119,35,112,35,113,35,114,35,115,35,209,123,50,219,252,33,194,252,54,0 324 DATA193,120,254,0,194,96,253,121,254,0,194,96,253,34,208,252,33,0,0,57,235,33,206,252,123,190,202,86,253,42,208,252,195 326 DATA96,235,35,122,190,200,42,208,252,195,96,253,126,254,10,202,51,253,198,2,119,133,111,113,35,112,33,194,252,195,51,253 328 RESTORE318:FOR P!=64706 TO 64883:READ PX:POKE P!,PX:NEXT:RETURN