Listing of file='PRGZAP.BAS;01' on disk='vmedia/ncc_12-sector.ccvf'
100 PLOT 6,2,27,24,12,14
110 PRINT "PRGZAP(16K) BY E. W. SWANK V4.28.80 FOR V6.78 DISK BASIC"
120 PLOT 10:PRINT "THIS UTILITY MAKES IN-PLACE CHANGES TO PRG TYPE FILES"
130 PLOT 10:PRINT "YOU ENTER THE PRG FILENAME; THEN THE LOCATION AND"
140 PRINT "LENGTH(UP TO 128 BYTES) OF THE AREA TO BE CHANGED."
150 PRINT "THIS AREA IS DISPLAYED IN BOTH HEX AND ASCII."
160 PRINT "YOU MOVE THE CURSOR OVER THE DATA AND MAKE CHANGES."
170 PRINT "CHANGES ARE MARKED BY A BLUE HIGHLIGHT."
180 PLOT 10:PRINT "THE CHANGES ARE WRITTEN BACK WHEN YOU PRESS THE RETURN KEY."
190 PRINT "YOU CAN THEN ENTER ANOTHER LOCATION/LENGTH FOR THE SAME FILE."
200 PLOT 10:PRINT "YOU MUST PRESS RESET TO EXIT THIS PROGRAM"
210 PRINT "OR AVOID WRITING BACK TO THE FILE"
220 PRINT " "
230 UDOS= 44288
240 GOTO 1980:REM LOAD KEYBOARD PATCH
250 UDOS= 44288:CXJ= 33283:AD= CXJ:GOSUB 2250:KBP= Z
260 AD= 32940:GOSUB 2250:TM= Z
270 PLOT 3,0,21
280 PRINT "ENTER NAME OF PRG FILE TO ZAP: ";:ML= 31:GOSUB 2420:REM
290 EUDOS= UDOS+ 330:DSN= UDOS+ 256:RWST= UDOS+ 288
300 FSIZ= UDOS+ 303:LBC= UDOS+ 305:FLAD= UDOS+ 306:STAD= UDOS+ 308
310 FBLK= UDOS+ 319:DBUF= UDOS+ 321:FXBC= UDOS+ 323
320 FOR N= 1TO LEN (B$):POKE DSN- 1+ N,ASC (MID$ (B$,N,1)):NEXT
330 POKE DSN+ LEN (B$),0
340 GOSUB 2400:RC= CALL (0)
350 IF RC< 0 THEN PRINT "ERROR OPENING FILE":GOTO 270
360 B$= "":FOR N= 297TO 299:B$= B$+ CHR$ (PEEK (UDOS+ N)):NEXT
370 IF B$< > "PRG" THEN PRINT "ONLY PRG TYPE FILES ARE SUPPORTED":GOTO 270
380 AD= FSIZ:GOSUB 2250:PSIZ= 128* (Z- 1)+ PEEK (LBC)
390 AD= FLAD:GOSUB 2250:FLAD= Z
400 PRINT ""
410 DI= Z:GOSUB 1920:PRINT "PROGRAM EXTENT:";DI;"(";DO$;"H) -";
420 DI= FLAD+ PSIZ- 1:GOSUB 1920:PRINT DI;"(";DO$;"H)"
430 PLOT 10,10,11,28,11:PRINT "ENTER ADDRESS(DEC OR HEXH) OF ZAP AREA:";:ML= 6:GOSUB 2420:PRINT ""
440 CI$= B$:GOSUB 1720:ZA= CO
450 IF ZA< FLAD OR ZA> FLAD+ PSIZ- 1 THEN PRINT "ZAP AREA OUTSIDE LIMITS:RE-ENTER":Z= FLAD:PLOT 28,28,28,28,11,28,11:GOTO 410
460 RBA= INT ((ZA- FLAD)/ 128):REM REL BLK ADDR
470 AD= FBLK:Z= RBA:GOSUB 2240
480 AD= DBUF:Z= UDOS:GOSUB 2240
490 RL= PSIZ- 128* INT ((ZA- FLAD)/ 128):IF RL> 256 THEN RL= 256
500 AD= FXBC:Z= RL:GOSUB 2240
510 GOSUB 2400:RC= CALL (3):IF RC= 0THEN 540
520 HI= PEEK (RWST):GOSUB 1850:PRINT "READ ERROR--RWSTATUS: ";HO$
530 OUT 8,255:END :RUN
540 BF= UDOS+ (ZA- (FLAD+ 128* RBA))
550 EB= RL- (BF- UDOS):IF EB> 128THEN EB= 128
560 PRINT "ENTER LENGTH(DEC OR HEXH) OF ZAP AREA(1-";
570 EB$= STR$ (EB):PRINT RIGHT$ (EB$,LEN (EB$)- 1);"):";
580 ML= 6:GOSUB 2420:PRINT ""
590 CI$= B$:GOSUB 1720:IF CO< > 0 THEN 620
600 CO= 64:IF EB< CO THEN CO= EB
610 PRINT "LENGTH DEFAULTS TO";CO
620 IF CO> EBTHEN PRINT "LENGTH REDUCED TO";EB;"(DEC)":CO= EB
630 EB= CO
640 EB= EB+ BF- 1
650 PLOT 8:FOR N= 0TO 19:PLOT 11,10:NEXT :PLOT 11
660 SB= 28672:REM BASE FOR SCREEN REFRESH RAM
670 SY= 6:SX= 0:REM INITIAL SCREEN WRITE POS
680 PLOT 3,64,0
690 FOR IP= BFTO EBSTEP 16
700 DI= ZA+ IP- BF:GOSUB 1920
710 SA= SB+ 2* (64* SY+ SX)
720 AA= SA+ 92:POKE AA,42:POKE AA+ 34,42:AA= AA+ 2
730 FOR N= 1TO 4
740 POKE SA,ASC (MID$ (DO$,N,1))
750 SA= SA+ 2
760 NEXT N
770 SA= SA+ 4:REM " "
780 FOR J1= 0TO 3
790 FOR J2= 0TO 3
800 BA= IP+ 4* J1+ J2:REM BYTE ADDRESS
810 IF BA> EB THEN IP= EB+ 1:GOTO 930
820 HI= PEEK (BA)
830 GOSUB 1850
840 POKE SA,ASC (LEFT$ (HO$,1)):SA= SA+ 2
850 POKE SA,ASC (RIGHT$ (HO$,1)):SA= SA+ 2
860 POKE AA,HI:AA= AA+ 2
870 IF HI< 32 THEN POKE AA- 1,1:GOTO 890
880 IF HI> 96 THEN POKE AA- 1,1
890 NEXT J2
900 SA= SA+ 4
910 NEXT J1
920 SY= SY+ 1:SX= 0
930 NEXT IP
940 REM SETUP KEYBD READ
950 PLOT 27,27:GOSUB 2370
960 SY= 6:SX= 6:PLOT 3,6,6:SA= SB+ 780:AA= SA+ 82:IP= BF:DX= 0:DY= 0
970 GOTO 1580
980 REM READ KEYBOARD
990 KY= CALL (5):IF KY= - 1 THEN 990
1000 IF KY= 10 THEN DY = 1:GOTO 1320
1010 IF KY= 28 THEN DY = - 1:GOTO 1320
1020 IF KY= 26 THEN DX = - 1:GOTO 1320
1030 IF KY= 25 THEN DX = 1:GOTO 1320
1040 IF KY= 9 THEN 1200
1050 IF KY= 13 THEN 1260
1060 IF SX> 46 THEN 1150
1070 IF KY< 48 OR KY> 70 OR (KY< 65AND KY> 57) THEN 980
1080 POKE SA,KY
1090 N= SX AND - 2:N= SB+ 2* (64* SY+ N)
1100 CI$= CHR$ (PEEK (N))+ CHR$ (PEEK (N+ 2))+ "H":GOSUB 1720
1110 POKE N+ 1,34:POKE N+ 3,34:POKE IP,CO:POKE AA,CO:POKE AA+ 1,34
1120 IF (CO< 32) OR (CO> 96) THEN POKE AA+ 1,33
1130 REM DIAG HI=KY:GOSUB13800:PLOT 27,12,3,40,30:PRINTKY;" ";HO$:REMTEST
1140 GOTO 1500
1150 REM ALPHA UPD
1160 POKE AA,KY:POKE AA+ 1,34:POKE IP,KY:HI= KY:GOSUB 1850
1170 IF HI< 32 OR HI> 96 THEN POKE AA+ 1,33
1180 POKE SA,ASC (LEFT$ (HO$,1)):POKE SA+ 1,34:POKE SA+ 2,ASC (RIGHT$ (HO$,1)):POKE SA+ 3,34
1190 GOTO 1130
1200 REM : TAB KEY
1210 IF SX> 46 THEN 1240
1220 GOSUB 1680:N= INT ((SX- 6)/ 10):SA= 4* INT (SA/ 4)
1230 SX= 47+ 4* N+ INT (((SX- 6)- 10* N)/ 2):GOTO 1580
1240 GOSUB 1680:N= INT ((SX- 47)/ 4)
1250 SX= 6+ 10* N+ (SX- 47- 4* N)* 2:GOTO 1580
1260 REM : RETURN/ENTER
1270 GOSUB 2400:RC= CALL (4):IF RC= 0THEN 1300
1280 HI= PEEK (RWST):GOSUB 1850:PRINT "WRITE ERROR--RWSTATUS: ";HO$
1290 OUT 8,255:END :RUN
1300 PLOT 3,0,21:FOR N= 21TO 30:PLOT 11,10:NEXT :PLOT 11
1310 PLOT 3,0,20:PRINT "ZAP APPLIED":Z= FLAD:GOTO 400
1320 REM :CURSOR DIRECTION KEYS
1330 IF DY = 0 THEN 1390
1340 IF DY> 0 THEN 1370
1350 IF SY< 7 THEN 980:REM -Y
1360 GOSUB 1680:SY= SY- 1:SA= SA- 128:AA= AA- 128:IP= IP- 16:GOTO 1580
1370 IF SY> 12 OR IP+ 16> EBTHEN 1580:REM +Y
1380 GOSUB 1680:SY= SY+ 1:SA= SA+ 128:AA= AA+ 128:IP= IP+ 16:GOTO 1580
1390 IF DX= 0 THEN 980:REM CUR X
1400 IF DX> 0 THEN 1500
1410 IF SX< 7 THEN 980:REM -X
1420 GOSUB 1680
1430 IF SX= 47 THEN SX= 42:SA= SA+ 72:AA= AA+ 30:IP= IP+ 15:GOTO 1580
1440 IF SX< 44 THEN 1470
1450 N= SX- 46:IF (N AND 3) = 0 THEN SA = SA - 4
1460 SX= SX- 1:SA= SA- 4:AA= AA- 2:IP= IP- 1:GOTO 1580
1470 N= SX- 16:IF INT (N/ 10)= N/ 10 THEN SX= SX- 2:SA= SA- 4
1480 SX= SX- 1:SA= SA- 2:IF (SX AND 1)= 1 THEN AA= AA- 2:IP= IP- 1
1490 GOTO 1580
1500 GOSUB 1680:IF SX= 62 THEN SX= 6:SA= SA- 72:AA= AA- 30:IP= IP- 15:GOTO 1370:REM +X
1510 IF SX= 43 THEN SX= 47:SA= SA- 74:AA= AA- 30:IP= IP- 15:GOTO 1580
1520 IF SX< 44 THEN 1550
1530 N= SX- 46:IF (N AND 3) = 0 THEN SA = SA + 4
1540 SX= SX+ 1:SA= SA+ 4:AA= AA+ 2:IP= IP+ 1:GOTO 1580
1550 N= SX- 13:IF INT (N/ 10)= N/ 10 THEN SX= SX+ 2:SA= SA+ 4
1560 SX= SX+ 1:SA= SA+ 2:IF (SX AND 1)= 0 THEN AA= AA+ 2:IP= IP+ 1
1570 GOTO 1580
1580 REM COMMON MOVE CURSOR
1590 IF IP< = EBTHEN 1620
1600 IF DX> 0THEN 1500
1610 IF DX< 0THEN 1410
1620 HI= PEEK (IP):GOSUB 1850
1630 GOTO 1650:REM BYPASS DIAG AID
1640 PLOT 27,12,3,0,30:PRINT "SX/SY/SA/AA/IP ";SX;" ";SY;" ";SA;" ";AA;" ";IP;" ";HO$;" "
1650 IF SX> 46 THEN POKE SA+ 1,PEEK (SA+ 1) OR 64:POKE SA+ 3,PEEK (SA+ 3)OR 64:GOTO 1670
1660 POKE AA+ 1,PEEK (AA+ 1) OR 64
1670 DX= 0:DY= 0:PLOT 3,SX,SY:GOTO 980
1680 POKE SA+ 1,PEEK (SA+ 1)AND 191:POKE AA+ 1,PEEK (AA+ 1)AND 191
1690 POKE SA+ 3,PEEK (SA+ 3)AND 191
1700 RETURN
1710 INPUT "HEX:";CI$:GOSUB 1720:PRINT " DEC ";CO:GOTO 1710
1720 REM CONVERT HEX STRING IN CI$ TO ARITH IN CO
1730 CO= 0
1740 IF RIGHT$ (CI$,1)< > "H"THEN CO= VAL (CI$):RETURN
1750 IF LEN (CI$)< 2THEN RETURN
1760 FOR I= 1TO LEN (CI$)- 1
1770 C1= ASC (MID$ (CI$,I,1))
1780 C2= 16
1790 IF C1> 47AND C1< 58THEN C2= C1- 48
1800 IF C1> 64AND C1< 71THEN C2= C1- 55:REM HEX A-F
1810 IF C2> 15THEN PRINT "HEX INPUT ERROR ";CI$:OUT 8,255:END
1820 CO= CO* 16+ C2
1830 NEXT I
1840 RETURN
1850 REM CONVERT ARITH VALUE IN HI(0-255) TO TWO HEX CHAR
1860 REM IN HO$
1870 IF HI< 0THEN HI= HI+ 256
1880 H0= INT (HI/ 16)+ 48:IF H0> 57 THEN H0= H0+ 7
1890 H1= (HIAND 15)+ 48:IF H1> 57 THEN H1= H1+ 7
1900 HO$= CHR$ (H0)+ CHR$ (H1)
1910 RETURN
1920 REM CONVERT TWO-BYTE VALUE TO 4-BYTE HEX STRING
1930 IF DI< 0THEN DI= DI+ 65536
1940 HI= INT (DI/ 256):GOSUB 1850:DO$= HO$
1950 HI= (DI- HI* 256):GOSUB 1850
1960 DO$= DO$+ HO$
1970 RETURN
1980 REM ROUTINE TO LOAD MACHINE LANGUAGE PATCH TO READ
1990 REM KEYBOARD AS EACH KEY IS PRESSED.
2000 DATA 245,229,197,62,255,211,8
2010 DATA 1,206,40,205,36,0,202,-1,-1,11
2020 DATA 121,176,194,-1,-1,29,194,-1,-1,17,255,255,195
2030 DATA -1,-1,95,175,87,62,247,211,8,62,0
2040 DATA 50,255,129,193,225,241,201
2050 REM FIND END OF BASIC RAM
2060 AD= 32940:GOSUB 2250:TM= Z
2070 REM CHECK TO SEE IF ALREADY LOADED
2080 IF TM< > UDOS- 50THEN 2150:REM NOT LOADED
2090 RESTORE 2000
2100 FOR I= 1TO 48:READ A
2110 IF A> 0AND A< > PEEK (TM+ I)THEN I= 48:A= 999
2120 NEXT I
2130 IF A< 256THEN 2350:REM LOADED, TO SET JUMP
2140 REM LOAD PROGRAM
2150 TM= UDOS- 50:RESTORE 2000
2160 FOR I= 1TO 48:READ A:POKE TM+ I,A- (A< 0):NEXT I
2170 REM LOAD ADDRESSES
2180 Z= TM+ 33:AD= TM+ 15:GOSUB 2240
2190 Z= TM+ 11:AD= TM+ 21:GOSUB 2240
2200 Z= TM+ 8:AD= TM+ 25:GOSUB 2240
2210 Z= TM+ 36:AD= TM+ 31:GOSUB 2240
2220 GOTO 2280
2230 REM LOAD ADDRESS Z AT AD,AD+1
2240 ZZ= INT (Z/ 256):POKE AD,Z- 256* ZZ:POKE AD+ 1,ZZ:RETURN
2250 REM FETCH ADDRESS Z FROM AD,AD+1
2260 Z= PEEK (AD)+ 256* PEEK (AD+ 1):RETURN
2270 REM CHANGE END OF BASIC RAM
2280 Z= TM:AD= 32940:GOSUB 2240
2290 CLEAR 100
2300 AD= 32940:GOSUB 2250:TM= Z
2305 DV= PEEK (33044)AND 1:REM LOAD DRIVE
2310 PLOT 3,0,17,27,4:PRINT "LOAD";DV;":UDOS.PRG;1":PLOT 27,27
2320 IF PEEK (28672+ 17* 128)= 32 THEN GOSUB 2360:GOTO 250
2330 PRINT "UDOS LOAD FAILURE"
2340 PRINT "UDOS.PRG;1 MUST BE ON LOAD DISK":POKE TM+ 1,0:END :RUN
2350 GOSUB 2360:GOTO 250
2360 REM LOAD BASIC JUMP LOCATION
2370 Z= TM+ 1:AD= 33283:GOSUB 2240
2380 POKE 33282,195
2390 RETURN
2400 Z= EUDOS:AD= 33283:GOSUB 2240
2410 POKE 33282,195:RETURN
2420 GOSUB 2370:B$= ""
2430 REM READ KEYBOARD
2440 CH= CALL (5):IF CH= - 1 THEN 2440
2450 CH$= CHR$ (CH)
2460 IF CH = 26 THEN 2510:REM CURS LEFT
2470 IF CH = 13 THEN PLOT 13,10:RETURN :REM CR
2480 IF CH< 32 OR CH> 96 THEN 2440:REM INVALID INPUT IGNORED
2490 IF LEN (B$)> = ML THEN 2440
2500 PLOT CH:B$= B$+ CH$:GOTO 2440
2510 IF LEN (B$)= 0 THEN 2440
2520 IF LEN (B$)= 1 THEN B$= "":PLOT 26,32,26:GOTO 2440
2530 B$= LEFT$ (B$,LEN (B$)- 1):PLOT 26,32,26:GOTO 2440