home *** CD-ROM | disk | FTP | other *** search
Wrap
10 REM ********1.9.85******** 20 REM * BASIC.ASSEMBLER * 30 REM * BY JOHN WHITNEY * 40 REM * COPYRIGHT (C) 1984 * 50 REM * BY MICROSPARC, INC * 60 REM * LINCOLN, MA. 01773 * 65 REM * BASIC.ASSEMBLER * 66 REM * MODIFICATIONS BY * 67 REM * ALBERT BAKER * 70 REM ********************** 80 DATA ADC,0,109,101,105,125,121,97,113,117,0,0,0 90 DATA AND,0,45,37,41,61,57,33,49,53,0,0,0 100 DATA ASL,10,14,6,0,30,0,0,0,22,0,0,0 110 DATA BCC,0,0,0,0,0,0,0,0,0,0,144,0 120 DATA BCS,0,0,0,0,0,0,0,0,0,0,176,0 130 DATA BEQ,0,0,0,0,0,0,0,0,0,0,240,0 140 DATA BIT,0,44,36,0,0,0,0,0,0,0,0,0 150 DATA BMI,0,0,0,0,0,0,0,0,0,0,48,0 160 DATA BNE,0,0,0,0,0,0,0,0,0,0,208,0 170 DATA BPL,0,0,0,0,0,0,0,0,0,0,16,0 180 DATA BRK,0,0,0,0,0,0,0,0,0,0,0,0 190 DATA BVC,0,0,0,0,0,0,0,0,0,0,80,0 200 DATA BVS,0,0,0,0,0,0,0,0,0,0,112,0 210 DATA CLC,24,0,0,0,0,0,0,0,0,0,0,0 220 DATA CLD,216,0,0,0,0,0,0,0,0,0,0,0 230 DATA CLI,88,0,0,0,0,0,0,0,0,0,0,0 240 DATA CLV,184,0,0,0,0,0,0,0,0,0,0,0 250 DATA CMP,0,205,197,201,221,217,193,209,213,0,0,0 260 DATA CPX,0,236,228,224,0,0,0,0,0,0,0,0 270 DATA CPY,0,204,196,192,0,0,0,0,0,0,0,0 280 DATA DEC,0,206,198,0,222,0,0,0,214,0,0,0 290 DATA DEX,202,0,0,0,0,0,0,0,0,0,0,0 300 DATA DEY,136,0,0,0,0,0,0,0,0,0,0,0 310 DATA EOR,0,77,69,73,93,89,65,81,85,0,0,0 320 DATA INC,0,238,230,0,254,0,0,0,246,0,0,0 330 DATA INX,232,0,0,0,0,0,0,0,0,0,0,0 340 DATA INY,200,0,0,0,0,0,0,0,0,0,0,0 350 DATA JMP,0,76,0,0,0,0,0,0,0,0,0,108 360 DATA JSR,0,32,0,0,0,0,0,0,0,0,0,0 370 DATA LDA,0,173,165,169,189,185,161,177,181,0,0,0 380 DATA LDX,0,174,166,162,0,190,0,0,0,182,0,0 390 DATA LDY,0,172,164,160,188,0,0,0,180,0,0,0 400 DATA LSR,74,78,70,0,94,0,0,0,86,0,0,0 410 DATA NOP,234,0,0,0,0,0,0,0,0,0,0,0 420 DATA ORA,0,13,5,9,29,25,1,17,21,0,0,0 430 DATA PHA,72,0,0,0,0,0,0,0,0,0,0,0 440 DATA PHP,8,0,0,0,0,0,0,0,0,0,0,0 450 DATA PLA,104,0,0,0,0,0,0,0,0,0,0,0 460 DATA PLP,040,0,0,0,0,0,0,0,0,0,0,0 470 DATA ROL,42,46,38,0,62,0,0,0,54,0,0,0 480 DATA ROR,106,110,102,0,126,0,0,0,118,0,0,0 490 DATA RTI,64,0,0,0,0,0,0,0,0,0,0,0 500 DATA RTS,96,0,0,0,0,0,0,0,0,0,0,0 510 DATA SBC,0,237,229,233,253,249,225,241,245,0,0,0 520 DATA SEC,56,0,0,0,0,0,0,0,0,0,0,0 530 DATA SED,248,0,0,0,0,0,0,0,0,0,0,0 540 DATA SEI,120,0,0,0,0,0,0,0,0,0,0,0 550 DATA STA,0,141,133,0,157,153,129,145,149,0,0,0 560 DATA STX,0,142,134,0,0,0,0,0,0,150,0,0 570 DATA STY,0,140,132,0,0,0,0,0,148,0,0,0 580 DATA TAX,170,0,0,0,0,0,0,0,0,0,0,0 590 DATA TAY,168,0,0,0,0,0,0,0,0,0,0,0 600 DATA TSX,186,0,0,0,0,0,0,0,0,0,0,0 610 DATA TXA,138,0,0,0,0,0,0,0,0,0,0,0 620 DATA TXS,154,0,0,0,0,0,0,0,0,0,0,0 630 DATA TYA,152,0,0,0,0,0,0,0,0,0,0,0 635 LO = PEEK(106) *256 + PEEK(105):HI = PEEK(116) *256 + PEEK(115) 640 HOME : VTAB 22: PRINT "** COPYRIGHT 1984 BY MICROSPARC, INC. **" 650 VTAB 3: INVERSE : PRINT "BASIC ASSEMBLER": NORMAL : PRINT 660 GOSUB 2350 670 CALL -958 680 SA = 36864 690 HIMEM: 35840 700 D$ = CHR$(4): VTAB 7: CALL -958: INPUT "SOURCE FILE TO LOAD: ";PR$: IF LEN(PR$) = 0 OR LEN(PR$) >15 OR VAL(PR$) >0 THEN 700 710 ONERR GOTO 730 720 PRINT D$"VERIFY";PR$: PRINT D$"OPEN";PR$: PRINT D$"READ";PR$: POKE 216,0: GOTO 740 730 POKE 216,0: PRINT CHR$(7)"THAT FILE IS NOT ON THIS DISK.": PRINT "PRESS ANY KEY TO CONTINUE.": GET K$: PRINT : GOTO 700 740 INPUT IN$: IF MID$ (IN$,10,3) = "EOF" THEN PRINT D$"CLOSE": GOTO 780 750 NI = NI +1 760 IF LEFT$(IN$,8) < >" " THEN NL = NL +1 770 GOTO 740 780 DIM OP(56,12),OP$(56) 790 DIM IN$(NI),MD(NI),LB$(NI),TP$(NI),LN(NI),LO(NI +1) 800 DIM LF$(NL),AF(NL),LR$(NL),DR(NL) 810 RESTORE 820 VTAB 12: CALL -958: PRINT "FIRST PASS:" 830 PRINT D$"OPEN"PR$: PRINT D$"READ "PR$ 840 INPUT LA$: IF MID$ (LA$,10,3) < >"ORG" OR LEN(LA$) <14 THEN PRINT : PRINT D$"CLOSE "PR$: PRINT CHR$(7): PRINT "SOURCE CODE MUST BEGIN WITH 'ORG'": GOTO 2270 850 N = 1:HX$ = MID$ (LA$,14): IF LEFT$(HX$,1) = "$" THEN GOSUB 2580:LA = DT: GOTO 870 860 LA = VAL(HX$) 870 FOR N = 2 TO NI 880 INPUT IN$:IN$ = LEFT$(IN$,29) 882 VTAB 12: HTAB 13: PRINT N: CALL -868: PRINT IN$ 885 IF LEFT$(IN$,1) = "*" THEN LO(N) = AD:IN$(N) = "*": GOTO 950: REM IGNORE LINES STARTING WITH "*" 890 IF LEN(IN$) >14 THEN HX$ = MID$ (IN$,14): GOSUB 2580:IN$ = LEFT$(IN$,13) +HX$ 900 REM THIS LINE INTENTIONALLY DELETED 910 IN$ = LEFT$(IN$ +" ",41) 920 REM THE ABOVE STATEMENT HAS 41 SPACES BETWEEN THE QUOTES 930 IF LEFT$(IN$,8) < >" " THEN GOSUB 1110 940 GOSUB 1280 950 NEXT 960 PRINT D$"CLOSE "PR$ 970 LO(NI +1) = AD 980 GOSUB 1690 990 VTAB 14: CALL -958: PRINT "SECOND PASS:" 1000 FOR N = 2 TO NI 1010 VTAB 14: HTAB 13: PRINT N 1020 GOSUB 1750 1030 NEXT 1040 PRINT : PRINT "ASSEMBLY COMPLETE": PRINT :L = LO(N -1) +LN(N -1) 1050 IF LA +L <HI AND (LO <(LA)) THEN 1090 1060 IF LA +L <LO AND LA >2049 THEN PRINT "OBJECT CODE MAY OVERLAP BASIC ASSEMBLER": PRINT "BASIC ASSEMBLER WILL BE CLEARED.": GOTO 1090 1070 IF LA <2049 THEN 1090 1080 PRINT "OBJECT CODE OVERLAPS DOS. YOU MUST": PRINT "RE-LOCATE IT FROM THE PRESENT LOCATION": PRINT "ADDRESS: ";SA: PRINT "LENGTH: ";L: END 1090 PRINT "SAVING ";PR$;".OBJ,A";LA;",L";L: PRINT D$"OPEN B.A.TEMP": PRINT D$"CLOSE": PRINT D$"DELETE B.A.TEMP": PRINT D$"OPEN B.A.TEMP": PRINT D$"WRITE B.A.TEMP": PRINT "BSAVE ";PR$;".OBJ,A";SA;",L";L 1100 PRINT "BLOAD ";PR$;".OBJ,A"LA: PRINT "BSAVE ";PR$;".OBJ,A";LA;",L";L 1102 IF (LA >2049 AND LA +L <LO) THEN PRINT "FP" 1105 PRINT D$"CLOSE": PRINT : PRINT "PRINT A PROGRAM LISTING? (Y/N) ==> ";: GET IN$: PRINT IN$: IF IN$ = "Y" THEN GOSUB 10000 1107 PRINT D$"EXEC B.A.TEMP": END 1110 REM PROCESS LABELS 1120 FOR P = 1 TO 8 1130 IF MID$ (IN$,P,1) = " " THEN 1150 1140 NEXT 1150 P = P -1 1160 IF MID$ (IN$,10,3) < >"EQU" THEN 1240 1170 NF = NF +1 1180 LF$(NF) = LEFT$(IN$,P) 1190 AF(NF) = VAL( MID$ (IN$,14, LEN(IN$) -13)) 1200 XL = LEN( STR$(AF(NF))) +14 1210 IF XL > = LEN(IN$) THEN 1270 1220 IF MID$ (IN$,XL,1) = "!" THEN XA = AF(NF): GOSUB 2500 1230 GOTO 1270 1240 NR = NR +1 1250 LR$(NR) = LEFT$(IN$,P) 1260 DR(NR) = AD +LA 1270 RETURN 1280 REM PROCESS LENGTH 1290 P = 14 1300 IN$(N) = MID$ (IN$,10,3) 1310 LO(N) = AD 1315 IF IN$(N) = "ASC" THEN GOSUB 2800: GOTO 1670 1320 IF IN$(N) = "EQU" THEN 1680 1330 IF IN$(N) = "DRS" THEN LN(N) = VAL( MID$ (IN$,14)): GOSUB 2300: GOTO 1670 1340 IF MID$ (IN$,14,1) = " " THEN MD(N) = 1: GOTO 1460 1350 P = 15 1360 IF MID$ (IN$,P,1) < >" " AND MID$ (IN$,P,1) < >"," AND MID$ (IN$,P,1) < >")" THEN P = P +1: GOTO 1360 1365 IF IN$(N) = "HEX" THEN LB$(N) = MID$ (IN$,14,P -14):LN(N) = ( VAL(LB$(N)) <256 *1) +( VAL(LB$(N)) >255) *2: GOTO 1670 1370 IF MID$ (IN$,P,3) = ",X " THEN MD(N) = 5: GOTO 1460 1380 IF MID$ (IN$,P,3) = ",Y " THEN MD(N) = 6: GOTO 1460 1390 IF MID$ (IN$,P,3) = ",X)" THEN MD(N) = 7: GOTO 1460 1400 IF MID$ (IN$,P,3) = ") " THEN MD(N) = 12: GOTO 1460 1410 IF MID$ (IN$,P,3) = "),Y" THEN MD(N) = 8: GOTO 1460 1420 IF MID$ (IN$,14,1) = "#" THEN MD(N) = 4: GOTO 1460 1430 IF MID$ (IN$,14,1) = "<" THEN MD(N) = 13: GOTO 1460 1440 IF MID$ (IN$,14,1) = ">" THEN MD(N) = 14: GOTO 1460 1450 MD(N) = 2 1460 IF MID$ (IN$,10,1) = "B" AND MID$ (IN$,10,3) < >"BIT" AND MID$ (IN$,10,3) < >"BRK" THEN MD(N) = 11:LB$(N) = MID$ (IN$,14,P -14):TP$(N) = "R": GOTO 1640 1470 IF MD(N) < >4 THEN 1480: REM FOLLOWING CODE ADDED BY AL BAKER FOR INSTRUCTIONS LIKE LDA #BELL WITH A LABEL AS AN IMMEDIATE OPERAND 1472 LB$(N) = MID$ (IN$,15,P -15):TP$(N) = "F": FOR I = 1 TO NF: IF LF$(I) = LB$(N) THEN 1476 1474 NEXT : GOTO 1660 1476 IF AF(I) >255 THEN PRINT "VALUE OF IMMEDIATE OPERAND >255 ==>(# "N")": GOTO 2200 1478 LB$(N) = STR$(AF(I)): GOTO 1660 1480 IF MD(N) = 13 OR MD(N) = 14 THEN LB$(N) = MID$ (IN$,15,P -15): GOTO 1520 1490 IF MD(N) = 7 OR MD(N) = 8 OR MD(N) = 12 THEN LB$(N) = MID$ (IN$,15,P -15): GOTO 1520 1500 LB$(N) = MID$ (IN$,14,P -14) 1510 IF MD(N) = 1 THEN TP$(N) = "F": GOTO 1640 1520 FOR I = 1 TO NF 1530 IF LF$(I) = LB$(N) THEN TP$(N) = "F":LB$(N) = STR$(AF(I)): GOTO 1600 1540 NEXT 1550 FOR I = 1 TO NR 1560 IF LR$(I) = LB$(N) THEN TP$(N) = "D":LB$(N) = STR$(DR(I)): GOTO 1600 1570 NEXT 1580 TP$(N) = "U": FOR P = 2 TO LEN(LB$(N)): IF MID$ (LB$(N),P,1) = "+" OR MID$ (LB$(N),P,1) = "-" THEN GOTO 1585 1582 NEXT : GOTO 1600 1585 : FOR J = 1 TO NF: IF LF$(J) = LEFT$(LB$(N),P -1) THEN TP$(N) = "F":LB$(N) = STR$(AF(J) + VAL( MID$ (LB$(N),P))): ON ( VAL(LB$(N)) <256) *1 +( VAL(LB$(N)) > = 256) *2 GOTO 1610,1640 1590 NEXT 1600 IF TP$(N) < >"F" OR AF(I) > = 256 THEN 1640 1610 IF MD(N) = 2 AND IN$(N) < >"JMP" AND IN$(N) < >"JSR" THEN MD(N) = 3 1620 IF MD(N) = 5 THEN MD(N) = 9 1630 IF MD(N) = 6 AND (IN$(N) = "LDX" OR IN$(N) = "STX") THEN MD(N) = 10 1640 IF MD(N) = 1 THEN LN(N) = 1: GOTO 1670 1650 IF MD(N) = 2 OR MD(N) = 5 OR MD(N) = 6 OR MD(N) = 12 THEN LN(N) = 3: GOTO 1670 1660 LN(N) = 2 1670 AD = AD +LN(N) 1680 RETURN 1690 REM BUILD OP CODE TABLE 1700 VTAB 13: CALL -958: FLASH : PRINT " ";: REM 14 SPACES 1710 FOR N = 1 TO 56: READ OP$(N): FOR I = 1 TO 12: READ OP(N,I): NEXT : NEXT 1720 PRINT 1730 VTAB 13: INVERSE : PRINT " ": NORMAL 1740 RETURN 1750 REM FIND OP CODE 1755 IF IN$(N) = "*" THEN 2190: REM IGNORE LINES STARTING WITH "*" 1760 IF IN$(N) = "DRS" OR IN$(N) = "EQU" THEN 2190 1762 IF IN$(N) = "ASC" THEN FOR J = 1 TO LN(N): POKE LO(N) +SA +J -1, ASC( MID$ (LB$(N),J,1)) +128: NEXT J: GOTO 2190 1765 IF IN$(N) = "HEX" AND LN(N) = 1 THEN POKE LO(N) +SA, VAL(LB$(N)): GOTO 2190 1767 IF IN$(N) = "HEX" AND LN(N) = 2 THEN POKE LO(N) +SA, VAL(LB$(N))/256: POKE LO(N) +SA +1, VAL(LB$(N)) -(256 * PEEK(LO(N) +SA)): GOTO 2190 1770 FOR I = 1 TO 56 1780 IF OP$(I) = IN$(N) THEN 1820 1790 NEXT 1800 PRINT "INVALID INSTRUCTION ==> (# "N")" 1810 GOTO 2200 1820 IF (MD(N) = 13 OR MD(N) = 14) AND OP(I,4) < >0 THEN 1870 1830 IF OP(I,MD(N)) < >0 THEN 1870 1840 IF IN$(N) = "BRK" AND MD(N) = 1 THEN 1870 1850 PRINT "INVALID ADDRESS MODE ==> (# "N")" 1860 GOTO 2200 1870 IF TP$(N) < >"U" AND TP$(N) < >"R" THEN 2010 1880 FOR P = 2 TO LEN(LB$(N)) 1890 IF MID$ (LB$(N),P,1) = "+" OR MID$ (LB$(N),P,1) = "-" THEN 1920 1900 NEXT 1910 P = P +1 1920 IF TP$(N) = "R" THEN 2020 1930 FOR J = 1 TO NF 1940 IF LF$(J) = LEFT$(LB$(N),P -1) THEN TP$(N) = "F":LB$(N) = STR$(AF(J) + VAL( MID$ (LB$(N),P))): GOTO 2080 1950 NEXT 1960 FOR J = 1 TO NR 1970 IF LR$(J) = LEFT$(LB$(N),P -1) THEN TP$(N) = "D":LB$(N) = STR$(DR(J) + VAL( MID$ (LB$(N),P))): GOTO 2080 1980 NEXT 1990 PRINT "INVALID LABEL ==> (# "N")" 2000 GOTO 2200 2010 IF TP$(N) < >"R" THEN 2080 2020 FOR J = 1 TO NR 2030 IF LR$(J) = LEFT$(LB$(N),P -1) THEN LB$(N) = STR$(DR(J)) + MID$ (LB$(N),P): GOTO 2060 2040 NEXT 2050 GOTO 1990 2060 LB$(N) = STR$( VAL(LB$(N)) -(LO(N +1) +LA)) 2070 IF VAL(LB$(N)) >127 OR VAL(LB$(N)) < -128 THEN PRINT "INVALID RELATIVE ADDRESS ==> (# "N")": PRINT "= "LB$(N): GOTO 2200 2080 IF MD(N) = 13 THEN POKE LO(N) +SA,OP(I,4):LB$(N) = STR$( INT( VAL(LB$(N))/256)): GOTO 2120 2090 IF MD(N) = 14 THEN POKE LO(N) +SA,OP(I,4):LB$(N) = STR$( VAL(LB$(N)) -(256 * INT( VAL(LB$(N))/256))): GOTO 2120 2100 POKE LO(N) +SA,OP(I,MD(N)) 2110 IF LN(N) = 1 THEN 2190 2120 IF LN(N) = 2 AND VAL(LB$(N)) >255 THEN PRINT "INVALID LENGTH, > 255 ==> (# "N")": GOTO 2200 2130 IF VAL(LB$(N)) > = 0 THEN 2160 2140 LB = 256 + VAL(LB$(N)) 2150 LB$(N) = STR$(LB) 2160 IF LN(N) = 2 THEN POKE LO(N) +SA +1, VAL(LB$(N)): GOTO 2190 2170 POKE LO(N) +SA +2, VAL(LB$(N))/256 2180 POKE LO(N) +SA +1, VAL(LB$(N)) -(256 * PEEK(LO(N) +SA +2)) 2190 RETURN 2200 REM FIND STATEMENT FOR ERROR 2210 PRINT D$"OPEN "PR$: PRINT D$"READ "PR$ 2220 FOR X = 1 TO N 2230 INPUT IN$ 2240 NEXT 2250 PRINT D$"CLOSE "PR$ 2260 PRINT IN$ 2270 VTAB 22: CALL -958: INPUT "DO YOU WISH TO EDIT THE FILE? (Y/N)";K$: IF K$ = "Y" THEN PRINT D$"RUN SOURCE.EDITOR" 2280 IF K$ = "N" THEN HOME : END 2290 PRINT CHR$(7): GOTO 2270 2300 REM CHECK DRS FOR CONSTANTS 2310 XL = LEN( STR$(LN(N))) +14 2320 IF XL > = LEN(IN$) THEN RETURN 2330 IF MID$ (IN$,XL,1) = "!" THEN XA = LO(N) +SA: GOSUB 2500 2340 RETURN 2350 DIM PN(15) 2360 PN(1) = 66:PN(2) = 89:PN(3) = 32 2370 PN(4) = 74:PN(5) = 79:PN(6) = 72 2380 PN(7) = 78:PN(8) = 32:PN(9) = 87 2390 PN(10) = 72:PN(11) = 73:PN(12) = 84 2400 PN(13) = 78:PN(14) = 69:PN(15) = 89 2410 FOR VN = 1 TO 15 2420 VTAB 5 2430 FOR VO = VN TO 1 STEP -1 2440 PRINT CHR$(PN(16 -VO)); 2450 NEXT VO 2460 PRINT 2470 NEXT VN 2480 PRINT 2490 RETURN 2500 REM INSTALL CONSTANTS 2510 XL = XL +1 2520 IF XL > LEN(IN$) THEN RETURN 2530 IF MID$ (IN$,XL,1) = "!" THEN RETURN 2540 POKE XA, ASC( MID$ (IN$,XL,1)) 2550 XA = XA +1 2560 GOTO 2500 2570 REM HEX CONVERSION 2580 HF = 0:DT = 0 2590 FOR K = 1 TO LEN(HX$) 2600 IF MID$ (HX$,K,1) = "$" THEN HV$ = MID$ (HX$,K): IF LEN(HV$) >1 THEN HV$ = MID$ (HV$,2): GOTO 2620 2610 NEXT K: RETURN 2620 HV$ = HV$ +" ": FOR K2 = 1 TO 5: IF MID$ (HV$,K2,1) < >" " AND MID$ (HV$,K2,1) < >"." AND MID$ (HV$,K2,1) < >")" THEN NEXT : GOTO 2670: REM OPERAND TOO LONG 2622 IF K2 = 1 THEN 2670: REM NULL HEX STRING 2625 HV$ = RIGHT$("000" +HV$, LEN(HV$) +(5 -K2)) 2630 FOR K1 = 1 TO 4 2640 HD = ASC( MID$ (HV$,K1,1)) 2650 HD = HD -48: IF HD >9 THEN HD = HD -7: IF HD > = 10 AND HD < = 15 THEN 2680 2660 IF HD > = 0 AND HD < = 9 THEN 2680 2670 PRINT D$"CLOSE": PRINT "OPERAND ERROR IN LINE:";N: GOTO 2260 2680 DT = DT +HD *(16 ^(4 -K1)) 2690 NEXT 2700 IF K >1 THEN HX$ = LEFT$(HX$,K -1) + STR$(DT) + MID$ (HX$,K +K2): GOTO 2720 2710 HX$ = STR$(DT) + MID$ (HX$,K2 +1) 2720 RETURN 2799 : 2800 REM CHECK FOR ASC CONSTANTS 2801 : 2810 Q$ = "'":LB$(N) = MID$ (IN$,15,15): IF MID$ (IN$,14,1) < >Q$ THEN 2900 2820 FOR XL = 15 TO 1 STEP -1: IF MID$ (LB$(N),XL,1) < >" " THEN 2840 2830 NEXT 2840 IF MID$ (LB$(N),XL,1) < >Q$ THEN 2900 2850 LB$(N) = LEFT$(LB$(N),XL -1):LN(N) = XL -1: RETURN 2900 PRINT "MISSING QUOTE IN ASC STRING ==> (#"N")": PRINT D$"CLOSE"PR$: GOTO 2200 9970 : 9980 REM PRINT OUT ASSEMBLED LISTING 9990 : 10000 DEF FN HX(X) = X - INT(X/16) *16 10010 DIM HD$(16) 10020 FOR I = 0 TO 9:HD$(I) = CHR$(48 +I): NEXT : FOR I = 10 TO 15:HD$(I) = CHR$(55 +I): NEXT 10030 PRINT D$"PR#1": PRINT CHR$(27)"E" 10040 REM LINE 10030 SETS 12 CPI, 96-CHAR LINE FOR C. ITOH PROWRITER & APPLE IMAGEWRITER 10050 REM EPSON MX-80: '10030 PRINT D$"PR#1":PRINT CHR$(15)' SETS COMPRESSED MODE, 132 CHAR LINE 10060 P = 1:TL$ = LEFT$("BASIC.ASSEMBLER FILE " +PR$ +" ",89) +"PAGE ": GOSUB 10550 10070 REM 65 SPACES BETWEEN QUOTES ABOVE 10080 PRINT D$"OPEN "PR$ 10090 PRINT D$"READ "PR$ 10100 FOR N = 1 TO NI 10110 INPUT IN$ 10120 IF IN$(N) = "ASC" THEN 10330 10130 X = LO(N) +LA 10140 PL$ = HD$( FN HX(X/4096)) +HD$( FN HX(X/256)) +HD$( FN HX(X/16)) +HD$( FN HX(X)) +":" 10150 IF LN(N) = 0 THEN 10200 10160 FOR I = 1 TO LN(N) 10170 X = PEEK(LO(N) +SA +(I -1)) 10180 PL$ = PL$ +HD$( FN HX(X/16)) +HD$( FN HX(X)) +" " 10190 NEXT I 10200 PL$ = LEFT$(PL$ +" ",14) 10210 ON LEN( STR$(N)) GOSUB 10290,10300,10310 10220 PRINT PL$ +FIL$ + STR$(N) +" " + LEFT$(IN$,78) 10230 LN = LN +1: IF LN = 56 THEN GOSUB 10540: REM PAGE HEADER 10240 NEXT N 10250 PRINT D$"CLOSE": PRINT : PRINT "SUCCESSFUL ASSEMBLY -- NO ERRORS" 10260 PRINT "ASSEMBLED OUTPUT IN FILE ";PR$;".OBJ,A$";HD$( FN HX(LA/4096));HD$( FN HX(LA/256));HD$( FN HX(LA/16));HD$( FN HX(LA)); 10270 PRINT ",L$";HD$( FN HX(L/4096));HD$( FN HX(L/256));HD$( FN HX(L/16));HD$( FN HX(L)): PRINT CHR$(12): PRINT D$"PR#0" 10280 RETURN 10290 FIL$ = " ": RETURN : REM 1 DIGIT LINE NUMBER 10300 FIL$ = " ": RETURN : REM 2 DIGIT LINE NUMBER 10310 FIL$ = "": RETURN : REM 3 DIGIT LINE NUMBER 10320 : 10330 REM SPECIAL CODE FOR ASC 10340 : 10350 FOR C = 0 TO LN(N) -1 STEP 3 10360 X = LO(N) +C +LA 10370 PL$ = HD$( FN HX(X/4096)) +HD$( FN HX(X/256)) +HD$( FN HX(X/16)) +HD$( FN HX(X)) +":" 10380 FOR I = 1 TO 3 10390 IF C +I >LN(N) THEN 10430 10400 X = PEEK(LO(N) +SA +C +(I -1)) 10410 PL$ = PL$ +HD$( FN HX(X/16)) +HD$( FN HX(X)) +" " 10420 NEXT I 10430 PL$ = LEFT$(PL$ +" ",14) 10440 ON LEN( STR$(N)) GOSUB 10290,10300,10310 10450 PL$ = PL$ +FIL$ + STR$(N) +" " 10460 IF C = 0 THEN PL$ = PL$ + LEFT$(IN$,78) 10470 PRINT PL$ 10480 LN = LN +1: IF LN = 56 THEN GOSUB 10540: REM PAGE HEADER 10490 NEXT C 10500 GOTO 10240 10510 : 10520 REM PRINT HEADER 10530 : 10540 PRINT CHR$(12) 10550 PRINT TL$;P;: PRINT :P = P +1:LN = 0: RETURN