home *** CD-ROM | disk | FTP | other *** search
/ CP/M / CPM_CDROM.iso / cpm / utils / asmutl / lasm-tdl.lbr / LASM2.AQM / LASM2.ASM
Encoding:
Assembly Source File  |  1986-02-15  |  11.3 KB  |  757 lines

  1.  
  2. ***************************************
  3. * PUT OBJECT IN OBJECT LINE
  4. ***************************************
  5.  
  6. PUT$OBJ:
  7.     PUSH    B
  8.     MOV    B,A
  9.     LDA    OPTOBJ        ;LOAD OBJECT FILE OPTION
  10.     CPI    'Z'-'A'        ;NO FILE OPTION
  11.     MOV    A,B
  12.     JZ    PUT$OBJ$EX    ;NO OPTION,-EXIT.
  13.     PUSH    D
  14.     PUSH    PSW
  15.     LXI    H,OBJ$BYTE$CNT    ;GET OBJECT BYTE COUNT
  16.     MOV    A,M
  17.     ORA    A
  18.     JZ    PUT$OBJ$03
  19.     CPI    16        ;MAX IS 16 BYTES PER LINE
  20.     JC    PUT$OBJ$01
  21.     CALL    OBJ$LINE$00    ;OUTPUT LINE TO BUFFER
  22.     JMP    PUT$OBJ$03    ;NOW PUT NEW CHARACTER IN
  23. PUT$OBJ$01:
  24.     LHLD    LOC$CTR1
  25.     XCHG
  26.     LHLD    OBJ$LINE$LOC
  27.     MOV    C,A        ;PUT OFFSET IN C.
  28.     MVI    B,0
  29.     DAD    B        ;ADD OFFSET TO LINE ORG.
  30.     MOV    A,E        ;NOW COMPARE LOC COUNTER.
  31.     CMP    L
  32.     JNZ    PUT$OBJ$02    ;IF DIFFERENT, OUTPUT LINE.
  33.     MOV    A,D
  34.     CMP    H
  35.     JZ    PUT$OBJ$04
  36. PUT$OBJ$02:
  37.     CALL    OBJ$LINE$00    ;OUTPUT LINE TO BUFR
  38. PUT$OBJ$03:
  39.     LHLD    LOC$CTR1    ;UPDATE LINE LOCATION
  40.     SHLD    OBJ$LINE$LOC
  41. PUT$OBJ$04:
  42.     LXI    H,OBJ$BYTE$CNT    ;GET OFFSET
  43.     MOV    E,M
  44.     INR    M
  45.     MVI    D,0
  46.     LXI    H,OBJ$LINE    ;ADD TO LINE ORG.
  47.     DAD    D
  48.     POP    PSW
  49.     MOV    M,A            ;PUT BYTE IN LINE
  50.     POP    D
  51. PUT$OBJ$EX:
  52.     POP    B
  53.     RET
  54.  
  55. ***************************************
  56. * OBJECT BYTE OUTPUT
  57. * ADDS CHECKSUM IN REG D
  58. ***************************************
  59.  
  60. OBJ$BYTE$OUT:
  61.     PUSH    PSW
  62.     RRC                ; OUTPUT UPPER NIBBLE
  63.     RRC
  64.     RRC
  65.     RRC
  66.     ANI    0FH
  67.     CALL    OBJ$ASCII$OUT
  68.     POP    PSW
  69.     PUSH    PSW
  70.     ANI    0FH
  71.     CALL    OBJ$ASCII$OUT        ;OUTPUT LOWER NIBBLE
  72.     POP    PSW
  73.     ADD    D
  74.     MOV    D,A
  75.     RET
  76.  
  77. ***************************************
  78. * HEX TO ASCII CONVERSION
  79. * WITH OUTPUT TO OBJ.
  80. ***************************************
  81.  
  82. OBJ$ASCII$OUT:
  83.     ADI    90H
  84.     DAA
  85.     ACI    '@'        ;40H
  86.     DAA
  87.     JMP    OBJ$OUT$00
  88.  
  89. ***************************************
  90. * OUTPUT OBJECT LINE
  91. * OUTPUTS TO OBJ$BUFR
  92. ***************************************
  93.  
  94. OBJ$LINE$00:
  95.     MVI    A,':'
  96.     CALL    OBJ$OUT$00        ;START NEW LINE
  97.     LXI    H,OBJ$BYTE$CNT
  98.     MOV    E,M
  99.     XRA    A
  100.     MOV    D,A
  101.     MOV    M,A
  102.     LHLD    OBJ$LINE$LOC        ;SET LINE LOCATION
  103.     MOV    A,E
  104.     CALL    OBJ$BYTE$OUT        ;WRITE BYTE COUNT
  105.     MOV    A,H
  106.     CALL    OBJ$BYTE$OUT        ;WRITE LOCATION
  107.     MOV    A,L
  108.     CALL    OBJ$BYTE$OUT        ;WRITE LOCATION
  109.     XRA    A
  110.     CALL    OBJ$BYTE$OUT
  111.     MOV    A,E            ;GET COUNT
  112.     ORA    A
  113.     JZ    OBJ$LINE$03        ;EXIT IF ZERO
  114.     LXI    H,OBJ$LINE        ;POINT TO LINE DATA
  115. OBJ$LINE$01:
  116.     MOV    A,M
  117.     INX    H
  118.     CALL    OBJ$BYTE$OUT        ;OUTPUT A BYTE
  119.     DCR    E            ;DECR BYTE COUNT
  120.     JNZ    OBJ$LINE$01        ;DO ANOTHER IF NOT DONE.
  121. OBJ$LINE$03:                ;DONE
  122.     XRA    A
  123.     SUB    D
  124.     CALL    OBJ$BYTE$OUT
  125.     MVI    A,CR
  126.     CALL    OBJ$OUT$00
  127.     MVI    A,LF
  128.     CALL    OBJ$OUT$00
  129.     RET
  130.  
  131. ***************************************
  132. *  READ CHARACTER AND PLACE ONTO PRINT
  133. ***************************************
  134.  
  135. L0747:        DB    0        ; PRIOR CHARACTER
  136. CUR$CHR:      DB    0        ; CURRENT (NEXT)
  137. RADIX$CHR:    DB    0        ; RADIX CHARACTER
  138.  
  139. ***************************************
  140.  
  141. RDCHAR:
  142.     CALL    DSK$IN        ; GET CHAR FROM DISK.
  143.     PUSH    PSW
  144.     CPI    CR        ;EXIT IF CR
  145.     JZ    RDCHAR$EX
  146.     CPI    LF        ; OR LF
  147.     JZ    RDCHAR$EX
  148.     CPI    EOF        ; OR EOF
  149.     JZ    RDCHAR$EX
  150.     LDA    PRN$CHR$CT
  151.     CPI    78H        ; MAX LINE LENGTH.(78H=120D)
  152.     JNC    RDCHAR$EX
  153.     MOV    E,A
  154.     MVI    D,0
  155.     INR    A
  156.     STA    PRN$CHR$CT    ;GET LINE OFFSET
  157.     LXI    H,PRN$LINE    ;ADD TO ORG,(GETS LOC)
  158.     DAD    D
  159.     POP    PSW
  160.     MOV    M,A        ;PUT CHAR
  161.     RET
  162. RDCHAR$EX:
  163.     POP    PSW
  164.     RET
  165.  
  166. ***************************************
  167. * END PRINT LINE IN PRN BUFR.
  168. ***************************************
  169.  
  170. PRN$END$LINE:
  171.     CALL    L0787
  172.     STA    CUR$CHR        ;CLEAR CUR CHAR
  173.     STA    PRN$CHR$CT    ; AND PRN COUNTER.
  174.     MVI    A,LF
  175.     STA    L0747
  176.     CALL    PRN$MSG$00
  177.     MVI    A,12H        ;LABEL STARTS AT 16TH CHAR.
  178.     STA    PRN$CHR$CT
  179.     RET
  180.  
  181. ***************************************
  182.  
  183. L0787:
  184.     XRA    A
  185.     STA    STR$SIZE
  186.     STA    RADIX$CHR
  187.     RET
  188.  
  189. L078F:
  190.     LXI    H,STR$SIZE
  191.     MOV    A,M
  192.     CPI    'A'-1
  193.     JC    L079D
  194.     MVI    M,0
  195.     CALL    L0963
  196. L079D:
  197.     MOV    E,M
  198.     MVI    D,0
  199.     INR    M
  200.     INX    H
  201.     DAD    D
  202.     LDA    CUR$CHR
  203.     MOV    M,A
  204.     RET
  205.  
  206. L07A8:
  207.     MOV    A,M
  208.     CPI    '$'
  209.     RNZ
  210.     XRA    A
  211.     MOV    M,A
  212.     RET
  213.  
  214. NUM$C:                ;TEST IF NUMBER
  215.     LDA    CUR$CHR
  216.     SUI    '0'        ;30H
  217.     CPI    '9'-'0'+1
  218.     RAL
  219.     ANI    1
  220.     RET
  221.  
  222. L07BA:
  223.     CALL    NUM$C
  224.     RNZ
  225.     LDA    CUR$CHR
  226.     SUI    'A'        ;41H
  227.     CPI    'F'-'A'+1
  228.     RAL
  229.     ANI    1
  230.     RET
  231.  
  232. ALPHA$C:
  233.     LDA    CUR$CHR
  234.     SUI    'A'        ;41H
  235.     CPI    'Z'-'A'+1
  236.     RAL
  237.     ANI    1
  238.     RET
  239.  
  240. L07D4:
  241.     CALL    ALPHA$C
  242.     RNZ
  243.     CALL    NUM$C
  244.     RET
  245.  
  246. ***************************************
  247. * CONVERT SMALL ALPHA TO CAPS
  248. ***************************************
  249.  
  250. CON$ALPH:
  251.     LDA    CUR$CHR
  252.     CPI    61H
  253.     RC
  254.     CPI    7BH        ;CONVERT SMALL ALPHA TO CAPS.
  255.     RNC
  256.     ANI    5FH
  257.     STA    CUR$CHR
  258.     RET
  259.  
  260. ***************************************
  261. * GET CHAR FROM DISK & PUT IN STRING
  262. ***************************************
  263.  
  264. GET$STR$CHR:
  265.     CALL    RDCHAR
  266.     STA    CUR$CHR
  267.     PUSH    PSW
  268.     LDA    STR$TYPE
  269.     CPI    3
  270.     CNZ    CON$ALPH
  271.     POP    PSW
  272.     RET
  273.  
  274. LAST$CHR:
  275.     CPI    CR
  276.     RZ
  277.     CPI    EOF
  278.     RZ
  279.     CPI    '!'        ;21H
  280.     RET
  281.  
  282. ***************************************
  283. * GET STRING.
  284. * picks up a string evaluates it for type
  285. * and computes value from radix designated.
  286. ***************************************
  287.  
  288. GET$STR:
  289.     XRA    A
  290.     STA    STR$TYPE
  291.     CALL    L0787
  292. GS$00:
  293.     LDA    CUR$CHR
  294.     CPI    TAB
  295.     JZ    GS$03
  296.     CPI    ';'        ;COMMENT
  297.     JZ    GS$01
  298.     CPI    '*'        ;2AH
  299.     JNZ    GS$02
  300.     LDA    L0747
  301.     CPI    LF
  302.     JNZ    GS$02
  303. GS$01:
  304.     CALL    GET$STR$CHR
  305.     CALL    LAST$CHR
  306.     JZ    GS$04
  307.     JMP    GS$01
  308. GS$02:
  309.     ORI    ' '        ;TEST FOR BLANK
  310.     CPI    ' '        ;20H
  311.     JNZ    GS$04
  312. GS$03:
  313.     CALL    GET$STR$CHR
  314.     JMP    GS$00
  315. GS$04:
  316.     CALL    ALPHA$C
  317.     JZ    GS$05
  318.     MVI    A,1        ;CHARACTER TYPE = ALPHA
  319.     JMP    GS$09
  320. GS$05:
  321.     CALL    NUM$C
  322.     JZ    GS$06
  323.     MVI    A,2        ;CHARACTER TYPE = NUMBER
  324.     JMP    GS$09
  325. GS$06:
  326.     LDA    CUR$CHR
  327.     CPI    ''''        ;27H
  328.     JNZ    GS$07
  329.     XRA    A
  330.     STA    CUR$CHR
  331.     MVI    A,3        ;CHARACTER TYPE = QUOTE
  332.     JMP    GS$09
  333. GS$07:
  334.     CPI    LF
  335.     JNZ    GS$08        ;BR IF END OF LINE
  336.     LDA    PASS$NM
  337.     ORA    A
  338.     CNZ    PRN$MSG$00
  339.     LXI    H,PRN$LINE
  340.     MVI    M,' '        ;20H
  341.     MVI    A,10H
  342.     STA    PRN$CHR$CT
  343. GS$08:
  344.     MVI    A,4        ;CHAR TYPE= OTHER ??
  345. GS$09:
  346.     STA    STR$TYPE
  347. GS$10:
  348.     LDA    CUR$CHR
  349.     STA    L0747
  350.     ORA    A
  351.     CNZ    L078F
  352.     CALL    GET$STR$CHR
  353.     LDA    STR$TYPE
  354.     CPI    4
  355.     RZ
  356.     CPI    3
  357.     CNZ    CON$ALPH
  358.     LXI    H,CUR$CHR
  359.     LDA    STR$TYPE
  360.     CPI    1
  361.     JNZ    GS$11
  362.     CALL    L07A8
  363.     JZ    GS$10
  364.     CALL    L07D4
  365.     RZ
  366.     JMP    GS$10
  367. GS$11:
  368.     CPI    2
  369.     JNZ    L0947
  370.     CALL    L07A8
  371.     JZ    GS$10
  372.     CALL    L07BA
  373.     JNZ    GS$10
  374.     LDA    CUR$CHR
  375.     CPI    'O'        ;RADIX OCTAL 4FH
  376.     JZ    GS$12
  377.     CPI    'Q'        ;RADIX OCTAL (ALT) 51H
  378.     JNZ    GS$13
  379. GS$12:
  380.     MVI    A,8
  381.     JMP    GS$14
  382. GS$13:
  383.     CPI    'H'        ;RADIX HEX 48H
  384.     JNZ    GS$15
  385.     MVI    A,10H
  386. GS$14:
  387.     STA    RADIX$CHR
  388.     XRA    A
  389.     STA    CUR$CHR
  390.     JMP    GS$19
  391. GS$15:
  392.     LDA    L0747
  393.     CPI    'B'        ;RADIX BINARY 42H
  394.     JNZ    GS$16
  395.     MVI    A,2
  396.     JMP    GS$17
  397. GS$16:
  398.     CPI    'D'        ;RADIX DECIMAL 44H
  399.     MVI    A,LF
  400.     JNZ    GS$18
  401. GS$17:
  402.     LXI    H,STR$SIZE
  403.     DCR    M
  404. GS$18:
  405.     STA    RADIX$CHR
  406. GS$19:
  407.     LXI    H,0
  408.     SHLD    STR$VAL
  409.     LXI    H,STR$SIZE
  410.     MOV    C,M
  411.     INX    H
  412. GS$20:
  413.     MOV    A,M        ;CONVERT ASCII TO HEX
  414.     INX    H
  415.     CPI    'A'
  416.     JNC    GS$21
  417.     SUI    '0'        ;30H
  418.     JMP    GS$22
  419. GS$21:
  420.     SUI    '7'        ;37H
  421. GS$22:                ;EVALUATE DIGIT.
  422.     PUSH    H
  423.     PUSH    B
  424.     MOV    C,A
  425.     LXI    H,RADIX$CHR
  426.     CMP    M        ;COMPARE RADIX LIMIT
  427.     CNC    L095D
  428.     MVI    B,0
  429.     MOV    A,M
  430.     LHLD    STR$VAL
  431.     XCHG
  432.     LXI    H,0
  433. GS$23:
  434.     ORA    A
  435.     JZ    GS$25
  436.     RAR
  437.     JNC    GS$24
  438.     DAD    D
  439. GS$24:
  440.     XCHG
  441.     DAD    H
  442.     XCHG
  443.     JMP    GS$23
  444. GS$25:
  445.     DAD    B
  446.     SHLD    STR$VAL        ;SAVE STRING VALUE 011EH
  447.     POP    B
  448.     POP    H
  449.     DCR    C
  450.     JNZ    GS$20
  451.     RET
  452. L0947:
  453.     LDA    CUR$CHR
  454.     CPI    CR
  455.     JZ    L0963
  456.     CPI    ''''        ;27H
  457.     JNZ    GS$10
  458.     CALL    GET$STR$CHR
  459.     CPI    ''''        ;27H
  460.     RNZ
  461.     JMP    GS$10
  462. L095D:
  463.     PUSH    PSW
  464.     MVI    A,'V'        ;VALUE ERROR.
  465.     JMP    L0969
  466. L0963:
  467.     PUSH    PSW
  468.     MVI    A,'O'        ;OVERFLOW ERROR.
  469.     JMP    L0969
  470. L0969:
  471.     PUSH    B
  472.     PUSH    H
  473.     CALL    ERR$COD
  474.     POP    H
  475.     POP    B
  476.     POP    PSW
  477.     RET
  478.  
  479. ***************************************
  480. * SYMBOL TABLE ROUTINES
  481. ***************************************
  482.  
  483. SYM$SUM:
  484.     NOP
  485. CL$SYM$HASH$LST:
  486.     LXI    H,SYM$HASH$LST
  487.     MVI    B,80H
  488.     XRA    A
  489. SYM$01:
  490.     MOV    M,A    ;CLR 3018 -- 3099
  491.     INX    H
  492.     MOV    M,A
  493.     INX    H
  494.     DCR    B
  495.     JNZ    SYM$01
  496.     LXI    H,0
  497.     SHLD    SYM$HASH$PTR
  498.     RET
  499.  
  500. ***************************************
  501. * COMPUTE SYMBOL CHECKSUM
  502. ***************************************
  503.  
  504. CMPUT$SYM$SUM:
  505.     LXI    H,STR$SIZE    ;PUT SIZE IN (B)
  506.     MOV    B,M
  507.     XRA    A
  508. SYM$03:
  509.     INX    H
  510.     ADD    M        ;ADD CHAR VALUE
  511.     DCR    B
  512.     JNZ    SYM$03
  513.     ANI    7FH
  514.     STA    SYM$SUM
  515.     RET
  516.  
  517. ***************************************
  518. * UNUSED CODE ????
  519. ***************************************
  520.  
  521.     MOV    B,A
  522.     LHLD    SYM$HASH$PTR
  523.     INX    H
  524.     INX    H
  525.     MOV    A,M
  526.     ANI    0F0H
  527.     ORA    B
  528.     MOV    M,A
  529.     RET
  530.  
  531. ***************************************
  532. * START SYMBOL EVALUATION
  533. ***************************************
  534.  
  535. SYM$04:
  536.     LHLD    SYM$HASH$PTR
  537.     INX    H
  538.     INX    H
  539.     MOV    A,M    ;GET SIZE
  540.     ANI    0FH
  541.     INR    A
  542.     RET
  543. SYM$05:
  544.     LHLD    SYM$HASH$PTR
  545.     MOV    A,L
  546.     ORA    H
  547.     RET
  548.  
  549. ***************************************
  550. * SEARCH FOR SYMBOL
  551. ***************************************
  552.  
  553. SYM$SERCH:
  554.     CALL    CMPUT$SYM$SUM    ;COMPUTE ADDRESS KEY
  555.     LXI    H,STR$SIZE
  556.     MOV    A,M
  557.     CPI    11H
  558.     JC    SYM$07
  559.     MVI    M,10H
  560. SYM$07:
  561.     LXI    H,SYM$SUM    ;GET SYM TABLE ADDRESS
  562.     MOV    E,M
  563.     MVI    D,0
  564.     LXI    H,SYM$HASH$LST
  565.     DAD    D
  566.     DAD    D
  567.     MOV    E,M
  568.     INX    H
  569.     MOV    H,M
  570.     MOV    L,E
  571. SYM$08:
  572.     SHLD    SYM$HASH$PTR    ;PUT ADDRESS IN POINTER
  573.     CALL    SYM$05        ;IS ADDRESS USED?
  574.     RZ            ; RETURN IF EMPTY
  575.     CALL    SYM$04        ;GET SYM SIZE
  576.     LXI    H,STR$SIZE    ;AND COMPARE WITH CURRENT
  577.     CMP    M
  578.     JNZ    SYM$10        ;BR IF NOT EQUAL
  579.     MOV    B,A
  580.     INX    H
  581.     XCHG
  582.     LHLD    SYM$HASH$PTR
  583.     INX    H
  584.     INX    H
  585.     INX    H
  586. SYM$09:
  587.     LDAX    D        ;COMPARE SYMBOL TO NEW STRING
  588.     CMP    M
  589.     JNZ    SYM$10        ;NOT MATCHED
  590.     INX    D
  591.     INX    H
  592.     DCR    B
  593.     JNZ    SYM$09
  594.     RET            ;RETURN IF MATCHED
  595. SYM$10:
  596.     LHLD    SYM$HASH$PTR    ;SET UP ANOTHER ADDRESS
  597.     MOV    E,M
  598.     INX    H
  599.     MOV    D,M
  600.     XCHG
  601.     JMP    SYM$08
  602.  
  603. ***************************************
  604. * POST NEW ENTRY TO SYMBOL TABLE
  605. ***************************************
  606.  
  607. POST$SYM:
  608.     LXI    H,STR$SIZE    ;MOVE SIZE TO (DE)
  609.     MOV    E,M
  610.     MVI    D,0
  611.     LHLD    SYMTAB$PTR    ;CHECK FOR TABLE OVERFLOW.
  612.     SHLD    SYM$HASH$PTR
  613.     DAD    D
  614.     LXI    D,7
  615.     DAD    D
  616.     XCHG
  617.     LHLD    CCP$BEGIN        ;CHECK FOR END MEM
  618.     MOV    A,E
  619.     SUB    L
  620.     MOV    A,D
  621.     SBB    H
  622. SYM$12:
  623.     XCHG
  624.     JNC    SYM$15        ;EXIT IF OVERFLOW
  625.     SHLD    SYMTAB$PTR    ;UPDATE SYM TABLE POINTER
  626.     LHLD    SYM$HASH$PTR    ;RESTORE CURRENT LOCATION
  627.     XCHG
  628.     LXI    H,SYM$SUM
  629.     MOV    C,M        ;PUT SYM$SUM IN (BC)
  630.     MVI    B,0
  631.     LXI    H,SYM$HASH$LST    ;COMPUTE AN ADDRESS
  632.     DAD    B
  633.     DAD    B
  634.     MOV    C,M        ;GET EXISTING LINK IF ANY
  635.     INX    H
  636.     MOV    B,M
  637.     MOV    M,D        ;PUT NEW LINK HERE
  638.     DCX    H
  639.     MOV    M,E
  640.     XCHG            ;RESTORE SYM TABLE ADDR.
  641.     MOV    M,C        ;PUT OLD LINK (IF ANY) HERE)
  642.     INX    H
  643.     MOV    M,B
  644.     LXI    D,STR$SIZE    ;GET SIZE
  645.     LDAX    D
  646.     CPI    11H
  647.     JC    SYM$13
  648.     MVI    A,10H        ;TRUNCATE IF OVERSIZE
  649. SYM$13:
  650.     MOV    B,A
  651.     DCR    A
  652.     INX    H
  653.     MOV    M,A        ;NOW MOVE SIZE TO SYM TABLE
  654. SYM$14:
  655.     INX    H        ;AND MOVE SYMBOL IN TO TABLE
  656.     INX    D
  657.     LDAX    D
  658.     MOV    M,A
  659.     DCR    B
  660.     JNZ    SYM$14
  661.     XRA    A        ;CLEAR SPACE FOR VALUE
  662.     INX    H
  663.     MOV    M,A
  664.     INX    H
  665.     MOV    M,A
  666.     INX    H
  667.     MOV    M,A
  668.     INX    H
  669.     MOV    M,A
  670.     RET
  671. SYM$15:
  672.     LXI    H,SYM$16
  673.     CALL    MSGOUT
  674.     JMP    CLOSE$00
  675. SYM$16:
  676.     DB    'Symbol table overflow',CR
  677. SYM$17:
  678.     RAL
  679.     RAL
  680.     RAL
  681.     RAL
  682.     ANI    0F0H
  683.     MOV    B,A
  684.     LHLD    SYM$HASH$PTR
  685.     INX    H
  686.     INX    H
  687.     MOV    A,M
  688.     ANI    0FH
  689.     ORA    B
  690.     MOV    M,A        ;WRITE CONTROL TO SYM TABLE
  691.     RET
  692. SYM$18:
  693.     LHLD    SYM$HASH$PTR
  694.     INX    H
  695.     INX    H
  696.     MOV    A,M
  697.     RAR
  698.     RAR
  699.     RAR
  700.     RAR
  701.     ANI    0FH
  702.     RET
  703. SYM$19:
  704.     CALL    SYM$04
  705.     LHLD    SYM$HASH$PTR
  706.     MOV    E,A
  707.     MVI    D,0
  708.     DAD    D
  709.     INX    H
  710.     INX    H
  711.     INX    H
  712.     RET
  713.  
  714. ***************************************
  715. * SYMBOL TABLE FORMAT
  716. * LENGTH OF EACH ENTRY = SYMBOL LENGTH + 5
  717. * FORMAT
  718. * W1 - LINK ADDRESS (IF ANY)
  719. * W2 -  "     "        "
  720. * W3 - TYPE,LENGTH-1
  721. * W4-WN SYMBOL
  722. * WN+1 VALUE
  723. * WN+2 VALUE
  724. * WN+3 LINE #    | IN BCD
  725. * WN+4 LINE #   | 0 - 9999
  726. ***************************************
  727.  
  728. PUT$SYM$VAL:
  729.     PUSH    H
  730.     CALL    SYM$19
  731.     POP    D
  732.     MOV    M,E
  733.     INX    H
  734.     MOV    M,D
  735. * LOAD BCD LINE NUMBER INTO SYMBOL TABLE
  736.     PUSH    H
  737.     PUSH    B
  738.     INX    H
  739.     LXI    B,LINE$NM
  740.     LDAX    B
  741.     MOV    M,A
  742.     INX    H
  743.     INX    B
  744.     LDAX    B
  745.     MOV    M,A
  746.     POP    B
  747.     POP    H
  748.     RET
  749.  
  750. GET$SYM$VAL:
  751.     CALL    SYM$19
  752.     MOV    E,M
  753.     INX    H
  754.     MOV    D,M
  755.     XCHG
  756.     RET
  757.