summaryrefslogtreecommitdiff
path: root/insns.bas
diff options
context:
space:
mode:
Diffstat (limited to 'insns.bas')
-rw-r--r--insns.bas541
1 files changed, 0 insertions, 541 deletions
diff --git a/insns.bas b/insns.bas
deleted file mode 100644
index 5178aa63..00000000
--- a/insns.bas
+++ /dev/null
@@ -1,541 +0,0 @@
-' INFO_1: Converter for INSNS.DAT to INSNSA.C and INSNSD.C
-'
-' INFO_2: Written by Mark Junker in 1997
-' InterNet: mjs@prg.hannover.sgh-net.de
-' FIDO: Mark Junker@2:2437/47.21
-'
-' COMMENT: While I wrote this program I often asked me, if it isn't easier
-' to write an interpreter for Perl-scripts :]
-'
-' COMMENT: To start the program press SHIFT+F5 within the QBasic IDE
-' or start it from the command-line with QBASIC /RUN MACROS
-'
-'
-' THIS PROGRAM NEEDS TO BE UPDATED -- it doesn't create insnsi.h
-' and insnsn.c. However, Perl interpreters are now available for both
-' DOS and Windows, so it seems pointless to spend the effort.
-'
-
-DEFINT A-Z
-
-DECLARE FUNCTION ReplaceOp$ (a$)
-DECLARE FUNCTION StrTrimLeft$ (a$, b$)
-DECLARE FUNCTION StrTrimRight$ (a$, b$)
-DECLARE FUNCTION StrTrim$ (a$, b$)
-DECLARE SUB StrSplitString (SplitString$, SplitChars$, SplitField$(), SplitCount%)
-DECLARE FUNCTION Min% (a%, b%)
-DECLARE FUNCTION StrInstrLeft% (SearchStart%, SearchIn$, SearchFor$)
-DECLARE FUNCTION StrAscii% (a$)
-
-
-CONST MaxOpCodeBase = 3
-CONST MaxOpCodeType = 8
-
-CLS
-DIM LineData$(1 TO 2)
-DIM StrucData$(1 TO 5)
-DIM OpCodeList$(0 TO 255)
-DIM OpCodeByte(1 TO MaxOpCodeType, 1 TO MaxOpCodeBase)
-DIM OpCodeStat(1 TO 10) ' don't need mode :)
-
-Instructs$ = ""
-LineOfs$ = ""
-
-OPEN "I", 1, "insns.dat"
-OPEN "B", 3, "insns.tmp"
-
-qt$ = CHR$(34)
-crlf$ = CHR$(13) + CHR$(10)
-
-
-'
-' preprocessing the current file
-'
-
-HexChar$ = "0123456789ABCDEF"
-
-PRINT "Preprocessing INSNS.DAT"
-OpCodes = 0
-OpCodeDebug = 0
-NowLineOfs& = 1
-lineNr = 0
-WHILE NOT EOF(1)
- lineNr = lineNr + 1
- IF (lineNr AND 15) = 0 THEN
- LOCATE , 1
- PRINT lineNr, OpCodes, OpCodeDebug;
- END IF
-
- LINE INPUT #1, l$
- CALL StrSplitString(l$, ";", LineData$(), SplitCount)
- IF SplitCount THEN
- LineData$(1) = StrTrim$(LineData$(1), CHR$(9) + " ")
- IF LEN(LineData$(1)) THEN
- CALL StrSplitString(LineData$(1), " ", StrucData$(), cntSplit)
- IF cntSplit <> 4 THEN
- PRINT "line"; lineNr; " does not contain four fields"
- END
- END IF
-
- tst$ = UCASE$(StrucData$(2))
- res$ = ""
- cnt% = 1
- isfirst = 1
- op = 1
- p = StrInstrLeft(1, tst$ + ",", "|:,")
- WHILE p
- h$ = ReplaceOp$(MID$(tst$, op, p - op))
- IF LEN(h$) THEN
- SELECT CASE MID$(tst$, p, 1)
- CASE ""
- IF isfirst THEN
- res$ = res$ + h$
- ELSE
- res$ = res$ + "|" + h$
- END IF
- isfirst = 0
- CASE ","
- IF isfirst THEN
- res$ = res$ + h$ + ","
- ELSE
- res$ = res$ + "|" + h$ + ","
- END IF
- cnt% = cnt% + 1
- isfirst = 1
- CASE "|"
- IF isfirst THEN
- res$ = res$ + h$
- ELSE
- res$ = res$ + "|" + h$
- END IF
- isfirst = 0
- CASE ":"
- res$ = res$ + h$ + "|COLON,"
- cnt% = cnt% + 1
- END SELECT
- END IF
- op = p + 1
- p = StrInstrLeft(op, tst$ + ",", "|:,")
- WEND
- FOR a = cnt% + 1 TO 3
- res$ = res$ + ",0"
- NEXT
- StrucData$(2) = res$
- IF LEFT$(res$, 2) = "0," THEN cnt% = cnt% - 1
- StrucData$(5) = LTRIM$(STR$(cnt%))
-
- NoDebug = 0
- res$ = ""
- tst$ = UCASE$(StrucData$(4))
- op = 1
- p = INSTR(tst$ + ",", ",")
- isfirst = 1
- WHILE p
- h$ = MID$(tst$, op, p - op)
- IF h$ = "ND" THEN
- NoDebug = 1
- ELSE
- IF isfirst THEN
- res$ = res$ + "IF_" + h$
- ELSE
- res$ = res$ + "|IF_" + h$
- END IF
- isfirst = 0
- END IF
- op = p + 1
- p = INSTR(op, tst$ + ",", ",")
- WEND
- StrucData$(4) = res$
-
- tst$ = UCASE$(StrucData$(3))
- SELECT CASE tst$
- CASE "IGNORE"
- GOTO skipOpCode
- CASE "\0", "\340"
- OpCodeDebug = OpCodeDebug + 1 ' don't forget to increment
- GOTO skipOpCode
- END SELECT
-
- AddRegs = 0
- AddCCode = 0
- NextIsOpCode = 0
- opCodeVal$ = ""
- op = 1
- p = INSTR(tst$ + "\", "\")
- DO WHILE p
- h$ = MID$(tst$, op, p - op)
- IF LEFT$(h$, 1) = "X" THEN
- opCodeVal$ = CHR$(VAL("&H" + MID$(h$, 2)))
- EXIT DO
- ELSE
- SELECT CASE h$
- CASE "1", "2", "3"
- NextIsOpCode = 1
- CASE "4"
- opCodeVal$ = CHR$(&H7) + CHR$(&H17) + CHR$(&H1F)
- EXIT DO
- CASE "5"
- opCodeVal$ = CHR$(&HA1) + CHR$(&HA9)
- EXIT DO
- CASE "6"
- opCodeVal$ = CHR$(&H6) + CHR$(&HE) + CHR$(&H16) + CHR$(&H1E)
- EXIT DO
- CASE "7"
- opCodeVal$ = CHR$(&HA0) + CHR$(&HA8)
- EXIT DO
- CASE "10", "11", "12"
- NextIsOpCode = 1
- AddRegs = VAL(h$) - 9
- CASE "330"
- NextIsOpCode = 1
- AddCCode = VAL(h$) - 329
- CASE "17"
- opCodeVal$ = CHR$(0)
- EXIT DO
- CASE ELSE
- IF NextIsOpCode THEN
- PRINT "Line:"; lineNr
- PRINT "Unknown value: " + h$
- END
- END IF
- END SELECT
- END IF
- op = p + 1
- p = INSTR(op, tst$ + "\", "\")
- LOOP
- IF (p = 0) THEN
- PRINT "No opcode found in line"; lineNr
- PRINT "Line:"
- PRINT l$
- END
- END IF
-
- IF NoDebug = 0 THEN
- FOR a = 1 TO LEN(opCodeVal$)
- h = ASC(MID$(opCodeVal$, a, 1))
- OpCodeStr$ = MKI$(OpCodeDebug)
- IF AddRegs THEN
- EndNr = 7
- ELSEIF AddCCode THEN
- EndNr = 15
- ELSE
- EndNr = 0
- END IF
- FOR b = 0 TO EndNr
- OpCodeList$(h + b) = OpCodeList$(h + b) + OpCodeStr$
- NEXT
- NEXT
- OpCodeDebug = OpCodeDebug + 1
- END IF
-
-skipOpCode:
- OpCodes = OpCodes + 1
- LineOfs$ = LineOfs$ + MKL$(NowLineOfs&)
- LineLg = 1
- h$ = CHR$(NoDebug)
- PUT #3, NowLineOfs&, h$
- NowLineOfs& = NowLineOfs& + 1
- FOR a = 1 TO 5
- lg = LEN(StrucData$(a))
- h$ = CHR$(lg) + StrucData$(a)
- PUT #3, NowLineOfs&, h$
- NowLineOfs& = NowLineOfs& + lg + 1
- LineLg = LineLg + lg + 1
- NEXT
- LineOfs$ = LineOfs$ + MKI$(LineLg)
- END IF
- END IF
-WEND
-LOCATE , 1
-PRINT lineNr, OpCodes, OpCodeDebug
-
-
-'
-' creating insnsa.c
-'
-
-
-PRINT "Creating INSNSA.C"
-
-OPEN "O", 2, "insnsa.c"
-strBegStart$ = "static struct itemplate instrux_"
-strBegEnd$ = "[] = {"
-strEnd$ = " {-1}" + crlf$ + "};" + crlf$
-
-PRINT #2, "/* This file auto-generated from insns.dat by insns.bas - don't edit it */"
-PRINT #2, ""
-PRINT #2, "#include <stdio.h>"
-PRINT #2, "#include " + qt$ + "nasm.h" + qt$
-PRINT #2, "#include " + qt$ + "insns.h" + qt$
-PRINT #2, ""
-
-oldOpCode$ = ""
-pOfs = 1
-FOR a = 1 TO OpCodes
- LineOfs& = CVL(MID$(LineOfs$, pOfs, 4))
- l$ = SPACE$(CVI(MID$(LineOfs$, pOfs + 4, 2)))
- pOfs = pOfs + 6
- GET #3, LineOfs&, l$
-
- ' split data into fields
- NoDebug = ASC(LEFT$(l$, 1))
- pLn = 2
- FOR b = 1 TO 5
- lgLn = ASC(MID$(l$, pLn, 1))
- StrucData$(b) = MID$(l$, pLn + 1, lgLn)
- pLn = pLn + lgLn + 1
- NEXT
-
- IF oldOpCode$ <> StrucData$(1) THEN
- Instructs$ = Instructs$ + StrucData$(1) + CHR$(0)
- IF LEN(oldOpCode$) THEN PRINT #2, strEnd$
- PRINT #2, strBegStart$ + StrucData$(1) + strBegEnd$
- oldOpCode$ = StrucData$(1)
- END IF
- SELECT CASE UCASE$(StrucData$(3))
- CASE "IGNORE"
- CASE ELSE
- PRINT #2, " {I_" + oldOpCode$ + ", " + StrucData$(5) + ", {" + StrucData$(2) + "}, " + qt$ + StrucData$(3) + qt$ + ", " + StrucData$(4) + "},"
- END SELECT
-NEXT
-IF LEN(oldOpCode$) THEN PRINT #2, strEnd$
-
-PRINT #2, "struct itemplate *nasm_instructions[] = {"
-op = 1
-p = INSTR(Instructs$, CHR$(0))
-WHILE p
- h$ = MID$(Instructs$, op, p - op)
- PRINT #2, " instrux_" + h$ + ","
- op = p + 1
- p = INSTR(op, Instructs$, CHR$(0))
-WEND
-PRINT #2, "};"
-
-CLOSE 2
-
-
-
-'
-' creating insnsd.c
-'
-
-
-PRINT "Creating INSNSD.C"
-
-OPEN "O", 2, "insnsd.c"
-
-PRINT #2, "/* This file auto-generated from insns.dat by insns.bas - don't edit it */"
-PRINT #2, ""
-PRINT #2, "#include <stdio.h>"
-PRINT #2, "#include " + qt$ + "nasm.h" + qt$
-PRINT #2, "#include " + qt$ + "insns.h" + qt$
-PRINT #2, ""
-
-
-PRINT #2, "static struct itemplate instrux[] = {"
-pOfs = 1
-FOR a = 1 TO OpCodes
- LineOfs& = CVL(MID$(LineOfs$, pOfs, 4))
- l$ = SPACE$(CVI(MID$(LineOfs$, pOfs + 4, 2)))
- pOfs = pOfs + 6
- GET #3, LineOfs&, l$
-
- ' split data into fields
- NoDebug = ASC(LEFT$(l$, 1))
- pLn = 2
- FOR b = 1 TO 5
- lgLn = ASC(MID$(l$, pLn, 1))
- StrucData$(b) = MID$(l$, pLn + 1, lgLn)
- pLn = pLn + lgLn + 1
- NEXT
-
- IF NoDebug OR (UCASE$(StrucData$(3)) = "IGNORE") THEN
- ' ignorieren
- ELSE
- PRINT #2, " {I_" + StrucData$(1) + ", " + StrucData$(5) + ", {" + StrucData$(2) + "}, " + qt$ + StrucData$(3) + qt$ + ", " + StrucData$(4) + "},"
- END IF
-NEXT
-PRINT #2, " {-1}" + crlf$ + "};" + crlf$
-
-
-OpCodeBegS$ = "static struct itemplate *itable_"
-OpCodeBegE$ = "[] = {"
-OpCodeEnd$ = " NULL" + crlf$ + "};" + crlf$
-
-FOR a = 0 TO 255
- PRINT #2, OpCodeBegS$ + RIGHT$("00" + HEX$(a), 2) + OpCodeBegE$
- h$ = OpCodeList$(a)
- FOR b = 1 TO LEN(h$) STEP 2
- OpCodePos = CVI(MID$(h$, b, 2))
- PRINT #2, " instrux +" + STR$(OpCodePos) + ","
- NEXT
- PRINT #2, OpCodeEnd$
-NEXT
-
-PRINT #2, "struct itemplate **itable[] = {"
-FOR a = 0 TO 255
- PRINT #2, " itable_" + RIGHT$("00" + HEX$(a), 2) + ","
-NEXT
-PRINT #2, "};"
-
-CLOSE 2
-
-
-
-CLOSE 3
-KILL "insns.tmp"
-CLOSE 1
-SYSTEM
-
-FUNCTION ReplaceOp$ (a$)
- tst$ = UCASE$(a$)
- SELECT CASE tst$
-' CASE "ND"
-' ReplaceOp$ = ""
- CASE "VOID", ""
- ReplaceOp$ = "0"
- CASE "IMM"
- ReplaceOp$ = "IMMEDIATE"
- CASE "MEM"
- ReplaceOp$ = "MEMORY"
- CASE "MEM8", "MEM16", "MEM32", "MEM64", "MEM80"
- ReplaceOp$ = "MEMORY|BITS" + MID$(tst$, 4)
- CASE "REG8", "REG16", "REG32"
- ReplaceOp$ = tst$
- CASE "RM8", "RM16", "RM32"
- ReplaceOp$ = "REGMEM|BITS" + MID$(tst$, 3)
- CASE "IMM8", "IMM16", "IMM32"
- ReplaceOp$ = "IMMEDIATE|BITS" + MID$(tst$, 4)
- CASE ELSE
- ReplaceOp$ = tst$
- END SELECT
-END FUNCTION
-
-FUNCTION Min% (a%, b%)
- IF a% < b% THEN Min% = a% ELSE Min% = b%
-END FUNCTION
-
-FUNCTION StrAscii (a$)
- IF LEN(a$) = 0 THEN
- StrAscii = -1
- ELSE
- StrAscii = ASC(a$)
- END IF
-END FUNCTION
-
-' same as =INSTR(SearchStart, SearchIn, ANY SearchFor$) in PowerBASIC(tm)
-'
-FUNCTION StrInstrLeft (SearchStart, SearchIn$, SearchFor$)
- ValuesCount = LEN(SearchFor$)
- MaxValue = LEN(SearchIn$) + 1
- MinValue = MaxValue
- FOR Counter1 = 1 TO ValuesCount
- SearchChar$ = MID$(SearchFor$, Counter1, 1)
- hVal2 = INSTR(SearchStart, SearchIn$, SearchChar$)
- IF hVal2 > 0 THEN MinValue = Min%(hVal2, MinValue)
- NEXT
- IF MinValue = MaxValue THEN MinValue = 0
- StrInstrLeft = MinValue
-END FUNCTION
-
-'
-' This is a very damn fuckin' shit version of this splitting routine.
-' At this time, it's not very useful :]
-'
-SUB StrSplitString (SplitString$, SplitChars$, SplitField$(), SplitCount)
- StartIndex = LBOUND(SplitField$)
- LastIndex = UBOUND(SplitField$)
- ActualIndex& = StartIndex
- SplitCount = 0
-
- LastPos = 1
- FoundPos = StrInstrLeft(LastPos, SplitString$, SplitChars$ + CHR$(34))
- GetDirect = 0
- EndLoop = 0
- TempString$ = ""
- DO WHILE FoundPos > 0
- FoundCharVal = StrAscii(MID$(SplitString$, FoundPos, 1))
- PosDiff = (FoundPos - LastPos) + 1
- SELECT CASE FoundCharVal
- CASE 34
- TempString$ = TempString$ + MID$(SplitString$, LastPos, PosDiff - 1)
- SELECT CASE EndLoop
- CASE 0
- EndLoop = 2
- CASE 3
- EndLoop = 0
- END SELECT
- CASE ELSE
- TempString$ = TempString$ + MID$(SplitString$, LastPos, PosDiff - 1)
- SplitField$(ActualIndex&) = TempString$
- TempString$ = ""
- ActualIndex& = ActualIndex& + 1
- IF ActualIndex& > LastIndex THEN
- ActualIndex& = LastIndex
- EndLoop = 1
- END IF
- END SELECT
- SELECT CASE EndLoop
- CASE 0
- DO
- LastPos = FoundPos + 1
- FoundPos = StrInstrLeft(LastPos, SplitString$, SplitChars$)
- LOOP WHILE LastPos = FoundPos
- FoundPos = StrInstrLeft(LastPos, SplitString$, SplitChars$ + CHR$(34))
- CASE 1
- FoundPos = 0
- LastPos = LEN(SplitString$) + 1
- CASE 2
- EndLoop = 3
- LastPos = FoundPos + 1
- FoundPos = StrInstrLeft(LastPos, SplitString$, CHR$(34))
- IF FoundPos = 0 THEN
- SplitString$ = SplitString$ + CHR$(34)
- FoundPos = LEN(SplitString$)
- END IF
- END SELECT
- LOOP
- IF EndLoop = 0 THEN
- IF LEN(TempString$) > 0 THEN
- SplitField$(ActualIndex&) = TempString$
- ELSEIF LastPos <= LEN(SplitString$) THEN
- SplitField$(ActualIndex&) = MID$(SplitString$, LastPos)
- ELSE
- ActualIndex& = ActualIndex& - 1
- END IF
- END IF
- FOR a = ActualIndex& + 1 TO LastIndex
- SplitField$(a) = ""
- NEXT
- SplitCount = (ActualIndex& - StartIndex) + 1
-END SUB
-
-FUNCTION StrTrim$ (a$, b$)
- StrTrim$ = StrTrimRight$(StrTrimLeft$(a$, b$), b$)
-END FUNCTION
-
-FUNCTION StrTrimLeft$ (a$, b$) 'public
- p = 0
- l = LEN(a$)
- DO
- p = p + 1
- t$ = MID$(a$, p, 1)
- LOOP WHILE (p < l) AND (INSTR(b$, t$) > 0)
- StrTrimLeft$ = MID$(a$, p)
-END FUNCTION
-
-FUNCTION StrTrimRight$ (a$, b$) 'public
- l = LEN(a$)
- p = l + 1
- DO
- p = p - 1
- IF p > 0 THEN
- t$ = MID$(a$, p, 1)
- ELSE
- t$ = ""
- END IF
- LOOP WHILE (p > 0) AND (INSTR(b$, t$) > 0)
- StrTrimRight$ = LEFT$(a$, p)
-END FUNCTION
-
- \ No newline at end of file