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 / CPMUG008.ARK / XREF.ASM < prev    next >
Assembly Source File  |  1984-04-29  |  20KB  |  1,002 lines

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