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

  1.  
  2. CPM    EQU    00H
  3. BDOS    EQU    05H
  4. TFCB    EQU    5CH
  5. L0064    EQU    64H
  6. FCB2    EQU    6CH
  7. TBUFF    EQU    80H
  8. LC013    EQU    0C013H
  9. LC217    EQU    0C217H
  10.  
  11. ; BDOS EQUATES
  12.  
  13. RDCON    EQU    1
  14. WRCON    EQU    2
  15. PRINT    EQU    9
  16. CSTAT    EQU    11
  17. SELDSK    EQU    14
  18. OPEN    EQU    15
  19. CLOSE    EQU    16
  20. SRCHF    EQU    17
  21. SRCHN    EQU    18
  22. DELETE    EQU    19
  23. READ    EQU    20
  24. WRITE    EQU    21
  25. MAKE    EQU    22
  26. RTCUDSK    EQU    25
  27. STDMA    EQU    26
  28.  
  29. ; GENERAL EQUATES
  30.  
  31. CR    EQU    0DH
  32. LF    EQU    0AH
  33. TAB    EQU    09H
  34. EOF    EQU    1AH
  35.  
  36. LIN$PAG$CT:    DB    55
  37. STITLE:        DB    'LASM-TDL Nov-85     ',0
  38. PAGE$BUF:      DB    ' PAGE-000   '
  39. TIT$BUF:       DB    '                              ',CR
  40. PAS$MSG:       DB    'Pass-1 ',0
  41.  
  42. ; CHARACTER TYPE
  43. ; 1 = ALPHA
  44. ; 2 = NUMBER
  45. ; 3 = QUOTE "
  46. ; 4 = OTHER
  47.  
  48. PRN$CHR$CT:    DB    0
  49. STR$TYPE:      DB    0
  50. STR$VAL:       DW    0
  51. STR$SIZE:      DB    0
  52.  
  53. STRING:
  54.     DB    0,0,0,0,0,0,0,0,0,0,0,0,0
  55.     DB    0,0,0,0,0,0,0,0,0,0,0,0,0
  56.     DB    0,0,0,0,0,0,0,0,0,0,0,0,0
  57.     DB    0,0,0,0,0,0,0,0,0,0,0,0,0
  58.     DB    0,0,0,0,0,0,0,0,0,0,0,0
  59.  
  60. L0161:         DW    0
  61. SYMTAB$PTR:    DW    SYM$TABLE
  62. XREF$PTR:      DW    0
  63. PASS$NM:       DB    0
  64. LOC$CTR1:      DW    0
  65. LOC$CTR2:      DW    0
  66.  
  67. CCP$BEGIN      DW    0
  68.  
  69. SYM$TAB$BASE:    DW    SYM$TABLE
  70. SYM$HASH$PTR:    DW    0
  71. OBJ$LINE$LOC:    DW    0
  72. OBJ$BYTE$CNT:    DB    0
  73. OBJ$LINE:        DW    0,0,0,0,0,0,0,0
  74.  
  75. DFALDRV:    DB    0
  76. OPTSRC:     DB    0
  77. OPTPRN:     DB    0
  78. OPTOBJ:     DB    0
  79. SRCFCB:     DB    0
  80.  
  81. SRCNAME:
  82.     DB    0,0,0,0,0,0,0,0,'ASM'
  83. SRC$EXT:
  84.     DB    0,0,0,0,0,0,0,0,0,0,0,0,0
  85.     DB    0,0,0,0,0,0,0
  86. SRC$CR:
  87.     DB    0
  88. PRNFCB:
  89.     DB    0,0,0,0,0,0,0,0,0
  90.     DB    'PRN'
  91. L01B2:
  92.     DB    0,0,0,0,0,0,0,0,0,0,0,0,0
  93.     DB    0,0,0,0,0,0,0
  94. L01C6:
  95.     DB    0
  96. OBJFCB:
  97.     DB    0,0,0,0,0,0,0,0,0,'HEX',0
  98.     DB    0,0,0,0,0,0,0,0,0,0,0,0,0
  99.     DB    0,0,0,0,0,0,0
  100. SYM$EXT    DB    'SYM'
  101.  
  102. IBUF$CTR:       DW    1000H
  103. PRN$BUF$PTR:    DW    0
  104. OBJ$BUF$PTR:    DW    0
  105.  
  106. FLAG$BYT:    DB    0
  107. XREFF    EQU    1
  108. SYMF    EQU    2
  109.  
  110. CCP$SP        DW    0        ; CPM CCP STACK
  111.  
  112. SEL$DRV:
  113.     LXI    H,DFALDRV
  114.     CMP    M
  115.     RZ
  116.     MOV    M,A
  117.     MOV    E,A
  118.     MVI    C,SELDSK
  119.     CALL    BDOS
  120.     RET
  121.  
  122. OPT$TRAN:
  123.     INX    H
  124.     MOV    A,M
  125.     CPI    ' '
  126.     JZ    L0205
  127.     SBI    'A'
  128.     RET
  129. L0205:
  130.     LDA    DFALDRV
  131.     RET
  132.  
  133. MSGOUT:
  134.     MOV    A,M
  135.     CALL    CO
  136.     MOV    A,M
  137.     INX    H
  138.     ORA    A
  139.     JZ    MSG$01
  140.     CPI    CR
  141.     JNZ    MSGOUT
  142. MSG$00:    MVI    A,LF
  143.     CALL    CO
  144.     RET
  145. MSG$01: MVI    A,CR
  146.     CALL    CO
  147.     JMP    MSG$00
  148.  
  149. MOVNAM:
  150.     LXI    D,TFCB
  151.     MVI    B,9
  152. L021F:
  153.     LDAX    D
  154.     CPI    '?'
  155.     JZ    ER04        ;'SOURCE NAME ERROR'
  156.     MOV    M,A
  157.     INX    H
  158.     INX    D
  159.     DCR    B
  160.     JNZ    L021F
  161.     RET
  162.  
  163. OPENFIL:
  164.     MVI    C,OPEN
  165.     CALL    BDOS
  166.     CPI    0FFH
  167.     RNZ
  168.     LXI    H,ERMSG1
  169.     CALL    MSGOUT
  170.     JMP    SYSTEM
  171.  
  172. CLOSFIL:
  173.     MVI    C,CLOSE
  174.     CALL    BDOS
  175.     CPI    0FFH
  176.     RNZ
  177.     LXI    H,CANT$CLOS$M
  178.     CALL    MSGOUT
  179.     JMP    SYSTEM
  180.  
  181. DEL$FIL:
  182.     MVI    C,DELETE
  183.     JMP    BDOS
  184.  
  185. MAKEFIL:
  186.     MVI    C,MAKE
  187.     CALL    BDOS
  188.     CPI    0FFH
  189.     RNZ
  190.     LXI    H,ERMSG3
  191.     CALL    MSGOUT
  192.     JMP    SYSTEM
  193.  
  194. SEL$SRC$DRV:
  195.     LDA    OPTSRC
  196.     CALL    SEL$DRV
  197.     RET
  198. L026C:
  199.     LDA    OPTPRN
  200.     CPI    'Z'-'A'        ;NO FILE OPTION
  201.     RZ
  202.     CPI    'X'-'A'        ;LIST AT CONSOL OPT
  203.     RET
  204.  
  205. SEL$PRN:
  206.     LDA    OPTPRN
  207.     CALL    SEL$DRV
  208.     RET
  209.  
  210. SEL$OBJ:
  211.     LDA    OPTOBJ
  212.     CALL    SEL$DRV
  213.     RET
  214.  
  215. **********************************
  216. * ASSEMBLY PROCESSING
  217. **********************************
  218.  
  219. ASSEMBLE:
  220.  
  221.     LXI    H,0
  222.     DAD    SP
  223.     SHLD    CCP$SP
  224.     LXI    SP,IBUFR
  225.  
  226.     LXI    H,STITLE
  227.     CALL    MSGOUT        ;WRITE ASM VERSION TO CONS.
  228.     LDA    TFCB+1
  229.     CPI    ' '        ;FILENAME THERE?
  230.     JZ    ER04        ;NO, SOURCE NAME ERROR
  231.     MVI    C,RTCUDSK
  232.     CALL    BDOS
  233.     STA    DFALDRV        ;SAVE DEFAULT DRIVE OPTION
  234.     LXI    H,L0064        ;POINT TO SOURCE DRIVE OPTION
  235.     CALL    OPT$TRAN    ;TRANSLATE SOURCE OPTION
  236.     STA    OPTSRC        ;SAVE SOURCE OPTION
  237.     CALL    OPT$TRAN    ;TRANSLATE OBJECT OPTION
  238.     STA    OPTOBJ        ;SAVE OBJECT OPTION
  239.     CALL    OPT$TRAN    ;TRANSLATE PRINT OPTION
  240.     STA    OPTPRN        ;SAVE PRINT OPTION
  241.     LXI    H,SRCFCB
  242.     CALL    MOVNAM        ;SET UP SOURCE FCB
  243.     LXI    H,PRNFCB
  244.     CALL    MOVNAM        ;SET UP PRN FCB
  245.     CALL    L026C
  246.     JZ    L02D5        ;BR IF NO PRN FILE OPTION
  247.     CALL    SEL$PRN        ;SELECT PRN FILE DISK
  248.     LXI    D,PRNFCB    ;POINT TO FCB
  249.     CALL    DEL$FIL        ;DELETE OLD PRN FILE
  250.     LXI    D,PRNFCB
  251.     CALL    MAKEFIL        ;OPEN NEW PRN FILE.
  252. L02D5:
  253.     LDA    OPTOBJ
  254.     CPI    'Z'-'A'
  255.     JZ    MAIN        ;BR IF NO FILE OPTION
  256.     LXI    H,OBJFCB
  257.     PUSH    H
  258.     PUSH    H
  259.     CALL    MOVNAM
  260.     CALL    SEL$OBJ        ;SELECT OBJ DISK
  261.     POP    D
  262.     CALL    DEL$FIL        ;KILL OLD OBJECT
  263.     POP    D
  264.     CALL    MAKEFIL        ;OPEN NEW OBJECT
  265.     JMP    MAIN        ;JUMP TO PASS 1.
  266.  
  267. RESET$SRC:
  268.     LXI    H,01000H    ;RESET IBUF POINTER
  269.     SHLD    IBUF$CTR
  270.     XRA    A
  271.     STA    SRC$EXT        ;RESET EXTENT
  272.     STA    SRC$CR        ;RESET CURRENT RECORD #
  273.     CALL    SEL$SRC$DRV    ;SELECT DRIVE
  274.     LXI    D,SRCFCB
  275.     CALL    OPENFIL        ;OPEN FILE
  276.     RET
  277.  
  278. ER04:                ; SOURCE NAME ERROR
  279.     LXI    H,ERMSG4
  280.     CALL    MSGOUT
  281.     JMP    SYSTEM
  282.  
  283. SYSTEM:            ;RETURN TO CCP
  284.     LHLD    CCP$SP
  285.     SPHL
  286.     RET
  287.  
  288. CMP$LIM:
  289.     MOV    A,D
  290.     CMP    H
  291.     RNZ
  292.     MOV    A,E
  293.     CMP    L
  294.     RET
  295.  
  296. ***************************************
  297. * GET INPUT CHARACTER FROM DISK
  298. ***************************************
  299.  
  300. DSK$IN:
  301.     PUSH    B
  302.     PUSH    D
  303.     PUSH    H
  304.     LHLD    IBUF$CTR    ;HAVE WE FINISHED THIS BUFFER
  305.     LXI    D,01000H
  306.     CALL    CMP$LIM
  307.     JNZ    DSK$IN$05    ;BR IF NOT.
  308.     CALL    SEL$SRC$DRV    ;YES, SELECT DSK
  309.     LXI    H,0
  310.     SHLD    IBUF$CTR
  311.     MVI    B,32        ;RESET BUF PTR (32 SECTORS)
  312.     LXI    H,IBUFR
  313. DSK$IN$01:
  314.     PUSH    B
  315.     PUSH    H
  316.     MVI    C,READ
  317.     LXI    D,SRCFCB    ;READ A SECTOR
  318.     CALL    BDOS
  319.     POP    H
  320.     POP    B
  321.     ORA    A
  322.     MVI    C,80H
  323.     JNZ    DSK$IN$03    ;BR IF EOF
  324.     LXI    D,TBUFF
  325.     MVI    C,80H        ;SET CHAR COUNT
  326. DSK$IN$02:
  327.     LDAX    D        ;MOVE DATA FROM TBUFF TO IBUFR
  328.     MOV    M,A
  329.     INX    D
  330.     INX    H
  331.     DCR    C        ;DECR CHAR CTR
  332.     JNZ    DSK$IN$02
  333.     DCR    B        ;DECR SECTOR CTR
  334.     JNZ    DSK$IN$01
  335.     JMP    DSK$IN$05
  336. DSK$IN$03:
  337.     CPI    3        ; ETX CHAR?
  338.     JNC    ER05
  339. DSK$IN$04:
  340.     MVI    M,EOF        ;WRITE EOFS SECTOR FILL
  341.     INX    H
  342.     DCR    C
  343.     JNZ    DSK$IN$04
  344. DSK$IN$05:
  345.     LXI    D,IBUFR
  346.     LHLD    IBUF$CTR
  347.     PUSH    H
  348.     INX    H
  349.     SHLD    IBUF$CTR
  350.     POP    H
  351.     DAD    D
  352.     MOV    A,M        ;THIS IS THE CHARACTER.....
  353.     PUSH    PSW
  354.     CPI    LF        ; IS IT A LF?
  355.     CZ    INC$LINE$NM    ;YES, INCR LINE NUMBER.
  356.     POP    PSW
  357.     POP    H
  358.     POP    D
  359.     POP    B
  360.     RET
  361. ER05:
  362.     LXI    H,ERMSG5    ;SOURCE FILE READ ERROR
  363.     CALL    MSGOUT
  364.     JMP    SYSTEM
  365.  
  366. ***************************************
  367. * PRINT
  368. * The following routines handle the listing
  369. * operations.
  370. ***************************************
  371.  
  372. PRINT$00:
  373.     PUSH    B
  374.     MOV    B,A
  375.     LDA    OPTPRN
  376.     CPI    'Z'-'A'        ;NO FILE OPTION
  377.     JZ    PRINT$03
  378.     CPI    'X'-'A'        ;LIST AT CONSOL OPT
  379.     MOV    A,B
  380.     JNZ    PRINT$02
  381.     CALL    CO
  382.     JMP    PRINT$03
  383. PRINT$01:
  384.     PUSH    B
  385. PRINT$02:
  386.     PUSH    D
  387.     PUSH    H
  388.     CALL    PRINT$04
  389.     POP    H
  390.     POP    D
  391. PRINT$03:
  392.     POP    B
  393.     RET
  394. PRINT$04:
  395.     LHLD    PRN$BUF$PTR
  396.     XCHG
  397.     LXI    H,PRN$BUFR
  398.     DAD    D
  399.     MOV    M,A
  400.     XCHG
  401.     INX    H
  402.     SHLD    PRN$BUF$PTR
  403.     XCHG
  404.     LXI    H,0400H
  405.     CALL    CMP$LIM
  406.     RNZ
  407.     CALL    SEL$PRN
  408.     LXI    H,0
  409.     SHLD    PRN$BUF$PTR
  410.     LXI    H,PRN$BUFR
  411.     LXI    D,PRNFCB
  412.     MVI    B,8
  413. PRINT$05:
  414.     MOV    A,M
  415.     CPI    EOF
  416.     RZ
  417.     PUSH    B
  418.     PUSH    D
  419.     MVI    C,80H
  420.     LXI    D,TBUFF
  421. PRINT$06:
  422.     MOV    A,M
  423.     STAX    D
  424.     INX    H
  425.     INX    D
  426.     DCR    C
  427.     JNZ    PRINT$06
  428.     POP    D
  429.     PUSH    D
  430.     PUSH    H
  431.     MVI    C,WRITE
  432.     CALL    BDOS
  433.     POP    H
  434.     POP    D
  435.     POP    B
  436.     ORA    A
  437.     JNZ    OUT$FIL$ERR
  438.     DCR    B
  439.     RZ
  440.     JMP    PRINT$05
  441. OUT$FIL$ERR:
  442.     LXI    H,ERMSG6
  443.     CALL    MSGOUT
  444.     JMP    CLOSE$04
  445.  
  446. ***************************************
  447. * OBJECT OUT
  448. ***************************************
  449.  
  450. OBJ$OUT$00:
  451.     PUSH    B
  452.     PUSH    D
  453.     PUSH    H
  454.     CALL    OBJ$OUT$02
  455.     POP    H
  456.     POP    D
  457.     POP    B
  458.     RET
  459. OBJ$OUT$02:
  460.     LHLD    OBJ$BUF$PTR
  461.     XCHG
  462.     LXI    H,OBJ$BUFR
  463.     DAD    D
  464.     MOV    M,A
  465.     XCHG
  466.     INX    H
  467.     SHLD    OBJ$BUF$PTR
  468.     XCHG
  469.     LXI    H,0400H
  470.     CALL    CMP$LIM
  471.     RNZ
  472.     CALL    SEL$OBJ
  473.     LXI    H,0
  474.     SHLD    OBJ$BUF$PTR
  475.     LXI    H,OBJ$BUFR
  476.     LXI    D,OBJFCB
  477.     MVI    B,8
  478.     JMP    PRINT$05
  479.  
  480. ***************************************
  481. * CONSOL OUT
  482. ***************************************
  483.  
  484. CO:
  485.     PUSH    B
  486.     PUSH    D
  487.     PUSH    H
  488.     MVI    C,WRCON
  489.     MOV    E,A
  490.     CALL    BDOS
  491.     POP    H
  492.     POP    D
  493.     POP    B
  494.     RET
  495.  
  496. ***************************************
  497. * SEND PRN CHARACTER TO LIST DEVICE
  498. ***************************************
  499.  
  500. PRN$CHR:
  501.     MOV    C,A
  502.     CALL    PRINT$00
  503.     LDA    PRN$LINE
  504.     CPI    ' '
  505.     RZ
  506.     LDA    OPTPRN
  507.     CPI    'X'-'A'        ;LIST AT CONSOLE OPT
  508.     RZ
  509.     MOV    A,C
  510.     CALL    CO
  511.     RET
  512.  
  513. ***************************************
  514. * PRINT MESSAGE TO LIST DEVICE
  515. ***************************************
  516.  
  517. PRN$MSG$00:
  518.     LDA    PRN$CHR$CT
  519.     LXI    H,PRN$LINE
  520. PRN$MSG$01:
  521.     ORA    A
  522.     JZ    PRN$MSG$02    ;IF CTR 0, OUTPUT CRLF
  523.     MOV    B,A
  524.     PUSH    B
  525.     MVI    B,8        ;OUTPUT LINE NUMBER
  526.     LXI    H,LINE$NUM
  527. PRN$MSG$01A:
  528.     MOV    A,M
  529.     CALL    PRN$CHR
  530.     INX    H
  531.     DCR    B
  532.     JNZ    PRN$MSG$01A
  533.     LXI    H,PRN$LINE
  534.     POP    B
  535. PRN$MSG$01B:
  536.     MOV    A,M        ; ELSE OUTPUT MSG CHAR.
  537.     CALL    PRN$CHR
  538.     INX    H
  539.     DCR    B
  540.     JNZ    PRN$MSG$01B
  541.     XRA    A
  542. PRN$MSG$02:
  543.     STA    PRN$CHR$CT
  544.     CALL    HEADER        ;PRINT HEADER IF REQ.
  545.     LXI    H,PRN$LINE
  546.     MVI    A,78H
  547. PRN$MSG$03:
  548.     MVI    M,' '        ;NOW SETUP BLANK LINE.
  549.     INX    H
  550.     DCR    A
  551.     JNZ    PRN$MSG$03
  552.     RET
  553. ERR$COD:
  554.     MOV    B,A
  555.     LXI    H,PRN$LINE
  556.     MOV    A,M
  557.     CPI    ' '
  558.     RNZ
  559.     MOV    M,B
  560.     RET
  561.  
  562. ***************************************
  563. * HEADER OUTPUT
  564. ***************************************
  565.  
  566. HEADER:
  567.     MVI    A,CR
  568.     CALL    PRN$CHR
  569.     MVI    A,LF        ;OUTPUT LINE FEED
  570.     CALL    PRN$CHR
  571.     LDA    PASS$NM
  572.     ORA    A
  573.     RZ
  574.     LXI    H,LIN$PAG$CT    ;INCREMENT LINES-PAGE COUNTER
  575.     MOV    A,M
  576.     INR    M
  577.     CPI    55        ;LIMIT IS 55 LINES
  578.     RC
  579.     MVI    M,0        ;RESET COUNTER IF OVER
  580.     LXI    H,PAGE$BUF+8
  581. HEADER$00:
  582.     MOV    A,M        ;INCREMENT PAGE COUNTER
  583.     ORI    '0'
  584.     INR    A
  585.     MOV    M,A
  586.     CPI    ':'
  587.     JC    HEADER$02    ;NOW PRINT HEADER
  588.     MVI    M,'0'
  589.     DCX    H
  590.     JMP    HEADER$00
  591. HEADER$01:
  592.     MVI    A,LF        ;OUTPUT LINE FEED
  593.     CALL    PRN$CHR
  594.     RET            ;EXIT
  595. HEADER$02:
  596.     MVI    A,12        ;SEND FORM FEED
  597.     CALL    PRN$CHR
  598.     LXI    H,STITLE    ;NOW PRINT HEADER
  599. HEADER$03:
  600.     MOV    A,M        ;GET CHAR
  601.     ORA    A        ;SKIP IF 0
  602.     JZ    HEADER$04
  603.     PUSH    H
  604.     CALL    PRN$CHR        ;OUTPUT CHARACTER
  605.     POP    H
  606.     MOV    A,M
  607. HEADER$04:
  608.     INX    H
  609.     CPI    CR        ;WAS THAT A CR.
  610.     JNZ    HEADER$03
  611.     MVI    A,LF
  612.     CALL    PRN$CHR
  613.     JMP    HEADER$01
  614.  
  615. ***************************************
  616. * CLOSING OPERATIONS
  617. ***************************************
  618.  
  619. CLOSE$00:
  620.     CALL    SORT$SYM
  621.     LDA    OPTPRN
  622.     CPI    'Z'-'A'
  623.     JZ    CLOSE$02    ;NOT PRINTING ANYWHERE
  624.     CALL    PRN$REFS
  625.     CALL    L026C
  626.     JZ    CLOSE$02    ;NOT PRINTING TO FILE
  627. CLOSE$01:
  628.     LHLD    PRN$BUF$PTR    ;RUN OUT PRN.
  629.     MOV    A,L
  630.     ORA    H
  631.     JZ    CLOSE$02
  632.     MVI    A,EOF
  633.     CALL    PRINT$00
  634.     JMP    CLOSE$01
  635. CLOSE$02:
  636.     LDA    OPTOBJ
  637.     CPI    'Z'-'A'        ;NO FILE OPTION
  638.     JZ    CLOSE$04
  639.     LDA    OBJ$BYTE$CNT
  640.     ORA    A
  641.     CNZ    OBJ$LINE$00
  642.     LHLD    LOC$CTR1
  643.     SHLD    OBJ$LINE$LOC
  644.     CALL    OBJ$LINE$00
  645. CLOSE$03:
  646.     LHLD    OBJ$BUF$PTR    ;RUN OUT OBJ.
  647.     MOV    A,L
  648.     ORA    H
  649.     JZ    CLOSE$04
  650.     MVI    A,EOF
  651.     CALL    OBJ$OUT$00
  652.     JMP    CLOSE$03
  653. CLOSE$04:            ;CLOSE PRN FILE.
  654.     CALL    L026C
  655.     JZ    CLOSE$05
  656.     CALL    SEL$PRN
  657.     LXI    D,PRNFCB
  658.     CALL    CLOSFIL
  659. CLOSE$05:
  660.     LDA    OPTOBJ
  661.     CPI    'Z'-'A'        ;NO FILE OPTION
  662.     JZ    END$MSG$OUT
  663.     CALL    SEL$OBJ
  664.     LXI    D,OBJFCB
  665.     CALL    CLOSFIL        ;CLOSE OBJ FILE.
  666. CLOSE$06:            ;BUILD SYMBOL FILE
  667.     LDA    FLAG$BYT
  668.     ANI    SYMF        ;SYM FILE?
  669.     JZ    END$MSG$OUT    ;BR IF NOT
  670.     LXI    H,PRNFCB+9
  671.     LXI    D,SYM$EXT    ;COPY SYM EXTENSION TO
  672.     MVI    B,3        ;PRN FCB
  673.     CALL    L021F
  674.     LDA    OPTOBJ
  675.     STA    OPTPRN        ;SET PRN FILE TO OBJ FILE
  676.     LDA    OBJFCB
  677.     STA    PRNFCB        ;AND DRIVE
  678.     XRA    A
  679.     STA    PRNFCB+12
  680.     STA    PRNFCB+32
  681.     CALL    SEL$PRN
  682.     LXI    D,PRNFCB
  683.     PUSH    D
  684.     CALL    DEL$FIL        ;DEL OLD SYM FILE
  685.     POP    D
  686.     CALL    MAKEFIL        ;MAKE NEW SYM FILE
  687.     LXI    H,0
  688.     SHLD    PRN$BUF$PTR
  689.     LXI    H,SYM$MSG
  690.     CALL    MSGOUT
  691.     CALL    L0585
  692.     JMP    END$MSG$OUT
  693.  
  694. ***************************************
  695.  
  696. END$MSG$OUT:
  697.     LXI    H,END$ASSY$MSG
  698.     CALL    MSGOUT
  699.     JMP    SYSTEM
  700.  
  701. ***************************************
  702. * SET UP SYMBOL TABLE FOR PRINTING
  703. * SORT ON FIRST CHAR BY FORMING LINKED
  704. * LIST.
  705. ***************************************
  706.  
  707. SORT$SYM:
  708.     LDA    FLAG$BYT
  709.     ANI    XREFF+SYMF    ;NEED SORT?
  710.     RZ             ;RET IF NOT
  711.     MVI    B,'A'
  712.     LXI    D,SYM$LINK$ORG        ;INIT LINK POINTER
  713. SORT$S$00:
  714.     CALL    SORT$S$01
  715.     INR    B
  716.     MOV    A,B
  717.     CPI    'Z'+1
  718.     JNZ    SORT$S$00
  719.     XRA    A        ;DONE, CLEAR END LINK.
  720.     STAX    D
  721.     INX    D
  722.     STAX    D
  723.     RET
  724. SORT$S$01:
  725.     LXI    H,SYM$TAB
  726. SORT$S$02:
  727.     CALL    SORT$S$03        ;TRY FOR MATCH CHAR.
  728.     RC            ;LIST PASS DONE
  729.     CZ    SORT$S$04        ;FOUND A MATCH
  730.     CALL    SORT$S$06        ;BUMP TO NEXT
  731.     JMP    SORT$S$02        ;GO AGAIN
  732. SORT$S$03:
  733.     LDA    SYMTAB$PTR
  734.     SUB    L
  735.     LDA    SYMTAB$PTR+1
  736.     SBB    H
  737.     RC
  738.     MOV    A,M
  739.     ANI    0FH
  740.     MOV    C,A        ;SYMBOL SIZE SAVED
  741.     INX    H
  742.     MOV    A,M        ;1ST CHAR OF SYMBOL
  743.     SUB    B        ;SUBTRACT PASS CHARACTER
  744.     ORA    A
  745.     RET
  746. SORT$S$04:
  747.     MOV    A,D
  748.     ORA    E
  749.     JZ    SORT$S$05        ;DONT UNDERSTAND WHY THIS???
  750.     DCX    H
  751.     MOV    A,L
  752.     STAX    D        ;WRITE LINK.
  753.     INX    D
  754.     MOV    A,H
  755.     STAX    D
  756.     INX    H
  757. SORT$S$05:
  758.     PUSH    H
  759.     CALL    SORT$S$07
  760.     MOV    D,H        ;UPDATE LINK POINTER
  761.     MOV    E,L
  762.     POP    H
  763.     RET
  764. SORT$S$06:
  765.     CALL    SORT$S$07
  766.     INX    H        ;SKIP W1,W2 SYM RECORD (POINTER)
  767.     INX    H
  768.     RET
  769. SORT$S$07:
  770.     MOV    A,B        ;SAVE B.
  771.     MVI    B,0
  772.     DAD    B        ;ADD SIZE
  773.     MOV    B,A
  774.     INX    H        ;AND BUMP TO NEXT RECORD.
  775.     INX    H
  776.     INX    H
  777.     INX    H
  778.     INX    H
  779.     RET
  780.  
  781. ***************************************
  782. * BUILD SYMBOL TABLE FILE
  783. ***************************************
  784.  
  785. L0585:
  786.     LHLD    SYM$LINK$ORG
  787.     LXI    B,0
  788. L0588:
  789.     MOV    A,H
  790.     ORA    L
  791.     JZ    CLOS$SYM$PRN    ;EXIT IF DONE
  792.     MOV    A,M
  793.     ANI    0FH
  794.     MOV    E,A        ;GET SYMBOL SIZE
  795.     MVI    D,0
  796.     INX    H
  797.     PUSH    H
  798.     DAD    D        ;ADD SIZE
  799.     INX    H
  800.     MOV    C,M        ;GET SYMBOL VALUE
  801.     INX    H
  802.     MOV    A,M
  803.     CALL    PRN$HEX        ;PRINT UPPER
  804.     MOV    A,C
  805.     CALL    PRN$HEX        ;PRINT LOWER
  806.     CALL    PRN$SPACE    ;PRINT SPACE
  807.     POP    H        ;RESTORE SYM ADDR
  808.     INR    E        ;INCR SIZE
  809.     PUSH    D        ;SAVE SIZE
  810. L05A6:
  811.     MOV    A,M
  812.     CALL    PRINT$01    ;PRINT THE SYMBOL
  813.     INX    H
  814.     DCR    E
  815.     JNZ    L05A6
  816.     POP    D        ;RESTORE SIZE
  817.     MOV    A,B
  818.     CPI    4
  819.     JNC    PT1        ;END LINE
  820. ; LESS THAN 5 ITEMS
  821.     INR    B
  822.     MVI    A,TAB
  823.     CALL    PRINT$01
  824.     MOV    A,E
  825.     CPI    3
  826.     JNC    PT3
  827.     MVI    A,TAB
  828.     CALL    PRINT$01
  829. PT3:    MOV    A,E
  830.     CPI    11        ;IF SYMBOL TOO LARGE,TABOUT.
  831.     JC    PT2
  832.     INR    B
  833.     MVI    A,TAB
  834.     CALL    PRINT$01
  835. ;
  836. PT2:    INX    H
  837.     INX    H
  838.     INX    H
  839.     INX    H
  840.     MOV    A,M
  841.     INX    H
  842.     MOV    H,M
  843.     MOV    L,A
  844.     JMP    L0588
  845. ;
  846. PT1:    MVI    B,0
  847.     MVI    A,CR
  848.     CALL    PRINT$01
  849.     MVI    A,LF
  850.     CALL    PRINT$01
  851.     JMP    PT2
  852.  
  853. ***************************************
  854. * PRINT SPACE
  855. ***************************************
  856.  
  857. PRN$SPACE:
  858.     MVI    A,' '
  859.     JMP    PRINT$01
  860.  
  861. ***************************************
  862. * CLOSE SYMBOL FILE
  863. ***************************************
  864.  
  865. CLOS$SYM$PRN:
  866.     LHLD    PRN$BUF$PTR
  867.     MOV    A,L
  868.     ORA    H
  869.     JZ    CLOS$SYM$01
  870.     MVI    A,EOF
  871.     CALL    PRINT$01
  872.     JMP    CLOS$SYM$PRN
  873. CLOS$SYM$01:
  874.     CALL    SEL$PRN
  875.     LXI    D,PRNFCB
  876.     CALL    CLOSFIL
  877.     RET
  878.  
  879. ***************************************
  880. * PRINT TWO HEX CHARACTERS
  881. ***************************************
  882.  
  883. PRN$HEX:
  884.     PUSH    PSW
  885.     RAR
  886.     RAR
  887.     RAR
  888.     RAR
  889.     CALL    PRN$HEX$01
  890.     POP    PSW
  891. PRN$HEX$01:
  892.     ANI    0FH
  893.     ADI    90H
  894.     DAA
  895.     ACI    '@'
  896.     DAA
  897.     JMP    PRINT$01
  898.  
  899. PRINT$HEX:
  900.     PUSH    PSW
  901.     RAR
  902.     RAR
  903.     RAR
  904.     RAR
  905.     CALL    PRINT$HEX$01
  906.     POP    PSW
  907. PRINT$HEX$01:
  908.     ANI    0FH
  909.     ADI    90H
  910.     DAA
  911.     ACI    '@'
  912.     DAA
  913.     JMP    PRINT$00
  914.  
  915. SYM$LINK$ORG:
  916.     DW    0
  917.  
  918. ***************************************
  919. * PRINT CROSS REFERENCES
  920. ***************************************
  921.  
  922. SYM$LST$PTR:
  923.     DW    0
  924. SYM$LINE:
  925.     DW    0
  926.  
  927. PRN$REFS:
  928.     LDA    FLAG$BYT
  929.     ANI    XREFF        ;XREF?
  930.     RZ            ;RET IF NOT
  931.     CALL    HEADER$02    ;PRINT HEADER
  932.     LXI    H,XREF$MSG
  933.     CALL    HEADER$03
  934.     LHLD    SYM$LINK$ORG    ;INIT LIST POINTER
  935.     SHLD    SYM$LST$PTR
  936.     LXI    H,LIN$PAG$CT
  937.     MVI    A,2
  938.     MOV    M,A
  939.     CALL    HEADER
  940. PREF$00:
  941.     CALL    PREF$10        ;GET SYMBOL AND PRINT IT.
  942.     RZ            ;NONE FOUND
  943.     CALL    PREF$30        ;PRINT XREFS
  944.     CALL    HEADER
  945.     JMP    PREF$00
  946.  
  947. ***************************************
  948. * SYMBOL PRINT
  949. ***************************************
  950.  
  951. PREF$10:
  952.     LHLD    SYM$LST$PTR    ;LOAD SYMBOL LIST POINTER
  953.     MOV    A,H
  954.     ORA    L
  955.     RZ
  956.     MOV    A,M        ;LOAD SIZE
  957.     ANI    0FH
  958.     INR    A
  959.     MOV    B,A
  960.     PUSH    B        ;SAVE SIZE
  961. PREF$11:
  962.     INX    H
  963.     MOV    A,M        ;PRINT SYMBOL
  964.     CALL    PRINT$00
  965.     DCR    B
  966.     JNZ    PREF$11
  967.     INX    H
  968.     POP    B        ;RESTORE SIZE
  969.     MOV    A,B
  970.     CPI    8
  971.     JNC    PREF$12
  972.     MVI    A,TAB
  973.     CALL    PRINT$00    ;TAB TO 8TH POSITION
  974. PREF$12:
  975.     MVI    A,TAB
  976.     CALL    PRINT$00    ;TAB TO 16TH POSITION
  977.     INX    H        ;SKIP VALUE
  978.     INX    H
  979.     MOV    A,M        ;OUTPUT LINE #
  980.     MOV    D,A
  981.     CALL    PRINT$HEX
  982.     INX    H
  983.     MOV    A,M
  984.     MOV    E,A
  985.     CALL    PRINT$HEX
  986.     XCHG
  987.     SHLD    SYM$LINE    ;LOAD LINE
  988.     XCHG
  989.     INX    H
  990.     MOV    A,M
  991.     INX    H
  992.     MOV    H,M
  993.     MOV    L,A
  994.     SHLD    SYM$LST$PTR
  995.     MVI    A,TAB
  996.     CALL    PRINT$00
  997.     XRA    A
  998.     INR    A
  999.     RET
  1000.  
  1001. ***************************************
  1002. * PRINT XREFS
  1003. ***************************************
  1004.  
  1005. PREF$30:
  1006.     LHLD    XREF$PTR
  1007.     LXI    D,4
  1008.     DAD    D
  1009.     MVI    B,7        ;SET ITEMS PER LINE
  1010. PREF$31:
  1011.     CALL    PREF$34        ;ARE WE DONE
  1012.     RC
  1013.     CALL    PREF$32        ;TRY FOR MATCH
  1014.     JNZ    PREF$31        ;BR IF NO MATCH
  1015.     CALL    PREF$33        ;PRINT FOUND REF.
  1016.     JMP    PREF$31
  1017.  
  1018. PREF$32:
  1019.     LDA    SYM$LINE+1
  1020.     CMP    M
  1021.     JNZ    PREF$320
  1022.     INX    H
  1023.     LDA    SYM$LINE
  1024.     CMP    M
  1025.     DCX    H
  1026.     RZ
  1027. PREF$320:
  1028.     INX    H
  1029.     INX    H
  1030.     INX    H
  1031.     INX    H
  1032.     RET
  1033.  
  1034. ***************************************
  1035. * PRINT FOUND REFERENCE
  1036. ***************************************
  1037.  
  1038. PREF$33:
  1039.     INX    H
  1040.     INX    H
  1041.     MOV    A,M
  1042.     CALL    PRINT$HEX
  1043.     INX    H
  1044.     MOV    A,M
  1045.     CALL    PRINT$HEX
  1046.     INX    H
  1047.     MVI    A,TAB
  1048.     CALL    PRINT$00
  1049.     DCR    B
  1050.     RNZ
  1051. ; ####################
  1052.     PUSH    H
  1053.     CALL    HEADER
  1054.     POP    H
  1055. ; ####################
  1056.     MVI    B,7        ; RESTORE XREF / LINE
  1057.     MVI    A,TAB
  1058.     CALL    PRINT$00
  1059.     MVI    A,TAB
  1060.     CALL    PRINT$00
  1061.     MVI    A,TAB
  1062.     CALL    PRINT$00
  1063.     RET
  1064.  
  1065. PREF$34:
  1066.     XCHG
  1067.     LHLD    CCP$BEGIN
  1068.     DCX    H
  1069.     DCX    H
  1070.     DCX    H
  1071.     DCX    H
  1072.     DCX    H
  1073.     MOV    A,L
  1074.     SUB    E
  1075.     MOV    A,H
  1076.     SBB    D
  1077.     XCHG
  1078.     RET
  1079.  
  1080. ***************************************
  1081. * MISCELLANEOUS MESSAGES
  1082. ***************************************
  1083.  
  1084. XREF$MSG:    DB    'Cross Referenced Symbol List',CR
  1085. SYM$MSG:     DB    'Symbols',CR
  1086. ERMSG1:      DB    'No source'
  1087. ERMSG2:      DB    ' file present',CR
  1088. ERMSG3:      DB    'No directory space',CR
  1089. ERMSG4:      DB    'Source file name error',CR
  1090. ERMSG5:      DB    'Source file read error',CR
  1091. ERMSG6:      DB    'Output file write error',CR
  1092. CANT$CLOS$M:     DB    'Cannot close files',CR
  1093. END$ASSY$MSG:    DB    'End of assembly',CR
  1094.