
100 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
    !                                                                  !
    !                            MIGIT                                 !
110 !     THIS PROGRAM IS DESIGNED TO ACCEPT THE ASSEMBLY LANGUAGE     !
    ! CALLED 'MIGIT' AND EMULATE ITS INSTRUCTIONS.  THE FEATURES       !
    ! BUILT INTO THIS PROGRAM ALLOW THE 'MIGIT' PROGRAMMER TO INPUT    !
120 ! AND EDIT HIS ASSEMBLY LANGUAGE INSTRUCTIONS, AS WELL AS RUN AND  !
    ! LIST HIS PROGRAM.                                                !
    ! THE SECTIONS OF REMARKS THROUGHOUT THIS PROGRAM WILL HOPEFULLY   !
130 ! AID ANYONE WHO WISHES TO STUDY THIS EDITOR VERSION.              !
    !                                                                  !
    !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
140 !                                                                  !
    !     THIS FIRST SECTION INITIALIZES THE PROGRAM.  THE PROGRAMMER  !
    ! IS ASKED FOR HIS NAME (FOR LISTING).                             !
150 !                                                                  !
    !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
160 DIM O$(19%):  READ O$(J%) FOR J%=0% TO 19%:
    DATA "IN","ST", , , , , , , ,"TR","TN","TZ","TP"
170 DATA "HT","OU","PL","AD","SB","MP","DV"
180 !
    !     PROGRAM INITIALIZATION
    !
190 DIM B1$(50%),B1%(50%),U1$(50%),U1%(50%),A1$(50%),A1%(50),
        M%(100%,3%),M1%(100%)
200 V$=SYS(CHR$(6%)+CHR$(-7%)):  ON ERROR GOTO 1200:
    OPEN "KB:" AS FILE 1%:  E%=100%
210 INPUT "PLEASE TYPE IN YOUR NAME";X$
220 RANDOMIZE:  M%(J%,0%)=INT(RND*10000%) FOR J%=0% TO 100%
230 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
    !                                                                  !
    !     THIS SECTION INPUTS THE INSTURCTION.  IF THE INSTRUCTION     !
240 ! IS FOUND TO CONTAIN NO LINE NUMBER WE BRANCH TO THE SECTION      !
    ! THAT INVESTIGATES EDITORING INSTRUCTIONS.  IF THE LINE NUMBER    !
    ! OF THE INSTRUCTION IS LESS THAN OR EQUAL TO THE LINE NUMBER OF   !
250 ! THE LAST INSTRUCTION WE BRANCH TO THE SECTION THAT HANDLES       !
    ! INSERTIONS OR SUBSTITUTIONS.                                     !
    !                                                                  !
260 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
270 PRINT:  PRINT "READY"
280 I%=1%:  INPUT #1%,I$:  IF LEN(I$)=0% THEN 280 ELSE GOSUB 1250:
    ON ERROR GOTO 440:  L%=VAL(A$):  IF L%=0% OR L%>E% THEN 420 ELSE
    IF L%<=Z% THEN 350
290 GOSUB 1960:  M%(Z%,3%)=L%:  M%(L%,2%)=Z%:  Z%=L%:  GOTO 280
300 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
    !                                                                  !
    !     THIS SECTION HANDLES THE INSERTION OF AN INSTRUCTION OR THE  !
310 ! REPLACEMENT OF A PREVIOUS INSTRUCTION.  IF THERE IS AN INSERTION !
    ! WE FIRST MUST BUILD THE MACHINE CODING AS USUAL.  WE THEN FIND   !
    ! THE POSITION IN THE MACHINE CODING ARRAY AND CHANGE THE POINTERS !
320 ! TO POINT TO THIS NEW INSTRUCTION AND FOR THE NEW INSTRUCTION     !
    ! TO POINT TO THE NEXT INSTRUCTION.                                !
    !     IF THE NEW INSTRUCTION IS A REPLACEMENT OF A PREVIOUS        !
330 ! INSTRUCTION THEN THE SUBROUTINE THAT IS USED TO DELETE AN        !
    ! INSTRUCTION IS CALLED.  WE THEN INSERT THE NEW INSTRUCTION.      !
    !                                                                  !
340 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
350 IF M%(L%,2%)<>0% OR M%(L%,3%)<>0% THEN GOSUB 1730
360 GOSUB 1960:  K%=0%
370 P%=M%(K%,3%):  IF P%=0% THEN 390 ELSE IF P%<L% THEN K%=P%:  GOTO 370
380 M%(P%,2%)=L%:  M%(L%,3%)=P%
390 M%(L%,2%)=K%:  M%(K%,3%)=L%:  GOTO 280
400 !
    !     ERRORS
    !
410 PRINT "ILLEGAL OPCODE":  GOTO 270
420 PRINT "ILLEGAL LINE NUMBER":  GOTO 270
430 PRINT "ILLEGAL ADDRESS":  GOTO 270
440 IF ERR<>52% THEN 1200 ELSE
    IF A$="LIST"   THEN RESUME 540  ELSE
    IF A$="TAPE"   THEN RESUME 540  ELSE
    IF A$="RUN"    THEN RESUME 770  ELSE
    IF A$="DELETE" THEN RESUME 1020
450 IF A$="DUMP"   THEN RESUME 1070 ELSE
    IF A$="NEW"    THEN RESUME 1190 ELSE
    IF A$="EXIT"   THEN RESUME 2000 ELSE RESUME 1160
460 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
    !                                                                  !
    !      THIS ROUTINE LISTS A MIGIT PROGRAM.  IN THIS ROUTINE WE     !
470 ! MUST USE THE POINTERS WE CREATED IN THE ASSEMBLER PORTION TO     !
    ! ASVANCE THROUGH THE MACHINE CODING ARRAY UNTIL WE GET TO THE     !
    ! LINE NUMBER OF THE END STATEMENT.  R% IS THE VARIABLE USED TO    !
480 ! REPRESENT THE LINE NUMBERS.  M%(R%,3%) POINTS TO THE NEXT IN-    !
    ! STRUCTION.                                                       !
    !     FIRST OF ALL R% IS TESTED TO SEE IF IT IS ZERO.  IF IT IS    !
490 ! ZERO WE HAVE REACHED THE END OF THE INSTRUCTIONS AND WE PRINT    !
    ! THE END STATEMENT AND IT'S LINE NUMBER.                          !
500 !     SECONDLY, WE SEARCH THE LABEL ADDRESS TABLE FOR THE          !
    ! CORESPONDING LINE NUMBER EQUAL TO R%, THAT IS, WE TEST TO SEE    !
    ! IF THE INSTRUCTION HAS A LABEL.  NEXT WE DECODE THE OPCODE AND   !
510 ! PICK UP THE ADDRESS.  EACH PORTION OF THE INSTRUCTION IS PRINTED !
    ! OUT AS IT IS FOUND.                                              !
    !                                                                  !
520 !      THIS ROUTINE ALSO ALLOWS THE PROGRAMMER TO GET A PAPER      !
    ! TAPE OF HIS PROGRAM (A VERY HANDY TOOL).  IN PRODUCING THE TAPE, !
    ! SEVERAL RETURN CHARACTERS ARE PUNCHED FOR A LEADER, THE HEADING  !
530 ! IS OMITTED, AND THEN A FINAL LEADER IS PRINTED.                  !
    !                                                                  !
    !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
540 ON ERROR GOTO 1200:  R%,F%=0%:  IF A$="TAPE" THEN
    PRINT CHR$(16%); FOR J%=0% TO 50%            ELSE
    PRINT:  PRINT X$,TIME$(0%),DATE$(0%):
    PRINT "LOC  CODE  LABEL  OP  ADDRESS"
550 R%=M%(R%,3%):  IF R%<>0% THEN 580 ELSE
    PRINT USING "##",E%;:  PRINT TAB(18%);"END":
    IF A$="TAPE" THEN PRINT CHR$(16%); FOR J%=0% TO 25%
560 GOTO 270
570 !
    !     PRINT LINE NUMBER AND MACHINE CODING IN CHARACTER CODE
    !
580 PRINT USING "##",R%;:  IF A$="TAPE" THEN 620 ELSE
    Z1$=NUM$(M%(R%,0%)):  Z1%=LEN(Z1$):  Z2%=7%-Z1%:
    Z1$=SPACE$(Z2%)+Z1$:  CHANGE Z1$ TO Z1%
590 FOR U%=2% TO 7%:
    IF Z1%(U%)<>32% THEN 600 ELSE Z1%(U%)=48%:  NEXT U%
600 CHANGE Z1% TO Z1$:  PRINT TAB(4%);Z1$;
610 !
    !     SEARCH LABEL ADDRESS TABLE FOR LINE NUMBER
    !
620 FOR J%=0% TO B1%:
    IF B1%(J%)=R% THEN R$=B1$(J%):  GOTO 640
630 NEXT J%:  R$=""
640 PRINT TAB(10%);R$;
    !
    !     RESOLVE OPCODES
    !
650 IF M%(R%,1%)=0% THEN M%=M%(R%,0%)/1000%:  GOTO 680
660 IF M%(R%,1%)=-1% THEN R$="DC" ELSE R$="DS"
670 GOTO 710
680 IF M%=0%  THEN R$="IN" ELSE
    IF M%=1%  THEN R$="ST" ELSE
    IF M%=9%  THEN R$="TR" ELSE
    IF M%=10% THEN R$="TN" ELSE
    IF M%=11% THEN R$="TZ" ELSE
    IF M%=12% THEN R$="TP" ELSE GOTO 700
690 GOTO 710
700 IF M%=13% THEN R$="HT" ELSE
    IF M%=14% THEN R$="OU" ELSE
    IF M%=15% THEN R$="PL" ELSE
    IF M%=16% THEN R$="AD" ELSE
    IF M%=17% THEN R$="SB" ELSE
    IF M%=18% THEN R$="MP" ELSE R$="DV"
710 PRINT TAB(18%);R$;:
    FOR J%=0% TO A1%:
    IF A1%(J%)=R% THEN PRINT TAB(22%);A1$(J%):  GOTO 550
720 NEXT J%: PRINT "ASSEMBLER ERROR":  GOTO 270
730 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
    !                                                                  !
    !     THIS SECTION EXECUTES THE MIGIT PROGRAM.  AGAIN WE NUST USE  !
740 ! THE POINTERS CREATED IN THE ASSEMBLER TO ADVANCE OUR WAY         !
    ! THROUGH THE MACHINE CODING.  R% IS THE VARIABLE USED TO          !
    ! REPRESENT THE LINE NUMBER OF THE INSTRUCTION AND M%(R%,3%) IS    !
750 ! THE POINTER TO THE NEXT INSTRUCTION.                             !
    !     THE INSTRUCTION IS FIRST BROKEN INTO ITS OPCODE AND ADDRESS  !
    ! THEN THE OPCODE IS EXECUTED ACCORDINGLY.                         !
760 !                                                                  !
    !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
770 ON ERROR GOTO 1200:  IF U1%<>0% THEN PRINT "UNDEFINED VARIABLES;":
    PRINT U1$(J%), FOR J%=0% TO U1%-1%:  GOTO 270
780 R%=0%:  M1%(J%)=M%(J%,0%) FOR J%=0% TO 100%
790 R%=M%(R%,3%):  M%=M1%(R%)/1000%:  M1%=M1%(R%)-M%*1000%:
    IF M%=0% THEN 810 ELSE IF M%=1% THEN 820 ELSE
    M%=M%-8%: ON ERROR GOTO 950
800 ON M% GOTO 830,840,850,860,870,880,890,900,910,920,930
810 INPUT M1%(M1%):  GOTO 790     ! INPUT
820 M1%(M1%)=A%:     GOTO 790     ! STORE
830 R%=M%(M1%,2%):   GOTO 790     ! TRANSFER
840 IF A%<0% THEN 830 ELSE GOTO 790 ! TRANSFER IF ACCUMULATOR<0
850 IF A%=0% THEN 830 ELSE GOTO 790 ! TRANSFER IF ACCUMULATOR=0
860 IF A%>0% THEN 830 ELSE GOTO 790 ! TRANSFER IF ACCUMULATOR>0
870 GOTO 270:                     !HALT
880 PRINT M1%(M1%):   GOTO 790    ! OUTPUT
890 A%=M1%(M1%):     GOTO 790    ! PLACE N IN ACCUMULATOR
900 A%=A%+M1%(M1%):  GOTO 790    ! ADD N TO ACCUMULATOR
910 A%=A%-M1%(M1%):  GOTO 790    ! SUBTRACT N FROM ACCUMULATOR
920 A%=A%*M1%(M1%):  GOTO 790    ! MULTIPLY ACCUMULATOR BY N
930 A%=A%/M1%(M1%):  GOTO 790    ! DIVIDE ACCUMULATOR BY N
940 !
     !     ERROR IN EXECUTION
     !
950 IF ERR<>58% THEN 960 ELSE
     PRINT "OPCODE ERROR AT LOCATION ";R%:  RESUME 270
960 IF ERR<>51% AND ERR<>52% THEN 970 ELSE
     PRINT "ILLEGAL NUMBER":  RESUME
970 IF ERR<>61% THEN 980 ELSE
     PRINT "DIVISION BY ZERO AT LOCATION ";R%:  RESUME 270
980 IF ERR<>55% THEN 1200 ELSE
     PRINT "ADDRESSING ERROR AT LOCATION ";R%:  RESUME 270
990 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
     !                                                                 !
     !     THIS SECTION DELETES ONE LINE FROM THE MACHINE CODING.  IT  !
1000 ! FIRST PICKS UP THE LINE NUMBER TO BE DELETED AND THEN USES      !
     ! THE DELETE SUBROUTINE TO DO THE ACTUAL WORK.                    !
1010 !                                                                 !
     !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
1020 GOSUB 1250:  L%=VAL(A$):  IF L%=0% THEN 420 ELSE
     IF L%=E% THEN E%=100% ELSE GOSUB 1730
1030 GOTO 270
1040 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
     !                                                                 !
     !      THIS SECTION ALLOWS THE USER TO GET A CODING DUMP          !
1050 ! OF A DESIGNATED AREA.  HE MAY EITHER DUMP A SECTION OF CORE     !
     ! OR HE MAY DESIGNATE A VARIABLE TO BE DUMPED.                    !
1060 !                                                                 !
     !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
1070 GOSUB 1250:  ON ERROR GOTO 1120:  L%=VAL(A$):  GOSUB 1250:
     IF A$<>"-" THEN R%=L% ELSE GOSUB 1250:  R%=VAL(A$)
1080 ONERROR GOTO 1200
1090 PRINT:  PRINT "ACCUMULATOR ";A%
1100 PRINT M1%(L%), FOR L%=L% TO L%+4%:
     IF L%>=R% THEN 270 ELSE L%=L%+1%:  GOTO 1100
1110 !
     !     DUMP A VARIABLE
     !
1120 IF ERR<>52% THEN 1200 ELSE RESUME 1130
1130 FOR J%=0% TO B1%-1%:
     IF B1$(J%)=A$ THEN PRINT M1%(B1%(J%)):  GOTO 270
1140 NEXT J%
1150 !
     !     ERRORS
     !
1160 PRINT "WHAT?":  GOTO 270
1170 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
     !                                                                 !
     !      THIS SECTION ALLOWS THE USER TO START A NEW PROGRAM.       !
1180 !                                                                 !
     !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
1190 MAT B1%=ZER: MAT U1%=ZER: MAT A1%=ZER: MAT M1%=ZER: MAT M%=ZER:
     Z%,B1%,U1%,A1%=0%:  E%=100%:  GOTO 270
1200 V$=SYS(CHR$(0%)):
     IF ERR=28 THEN V$=SYS(CHR$(6%)+CHR$(-7%)):  RESUME 270
1210 RESUME
1220 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
     !                                                                 !
     !     THE PURPOSE OF THIS SUBROUTINE IS TO ADVANCE THROUGH AN     !
1230 ! INSTRUCTION STARTING AT THE CHARACTER POINTED TO BY I%.  IT     !
     ! SKIPS ALL BLANKS AND SETS A$ EQUAL TO THE CHARACTERS FROM THE   !
     ! FIRST NON-BLANK CHARACTER TO THE FIRST BLANK.                   !
1240 !                                                                 !
     !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
1250 A$=""
1260 IF MID(I$,I%,1%)<>" " THEN 1270 ELSE I%=I%+1%:
     IF I%>LEN(I$) THEN RETURN ELSE GOTO 1260
1270 P$=MID(I$,I%,1%):  IF ASCII(P$)=32% OR LEN(P$)=0% THEN RETURN ELSE
     IF P$=CHR$(16%) OR P$=CHR$(2%) THEN I%=I%+1%:  GOTO 1260
1280 A$=A$+P$:  I%=I%+1%:  GOTO 1270
1290 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
     !                                                                 !
     !     THE PURPOSE OF THIS SUBROUTINE IS TO BREAK AN INSTRUCTION   !
1300 ! INTO ITS COMPONENTS AND TEST IF THE OPCODE IS LEGAL.  THE       !
     ! BREAK DOWN IS BASED ON THE LINE NUMBERS OF THE END STATEMENTS.  !
     !                                                                 !
1310 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
1320 GOSUB 1250:  L$=A$:  GOSUB 1250:  O$=A$:  GOSUB 1250:
     IF LEN(A$)<>0% THEN 1360 ELSE IF LEN(O$)<>0% THEN 1340 ELSE
     IF L$<>"HT" THEN IF L$<>"END" THEN 430 ELSE E%=L%:  GOTO 280
1330 O$=L$:  L$="":  O1%=13000%:  RETURN
1340 IF O$<>"HT" THEN A$=O$:  O$=L$:  L$=""
1350 !
     !     TEST FOR LEGAL OPCODE
     !
1360 FOR J%=0% TO 19%:
     IF O$=O$(J%) THEN O1%=J%*1000%:  RETURN
1370 NEXT J%
1380 O1%=-1%: RETURN
1390 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
     !                                                                 !
     !     THE PURPOSE OF THIS SUBROUTINE IS TO TEST IF THE LABEL IS   !
1400 ! A DUPLICATE LABEL, IF THE LABEL PRESENTLY RESIDES ON THE        !
     ! UNDEFINED LABEL TABLE, AND IF THE ADDRESS IS ON THE LABEL TABLE.!
     !     IF THE LABEL IS DISCOVERED ON THE LABEL TABLE, WE HAVE      !
1410 ! COME ACROSS A DUPLICATE  LABEL AND AN ERROR WILL BE PLAGGED.    !
     ! IF IT IS A NEW LABEL THEN PLACE IT ON THE LABEL TABLE.          !
     !     IF THE LABEL IS ON THE UNDEFINED LABEL TABLE THEN FIND THE  !
1420 ! INSTRUCTION(S) THAT REFERENCE(S) THIS LABEL AND PUT THE         !
     ! ADDRESS OF THE LABEL (THE LINE NUMBER) INTO THE MACHINE         !
     ! LANGUAGE CODING(S).                                             !
1430 !     IF THE ADDRESS IS ON THE LABEL TABLE THEN PLACE THE ADDRESS !
     ! OF THE LABEL IN THE MACHINE CODE OF THE INSTRUCTION.  HOWEVER,  !
     ! IF THE ADDRESS IS NOT ON THE LABEL TABLE THEN PLACE IT ON THE   !
1440 ! UNDEFINED LABEL TABLE.                                          !
     !                                                                 !
     !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
1450 !
     !     TEST TO SEE IF THE LABEL IS ON THE LABEL TABLE
     !
1460 IF LEN(L$)=0% THEN 1600 ELSE J%=0%:
     IF B1%=0% THEN 1490
1470 IF B1$(J%)=L$ THEN PRINT "DUPLICATE LABEL AT LINE ";L%:  GOTO 270
1480 J%=J%+1%:  IF J%<B1% THEN 1470
1490 B1$(B1%)=L$:  B1%(B1%)=L%:  B1%=B1%+1%
1500 !
     !     TEST TO SEE IF LABEL IS ON UNDEFINED LABEL TABLE
     !
1510 J%=0%:  IF U1%=0% THEN 1600
1520 IF U1$(J%)<>L$ THEN 1570
1530 !
     !     IF THE LABEL IS ON THE UNDEFINED  LABEL TABLE THEN PLACE THE
     !     LABEL'S ADRESS INTO THE MACHINE CODING.  THEN REMOVE THE
     !     LABEL FORM THE UNDEFINED LABEL TABLE.
     !
1540 M%(U1%(J%),0%)=M%(U1%(J%),0%)+L%:  J1%=J%
1550 IF J1%>U1%-2% THEN U1%=U1%-1%: GOTO 1580
1560 U1$(J1%)=U1$(J1%+1%): U1%(J1%)=U1%(J1%+1%):  J1%=J1%+1%:  GOTO 1550
1570 J%=J%+1%
1580 IF J%<U1% THEN 1520
1590 !
     !     TEST IF THE ADDRESS IS ON THE LABEL TABLE.
     !          IF NOT PUT IT ON THE UNDEFINED LABEL TABLE
     !
1600 A1$(A1%)=A$: A1%(A1%)=L%: A1%=A1%+1%: J%=0%: IF LEN(A$)=0% THEN
     RETURN ELSE IF O1%=-1% THEN IF INSTR(1%,A$,"-")=1% OR
     (ASCII(A$)>=48% AND ASCII(A$)<=58%) THEN RETURN ELSE
     IF B1%=0% THEN 1630
1610 IF B1$(J%)=A$ THEN M%(L%,0%)=M%(L%,0%)+B1%(J%):  RETURN
1620 J%=J%+1%:  IF J%<B1% THEN 1610
1630 U1$(U1%)=A$:  U1%(U1%)=L%:  U1%=U1%+1%:  RETURN
1640 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
     !                                                                 !
     !     THE PURPOSE OF THIS SUBROUTINE IS TO DELETE ONE MIGIT       !
1650 ! INSTRUCTION.  IT FIRST SEARCHES THE SYMBOL ADDRESS TABLE TO SEE !
     ! IF THE LINE NUMBER IS THERE.  IF THE LINE NUMBER IS THERE WE    !
     ! MUST THEN SEARCH THE ADDRESS TABLE TO SEE IF THE LABEL IS ON IT !
1660 ! IF THE LABEL IS ON THE ADDRESS TABLE WE MUST PLACE THE LABEL    !
     ! ON THE UNDEFINED LABEL TABLE, ASSOCIATED WITH THE LINE NUMBER   !
     ! THAT REFERENCES THAT LABEL.  THE LABEL IS THEN REMOVED FROM     !
1670 ! THE LABEL TABLE.                                                !
     !     AFTER THE LABEL HAS BEEN TAKEN CARE OF WE THEN PROCEED TO   !
     ! HANDLE THE ADDRESS.  THE ADDRESS'S ADDRESS TABLE IS SEARCHED    !
1680 ! FOR THE LINE NUMBER.  AFTER THE LINE NUMBER HAS BEEN FOUND,     !
     ! THAT ADDRESS IS THEN REMOVED FROM THE ADDRESS TABLE.            !
     !     THE UNDEFINED LABLE ADDRESS TABLE IS THEN SEARCHED TO       !
1690 ! DISCOVER IF THE LINE NUMBER WAS REFERENCED FOR AN UNDEFINED     !
     ! LABEL.  IF THE LINE NUMBER IS DISCOVERED ON THE UNDEFINED LABEL !
     ! TABLE, THE UNDEFINED LABEL IS REMOVED.                          !
1700 !     TO COMPLETE THE DELETION PROCESS, THE MACHINE CODING FOR    !
     ! THAT INSTRUCTION IS ZERO FILLED, AND THE POINTERS TO THE INSTR- !
     ! UCTION ARE MODIFIED.                                            !
1710 !                                                                 !
     !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
1720 !
     !     LOOK FOR LINE NUMBER ON SYMBOL ADDRESS TABLE
     !
1730 IF B1%=0% THEN 1820 ELSE J%=0%
1740 IF B1%(J%)<>L% THEN J%=J%+1%:  IF J%<B1% THEN 1740 ELSE GOTO 1820
1750 !
     !     SEARCH ADDRESS TABLE FOR THE LABEL
     !
1760 K%=0%
1770 IF A1$(K%)=B1$(J%) THEN
     U1$(U1%)=A1$(K%):  U1%(U1%)=A1%(K%):  U1%=U1%+1%:
     M%(A1%(K%),0%)=M%(A1%(K%),0%)/1000%*1000%
1780 K%=K%+1%:  IF K%<A1% THEN 1770
1790 !
     !     REMOVE THE LABEL FROM THE LABEL TABEL
     !
1800 FOR J1%=J% TO B1%-2%:
     B1$(J1%)=B1$(J1%+1%):  B1%(J1%)=B1%(J1%+1%):  NEXT J1%:  B1%=B1%-1%
1810 !
     !     REMOVE ADDRESS FROM ADDRESS TABLE
     !
1820 FOR J%=0% TO A1%-1%:  IF A1%(J%)=L% THEN 1840
1830 NEXT J%:  GOTO 1860
1840 FOR J1%=J% TO A1%-2%: A1$(J1%)=A1$(J1%+1%):  A1%(J1%)=A1%(J1%+1%):
         NEXT J1%:  A1%=A1%-1%
1850 !
     !     SEARCH FOR ADDRESS ON UNDEFINED LABEL TABLE
     !
1860 IF U1%=0% THEN 1920
1870 FOR J%=0% TO U1%-1%:  IF U1%(J%)<>L% THEN 1900
1880 FOR J1%=J% TO U1%-2%:
     U1$(J1%)=U1$(J1%+1%):  U1%(J1%)=U1%(J1%+1%):  NEXT J1%:  U1%=U1%-1%
1890 GOTO 1920
1900 NEXT J%
1910 !
     !     CHANGE POINTERS AND ZERO FILL MACHINE CODING
     !
1920 M%(M%(L%,2%),3%)=M%(L%,3%):  M%(M%(L%,3%),2%)=M%(L%,2%):
     M%(L%,J%)=0% FOR J%=0% TO 3%:  RETURN
1930 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
     !                                                                 !
     !      THE PURPOSE OF THIS SUBROUTINE IS TO PIECE TOGETHER THE    !
1940 ! MACHINE CODING AND USE THE INDICATORS OF "-1" FOR A "DC" DECLAR-!
     ! ATIVE AND "-2" FOR A "DS" DECLARATIVE.                          !
1950 !                                                                 !
     !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
1960 M%(L%,0%)=0%:  GOSUB 1320:
     IF O1%<>-1% THEN GOSUB 1460:  M%(L%,0%)=M%(L%,0%)+O1%:  RETURN
1970 IF O$<>"DC" AND O$<>"DS" THEN 410 ELSE GOSUB 1460:
     IF O$="DS" THEN M%(L%,1%)=-2%:  RETURN
1980 IF INSTR(1%,A$,"-")=1% OR (ASCII(A$)>=48% AND ASCII(A$)<=57%) THEN
     M%(L%,0%)=VAL(A$)
1990 M%(L%,1%)=-1%:  RETURN
2000 END

Ready

U
