[net.sources] GW-BASIC 68000 cross-assembler

richardt@orstcs.UUCP (richardt) (10/25/85)

Okay, folks, here it is:  The great and glorious (:-)) 68000 cross-assembler.
Its written in Vanilla basic and will run straight on an IBM (although it
will look a wee bit strange).  

Some notes:  This is only the first pass of the assembler.  People working
on writing the second pass should mail me and I'll make vague passes at 
coordinating the effort.  You'll also need a 68000 maunal with the bit
patterns for the opcodes if you're going to write the second pass.
Also, the screen control codes (originally written for a C64) need to
be filled in.  Right now, they are in print statements as "<bs>" and other
similar symbols.  There is also one Locate which will need to be changed if
you plan to port the program top a non-IBM machine.
About the "\" character:  This is used by the display routines and is a
special character which ends a display command.  A display command is started
with an @ sign.  Be careful with both of these characters.  BTW, I would
suggest that both of them be changed to something which is unprintable.
However, do this after downloading the program.  Kermit at the very least
won't like whatever characters you substitute.  TI$ is a system variable
which should be changed to your machines real time clock -- on some machines
this is time$.  If you have any problems, mail me and I'll try to explain
the twisted internal logic which the program is based on.

This is an ascii file.  It should be saved and this header lopped off.  It
can then be ported to your micro, or you can do the header lopping on the
micro if you have EDLIN or some reasonable facsimile.
				orstcs!richardt
				"The Apparition"
"And now for something ***COMPLETELY*** different: A debugged program"
------------------------------------cut here------------------------------------

5 NULL$ = CHR$(0) :print "<clear><11 dn>","PLEASE WAIT" : TI$ = "000000" : PRINT ,
10 DIM CD$(7) : FOR Y = 0 TO 7 : FOR X = 1 TO 255 : CD$(Y) = CD$(Y) + NULL$ : NEXT
11 PRINT TI$;"<6 bs>"; : NEXT
12 DEF FN C(V) = VAL(MID$(EN$(V), X, 1))
13 DEF FN H(X) = X - 48 + 7 * ((X - 48)>9)
14 DEF FN V(V) = VAL(MID$(EN$(V), X - Y + 1, Y - 1))
15 DIM ED$(200) : FOR X = 1 TO 200 : ED$(X) = "@VPN\" : NEXT
16 DIM LA$(100), LA(100)
17 LN = 1 : GOTO 100
18 FOR X = 1 TO LEN(ED$(PN)) : Y = 0
19 IF MID$(ED$(PN), X, 1) <> "@" THEN PRINT MID$(ED$(PN), X, 1); : NEXT : RETURN
20 X = X + 1 : OP$ = MID$(ED$(PN), X, 1) : IF OP$ <> "R" THEN 26
21 X$ = "@" : GOSUB 98
22 C = FN C(PN) : Y = 0
23 X$ = "@" : GOSUB 98
24 C$ = MID$(ED$(PN), X - Y + 1, Y - 1)
25 FOR Y = 1 TO C : PRINT C$; : NEXT Y, X : RETURN
26 IF OP$ <> "V" THEN 30
27 X$ = "\" : GOSUB 98 : X$ = MID$(ED$(PN), X - Y + 1, Y - 1)
28 IF X$ = "PN" THEN PRINT PN; : NEXT : RETURN
29 IF X$ = "EN" THEN C = 49 - POS(0) : C$ = " " : GOTO 25
30 IF OP$ <> "C" THEN 32
31 X = X + 1 : COLOR FN C(PN) : NEXT : RETURN
32 IF OP$ <> "T" THEN 35
33 X$ = "@" : GOSUB 98
34 PRINT TAB(FN V(PN)); : NEXT : RETURN
35 IF OP$ <> "^" THEN 37
36 PRINT : NEXT : RETURN
37 IF OP$ <> "P" THEN NEXT : RETURN
38 X$ = ", " : GOSUB 98
39 C = FN V(PN) : Y = 0
40 X$ = "!" : GOSUB 98
41 C1 = FN V(PN)
42 PRINT "<home>; : FOR C2 = 1 TO C : PRINT "<left>" : NEXT
43 FOR C2 = 1 TO C1 : PRINT "<down>"; : NEXT
50 NEXT : RETURN
51 REM INLINE
52 print " : "; : pn ln : gosub 18 : print "$<bs>";
53 FOR XL = 1 TO 80
54 GET A$ : IF A$ = "" THEN 54
55 OP = ASC(A$) : IF OP<32 THEN 57
56 LOCATE ,,,0 : PRINT " ";CHR$(8); ED$(LN) = ED$(LN) + A$ : PRINT A$;"$<bs>"; : NEXT : GOTO 112
57 PRINT A$;"$<bs>"; : IF OP = 13 THEN PRINT "  " : ED$(PN) = ED$(PN) + " " : XL = 81 : GOTO 112
58 IF OP = 29 THEN A$ = MID$(ED$(PN), X, 1) : GOTO 56
59 IF OP = 20 THEN ED$(PN) = LEFT$(ED$(PN), LEN(ED$(PN)) - 1) : XL = XL - 2 : NEXT : GOTO 112
60 IF OP = 19 THEN XL = 81 : GOTO 115
61 XL = XL - 1 : NEXT : GOTO 112
95 X = X + 1 : Y = Y + 1 : CK$ = MID$(C$, X, 1) : IF CK$ <> X$ AND X<LEN(C$) AND CK$ <> ";" THEN 95
96 X% = (X = LEN(C$)) : RETURN
98 C$ = ED$(PN) : GOTO 95
100 REM DISPLAY LOOP
105 PRINT "<clear>LINE : ";LN
106 FOR PN = LN - 10 TO LN + 10
107 IF PN<1 THEN PRINT : NEXT : GOTO 52
108 IF PN = LN THEN PRINT " * ";
109 GOSUB 18 : PRINT : NEXT
110 GOTO 52
112 LN = LN + 1 : GOTO 105
115 REM COMMAND ENTRY
116 PRINT "<clear>COMMAND MODE" : PRINT "<down>"; : INPUT "COMMAND : ";C$ : X = 0
117 O2 = 0 : X$ = " " : GOSUB 95 : M$ = LEFT$(C$, 1)
118 IF X% THEN 500
119 O1 = X : X$ = " - " : GOSUB 95 : IF X% THEN 121
120 O2 = VAL(MID$(C$, X + 1))
121 O1 = VAL(MID$(C$, O1))
122 IF M$ = "M" THEN 130
123 IF M$ = "D" THEN 137
124 IF M$ = "I" THEN 143
125 IF M$ = "P" THEN 175
126 IF M$ = "S" THEN 190
127 IF M$ = "L" THEN 205
128 IF M$ = "W" THEN 220
129 PRINT "<reverse><white>", , "INVALID COMMAND" : FOR X = 1 TO 500 : NEXT : GOTO 116
130 IF O2 = 0 THEN LN = O1 : GOTO 100
131 IF (O2 - O1)<21 THEN LN = INT(O1 + (O2 - O1)/2 + .5) : GOTO 500
132 FOR PN = O1 TO O2
133 IF PN = LN THEN PRINT " * ";
134 GOSUB 18 : PRINT : FOR Z = 1 TO 150 : NEXT Z, PN
135 INPUT "RETURN TO ENTER MODE";C$
136 GOTO 100
137 IF O2 = 0 THEN O2 = O1
138 O2 = O2 + 1 : DI = O2 - O1 : FOR X = O2 TO 200
139 ED$(X - DI) = ED$(X) : NEXT
140 FOR X = 200 - DI TO 200
142 ED$(X) = "@VPN\" : NEXT : GOTO 100
143 IF O2 = 0 THEN O2 = O1
144 O2 = O2 + 1 : DI = O2 - O1 : FOR X = 200 - DI TO O1 STEP - 1
145 ED$(X + DI) = ED$(X) : NEXT
146 FOR X = O1 TO O2 - 1 : ED$(X) = "@VPN\" : NEXT
147 GOTO 100
400 X = 2 : X$ = "\" : GOSUB 98 : Y = 0 : X$ = " " : GOSUB 98 : IF Y>5 OR Y<2 THEN LABEL$ = "" : GOTO 406
402 LABEL$ = MID$(ED$(PN), X - Y + 1, Y - 1)
404 PRINT LABEL$, CP
406 IF LABEL$ <> "" THEN LA$(LP) = LABEL$ : LA(LP) = CP : LP = LP + 1
407 IF LEN(MN$) = 3 AND LEFT$(MN$, 1) = "B" THEN CP = CP + 1 - (SZ$ = "L")
408 CP = CP - (MN$ = "ABCD") - (MN$ = "ADDQ") - (MN$ = "ADDX") - (MN$ = "CMPM") - (MN$ = "EXG")
409 CP = CP - (MN$ = "EXT") - (MN$ = "ILLEGAL") - (MN$ = "MOVEQ") - (MN$ = "NOP") - (MN$ = "RESET")
410 CP = CP - (MN$ = "RTE") - (MN$ = "RTR") - (MN$ = "RTS") - (MN$ = "SBCD") - (MN$ = "SUBQ")
411 CP = CP - (MN$ = "SUBX") - (MN$ = "SWAP") - (MN$ = "TRAP") - (MN$ = "TRAPV") - (MN$ = "UNLK")
412 CP = CP - (RIGHT$(MN$, 1) = "I") * (2 - (SZ$ = "L"))
413 CP = CP - 2 * ((LEFT$(MN$, 2) = "DB") + (MN$ = "LINK") + (MN$ = "MOVEC") + (MN$ = "MOVEM"))
414 CP = CP - 2 * ((MN$ = "MOVEP") + (MN$ = "RTD") + (MN$ = "STOP"))
415 IF MN$ = "EQU" THEN GOSUB 700 : LA(LP - 1) = A : RETURN
416 IF MN$ = "END" THEN RETURN
417 IF MN$ = "DFS" THEN GOSUB 700 : CP = CP + A : RETURN
418 IF LEFT$(MN$, 2) = "DF"THEN GOSUB 875 : CP = CP + A : RETURN
419 X = 0 : X$ = "CCR" : GOSUB 98 : IF NOT X% THEN CP = CP + 2 : RETURN
420 X = 0 : X$ = "#" : GOSUB 98 : IF NOT X% THEN CP = CP + 1 - (SZ$ = "L")
421 X = 0 : X$ = "SR" : GOSUB 98 : IF NOT X% THEN CP = CP + 2 : RETURN
422 X = 0 : X$ = "USP" : GOSUB 98 : IF NOT X% THEN CP;CP + 1 : RETURN
423 X = 0 : X$ = " " : GOSUB 98 : GOSUB 98 : GOSUB 98 : AF = X + 1 : FP = 0
424 X$ = ") + " : GOSUB 98 : IF NOT (X% OR FP) THEN FP = - 1 : AF = X + 3 : GOTO 424
425 X = AF : X$ = " - (" : GOSUB 98 : IF NOT (X% OR FP) THEN FP = - 1 : AF = X + 6 : GOTO 424
426 X = AF : X$ = "(PC)" : GOSUB 98 : IF NOTX%THENCP = CP + 1 : IF NOTFPTHENFP = - 1 : AF = X + 5 : GOTO 424
427 X = AF : X$ = "(PC, " : GOSUB 98 : IF NOTX%THENCP = CP + 1 : IF NOTFPTHENFP = - 1 : AF = X + 10 : GOTO 424
428 X = AF : X$ = "(A" : GOSUB 98 : IF X% THEN 432
429 X = X + 2 : CP = CP - (MID$(EN(PN), X, 1) = ")") - (MID$(EN$(PN), X, 1) = ", ") : X = X + 2 : AF = AF + 4
430 IF MID$(EN$(PN), X - 1, 1) <> ", " THEN AF = AF + 6
431 IF NOT FP THEN FP = - 1 : GOTO 424
432 X = AF : X$ = "(A" : GOSUB 98 : IF NOT (X% OR FP) THEN FP = - 1 : AF = AF + 5 : GOTO 424
433 X = AF : A$ = "A" : GOSUB 98 : IF NOT (X% OR FP) THEN FP = - 1 : AF = AF + 3 : GOTO 424
434 X = AF : X$ = "D" : GOSUB 98 : IF NOT (X% OR FP) THEN FP = - 1 : AF = AF + 3 : GOTO 424
435 X = AF : X$ = ".W" : GOSUB 98 : IF NOTX%THENCP = CP + 1 : IF NOTFPTHENAF = AF + 3 : GOTO 424
436 X = AF : X$ = ".L" : GOSUB 98 : IF NOTX%THENCP = CP + 2 : IF NOTFPTHENAF = AF + 3 : GOTO 424
437 CP = CP + 1 : RETURN
450 V% = 0 : X = 0 : Y = 0 : X$ = ";" : GOSUB 98 : IF (X<8) AND (NOT X%) THEN V% = - 1 : F% = - 1 : RETURN
451 X = 0 : Y = 0 : X$ = " " : GOSUB 98 : Y = 0 : GOSUB 98
452 MN$ = MID$(ED$(PN), X - Y + 1, Y - 1) : PRINT ED$(PN), MN$
453 IF MN$ = "ORG" THEN O% = - 1 : GOSUB 700 : CP = A
454 IF NOT O% THEN E% = 0 : V% = - 1 : RETURN
455 IF LEN(MN$)>3 THEN 460
456 V% = (MN$ = "ORG") + (MN$ = "OBJ") + (MN$ = "EQU") + (MN$ = "END") + (MN$ = "DFB") + (MN$ = "EXG")
457 V% = V% + (MN$ = "DFW") + (MN$ = "DFL") + (MN$ = "DFS") + (MN$ = "LEA") + (MN$ = "PEA") : E% = 1
458 V% = V% + (MN$ = "JMP") + (MN$ = "JSR") + (MN$ = "NOP") + (LEFT$(MN$, 1) = "S")
459 V% = V% + (MN$ = "RTD") + (MN$ = "RTE") + (MN$ = "RTR") + (MN$ = "RTS") + (MN$ = "TAS") : RETURN
460 SZ$ = "W" : SZ$ = MID$(ED$(PN), X, 1)
461 MN$ = LEFT$(MN$, LEN(MN$) - 2) : V = 0
462 V = (LEFT$(MN$, 1) = "B") * - (LEN(MN$) = 3) * - ((SZ$ = "S") + (SZ$ = "L"))
463 V = V + (MN$ = "ABCD") * - (SZ$ = "B")
464 V = V + (MN$ = "ADD") + (MN$ = "ADDI") + (MN$ = "ADDQ") + (MN$ = "ADDX")
465 V = V + (MN$ = "ADDA") * - (SZ$ <> "B")
466 V = V + (MN$ = "AND") + (MN$ = "ANDI")
467 V = V + (MN$ = "ASL") + (MN$ = "ASR")
468 V = V + (MN$ = "BTST") * - (SZ$ = "W")
469 V = V + (MN$ = "BSR") * - ((SZ$ = "S") + (SZ$ = "L"))
470 V = V + (MN$ = "BSET") * - (SZ$ <> "W")
471 V = V + (MN$ = "BRA") * - ((SZ$ = "S") + (SZ$ = "L"))
472 V = V + (MN$ = "BCLR") * - (SZ$ <> "W")
473 V = V + (MN$ = "BCHG") * - (SZ$ <> "W")
474 V = V + (MN$ = "CHK") * - (SZ$ = "W") + (MN$ = "ROR") + (MN$ = "ROXL") + (MN$ = "ROXR")
475 V = V + (MN$ = "CLR") + (MN$ = "OR") + (MN$ = "ORI") + (MN$ = "RESET") + (MN$ = "ROL")
476 V = V + (MN$ = "CMP") + (MN$ = "CMPI") + (MN$ = "CMPM") + (MN$ = "SBCD")
477 V = V + (MN$ = "CMPA") * - (SZ$ <> "B")
478 V = V + (LEFT$(MN$, 1) = "D") * - (SZ$ = "W")
479 V = V + (MN$ = "EOR") + (MN$ = "EORI")
480 V = V + (MN$ = "EXT") * - (SZ$ <> "B")
481 V = V + (MN$ = "ILLEGAL") + (MN$ = "LINK")
482 V = V + (MN$ = "LSL") + (MN$ = "LSR")
483 V = V + (MN$ = "MOVE") + (MN$ = "MOVEC") + (MN$ = "MOVEQ") + (MN$ = ""MOVES")
484 V = V + ((MN$ = "MOVEA") + (MN$ = "MOVEM") + (MN$ = "MOVEP")) * - (SZ$ <> "B")
485 V = V + ((MN$ = "MULU") + (MN$ = "MULS")) * - (SZ$ = "W") + (MN$ = "SWAP")
486 V = V + (MN$ = "NBCD") + (MN$ = "NEG") + (MN$ = "NEGX") + (MN$ = "NOT")
487 V = V + (MN$ = "SUB") + (MN$ = "SUBI") + (MN$ = "SUBQ") + (MN$ = "SUBA") * - (SZ$ <> "B")
488 V = V + (MN$ = "TRAP") + (MN$ = "TRAPV") + (MN$ = "UNLK")
489 V% = V : E% = 2 : LN = PN
490 RETURN
500 IF C$ <> "A" THEN END
505 REM PASS ONE
506 E% = 0 : PN = 1 : LP = 1
507 IF ED$(PN) = "@VPN\" THEN 514
508 GOSUB 450 : IF NOT V% THEN 800 : 
510 IF NOT F% THEN GOSUB 400 : IF NOT V% THEN 800 : 
512 IF MN$ = "END") THEN 516
514 PN = PN + 1 : GOTO 508
516 PRINT "END OF PASS ONE"
518 PN = 1 : CP = 0
519 IF ED$(PN) = "@VPN\" THEN PN = PN + 1 : GOTO 519
520 GOSUB 550 : IF NOT V% THEN 800
521 IF F% THEN GOTO 528
522 GOSUB 600 : IF NOT V% THEN 800
524 GOSUB 650 : IF NOT V% THEN 800
526 GOSUB 700 : IF NOT V% THEN 800
528 IF MN$ <> "END" THEN PN = PN + 1 : GOTO 519
530 PRINT "ASSEMBLY COMPLETE"
532 GOTO 116
700 Y = 0 : X$ = ";" : GOSUB 98 : IF NOT X% THEN C$ = MID$(ED$(PN), X - Y + 1, Y - 1) : GOTO 704
702 C$ = MID$(ED$(PN), X - Y + 1)
704 Y = 0 : GOSUB 98 : C1$ = MID$(ED$(PN), X - Y + 1, Y - 1)
706 FOR X = 1 TO LEN(C1$) : C$ = MID$(C1$, X, 1) : GOSUB 900 : NEXT : RETURN
720 REM TRY HEX DATA
722 X = 0 : Y = 0 : X$ = "$" : GOSUB 98 : IF X% THEN 730 : REM NADA, DECIMAL, OR OCTAL
724 Y = 0 : C = X : X$ = ", " : GOSUB 98 : IF NOT X% THEN 728
726 Y = 0 : X = C : X$ = " " : GOSUB 98
728 Y = Y - 1 : A = 0 : FOR Z = X - Y + 1 TO X - 1 : A = A * 16 + FN H(ASC(MID$(ED$(PN), Z, 1))) : NEXT
729 RETURN
900 PP% = (CP - OR)/255 : OP% = (CP - OR) - PP% * 255
901 CD$(PP%) = MID$(CD$(PP%), 1, OP% - 1) + C$ + MID$(CD$(PP%), OP% + 1)
902 CP = CP + 1 : RETURN
905 PP% = (CP - OR)/255 : OP% = (CP - OR) - PP% * 255
906 CD$(PP%) = MID$(CD$(PP%), 1, OP% - 1) + CHR$(C) + MID$(CD$(PP%), OP% + 1)
907 CP = CP + 1 : RETURN