home *** CD-ROM | disk | FTP | other *** search
/ CP/M / CPM_CDROM.iso / simtel / sigm / vols000 / vol043 / tincmp.pgn < prev    next >
Text File  |  1984-04-29  |  11KB  |  649 lines

  1.  TOP; TINCMP COPYRIGHT (C) 1981 W.A.GALE
  2.  PARAMETER KLF=010; CP/M MODIFICATION AND 8080 RECODING
  3.  PARAMETER KCR=013; BY A. L. BENDER, M. D.
  4.  PARAMETER KEF=026; NEW MODS AND REWORKING COPYRIGHT (C) 1981 A L BENDER, M D
  5.  BYTE AA; WORK
  6.  BYTE BB; WORK BYTE
  7.  BYTE DD; WORK
  8.  BYTE EE; WORK BYTE
  9.  
  10.  BYTE BF(080); EXPANSION BUFFER
  11.  BYTE BL; BLANK
  12.  BYTE BP; POINTER INTO BF
  13.  BYTE C0; CONSTANT ZERO
  14.  BYTE C1; CONSTANT ONE
  15.  BYTE C2; CONSTANT TWO
  16.  BYTE C3; CONSTANT 3
  17.  BYTE C4; CONSTANT  040
  18.  BYTE C8; CONSTANT 080
  19.  BYTE C9; CONSTANT 9
  20.  BYTE CC; INPUT CHARACTER
  21.  BYTE CX; CONSTANT TEN
  22.  
  23.  BYTE DG; DIGIT FROM PARAMTER TREATMENT DEFINITION
  24.  BYTE DS(010); DIGIT STACK FOR SUB SD
  25.  BYTE EF; END FILE CHARACTER
  26.  BYTE F1(00128); INPUT BUFFER
  27.  BYTE F2(00128); OUTPUT BUFFER
  28.  BYTE HA; 'A'
  29.  BYTE HF; 'F'
  30.  BYTE LE; END OF LIST
  31.  BYTE LF; LINE FEED CHARACTER
  32.  BYTE LS(09000); LIST OF MACRO DEFINITIONS
  33.  BYTE MF; MACRO REPLACEMENT OPERATOR FLAG
  34.  BYTE ML; MACRO LENGTH
  35.  BYTE MM; MINIMUM MACRO LENGTH
  36.  
  37.  BYTE ND; NUMBER OF DIGITS USED IN SUB SD FOR NUMBER OUTPUT
  38.  BYTE NL; NEW LINE
  39.  BYTE O1; FETCH CODE
  40.  BYTE O2; INDEX CODE
  41.  BYTE O3; DISPOSE CODE
  42.  BYTE OA; '+' ADD OPERATOR
  43.  BYTE OB; '!' POP STACK OPERATOR
  44.  BYTE OC; 'C' CHARACTER DISPOSE
  45.  BYTE OD; 'V' DIGIT CONVERSION FETCH
  46.  BYTE OE; ESCAPE CHARACTER
  47.  BYTE OG; IGNORE CHARACTER
  48.  BYTE OH; 'H' HEX CONVERSION FETCH
  49.  BYTE OL; 'L' LITERAL FETCH
  50.  BYTE OM; '*' MULTIPLY DISPOSE
  51.  BYTE ON; 'N' NUMERIC LITERAL FETCH
  52.  
  53.  BYTE OP; 'P' PARAMETER FETCH OR DISPOSE
  54.  BYTE OR; '-' REDUCE (SUBTRACT) DISPOSE
  55.  BYTE OS; 'S' STACK FETCH OR DISPOSE
  56.  BYTE OT; TRACE FLAG TURN ON
  57.  BYTE PP; POINTER INTO IPR
  58.  BYTE RB; BEGIN DEFINITION FLAG
  59.  BYTE RC; (COMMENT) END OF LINE FLAG
  60.  BYTE SF; SUBSTITUTION PARAMETER FLAG
  61.  BYTE SP; STACK POINTER
  62.  BYTE TR; TRUE IF NO TRACE
  63.  BYTE UG; USE IGNORE;  TRUE UNLESS OG IS 'X'
  64.  
  65.  BYTE UN; NOT X-- FLAG FOR NOT SUPPRESSING NEW LINES ON OUTPUT
  66.  BYTE UO; USE OPERATIONS-- TRUE UNLESS MF IS 'X'
  67.  BYTE UT; USE TRACE  TRACE MODE IS ON
  68.  BYTE ZR; CHARACTER ZERO
  69.  INT I00; CONSTANT ZERO
  70.  INT I01; CONSTANT 1
  71.  INT I09; CONSTANT 9
  72.  INT I10; CONSTANT 10
  73.  INT I16; CONSTANT 16
  74.  INT IAA; WORK
  75.  INT IBB;  WORKING STORAGE
  76.  INT IBC; BUCKET NUMBER
  77.  INT IDP; DEFINITION POINTER WHILE MATCH
  78.  INT IED; POINTS TO END OF DEFINITIONS
  79.  INT III; POINTER TO L WHILE READING
  80.  INT IJJ; POINTER TO L READING CODE
  81.  INT ILM; MAXIMUM LIMIT FOR STORING IN L
  82.  
  83.  INT ILP(01000); POINTERS TO MACROS
  84.  INT IMP; MACRO POINTER DURING EXPANSION
  85.  INT INM; NUMBER OF MACROS
  86.  INT IPR(010); PARAMETER VALUES
  87.  INT ISS(040);   INT TO HOLD NUMBERS-MAIN STACK
  88.  INT ITU; VALUE OF PARAMETER TO USE
  89.  INT IUU; SYMBOL GENERATOR(UNIQUE)
  90.  INT IXX; WORK
  91.  INT IYY; WORK
  92.  BEGINMAIN(AC,IAV)
  93.  NL=+KCR
  94.  LF=+KLF
  95.  GOSUB CR
  96.  
  97.  MS 'COPYRIGHT'
  98.  MS ' (C) 1981'
  99.  MS ' W.A.GALE'
  100.  GOSUB CR
  101.  MS '8080 TINC'
  102.  MS 'MP COMPIL'
  103.  MS 'ER CP/M V'
  104.  MS 'ERSION 1.'
  105.  MS '05/TINCMP'
  106.  GOSUB CR
  107.  MS 'COPYRIGHT'
  108.  MS ' (C) 1981'
  109.  MS ' A L BEND'
  110.  MS 'ER, MD   '
  111.  GOSUB CR
  112.  GOSUB IN
  113.  GOSUB RM
  114.  LOC 00
  115.  WHILE
  116.     READ CC FROM F1
  117.     AA=ER==C0
  118.  ON AA; THAT IS, UNTIL EOF IS REACHED ON INPUT
  119.  
  120.       IF UG
  121.  
  122.         WHILE
  123.             BB=CC==NL
  124.             DD=CC==LF
  125.             AA=CC==OG
  126.             EE=BB?DD
  127.             BB=CC==BL
  128.             AA=BB?AA
  129.             AA=EE?AA
  130.         ON AA; IGNORE LEADING CHARACTERS
  131.             GOSUB GC; READ CC FROM F1
  132.         ENDWHILE
  133.       ENDIF
  134.       BP=C1; BUF POINTER
  135.       BF(C0)=CC
  136.       WHILE
  137.         GOSUB GC; READ CC FROM F1
  138.             AA=CC==NL
  139.             IF AA
  140.             GOSUB GC; READ CC FROM F1
  141.             AA=CC==LF
  142.             IF AA
  143.             CC=NL
  144.             ENDIF
  145.             ENDIF
  146.         AA=CC!=NL
  147.         BB=BP!=C8
  148.         AA=AA&BB
  149.       ON AA; WHILE LESS THAN 80 CHAR AND NOT NEWLINE
  150.         BF(BP)=CC; THEN PUT IT IN BUFFER FOR MULT COMP
  151.         BP++
  152.  
  153.     ENDWHILE
  154.     WHILE
  155.     AA=CC!=NL
  156.     ON AA
  157.  
  158.  
  159.         GOSUB GC; READ CC FROM F1
  160.     ENDWHILE; HERE WE ARE DUMPING A LONG INPUT LINE
  161.     BF(BP)=RC
  162.     BP++
  163.     BF(BP)=NL
  164.     LE=BP
  165.     AA=BP<=MM
  166.     IF AA; TOO SHORT TO MATCH
  167.         ML=+000
  168.         GOTO 17
  169.     ELSE
  170.         ML=+001
  171.     ENDIF
  172.     IDP=I00
  173.     PP=C0
  174.     IJJ=I00
  175.     INM=C0
  176.     WHILE
  177.         AA=IDP<!IED; DEF PTR < END OF DEFINITIONS
  178.     ON AA
  179.         BP=C0
  180.         WHILE
  181.             AA=BP<=LE
  182.         ON AA
  183.             AA=LS(IJJ)
  184.             AA=AA==RC
  185.             O3=BF(BP)
  186.             O3=O3==RC
  187.             AA=AA&O3;  CHECK EOL MATCH TARG & TEMPLATE
  188.             IF AA
  189.                 GOSUB DM;  DO MACRO EXPANSION
  190.                 GOTO 00
  191.             ELSE
  192.             AA=BF(BP)
  193.             BB=LS(IJJ)
  194.             AA=AA==BB
  195.             IF AA
  196.                 GOTO 01;  MATCHING
  197.             ELSE
  198.             AA=BB!=SF;  NOT A TEMPLATE PARAMETER FLAG
  199.             IF AA
  200.                 GOTO 10;  MISMATCHED
  201.             ELSE;  THIS IS A PARAMETER
  202.                 PP++
  203.                 AA=BF(BP)
  204.                 IAA=AA
  205.                 IPR(PP)=IAA
  206.             ENDIF
  207.             ENDIF
  208.             ENDIF
  209.         LOC 01
  210.  
  211.             BP++
  212.             IJJ++
  213.         ENDWHILE
  214.     LOC 10
  215.         PP=C0
  216.         INM++
  217.         IDP=ILP(INM)
  218.         IJJ=IDP
  219.     ENDWHILE
  220.   LOC 17
  221.     BP=C0
  222.     WHILE
  223.         CC=BF(BP)
  224.         O1=BP+C1
  225.         AA=BF(O1)
  226.         AA=AA!=NL
  227.     ON AA
  228.         IF ML;  THEN ALSO WRITE
  229.             WRITE CC
  230.         ENDIF
  231.         WRITE CC INTO F2
  232.         BP++
  233.     ENDWHILE
  234.     IF ML
  235.         GOSUB CR
  236.     ENDIF
  237.     IF UN;  ONLY IF NOT SUPPRESSING
  238.         WRITE NL INTO F2
  239.         WRITE LF INTO F2
  240.     ENDIF
  241.   ENDWHILE
  242. LOC 88; END OF SATISFACTORY COMPILATION
  243.   MS 'TINCMP CO'
  244.   MS 'MPILATION'
  245.   MS ' FINISHED'
  246. GOSUB CR;
  247.   CLOSE F1
  248.   CLOSE F2
  249.   ENDMAIN
  250.         SUB GC; GETS THE NEXT CHARACTER INTO CC GOES TO 88 ON END
  251.     READ CC FROM F1
  252.     AA=ER!=C0
  253.     IF AA; IF NOT NORMAL READ OPERATION
  254.         GOTO 88; !!!! NOT GOOD PROGRAMMING PRACTICE AT ALL !!!!
  255.     ENDIF
  256.     AA=CC==EF; IF CHARACTER WAS EOF MARK
  257.     IF AA; IN CP/M SYSTEM THIS CAN BE RETURNED TO USER
  258.         GOTO 88; !!!! NOT GOOD PROGRAMMING PRACTICE AT ALL !!!!
  259.     ENDIF
  260.         ENDSUB; GC - GET CHARACTER FROM INPUT FILE
  261.         SUB SD;   CONVERTS TOUSE TO A NUMBER WITHOUT ZRO LEADING
  262.  AA=ITU<!I00
  263.  IF AA
  264.     BB=+001
  265.     ITU=-ITU
  266.  ELSE
  267.     BB=+000
  268.  ENDIF
  269.  AA=ITU==I00
  270.  IF AA
  271.     ND=C1
  272.     DS(C0)=ZR
  273.  ELSE
  274.     ND=C0
  275.     WHILE
  276.         AA=I00<!ITU
  277.     ON AA
  278.         IYY=ITU/I10
  279.         IAA=I10*IYY
  280.         IXX=ITU-IAA
  281.     ITU=IYY
  282.     AA=IXX
  283.  
  284.     AA=AA+ZR
  285.     DS(ND)=AA
  286.     ND++
  287.     ENDWHILE
  288.  ENDIF
  289.  DS(ND)=OR
  290.  ND=ND+BB;  INCR FOR NEG INTEGER ONLY
  291.  ENDSUB
  292.  
  293.         SUB WN;   WRITE NUMBER INTO F2
  294.  
  295.  GOSUB SD;  STACK THE DIGITS
  296.  WHILE;  NOW WRITE THEM OUT FIRST TO LAST
  297.     IAA=ND
  298.     AA=I00<!IAA
  299.  ON AA
  300.     ND--
  301.     AA=DS(ND)
  302.     WRITE AA INTO F2
  303.  ENDWHILE
  304.  ENDSUB
  305.  
  306.         SUB PN;  WRITE THE NUMBER ON THE TERMINAL
  307.  
  308.  GOSUB SD;  STACK THE DIGITS
  309.  WHILE
  310.     IAA=ND
  311.     AA=I00<!IAA
  312.  ON AA
  313.     ND--
  314.     AA=DS(ND)
  315.     WRITE AA
  316.  ENDWHILE
  317.  WRITE BL
  318.  ENDSUB
  319.  
  320.         SUB CD;  CONVERT AA AS A DECIMAL DIGIT
  321.  
  322.  BB=ZR<=AA
  323.  CC=AA<=C9
  324.  BB=BB&CC
  325.  IF BB
  326.  
  327.     AA=AA-ZR
  328.     RETURN
  329.  ENDIF
  330.  AA=C0
  331.  ENDSUB
  332.  
  333.         SUB CH;  CONVERT AA AS HEX DIGIT
  334.  
  335.  BB=ZR<=AA
  336.  CC=AA<=C9
  337.  BB=BB&CC
  338.  IF BB
  339.     AA=AA-ZR
  340.     RETURN
  341.  ENDIF
  342.  BB=HA<=AA
  343.  CC=AA<=HF
  344.  BB=BB&CC
  345.  IF BB
  346.     AA=AA-HA
  347.     AA=AA+CX
  348.  
  349.     RETURN
  350.  ENDIF
  351.  AA=C0
  352.  ENDSUB
  353.  
  354.         SUB IN;  INITIALIZE
  355.  
  356.  ILM=+08920
  357.  I00=+00000
  358.  I01=+00001
  359.  I10=+00010
  360.  I09=+00009
  361.  C0=+000
  362.  C1=+001
  363.  C2=+002
  364.  C3=+003
  365.  EF=+KEF
  366.  C4=+040
  367.  C8=+080
  368.  I16=+00016
  369.  SP=+000
  370.  C9='9'
  371.  ZR='0'
  372.  BL=' '
  373.  HF='F'
  374.  HA='A'
  375.  CX=+010
  376.  IBC=I01
  377.  TR='R'
  378.  CLOSE F1
  379.  ASSOCIATE FCB 1 WITH IBC
  380.  OPEN F1 FOR TR AT IBC
  381.  TR='W'
  382.  IBC++
  383.  CLOSE F2
  384.  ASSOCIATE FCB 2 WITH IBC
  385.  OPEN F2 FOR TR AT IBC
  386.  READ AA FROM F1;  X SUPPRESSES NEW LINE OUTPUT
  387.  OT='T'
  388.  UT=+000
  389.  BB='X'
  390.  UN=AA!=BB;  UN SAYS CHARACTER WAS NOT X SO DONT SUPPRESS
  391.  READ RB FROM F1
  392.  READ RC FROM F1;  COMMENT AND EOL FLAG
  393.  READ SF FROM F1;  TEMPLATE PARAMETER FLAG
  394.  READ MF FROM F1;  EXPANSION OPERATION FLAG
  395.  BB='X'
  396.  AA=MF==BB
  397.  IF AA
  398.     UO=C0
  399.  ELSE
  400.     UO=C1
  401.  ENDIF
  402.  OP='P'; PARAMETER DESIGNATOR IN OPERATION SEQUENCE
  403.  OE='@'; ESCAPE CHARACTER
  404.  OD='V'; CONVERT PARAMETER TO DIGIT IN ACTION SEQUENCE
  405.  OB='!'; POP STACK DESIGNATOR IN OPERATION SEQUENCE
  406.  OS='S'; STACK DESIGNATOR IN OPERATION SEQUENCE
  407.  OH='H'; HEX CONSTANT FETCH AND WRITE
  408.  
  409.  ON='N'; LITERAL NUMERIC FETCH
  410.  OL='L'; LITERAL BYTE FETCH
  411.  OC='C'; CHARACTER OUT DESIGNATION
  412.  OA='+'; ADD TO STACK DESIGNATION
  413.  OR='-'; SUBTRACT (REDUCE) FROM STACK
  414.  OM='*'; MULTIPLY STACK BY BASE AND ADD
  415.  READ OG FROM F1; IGNORE CHARACTER
  416.  AA='X'
  417.  BB=AA==OG
  418.  IF BB
  419.     UG=+000
  420.  ELSE
  421.     UG=+001
  422.  ENDIF
  423.  READ CC FROM F1; NEW LINE
  424.  AA=NL!=CC; NL IS NEWLINE
  425.  IF AA
  426.     MS 'FLAG LINE'
  427.     STOP 1
  428.  ENDIF
  429.  IUU=+00100
  430.  ENDSUB; IN
  431.         SUB RM;  READ MACROS
  432.  III=I00
  433.  INM=C0
  434.  MM=+127
  435.  WHILE
  436.     READ CC FROM F1
  437.     AA=ER==C0
  438.  
  439.  ON AA
  440.     CHOOSE ON CC
  441.     CASE OE;ACCEPT THE NEXT CHARACTER UNCRITICALLY
  442.         READ CC FROM F1
  443.         GOTO 77
  444.     CASE RB;BEGIN A DEFINITION
  445.         ILP(INM)=III
  446.         INM++
  447.         ML=+000
  448.  
  449.     CASE NL;IGNORE
  450.     CASE LF;IGNORE
  451.     CASE RC;IGNORE FOLLOWING COMMENTS AND MARK LINE END
  452.         LS(III)=RC
  453.         III++
  454.         AA=ML<!MM
  455.         IF AA;THIS LINE IS SHORTEST YET
  456.             MM=ML
  457.  
  458.         ENDIF
  459.         WHILE
  460.             READ CC FROM F1
  461.             AA=CC!=LF
  462.         ON AA
  463.         ENDWHILE
  464.     CASE OG;IF USING IGNORE, IGNORE
  465.         IF UG
  466.         ELSE
  467.             GOTO 77
  468.  
  469.  
  470.         ENDIF
  471.     DEFAULT;
  472.     LOC 77
  473.         LS(III)=CC
  474.         III++
  475.         AA=ILM<!III
  476.         IF AA
  477.             MS 'MACMEMXST'
  478.             GOSUB CR
  479.             CLOSE F1
  480.             STOP 5
  481.         ENDIF
  482.         ML++
  483.     ENDCHOOSE
  484.  ENDWHILE
  485.  AA=CC!=EF
  486.  IF AA
  487.     MS 'DEFN READ'
  488.     STOP 2
  489.  ENDIF
  490.  CLOSE F1
  491.  IBC=+00003
  492.  ASSOCIATE FCB 3 WITH IBC
  493.  TR='R'
  494.  OPEN F1 FOR TR AT IBC
  495.  IED=III;END OF DEFINITIONS
  496.  MS 'LOADED...'
  497.  ITU=III
  498.  GOSUB PN
  499.  MS '.BYTES FO'
  500.  MS 'R DEFINES'
  501.  GOSUB CR
  502.  ILP(INM)=III
  503.  ITU=INM
  504.  GOSUB PN
  505.  MS '.MACROS..'
  506.  ITU=MM
  507.  GOSUB PN
  508.  MS ' MIN LEN.'
  509.  GOSUB CR
  510.  ENDSUB; RM
  511.         SUB CR; DO CARRIAGE RETURN/LINE FEED SEQUENCE
  512.  WRITE NL
  513.  WRITE LF
  514.  ENDSUB; CR
  515.  
  516.         SUB DM; DO MACRO EXPANSION
  517.  
  518.  IMP=IJJ+I01
  519.  INM++
  520.  IDP=ILP(INM)
  521.  WHILE
  522.     AA=IMP<!IDP
  523.  ON AA; UNTIL WE HAVE READ UP TO THE NEXT MACRO DEFINITION
  524.     AA=LS(IMP)
  525.     IF UO
  526.         AA=AA==MF
  527.     ELSE
  528.         AA=C0
  529.     ENDIF
  530.     IF AA; OPERATION CODE
  531.         IMP++
  532.         O1=LS(IMP); FROM INDICATOR
  533.         IMP++
  534.         AA=LS(IMP)
  535.         O2=AA
  536.         GOSUB CD; FOR DIGIT CONVERSION
  537.         DG=AA
  538.         IMP++
  539.         O3=LS(IMP); DESTAD
  540.     IF UT
  541.             WRITE O1
  542.             WRITE O2
  543.             WRITE O3
  544.     ENDIF
  545.         CHOOSE ON O1
  546.         CASE OP; FETCH PARAMETER
  547.         ITU=IPR(DG)
  548.         CASE OD; CONVERT FROM DIGIT TO CHARACTER
  549.         IAA=IPR(DG)
  550.         AA=IAA
  551.         GOSUB CD
  552.         ITU=AA
  553.         CASE OB; POP STACK
  554.             ITU=ISS(SP)
  555.             AA=SP<=C0
  556.             IF AA
  557.                 MS 'S STACKER'
  558.                 GOSUB CR
  559.                 SP=C1
  560.             ENDIF
  561.             SP--
  562.         CASE OS; FETCH FROM STACK WITHOUT POPPING IT
  563.             ITU=ISS(SP)
  564.         CASE OH; FETCH AND WRITE HEX CONSTANT BYTE
  565.             AA=O2
  566.             GOSUB CH
  567.             IAA=AA
  568.             IAA=IAA*I16
  569.             AA=O3
  570.             GOSUB CH
  571.             IBB=AA
  572.             ITU=IAA+IBB
  573.             O3=OC
  574.         CASE OL; LITERAL BYTE FETCH
  575.             ITU=O2
  576.         CASE ON; LITERAL DIGIT FETCH
  577.             AA=O2
  578.             GOSUB CD
  579.             ITU=AA
  580.         CASE OT; TURN ON TRACE MODE
  581.             UT=+001
  582.         DEFAULT; FETCH  A UNIQUE NUMBER
  583.             ITU=IUU
  584.             IUU++
  585.         ENDCHOOSE
  586.         IF UT
  587.             III=ITU
  588.             GOSUB PN
  589.             ITU=ISS(SP)
  590.             GOSUB PN
  591.             ITU=SP
  592.             GOSUB PN
  593.             ITU=III
  594.             GOSUB CR
  595.         ENDIF
  596.         CHOOSE ON O3
  597.         CASE OC; CHARACTER OUTPUT
  598.             AA=ITU
  599.             WRITE AA INTO F2
  600.         CASE OS; PUT ON STACK
  601.             SP++
  602.             AA=C4<=SP
  603.             IF AA
  604.                 MS 'S OVERFLO'
  605.                 GOSUB CR
  606.                 SP=C4
  607.             ENDIF
  608.             ISS(SP)=ITU
  609.         CASE OP; PUT INTO PARAMETER LOCATION
  610.             IPR(DG)=ITU
  611.         CASE OA; ADD TO STACK
  612.             IAA=ISS(SP)
  613.             IAA=IAA+ITU
  614.             ISS(SP)=IAA
  615.         CASE OR; REDUCE (SUBTRACT) FROM STACK
  616.             IAA=ISS(SP)
  617.             IAA=IAA-ITU
  618.             ISS(SP)=IAA
  619.         CASE OM; MULTIPLY BY BASE AND ADD
  620.             IAA=ISS(SP)
  621.             IAA=IAA*I10
  622.             IAA=IAA+ITU
  623.             ISS(SP)=IAA
  624.         CASE OH; OUTPUT HIGH BYTE
  625.             UNPACK(ITU,AA,BB)
  626.             WRITE AA INTO F2
  627.         DEFAULT; WRITE OUT AS A DECIMAL NUMBER
  628.             GOSUB WN
  629.         ENDCHOOSE
  630.     ELSE; END OF ACTION SECTION
  631.     AA=LS(IMP)
  632.     IF UN
  633.         BB=AA!=RC
  634.     ELSE
  635.         BB=C1
  636.     ENDIF
  637.     IF BB
  638.         WRITE AA INTO F2
  639.     ELSE
  640.         WRITE NL INTO F2
  641.         WRITE LF INTO F2
  642.     ENDIF
  643.     ENDIF
  644.     IMP++
  645.  ENDWHILE
  646.  UT=+000
  647.  ENDSUB; DM
  648.  BOTTOM; END OF TINCMP 8080 CP/M COMPILER
  649.