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

  1. TOP;METATERP 8086 IMPLEMENTATION UNDER CP/M
  2. ;PROGRAMMED BY A. L. BENDER, M. D.
  3. PARAMETER KEF=026;CP/M END OF FILE
  4. PARAMETER KHT=009;HORIZONTAL TAB
  5. PARAMETER KQM=039;QUOTE MARK
  6. PARAMETER KEL=013;CARRIAGE RETURN CODE
  7. PARAMETER KNL=010;LINE FEED
  8. ;COPYRIGHT (C) W.A.GALE
  9. BYTE AA;ALL LOW DOUBLE LETTERS ARE TEMPORARY VARIABLES
  10. BYTE BB
  11. BYTE BO(080);OUTPUT STRING
  12. BYTE C0;NUMBER 0
  13. BYTE C1;NUMBER 1
  14. BYTE C2;NUMBER 2
  15. BYTE C3;NUMBER 3
  16. BYTE C9;NUMBER 9
  17. BYTE CB;BLANK
  18. BYTE CC
  19. BYTE CD;'.' DOT
  20. BYTE CE;'/' ESCAPE FOR NUMBERS
  21. BYTE CG;'>'
  22. BYTE CL;'<'
  23. BYTE CM;'-'
  24. BYTE CP;'+'
  25. BYTE CQ;'''
  26. BYTE CS;'*'
  27. BYTE CT;HORIZONTAL TAB
  28. BYTE CU;'='
  29. BYTE CV;NUMBER 25
  30. BYTE CX;'!'
  31. BYTE DD
  32. BYTE DS(010);DIGIT STACK FOR WRITING NUMBERS
  33. BYTE EE
  34. BYTE EF;CP/M END OF FILE CODE (CTL-Z)
  35. BYTE EL;CARRIAGE RETURN CODE
  36. BYTE F1(128);INPUT BUFFER
  37. BYTE F2(128);OUTPUT BUFFER
  38. BYTE FL;FLAG FOR TRUE AND FALSE JUMPS
  39. BYTE KA;SPECIAL BYTE FOR TESTS IN KG ROUTINE
  40. BYTE KB;SPECIAL BYTE FOR TESTS IN KG
  41. BYTE KC;WRITE OUTPUT TO CRT TOO
  42. BYTE KS(06000);PROGRAM MEMORY SPACE
  43. BYTE LI;INSTRUCTION LENGTH
  44. BYTE LL;LINE LENGTH DURING LOADING
  45. BYTE MC(03000);SYMBOLIC MEMORY CHARACTER VECTOR
  46. BYTE MK;MEMORY SIZE CELL
  47. BYTE MN;DIMENSIONS OF NS LESS ONE
  48. BYTE ND;NUMBER OF DIGITS FOR WRITING NUMBERS
  49. BYTE NL;NEW LINE !!!! PARAMETERIZED SYSTEM DEPENDENT
  50. BYTE NS(080);CIRCULAR INPUT BUFFER
  51. BYTE OS(080);INPUT STRING
  52. BYTE PB;POINTER INTO BO
  53. BYTE PI;INDEX INTO RI
  54. BYTE PL;POINTER INTO NS
  55. BYTE PM;LOCUS IN NS WHERE INPUT NOT ACCEPTED
  56. BYTE PN;COUNT OF SUBROUTINES LOADED
  57. BYTE PO;POINTER INTO OS
  58. BYTE QI;POINTER INTO RI
  59. BYTE RC;COMMAND READ
  60. BYTE RI(080);INSTRUCTION REGISTER
  61. BYTE SD;STACK DIMENSIONS BOTH Y AND Z
  62. BYTE WA;WORK IN PACK
  63. BYTE WB;WORK IN PACK
  64. BYTE X0;CHARACTER ZERO
  65. BYTE X1; 1
  66. BYTE X2; 2
  67. BYTE X3; 3
  68. BYTE X9; 9
  69. BYTE XA; A
  70. BYTE XB; B
  71. BYTE XC; C
  72. BYTE XD; D
  73. BYTE XE; E
  74. BYTE XF; F
  75. BYTE XG; G
  76. BYTE XH; H
  77. BYTE XI; I
  78. BYTE XJ; J
  79. BYTE XK; K
  80. BYTE XL; L
  81. BYTE XM; M
  82. BYTE XN; N
  83. BYTE XO; O
  84. BYTE XP; P
  85. BYTE XQ; Q
  86. BYTE XR; R
  87. BYTE XS; S
  88. BYTE XT; T
  89. BYTE XU; U
  90. BYTE XV; V
  91. BYTE XW; W
  92. BYTE XX; X
  93. BYTE XY; Y
  94. BYTE XZ; Z
  95. BYTE YP;STACK POINTER
  96. BYTE ZP;STACK POINTER
  97. BYTE ZX;STORAGE FOR ERROR RECOVERY SYMBOL
  98. ;
  99. ;INTEGER STORAGE
  100. ;
  101. INT I00;NUMBER 000
  102. INT I01;NUMBER 001
  103. INT I03;NUMBER 003
  104. INT I10;NUMBER 10
  105. INT I16;NUMBER 16
  106. INT IAA;WORKING STORAGE
  107. INT IBB;WORKING STORAGE
  108. INT IBK;BLOCK NUMBER (FILE NUMBER)
  109. INT ICC;WORKING STORAGE
  110. INT IDD;WORKING STORAGE
  111. INT ILB;POINTER INTO ILT
  112. INT ILN;LINE NUMBER OF INPUT
  113. INT ILT(01000);LOCATION TABLE FOR NUMBER LABELS
  114. INT IMB;MEMORY BASE INDEX FOR CURRENT LEVEL
  115. INT IMD;DIMENSION OF MC AND IMI
  116. INT IMF;MEMORY FREE INDEX
  117. INT IMI(03000);SYMBOLIC MEMORY INDEX VECTOR
  118. INT IML;NUMBER OF LOCAL PARAMETERS PER MEMORY LEVEL
  119. INT IMM;MAX MEMORY COUNTER
  120. INT IMT;TOP OF FREE MEMORY, REST TAKEN BY CELL STACK
  121. INT IMX;NULL MEMORY INDEX
  122. INT IMZ;TEMP VBL FOR MEM SRCH
  123. INT INL;NUMBER OF NUMERICAL LABELS
  124. INT IPC;PROGRAM COUNTER INDEX TO CURRENT INSTRUCTION
  125. INT IPL;CODE POINTER WHILE LOADING
  126. INT IPR(010);REGISTER VECTOR
  127. INT IPT;POINTER INTO IST SUBROO STACK
  128. INT IRN;NUMBER RETURNED BY READ NUMBER ROUTINE
  129. INT ISM;SYMBOL NUMBER OF INPUT
  130. INT IST(00600);SUBROUTINE AND LABEL STACK
  131. INT ITU;RESULT OF DIRECT FETCH
  132. INT IUU;UNIQUE SYMBOL GENERATOR
  133. INT IXX;WORK DURING NUMBER MANIP
  134. INT IYS(080);Y STACK
  135. INT IYY;WORK DURING NUMBER MANIP
  136. INT IZC;ERROR PROGRAM COUNTER
  137. INT IZS(080);Z STACK
  138. INT IZT;ERROR STACK POINTER
  139. BEGINMAIN(AC,IAV)
  140. EL=+KEL
  141. NL=+KNL
  142. MS 'METATERP '
  143. MS 'Ver 1.2  '
  144. GOSUB CR
  145. MS '8086 VERS'
  146. MS 'ION FOR C'
  147. MS 'P/M-86   '
  148. GOSUB CR
  149. MS 'COPYRIGHT'
  150. MS ' 1984 A. '
  151. MS 'L. BENDER'
  152. MS ', M. D.  '
  153. GOSUB IN; INITIALIZATION
  154. GOSUB CR; DON'T DO UNTIL IN HAS EXECUTED
  155. GOSUB RC; READ COMMANDS
  156. GOSUB LI;LEXICAL INITIALIZATION
  157. IPC=+00000
  158. LOC 00
  159. GOSUB GI
  160. CC=RI(C0)
  161. CHOOSE ON CC
  162. CASE XL;LEXICAL ANALYSIS COMMANDS
  163.     AA=PI==C1
  164.     IF AA
  165.         IF FL
  166.             GOSUB LW;SEEK WHITE SPACE MOVE UP BASE
  167.             ISM++;    INCREMENT SYMBOL COUNT
  168.         ELSE
  169.             PL=PM;RESET LOOK AHEAD POINTER
  170.         ENDIF
  171.     ELSE;LONGER THAN ONE
  172.     CC=RI(C1)
  173.     CHOOSE ON CC
  174.     CASE XM;MATCH SPECIFIC STRING
  175.         FL=+000
  176.         BB=+002
  177.         WHILE
  178.             AA=BB<!PI
  179.         ON AA
  180.             AA=RI(BB)
  181.             DD=NS(PL)
  182.             AA=AA!=DD
  183.             IF AA
  184.                 GOTO 99;NO MATCH
  185.             ENDIF
  186.             BB++
  187.             GOSUB LA
  188.         ENDWHILE
  189.         FL=+001
  190.         GOSUB LB
  191.     CASE XI;ID TEST
  192.         FL=+000
  193.         CC=NS(PL)
  194.         PO=+000
  195.         GOSUB ZA
  196.         WHILE
  197.         ON AA;
  198.             OS(PO)=CC
  199.             PO++
  200.             GOSUB LA
  201.             CC=NS(PL)
  202.             GOSUB ZA
  203.             DD=AA
  204.             GOSUB ZN
  205.             AA=DD?AA
  206.         ENDWHILE
  207.         AA=PO==C0
  208.         IF AA
  209.             GOTO 99
  210.         ENDIF
  211.         GOSUB MS;SEARCH ALL LEVELS
  212.         IPR(C0)=IAA
  213.         FL=+001
  214.     CASE XN;    POSITIVE INTEGER TEST
  215. ;            ---------------------
  216.         FL=+000
  217.     IAA=I00
  218.     WHILE
  219.         CC=NS(PL)
  220.         GOSUB ZN
  221.     ON AA
  222.         FL=+001
  223.         IAA=IAA*I10
  224.         CC=CC-X0
  225.         IBB=CC
  226.         IAA=IAA+IBB
  227.         GOSUB LA
  228.     ENDWHILE
  229.     IPR(C0)=IAA
  230.     CASE XH;    HEXADECIMAL NUMBER TEST
  231. ;            -----------------------
  232.     FL=+000
  233.     IAA=+00000
  234.     WHILE
  235.         CC=NS(PL)
  236.         GOSUB ZH
  237.     ON AA
  238.         FL=+001
  239.         IAA=IAA*I16
  240.         IBB=CC
  241.         IAA=IAA+IBB
  242.         GOSUB LA
  243.     ENDWHILE
  244.     IPR(C0)=IAA
  245.     CASE XQ;    STRING QUOTED BY
  246. ;            ----------------
  247.         DD=RI(C2)
  248.             CC=NS(PL)
  249.             PO=+000
  250.             AA=CC==DD
  251.             IF AA
  252.                 GOSUB LA
  253.                 WHILE
  254.                     CC=NS(PL)
  255.                     AA=CC!=NL
  256.                     BB=CC!=DD
  257.                     AA=AA&BB
  258.                 ON AA
  259.                     OS(PO)=CC
  260.                     PO++
  261.                     GOSUB LA
  262.                 ENDWHILE
  263.                 GOSUB LA
  264.                 AA=CC==NL
  265.                 IF AA
  266.                     ILN++
  267.                     ISM=I00
  268.                 ENDIF
  269.                 FL=+001
  270.             ELSE
  271.                 FL=+000
  272.             ENDIF
  273.     DEFAULT;
  274.         WRITE CC
  275.         MS ' NOT LEX!'
  276.         GOSUB CR
  277.     ENDCHOOSE
  278.     ENDIF; TWO LETTER COMMANDS
  279. CASE XF;    FALSE JUMP
  280.     IF FL
  281.     ELSE
  282.         GOTO 20
  283.     ENDIF
  284. CASE XP;    PRINT STRING GIVEN
  285.     BB=+001
  286.     WHILE
  287.         AA=BB<!PI
  288.     ON AA
  289.         CC=RI(BB)
  290.         BO(PB)=CC
  291.         PB++
  292.         BB++
  293.     ENDWHILE
  294. CASE XO;    OUT
  295.     BB=+000
  296.     WHILE
  297.         AA=BB<!PB
  298.     ON AA
  299.         CC=BO(BB)
  300.         BB++
  301.         WRITE CC INTO F2
  302.     ENDWHILE
  303.     PB=+000
  304.  
  305.     AA=PI==C1
  306.     IF AA
  307.         WRITE EL INTO F2
  308.         WRITE NL INTO F2
  309.     ENDIF
  310. CASE XX;    ERROR JUMP
  311.     AA=PI==C1
  312.     IF AA;JUST AN X
  313.         IF FL
  314.         ELSE
  315.     LOC 98;
  316.         MS 'ERROR AT '
  317.         MS 'LINE NUM '
  318.         IAA=ILN
  319.         GOSUB PN
  320.         MS ' SYMBOL  '
  321.         IAA=ISM
  322.         GOSUB PN
  323.         WRITE CB
  324.         GOSUB CR
  325.         WHILE
  326.             CC=NS(PL)
  327.             AA=CC!=ZX;COMPARE TO SPECIAL CHARACTER
  328.             BB=CC!=C0;AND EOF SIGNAL (CC=0)
  329.             AA=AA&BB
  330.         ON AA
  331.             AA=CC==NL
  332.             IF AA
  333.                 ILN++
  334.                 ISM=+00000
  335.             ENDIF
  336.             GOSUB LA;READ ONE MORE
  337.             GOSUB LB;AND BRING UP REAR
  338.         ENDWHILE;HAVE JUST READ SPECIAL CHARACTER
  339.         BB=CC==C0
  340.         IF BB;OR EOF CHARACTER
  341.             MS 'END FILE '
  342.             GOTO 21
  343.         ENDIF
  344.         GOSUB LA;NOW MOVE BEYOND ZX
  345.         GOSUB LB
  346.         GOSUB LW;EAT UP WHITE SPACE
  347.         IPC=IZC;RESTORE PROGRAM COUNTER
  348.         IPT=IZT;AND STACK POINTER
  349.         FL=+001;TRUE
  350.         ENDIF
  351.     ELSE;A LONGER COMMAND
  352.     CC=RI(C1)
  353.     CHOOSE ON CC
  354.     CASE XN;    WRITE LINE NUMBER INTO OUTBUF
  355.         IAA=ILN
  356.         GOSUB WN
  357.     CASE XO;    WRITE OUTBUF TO ERROR OUTPUT
  358.         BB=+000
  359.         WHILE
  360.             AA=BB<!PB
  361.         ON AA
  362.             CC=BO(BB)
  363.             BB++
  364.             WRITE CC
  365.         ENDWHILE
  366.         GOSUB CR
  367.         PB=+000
  368.     CASE XM;    MARK FOR ERROR RETURN
  369.         IZC=IPC;SAVE CODE POSITION
  370.         IZT=IPT;SAVE STACK POSITION
  371.         ZX=RI(C2);AND SPECIAL CHARACTER TO READ THRU
  372.     DEFAULT
  373.     ENDCHOOSE
  374.     ENDIF; X + LETTER
  375. CASE XT;        TRUE JUMP
  376.     IF FL
  377.         GOTO 20
  378.     ENDIF
  379. CASE XG;        GOSUB LABEL MUST BE ALPHA
  380.     WA=RI(C1)
  381.     WB=RI(C2)
  382.     IPT=IPT+I03
  383.     IAA=+00597;STACK DEPTH-3
  384.     AA=IAA<=IPT
  385.     IF AA
  386.         MS 'STACK OVE'
  387.         MS 'R FLOW>>>'
  388.         GOTO 98
  389.     ENDIF
  390.     IST(IPT)=IPC
  391.     PACK(IPC,WA,WB)
  392.     IAA=IPT
  393.     IAA++
  394.     IST(IAA)=I00
  395.     IAA++
  396.     IST(IAA)=I00
  397. CASE XR;        RETURN
  398.     IPC=IST(IPT)
  399.     AA=IPT<!I03
  400.     IF AA
  401.         MS 'STACK UND'
  402.         MS 'ERFLOW...'
  403.         GOTO 98
  404.     ENDIF
  405.     IPT=IPT-I03
  406. CASE XS;        SET
  407.     AA=PI==C1
  408.     IF AA
  409.  
  410.         FL=+001
  411.     ELSE
  412.         CC=RI(C1)
  413.         CHOOSE ON CC
  414.         CASE XF;    SET FALSE
  415.             FL=+000
  416.         CASE XC;    SET CHANGED
  417.             FL=C1-FL
  418.         DEFAULT;    SET ERROR
  419.             MS 'SET ERROR'
  420.             GOSUB CR
  421.         ENDCHOOSE
  422.     ENDIF
  423. CASE XU;        UNIQUE NUMBER GENERATED AND STACKED
  424. AA=PI==C1
  425. IF AA;    THEN DO A LOT OF WORK
  426.     IAA=IPT
  427.     IAA++
  428. LOC 10
  429.     IBB=IST(IAA); CURRENT UNIQUE
  430.     AA=IBB<!I01;    IE NEVER FILLED IN (YET)
  431.     IF AA
  432.         IUU++
  433.         IBB=IUU
  434.         IST(IAA)=IUU
  435.     ENDIF
  436.     IAA=IBB
  437.     IPR(C0)=IAA
  438.     GOSUB WN;    WRITE NUMBER INTO BUFFER
  439. ELSE;    THIS IS A FETCH FROM U
  440.     GOTO 22
  441. ENDIF
  442.  
  443. CASE XC;        COPY INPUT
  444.  
  445.     BB=+000
  446.     WHILE
  447.         AA=BB<!PO
  448.     ON AA
  449.         CC=OS(BB)
  450.         BO(PB)=CC
  451.         PB++
  452.         BB++
  453.     ENDWHILE
  454.  
  455. CASE XV;        UNIQUE NUMBER 2
  456.  
  457. AA=PI==C1
  458. IF AA;    THEN THIS IS TO GENERATE A NUMBER
  459.     IAA=IPT
  460.     IAA++
  461.     IAA++
  462.     GOTO 10;    IAA=>SECOND UNIQUE
  463. ELSE;    JUST A FETCH...
  464.     GOTO 22
  465. ENDIF
  466.  
  467. CASE XM;        MEMORY OPERATIONS
  468.  
  469.     CC=RI(C1)
  470.     CHOOSE ON CC
  471.     
  472.     CASE XS;    STACK MEMORY
  473.         GOSUB MH
  474.     CASE XP;    POP MEMORY
  475.         GOSUB MP
  476.     CASE XE;    DEFINE A CELL ON TOP
  477.         GOSUB ME
  478.         IPR(C0)=IAA
  479.     CASE XQ;    QUERY
  480.         GOSUB MS
  481.         IPR(C0)=IAA
  482.     CASE XC;    CREATE CELL
  483.         GOSUB MC
  484.         IPR(C0)=IAA
  485.     CASE XD;    DESTROY CELL
  486.         GOSUB MD
  487.         IPR(C0)=IAA
  488.     CASE XI;    INITIALIZE
  489.         CC=RI(C2)
  490.         GOSUB ZN
  491.         IF AA
  492.             MK=CC-X0
  493.         ELSE
  494.             MK=+002
  495.         ENDIF
  496.         GOSUB MI
  497.     DEFAULT
  498.         MS 'ILLEGAL M'
  499.         MS 'EM OPN>>>'
  500.         GOSUB CR
  501.     ENDCHOOSE
  502. CASE XJ;        JUMP UNCONDITIONAL - LABEL MUST BE NUMBER
  503. LOC 20
  504.     AA=RI(C1)
  505.     BB=RI(C2)
  506.     PACK(ILB,AA,BB)
  507.     IPC=ILT(ILB)
  508. CASE XE;        STOP HERE
  509. LOC 21
  510.     CLOSE F1
  511.     CLOSE F2
  512.     IAA=IMM;    MAXIMUM MEMORY USED
  513.     GOSUB PN;    PRINT MAX MEMORY USAGE
  514.     MS ' MAX MEM '
  515.     MS 'USAGE.   '
  516.     GOSUB CR
  517.     MS 'PROGRAMME'
  518.     MS 'D TERMINA'
  519.     MS 'TION     '
  520.     GOSUB CR
  521.     STOP 0
  522. DEFAULT;        LOOK FOR FETCH AND STORE INSTRUCTION
  523. LOC 22
  524.     QI=+000
  525.     GOSUB FT
  526.     GOSUB FI
  527.     GOSUB ST
  528. ENDCHOOSE
  529. GOTO 00
  530. LOC 99
  531.     FL=+000
  532.     GOTO 00
  533. ENDMAIN
  534.  
  535.         SUB CK;        CHECK OPENED
  536. AA=ER!=C0
  537. IF AA
  538.     MS 'CANT OPEN'
  539.     IAA=IBK
  540.     GOSUB PN
  541.     GOSUB CR
  542.     STOP 1
  543. ENDIF
  544. ENDSUB
  545.  
  546.         SUB CR;        CR/LF SUBROUTINE
  547.     
  548. WRITE EL
  549. WRITE NL
  550. ENDSUB
  551.  
  552.         SUB DS;        DIGIT STACK
  553. AA=IAA<!I00
  554. IF AA
  555.     BB=+001
  556.     IAA=-IAA
  557. ELSE
  558.     BB=+000
  559. ENDIF
  560. AA=IAA==I00
  561. IF AA
  562.     ND=C1
  563.     DS(C0)=X0
  564. ELSE
  565.     ND=C0
  566.     WHILE
  567.         AA=I00<!IAA
  568.     ON AA
  569.         IYY=IAA/I10
  570.         IBB=I10*IYY
  571.         IXX=IAA-IBB
  572.         IAA=IYY
  573.         AA=IXX
  574.         AA=AA+X0
  575.         DS(ND)=AA
  576.         ND++
  577.     ENDWHILE
  578. ENDIF
  579. DS(ND)=CM;'-'
  580. ND=ND+BB;    INCR ONLY IF MINUS
  581. ENDSUB
  582.  
  583.         SUB FI;        FETCH INDIRECT
  584. QI++
  585. CC=RI(QI)
  586. CHOOSE ON CC
  587.  
  588. CASE XM;    MEMORY FETCH
  589.     QI++
  590.     CC=RI(QI)
  591.     GOSUB ZN
  592.     IF AA
  593.         BB=CC-X0
  594.     ELSE
  595.     LOC 11
  596.     MS 'INDEX TO '
  597.     MS 'MEM CELL '
  598.     BB=+000
  599.     ENDIF
  600. AA=BB<!MK
  601. IF AA
  602.     IAA=BB
  603.     IAA=IAA+ITU
  604.     ITU=IMI(IAA)
  605.     RETURN
  606. ELSE
  607.     BB=BB-MK
  608.     AA=BB<!MK
  609.     IF AA
  610.         IAA=BB
  611.         IAA=ITU+IAA
  612.         AA=MC(IAA)
  613.         ITU=AA
  614.     ELSE
  615.         GOTO 11
  616.     ENDIF
  617. ENDIF
  618.  
  619. CASE XS;        FETCH FROM STRING REGISTER
  620.  
  621.     AA=ITU
  622.     BB=OS(AA)
  623.     ITU=BB
  624. DEFAULT
  625.     QI--
  626. ENDCHOOSE
  627. ENDSUB
  628.             SUB FT; FETCHES DIRECT
  629. CC=RI(QI)
  630. CHOOSE ON CC
  631. CASE XY;        Y STACK
  632.     ITU=IYS(YP)
  633. CASE CX;        '!' POP Y STACK
  634.     ITU=IYS(YP)
  635.     GOSUB PY
  636. CASE XZ;        Z STACK ALWAYS POP
  637.     ITU=IZS(ZP)
  638.     AA=ZP==C0
  639.     IF AA
  640.         MS 'Z STACKER'
  641.         GOSUB CR
  642.         ZP=+001
  643.         FL=+000
  644.     ENDIF
  645.     ZP--
  646. CASE XN;        LITERAL FETCH OF NUMBER
  647.     QI++
  648.     AA=RI(QI)
  649.     QI++
  650.     BB=RI(QI)
  651.     PACK(ITU,AA,BB)
  652. CASE XH;        FETCH HIGH OF STACK
  653.     ITU=IYS(YP)
  654.     UNPACK(ITU,AA,BB)
  655.     ITU=AA
  656. CASE XB;        FETCH BREDTH OF STRING
  657.     ITU=PO
  658. CASE XU;        FIRST STACK NUMBER
  659.     IAA=IPT
  660. LOC 38
  661.     IAA++
  662.     ITU=IST(IAA)
  663. CASE XV;        SECOND STACK NUMBER
  664.     IAA=IPT
  665.     IAA++
  666.     GOTO 38
  667. DEFAULT;        NUMBER OR ERROR
  668.  
  669.     GOSUB ZN
  670.     IF AA
  671.         AA=CC-X0
  672.     ELSE
  673.         MS 'ILLEGAL F'
  674.         MS 'ETCH OPN '
  675.         GOSUB CR
  676.         AA=+000
  677.     ENDIF
  678.     ITU=IPR(AA)
  679. ENDCHOOSE
  680. ENDSUB;    FT
  681.  
  682.             
  683.             SUB GI;        GET INSTRUCTION
  684. PI=+000
  685. LI=KS(IPC)
  686. IPC++
  687. WHILE
  688.     AA=PI<!LI
  689. ON AA
  690.     AA=KS(IPC)
  691.     IPC++
  692.     RI(PI)=AA
  693.     PI++
  694. ENDWHILE
  695. ENDSUB;    GI
  696.  
  697.             SUB IN;        INITIALIZATION
  698. KB=+000
  699. KC=+000
  700. ZX=+000
  701. YP=+000
  702. ZP=+000
  703. C0=+000
  704. FL=+000
  705. PI=+000
  706. PB=+000
  707. PO=+000
  708. PN=+000
  709. IZC=+00000
  710. IZT=+00000
  711. I00=+00000
  712. IPC=+00000
  713. IPT=+00000
  714. ILB=+00000
  715. IUU=+00000
  716. ISM=+00000
  717. INL=+00000
  718. C1=+001
  719. C2=+002
  720. MK=+002
  721. I01=+00001
  722. ILN=+00001
  723. C3=+003
  724. I03=+00003
  725. C9=+009
  726. CV=+025
  727. EL=+KEL
  728. NL=+KNL
  729. EF=+KEF
  730. I10=+00010
  731. I16=+00016
  732. SD=+080
  733. MN=+079
  734. XA='A'
  735. XB='B'
  736. XC='C'
  737. XD='D'
  738. XE='E'
  739. XF='F'
  740. XG='G'
  741. XH='H'
  742. XI='I'
  743. XJ='J'
  744. XK='K'
  745. XL='L'
  746. XM='M'
  747. XN='N'
  748. XO='O'
  749. XP='P'
  750. XQ='Q'
  751. XR='R'
  752. XS='S'
  753. XT='T'
  754. XU='U'
  755. XV='V'
  756. XW='W'
  757. XX='X'
  758. XY='Y'
  759. XZ='Z'
  760. X0='0'
  761. X1='1'
  762. X2='2'
  763. X3='3'
  764. X9='9'
  765. CB=' '
  766. CX='!'
  767. CS='*'
  768. CM='-'
  769. CP='+'
  770. CG='>'
  771. CU='='
  772. CL='<'
  773. CT=+KHT;HORIZONTAL TAB
  774. CE='/'
  775. CD='.'
  776. CQ=+KQM;QUOTE MARK
  777. IBK=+00003;FILE 3
  778. ASSOCIATE FCB 3 WITH IBK; ***CP/M DEPENDENT***
  779. OPEN F2 FOR XW AT IBK;    OPEN OUTPUT FILE
  780. GOSUB MI;    INITIALIZE MEMORY
  781. ENDSUB;    IN
  782.             SUB LA; L IS FOR LEX, A IS FOR AHEAD
  783. AA=PL==MN;MAX FOR NS
  784. IF AA
  785.     PL=+000
  786. ELSE
  787.     PL++
  788. ENDIF
  789. ENDSUB;    LA
  790.             SUB LB; MOVE UP THE BASE
  791. WHILE
  792.     AA=PL!=PM
  793. ON AA
  794.     GOSUB KG;READ CC FROM F1
  795.     AA=ER!=C0
  796.     IF AA
  797.         CC=+000
  798.     ENDIF
  799.     NS(PM)=CC
  800.     AA=PM==MN
  801.     IF AA
  802.         PM=+000
  803.     ELSE
  804.         PM++
  805.     ENDIF
  806. ENDWHILE
  807. ENDSUB; LB
  808.             SUB LI; INITIALIZE LEX
  809. PM=+000
  810. PL=+000
  811. BB=+000
  812. WHILE
  813.  
  814.     AA=BB<=MN
  815.     CC=ER==C0
  816.     AA=AA&CC
  817. ON AA
  818.     GOSUB KG;READ CC FROM F1; - SPECIAL READ FOR CP/M
  819.     NS(BB)=CC
  820.     BB++
  821. ENDWHILE
  822. ENDSUB; LI
  823.             SUB LW; TEST AND  DISCARD WHITE SPACE
  824. CC=NS(PL)
  825. WHILE
  826.     AA=CC==NL
  827.     IF AA
  828.         ILN++
  829.         ISM=+00000
  830.     ENDIF
  831.     BB=CC==CB
  832.     AA=AA?BB
  833.     BB=CC==CT
  834.     AA=AA?BB
  835.     BB=CC==EL
  836.     AA=BB?AA
  837. ON AA
  838.     GOSUB LA
  839.     CC=NS(PL)
  840. ENDWHILE
  841. GOSUB LB
  842. ENDSUB; LW
  843.             SUB MC; CREATE CELL AT THTE TOP
  844. IAA=MK
  845. IMT=IMT-IAA
  846. GOSUB MO;CHECK FOR OVERFLOW
  847. IAA=IMT;POINT TO CELL
  848. GOSUB MZ;ZERO IT
  849. ENDSUB; MC
  850.             SUB MD; DESTROY CELL
  851. IAA=MK
  852. IMT=IMT+IAA;RAISE TOP BY CELL SIZE
  853. AA=IMD<!IMT
  854. IF AA
  855.     MS 'DESTROY C'
  856.     MS 'ELL ERROR'
  857.     GOSUB CR
  858. ENDIF
  859. IAA=IMT
  860. ENDSUB; MD
  861.             SUB ME; ENTER INTO TOP LEVEL
  862. ;RETURNS IAA AS INDEX TO CELL
  863. GOSUB ML;    SEARCH TOP LEVEL
  864. EE=IAA!=I00;    FOUND IT HERE
  865. IF EE
  866.     RETURN
  867. ENDIF
  868. IMI(IBB)=IMF;    IBB FROM ML, STORE TO SHOW THIS OPTION
  869. WHILE
  870.     MC(IMF)=CC; CC FROM ML ONCE
  871.     IMI(IMF)=IMX; NO ALTERNATIVES NOW
  872.     IMF++
  873.     GOSUB MO;    CHECK OVERFLOW
  874.     AA=CC!=C0;    NOT LAST CHARACTER
  875. ON AA
  876.     BB++;    BB FROM ML TO START
  877.     CC=OS(BB)
  878. ENDWHILE
  879. IAA=IMF
  880. IDD=MK
  881. IMF=IDD+IMF
  882. GOSUB MO
  883. GOSUB MZ
  884. ENDSUB; ME
  885.             SUB MH; PUSH A NEW LEVEL
  886. IMI(IMF)=IMB;    POINT TO CURRENT BASE
  887. IMB=IMF
  888. IMF=IMF+IML
  889. MC(IMF)=C0
  890. IMI(IMF)=I00
  891. ENDSUB; MH
  892.             SUB MI; MEMORY INITIALIZE
  893. IMB=+00000
  894. IMM=+00000
  895. IMD=+03000; DIMENSION OF MC AND IMI
  896. IMT=IMD
  897. IML=+00001
  898. IMF=IMB+IML
  899. IMX=+00000
  900. IMI(IMB)=I00
  901. MC(IMF)=C0
  902. IMI(IMF)=I00
  903. ENDSUB; MI
  904.             SUB ML; LEVEL SEARCH PATTERN ENDS WITH NULL
  905. IBB=IMB+IML;        FIRST CHAR IN MEMORY
  906. BB=+000;        SUBSCRIPT FOR PATTERN
  907. WHILE
  908.     CC=OS(BB);    PATTERN CHARACTER
  909.     DD=MC(IBB);    MEMORY CHARACTER
  910.     EE=CC==DD;    MATCH
  911.     IF EE;        MATCHING?
  912.         EE=CC==C0;    END OF STRING SIGNAL
  913.         IF EE;        ENTIRE MATCH?
  914.         IAA=IBB+I01;
  915.         GOTO 77
  916.         ENDIF
  917.         IBB++
  918.         BB++
  919.     ELSE;        FAILED
  920.         IAA=IMI(IBB)
  921.         EE=IAA==IMX
  922.         IF EE;    END OF THE ROAD
  923.             IAA=+00000
  924.             GOTO 77
  925.         ENDIF
  926.         IBB=IAA
  927.     ENDIF
  928.     EE=IBB<!IMF
  929. ON EE
  930. ENDWHILE
  931. IAA=+00000;    FAILED TO FIND BELOW FREE MARKER
  932. LOC 77
  933. ENDSUB; ML
  934.             SUB MO;    CHECK FOR MEMORY OVERFLOW
  935. AA=IMT<!IMF
  936. IF AA
  937.     MS 'OUT OF ME'
  938.     MS 'MORY ERR.'
  939.     STOP 3
  940. ENDIF
  941. AA=IMM<!IMF
  942. IF AA
  943.     IMM=IMF;    MAXIMUM MEMORY IN USE
  944. ENDIF
  945. ENDSUB; MO
  946.             SUB MP; POP A LEVEL
  947. AA=IMB!=I00
  948. IF AA
  949.     IMF=IMB
  950.     IMB=IMI(IMB)
  951. ELSE
  952.     IMF=IML
  953.     MC(IMF)=C0
  954.     IMI(IMF)=I00
  955. ENDIF
  956. ENDSUB; MP
  957.             SUB MS; SEARCH ALL LEVELS
  958. OS(PO)=C0
  959.  
  960. IMZ=IMB
  961. WHILE
  962.     GOSUB ML
  963.     EE=IAA==I00
  964.     IMB=IMI(IMB)
  965.     DD=IMB!=I00
  966.     CC=EE&DD
  967. ON CC
  968. ENDWHILE
  969. IMB=IMZ; TO TOP LEVEL
  970. ENDSUB; MS
  971.             SUB MZ; ZERO A MEMORY CELL
  972. BB=+000
  973. IDD=IAA;    RETAIN POINTER TO CELL
  974. WHILE
  975.     AA=BB<!MK
  976.     BB++
  977. ON AA
  978.     MC(IDD)=C0
  979.     IMI(IDD)=I00
  980.     IDD++
  981. ENDWHILE
  982. ENDSUB; MZ
  983.             SUB PN; PRINT NUMBER ON THE TERMINAL
  984. GOSUB DS;    STACK THE DIGITS
  985. WHILE
  986.     IBB=ND
  987.     AA=I00<!IBB
  988. ON AA
  989.     ND--
  990.     AA=DS(ND)
  991.     WRITE AA
  992. ENDWHILE
  993. WRITE CB
  994. ENDSUB; PN
  995.             SUB PY; POP Y STACK
  996. AA=YP==C0
  997. IF AA
  998.     MS 'Y STACKER'
  999.     GOSUB CR
  1000.     YP=C1
  1001.     FL=+000
  1002. ENDIF
  1003. YP--
  1004. ENDSUB; PY
  1005.             SUB RA; READ ALPHA LABEL
  1006. ;FIRST COPY LABEL TO STRING INDEX
  1007. OS(C0)=CC
  1008. PO=+001
  1009. WHILE
  1010.     GOSUB KG;READ CC FROM F1
  1011.     GOSUB ZA
  1012.     DD=AA;SAVE THE RESULT
  1013. GOSUB ZN;ALLOW EITHER ALPHA OR NUMERIC AFTER FIRST ALPHA
  1014.     AA=AA?DD
  1015. ON AA
  1016.  
  1017.     OS(PO)=CC
  1018.     PO++
  1019. ENDWHILE
  1020. ;NOW, EAT UP LINE
  1021. AA=CC==NL
  1022. IF AA
  1023. ELSE
  1024.     WHILE
  1025.         GOSUB KG;READ CC FROM F1
  1026.         AA=CC!=NL
  1027.     ON AA
  1028.     ENDWHILE
  1029. ENDIF
  1030. ENDSUB;    RA
  1031.  
  1032.         SUB RC; READ COMMANDS
  1033. CLOSE F1
  1034. IBK=+00001;    FILE #1 IN TBUFF
  1035. ASSOCIATE FCB 1 WITH IBK;    *** CPM SENSITIVE ***
  1036. OPEN F1 FOR XR AT IBK;    BUFFER1/FILE1/READ
  1037. GOSUB CK;    DID FILE OPEN OK
  1038. IPC=+00001
  1039. LL=+000
  1040. IPL=+00000
  1041. WHILE
  1042. AA=AA; DUMMY TO FIX LABELING ERROR IN MACRO GENERATOR
  1043. LOC 67;
  1044.     READ RC FROM F1
  1045.     AA=RC==EL;
  1046.     IF AA
  1047.         GOTO 67
  1048.     ENDIF
  1049. LOC 33
  1050.     AA=ER==C0
  1051. ON AA
  1052.     CHOOSE ON RC
  1053.     CASE CE; '/' NUMBER FOLLOWS
  1054.         GOSUB KG;READ CC FROM F1
  1055.         AA=CC==CM;'-'
  1056.         IF AA; MINUS SIGN
  1057.             GOSUB KG;READ CC FROM F1
  1058.             GOSUB RN;READ NUMBER
  1059.             IRN=-IRN;INVERT IT
  1060.             GOTO 37
  1061.         ENDIF
  1062.         GOSUB ZN
  1063.         IF AA
  1064.             GOSUB RN;READ NUMBER
  1065.         LOC 37;
  1066.             UNPACK(IRN,AA,BB)
  1067.             KS(IPC)=AA
  1068.             IPC++
  1069.             LL++
  1070.             KS(IPC)=BB
  1071.             IPC++
  1072.             LL++
  1073.             RC=CC
  1074.             AA=RC==CB
  1075.             IF AA
  1076.             ELSE
  1077.                 GOTO 33
  1078.             ENDIF
  1079.         ELSE
  1080.             KS(IPC)=CE
  1081.             IPC++
  1082.             LL++
  1083.             RC=CC
  1084.             GOTO 33
  1085.         ENDIF
  1086.     CASE NL;    END OF COMMAND
  1087.         KS(IPL)=LL; PUT THE LENGTH OF THE INSTRUCTION AT THE FRONT!
  1088.         IPL=IPC
  1089.         IPC++
  1090.         LL=+000
  1091.     CASE CD;    '.' LABEL FOLLOWS
  1092.         AA=LL==C0
  1093.         IF AA
  1094.             GOSUB RL
  1095.             RC=NL
  1096.             IPC--
  1097.             GOTO 33
  1098.         ELSE
  1099.             GOTO 35
  1100.         ENDIF
  1101.     CASE XG;    IF AT BEGINNING, A GOSUB TO COMPILE
  1102.         AA=LL==C0
  1103.         IF AA
  1104.             GOSUB KG;READ CC FROM F1
  1105.             GOSUB RA;    READ ALPHA LABEL
  1106.             OS(PO)=C0
  1107.             GOSUB ME;    FIND OR DEFINE
  1108.             IRN=IMI(IAA);    DEFINED VALUE
  1109.             AA=IRN==I00
  1110.             IF AA
  1111.                 IRN=IAA;    NOT YET DEFINED
  1112.                 KS(IPC)=NL;    SET WARNING
  1113.             ELSE
  1114.                 KS(IPC)=RC;    WAS DEFINED, VALUE FILLED
  1115.             ENDIF
  1116.             IPC++
  1117.             UNPACK(IRN,AA,BB)
  1118.             KS(IPC)=AA
  1119.             IPC++
  1120.             KS(IPC)=BB
  1121.             IPC++
  1122.             LL=C3
  1123.             RC=NL
  1124.             GOTO 33
  1125.             ELSE
  1126.             GOTO 35
  1127.             ENDIF
  1128.         CASE EL; THIS IS TO THROW AWAY THE 0DH CODE BEFORE LF
  1129.         ;DO NOTHING
  1130.         DEFAULT;    ACCEPT
  1131.         LOC 35
  1132.         KS(IPC)=RC
  1133.         IPC++
  1134.         LL++
  1135.         ENDCHOOSE
  1136.     ENDWHILE
  1137. ;HAVE REACHED END
  1138. IPC--
  1139.  
  1140. AA=ER!=C1
  1141. IF AA;NO, AN ERROR
  1142.     MS 'CANT READ'
  1143.     MS ' COMMANDS'
  1144.     GOSUB CR
  1145.     STOP 1
  1146. ENDIF
  1147. CLOSE F1
  1148. IBK=+00002
  1149. ASSOCIATE FCB 2 WITH IBK
  1150. OPEN F1 FOR XR AT IBK
  1151. GOSUB CK
  1152. ;PATCH ALL THE UNDEFINED GOSUBS
  1153. IAA=+00000
  1154. WHILE
  1155.     AA=IAA<!IPC
  1156. ON AA
  1157.     LL=KS(IAA)
  1158.     IBB=IAA+I01
  1159.     AA=KS(IBB);THE COMMAND
  1160.     AA=AA==NL
  1161.     IF AA;A GOSUB NEEDING PATCH
  1162.         KS(IBB)=XG
  1163.         IBB++
  1164.         AA=KS(IBB);GET INDEX TO DEFINE
  1165.         IBB++
  1166.         BB=KS(IBB)
  1167.         PACK(IRN,AA,BB)
  1168.         BB=MC(IRN)
  1169.         AA=BB!=C1
  1170.         IF AA;THE SUB WASN'T DEFINED, WE DON'T KNOW NAME
  1171.             ICC=IRN-I10
  1172.             WHILE
  1173.                 AA=ICC<!IRN
  1174.             ON AA
  1175.                 BB=MC(ICC)
  1176.                 WRITE BB
  1177.                 ICC++
  1178.             ENDWHILE
  1179.             WRITE CB
  1180.             MS 'SUB UNDEF'
  1181.             GOSUB CR
  1182.         ENDIF
  1183.         ICC=IMI(IRN)
  1184.         UNPACK(ICC,AA,BB);ICC=REAL LOC OF SUB
  1185.         KS(IBB)=BB;STORE IT
  1186.         IBB--
  1187.         KS(IBB)=AA
  1188.     ENDIF
  1189.     IBB=LL
  1190.     IAA=IAA+IBB
  1191.     IAA=IAA+I01
  1192. ENDWHILE
  1193. GOSUB MP;POP MEMORY, FORGET NAMES
  1194. IAA=IPC
  1195. GOSUB PN
  1196. MS 'CMD BYTS '
  1197. IAA=INL
  1198. GOSUB PN
  1199. MS 'NUM LABS '
  1200. IAA=PN
  1201. GOSUB PN
  1202. MS 'SUBROUTIN'
  1203. GOSUB CR
  1204. ENDSUB;    RC
  1205.         SUB RL;    READ LABEL
  1206. ;FIRST DISCARD ANY ALPHANUMERICS
  1207. WHILE
  1208.     GOSUB KG;READ CC FROM F1
  1209.     GOSUB ZA
  1210.     IF AA
  1211.         GOTO 80;ALPHA LABEL
  1212.     ENDIF
  1213.     GOSUB ZN
  1214.     IF AA
  1215.         GOTO 85;NUMBER LABEL
  1216.     ENDIF
  1217.     AA=CC!=NL;IF NO LABEL, NO ACTION
  1218. ON AA
  1219. ENDWHILE
  1220. RETURN
  1221. LOC 80;ALPHA LABEL
  1222. GOSUB RA;READ ALPHA LABEL
  1223. OS(PO)=C0
  1224. GOSUB ME; SEARCH MEMORY
  1225. IMI(IAA)=IPL;SAVE VALUE
  1226. MC(IAA)=C1;MARK DEFINED
  1227. PN++;COUNT SUBROUTINES
  1228. RETURN
  1229. LOC 85;NUMBER LABEL
  1230. INL++
  1231. GOSUB RN;READ A NUMBER
  1232. ILT(IRN)=IPL
  1233. ENDSUB;    RL
  1234.             SUB RN;READ A NUMBER
  1235. IRN=+00000
  1236. WHILE
  1237.     CC=CC-X0
  1238.     IAA=CC
  1239.     IRN=IRN*I10;    CONVERT TO BINARY
  1240.     IRN=IRN+IAA
  1241.     GOSUB KG;READ CC FROM F1
  1242.     GOSUB ZN
  1243. ON AA
  1244. ENDWHILE
  1245. ENDSUB;    RN
  1246.             SUB ST; STORE A NUMBER
  1247. QI++
  1248. CC=RI(QI)
  1249. CHOOSE ON CC
  1250. CASE XY;    Y STACK
  1251.     YP++
  1252.     AA=SD<=YP
  1253.     IF AA
  1254.         MS 'Y OVERFLW'
  1255.         GOSUB CR
  1256.         YP=SD
  1257.         FL=+000
  1258.     ENDIF
  1259.     IYS(YP)=ITU
  1260. CASE XZ;    Z STACK
  1261.     ZP++
  1262.     AA=SD<=ZP
  1263.     IF AA
  1264.         MS 'Z OVERFLW'
  1265.         GOSUB CR
  1266.         ZP=SD
  1267.         FL=+000
  1268.     ENDIF
  1269.     IZS(ZP)=ITU
  1270. CASE CP;    "+" ADD TO S
  1271.     IAA=IYS(YP)
  1272.     IAA=IAA+ITU
  1273.     IYS(YP)=IAA
  1274. CASE CM;    "-" SUBTRACT FROM TOP OF STACK
  1275.     IAA=IYS(YP)
  1276.     IAA=IAA-ITU
  1277.     IYS(YP)=IAA
  1278. CASE CS;    "*" MULTIPLY TOP OF STACK BY TO USE
  1279.     IAA=IYS(YP)
  1280.     IAA=IAA*ITU
  1281.     IYS(YP)=IAA
  1282. CASE CG;    ">" GREATER - SET FLAGS ACCORDINGLY
  1283.     IAA=IYS(YP)
  1284.     AA=IAA<!ITU
  1285. LOC 12;
  1286.     IF AA
  1287.         FL=+001;    T R U E
  1288.     ELSE
  1289.         FL=+000;    F A L S E
  1290.     ENDIF
  1291.     GOSUB PY;    POP Y STACK
  1292. CASE CL;    "<" LESS THAN - SET FLAGS
  1293.     IAA=IYS(YP)
  1294.     AA=ITU<!IAA
  1295.     GOTO 12
  1296. CASE CU;    "=" EQUAL
  1297.     IAA=IYS(YP)
  1298.     AA=ITU==IAA
  1299.     GOTO 12
  1300. CASE XI;    INDIRECT TO MEMORY
  1301.     QI++
  1302.     DD=RI(QI)
  1303.     IBB=ITU
  1304.     QI++
  1305.     GOSUB FT
  1306.     CC=DD
  1307.     GOSUB ZN
  1308.     IF AA
  1309.         BB=CC-X0;    REMOVE ASCII BIAS
  1310.     ELSE
  1311.     LOC 13;
  1312.         MS 'BAD INDIR'
  1313.         MS 'ECT INDEX'
  1314.         GOSUB CR
  1315.         BB=+000
  1316.     ENDIF
  1317.     AA=BB<!MK
  1318.     IF AA
  1319.         IAA=BB
  1320.         IAA=ITU+IAA
  1321.         IMI(IAA)=IBB
  1322.         RETURN
  1323.     ELSE
  1324.         BB=BB-MK
  1325.         AA=BB<!MK
  1326.         IF AA
  1327.             IAA=BB
  1328.             IAA=IAA+ITU
  1329.             AA=IBB
  1330.             MC(IAA)=AA
  1331.         ELSE
  1332.             GOTO 13
  1333.         ENDIF
  1334.     ENDIF
  1335. CASE XC;    CONVERT NUMERIC TO STRING, WRITE IT OUT
  1336.     IAA=ITU
  1337.     GOSUB WN
  1338. CASE XL;    WRITE LOW BYTE OF FETCHED TO OUTPUT BUFFER
  1339.     AA=ITU
  1340.     BO(PB)=AA
  1341.     PB++
  1342. CASE XA;    APPEND LOW BYTE OF FETCHED TO STRING BUFFER
  1343.     AA=ITU
  1344.     OS(PO)=AA
  1345.     PO++
  1346.     OS(PO)=C0
  1347. CASE XB;    SET LENGTH OF STRING BUFFER
  1348.     PO=ITU
  1349.     OS(PO)=C0
  1350. CASE XG;    SET GENERATOR
  1351.     IUU=ITU
  1352. CASE XU;    FIRST STACK NUMBER
  1353.     IAA=IPT
  1354. LOC 39;
  1355.     IAA++
  1356.     IST(IAA)=ITU
  1357. CASE XV;    SECOND STACK NUMBER
  1358.     IAA=IPT
  1359.     IAA++
  1360.     GOTO 39
  1361. CASE XD;    DUMP IT, NULL OPERATION
  1362. CASE XH;    WRITE LOW BYTE IN HEX
  1363.     AA=ITU
  1364.     ITU=AA
  1365.     IAA=ITU/I16;    HIGH HEX DIGIT
  1366.     IBB=IAA*I16;    FANCY MASKER
  1367.     IBB=ITU-IBB;    LOW HEX DIGIT
  1368.     CC=IAA
  1369.     GOSUB WH
  1370.     CC=IBB
  1371.     GOSUB WH;    WRITE HEX DIGITS
  1372. DEFAULT;    NUMBER OR ERROR
  1373.     CC=RI(QI)
  1374.     GOSUB ZN
  1375.     IF AA
  1376.         AA=CC-X0
  1377.     ELSE
  1378.         MS 'ILLEGAL S'
  1379.         MS 'TORE ATMP'
  1380.         GOSUB CR
  1381.         AA=+000
  1382.     ENDIF
  1383.     IPR(AA)=ITU
  1384. ENDCHOOSE
  1385. ENDSUB;    ST
  1386.             SUB WH; WRITE HEX DIGIT TO OBUFF
  1387. AA=CC<=C9
  1388. IF AA
  1389.     CC=CC+X0
  1390. ELSE
  1391.     CC=CC+XA
  1392.     CC=CC-C9
  1393.     CC=CC-C1
  1394. ENDIF
  1395. BO(PB)=CC
  1396. PB++
  1397. ENDSUB;    WH
  1398.             SUB WN; WRITE NUMBER INTO OBUFF
  1399. GOSUB DS;    STACK THE DIGITS
  1400. WHILE
  1401.     IBB=ND
  1402.     AA=I00<!IBB
  1403. ON AA
  1404.     ND--
  1405.     AA=DS(ND)
  1406.     BO(PB)=AA
  1407.     PB++
  1408. ENDWHILE
  1409. ENDSUB;    WN
  1410.             SUB ZA;    ALPHA TEST CC ASSUMES LINEAR MONOTONIC
  1411. AA=CC-XA
  1412. BB=XZ-CC;IZIT A TO Z?
  1413. AA=AA<=CV
  1414. BB=BB<=CV
  1415. AA=AA&BB
  1416. ENDSUB;    ZA
  1417.             SUB ZH; TEST AND CONVERT HEX DIGIT
  1418. AA=X0<=CC
  1419. BB=CC<=X9
  1420. AA=AA&BB
  1421. IF AA
  1422.     CC=CC-X0
  1423.     RETURN
  1424. ENDIF
  1425. AA=XA<=CC
  1426. BB=CC<=XF;    CHECK 0-9, A-F
  1427. AA=AA&BB
  1428. IF AA
  1429.     CC=CC-XA
  1430.     BB=+010
  1431.     CC=CC+BB
  1432.     RETURN
  1433. ENDIF
  1434. ENDSUB;    ZH AA IS FALSE HERE
  1435.             SUB ZN;    CC IS A NUMBER
  1436. AA=CC-X0
  1437. BB=X9-CC
  1438. AA=AA<=C9
  1439. BB=BB<=C9
  1440. AA=AA&BB
  1441. ENDSUB
  1442.             SUB ZW;    CC IS WHITE SPACE
  1443. AA=CC==CB;BLANK
  1444. BB=CC==CT;TAB
  1445. AA=AA?BB;EITHER?
  1446. BB=CC==EL;RETURN
  1447. AA=AA?BB
  1448. BB=CC==NL;NEW LINE (LF)
  1449. AA=AA?BB
  1450. ENDSUB;    ZW
  1451.             SUB KG; READ CC FROM FILE 1 - DISCARD C/R
  1452. READ CC FROM F1;    READ A CHARACTER
  1453. KA=CC==EL
  1454.     IF KA
  1455.     READ CC FROM F1;    IF LAST CHARACTER WAS C/R
  1456.     ENDIF
  1457. ENDSUB;    KG
  1458. BOTTOM
  1459.