home *** CD-ROM | disk | FTP | other *** search
/ ftp.barnyard.co.uk / 2015.02.ftp.barnyard.co.uk.tar / ftp.barnyard.co.uk / cpm / walnut-creek-CDROM / SIMTEL / CPMUG / CPMUG078.ARK / XREFPRN.ASM < prev    next >
Assembly Source File  |  1984-04-29  |  23KB  |  1,065 lines

  1. ;15/2/80: 1345
  2.  
  3. ;************************************************;
  4. ;              INTEL ASSEMBLER
  5. ;           CROSS REFERENCE PROGRAM  
  6. ;               VERSION 2.1
  7. ; ORIGINAL BY: JEFF KRAVITZ (REF. 8.27)
  8. ; MODIFIED BY: P.P.H. LEE, TO WORK WITH *.PRN FILES
  9. ; GENERATED BY THE CP/M ASM ASSEMBLER, ALSO
  10. ; HANDLES NON-EXISTING FILES CORRECTLY, AND
  11. ; HAVE BIGGER DISK BUFFER.
  12. ; PAGE LENGTH CHANGED TO 60 LINES PER PAGE, AND
  13. ; NUMBER OF REFERENCES PER LINE IN THE CROSS
  14. ; REFERENCE LIST INCREASED FROM 8 TO 12.
  15. ; DATA AREAS REARRANGED AND SYMT INITIALIZED
  16. ; DURING EXECUTION, GIVING SHORTER COM FILE.
  17. ; PRINTS DIRECTLY TO THE LOGICAL LIST DEVICE
  18. ; VIA THE BIOS LIST VECTOR.
  19. ; LIMIT OF SYMBOL LENGTH INCREASED FROM 5 TO 7
  20. ; CHARACTERS.
  21. ;
  22. ;MODIFIED 1/3/81 BY WARD CHRISTENSEN TO CHANGE
  23. ;LABEL "LINK" TO ALLOW ASSEMBLY UNDER "LINKASM"
  24. ;WHICH USES "LINK" AS A PSEUDO-OP.
  25. ;
  26. ;************************************************;
  27.  
  28. ;********************************;
  29. ;          MAIN LOOP
  30. ;********************************;
  31.  
  32.     ORG    100H    ;ORIGIN ADDRESS
  33. XREF:    LXI    SP,STACK ;SET STACK POINTER
  34.     LHLD    1    ;GET WARM BOOT ADDRESS
  35.     LXI    D,3
  36.     DAD    D    ;GET CONSOLE STATUS VECTOR
  37.     SHLD    CONST+1    ;SAVE IT
  38.     DAD    D    ;GET CONSOLE IN VECTOR
  39.     SHLD    CONIN+1    ;SAVE IT
  40.     DAD    D
  41.     DAD    D    ;GET LIST VECTOR
  42.     SHLD    LIST+1    ;SAVE IT
  43.     MVI    A,0FFH    ;INITIALIZE SYMT
  44.     STA    SYMT
  45.     CALL    SETUP    ;INITIALIZE
  46. XREF1:    CALL    GETBYT    ;GET RID OF LEADING
  47.     CPI    0DH    ;CR
  48.     JZ    XREF1    ;AND
  49.     CPI    0AH    ;LF
  50.     JZ    XREF1
  51.     JMP    MAIN1    ;SKIP AROUND
  52. MAIN:    CALL    GETBYT    ;GET A BYTE FROM SOURCE FILE
  53. MAIN1:    CALL    SAVBYT    ;SAVE BYTE IN PRINT BUFFER
  54. MAIN2:    CALL    CHKNUM    ;TEST FOR NUMERIC
  55.     JNC    LNUM    ;YES, FOUND A NUMBER, PROCESS
  56.     CALL    CHKALP    ;TEST FOR ALPHABETIC
  57.     JNC    LALPH    ;YES, PROCESS
  58.     LXI    H,CPTBL    ;POINT TO CHARACTER TABLE
  59.     CALL    LOOK    ;LOOK UP CHAR IN CHAR TABLE
  60.     JC    MAIN    ;NOT FOUND, IGNORE
  61.     PCHL        ;EXECUTE ROUTINE
  62.  
  63. ;********************************;
  64. ;      FINAL SYMBOL TABLE PRINT
  65. ;********************************;
  66.  
  67. DONE:    LDA    LINES    ;CHECK IF ALREADY ON
  68.     ORA    A    ;NEW PAGE
  69.     JZ    DONE2    ;BRIF IS
  70.     MOV    B,A    ;SAVE LINE NUMBER
  71.     MVI    E,0AH    ;FINISH DOING CURRENT PAGE
  72. DONE1:    CALL    PRBYT    ;BY PRINTING
  73.     MOV    A,B    ;THE REQUIRED
  74.     INR    A    ;NUMBER OF
  75.     MOV    B,A    ;LINE FEEDS
  76.     CPI    60    ;FINISHED?
  77.     JC    DONE1    ;BRIF NOT
  78.     CALL    PAGE    ;ELSE ISSUE PAGE EJECT
  79. DONE2:    LXI    H,XRFHD    ;AND PRINT OUT
  80.     MVI    B,16    ;THE CROSS REFERENCE
  81. DONE3:    MOV    E,M    ;HEADING
  82.     CALL    PRBYT    ;BEFORE PRINTING
  83.     INX    H    ;THEM
  84.     DCR    B
  85.     JNZ    DONE3
  86.     CALL    CRLF
  87.     CALL    CRLF
  88.     LHLD    SYMBT    ;GET SYMBOL TABLE BOTTOM
  89.     SHLD    SYM    ;SET SYMBOL POINTER
  90.     LHLD    SYMTP    ;GET SYMBOL TABLE TOP
  91.     MVI    M,0FFH    ;END OFF SYMBOL TABLE
  92. DLP1:    LHLD    SYM    ;GET SYMBOL TABLE POINTER
  93.     CALL    PRSYM    ;PRINT SYMBOL
  94.     LHLD    SYM
  95.     LXI    D,SYMSZ    ;OFFSET TO REF LINK
  96.     DAD    D
  97.     MOV    E,M
  98.     INX    H
  99.     MOV    D,M    ;GET REF BLOCK ADDR
  100.     XCHG        ;INTO HL
  101.     SHLD    REF
  102.     CALL    PREFS    ;PRINT REFERENCES
  103.     LHLD    SYM    ;GET SYMBOL TABLE POINTER
  104.     LXI    D,STESZ    ;SIZE OF SYM TABLE ENTRY
  105.     DAD    D
  106.     SHLD    SYM
  107.     MOV    A,M    ;GET BYTE
  108.     CPI    0FFH    ;END OF TABLE?
  109.     JNZ    DLP1    ;BRIF NOT
  110.     JMP    BOOT    ;ELSE REBOOT CP/M
  111.  
  112. ;********************************;
  113. ;     SYMBOL PRINT ROUTINE
  114. ;********************************;
  115.  
  116. PRSYM:    MVI    B,SYMSZ    ;SYMBOL SIZE
  117. PRSYM2:    MOV    E,M    ;GET BYTE
  118.     CALL    PRBYT    ;PRINT BYTE
  119.     INX    H
  120.     DCR    B
  121.     JNZ    PRSYM2
  122.     MVI    E,' '
  123.     CALL    PRBYT    ;PRINT 2 SPACES
  124.     CALL    PRBYT
  125.     RET
  126.  
  127. ;********************************;
  128. ;     REFERENCE PRINT ROUTINE
  129. ;********************************;
  130.  
  131. PREFS:    LHLD    REF    ;GET REF BLOCK ADDR
  132.     INX    H
  133.     INX    H    ;BUMP TO FIRST REF NUMBER
  134.     SHLD    TEMP    ;SAVE REF NUM ADDR
  135.     MVI    A,(REFSZ-2)/2    ;NUMBER OF REF SLOTS
  136.     STA    SYMCT    ;SAVE IN SYMCT
  137. PREF:    LHLD    TEMP    ;GET REF SLOT ADDR
  138.     MOV    E,M
  139.     INX    H
  140.     MOV    D,M    ;GET REF
  141.     LXI    H,0000    ;ZERO?
  142.     CALL    CPHL
  143.     JZ    PREFX    ;YES, DONE
  144.     XCHG        ;GET NUM IN HL
  145.     CALL    DECOT    ;CONVERT
  146.     LXI    H,DEC    ;POINT TO DEC STRING
  147.     MVI    M,' '    ;BLANK LEADING ZERO
  148.     MVI    B,5
  149. PREF2:    MOV    E,M
  150.     CALL    PRBYT    ;PRINT BYTE
  151.     INX    H
  152.     DCR    B
  153.     JNZ    PREF2    ;PRINT REFERENCE NUMBER
  154.     LHLD    TEMP    ;GET REF SLOT ADDR
  155.     INX    H
  156.     INX    H    ;BUMP TO NEXT SLOT
  157.     SHLD    TEMP
  158.     LDA    SYMCT    ;GET COUNT
  159.     DCR    A    ;DECREMENT
  160.     STA    SYMCT
  161.     JNZ    PREF
  162.     LHLD    REF    ;GET REF BLOCK ADDRESS
  163.     MOV    E,M
  164.     INX    H
  165.     MOV    D,M    ;GET LINK TO NEXT BLOCK
  166.     LXI    H,0000
  167.     CALL    CPHL    ;ANY MORE BLOCKS?
  168.     JZ    PREFX    ;NO, EXIT
  169.     XCHG        ;YES, SET NEXT BLOCK POINTER
  170.     SHLD    REF    ;IN REF
  171.     CALL    CRLF    ;PRINT CR,LF
  172.     MVI    B,SYMSZ+2
  173. PREF3:    MVI    E,' '
  174.     CALL    PRBYT    ;PRINT SPACES
  175.     DCR    B
  176.     JNZ    PREF3    ;PRINT 6 SPACES
  177.     JMP    PREFS
  178. PREFX:    CALL    CRLF    ;PRINT CR,LF
  179.     RET
  180.  
  181. ;********************************;
  182. ;   CHARACTER PARSING ROUTINES
  183. ;********************************;
  184.  
  185. LALPH:    LXI    H,SBUF    ;POINT TO SYMBOL BUFFER
  186.     MVI    C,SYMSZ
  187.     MVI    A,' '
  188. LALX:    MOV    M,A
  189.     INX    H
  190.     DCR    C
  191.     JNZ    LALX    ;CLEAR SYMBOL BUFFER
  192.     LXI    H,SBUF
  193.     SHLD    SYMPT
  194.     MVI    A,00
  195.     STA    SYMCT    ;RESET SYMBOL POINTER+COUNT
  196.     LDA    CHAR    ;GET CHARACTER AGAIN
  197.     CALL    GETSYM    ;COLLECT IDENTIFIER
  198. LALC:    CALL    GETBYT    ;GET A BYTE FROM SOURCE FILE
  199.     CALL    SAVBYT    ;SAVE BYTE IN PRINT BUFFER
  200.     CALL    CHKNUM    ;TEST FOR NUMBER
  201.     JNC    LAL3    ;YES, CONTINUE
  202.     CALL    CHKALP    ;TEST FOR ALPHABETIC
  203.     JNC    LAL3    ;YES, CONTINUE
  204.     CALL    CKRES    ;TEST FOR RESERVED WORD
  205.     JC    LAL1    ;NO, CONTINUE
  206. LAL0:    LDA    CHAR    ;GET CHARACTER THAT ENDED ID
  207.     JMP    MAIN2    ;CONTINUE SCAN
  208. LAL1:    CALL    FIND    ;SEE IF DEFINED
  209.     JC    LAL2    ;NO, CONTINUE
  210.     CALL    ADDREF    ;YES, ADD REFERENCE
  211.     JMP    LAL0    ;DONE
  212. LAL2:    CALL    ENTSYM    ;ENTER SYMBOL DEFINITION
  213.     CALL    ADDREF    ;ADD REFERENCE
  214.     JMP    LAL0    ;CONTINUE
  215. LAL3:    CALL    GETSYM    ;COLLECT IDENTIFIER
  216.     JMP    LALC    ;CONTINUE
  217.  
  218. LNUM:    CALL    GETBYT    ;GET BYTE
  219.     CALL    SAVBYT    ;SAVE BYTE IN PRINTER BUFFER
  220.     CALL    CHKNUM    ;TEST FOR NUMERIC
  221.     JNC    LNUM    ;YES, CONTINUE
  222.     CALL    CHKALP    ;TEST FOR ALPHABETIC
  223.     JNC    LNUM    ;YES, CONTINUE
  224.     JMP    MAIN2    ;CONTINUE WITH MAIN SCAN
  225.  
  226. LQUOT:    CALL    GETBYT    ;GET A BYTE
  227.     CALL    SAVBYT    ;SAVE BYTE IN PRINTER BUFFER
  228.     CPI    ''''    ;SEE IF STRING QUOTE
  229.     JNZ    LQUOT    ;NO, KEEP LOOPING
  230.     CALL    GETBYT    ;GET NEXT BYTE
  231.     CALL    SAVBYT    ;SAVE BYTE
  232.     CPI    ''''    ;TEST FOR DOUBLES
  233.     JZ    LQUOT    ;YES, START SCAN AGAIN
  234.     JMP    MAIN2    ;NO, CONTINUE IN MAIN SCAN
  235.  
  236. LSEMI:    CALL    GETBYT    ;GET A BYTE
  237.     CALL    SAVBYT    ;SAVE BYTE
  238.     CPI    0DH    ;WAIT FOR CR
  239.     JNZ    LSEMI    ;CONTINUE
  240.     JMP    MAIN2    ;ENTER MAIN LOOP
  241.  
  242. LCR:    CALL    PRLINE    ;PRINT LINE
  243.     LHLD    LCNT    ;GET LINE NUMBER
  244.     INX    H    ;BUMP LINE NUMBER
  245.     SHLD    LCNT    ;STORE
  246.     CALL    SKIP    ;SKIP 1ST 16 CHAR. OF NEXT LINE
  247.     JMP    MAIN    ;CONTINUE
  248.  
  249. LIGN    EQU    MAIN    ;RE-ENTER MAIN LOOP
  250. LLF    EQU    MAIN
  251. LSPC    EQU    MAIN
  252. LTAB    EQU    MAIN
  253. LDOL    EQU    MAIN
  254. LDEL    EQU    MAIN
  255.  
  256. ;********************************;
  257. ;          SUBROUTINES
  258. ;********************************;
  259.  
  260. ;********************************;
  261. ;    SKIP FIRST SIXTEEN
  262. ;    CHARACTERS IN A LINE
  263. ;********************************;
  264.  
  265. SKIP:    MVI    B,16    ;SET COUNTER
  266. SKIP1:    PUSH    B    ;SAVE IT
  267. SKIP2:    CALL    GETBYT    ;GET BYTE
  268.     CALL    SAVBYT    ;SAVE IT IN PRINT BUFFER
  269.     CPI    EOF    ;EOF?
  270.     JZ    DONE    ;BRIF IS
  271.     CPI    0AH    ;LF?
  272.     JZ    SKIP2    ;BRIF IS, IE. DON'T COUNT
  273.     CPI    0DH    ;CR?
  274.     JZ    SKIP2    ;BRIF IS, IE. DON'T COUNT
  275.     POP    B    ;RETRIEVE COUNTER
  276.     DCR    B    ;DECREMENT
  277.     JNZ    SKIP1
  278.     RET
  279.  
  280. ;********************************;
  281. ;         INITIALIZATION
  282. ;********************************;
  283.  
  284. SETUP:    LXI    D,TFCB    ;POINT TO FCB
  285.     CALL    FOPEN    ;OPEN FCB
  286.     LXI    D,EMSG2    ;POINT TO ERROR MESSAGE
  287.     JC    FERR1    ;BRIF FILE NOT FOUND
  288.     LXI    H,PBUF
  289.     SHLD    LPNT    ;SET PRINT POINTER
  290.     LXI    H,00001
  291.     SHLD    LCNT
  292.     LXI    H,SYMT    ;GET ADDRESS OF SYMBOL TABLE
  293.     SHLD    SYM
  294.     SHLD    SYMBT
  295.     SHLD    SYMTP    ;SET SYMBOL TABLE POINTERS
  296.     LHLD    MEMSZ    ;GET AVAILABLE MEMORY ADDRESS
  297.     DCX    H
  298.     SHLD    REF
  299.     SHLD    REFBT
  300.     SHLD    REFTP    ;SET REFERENCE TABLE POINTERS
  301.     CALL    PAGE    ;ISSUE PAGE EJECT
  302.     RET
  303.  
  304. ;********************************;
  305. ;    CHECK FOR RESERVED WORD
  306. ;********************************;
  307.  
  308. CKRES:    LXI    H,RWTBL    ;POINT TO RESERVED WORD TABLE
  309.     SHLD    TEMP    ;SAVE IN TEMP WORD
  310. CKRES1:    LHLD    TEMP    ;GET TABLE POINTER
  311.     LXI    D,SBUF    ;POINT TO SYMBOL
  312.     MVI    B,RWSIZ    ;RESERVED WORD SIZE
  313. CKRES2:    LDAX    D    ;GET SYMBOL BYTE
  314.     CMP    M    ;COMPARE AGAINST TABLE ENTRY
  315.     RC        ;LESS, NOT IN TABLE
  316.     JNZ    CKRES3    ;GREATER, GET NEXT TABLE ENTRY
  317.     INX    D    ;BUMP POINTERS
  318.     INX    H
  319.     DCR    B    ;DECREMENT BYTE COUNT
  320.     JNZ    CKRES2    ;KEEP TESTING
  321.     JMP    CKRES4    ;FOUND
  322. CKRES3:    LHLD    TEMP    ;GET TABLE POINTER
  323.     LXI    D,RWSIZ    ;SIZE OF ENTRY
  324.     DAD    D    ;BUMP POINTER
  325.     SHLD    TEMP    ;STORE NEW POINTER
  326.     MOV    A,M    ;GET TABLE BYTE
  327.     CPI    0FFH    ;END OF TABLE?
  328.     JNZ    CKRES1    ;NO, LOOP
  329.     STC        ;SET CARRY (NOT IN TABLE)
  330.     RET
  331. CKRES4:    ORA    A    ;RESET CARRY
  332.     RET
  333.  
  334. ;********************************;
  335. ;     FIND SYMBOL IN TABLE
  336. ;********************************;
  337.  
  338. FIND:    LHLD    SYMBT    ;GET BEGIN OF SYM TABLE
  339.     SHLD    SYM    ;SET TEMP POINTER
  340. FIND1:    LHLD    SYM    ;GET TEMP POINTER
  341.     LXI    D,SBUF    ;POINT TO CURRENT SYMBOL
  342.     MVI    B,SYMSZ    ;SYMBOL SIZE
  343. FIND2:    LDAX    D    ;GET BYTE FROM SBUF
  344.     CMP    M    ;COMPARE TO SYM TABLE BYTE
  345.     RC        ;GREATER, NOT IN TABLE
  346.     JNZ    FIND3    ;LESS, GET NEXT TABLE ENTRY
  347.     INX    D    ;BUMP POINTER
  348.     INX    H    ;BUMP POINTER
  349.     DCR    B    ;DECREMENT BYTE COUNT
  350.     JNZ    FIND2    ;LOOP
  351.     RET        ;TRUE ZERO, FOUND
  352. FIND3:    LHLD    SYM    ;GET CURRENT POINTER
  353.     LXI    D,STESZ    ;SYMBOL TABLE ENTRY SIZE
  354.     DAD    D    ;BUMP POINTER
  355.     XCHG        ;INTO DE
  356.     LHLD    SYMTP    ;GET TOP OF SYMBOL TABLE
  357.     CALL    CPHL    ;TEST FOR END OF TABLE
  358.     JZ    FIND4    ;YES, DONE
  359.     JC    FERR    ;TABLE OVERFLOW, ERROR
  360.     XCHG        ;CURRENT POINTER INTO HL
  361.     SHLD    SYM    ;SET CURRENT POINTER
  362.     JMP    FIND1    ;LOOP
  363. FIND4:    STC        ;SET CARRY FOR NOT FOUND
  364.     LHLD    SYMTP    ;GET CURRENT TOP
  365.     SHLD    SYM    ;SET CURRENT POINTER
  366.     RET
  367. FERR:    LXI    D,EMSG1    ;POINTER TO ERROR MESSAGE
  368. FERR1:    MVI    C,PRBUF
  369.     CALL    BDOS    ;PRINT ERROR MESSAGE
  370.     JMP    BOOT    ;EXIT
  371.  
  372. ;********************************;
  373. ;   ADD REFERENCE TO REF TABLE
  374. ;********************************;
  375.  
  376. ADDREF:    LHLD    SYM    ;GET SYMBOL POINTER
  377.     LXI    D,SYMSZ    ;OFFSET PAST SYMBOL
  378.     DAD    D
  379.     MOV    E,M
  380.     INX    H
  381.     MOV    D,M    ;GET REFERENCE POINTER
  382.     LXI    H,0000
  383.     CALL    CPHL    ;TEST FOR ZERO REF PTR
  384.     JZ    BLDREF    ;YES, BUILD REFERENCE ENTRY
  385. LNK:    XCHG        ;REF PTR IN HL
  386.     MOV    E,M    ;GET REF LINK
  387.     INX    H
  388.     MOV    D,M    ;INTO DE
  389.     DCX    H    ;REPOSITION HL
  390.     PUSH    H    ;SAVE REF PTR
  391.     LXI    H,0000
  392.     CALL    CPHL    ;IF LINK IS ZERO
  393.     POP    H
  394.     JNZ    LNK    ;NON ZERO, GET NEXT LINK
  395.     SHLD    REF    ;SAVE REF POINTER
  396.     INX    H
  397.     INX    H    ;SKIP TO FIRST REF NUMBER
  398.     MVI    B,(REFSZ-2)/2 ;NUMBER OF REF NOS./ENTRY
  399. LINK3:    MOV    E,M    ;GET REF NUMBER
  400.     INX    H
  401.     MOV    D,M
  402.     DCX    H    ;REPOSITION
  403.     PUSH    H    ;SAVE REF NUM ADDR
  404.     LXI    H,0000
  405.     CALL    CPHL    ;SEE IF REF NUM IS ZERO
  406.     POP    H
  407.     JZ    ENTREF    ;YES, ENTER REFERENCE
  408.     INX    H
  409.     INX    H    ;SKIP TO NEXT REF NUM
  410.     DCR    B    ;DECREMENT COUNT
  411.     JNZ    LINK3    ;TRY AGAIN AT NEXT SLOT
  412.     CALL    ADBLK    ;ADD NEW REF BLOCK
  413.     LHLD    REF    ;GET REF POINTER
  414.     INX    H
  415.     INX    H    ;SKIP TO FIRST REF SLOT
  416. ENTREF:    PUSH    H    ;SAVE REF SLOT ADDR
  417.     LHLD    LCNT    ;GET LINE NUMBER
  418.     XCHG        ;INTO DE
  419.     POP    H    ;GET REF SLOT ADDR
  420.     MOV    M,E
  421.     INX    H
  422.     MOV    M,D    ;STORE LINE REF
  423.     RET        ;DONE
  424.  
  425. ;********************************;
  426. ;     BUILD REF TABLE BLOCK
  427. ;********************************;
  428.  
  429. BLDREF:    LHLD    SYM    ;GET SYMBOL POINTER
  430.     LXI    D,SYMSZ    ;OFFSET TO REF POINTER
  431.     DAD    D
  432.     SHLD    REF    ;SET TEMP REF POINTER TO HERE
  433.     CALL    ADBLK    ;ADD BLOCK
  434.     LHLD    REF    ;GET REAL REF POINTER
  435.     INX    H
  436.     INX    H    ;POSITION TO FIRST REF SLOT
  437.     JMP    ENTREF    ;ADD REFERENCE
  438. ADBLK:    LHLD    REFBT    ;GET REF BOTTOM
  439.     LXI    D,REFSZ    ;SUBTRACT REF SIZE
  440.     MOV    A,L
  441.     SUB    E
  442.     MOV    L,A
  443.     MOV    A,H
  444.     SBB    D
  445.     MOV    H,A
  446.     SHLD    TEMP    ;SAVE NEW REF BOTTOM
  447.     XCHG        ;INTO DE ALSO
  448.     LHLD    SYMTP    ;GET SYMBOL TOP
  449.     CALL    CPHL    ;CHECK FOR BUMP
  450.     JZ    FERR    ;YES, NO ROOM
  451.     JNC    FERR    ;NO ROOM
  452.     LHLD    TEMP    ;GET REF BOTTOM
  453.     XCHG        ;INTO DE
  454.     LHLD    REF    ;GET REF POINTER
  455.     MOV    M,E    ;SET LINK
  456.     INX    H
  457.     MOV    M,D    ;TO NEW REF BLOCK
  458.     LHLD    TEMP    ;GET NEW REF BLOCK ADDR
  459.     SHLD    REF    ;STORE IN REF
  460.     MVI    B,REFSZ    ;SIZE OF REF BLOCK
  461.     MVI    A,00
  462. ADB2:    MOV    M,A    ;ZERO THE REF BLOCK
  463.     INX    H
  464.     DCR    B
  465.     JNZ    ADB2
  466.     LHLD    TEMP    ;GET NEW REF BOTTOM
  467.     SHLD    REFBT    ;SET REFBT
  468.     RET
  469.  
  470. ;********************************;
  471. ;     ENTER SYMBOL IN SYM TABLE
  472. ;********************************;
  473.  
  474. ENTSYM:    LHLD    SYM    ;GET SYMBOL POINTER
  475.     XCHG        ;INTO DE
  476.     LHLD    SYMTP    ;GET SYMBOL TABLE TOP
  477.     CALL    CPHL    ;CHECK FOR END OF TABLE
  478.     JZ    NEWSYM    ;YES, ADD SYMBOL AT END
  479.     LXI    D,STESZ    ;SYMBOL TABLE ENTRY SIZE
  480.     DAD    D    ;CALCULATE NEW END OF TABLE
  481.     XCHG        ;INTO DE
  482.     LHLD    REFBT    ;REFERENCE TABLE BOTTOM
  483.     CALL    CPHL    ;TEST FOR TABLE OVERFLOW
  484.     JZ    FERR    ;FULL, ERROR
  485.     JC    FERR    ;YES, ERROR
  486.     LHLD    SYMTP    ;GET TABLE TOP
  487.     LXI    D,STESZ-1 ;BUMP TO END OF ENTRY
  488.     DAD    D
  489.     SHLD    TO    ;STORE IN TO ADDRESS
  490.     LXI    D,STESZ
  491.     MOV    A,L
  492.     SUB    E
  493.     MOV    L,A
  494.     MOV    A,H
  495.     SBB    D
  496.     MOV    H,A    ;SUBTRACT SIZE OF ONE ENTRY
  497.     SHLD    FROM    ;STORE AS FROM ADDRESS
  498.     LHLD    SYM    ;GET CURRENT POINTER
  499.     SHLD    LIMIT    ;STORE AS LIMIT ADDRESS
  500.     CALL    MOVUP    ;MOVE TABLE UP IN MEMORY
  501. NEWSYM:    LHLD    SYM    ;GET CURRENT POINTER
  502.     LXI    D,SBUF    ;POINT TO SYMBOL
  503.     MVI    B,SYMSZ    ;SIZE OF SYMBOL
  504.     CALL    MOVE    ;COPY SYMBOL TO TABLE
  505.     MVI    A,0
  506.     MOV    M,A
  507.     INX    H
  508.     MOV    M,A    ;SET POINTERS TO 0000
  509.     LHLD    SYMTP    ;GET SYMBOL TABLE TOP
  510.     LXI    D,STESZ    ;GET SYMBOL ENTRY SIZE
  511.     DAD    D    ;BUMP
  512.     SHLD    SYMTP    ;STORE NEW TOP
  513.     RET
  514.  
  515. ;********************************;
  516. ;    MOVE SYMBOL TABLE UP
  517. ;********************************;
  518.  
  519. MOVUP:    LHLD    TO    ;GET TO POINTER
  520.     MOV    B,H
  521.     MOV    C,L    ;INTO BC
  522.     LHLD    FROM    ;GET FROM POINTER
  523.     XCHG        ;INTO DE
  524.     LHLD    LIMIT    ;GET LIMIT ADDRESS
  525. MOVUP2:    LDAX    D    ;GET FROM BYTE
  526.     STAX    B    ;STORE AT TO ADDRESS
  527.     CALL    CPHL    ;COMPARE FROM TO LIMIT
  528.     RZ        ;EXIT IF DONE
  529.     DCX    B    ;DECREMENT TO
  530.     DCX    D    ;DECRMENT FROM
  531.     JMP    MOVUP2    ;LOOP
  532.  
  533. ;********************************;
  534. ;  GENERAL PURPOSE MOVE ROUTINE
  535. ;********************************;
  536.  
  537. MOVE:    LDAX    D    ;GET BYTE
  538.     MOV    M,A    ;STORE BYTE
  539.     INX    D
  540.     INX    H    ;BUMP POINTERS
  541.     DCR    B    ;DECREMENT COUNT
  542.     JNZ    MOVE    ;LOOP
  543.     RET
  544.  
  545. ;********************************;
  546. ;    BINARY TO DECIMAL CONVERSION
  547. ;********************************;
  548.  
  549. DECOT:    LXI    D,DEC
  550.     XCHG
  551.     LXI    B,10000
  552.     CALL    DIG
  553.     LXI    B,1000
  554.     CALL    DIG
  555.     LXI    B,100
  556.     CALL    DIG
  557.     LXI    B,10
  558.     CALL    DIG
  559.     LXI    B,1
  560.     CALL    DIG
  561.     RET
  562.  
  563. DIG:    MVI    M,'0'
  564. DI0:    MOV    A,E
  565.     SUB    C
  566.     MOV    E,A
  567.     MOV    A,D
  568.     SBB    B
  569.     MOV    D,A
  570.     JM    DI2
  571.     INR    M
  572.     JMP    DI0
  573. DI2:    MOV    A,E
  574.     ADD    C
  575.     MOV    E,A
  576.     MOV    A,D
  577.     ADC    B
  578.     MOV    D,A
  579.     INX    H
  580.     RET
  581.  
  582. ;********************************;
  583. ;    TEST FOR ALPHABETIC CHAR.
  584. ;********************************;
  585.  
  586. CHKALP:    CPI    'A'    ;ASCII 'A'
  587.     RC        ;NO, EXIT
  588.     CPI    'Z'+1
  589.     CMC
  590.     RET
  591.  
  592. ;********************************;
  593. ;       TEST FOR NUMERIC CHAR
  594. ;********************************;
  595.  
  596. CHKNUM:    CPI    '0'
  597.     RC
  598.     CPI    '9'+1
  599.     CMC
  600.     RET
  601.  
  602. ;********************************;
  603. ;  LOOK UP CHAR IN PARSE TABLE
  604. ;********************************;
  605.  
  606. LOOK:    LXI    D,0003    ;TABLE ENTRY SIZE
  607.     MOV    B,A    ;ARGUMENT BYTE IN B
  608. LOOK2:    MOV    A,M    ;GET TABLE BYTE
  609.     CPI    0FFH    ;END OF TABLE?
  610.     JZ    LOOKN    ;YES, NOT FOUND
  611.     CMP    B    ;COMPARE
  612.     JZ    LOOKY    ;FOUND
  613.     DAD    D    ;BUMP POINTER
  614.     JMP    LOOK2    ;LOOP
  615. LOOKN:    STC        ;CARRY = NOT FOUND
  616.     RET
  617.  
  618. LOOKY:    INX    H    ;SKIP TO TABLE BYTE
  619.     MOV    E,M
  620.     INX    H
  621.     MOV    D,M    ;TABLE ENTRY IN DE
  622.     XCHG        ;INTO HL
  623.     RET
  624.  
  625. ;********************************;
  626. ;    SAVE BYTE IN LINE BUFFER
  627. ;********************************;
  628.  
  629. SAVBYT:    STA    CHAR    ;SAVE CHAR IN CHAR
  630.     LHLD    LPNT    ;GET LINE POINTER
  631.     MOV    M,A    ;SAVE BYTE
  632.     INX    H    ;BUMP POINTER
  633.     SHLD    LPNT    ;SAVE POINTER
  634.     RET
  635.  
  636. ;********************************;
  637. ;  PRINT SOURCE LINE WITH NUMBER
  638. ;********************************;
  639.  
  640. PRLINE:    LHLD    LCNT    ;GET LINE NUMBER
  641.     CALL    DECOT    ;CONVERT TO DECIMAL
  642.     LXI    H,DEC    ;POINT TO DEC STRING
  643. PL2:    MOV    E,M    ;GET STRING BYTE
  644.     MOV    A,E
  645.     CPI    0DH    ;DONE?
  646.     JZ    PL3    ;YES
  647.     CALL    PRBYT    ;PRINT BYTE
  648.     INX    H    ;BUMP POINTER
  649.     JMP    PL2
  650. PL3:    MVI    E,':'
  651.     CALL    PRBYT    ;PRINT ':'
  652.     MVI    E,' '
  653.     CALL    PRBYT    ;PRINT ' '
  654.     CALL    PRBYT    ;PRINT SPACE
  655.     LXI    H,PBUF    ;POINT TO PRINT BUFFER
  656. PL4:    MVI    A,00
  657.     STA    COL    ;SET COLUMN COUNT
  658. PL41:    MOV    E,M    ;GET BYTE
  659.     MOV    A,E
  660.     CPI    0DH    ;DONE?
  661.     JZ    PL5
  662.     CPI    0AH    ;LF?
  663.     JZ    PL4A    ;YES, IGNORE
  664.     CPI    09H    ;TAB?
  665.     JNZ    PL42    ;NO, CONTINUE
  666.     PUSH    H    ;SAVE HL
  667. PL43:    MVI    E,' '
  668.     CALL    PRBYT    ;PRINT SPACE
  669.     LXI    H,COL
  670.     INR    M
  671.     MOV    A,M
  672.     ANI    07H    ;MODULO 8
  673.     JNZ    PL43
  674.     POP    H
  675.     JMP    PL4A
  676. PL42:    LDA    COL
  677.     INR    A
  678.     STA    COL
  679.     CALL    PRBYT    ;PRINT BYTE
  680. PL4A:    INX    H
  681.     JMP    PL41
  682. PL5:    CALL    CRLF    ;PRINT CR,LF
  683.     LXI    H,PBUF
  684.     SHLD    LPNT    ;RESET LINE POINTER
  685.     RET
  686.  
  687. ;********************************;
  688. ;      COLLECT SYMBOL IN SYM BUF
  689. ;********************************;
  690.  
  691. GETSYM:    MOV    B,A    ;SAVE CHAR
  692.     LDA    SYMCT    ;GET SYMBOL COUNT
  693.     CPI    SYMSZ    ;MAX?
  694.     RNC        ;YES, DONE 
  695.     INR    A
  696.     STA    SYMCT
  697.     LHLD    SYMPT
  698.     MOV    M,B
  699.     INX    H    ;BUMP SYMBOL POINTER
  700.     SHLD    SYMPT
  701.     RET
  702.  
  703. ;********************************;
  704. ;       PRINTER INTERFACES
  705. ;********************************;
  706.  
  707. ;********************************;
  708. ;       PRINT A SINGLE BYTE
  709. ;********************************;
  710.  
  711. PRBYT:    PUSH    B
  712.     MOV    C,E    ;SHIFT CHARACTER
  713.     CALL    LIST    ;PRINT IT
  714.     POP    B
  715.     RET
  716.  
  717. ;*********************************;
  718. ;      ISSUE PAGE EJECT
  719. ;*********************************;
  720.  
  721. PAGE:    MVI    C,0CH
  722.     CALL    LIST
  723.     XRA    A
  724.     STA    LINES    ;SET LINE COUNT
  725.     RET
  726.  
  727. ;********************************;
  728. ;      ISSUE CR, LF & TEST PAGE
  729. ;      ALSO TEST CONSOLE STATUS
  730. ;********************************;
  731.  
  732. CRLF:    MVI    C,0DH
  733.     CALL    LIST
  734.     MVI    C,0AH
  735.     CALL    LIST
  736.     CALL    CONST    ;GET CONSOLE STATUS
  737.     ORA    A    ;TEST IT
  738.     JZ    CRLF1    ;BRIF NO ENTRY
  739.     CALL    CONIN    ;ELSE GET CHARACTER
  740.     CPI    19    ;CONTROL-S?
  741.     JNZ    BOOT    ;BRIF NOT
  742.     CALL    CONIN    ;ELSE WAIT TO RESUME
  743. CRLF1:    LDA    LINES
  744.     INR    A
  745.     STA    LINES    ;INCREMENT LINE COUNT
  746.     CPI    60    ;TEST LINE COUNT
  747.     CZ    PAGE    ;IF 56 THEN NEW PAGE
  748.     RET
  749.  
  750.  
  751. ;********************************;
  752. ;       CHARACTER PARSING TABLE
  753. ;********************************;
  754.  
  755. CPTBL:    DB    0DH
  756.     DW    LCR
  757.     DB    0AH
  758.     DW    LLF
  759.     DB    ''''
  760.     DW    LQUOT
  761.     DB    ';'
  762.     DW    LSEMI
  763.     DB    ' '
  764.     DW    LSPC
  765.     DB    09H
  766.     DW    LTAB
  767.     DB    '$'
  768.     DW    LDOL
  769.     DB    '('
  770.     DW    LDEL
  771.     DB    ')'
  772.     DW    LDEL
  773.     DB    '+'
  774.     DW    LDEL
  775.     DB    '-'
  776.     DW    LDEL
  777.     DB    '*'
  778.     DW    LDEL
  779.     DB    '/'
  780.     DW    LDEL
  781.     DB    ','
  782.     DW    LDEL
  783.     DB    ':'
  784.     DW    LDEL
  785.     DB    EOF
  786.     DW    DONE
  787.     DB    0FFH
  788.     DW    0000H
  789. EOF    EQU    1AH    ;EOF CODE
  790.  
  791. ;********************************;
  792. ;     RESERVED WORD TABLE
  793. ;********************************;
  794.  
  795. RWTBL:    DB    'A     '
  796.     DB    'ACI   '
  797.     DB    'ADC   '
  798.     DB    'ADD   '
  799.     DB    'ADI   '
  800.     DB    'ANA   '
  801.     DB    'AND   '
  802.     DB    'ANI   '
  803.     DB    'B     '
  804.     DB    'C     '
  805.     DB    'CALL  '
  806.     DB    'CC    '
  807.     DB    'CM    '
  808.     DB    'CMA   '
  809.     DB    'CMC   '
  810.     DB    'CMP   '
  811.     DB    'CNC   '
  812.     DB    'CNZ   '
  813.     DB    'CP    '
  814.     DB    'CPE   '
  815.     DB    'CPI   '
  816.     DB    'CPO   '
  817.     DB    'CZ    '
  818.     DB    'D     '
  819.     DB    'DAA   '
  820.     DB    'DAD   '
  821.     DB    'DB    '
  822.     DB    'DCR   '
  823.     DB    'DCX   '
  824.     DB    'DI    '
  825.     DB    'DS    '
  826.     DB    'DW    '
  827.     DB    'E     '
  828.     DB    'EI    '
  829.     DB    'END   '
  830.     DB    'ENDIF '
  831.     DB    'ENDM  '
  832.     DB    'EQU   '
  833.     DB    'H     '
  834.     DB    'HLT   '
  835.     DB    'IF    '
  836.     DB    'IN    '
  837.     DB    'INR   '
  838.     DB    'INX   '
  839.     DB    'JC    '
  840.     DB    'JM    '
  841.     DB    'JMP   '
  842.     DB    'JNC   '
  843.     DB    'JNZ   '
  844.     DB    'JP    '
  845.     DB    'JPE   '
  846.     DB    'JPO   '
  847.     DB    'JZ    '
  848.     DB    'L     '
  849.     DB    'LDA   '
  850.     DB    'LDAX  '
  851.     DB    'LHLD  '
  852.     DB    'LXI   '
  853.     DB    'M     '
  854.     DB    'MACRO '
  855.     DB    'MOD   '
  856.     DB    'MOV   '
  857.     DB    'MVI   '
  858.     DB    'NOP   '
  859.     DB    'NOT   '
  860.     DB    'OR    '
  861.     DB    'ORA   '
  862.     DB    'ORG   '
  863.     DB    'ORI   '
  864.     DB    'OUT   '
  865.     DB    'PCHL  '
  866.     DB    'POP   '
  867.     DB    'PSW   '
  868.     DB    'PUSH  '
  869.     DB    'RAL   '
  870.     DB    'RAR   '
  871.     DB    'RC    '
  872.     DB    'RET   '
  873.     DB    'RLC   '
  874.     DB    'RM    '
  875.     DB    'RNC   '
  876.     DB    'RNZ   '
  877.     DB    'RP    '
  878.     DB    'RPE   '
  879.     DB    'RPO   '
  880.     DB    'RRC   '
  881.     DB    'RST   '
  882.     DB    'RZ    '
  883.     DB    'SBB   '
  884.     DB    'SBI   '
  885.     DB    'SET   '
  886.     DB    'SHL   '
  887.     DB    'SHLD  '
  888.     DB    'SHR   '
  889.     DB    'SP    '
  890.     DB    'SPHL  '
  891.     DB    'STA   '
  892.     DB    'STAX  '
  893.     DB    'STC   '
  894.     DB    'SUB   '
  895.     DB    'SUI   '
  896.     DB    'TITLE '
  897.     DB    'XCHG  '
  898.     DB    'XOR   '
  899.     DB    'XRA   '
  900.     DB    'XRI   '
  901.     DB    'XTHL  '
  902.     DB    0FFH    ;END OF RESERVED WORD TABLE
  903. RWSIZ    EQU    6    ;SIZE OF TABLE ENTRY
  904.  
  905.  
  906. ;********************************;
  907. ;       OPERATING SYSTEM EQUATES
  908. ;********************************;
  909.  
  910. BOOT    EQU    0    ;REBOOT CP/M ENTRY POINT
  911. BDOS    EQU    0005H    ;BDOS ENTRY POINT
  912.  
  913. MEMSZ    EQU    0006H    ;END OF MEMORY POINTER
  914. TBSZE    EQU    20H    ;TRANS. BUFFER SIZE IN SECTORS
  915. TFCB    EQU    005CH    ;TRANS. FCB
  916.  
  917. PRBUF    EQU    9    ;PRINT BUFFER
  918. OPEN    EQU    15    ;OPEN FUNCTION CODE
  919. STDMA    EQU    26    ;SET DMA FUNCTION CODE
  920. READ    EQU    20    ;READ FUNCTION CODE
  921.  
  922.  
  923.  
  924. ;********************************;
  925. ;           F O P E N            ;
  926. ;  ROUTINE TO OPEN A DISK FILE   ;
  927. ;  INPUT:     DE=A(FCB)          ;
  928. ; OUTPUT:     CARRY=ERROR        ;
  929. ;********************************;
  930.  
  931. FOPEN:    MVI    C,OPEN    ;OPEN CODE
  932.     CALL    BDOS    ;ISSUE OPEN
  933.     CPI    0FFH    ;ERROR?
  934.     JZ    FOERR    ;YES
  935.     XRA    A    ;CLEAR CARRY
  936.     RET
  937. FOERR:    STC
  938.     RET
  939.  
  940.  
  941.  
  942. ;********************************;
  943. ;          G E T B Y T           ;
  944. ;   ROUTINE TO READ A BYTE       ;
  945. ;  OUTPUTS:     A=BYTE           ;
  946. ;              CARRY=ERROR       ;
  947. ;********************************;
  948.  
  949. GETBYT:    LHLD    TBDMA    ;GET END OF BUFFER
  950.     XCHG        ;TO DE
  951.     LHLD    INPTR    ;CURRENT POINTER IN HL
  952.     CALL    CPHL    ;TEST FOR END OF BUFFER
  953.     JZ    GETB2    ;YES, READ
  954. GETB1:    MOV    A,M    ;GET BYTE
  955.     INX    H    ;BUMP POINTER
  956.     SHLD    INPTR    ;SAVE POINTER
  957.     ORA    A    ;RESET CARRY
  958.     RET
  959. GETB2:    LDA    TBFLG    ;GET FLAG
  960.     ORA    A    ;TEST IT
  961.     JNZ    IERR    ;BRIF NO MORE
  962.     LXI    H,TBUF-128 ;ELSE SET START OF BUFFER
  963.     MVI    A,TBSZE    ;AND BUFFER SIZE IN SECTORS
  964. GETB3:    STA    TBCNT    ;SAVE IT
  965.     LXI    D,128    ;CALCULATE NEW STARTING
  966.     DAD    D    ;ADDRESS
  967.     SHLD    TBDMA    ;SAVE IT
  968.     XCHG        ;PLACE IT IN DE
  969.     MVI    C,STDMA    ;SET DMA ADDRESS
  970.     CALL    BDOS
  971.     MVI    C,READ    ;READ CODE
  972.     LXI    D,TFCB    ;FCB ADDRESS
  973.     CALL    BDOS    ;ISSUE READ
  974.     ORA    A    ;CHECK FOR ERROR/E-O-F
  975.     JNZ    GETB4    ;BRIF IS
  976.     LHLD    TBDMA    ;ELSE GET LAST DMA STARTING ADDR
  977.     LDA    TBCNT    ;GET SECTOR COUNT
  978.     DCR    A    ;SUBTRACT ONE
  979.     JNZ    GETB3    ;BRIF SOME MORE
  980.     LXI    D,128    ;ELSE SET NEW END OF BUFFER
  981.     DAD    D
  982.     SHLD    TBDMA
  983.     JMP    GETB5
  984. GETB4:    MVI    A,0FFH    ;SET FLAG
  985.     STA    TBFLG
  986. GETB5:    LXI    H,TBUF    ;RESET BUFFER POINTER
  987.     JMP    GETB1    ;CONTINUE
  988.  
  989. IERR:    STC
  990.     RET
  991.  
  992. ;********************************;
  993. ;   MISCELLANEOUS SUBROUTINES    ;
  994. ;********************************;
  995.  
  996. ;********************************;
  997. ;    BIOS VECTORS        ;
  998. ;*******************************;
  999.  
  1000. CONST:    JMP    $-$    ;CONSOLE STATUS
  1001. CONIN:    JMP    $-$    ;CONSOLE INPUT
  1002. LIST:    JMP    $-$    ;LIST OUTPUT
  1003.  
  1004. ;********************************;
  1005. ;             C P H L            ;
  1006. ;  ROUTINE TO COMPARE HL VS DE   ;
  1007. ;********************************;
  1008.  
  1009. CPHL:    MOV    A,H
  1010.     CMP    D
  1011.     RNZ
  1012.     MOV    A,L
  1013.     CMP    E
  1014.     RET
  1015.  
  1016. ;********************************;
  1017. ;             D A T A            ;
  1018. ;********************************;
  1019.  
  1020. XRFHD:    DB    'CROSS REFERENCE:'
  1021. EMSG1:    DB    'SYMBOL TABLE ERROR',0DH,0AH,'$'
  1022. EMSG2:    DB    'NO SUCH FILE',0DH,0AH,'$'
  1023. SYMSZ    EQU    7    ;SYMBOL SIZE
  1024. STESZ    EQU    SYMSZ+2    ;SYMBOL TABLE ENTRY SIZE
  1025. REFSZ    EQU    2+(12*2) ;NUMBER OF BYTES IN REF BLOCK
  1026. DEC:    DS    5
  1027.     DB    0DH
  1028. LINES:    DB    0    ;PRINT LINE COUNT
  1029. INPTR:    DW    TBUF+(TBSZE*128) ;INPUT BUFFER
  1030. TBDMA:    DW    TBUF+(TBSZE*128) ;DMA/E-O-B ADDRESS
  1031. TBFLG:    DB    0    ;TRANS. BUFFER FLAG
  1032.             ;00 = SOME MORE
  1033.             ;FF = NO MORE
  1034. SYMBT:    DS    2    ;SYMBOL TABLE BOTTOM ADDRESS
  1035. SYMTP:    DS    2    ;SYMBOL TABLE TOP ADDRESS
  1036. REFBT:    DS    2    ;REFERENCE TABLE BOTTOM ADDRESS
  1037. REFTP:    DS    2    ;REFERENCE TABLE TOP ADDRESS
  1038. SYM:    DS    2    ;CURRENT SYMBOL TABLE ADDRESS
  1039. REF:    DS    2    ;CURRENT REFERENCE TABLE ADDRESS
  1040. FROM:    DS    2    ;MOVE POINTER
  1041. TO:    DS    2    ;TO POINTER
  1042. LIMIT:    DS    2    ;LIMIT POINTER
  1043. COL:    DS    1
  1044. CHAR:    DS    1
  1045. LCNT:    DS    2    ;LINE COUNTER
  1046. LPNT:    DS    2
  1047. PBUF:    DS    132
  1048. SYMCT:    DS    1
  1049. SYMPT:    DS    2
  1050. SBUF:    DS    SYMSZ
  1051. TEMP:    DS    2    ;TEMP SAVE WORD
  1052. TBCNT:    DS    1    ;TRANS. BUFFER SECTOR COUNT
  1053. TBUF:    DS    TBSZE*128 ;TRANS. BUFFER
  1054.     DS    64
  1055. STACK    EQU    $    ;TOP OF STACK
  1056.  
  1057. ;***********************************;
  1058. ;         SYMBOL TABLE AREA
  1059. ;    THE SYMBOL TABLE MUST BE
  1060. ;    THE LAST BYTE OF THE PROGRAM
  1061. ;***********************************;
  1062.  
  1063. SYMT:    ORG    $
  1064.     END
  1065.