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 / CPMUG036.ARK / XREF.ASM < prev   
Assembly Source File  |  1984-04-29  |  22KB  |  1,041 lines

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