It took sometime but I completed it. I was trying to convert a four digit HEX because it would be two ASCII numbers back to integer. I wanted to reproduce my compiler I had on my TANDY 1000. It was nice and it was in binary, I figured HEX would be simpler. I am not sure what else I did but the Registry on WINDOWS XP or any window os would stop the compilation from working. As we need to be able to run anything, not just BASIC or BASIC programs as DOS 2.10 was only capable of doing, since there was no other programming language in 1983. May have been, anyway this compiler used to work. I then started on more advanced techniques other posts. Oh well, here it is so anyone can see the way you convert a four digit HEX to 2 ASCII characters.
Code: Select all
REM PROGRAM: BASIC COMPILER
REM CREATED BY: GREGORY LYONS
CLEAR , , 28000
BEGIN:
INPUT "FILE TO COMPILE WITH-[.BAS]:", FILENAMEBASIC$
IF INSTR(1, FILENAMEBASIC$, ".") > 1 THEN
PLACEOFEXTENSION = INSTR(1, FILENAMEBASIC$, ".")
END IF
IF INSTR(1, FILENAMEBASIC$, ".") = 1 THEN PLACEOFEXTENSION = 1
LENGTHOFEXTENSION = LEN(FILENAMEBASIC$) - PLACEOFEXTENSION
EXTENSION$ = MID$(FILENAMEBASIC$, PLACEOFEXTENSION, LENGTHOFEXTENSION)
IF EXTENSION$ <> "BAS" THEN EXTENSION$ = ".BAS"
IF PLACEOFEXTENSION > 1 THEN
FILENAME$ = LEFT$(FILENAMEBASIC$, (PLACEOFEXTENSION - 1))
END IF
IF PLACEOFEXTENSION = 1 THEN
COLOR 4, 0
PRINT "ERROR #1 - STARTED FILE WITH '.' OR NO EXTENSION ENTERED!!!"
COLOR 7, 0
GOTO BEGIN
END IF
IF PLACEOFEXTENSION = 0 THEN FILENAME$ = FILENAMEBASIC$
FILENAMEBASIC$ = FILENAME$ + EXTENSION$
FILENAMEBASIC$ = "C:\QBstuff\PROJECTS\COMPILER\" + FILENAMEBASIC$
FILETOMAKE$ = "C:\QBstuff\PROJECTS\" + FILENAME$ + ".GRG"
OPEN FILETOMAKE$ FOR OUTPUT AS #1
FIRST$ = "M" + "Z" + CHR$(144)
PRINT #1, FIRST$;
OPEN FILENAMEBASIC$ FOR INPUT AS #2
FOR FAIRVALUE = 1 TO 1000
IF NOT EOF(2) THEN SYSDB$ = INPUT$(1, 2)
IF NOT EOF(2) THEN SYSDB3$ = INPUT$(1, 2) ELSE SYSDB3$ = " "
SYSDB$ = SYSDB$ + SYSDB3$
CHEESY = CVI(SYSDB$)
WELT$ = HEX$(CHEESY)
IF LEN(WELT$) = 3 THEN WELT$ = "0" + WELT$
IF LEN(WELT$) = 2 THEN WELT$ = "0" + "0" + WELT$
IF LEN(WELT$) = 1 THEN WELT$ = "0" + "0" + "0" + WELT$
CONVERTVAL$ = LEFT$(WELT$, 2)
SAMPLE$ = MID$(WELT$, 2, 2)
FIRSTCHOICE$ = LEFT$(CONVERTVAL$, 1)
SECONDCHOICE$ = MID$(CONVERTVAL$, 2, 1)
THIRDCHOICE$ = LEFT$(SAMPLE$, 1)
FOURTHCHOICE$ = MID$(SAMPLE$, 2, 1)
FOR DIVERT = 1 TO 6
JUMBLE1$ = FIRSTCHOICE$
IF JUMBLE1$ = CHR$(64 + DIVERT) THEN FIRSTCHOICE$ = STR$(9 + DIVERT)
JUMBLE2$ = SECONDCHOICE$
IF JUMBLE2$ = CHR$(64 + DIVERT) THEN SECONDCHOICE$ = STR$(9 + DIVERT)
JUMBLE3$ = THIRDCHOICE$
IF JUMBLE3$ = CHR$(64 + DIVERT) THEN THIRDCHOICE$ = STR$(9 + DIVERT)
JUMBLE4$ = FOURTHCHOICE$
IF JUMBLE4$ = CHR$(64 + DIVERT) THEN FOURTHCHOICE$ = STR$(9 + DIVERT)
NEXT DIVERT
IF VAL(FIRSTCHOICE$) = 0 THEN CONVERTVAL$ = STR$(VAL(SECONDCHOICE$))
IF VAL(SECONDCHOICE$) = 0 THEN
CONVERTVAL$ = STR$((VAL(FIRSTCHOICE$) * 10) + (VAL(FIRSTCHOICE$) * 6))
END IF
IF (VAL(SECONDCHOICE$) > 0) AND VAL(FIRSTCHOICE$) <0> 0) AND VAL(THIRDCHOICE$) <0> 1000 THEN VALUENOTDONE$ = "TRUE"
OPEN "C:\QBstuff\PROJECTS\COMPILER\DORKO.DAT" FOR OUTPUT AS #3
PRINT #3, FILENAMEBASIC$
PRINT #3, FILETOMAKE$
PRINT #3, LOF(2)
PRINT #3, "1"
CLOSE #3
CLOSE #2
CLOSE #1
IF VALUENOTDONE$ = "TRUE" THEN
GOTO KEILBAHSIE
ELSE
GOTO FINISH
END IF
KEILBAHSIE:
IF VALUENOTDONE$ = "TRUE" THEN CLEAR , , 22000
OPEN "C:\QBstuff\PROJECTS\COMPILER\DORKO.DAT" FOR INPUT AS #3
LINE INPUT #3, FILENAMEBASIC$
LINE INPUT #3, FILETOMAKE$
INPUT #3, LENGTHOFCODE
INPUT #3, MULTIPLIER
CLOSE #3
OPEN FILETOMAKE$ FOR APPEND AS #1
OPEN FILENAMEBASIC$ FOR INPUT AS #2
FOR FAIRVALUE = 1 TO 1000
IF NOT EOF(2) THEN SYSDB$ = INPUT$(1, 2)
IF NOT EOF(2) THEN SYSDB3$ = INPUT$(1, 2) ELSE SYSDB3$ = " "
SYSDB$ = SYSDB$ + SYSDB3$
CHEESY = CVI(SYSDB$)
WELT$ = HEX$(CHEESY)
IF LEN(WELT$) = 3 THEN WELT$ = "0" + WELT$
IF LEN(WELT$) = 2 THEN WELT$ = "0" + "0" + WELT$
IF LEN(WELT$) = 1 THEN WELT$ = "0" + "0" + "0" + WELT$
CONVERTVAL$ = LEFT$(WELT$, 2)
SAMPLE$ = MID$(WELT$, 2, 2)
FIRSTCHOICE$ = LEFT$(CONVERTVAL$, 1)
SECONDCHOICE$ = MID$(CONVERTVAL$, 2, 1)
THIRDCHOICE$ = LEFT$(SAMPLE$, 1)
FOURTHCHOICE$ = MID$(SAMPLE$, 2, 1)
FOR DIVERT = 1 TO 6
JUMBLE1$ = FIRSTCHOICE$
IF JUMBLE1$ = CHR$(64 + DIVERT) THEN FIRSTCHOICE$ = STR$(9 + DIVERT)
JUMBLE2$ = SECONDCHOICE$
IF JUMBLE2$ = CHR$(64 + DIVERT) THEN SECONDCHOICE$ = STR$(9 + DIVERT)
JUMBLE3$ = THIRDCHOICE$
IF JUMBLE3$ = CHR$(64 + DIVERT) THEN THIRDCHOICE$ = STR$(9 + DIVERT)
JUMBLE4$ = FOURTHCHOICE$
IF JUMBLE4$ = CHR$(64 + DIVERT) THEN FOURTHCHOICE$ = STR$(9 + DIVERT)
NEXT DIVERT
IF VAL(FIRSTCHOICE$) = 0 THEN CONVERTVAL$ = STR$(VAL(SECONDCHOICE$))
IF VAL(SECONDCHOICE$) = 0 THEN
CONVERTVAL$ = STR$((VAL(FIRSTCHOICE$) * 10) + (VAL(FIRSTCHOICE$) * 6))
END IF
IF (VAL(SECONDCHOICE$) > 0) AND VAL(FIRSTCHOICE$) <0> 0) AND VAL(THIRDCHOICE$) <0> HOWMUCHDONE THEN VALUENOTDONE$ = "TRUE"
KILL "C:\QBstuff\PROJECTS\COMPILER\DORKO.DAT"
OPEN "C:\QBstuff\PROJECTS\COMPILER\DORKO.DAT" FOR OUTPUT AS #3
PRINT #3, FILENAMEBASIC$
PRINT #3, FILETOMAKE$
PRINT #3, LOF(2)
PRINT #3, MULTIPLIER
CLOSE #3
CLOSE #2
CLOSE #1
IF VALUENOTDONE$ = "TRUE" THEN
GOTO KEILBAHSIE
ELSE
GOTO FINISH
END IF
FINISH:
CLEAR , , 28000
PRINT FRE(-2)
KILL "C:\QBstuff\PROJECTS\COMPILER\DORKO.DAT"
END
I have to work on the PATHS so it goes in temporary files and can access any source code on the machine. So, when I kill the file it was temporary and not used. Also, the PATH for the source, I need to figure out. I am not sure what the FRE number should be, but the compilation won't use any memory for the variable I used to read the file with or the conversion variables. That, other posts, is what I am talking about the companies with the languages need to go back and recompile. It would mean there was more memory. BASIC is a good place to start because with this hunk of code I compiled another BASIC. It was much bigger with either another file for the library or I had a modern day compiler. Well, the stuff I don't remember means I have to try again.