10 REM Build a BASIC to build an ASM. 20 REM This program writes out a text file BASIC program which when run will build an assembly code program at any desired address. 30 REM The input required to create the program is two copies, at different addresses, of the machine code program. The user is asked for the start, end, and execution address for one copy, and for the start addr. of the other. 40 REM The program compares the two, and if a difference is found, converts the address to a relocatable one. The resulting program is left as the file _BLD_.DO 50 REM Richard Haw [71706,334], modified by Don Zeikel [75775,1430] with help from Phil Wheeler [71266,125] 280 CLS:MAXFILES=1:CLEAR256:INPUT"File name to save ";F$:INPUT"Start address ";AD:INPUT"End address ";AF 290 INPUT"Entry address ";AE:INPUT"Copy address ";AC:AL=AF-AD:CLS:OPEN"_BLD_"FOROUTPUTAS1:DEFINTI-Q 300 PRINT@130,"Writing out program" 305 Q=0:PRINT#1,Q"'"F$:Q$=CHR$(34):R$=Q$+":":Q=Q+1 307 PRINT#1," 5000 DEFINTI-X:DEFSTRY-Z:Z="Q$"0123456789ABCDEFGHIJKLMNOPQRSTUV"Q$":CLS:E=";:XT=AL:GOSUB580:PRINT#1,":D=";:XT=AE-AD:GOSUB580:PRINT#1,":RETURN" 310 PRINT#1,Q"GOSUB5000":Q=Q+1 330 PRINT#1,Q"PRINT@42,"Q$"Enter end address"Q$":PRINT@82,"Q$" for current MAXRAM"Q$:Q=Q+1 340 NS=Q:PRINT#1,Q"Y="Q$Q$":PRINT@122,SPACE$(30);:PRINT@122,;:INPUTY:IFY=";:PRINT#1,Q$Q$"THENB=MAXRAM-E-1ELSEB=VAL(Y)-E-1":Q=Q+1 353 PRINT#1,Q"CLEAR256,B:B=HIMEM:GOSUB5000":Q=Q+1 360 PRINT#1,Q"CLS:A=B:C=B+E:D=D+B:S=99:M=99:PRINT@48,"Q$"Line"Q$":PRINT@88,"Q$"Address"Q$:Q=Q+1:NS=Q 370 PRINT#1,Q"GOSUB60:IFO=0THENPOKEA,K:A=A+1:GOTO";:XT=NS:GOSUB580:PRINT#1,:Q=Q+1 380 PRINT#1,Q"P=K:GOSUB60:G=P+256*K+B:P=INT(G/256):Q=G-P*256":Q=Q+1:PRINT#1,Q"POKEA,Q:A=A+1:POKEA,P:A=A+1:GOTO";:XT=NS 390 GOSUB580:PRINT#1,:Q=40:PRINT#1,Q"SAVEM"Q$F$Q$",B,C,D":Q=50:PRINT#1,Q"U=INSTR(1,Z,MID$(Y,M,1)):IFU=0THEN55":Q=Q+1 400 PRINT#1,Q"IFU>16THENU=U-16:O=1ELSEO=0":Q=Q+1:PRINT#1,Q"V=INSTR(1,Z,MID$(Y,M+1,1)):IFV=0ORV>16THEN55":Q=Q+1 410 PRINT#1,Q"K=(U-1)*16+V-1:RETURN":Q=55:PRINT#1,Q"BEEP:PRINT@165,"Q$"Bad character"R$"END":Q=60:PRINT#1,Q"IFMRTHENBEEP:PRINT@165,"Q$"Checksum fail"R$"END":Q=Q+1:PRINT#1,Q"READY:M=1:GOSUB50:IFK=0THEN40":Q=Q+1 430 PRINT#1,Q"S=S+1:PRINT@70,S;:PRINT@110,A;:N=K:M=3:GOSUB50:M=5:L=K:GOSUB50:L=K*256+L:R=0":Q=70 440 PRINT#1,Q"M=M+2:GOSUB50:R=R+K:RETURN":CLS:A=AD:D=AD-AC:L=0:A$="":Q=99 450 IFA>AFTHEN500 460 J=PEEK(A):IFPEEK(A-D)=JTHEN490 470 B=PEEK(A)+PEEK(A+1)*256:PRINTA"-"B"Changed to start +";:B=B-AD:PRINTB:C=INT(B/256):B=B-C*256 480 M=1:K=B:GOSUB510:K=C:GOSUB510:A=A+2:GOTO450 490 K=J:GOSUB510:A=A+1:GOTO450 500 GOSUB520:Q=Q+1:PRINT#1,Q"DATA00":MAXFILES=0:MENU 510 IFLEN(A$)<112THEN530 520 I=L/256:J=L-I*256:GOSUB550:C$=B$:J=I:GOSUB550:D$=B$:J=LEN(A$)/2:GOSUB550:Q=Q+1:PRINT#1,Q"DATA"B$C$D$A$:A$="":L=0 530 L=L+K:IFMTHENJ=K+256:M=0ELSEJ=K 540 GOSUB550:A$=A$+B$:RETURN 550 J1=J/16:J2=J-J1*16:IFJ1>9THENJ1=J1+55ELSEJ1=J1+48 560 IFJ2>9THENJ2=J2+55ELSEJ2=J2+48 570 B$=CHR$(J1)+CHR$(J2):RETURN 580 X$=STR$(XT):FORI=1TOLEN(X$):Y$=MID$(X$,I,1):IFY$<>" "THENPRINT#1,Y$; 590 NEXTI:RETURN