10 REM WRITTEN BY: J. DALE E. HOLT APRIL 1981 20 REM 30 REM FORMAT DATA FOR SOURCE CODE FILES 40 REM LABELS SHOULD NOT START WITH *,$,#,@ 50 REM LABELS SHOULD NOT INCLUDE A MINUS SIGN (-), NOR A PLUS SIGN (+) 60 REM 70 REM OPERAND PARAMETERS: 80 REM PREFIXES: 90 REM * MEANS ZERO PAGE ADDRESS 100 REM $ MEANS HEXADECIMAL VALUE (2 TO 4 DIGITS) 110 REM # MEANS DECIMAL VALUE (0-255) 120 REM @ MEANS ASCII LITERAL (1 CHARACTER) 130 REM < MEANS LOW BYTE OF ADDRESS 140 REM SUFFIXES: 150 REM ,X MEANS INDEXED BY X 160 REM ,Y MEANS INDEXED BY Y 170 REM +N MEANS LABEL ADDRESS PLUS N WHERE N LESS THAN 10 180 REM -N MEANS LABEL ADDRESS MINUS N WHERE N LESS THAN 10 190 REM 200 REM PARENTHESES ARE USED TO INDICATE INDIRECT ADDRESSING 210 REM 220 REM FORMAT REQUIREMENTS: 230 REM THE ASSSEMBLER HAS AN INPUT PARSER. LABELS AND CONTROL LINES MUST 240 REM BEGIN IN COLUMN ONE. A TAB OR SPACE IS USED TO SEPARATE OTHER FIELDS. 250 REM MULTIPLE TABS OR SPACES MAY BE USED. CONTROL LINES ARE NOT PARSED. 260 REM 270 REM REM CONTROL LINES: 280 REM *NAME XXXXXXXXX WHERE XXXXXXXXX IS THE PROGRAM NAME 290 REM *END INDICATES END OF INPUT 300 REM *LOCATE $XXXX WHERE XXXX INDICATES THE HEX LOCATION 310 REM FOR ASSEMBLY OF CODE FOLLOWING THIS LINE 320 REM *CODE INDICATES START OF INSTRUCTION SEQUENCE 330 REM *LABEL INDICATES START OF LABEL TABLE INSERTS 340 REM ** COMMENT LINES BEGIN WITH DOUBLE ASTERISKS 350 REM ; OR WITH A SEMICOLON 360 REM 370 REM SYM MONITOR LABELS FOR MOST MONITOR SUBROUTINES AND OTHER 380 REM IMPORTANT VARIABLES ARE AUTOMATICALLY RECOGNIZED IF THE 390 REM INPUT FILE NAME ENDS WITH .SYM OR IS LEFT BLANK 400 REM 410 REM MULTIPLE DATA BYTES OF THE SAME TYPE MAY BE ENTERED ON THE 420 REM SAME LINE, BEGINNING IN COLUMN 9 AND ENDING BEFORE COLUMN 90: 430 REM EXAMPLES: 440 REM $00 12 FE A3 2B A8 (HEX) 450 REM #0 12 124 255 3 (DECIMAL) 460 REM @MESSAGE TEXT.@ (ASCII) 470 REM 480 REM NOTE: ASCII STRINGS ARE ASSEMBLED IN REVERSE ORDER,END WITH @ 490 REM THE FIRST BYTE OF AN ASSEMBLED ASCII STRING IS THE NUMBER OF BYTES 500 REM IN THE STRING. IT IS USED WITH THE PRINT (PRI) MACRO, AS IN THE 510 REM FOLLOWING EXAMPLE: 520 REM LABEL5 PRI STRING PRINT MESSAGE STRING 530 REM .... (INDEX REG Y IS USED) 540 REM .... 550 REM STRING @THIS LINE WILL BE PRINTED.@ 560 REM .... 570 REM 580 REM IF PRC IS USED INSTEAD OF PRI, THEN CRLF WILL BE PRINTED BEFORE THE 590 REM STRING IS PRINTED. 600 REM 610 REM THE *LABEL COMMAND IS USED AS FOLLOWS: 620 REM *LABEL 630 REM LABEL1 $8AC3 640 REM LBL2 $A00F 650 REM LABEL3 $0003 660 REM LABEL4 $0005 ZERO PAGE ADDRESS EXTERNAL TO PROGRAM 670 REM *CODE 680 REM LDA LABEL1 GET LABEL1 690 REM *END 700 REM 710 REM INSTRUCTIONS FOR USING THE DOWNLOADER 720 REM 730 REM A SWITCH BOX MUST BE CONSTRUCTED FOR SWITCHING THE RS232 LINES 740 REM BETWEEN THE VAX, THE TERMINAL, AND THE 6502 MICROCOMPUTER 750 REM THE DOWNLOADER IS SPECIFICALLY FOR THE SYM-1 760 REM (1) SET THE SWITCHES FOR COMMUNICATION BETWEEN THE TERMINAL 770 REM AND THE VAX. 780 REM (2) RUN ASSEMBLER, REQUEST THE DOWNLOADER 790 REM (3) GIVE APPROPRIATE RESPONSES 800 REM (4) SET THE SWITCHES FOR COMMUNICATION BETWEEN THE VAX AND THE 810 REM SYM-1 WITH THE TERMINAL LISTENING (ONLY) TO THE SYM-1 OUTPUT 820 REM (5) AFTER A FIVE SECOND DELAY, THE DOWNLOAD WILL BEGIN USING 830 REM THE DEPOSIT COMMAND OF THE SYM-1 840 REM (6) AFTER THE DOWNLOAD IS COMPLETED SUCCESSFULLY, THE SYM-1 WILL 850 REM BEEP AND SCAN THE LED DISPLAY 860 REM 870 REM IN THE CLOSED LOOP MODE, ERRORS IN TRANSMISSION ARE DETECTED AND 880 REM CORRECTIONS ATTEMPTED 890 REM 900 REM 910 ON ERROR GOTO 11530% 920 REM B1$ CONTAINS THE MNEMONICS FOLLOWED BY AVAILABLE OP CODES 930 REM 940 DIM B1$(256) 950 DIM L$(2000) 960 DIM P$(2000) 970 REM LENGTH A$(132),C$(80),C1$(8),C2$(5),C3$(20) 980 DIM A1(80),A1$(80),C4$(27) 990 REM 1000 REM SET UP DATA ARRAY 1010 REM 1020 FOR J=1 TO 256 1030 READ B1$(J) 1040 NEXT J 1050 ER$(0)="ACC"\ER$(1)="IMM"\ER$(2)="ABS"\ER$(3)="ABS,X" 1060 ER$(4)="ABS,Y"\ER$(5)="(IND,X)"\ER$(6)="(IND),Y" 1070 ER$(7)="ZP"\ER$(8)="ZP,X"\ER$(9)="ZP,Y" 1080 REM 1090 PRINT "ASSEMBLE, CONVERT .PRT TO .SYM FILE, OR DOWNLOAD (A/C/D)"; 1100 INPUT Q$ 1110 PRINT 1120 IF Q$="A" THEN GOTO 1160 1130 IF Q$="C" THEN GOTO 11660 1140 IF Q$="D" THEN CALL DOWN \ GOTO 12010 1150 PRINT "INVALID RESPONSE. USE A, C, OR D." \ GOTO 1090 1160 PRINT "ENTER NAME OF ASSEMBLY LANGUAGE PROGRAM FILE" 1170 INPUT Q$ 1180 D6=TIME(0) 1190 D6$=TIME$(0%) 1200 D2$="NOT" 1210 REM 1220 REM 1230 IF SEG$(Q$,LEN(Q$)-3,LEN(Q$)-3)="." THEN GO TO 1250 1240 Q$=Q$+".SYM" 1250 REM 1260 PRINT "TYPE T FOR OUTPUT TO TERMINAL" 1270 PRINT 1280 Q1$=SEG$(Q$,1,LEN(Q$)-4)+".PRT" 1290 PRINT "TYPE F FOR OUTPUT TO FILE '";Q1$;"'" 1300 PRINT "(MANDATORY FOR DOWN LOADABLE FILE)" 1310 PRINT 1320 PRINT "TYPE D FOR CREATION OF A DOWN LOAD FILE FROM A PRT FILE" 1330 INPUT T$ 1340 IF T$="T" THEN T=0 \ GO TO 1390 1350 IF T$="F" THEN T=4 \ GO TO 1390 1360 IF T$="D" THEN Q2$=SEG$(Q$,LEN(Q$)-2,LEN(Q$)) \ D2$="DWN" \ GO TO 8120 1370 GO TO 1260 1380 REM 1390 OPEN "A1.TMP" FOR OUTPUT AS FILE #3,SEQUENTIAL 1400 PRINT "WORKING ON FIRST PASS" 1410 PRINT "ERRORS DETECTED:"; 1420 PRINT #3,"*THIS VERSION ASSEMBLED ON ";DATE$(0%) 1430 REM 1440 Q2$=SEG$(Q$,LEN(Q$)-2,LEN(Q$)) 1450 IF Q2$<>"SYM" THEN GO TO 1510 1460 FOR J=1 TO 57 1470 READ L$(J),P$(J) 1480 NEXT J 1490 L=57 1500 GO TO 1530 1510 READ L$(1),P$(1) 1520 L=1 1530 REM 1540 REM FIRST PASS 1550 REM 1560 REM SET INITIAL VALUES 1570 REM 1580 E$="--" 1590 REM E$ IS THE OP CODE 1600 G1$="NONE" 1610 REM G1$ IS THE LOCATION TO BEGIN EXECUTION 1620 REM A IS THE ADDRESSING MODE 1630 REM M IS THE INCREMENT TO A LABEL ADDRESS 1640 REM E IS THE APPROXIMATE NUMBER OF ERRORS 1650 REM L IS NUMBER OF ENTRIES IN LABEL ARRAY 1660 REM W1 IS THE NUMBER OF BYTES FOR THE INSTRUCTION 1670 Y1$="XX" 1680 REM Y1$ IS THE FIRST OPERAND BYTE 1690 Y2$="XX" 1700 REM Y2$ IS THE SECOND OPERAND BYTE 1710 P1$="0000" 1720 REM P$ IS THE ADDRESS FOR THE LABEL IN L$ 1730 REM L3 IS NUMBER OF LINES IN SOURCE CODE 1740 N$="NONAME" 1750 REM N$ CONTAINS THE PROGRAM NAME 1760 REM N9 IS THE NUMBER OF BYTES USED BY THE PROGRAM 1770 A3$="NO" \ REM NO REPEAT 1780 L3$="P:" \ L4$="0000" \ REM PRINT MACRO 1790 Q7$=Q$ 1800 OPEN Q7$ FOR INPUT AS FILE #1,SEQUENTIAL 1810 REM 1820 REM GET THE INPUT 1830 REM 1840 GOSUB 8150 \ REM GET A LINE 1850 IF A$=" " THEN PRINT #3 \ GO TO 1840 1860 IF SEG$(A$,1,1)=";" THEN PRINT #3,A$ \ GO TO 1840 1870 IF SEG$(A$,1,1)<>"*" THEN GO TO 2390 1880 IF SEG$(A$,1,4)="*END" THEN PRINT #3,A$ \ GO TO 6660 1890 IF SEG$(A$,2,2)="*" THEN PRINT #3,A$ \ GO TO 1840 1900 IF SEG$(A$,2,5)="CODE" THEN PRINT #3,A$ \ GO TO 1840 1910 IF SEG$(A$,2,6)<>"LABEL" THEN GO TO 2070 1920 PRINT #3,A$ 1930 LINPUT #1,A$ \L3=L3+1\ IF A$=" " THEN GO TO 1920 1940 IF SEG$(A$,1,1)=";" THEN GO TO 1920 1950 IF SEG$(A$,1,2)="**" THEN GO TO 1920 1960 IF SEG$(A$,1,1)="*" THEN GO TO 1880 1970 C$=A$ \ GOSUB 8210 \ REM PARSE THE LINE 1980 L=L+1 \ L$(L)=SEG$(A$,1,6) \ P$(L)=SEG$(A$,10,13) 1990 IF LEN(P$(L))=4 THEN GO TO 2030 2000 PRINT #3,"*** LABEL ADDRESS MUST BE FOUR DIGITS ***" 2010 PRINT "* "; 2020 P$(L)="0000" 2030 L7=1 \ GOSUB 6100 2040 H5$=P$(L) \ GOSUB 8000 \ REM CHECK FOR HEX VALUES 2050 IF H7=0 THEN A$=" "+A$ \ GO TO 1920 2060 L=L-1 \ GO TO 1920 2070 IF SEG$(A$,1,5)<>"*NAME" THEN GO TO 2130 2080 N$=SEG$(A$,7,21) 2090 PRINT #3,"*PROGRAM ";N$;" ASSEMBLY LISTING " 2100 PRINT #3," " 2110 PRINT #3,A$ 2120 GO TO 1840 2130 IF SEG$(A$,1,9)<>"*LOCATE $" THEN GO TO 2210 2140 P1$=SEG$(A$,10,13) 2150 H5$=P1$ 2160 GOSUB 8000 \ REM CHECK FOR HEX VALUES 2170 IF H7=0 THEN GO TO 2190 2180 P1$="0000" 2190 PRINT #3,A$ 2200 GO TO 1840 2210 IF SEG$(A$,1,3)<>"*GO" THEN GO TO 2310 2220 IF SEG$(A$,5,5)="$" THEN GO TO 2240 2230 GO TO 2290 2240 G1$=SEG$(A$,6,9) 2250 H5$=G1$ 2260 GOSUB 8000 \ REM CHECK FOR HEX VALUES 2270 IF H7=0 THEN GO TO 2290 2280 G1$="NONE" 2290 PRINT #3,A$ 2300 GO TO 1840 2310 PRINT #3,"*** UNRECOGNIZED COMMAND ***" 2320 PRINT "* "; 2330 PRINT #3,A$ 2340 GO TO 1840 2350 REM 2360 REM START THE ASSEMBLY 2370 REM 2380 REM W1 IS THE NUMBER OF BYTES FOR THE INSTRUCTION 2390 D$=SEG$(A$,9,11) 2400 J1$=SEG$(A$,14,14) 2410 J2$=SEG$(A$,18,18) 2420 REM CHECK FOR DATA (ASCII) 2430 IF SEG$(A$,9,9)<>"@" THEN GO TO 2750 2440 FOR J=10 TO LEN(A$) 2450 IF SEG$(A$,J,J)="@" THEN GO TO 2510 2460 A1(J-9)=ASCII(SEG$(A$,J,J)) \ A2=J-9 2470 NEXT J 2480 PRINT #3,"*** NO '@' AT END OF STRING ***" 2490 PRINT "* "; 2500 GO TO 6200 2510 P2$=P1$ 2520 REM PUT # OF CHARS AS FIRST BYTE 2530 A2=A2+1 2540 A1(A2)=A2-1 2550 FOR F=1 TO A2 2560 W=A1(F) 2570 GOSUB 7420 \ REM CONVERT DEC TO HEX 2580 A1$(A2-F+1)=SEG$(P1$,3,4) 2590 NEXT F 2600 P1$=P2$ 2610 A5=1 2620 A3$="NO" 2630 W1=3 2640 A1$(A2+1)=" " 2650 A1$(A2+2)=" " 2660 A1$(A2+3)=" " 2670 E$=A1$(A5) \ A5=A5+1 2680 Y1$=A1$(A5) \ A5=A5+1 2690 Y2$=A1$(A5) \ A5=A5+1 2700 IF A5"$" THEN GO TO 2990 2760 A2=1 2770 FOR J=10 TO 80 STEP 3 2780 IF SEG$(A$,J,J+1)=" " THEN GO TO 2900 2790 IF SEG$(A$,J,J+1)=" ;" THEN GO TO 2900 2800 IF SEG$(A$,J,J)=";" THEN GO TO 2900 2810 IF SEG$(A$,J+1,J+1)=";" THEN GO TO 2900 2820 IF SEG$(A$,J-1,J-1)=";" THEN GO TO 2900 2830 A1$(A2)=SEG$(A$,J,J+1) 2840 H5$=A1$(A2) 2850 GOSUB 8010 2860 IF H7=1 THEN GO TO 2950 2870 A2=A2+1 2880 IF SEG$(A$,J+2,J+2)<>" " THEN GO TO 2920 2890 NEXT J 2900 A2=A2-1 2910 GO TO 2610 2920 PRINT #3,"*** FORMAT ERROR IN DATA LINE BELOW ***" 2930 PRINT "* "; 2940 GO TO 6060 2950 PRINT #3,"*** NON HEX VALUE '";H5$;"' IN POSITION # ";A2;"***" 2960 PRINT "* "; 2970 GO TO 6060 2980 REM CHECK FOR DATA BYTE (DECIMAL) 2990 IF SEG$(D$,1,1)<>"#" THEN GO TO 3220 3000 A2=1 \ A3=10 \ A4=9 3010 P2$=P1$ 3020 FOR J=10 TO 80 3030 IF SEG$(A$,J-1,J+1)=" " THEN GO TO 3150 3040 IF SEG$(A$,J,J)=" " THEN GO TO 3070 3050 A4=A4+1 3060 GO TO 3140 3070 W=VAL(SEG$(A$,A3,A4)) 3080 IF W>255 THEN GO TO 3180 3090 GOSUB 7420 \ REM CONVERT DEC TO HEX 3100 A1$(A2)=SEG$(P1$,3,4) 3110 A3=A4+2 3120 A4=A4+1 3130 A2=A2+1 3140 NEXT J 3150 P1$=P2$ 3160 A2=A2-1 3170 GO TO 2610 3180 PRINT #3,"*** VALUE > 255. VALUE IS ";W;" ***" 3190 PRINT "* "; 3200 GO TO 6060 3210 REM CHECK FOR LOW ADDRESS OF LABEL 3220 IF SEG$(D$,1,1)<>"<" THEN GO TO 3260 3230 J1$="LOI" 3240 GO TO 3280 3250 REM CHECK FOR HIGH ADDRESS OF LABEL 3260 IF SEG$(D$,1,1)<>">" THEN GO TO 3350 3270 J1$="HOI" 3280 F$=SEG$(A$,10,15) 3290 E$=" " 3300 W1=1 3310 Y1$="XX" 3320 GO TO 6060 3330 REM CHECK FOR JUST ONE BYTE INSTRUCTION 3340 REM OPERAND "A" REPRESENTS THE ACCUMULATOR 3350 IF SEG$(A$,14,15)="A " THEN GO TO 3370 3360 IF J1$<>" " THEN GO TO 3410 3370 W1=1 3380 A=1 3390 GO TO 5380 3400 REM CHECK FOR DECIMAL IMMEDIATE 3410 IF J1$<>"#" THEN GO TO 3630 3420 W1=2 3430 A=1 3440 P2$=P1$ 3450 Y3$=SEG$(A$,15,17) 3460 W=0 3470 FOR J=1 TO 3 3480 Y4$=SEG$(Y3$,J,J) 3490 IF Y4$=" " THEN 3540 3500 IF ASCII(Y4$)>47 THEN IF ASCII(Y4$)<58 THEN GO TO 3530 3510 PRINT #3,"*** NON DECIMAL VALUE '";Y4$;"' ***" 3520 GO TO 3590 3530 W=W*10+VAL(Y4$) 3540 NEXT J 3550 GOSUB 7400 3560 Y1$=SEG$(P1$,3,4) 3570 IF SEG$(P1$,1,2)="00" THEN GO TO 3600 3580 PRINT #3,"*** VALUE TOO LARGE ***",Y3$ 3590 PRINT "* "; 3600 P1$=P2$ 3610 GO TO 5380 3620 REM CHECK FOR ASCII IMMEDIATE 3630 IF J1$<>"@" THEN GO TO 3720 3640 W1=2 \ A=1 3650 W=ASCII(SEG$(A$,15,15)) 3660 P2$=P1$ 3670 GOSUB 7420 \ REM CONVERT DEC TO HEX 3680 Y1$=SEG$(P1$,3,4) 3690 P1$=P2$ 3700 GO TO 5380 3710 REM CHECK FOR HEX IMMEDIATE 3720 IF J1$<>"$" THEN GO TO 4100 3730 IF J2$<>" " THEN GO TO 3830 3740 W1=2 3750 A=1 3760 Y1$=SEG$(A$,15,16) 3770 H5$=Y1$ 3780 GOSUB 8000 \ REM CHECK FOR HEX VALUES 3790 IF H7=0 THEN GO TO 3810 3800 Y1$="--" 3810 GO TO 5380 3820 REM FOR HEX ABSOLUTE 3830 IF SEG$(A$,18,18)<>" " THEN GO TO 3890 3840 PRINT #3,"*** MUST HAVE FOUR DIGITS FOR HEX ABSOLUTE***" 3850 PRINT "* "; 3860 Y1$="--" 3870 Y2$="--" 3880 GO TO 5380 3890 IF SEG$(A$,9,9)="B" THEN IF SEG$(A$,10,10)<>"I" THEN GOTO 5100 3900 W1=3 3910 IF SEG$(A$,19,20)<>",X" THEN GO TO 3940 3920 A=3 3930 GO TO 3980 3940 IF SEG$(A$,19,20)<>",Y" THEN GO TO 3970 3950 A=4 3960 GO TO 3980 3970 A=2 3980 Y1$=SEG$(A$,17,18) 3990 H5$=Y1$ 4000 GOSUB 8000 \ REM CHECK FOR HEX VALUES 4010 IF H7=0 THEN GO TO 4030 4020 Y1$="--" 4030 Y2$=SEG$(A$,15,16) 4040 H5$=Y2$ 4050 GOSUB 8000 \ REM CHECK FOR HEX VALUES 4060 IF H7=0 THEN GO TO 4080 4070 Y2$="--" 4080 GO TO 5380 4090 REM CHECK FOR ZERO PAGE ADDRESSING 4100 IF J1$<>"*" THEN GO TO 4280 4110 W1=2 4120 Z=1 4130 GOSUB 7550 \ REM DETERMINE INDEX 4140 A=A+7 4150 IF SEG$(A$,15,15)<>"$" THEN GO TO 5380 4160 IF SEG$(A$,18,18)=" " THEN GO TO 4210 4170 PRINT #3,"***TWO DIGITS ONLY FOR ZERO PAGE***" 4180 PRINT "* "; 4190 Y1$="--" 4200 GO TO 5380 4210 Y1$=SEG$(A$,16,17) 4220 H5$=Y1$ 4230 GOSUB 8010 4240 IF H7=0 THEN GO TO 5380 4250 Y1$="--" 4260 GO TO 5380 4270 REM CHECK FOR LABEL IMMEDIATE (LOW ORDER) 4280 IF J1$<>"<" THEN GO TO 4360 4290 J1$="LLI" 4300 Y1$="XX" 4310 W1=2 4320 A=1 4330 F$=SEG$(A$,15,20) 4340 GO TO 5380 4350 REM CHECK FOR LABEL IMMEDIATE (HIGH ORDER) 4360 IF J1$<>">" THEN GO TO 4440 4370 J1$="HLI" 4380 Y1$="XX" 4390 W1=2 4400 A=1 4410 F$=SEG$(A$,15,20) 4420 GO TO 5380 4430 REM CHECK FOR INDIRECT 4440 IF J1$<>"(" THEN GO TO 5100 4450 FOR J=1 TO 9 4460 IF SEG$(A$,14+J,14+J)<>")" THEN GO TO 4490 4470 X=J 4480 GO TO 4520 4490 NEXT J 4500 PRINT #3,"*** NO RIGHT PARENTHESIS ***" \ GO TO 4760 4510 PRINT "* "; 4520 IF SEG$(A$,12+X,13+X)<>",X" THEN GO TO 4580 4530 A=5 4540 W1=2 4550 J1$="*" 4560 F$=SEG$(A$,15,11+X) 4570 GO TO 4910 4580 IF SEG$(A$,15+X,16+X)<>",Y" THEN GO TO 4640 4590 A=6 4600 W1=2 4610 J1$="*" 4620 F$=SEG$(A$,15,13+X) 4630 GO TO 4910 4640 FOR J=15 TO 25 4650 IF SEG$(A$,J,J)<>"," THEN GO TO 4690 4660 PRINT #3,"*** INVALID FORMAT WITH COMMA ***" 4670 PRINT "* "; 4680 GO TO 4760 4690 NEXT J 4700 A=0 \ REM JMP INDIRECT 4710 W1=3 4720 F$=SEG$(A$,15,13+X) 4730 IF D$="JMP" THEN GO TO 4790 4740 PRINT #3,"*** INVALID INDIRECT ADDRESSING ***" 4750 PRINT "* "; 4760 Y1$="--" 4770 Y2$="--" 4780 GO TO 6060 4790 IF SEG$(F$,1,1)<>"$" THEN GO TO 4920 4800 Y1$=SEG$(F$,4,5) 4810 H5$=Y1$ 4820 GOSUB 8000 \ REM CHECK FOR HEX VALUES 4830 IF H7=0 THEN GO TO 4850 4840 Y1$="--" 4850 Y2$=SEG$(F$,2,3) 4860 H5$=Y2$ 4870 GOSUB 8000 \ REM CHECK FOR HEX VALUES 4880 IF H7=0 THEN GO TO 4900 4890 Y2$="--" 4900 GO TO 5380 4910 IF SEG$(F$,1,1)="$" THEN GO TO 4990 4920 K=LEN(F$) 4930 IF SEG$(F$,K-1,K-1)="+" THEN M=1 \ GO TO 4960 4940 IF SEG$(F$,K-1,K-1)="-" THEN M=-1 \ GO TO 4960 4950 GO TO 5380 4960 M=M*VAL(SEG$(F$,K,K)) 4970 F$=SEG$(F$,1,K-2) 4980 GO TO 5380 4990 IF LEN(F$)>3 THEN GO TO 5060 5000 Y1$=SEG$(F$,2,3) 5010 H5$=Y1$ 5020 GOSUB 8000 \ REM CHECK FOR HEX VALUES 5030 IF H7=0 THEN GO TO 5050 5040 Y1$="--" 5050 GO TO 5380 5060 PRINT #3,"*** HEX ADDRESS MUST BE ZERO PAGE, ONLY TWO DIGITS ***" 5070 PRINT "* "; 5080 GO TO 4760 5090 REM CHECK FOR ABSOLUTE LABEL, NOT BRANCH INSTRUCTIONS 5100 IF SEG$(D$,1,1)="B" THEN IF D$<>"BIT" THEN GO TO 5190 5110 W1=3 5120 Y1$="XX" 5130 Y2$="XX" 5140 Z=0 5150 GOSUB 7550 \ REM DETERMINE INDEX 5160 A=A+2 5170 GO TO 5380 5180 REM FOR RELATIVE BRANCH 5190 W1=2 5200 GOSUB 7550 \ REM DETERMINE INDEX 5210 A=2+A 5220 IF SEG$(A$,14,14)<>"$" THEN GO TO 5330 5230 IF SEG$(A$,17,17)<>" " THEN A=2 5240 F$=SEG$(A$,15,18) 5250 H5$=F$ 5260 GOSUB 8000 \ REM CHECK FOR HEX VALUES 5270 IF H7=0 THEN J1$="RELA" 5280 IF SEG$(A$,19,20)=" " THEN GO TO 5380 5290 PRINT #3,"*** FORMAT ERROR, NEED BLANKS AFTER ADDRESS ***" 5300 PRINT "* "; 5310 Y1$="--" 5320 GO TO 5380 5330 J1$="REL" 5340 F$=SEG$(A$,14,19) 5350 REM 5360 REM GET OP CODE 5370 REM 5380 D$=SEG$(A$,9,11) 5390 FOR J=1 TO 256 5400 IF D$<>B1$(J) THEN 5670 5410 IF J>50 THEN GOTO 5440 5420 IF A=1 THEN GOTO 5640 5430 GOTO 6000 5440 IF J>66 THEN GOTO 5480 5450 IF W1=1 THEN A=0 \ GOTO 6000 5460 IF A=2 THEN A=1 \ GOTO 5640 5470 GOTO 6000 5480 IF J>74 THEN GOTO 5540 5490 IF A=7 THEN IF J=67 THEN A=2 \ GOTO 5640 5500 IF A=2 THEN A=1 \ GOTO 5640 5510 IF A=0 THEN A=2 \ GOTO 5640 5520 IF A=1 THEN IF J1$="A" THEN A=0 5530 GOTO 6000 5540 IF J>110 THEN GOTO 5590 5550 IF A=1 THEN IF J1$="A" THEN GOTO 5640 5560 IF A=1 THEN GOTO 6000 5570 IF A=9 THEN GOTO 6000 5580 GOTO 5640 5590 IF W1=1 THEN A=0 \ GOTO 6000 5600 IF A<9 THEN 5640 5610 IF J=192 THEN GOTO 5640 5620 IF J=238 THEN GOTO 5640 5630 GOTO 6000 5640 E$=B1$(J+A) 5650 IF E$="xx" THEN GOTO 6000 5660 GOTO 6060 5670 NEXT J 5680 IF D$="PRI" THEN GO TO 5710 5690 IF D$="PRC" THEN GO TO 5710 5700 GO TO 5960 5710 A3$="AGAIN" 5720 IF SEG$(A$,1,1)<>" " THEN L7=1 \ GOSUB 6070 5730 A$=P1$+" "+A$ \ PRINT #3,A$ 5740 FOR P%=6 TO 1 STEP -1 5750 IF SEG$(F$,P%,P%)<>" " THEN GO TO 5790 5760 F$=SEG$(F$,1,P%-1) 5770 NEXT P% 5780 PRINT "F$=";F$;"=F$" 5790 IF A=2 THEN GOTO 5820 5800 PRINT #3,"!!! ONLY ABSOLUTE MODE ADDRESSING FOR PRI AND PRT MACRO !!!" 5810 A=2 \ J1$="O" 5820 IF SEG$(D$,3,3)="I" THEN GO TO 5860 5830 L8$=F$ 5840 A$=" "+"JSR CRLF " \ GOSUB 5110 5850 F$=L8$ 5860 A$=" "+"LDY "+F$ \ GOSUB 5110 5870 A$=L3$+L4$+" LDA "+F$+",Y" \ GOSUB 5110 5880 A$=" "+"JSR OUTCHR" \ GOSUB 5110 5890 A$=" "+"DEY" \ GOSUB 3370 5900 A$=" "+"BNE "+L3$+L4$ \ GOSUB 5190 5910 A3$="NO" 5920 L4=VAL(L4$)+1 5930 L4$=NUM1$(L4) 5940 IF LEN(L4$)<4 THEN L4$="0"+L4$ \ GO TO 5940 5950 GO TO 1840 5960 PRINT #3,"*** NO SUCH INSTRUCTION '";D$;"' ***" 5970 PRINT "* "; 5980 E$="--" 5990 GO TO 6060 6000 PRINT #3,"*** NO OP CODE FOR '";D$;"' FOR MODE '";ER$(A);"' ***" 6010 PRINT "* "; 6020 E$="--" 6030 REM 6040 REM GET LABELS 6050 REM 6060 IF SEG$(A$,1,1)=" " THEN GO TO 6200 6070 L=L+1 6080 L$(L)=SEG$(A$,1,6) 6090 P$(L)=P1$ 6100 FOR J=1 TO L-1 6110 IF L$(L)<>L$(J) THEN GO TO 6180 6120 PRINT #3,"*** DUPLICATE LABEL*** '";L$(L);"'"; 6130 PRINT "* "; 6140 IF Q2$<>"SYM" THEN PRINT #3," " \ GO TO 6190 6150 IF J>56 THEN PRINT #3," " \ GO TO 6190 6160 PRINT #3," IS IN SYM MONITOR, LABEL #",J 6170 GO TO 6190 6180 NEXT J 6190 IF L7=1 THEN L7=0 \ RETURN 6200 B$=P1$+" "+E$+" " 6210 IF W1<3 THEN GO TO 6360 6220 IF Y1$<>"XX" THEN GO TO 6360 6230 IF SEG$(F$,LEN(F$),LEN(F$))="," THEN F$=SEG$(F$,1,LEN(F$)-1) 6240 FOR K4=14 TO 17 6250 IF SEG$(A$,K4,K4+LEN(F$)-1)<>F$ THEN GO TO 6340 6260 A2$=SEG$(A$,K4+LEN(F$),K4+LEN(F$)) 6270 IF A2$="," THEN GO TO 6360 6280 IF A2$=")" THEN GO TO 6360 6290 IF A2$="+" THEN GO TO 6360 6300 IF A2$="-" THEN GO TO 6360 6310 IF A2$=" " THEN GO TO 6360 6320 PRINT #3,"*** OPERAND LABEL TOO LONG ***" 6330 GO TO 6360 6340 NEXT K4 6350 PRINT "ASSEMBLER ERROR AT LINE 6250" 6360 IF W1=1 THEN IF LEN(J1$)=3 THEN B$=B$+Y1$+" " \ GO TO 6400 6370 IF W1=1 THEN B$=B$+" " \ GO TO 6400 6380 IF W1=2 THEN B$=B$+Y1$+" " \ GO TO 6400 6390 IF W1=3 THEN B$=B$+Y1$+" "+Y2$+" " 6400 B$=B$+" "+A$ 6410 PRINT #3,B$ 6420 IF W1=1 THEN IF LEN(J1$)=3 THEN GO TO 6450 6430 IF W1=1 THEN GO TO 6550 6440 IF Y1$<>"XX" THEN GO TO 6480 6450 PRINT #3,F$ 6460 PRINT #3,J1$ 6470 PRINT #3,M 6480 Y1$="XX" 6490 Y2$="XX" 6500 E$="--" 6510 M=0 6520 REM 6530 REM SET PROGRAM COUNTER FOR NEXT INSTRUCTION 6540 REM 6550 GOSUB 7300 \ REM CONVERT HEX TO DEC 6560 W=W+W1 6570 GOSUB 7420 \ REM CONVERT DEC TO HEX 6580 N9=N9+W1 6590 IF A3$="REPEAT" THEN A$=" " \ GO TO 2670 6600 IF A3$="AGAIN" THEN RETURN 6610 REM 6620 GO TO 1840 6630 REM 6640 PRINT #3 6650 PRINT #3,"*END OF FILE" 6660 CLOSE #3 6670 PRINT 6680 PRINT 6690 GO TO 8120 6700 REM 6710 REM DATA FOR B1$ 6720 REM 6730 REM IMPLIED OPERAND INSTRUCTIONS (ONE BYTE ONLY) 6740 DATA BRK,00,CLC,18,CLD,D8,CLI,58,CLV,B8,DEX,CA,DEY,88,INX,E8,INY,C8 6750 DATA NOP,EA,PHA,48,PHP,08,PLA,68,PLP,28,RTI,40,RTS,60,SEC,38,SED,F8 6760 DATA SEI,78,TAX,AA,TAY,A8,TSX,BA,TXA,8A,TXS,9A,TYA,98 6770 REM 6780 REM RELATIVE BRANCH INSTRUCTIONS (TWO BYTES ONLY) 6790 DATA BCC,90,BCS,B0,BEQ,F0,BMI,30,BNE,D0,BPL,10,BVC,50,BVS,70 6800 REM 6810 REM SPECIAL CASES 6820 REM BIT,ABS,ZP 6830 DATA BIT,2C,24 6840 REM JMP,ABS,IND 6850 DATA JMP,4C,6C 6860 REM JSR,ABS 6870 DATA JSR,20 6880 REM 6890 REM GENERAL MULTIPLE MODE INSTRUCTIONS (1ST 4 ARE ACC, NOT IMM) 6900 REM MNEMONIC;IMM;ABS;ABS,X;ABS,Y;(IND,X);(IND),Y;ZP;ZP,X;ZP,Y 6910 DATA ASL,0A,0E,1E,xx,xx,xx,06,16 6920 DATA LSR,4A,4E,5E,xx,xx,xx,46,56 6930 DATA ROL,2A,2E,3E,xx,xx,xx,26,36 6940 DATA ROR,6A,6E,7E,xx,xx,xx,66,76 6950 DATA ADC,69,6D,7D,79,61,71,65,75 6960 DATA AND,29,2D,3D,39,21,31,25,35 6970 DATA CMP,C9,CD,DD,D9,C1,D1,C5,D5 6980 DATA CPX,E0,EC,xx,xx,xx,xx,E4,xx 6990 DATA CPY,C0,CC,xx,xx,xx,xx,C4,xx 7000 DATA DEC,xx,CE,DE,xx,xx,xx,C6,D6 7010 DATA EOR,49,4D,5D,59,41,51,45,55 7020 DATA INC,xx,EE,FE,xx,xx,xx,E6,F6 7030 DATA LDA,A9,AD,BD,B9,A1,B1,A5,B5 7040 DATA LDX,A2,AE,xx,BE,xx,xx,A6,xx,B6 7050 DATA LDY,A0,AC,BC,xx,xx,xx,A4,B4 7060 DATA ORA,09,0D,1D,19,01,11,05,15 7070 DATA SBC,E9,ED,FD,F9,E1,F1,E5,F5 7080 DATA STA,xx,8D,9D,99,81,91,85,95 7090 DATA STX,xx,8E,xx,xx,xx,xx,86,xx,96 7100 DATA STY,xx,8C,xx,xx,xx,xx,84,94 7110 REM MONITOR LABEL DATA FOR SYM PROGRAMS 7120 DATA "A ","----" 7130 DATA "ACCESS","8B86","ACR ","A00B","BEEP ","8972","COMMA ","833A" 7140 DATA "CRLF ","834D","DDRA ","A003","DDRB ","A002","DELAY ","835A" 7150 DATA "DISBUF","A640","GETKEY","88AF","HNTVEC","FFFF","IER ","A00E" 7160 DATA "IFR ","A00D","INCHR ","8A1B","INSTAT","8386","INTCHR","8A58" 7170 DATA "IORA ","A001","IORB ","A000","KEYQ ","8923","KYSTAT","896A" 7180 DATA "LNTVEC","FFFE","MONITR","8000","NACCES","8B9C","ORA ","A00F" 7190 DATA "OUTBYT","82FA","OUTCHR","8A47","P1H ","A64F","P1L ","A64E" 7200 DATA "P2H ","A64D","P2L ","A64C","P3H ","A64B","P3L ","A64A" 7210 DATA "PARM ","8220","PARNR ","A649","PCR ","A00C","RESALL","81C4" 7220 DATA "RESET ","8B4A","SAVER ","8188","SAVINT","8064","SCAND ","8906" 7230 DATA "SCPBUF","A600","SDBYT ","A651","SPACE ","8342","SR ","A00A" 7240 DATA "T1C:H ","A005","T1L:H ","A007","T1L:L ","A004","T1L:LL","A006" 7250 DATA "T2CL:L","A008","T2CTH ","A009","TECHO ","A653","TOUTFL","A654" 7260 DATA "TSTAT ","8B3C","TV ","A656","USRENT","8035","WARM ","8003" 7270 REM 7280 REM CONVERT HEX TO DEC 7290 REM 7300 W=0 7310 FOR J1=1 TO 4 7320 K$=SEG$(P1$,J1,J1) 7330 IF K$>"9" THEN GO TO 7360 7340 W=W*16+VAL(K$) 7350 GO TO 7370 7360 W=W*16+(ASCII(K$)-55) 7370 NEXT J1 7380 RETURN 7390 REM 7400 REM CONVERT DEC TO HEX 7410 REM 7420 FOR J1=4 TO 1 STEP -1 7430 K=INT(W/16) 7440 N=W-(K*16) 7450 W=K 7460 IF N>9 THEN GO TO 7490 7470 G$(J1)=CHR$(48+N) 7480 GO TO 7500 7490 G$(J1)=CHR$(64+N-9) 7500 NEXT J1 7510 P1$=G$(1)+G$(2)+G$(3)+G$(4) 7520 RETURN 7530 REM 7540 REM DETERMINE INDEX 7550 J2$="N" 7560 FOR J=1 TO 8 7570 IF SEG$(A$,14+Z+J,14+Z+J)<>"," THEN GO TO 7740 7580 IF SEG$(A$,14+Z+J,15+Z+J)<>",X" THEN GO TO 7630 7590 A=1 7600 IF J2$="F" THEN GO TO 7980 7610 F$=SEG$(A$,14+Z,14+Z+J) 7620 GO TO 7980 7630 IF SEG$(A$,14+Z+J,15+Z+J)<>",Y" THEN GO TO 7680 7640 A=2 7650 IF J2$="F" THEN GO TO 7980 7660 F$=SEG$(A$,14+Z,14+Z+J) 7670 GO TO 7980 7680 K1$=SEG$(A$,14+Z+J,14+Z+J) 7690 IF K1$<>"X" THEN IF K1$<>"Y" THEN GO TO 7710 7700 GO TO 7740 7710 PRINT #3,"*** INVALID INDEX ***" 7720 PRINT "* "; 7730 F$="----" \ A=0 \ GO TO 7980 7740 IF SEG$(A$,14+Z+J,14+Z+J)="+" THEN GO TO 7790 7750 IF SEG$(A$,14+Z+J,14+Z+J)="-" THEN GO TO 7770 7760 GO TO 7950 7770 M=-1 7780 GO TO 7800 7790 M=1 7800 K$=SEG$(A$,16+Z+J,16+Z+J) 7810 IF K$=" " THEN GO TO 7840 7820 IF K$="," THEN GO TO 7840 7830 GO TO 7930 7840 M$=SEG$(A$,15+Z+J,15+Z+J) 7850 A=0 7860 IF M$>"0" THEN GO TO 7880 7870 GO TO 7930 7880 IF M$>"9" THEN GO TO 7930 7890 M=M*VAL(M$) 7900 F$=SEG$(A$,14+Z,13+Z+J) 7910 IF K$="," THEN J=J+1 \ J2$="F" \ GO TO 7950 7920 GO TO 7980 7930 PRINT #3,"*** INCREMENT MUST BE ONE DECIMAL DIGIT ***" \ GO TO 7960 7940 PRINT "* "; 7950 NEXT J 7960 A=0 7970 F$=SEG$(A$,14+Z,19+Z) 7980 RETURN 7990 REM 8000 REM CHECK FOR HEX VALUES 8010 FOR J1=1 TO LEN(H5$) 8020 H6$=SEG$(H5$,J1,J1) 8030 IF ASCII(H6$)>70 THEN GO TO 8090 8040 IF ASCII(H6$)>64 THEN GO TO 8070 8050 IF ASCII(H6$)>57 THEN GO TO 8090 8060 IF ASCII(H6$)<48 THEN GO TO 8090 8070 NEXT J1 8080 H7=0 \ RETURN 8090 PRINT #3,"*** '";H5$;"' NOT HEX VALUE ***" 8100 PRINT "* "; 8110 H7=1 \ RETURN 8120 REM 8130 CLOSE #1 8140 GOTO 9120 8150 REM V1 IS POINTER IN C$ 8160 REM INPUT LINE PARSER 8170 LINPUT #1,C$ \ L3=L3+1 8180 IF C$=" " THEN A$=C$ \ GO TO 9100 8190 IF SEG$(C$,1,1)=";" THEN A$=C$ \ GO TO 9100 8200 IF SEG$(C$,1,1)="*" THEN A$=C$ \ GO TO 9100 8210 REM REPLACE TABS WITH SPACES 8220 T1$=CHR$(9) 8230 IF SEG$(C$,1,1)<>T1$ THEN GO TO 8250 8240 C$=" "+SEG$(C$,2,80) 8250 V1=1 8260 FOR V=2 TO 80 8270 IF SEG$(C$,V,V)<>T1$ THEN GO TO 8300 8280 C$=SEG$(C$,1,V-1)+" "+SEG$(C$,V+1,80) 8290 V1=V+1 8300 NEXT V 8310 REM EXTRACT LABEL ONLY IF FIRST CHARACTER NOT SPACE 8320 V1=1 8330 IF SEG$(C$,1,1)=" " THEN C1$=" " \ GO TO 8510 8340 REM FIND NEXT BLANK, END OF LABEL 8350 FOR V=2 TO 80 8360 IF SEG$(C$,V,V)<>" " THEN GO TO 8390 8370 V1=V-1 8380 GO TO 8430 8390 NEXT V 8400 PRINT #3,"*** WORD TOO LONG ***" 8410 PRINT "* "; 8420 A$=C$ \ GO TO 9100 8430 C1$=SEG$(C$,1,V1) 8440 IF LEN(C1$)<8 THEN C1$=C1$+" " \ GO TO 8440 8450 IF V1<7 THEN GO TO 8480 8460 PRINT #3,"*** LABEL LONGER THAN 6 CHARACTERS ***" 8470 PRINT "* "; 8480 REM EXTRACT INSTRUCTION 8490 REM FIND NEXT NON-BLANK, START OF INSTRUCTION 8500 V1=V1+2 8510 FOR V=V1 TO 80 8520 IF SEG$(C$,V,V)=" " THEN GO TO 8550 8530 V1=V 8540 GO TO 8570 8550 NEXT V 8560 GO TO 8400 \ REM ERROR 8570 REM DATA LINES 8580 IF SEG$(C$,V1,V1)="#" THEN GO TO 8630 8590 IF SEG$(C$,V1,V1)="@" THEN GO TO 8630 8600 IF SEG$(C$,V1,V1)="<" THEN GOTO 8630 8610 IF SEG$(C$,V1,V1)=">" THEN GOTO 8630 8620 IF SEG$(C$,V1,V1)<>"$" THEN GO TO 8650 8630 A$=C1$+SEG$(C$,V1,80) 8640 GO TO 9100 8650 REM GET MNEMONIC 8660 C2$=SEG$(C$,V1,V1+2)+" " 8670 REM CHECK FOR ERROR 8680 IF SEG$(C$,V1+3,V1+3)<>" " THEN GO TO 8400 8690 REM EXTRACT OPERAND 8700 REM IMPLIED OPERAND INSTRUCTIONS HAVE NO OPERAND 8710 FOR V=1 TO 49 STEP 2 8720 IF C2$=B1$(V) THEN V1=V1+4 \ GO TO 8750 8730 NEXT V 8740 GO TO 8770 8750 C3$=" " 8760 GO TO 8980 8770 REM REQUIRES OPERAND, FIND NEXT NON-BLANK, START OF OPERAND 8780 V1=V1+4 8790 FOR V=V1 TO 80 8800 IF SEG$(C$,V,V)=" " THEN GO TO 8830 8810 V1=V 8820 GO TO 8870 8830 NEXT V 8840 PRINT #3,"*** OPERAND MISSING ***" 8850 PRINT "* "; 8860 C3$=" " \ GO TO 9090 \ REM *ERROR* 8870 REM FIND NEXT BLANK, END OF OPERAND 8880 FOR V=V1+1 TO 80 8890 IF SEG$(C$,V,V)<>" " THEN GO TO 8940 8900 C3$=SEG$(C$,V1,V-1) 8910 IF LEN(C3$)<15 THEN C3$=C3$+" " \ GO TO 8910 8920 V1=V+1 8930 GO TO 8980 8940 NEXT V 8950 PRINT #3,"*** OPERAND TOO LONG ***" 8960 PRINT "* "; 8970 GO TO 9090 \ REM *ERROR* 8980 REM FIND NEXT NON-BLANK, START OF COMMENT 8990 V2=LEN(C$) 9000 IF V2>97 THEN V2=97 9010 FOR V=V1 TO V2 9020 IF SEG$(C$,V,V)=" " THEN GO TO 9050 9030 V1=V 9040 GO TO 9090 9050 NEXT V 9060 REM NO COMMENT, FINISHED 9070 A$=C1$+C2$+C3$ 9080 GO TO 9100 9090 A$=C1$+C2$+C3$+SEG$(C$,V1,V2) 9100 REM FINISHED 9110 RETURN 9120 IF D2$="DWN" THEN GO TO 11110 9130 DIM L7$(2000) 9140 DIM P7$(2000) 9150 PRINT "WORKING ON SECOND PASS" 9160 IF T=4 THEN OPEN Q1$ FOR OUTPUT AS FILE #9 \ MARGIN #9,132% \ T=9 9170 GO TO 9340 9180 REM 9190 REM GET INDEX IN LABEL TABLE 9200 REM 9210 FOR K=2 TO L 9220 IF F$<>L$(K) THEN GO TO 9250 9230 X=K 9240 GO TO 9300 9250 NEXT K 9260 PRINT #T,"*** LABEL NOT FOUND ***",F$ 9270 IF T<>0 THEN PRINT "* "; 9280 E=E+1 9290 X=1 9300 RETURN 9310 REM 9320 REM SECOND PASS 9330 REM 9340 IF T<>0 THEN PRINT "ERRORS DETECTED:"; 9350 OPEN "A1.TMP" FOR INPUT AS FILE #3,SEQUENTIAL 9360 LINPUT #3,A$ 9370 REM CHECK FOR WARNING LINE 9380 IF SEG$(A$,1,3)="!!!" THEN WARNING=WARNING+1\ GOTO 10430 9390 REM CHECK FOR ERROR LINE 9400 IF SEG$(A$,1,3)="***" THEN E=E+1 \ GO TO 10430 9410 REM CHECK FOR GO 9420 IF SEG$(A$,1,5)="*GO $" THEN PRINT #T \ GO TO 10430 9430 IF SEG$(A$,1,4)<>"*GO " THEN GO TO 9490 9440 F$=SEG$(A$,5,9) 9450 GOSUB 9210 \ REM FIND LABEL IN TABLE 9460 PRINT #T,A$ 9470 PRINT #T,"*GO $";P$(X) 9480 PRINT #T \ GO TO 9360 9490 REM CHECK FOR CONTROL LINE 9500 IF SEG$(A$,1,1)="*" THEN GO TO 10430 9510 REM CHECK FOR COMMENT LINE 9520 IF SEG$(A$,1,1)=";" THEN GO TO 10430 9530 REM CHECK FOR BLANK LINE 9540 IF SEG$(A$,1,1)=" " THEN GO TO 10430 9550 REM CHECK FOR COMPLETED LINE 9560 IF SEG$(A$,9,10)<>"XX" THEN GO TO 10430 9570 REM FOR INCOMPLETE LINE GET REST OF DATA 9580 INPUT #3,F$ 9590 INPUT #3,J1$ 9600 INPUT #3,M 9610 IF J1$="RELA" THEN GO TO 10090 9620 REM GET LABEL ADDRESS 9630 GOSUB 9210 \ REM FIND LABEL IN TABLE 9640 REM GO TO APPROPRIATE SECTION 9650 IF J1$="LLI" GO TO 10030 9660 IF J1$="HLI" GO TO 10060 9670 IF J1$="*" GO TO 9820 9680 IF J1$="REL" GO TO 10120 9690 IF J1$="LOI" THEN GO TO 10340 9700 IF J1$="HOI" THEN GO TO 10370 9710 REM IF NONE OF THE ABOVE THEN MERELY A LABEL 9720 IF M=0 THEN GO TO 9790 9730 P1$=P$(X) 9740 GOSUB 7300 \ REM CONVERT HEX TO DEC 9750 W=W+M 9760 GOSUB 7420 \ REM CONVERT DEC TO HEX 9770 H$=SEG$(P1$,3,4)+" "+SEG$(P1$,1,2) 9780 GO TO 10410 9790 H$=SEG$(P$(X),3,4)+" "+SEG$(P$(X),1,2) 9800 GO TO 10410 9810 REM ZERO PAGE ABSOLUTE 9820 IF SEG$(P$(X),1,2)="00" THEN GO TO 9880 9830 E=E+1 9840 PRINT #T,"*** NOT ZERO PAGE ADDRESS ***";" ";L$(X);" ";P$(X) 9850 PRINT "* "; 9860 H$="-- " 9870 GO TO 10410 9880 IF M=0 THEN GO TO 10000 9890 P1$=P$(X) 9900 GOSUB 7300 \ REM CONVERT HEX TO DEC 9910 W=W+M 9920 GOSUB 7420 \ REM CONVERT DEC TO HEX 9930 IF SEG$(P1$,1,2)="00" THEN GO TO 9980 9940 E=E+1 9950 PRINT #T,"*** NOT ZERO PAGE AFTER INCREMENT ***",P1$,F$ 9960 IF T<>0 THEN PRINT "* "; 9970 GO TO 10410 9980 H$=SEG$(P1$,3,4)+" " 9990 GO TO 10410 10000 H$=SEG$(P$(X),3,4)+" " 10010 GO TO 10410 10020 REM IMMEDIATE BYTE FOR LOW ORDER ADDRESS 10030 H$=SEG$(P$(X),3,4)+" " 10040 GO TO 10410 10050 REM IMMEDIATE BYTE FOR HIGH ORDER ADDRESS 10060 H$=SEG$(P$(X),1,2)+" " 10070 GO TO 10410 10080 REM ABSOLUTE ADDRESSES 10090 P1$=F$ 10100 GO TO 10130 10110 REM RELATIVE ADDRESSES 10120 P1$=P$(X) 10130 GOSUB 7300 \ REM CONVERT HEX TO DEC 10140 R=W 10150 P1$=SEG$(A$,1,4) 10160 GOSUB 7300 \ REM CONVERT HEX TO DEC 10170 S=W+2 10180 W=R-S 10190 IF W>127 THEN GO TO 10240 10200 IF W<-128 THEN GO TO 10240 10210 IF W<0 THEN GO TO 10290 10220 GOSUB 7420 \ REM CONVERT DEC TO HEX 10230 GO TO 10310 10240 PRINT #T,"***RELATIVE JUMP OF ";W;" BYTES IS TOO FAR***" 10250 IF T<>0 THEN PRINT "* "; 10260 E=E+1 10270 H$="-- " 10280 GO TO 10410 10290 W=65536+W 10300 GOSUB 7420 \ REM CONVERT DEC TO HEX 10310 H$=SEG$(P1$,3,4)+" " 10320 GO TO 10410 10330 REM LOW ORDER ADDRESS 10340 A$=SEG$(A$,1,5)+SEG$(P$(X),3,4)+SEG$(A$,11,LEN(A$)) 10350 GO TO 10410 10360 REM HIGH ORDER ADDRESS 10370 A$=SEG$(A$,1,5)+SEG$(P$(X),1,2)+SEG$(A$,11,LEN(A$)) 10380 GO TO 10410 10390 REM 10400 REM OUTPUT LINE 10410 A$=SEG$(A$,1,8)+H$+SEG$(A$,14,LEN(A$)) 10420 REM 10430 PRINT #T,A$ 10440 GO TO 9360 10450 REM FINISH 10460 PRINT #T 10470 RESUME 10480 10480 PRINT " " \ PRINT " " 10490 PRINT "SORTING LABEL TABLE" 10500 REM SORT PROGRAM DEFINED LABEL TABLE 10510 J1=2 \ IF Q2$="SYM" THEN J1=58 10520 FOR Y=L-1 TO J1 STEP -1 10530 Z=1 10540 FOR J=J1 TO Y 10550 IF L$(J)"SYM" THEN GO TO 10760 10650 PRINT #T," " 10660 PRINT #T,"SYM MONITOR LABEL TABLE 57 ENTRIES" \ PRINT #T 10670 FOR J=1 TO 15 10680 FOR Y=0 TO 3 10690 W=J+15*Y 10700 IF W>57 THEN GO TO 10720 10710 PRINT #T,L$(W);" ";P$(W);" "; 10720 NEXT Y 10730 PRINT #T 10740 NEXT J 10750 PRINT #T 10760 PRINT #T,"PROGRAM DEFINED LABEL TABLE ";L-57;" ENTRIES" \ PRINT #T 10770 R%=(L-J1+1)/4 10780 FOR J=J1 TO R%+J1 10790 FOR Y=0 TO 3 10800 W=J+Y*(R%+1) 10810 IF WL THEN GO TO 10850 10830 PRINT #T,L$(W);" ";P$(W);" "; 10840 NEXT Y 10850 PRINT #T 10860 NEXT J 10870 W=N9 \ GOSUB 7420 \ REM CONVERT DEC TO HEX 10880 D7=TIME(0) 10890 D5=D7-D6 \ D4=INT(D5/60) \ D3=D5-(D4*60) 10900 PRINT #T 10910 PRINT #T,"*THERE WERE";L3;"LINES ASSEMBLED." 10920 IF T=0 THEN PRINT #T,"*THERE WERE ";L-57;" PROGRAM DEFINED LABELS." 10930 W=N9 \ GOSUB 7420 \ REM CONVERT DEC TO HEX 10940 PRINT #T,"*THE PROGRAM OCCUPIES";N9;"DECIMAL BYTES OF MEMORY." 10950 PRINT #T,"*THE PROGRAM OCCUPIES ";P1$;" HEXADECIMAL BYTES OF MEMORY." 10960 PRINT #T,"*THERE WERE";E;"ERRORS." 10970 PRINT #T,"*THERE WERE";WARNING;"WARNINGS." 10980 PRINT #T,"*ASSEMBLY BEGAN AT ";D6$;" AND ENDED AT ";TIME$(0%) 10990 PRINT #T,"* USING ";D4;" MINUTES AND ";D3;" SECONDS." 11000 PRINT #T,"*END OF ASSEMBLY" 11010 PRINT #T 11020 PRINT 11030 IF T=0 THEN GO TO 11060 11040 T=0 11050 GO TO 10900 11060 CLOSE 9,3 11070 KILL "A1.TMP" 11080 IF T$<>"F" THEN GO TO 11500 11090 IF E<>0 THEN GO TO 11500 11100 REM 11110 R3$=SEG$(Q$,1,LEN(Q$)-4)+".DWN" 11120 PRINT "GENERATING THE DOWN LOAD FILE." 11130 OPEN R3$ FOR OUTPUT AS FILE #7,SEQUENTIAL 11140 OPEN Q1$ FOR INPUT AS FILE #6,SEQUENTIAL 11150 N1$=" "\N1=0 11160 G1$="NONE" 11170 PRINT #7,N1$ 11180 REM PRINT #7,"D";N1$;"0000" 11190 LINPUT #6,A$ 11200 IF SEG$(A$,1,6)=" " THEN GO TO 11190 11210 IF SEG$(A$,1,9)<>"*LOCATE $" THEN GO TO 11260 11220 PRINT #7,N1$ 11230 PRINT #7,"D";N1$;SEG$(A$,10,13);N1$ 11240 N1=1 11250 GO TO 11190 11260 IF SEG$(A$,1,3)<>"*GO" THEN GO TO 11300 11270 IF SEG$(A$,1,5)<>"*GO $" THEN GO TO 11190 11280 G1$=SEG$(A$,6,9) 11290 GO TO 11190 11300 IF SEG$(A$,1,1)="*" THEN GO TO 11190 11310 IF SEG$(A$,1,1)=";" THEN GO TO 11190 11320 IF SEG$(A$,1,3)="SYM" THEN GO TO 11420 11330 IF SEG$(A$,1,3)="PRO" THEN GO TO 11420 11340 IF SEG$(A$,6,7)=" " THEN GO TO 11190 11350 IF N1=1 THEN GO TO 11380 11360 N1=1 11370 PRINT #7,"D";N1$;"0000" 11380 PRINT #7,SEG$(A$,6,7);N1$; 11390 IF SEG$(A$,9,10)<>" " THEN PRINT #7,SEG$(A$,9,10);N1$; 11400 IF SEG$(A$,12,13)<>" " THEN PRINT #7,SEG$(A$,12,13);N1$; 11410 GO TO 11190 11420 PRINT #7,N1$ 11430 IF G1$="NONE" THEN GO TO 11450 11440 PRINT #7,N1$,"G";N1$;G1$;N1$ 11450 PRINT #7,N1$ \ PRINT #7,"D 0150" 11460 PRINT #7,"20 72 89 A0 FF A2 FF 20 06 89 CA D0 FA 88 D0 F5 4C 50 01 " 11470 PRINT #7,"G 0150" 11480 PRINT "DOWN LOAD FILE '";R3$;"' HAS BEEN GENERATED." 11490 CLOSE 6,7 11500 REM 11510 PRINT CHR$(7) 11520 GOTO 11640 11530 IF ERR=11% THEN IF ERL=1930% THEN RESUME 6640% ELSE IF ERL=8170% THEN RESUME 6640% ELSE IF ERL=9360% THEN RESUME 10460% ELSE IF ERL=11190% THEN RESUME 11420% ELSE ON ERROR GOTO 0% 11540 IF ERL=1390% THEN R3$="A1.TMP" \ GOTO 11610 11550 IF ERL=9160% THEN R3$=Q1$ \ GOTO 11610 11560 IF ERL=9350% THEN R3$="A1.TMP" \ GOTO 11610 11570 IF ERL=1800% THEN R3$=Q7$ \ GOTO 11610 11580 IF ERL=11140% THEN R3$=Q1$ \ GOTO 11610 11590 IF ERL=11130% THEN GOTO 11610 11600 GOTO 11620 11610 PRINT "FILE '";R3$;"' NOT AVAILABLE." \ RESUME 11640 11620 PRINT "NON-HANDLED ERROR." 11630 ON ERROR GOTO 0% 11640 GOTO 12010 11650 REM PROGRAM TO CONVERT .PRT TO .SYM FILE 11660 PRINT "WHAT IS THE NAME OF THE '.PRT' FILE TO BE CONVERTED TO '.SYM'?" 11670 INPUT A$ 11680 A$=A$+".PRT" 11690 OPEN A$ FOR INPUT AS FILE #1 11700 MARGIN #1,132 11710 A$=SEG$(A$,1,LEN(A$)-4)+".SYM" 11720 OPEN A$ FOR OUTPUT AS FILE #2 11730 MARGIN #2,132 11740 ON ERROR GOTO 11980 11750 LINPUT #1,A$ 11760 IF A$=" " THEN GO TO 11740 11770 IF SEG$(A$,1,3)="***" THEN E=E+1 \ GO TO 11740 11780 IF SEG$(A$,1,4)="*THE" THEN GO TO 11980 11790 IF SEG$(A$,1,3)="*PR" THEN GO TO 11740 11800 IF SEG$(A$,1,4)="*THI" THEN GO TO 11740 11810 IF SEG$(A$,1,3)<>"*GO" THEN GO TO 11840 11820 IF SEG$(A$,5,5)="$" THEN GO TO 11840 11830 LINPUT #1,C$ \ REM SKIP THE NEXT LINE 11840 IF SEG$(A$,1,1)="*" THEN B$=A$ \ GO TO 11950 11850 IF SEG$(A$,1,1)=";" THEN B$=A$ \ GO TO 11950 11860 IF LEN(A$)<20 THEN GO TO 11740 11870 IF SEG$(A$,1,3)="SYM" THEN GO TO 11980 11880 B$=SEG$(A$,18,LEN(A$)) 11890 IF SEG$(B$,9,10)<>"PR" THEN GO TO 11950 11900 IF SEG$(B$,11,11)="I" THEN K=5 11910 IF SEG$(B$,11,11)="C" THEN K=6 11920 FOR J=1 TO K 11930 LINPUT #1,A$ 11940 NEXT J 11950 REM PRINT B$ 11960 PRINT #2,B$ 11970 GO TO 11740 11980 CLOSE #1,#2 11990 IF E<>0 THEN PRINT "ERROR LINES DELETED:";E 12000 PRINT "FINISHED." 12010 END