5 VS$="1.2.2CIS" 'QBUG DEBUGGER REV 8/30/85; (LINE LENGTHS MODIFIED FOR UPLOAD) 10 REM BY JAY HOLOVACS 95 KING GEORGE RD. WARREN NJ 07060 15 REM INCORPORATES DBUG-ML ROUTINE V1.1--WHEN MAKING ML SUPPORT CHANGES VERIFY LINES 20,30,200,205;variables PC!,HM,SK,ST 20 HX$="0123456789ABCDEF":DEFINT R,P,Q:DEFSNG D,B,H:DIM B1(3):PC!=62798:HM=62780 25 REM PC!=BASE ADDRESS OF REGISTER TRANSFER AREA;HM=BEGINNING OF ML ROUTINE-2(TO ALLOW FOR BREAKPOINT) 30 SK=62782:ST=62808 'STACK COUNT POINTER;START ROUTINE;EXIT ROUTINE 35 GOSUB 580:IF (CL AND 32)=32 THEN BEEP:PRINT "> Please depress CAPS LOCK":LINE INPUT " [enter] to continue";R$:GOTO 35 40 DC=HM:GOSUB 360:CLS:PRINT "* * QBUG DEBUGGER PROGRAM ver ";VS$ 45 PRINT" by Jay Holovacs":PRINT">Load your program and adjust HIMEM" 50 PRINT" BEFORE running QBUG.":PRINT">Don't use addresses above ";H$;" (";STR$(HM);")"; 55 PRINT">All NUMERIC DATA is in HEXADECIMAL" 60 PRINT:LINE INPUT " [enter] to continue";R$ 65 IF HIMEM255 OR DC<0 THEN BEEP:PRINT " ERROR--must be 00-FF":GOTO 120 130 POKE PC!+R,DC 135 PRINT 140 IF N<>7 THEN 150 ELSE PRINT @183,"Status Flags":PRINT @220,"S Z * * * PV * C" 145 PRINT@260,"8 4 2 1 8 4 2 1":LINE (115,30)-(225,60),1,B 150 NEXT N:RETURN 155 DATA A REG,2,B REG,3,C REG,4,D REG,5,E REG,6,H REG,8,L REG,7,FLAGS,9 160 REM SET UP BREAKPOINT 165 RESTORE 205:CLS:PRINT "* *BREAKPOINT* *" 170 IF B1(3)<>0 THEN DC=B1(3):GOSUB 360:PRINT "CURRENT BREAKPOINT=";H$:PRINT"(Set a new breakpoint to clear this one)" 175 PRINT "SET BREAKPOINT (enter blank to return)":PRINT"-->";:GOSUB 445:IF H$="" THEN RETURN 180 GOSUB 390:IF DC=HM THEN BEEP:PRINT " Error--outside of program area":GOTO 175 185 GOSUB 435 'CLEAR OLD BREAKPOINT 190 B1(3)=DC:FOR P=0 TO 2:B1(P)=PEEK(B1(3)+P) 195 READ N:POKE B1(3)+P,N:NEXT P 'INSERT JUMP INSTRUCTION 200 REM JMP,94,F5=JUMP 62853=EXIT ROUTINE 205 DATA 195,148,245 210 RETURN 215 REM LOAD MEMORY WITH VALUES 220 CLS:PRINT "* *LOAD MEMORY* *":PRINT"To CHANGE a value; type the desired" 225 PRINT"value and proceed. To leave it UN-":PRINT"CHANGED, move on without typing a value.";:PRINT"* *CURSOR KEYS:" 230 PRINT CHR$(152);"=NEXT ADDRESS ";CHR$(153);"=PREV. ADDRESS":PRINT"[enter]=RETURN TO MENU" 235 PRINT "LOCATION?->";:GOSUB 445:PRINT:GOSUB 390:ML$=H$:ML=DC 240 MV=PEEK(ML):DC=MV:GOSUB 360:PRINT ML$;"->";RIGHT$(H$,2);"-";:IF MV>32 THEN PRINT CHR$(MV);" "; ELSE PRINT " "; 245 GOSUB 445:IF H$="" THEN 255 ELSE IF LEN(H$)<3 AND ML>HIMEM AND ML2 THEN PRINT " ERROR--val must be 00-FF" ELSE PRINT " Address is in protected":PRINT"area":GOTO 240 255 PRINT 260 IF ASC(R$)=13 THEN RETURN 265 IF ASC(R$)=31 THEN ML=ML-1:GOTO 275 270 IF ASC(R$)=30 THEN ML=ML+1 275 DC=ML:GOSUB 360:ML$=H$:GOTO 240 280 REM EXECUTE A PROGRAM 285 CLS:PRINT "* *EXECUTE PROGRAM* *" 290 IF B1(3)=0 THEN BEEP:PRINT " ERROR--No breakpoint set":LINE INPUT"[enter] to Abort..";R$:RETURN 295 PRINT"Enter starting address (blank to abort)":PRINT"-->";:GOSUB 445:IF H$="" THEN RETURN 300 GOSUB 390:IF DC<=HIMEM OR DC>=HM THEN BEEP:PRINT " ERROR--Out of your program area":GOTO 295 305 HB=INT(DC/256):POKE PC!+1,HB:POKE PC!,DC-HB*256 'LOAD STARTING ADDRESS 310 CLS 315 N=0:PRINT @0,"Number of items (0 to 5) to place on ":PRINT @40,"stack--Most Acessable (top) first" 320 PRINT"or [enter] to skip";:INPUT N:IF N>5 THEN BEEP:GOTO 315 325 N=N*2:POKE SK,N:IF N=0 THEN 345 'LOOP BELOW WILL INTERATE ONCE EVEN IF N=0 330 FOR QQ=2 TO N STEP2:PRINT"-->";:GOSUB 445:PRINT:H$=RIGHT$("0000"+H$,4):HB$=LEFT$(H$,2) 335 LB$=RIGHT$(H$,2):H$=LB$:GOSUB 390:POKE SK+QQ,DC 'POKE LO BYTE VALUE 340 H$=HB$:GOSUB 390:POKE SK+QQ+1,DC:NEXT QQ 'POKE HIGH BYTE VALUE 345 CALL ST 'ADDRESS OF START LABEL 350 GOSUB 435 'CLEAR BREAKPOINT 355 RETURN 360 REM DEC-HEX CONVERSION 365 REM ENTER:DC=DECIMAL; EXIT H$=HEX VALUE (4 DIGIT FORMAT) 370 IF DC>65535 THEN H$="ERROR":RETURN 375 HV=4096:H$="" 380 Q%=INT(DC/HV):H$=H$+MID$(HX$,Q%+1,1):IF HV>1 THEN DC=DC-Q%*HV:HV=HV/16:GOTO 380 385 RETURN 390 REM HEX-DEC 395 REM ENTER:H$=HEX;EXIT DC=DECIMAL(DC=NEG IF ERROR) 400 P=1:DC=0 405 DC=DC+INSTR(HX$,MID$(H$,P,1))-1:IF P"Y" THEN RETURN 425 GOSUB 435 'CLEAN UP EXISTING BREAKPOINTS 430 MENU 435 REM CLEAR EXISTING BREAKPOINT 440 IF B1(3)<>0 THEN FOR P=0 TO 2:POKE B1(3)+P,B1(P):NEXT P:B1(3)=0:RETURN ELSE RETURN 445 REM ACCEPT HEX STRING 450 REM RETURNS HEX IN H$ 455 H$="" 460 R$=INKEY$:IF R$=""THEN 460 465 IF INSTR(HX$,R$) THEN H$=H$+R$:PRINT R$;:GOTO 460 470 IF ASC(R$)=8 AND LEN(H$)>0 THEN PRINT CHR$(8);" ";CHR$(8);:H$=LEFT$(H$,LEN(H$)-1) 475 IF ASC(R$)=13 OR ASC(R$)=31 OR ASC(R$)=30 THEN RETURN 480 GOTO 460 485 REM VIEW USER STACK 490 REM SK=ADDRESS of stack pointer in ML 495 CLS:PRINT "* * User Stack (at last Breakpoint) * *":PRINT"Listed most accessable first" 500 N=PEEK(SK):IF N=0 THEN PRINT "-->User stack empty":GOTO 525 505 FOR P=2 TO N STEP 2 510 LB=PEEK(P+SK):HB=PEEK(P+SK+1) 515 DC=LB:GOSUB 360:SK$=RIGHT$(H$,2) 520 DC=HB:GOSUB 360:SK$=RIGHT$(H$,2)+SK$:PRINT SK$:NEXT P 525 LINE INPUT"[enter] to Return";R$ 530 RETURN 535 REM HEX-DEC 540 CLS 545 PRINT"* *HEX to Decimal conversion* *":PRINT"enter blank to return" 550 PRINT"-->";:GOSUB 445:IF H$="" THEN RETURN 555 GOSUB 390:PRINT DC:GOTO 550 560 REM DECIMAL-HEX 565 CLS:PRINT"* *Decimal to Hex conversion * *":PRINT"enter blank to return" 570 DC=0:INPUT "-->";DC:IF DC=0 THEN RETURN 575 GOSUB 360:PRINT H$:GOTO 570 580 CALL30300:OUT185,255:CL=INP(186):OUT 186,CLAND252:CL=INP(232):CALL29756:RETURN 585 REM ML SUPORT ROUTINE (V1.1) 590 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,74,245,33,0,0,229,33,62,245 595 DATA 126,254,0,202,122,245,133,111,78,35,70,197,33,62,245 600 DATA53,53,195,102,245,42,78,245,229,33,87,245,94,33,80,245,86,213,35,70,35,78,35,86,35,94,42,85 605 DATA245,241,201,245,34,85,245,33,80,245,119,35,112,35,113,35 610 DATA114,35,115,35,209,123,50,87,245,33,62,245,54,0,193,120,254,0,194,220,245,121 615 DATA 254,0,194,220,245,34,76,245,33,0,0,57,235,33,74,245,123,190,202,210,245 620 DATA42,76,245,195,220,245,35,122,190,200,42,76,245,195,220,245,126,254,10,202,175 625 DATA 245,198,2,119,133,111,113,35,112,33,62,245,195,175,245 630 RESTORE590:FORP!=62782TO62959:READPX:POKEP!,PX:NEXT:RETURN