home *** CD-ROM | disk | FTP | other *** search
/ Oakland CPM Archive / oakcpm.iso / sigm / vol159 / tincmp86.pgn < prev    next >
Encoding:
Text File  |  1985-03-23  |  10.6 KB  |  652 lines

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