10 ' Mini 6301 Assembler Using and programming the Epson HX-20 portable computer_(Eric Balkan (auth.))_1985 page 104-106
20 ' Original code Copyright 1981 Robert Labenski.
30 ' Enhancements Copyright 1983 Eric Balkan.
40 ' Original 6800 version first published in Byte 12/81
130 CLEAR 1000: DEFINT A-Z
135 'WIDTH 46,16
137 'SCROLL 9,0,8,4
140 DIM S$(160) 'Source Data
150 DIM NO$(156) 'Implied Operands
160 DIM OP$(41) 'Full Opcodes
170 DIM BR$(I7) 'Br inst
180 DIM OB$(16O) 'Object
190 DIM AD(16O) 'Address
200 DIM LA$(70) 'Source Labels LC=Index
210 DIM LN(70) 'Line # of Labels
220 DIM AR(80) 'Addr Resolution AC=Index
225 DIM EQ$(30) 'Equates
230 GOSUB 1550:GOTO 1200
240 RESTORE 'Assemble
250 LC=0: AC=0: CD=0:EQ=0
260 IF OT THEN 340 ELSE OT=1:GOTO 310
270 CD=0:FOR X=1 TO LEN(A$):Y=ASC (MID$(A$,X,1))
280 IF Y<=57 AND Y>=48 THEN Y=Y-48
290 IF Y>64 THEN Y=Y-55
300 CD=16*CD+ Y:NEXT:RETURN
305 'Build instr table
310 FOR A=0 TO 55:READ NO$(A):NEXT
320 FOR A=0 TO 40:READ OP$(A):NEXT
330 FOR A=0 TO 16:READ BR$(A):NEXT
340 OK=1 'Main assembly loop
350 FOR A=0 TO N-1
360 IF LEFT$(S$(A),1)="*" THEN OB$(A)=" ":AD(A)=CD:GOTO 450
370 IF MID$(S$(A),9,1)<>" , " THEN 400
380 AD(A)=CD
390 OB$(A)=" ":FOR B=1O TO 40;A$=MID$(S$(A),B,1):IF A$=" ' " THEN 450 ELSE Y=ASC(A$):X=0:A$=" ":GOSUB 950:0B$(A)=OB$(A)+A$:CD=CD+1:NEXT
400 A$=MID$(S$(A),9,4):IF LEN(A$)=3 THEN A$=A$+" "
410 IF A$="ORG" THEN A$=MID$(S$(A),18,4):OB$(A)=" ":GOSUB270:GOTO 450
420 IF LEFT$(S$(A),4)<> II II THEN LA$(LC)=LEFT$(S$(A),4):LN(LC)=A:LC=LC+1
425 IF A$="EQU " AND MID$(S$(A),17,1)=I$"THEN A$=MID$(S$(A),18,4):OB$(A)=" ":EQ$(EQ)=LEFT$(S$(A),4)+A$+"$":EQ=EQ+1:GOTO450 ELSE IF A$="EQU " THEN A$=MID$(S$(A),17,4):OB$(A)=" ":EQ$(EQ)=LEFT$(S$(A),4)+A$:EQ=EQ+1:GOTO 450
429 IF LEFT$(A$,3)="BIT" THEN 440
430 IF LEFT$(A$,1)="B" THENGOSUB 71O:GOTO 450
440 IF LEN(S$(A))<17 THENGOSUB 530 ELSE GOSUB 600
450 NEXT A
460 IF SW =0 THEN 520
470 FOR A=0 TO AC-1
475 FOR B=0 TO EQ-1:IF RIGHT$(OB$(AR(A)),4)<>LEFT$(EQ$(B),4) THEN NEXT ELSE OB$(AR(A)=LEFT$(OB$(AR(A)),LEN(OB$(AR(A)))-4 + MID$(EQ$(B),5,4):IF RIGHT$(EQ$(B),1)="$" THEN 510
480 FOR B=0 TO LC-1:IF RIGHT$(OB$(AR(A)),4)<>LA$(B) THEN NEXT ELSE 490
485 OB$(AR(A))="?Labl":GOT0510
490 IF MID$(S$(AR(A)),9,1)="B" THEN X=AD(AR(A)):Y=AD(LN(B)):AD(100)=Y-(X+2):C=100: GOSUB 940: OB$(AR(A=LEFT$(OB$(AR(A)),2) + RIGHT$(A$,2):GOTO 510
500 C=LN(B):GOSUB 94O:OB$(AR(A))=LEFT$(OB$(AR(A)),2) + "0" + A$
510 NEXT A
520 RETURN
530 ' Implied Operands
540 IF MID$(S$(A),9,1)="$" THEN OB$(A)=RIGHT$(S$(A),LEN(S$(A))-9:AD(A)=CD:CD=CD+LEN(S$(A))-9)/2:RETURN
550 FOR B=0 TO 55
560 IF LEFT$(NO$(B),4)A$ THEN OB$(A)="?INST": RETURN
570 OB$(A)=RIGHT$(NO$(B),2):AD(A)=CD:CD=CD+1:RETURN
580 NEXT
585 OB$(A)="?Inst":RETURN
600 ' Other OPs
610 AD(A)=CD
620 FOR B=O to 40
625 IF LEFT$(OP$(B),4)A$ THEN OB$(A)="?Inst":RETURN
645 IF MID$(OP$(B),2,2)="IM" THEN GOSUB 1800:RETURN
650 IF MID$(S$(A),20,2) = ",X" THEN OB$(A) = MID$(OP$(B), 10,2)+MID$(S$(A),18,2):CD=CD+2:RETURN
660 IF MID$(S$(A),17,1) = "#" THEN OB$(A) = MID$(OP$(B),6,2):OB$(A) = OB$(A)+MID$(S$(A),19,2): CD=CD+2: B$=LEFT$(OB$(A),2): IF B$<>"8C" AND B$<>"CE" AND B$<> "8E" THEN RETURN ELSE CD=CD+1:OB$(A)=OB$(A)+RIGHf$(S$(A),2):RETURN
670 IF MID$(S$(A),17,1)=" " THEN OB$(A)="?????":RETURN
680 IF MID$(S$(A),17,1)="$" THEN A$=MID$(S$(A),18,4) ELSE A$=MID$(S$(A),17,4):AR(AC)=A: AC=AC+1: SW=1:A$=A$+STRING$(4-(LEN(A$))," ")
690 IF LEN(A$)=4 THEN OB$(A)=MID$(OP$(B),12,2):OB$(A) = OB$(A) + A$:CD=CD+3:RETURN
700 OB$(A)=MID$(OP$(B),8,2):OB$(A)=OB$(A) + A$:CD=CD+2:RETURN
710
720 FOR B=0 TO 16
722 IF LEFT$(BR$(B),2) 1 THEN 810
775 IF N<0 THEN N=0
780 LINE INPUT S$(N)
790 IF S$(N)=" " THEN RETURN
800 N=N+1:GOTO 780
810 A=VAL (RIGHf$(A$,LEN(A$)-1)): IF A>N THEN 780
820 LINEINPUT A$
830 IF A$=" " THEN RETURN
840 FOR B=N+1 TO A STEP -1:IF B=0 THEN 850 ELSE S$(B)=S$(B-1):NEXT
850 S$(A)=A$:A=A+1:N=N+1:GOTO 820
860 IF LEN(A$)=1 THEN A=0:B=N-1:GOTO 900
880 A=VAL(RIGHT$(A$,LEN(A$)-1)):B=A
890 IF MID$(A$,3,1)="-" THEN B=VAL (MID$(A$,4,2))
895 IF MID$(A$,4,1)="-" THEN B=VAL (MID$(A$,5,2))
900 IF B>N THEN B=N-1
910 IF A>N-THEN A=N-1
915 IF A<0 THEN A=0
920 IF OK THEN FOR C=A TO B: GOSUB 940:PRINT C;TAB(4)A$;" ";OB$(C);TAB(18)S$(C) ELSE GOTO 930
926 IF B$="P" THEN LPRINT C;TAB(4)A$;" ";OB$(C);TAB(18)S$(C)
927 NEXT:RETURN
930 FOR C=A TO B:PRINT C;" ";S$(C):IF B$="P" THEN LPRINT C;" ";S$(C)
935 NEXT:RETURN
940 A$=" ":Y=AD(C):X=INT(Y/256):GOSUB 970
950 X=INT((Y-(X*256))/16):GOSUB 970
960 X=INT(Y-(INT(Y/16)*16))
970 IF X>9 AND X<16 THEN A$=A$+CHR$(X+55) ELSE A$=A$+RIGHT$(STR$(X),1)
980 RETURN
990 OK=0:LC=0:AC=0
1000 B=VAL(RIGHf$(A$,LEN(A$)-1))
1010 IF B>N THEN RETURN
1020 FOR C=B TO N-1:S$(C)=S$(C+1):NEXT
1030 N=N-1:RETURN
1040 'Symbol Print
1060 FOR A=0 TO LC-1:C=LN(A):GOSUB 940:PRINT LA$(A);" ";LN(A);" ";A$:
1070 NEXT:RETURN
1080 INPUT "L=Load S=Save ";B$
1100 IF(B$<>"S")*(B$<>"L") THEN RETURN
1110 INPUT" File Specs ";A$
1120 IF B$="S" THEN 1170
1130 OPEN "I",1,A$:INPUT#1,OK,N
1140 ' FOR A=0 TO N-1:INPUT #1,S$(A),OB$(A),AD(A):NEXT
1145 FOR A=0 TO N-1:INPUT#1,ZZ$,S$(A),ZZ$,ZZ$,OB$(A),ZZ$AD(A):NEXT
1150 CLOSE:RETURN
1160 PRINT "No Source":RETURN
1170 IF N=0 THEN 1160 ELSE OPEN "O",1,A$:PRINT#1,OK;N;
1180 FOR A=0 TO N-1:PRINT#1,CHR$(34);S$(A);CHR$(34);CHR$(34); OB$(A);CHR$(34);AD(A);:NEXT
1190 B$=" ":CLOSE:RETURN
1200 LINEINPUT "Ready* ";A$:B$=LEFT$(A$,1)
1220 IF B$="L" OR B$="P" THEN GOSUB 860
1230 IF B$="I" THEN GOSUB 760
1240 IF B$="D" THEN GOSUB 990
1250 IF B$="C" THEN INPUT "Sure (Y/N)";Z$:IF Z$="Y" THEN 130
1260 IF B$="A" THEN GOSUB 240
1270 IF B$="F" THEN GOSUB 1080
1280 IF B$="S" THEN GOSUB 1040
1290 IF B$="H" THEN GOSUB 1550
1293 IF B$="?" THEN GOSUB 1550
1295 IF B$="E" THEN GOSUB 1610
1297 IF B$="M" THEN GOSUB 1900
1300 GOTO 1200
1301 'Implied Operands
1315 DATA ABA 1B,ABX 3A,ASLA 48,ASLB 58,ASLD 05,ASRA 47,ASRB 57
1320 DATA CLC 0C,CLI 0E,CLRA 4F,CLRB 5F,CLV 0A,COMA 43,COMB 53
1322 DATA DAA 19,DECA 4A,DECB 5A,DES 34,DEX 09,INCA 4C,INCB 5C,INS 31,INX 08
1325 DATA LSRA 44,LSRB 54,LSRD 04,MUL 3D,NOP 01
1340 DATA PSHA 36,PSHB 37,PSHX 3C,PULA 32,PULB 33,PULX 38,ROLA, 49,ROLB 59,RORA 46,RORB 56,RTI 3B,RTS 39
1360 DATA SBA 10,SEC OD,SEI OF,SEV OB,SLP lA,SWI 3F, TAB 16,TAP 06,TBA 17,TPA 07,TSTA 4D,TSTB 5D,TSX 3O,TXS 35,WAI 3E,XGDX 18
1420 ' Other Operands
1430 DATA ADDA 8B9BABBB,ADDB CBDBEBFB,ADCA 8999A9B9,ADCB C9D9E9F9,ADDD C3D3E3F3
1440 DATA AIM ??7161??,ANDA 8494A4B4,ANDB C4D4E4F4,BITA 8595A5B5,BITB C5D5E5F5
1450 DATA CLR ????6F7F,CMPA 8191A1B1,CMPB C1D1E1F1,CPX 8C9CACBC, DEC ????6A7A, EIM ??7565??,EORA 8898A8B8,EORB C8D8E8F8,INC ????6C7C
1455 DATA JMP ????6E7E,JSR ??9DADBD
1460 DATA LDAA 8696A6B6,LDAB C6D6E6F6,LDD CCDCECFC,LDS 8E9EAEBE,LDX CEDEEEFE,OIM ??7262??,ORAA 8A9AAABA,ORAB CADAEAFA
1470 DATA SBCA 8292A2B2,SBCB C2D2E2F2
1505 DATA STAA ??97A7B7,STAB ??D7E7F7,STD ??DDEDFD,STS ??9FAFBF, STX ??DFEFFF,SUBA 8090A0B0,SUBB C0D0E0F0,SUBD 8393A3B3,TIM ??7B6B??,TST ????6D7D
1530 ' Branch Instructions
1540 DATA CC24,CS25,EQ27,GE2C,GT2E,HI22,LE2F,LS23,LT2D,M12B,NE26,PL2A,RA20,RN21,SR80,VC28,VS29
1550 ' Operator's Guide
1560 CLS:PRINT "H=Help (This Page)"
1562 PRINT "F=File (Save/Load)"
1570 PRINT "I=Insert"
1572 PRINT "Ixx=Insert before L#xx"
1580 PRINT "Dxx=Delete Line#xx"
1582 PRINT "C=Clear"
1590 PRINT "L=List all text"
1592 PRINT "Lxx=List Line#xx"
1594 PRINT "Lxx-xx=List Range"
1596 PRINT "P=Print Text"
1600 PRINT" A=Assemble"
1605 PRINT "S=Symbol Display"
1606 PRINT "M=Put Obj in Memory"
1608 PRINT "E=Examples"
1609 RETURN
1610 PRINT "Instruction Examples"
1620 PRINT "Immed (ADDA #$IA)"
1630 PRINT "Direct (ADDA $IA)"
1640 PRINT "Indxd (ADDA $IA,X)"
1650 PRINT "Extnd (ADDA $0A40)"
1660 PRINT "Implied - No Operand"
1665 PRINT "Other (OIM $10,#$01)"
1666 PRINT "' (OIM $10,X,#$01)"
1668 PRINT "LBL1 EQU LBL2"
1669 PRINT "LBL1 EQU $XXXX"
1670 PRINT "ORG $XXXX"
1672 PRINT "Literals $XX For Hex"
1674 PRINT " 'XX' For ASCII"
1680 PRINT "Source is Positional"
1682 PRINT "(Use Tabs)"
1690 PRINT "LABEL t OP t OPERAND"
1695 RETURN
1800 ' 3-Operand Instructions
1810 IF MID$(S$(A),20,2)=",X" THEN OB$(A)=MID$(OP$(B),10,2) + MID$(S$(A),25,2)+MID$(S$(A),18,2):CD=CD+3:GOTO 1830
1820 OB$(A)=MID$(OP$(B),8,2)+ MID$(S$(A),23,2) + MID$(S$(A),18,2):CD=CD+3
1830 RETURN
1900 FOR C=O TO N-1
1910 GOSUB 940
1920 IF OB$(C)=" " THEN 1950
1925 FOR LL=O TO LEN (OB$(C))/2-1
1927 GOSUB 2000
1930 POKE AD(C)+LL,B
1940 NEXT LL
1950 NEXT C
1960 RETURN
2000 CB$="0123456789ABCDEF"
2005 B=O
2030 FOR CX=1 TO 16
2040 IF MID$(OB$(C),2*LL+1,1)=MID$(CB$,CX,1) THEN B=(CX-1)*16:GOTO 2055
2050 NEXT CX
2055 FOR CX=1 TO 16
2060 IF MID$(OB$(C),2*LL+2,1)=MID$(CB$,CX,1) THEN B=(CX-1)+B:GOTO 2080
2070 NEXT CX
2080 RETURN