home *** CD-ROM | disk | FTP | other *** search
- 1000 ' COM2ASM.BAS Ver 1.1, by Richard Winkel
- 1010 ' This program may not be compiled because of
- 1020 ' some unresolved FOR/NEXT-statements
- 1030 ' For free distribution only; not for sale
- 1040 DEFINT A-Z
- 1050 DIM LIN$(999), JMP$(25) ' referenced addresses, jump instructions
- 1060 GOSUB 1670
- 1070 INPUT "Enter name of input file: ", INFILE$
- 1080 INPUT "Enter name of output file: ", OUTFILE$
- 1090 OPEN INFILE$ FOR INPUT AS #1
- 1100 OPEN OUTFILE$ FOR OUTPUT AS #2: PRINT #2, ".RADIX 16"
- 1110 IF EOF(1) THEN 1200
- 1120 LINE INPUT #1, A$
- 1130 IF LEN(A$) < 28 THEN 1110 ELSE J$ = MID$(A$, 25, 4)
- 1140 FOR I = 1 TO JMPNUM
- 1150 IF J$ <> JMP$(I) THEN GOSUB 1720: GOTO 1110
- 1160 IF MID$(A$, 33, 1) = "[" THEN GOTO 1110 ' if indirect addressing, skip it
- 1170 IF MID$(A$, 33, 3) = "FAR" THEN GOTO 1110
- 1180 IF MID$(A$, 37, 1) = ":" THEN GOTO 1110 'if inter-segment jump, skip
- 1190 LIN = LIN + 1: LIN$(LIN) = MID$(A$, 33, 4): GOTO 1110'otherwise, save the reference
- 1200 CLOSE #1
- 1210 OPEN INFILE$ FOR INPUT AS #1 're-position read pointer
- 1220 PRINT "Sorting..." ' super shell sort (Byte, May '83)
- 1230 D = 2 ^ INT(LOG(LIN) / LOG(2)) - 1 ' sort referenced addresses
- 1240 FOR I = 1 TO LIN - D
- 1250 IF LIN$(I) <= LIN$(I + D) THEN 1310 ELSE T$ = LIN$(I + D): LIN$(I + D) = LIN$(I)
- 1260 IF I <= D THEN LIN$(I) = T$: GOTO 1310
- 1270 FOR J = I - D TO 1 STEP -D
- 1280 IF T$ >= LIN$(J) THEN 1300 ELSE LIN$(J + D) = LIN$(J)
- 1290 NEXT J
- 1300 LIN$(J + D) = T$
- 1310 NEXT I
- 1320 D = INT(D / 2): IF D > 0 THEN GOTO 1240 ELSE I = 1
- 1330 IF I = LIN THEN 1370 ' array is sorted, now get rid of duplicates
- 1340 IF LIN$(I) = LIN$(I + 1) THEN FOR J = I TO LIN: LIN$(J) = LIN$(J + 1): NEXT: LIN = LIN - 1 ELSE I = I + 1
- 1350 GOTO 1330
- 1360 ' *****************************************************
- 1370 L = 1 ' now go back thru file and plug in labels for addresses
- 1380 IF NOT EOF(1) THEN 1420 ELSE IF L > LIN THEN 1400 ' else premature EOF
- 1390 PRINT "Error: Referenced code at "; LIN$(L); "was not found."
- 1400 CLOSE
- 1410 END
- 1420 LINE INPUT #1, A$: IF LEN(A$) < 28 THEN 1380
- 1430 IF MID$(A$, 6, 4) < LIN$(L) THEN MID$(A$, 6, 4) = " ": GOTO 1480'not referenced
- 1440 IF MID$(A$, 6, 4) = LIN$(L) THEN 1460'plug in label
- 1450 IF L > LIN THEN MID$(A$, 6, 4) = " ": GOTO 1480 ELSE 1390'err: skipped over code
- 1460 L$ = STR$(L): L$ = "L" + RIGHT$(L$, LEN(L$) - 1)
- 1470 L$ = L$ + ":" + STRING$(4 - LEN(L$), " "): MID$(A$, 6, 5) = L$: L = L + 1
- 1480 J$ = MID$(A$, 25, 4)
- 1490 FOR I = 1 TO JMPNUM
- 1500 IF J$ <> JMP$(I) THEN GOSUB 1720: GOTO 1600
- 1510 IF MID$(A$, 33, 1) = "[" THEN 1600
- 1520 IF MID$(A$, 33, 3) = "FAR" THEN 1600
- 1530 IF MID$(A$, 37, 1) = ":" THEN 1600
- 1540 REF$ = MID$(A$, 33, 4)
- 1550 FOR I = 1 TO LIN
- 1560 IF REF$ <> LIN$(I) THEN GOSUB 1720
- 1570 L$ = STR$(I)
- 1580 L$ = "L" + RIGHT$(L$, LEN(L$) - 1) ' replace destination addr with label
- 1590 MID$(A$, 33, 4) = L$ + STRING$(4 - LEN(L$), " ")
- 1600 A$ = MID$(A$, 6, 5) + " " + RIGHT$(A$, LEN(A$) - 23) ' get rid of set & opcode
- 1610 FOR I = LEN(A$) TO 2 STEP -1
- 1620 IF MID$(A$, I, 1) = " " THEN GOSUB 1720
- 1630 A$ = LEFT$(A$, I) ' chop of trailing blanks
- 1640 PRINT A$: PRINT #2, A$
- 1650 GOTO 1380
- 1660 ' *******************
- 1670 JMPNUM = 20
- 1680 FOR I = 1 TO JMPNUM
- 1690 READ JMP$(I)
- 1700 NEXT
- 1710 RETURN
- 1720 NEXT
- 1730 RETURN
- 1740 DATA "JMP ","JZ ","JNZ ","LOOP","CALL","JCXZ","JB ","JBE ","JNB ","JA "
- 1750 DATA "JG ","JGE ","JL ","JLE ","JNO ","JPO ","JNS ","JO ","JPE ","JS "