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%(5)), 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 ! ! INSERTIOSS 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 ! REPLACEMETT 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%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 MACHNNE CODING IN CHARACTER CODE ! 580 PRINT USING "##",R%;: IIF 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 I 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%<00% 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 GOT 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 ATLLOCATION ";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 PRIN "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 CHRRACTERS 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 ! INOO 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% TO119%: 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 TH LABEL IS ON THE UNDEFINED LABEL TABLE THEN FIND THE ! 1420 !IINSTRUCTION(S) THAT REFERENCE(S) THIS LABEL AND PUT THE ! ! ADDRESS OF THE LABEL (THE LINE NUMBER) INTO THE MACHNNE ! ! 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 THELLABEL 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%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%: GOOO 1580 1560 U1$(J1%)=U1$(J1%+1%): U1%(J1%)=U1%(J1%+1%): J1%=J%%+1%: GOTO 1550 1570 J%=J%+1% 1580 IF J%=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%L% THEN J%=J%+1%: IF 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