home *** CD-ROM | disk | FTP | other *** search
/ CP/M / CPM_CDROM.iso / simtel / sigm / vols000 / vol091 / dasm.mac < prev    next >
Text File  |  1984-04-29  |  72KB  |  3,511 lines

  1. ;
  2. ;  Program:  DASM
  3. ;  Version:  1.5
  4. ;  Author:  Richard Conn
  5. ;  Date:  16 Aug 82
  6. ;  Previous Versions:  1.3 (23 May 82), 1.4 (12 June 82)
  7. ;  Previous Versions:  1.0 (1 May 82), 1.1 (8 May 82), 1.2 (15 May 82)
  8. ;  Derivation:  ZZSOURCE and RESOURCE
  9. ;
  10. ;    DASM is a TDL/ZILOG Disassembler derived from Dave Barker's
  11. ; ZZSOURCE and Ward Christensen's RESOURCE by Richard Conn.  Refer to
  12. ; the documentation on RESOURCE and the built-in HELP data for information
  13. ; on the commands used for DASM.  A Help file is also being planned for DASM.
  14. ;
  15. VERS    equ    15    ; Version Number
  16.  
  17.     .Z80        ; USE ZILOG MNEMONICS
  18.     ASEG        ; USE ABSOLUTE SEGMENTS
  19.  
  20. ;  Values for TRUE and FALSE
  21. FALSE    equ    0
  22. TRUE    equ    NOT FALSE
  23.  
  24. ;  Set one and ONLY one of the following to TRUE
  25. ZILOG    equ    TRUE 
  26. TDL    equ    FALSE
  27.  
  28. ;  Initial Values for DASM
  29. RDCOMQ        EQU    FALSE        ;TRUE OF QUERY USER TO READ COM FILE
  30.                     ;  WHEN 'ALL' IS FILE TYPE
  31. CTLTBL        EQU    ENDALL        ;BEGINNING OF CONTROL TABLE
  32. SYMTAB        EQU    CTLTBL+600H    ;BEGINNING OF SYMBOL TABLE
  33. INITOFF        EQU    SYMTAB+2000H    ;INITIAL OFFSET VALUE
  34. COMTBL        EQU    INITOFF+4000H    ;BEGINNING OF COMMENTS
  35. SYMMAX        EQU    12        ;MAX NUMBER OF CHARS/SYMBOL (<= 12)
  36. INITLCNT    EQU    20        ;NUMBER OF LINES TO DISPLAY VIA L, A, B
  37. INITDLEN    EQU    80H        ;NUMBER OF BYTES TO DISPLAY VIA D
  38. INITPC        EQU    100H        ;INITIAL VALUE OF PC
  39. INITELST    EQU    0FFFFH        ;INITIAL END OF LIST VALUE
  40. IBUFLEN        EQU    80        ;LENGTH OF INPUT LINE BUFFER
  41.  
  42. ;  CP/M Constants
  43. WBOOT    EQU    00H
  44. BDOS    EQU    05H
  45. FCB    EQU    5CH
  46. FCBNR    EQU    7CH
  47. FCBTYPE    EQU    65H
  48. RECLEN    EQU    80H
  49.  
  50. ;
  51. ;  Beginning of Program
  52. ;
  53.     ORG    0100H
  54.  
  55.     JP    START
  56.     JP    GETCMD        ;This is an easy entry point for a restart.
  57.  
  58. ;
  59. ;  The following INCLUDE is used to include the appropriate file defining
  60. ;  the Mnemonics for the desired language.  Choices at this time are:
  61. ;    DASMZLG.MAC -- ZILOG-Standard Mnemonics
  62. ;    DASMTDL.MAC -- TDL Mnemonics
  63. ;
  64.     IF    ZILOG
  65.     INCLUDE    DASMZLG.MAC    ;Include ZILOG Mnemonic File
  66.     ENDIF
  67.  
  68.     IF    TDL
  69.     INCLUDE    DASMTDL.MAC    ;Include TDL Mnemonic File
  70.     ENDIF
  71.  
  72. ;
  73. ;  PRINT HEADERS
  74. ;
  75. START:
  76.     LD    SP,OLDST    ;SET STACK
  77.     CALL    PSTRNG
  78.     DEFB    0DH,0AH,'DASM, Version '
  79.     DEFB    VERS/10+'0','.',(VERS MOD 10)+'0',0DH,0AH,0
  80. ;
  81. ;  PERFORM REENTRANT INITIALIZATION
  82. ;
  83.     CALL    INIT0        ;INITIALIZE BUFFERS SO DASM IS REENTRANT
  84.     CALL    INIT        ;CLEANUP INITIALIZATION
  85. ;
  86. ;  READ IN ALL FILES IF A FILE WAS SPECIFIED
  87. ;
  88.     LD    A,(FCB+1)    ;GET FIRST LETTER OF FILE NAME
  89.     CP    ' '+1        ;VALID CHAR?
  90.     JR    C,SIGNON    ;SKIP READ IF NOT VALID CHAR
  91.     CALL    PSTRNG
  92.     DEFB    0DH,0AH,'Reading in All Files for ',0
  93.     LD    HL,FCB+1    ;PT TO FILE NAME
  94.     LD    B,8        ;8 CHARS
  95. ARDNAME:
  96.     LD    A,(HL)        ;GET CHAR
  97.     CALL    COUT        ;PRINT IT
  98.     INC    HL        ;PT TO NEXT
  99.     DJNZ    ARDNAME
  100.     CALL    ALLRD        ;READ IN ALL FILES
  101.     CALL    PSTRNG
  102.     DEFB    0DH,0AH,'-- Read Complete --',0DH,0AH,0
  103. ;
  104. ;  PRINT REST OF SIGNON MESSAGE
  105. ;
  106. SIGNON:
  107.     LD    DE,HEADER    ;PRINT HEADER FROM INCLUDE FILE
  108.     LD    C,9
  109.     CALL    BDOS
  110.     CALL    PSTRNG        ;PRINT INITIAL INFO
  111.     DEFB    0DH,0AH,'Type H for Help, ? for Stats',0DH,0AH,0
  112.     JR    GETCMD        ;PERFORM COMMAND PROCESSING
  113. ;
  114. ;  CLEAN UP DASM AND COMPLETELY REINITIALIZE
  115. ;
  116. CLEAN:
  117.     CALL    INIT        ;DO INITIALIZATION
  118. ;
  119. ;  MAIN COMMAND PROCESSING LOOP
  120. ;
  121. GETCMD:
  122.     XOR    A        ;A=0
  123.     LD    (WRTENAB),A    ;DISABLE OUTPUT TO FILE
  124.     LD    (HUSH),A    ;SET NOT QUIET
  125.     LD    (XCPTR),A
  126.     LD    (XCPTR+1),A
  127.     LD    SP,OLDST    ;RESET STACK
  128. ;
  129. ;  INPUT COMMAND LINE AND CAPITALIZE
  130. ;
  131.     CALL    PROMPT        ;INPUT COMMAND LINE VIA BDOS
  132. ;
  133. ;  PROCESS COMMAND LINE
  134. ;
  135. PRCEDE:
  136.     LD    A,(INBUF+2)    ;PT TO FIRST CHAR OF COMMAND LINE
  137.     LD    B,A        ;GET IT
  138.     LD    DE,CMDTABL    ;PT TO COMMAND TABLE
  139. PRCLOOP:
  140.     LD    A,(DE)        ;GET COMMAND FROM COMMAND TABLE
  141.     OR    A        ;END OF TABLE IF 0
  142.     JR    Z,WHAT        ;TELL USER THAT COMMAND WAS INVALID
  143.     INC    DE        ;PREP FOR NO MATCH
  144.     INC    DE        ;...PT TO NEXT COMMAND
  145.     INC    DE
  146.     CP    B        ;MATCH?
  147.     JR    NZ,PRCLOOP    ;CONTINUE LOOPING IF NOT
  148.     DEC    DE        ;PT TO ADDRESS
  149.     LD    A,(DE)        ;GET ADR HIGH
  150.     LD    B,A        ;... IN B
  151.     DEC    DE        ;PT TO LOW
  152.     LD    A,(DE)        ;GET ADR LOW
  153.     LD    C,A        ;... IN C
  154.     PUSH    BC        ;ADDRESS ON STACK
  155.     RET            ;"JUMP TO" COMMAND
  156. ;
  157. ;  GENERAL ERROR
  158. ;
  159. WHAT:
  160.     XOR    A
  161.     LD    (WRTENAB),A
  162.     LD    (HUSH),A
  163.     CALL    PSTRNG
  164.     DEFB    0DH,0AH,'** Command Error **',0DH,0AH,0
  165.     JR    GETCMD
  166. ;
  167. ;  COMMAND TABLE -- CONTAINS COMMAND LETTER FOLLOWED BY ADDRESS OF ROUTINE
  168. ;    AND ENDS IN 0 AS THE NEXT COMMAND LETTER
  169. ;
  170. CMDTABL:
  171.     DEFB    0DH    ;EMPTY LINE
  172.     DEFW    GETCMD
  173.     DEFB    ';'    ;COMMENTS
  174.     DEFW    CMNT
  175.     DEFB    'A'    ;BUILD ASCII
  176.     DEFW    ASCASM
  177.     DEFB    'B'    ;BUILD LABELS
  178.     DEFW    BLDASM
  179.     DEFB    'C'    ;CONTROL TABLE
  180.     DEFW    CTL
  181.     DEFB    'D'    ;MEMORY DUMP
  182.     DEFW    DUMP
  183.     DEFB    'E'    ;ENTER SYMBOL
  184.     DEFW    ENTER
  185.     DEFB    'F'    ;FIND LABEL
  186.     DEFW    FIND
  187.     DEFB    'H'    ;HELP
  188.     DEFW    HELP
  189.     DEFB    'I'    ;INCREMENT SYMBOL VALUES
  190.     DEFW    INCMNT
  191.     DEFB    'K'    ;KILL SYMBOL
  192.     DEFW    KILL
  193.     DEFB    'L'    ;LIST CODE
  194.     DEFW    LIST
  195.     DEFB    'O'    ;SET OFFSET
  196.     DEFW    SETOS
  197.     DEFB    'P'    ;GENERATE PROLOG
  198.     DEFW    PROLOG
  199.     DEFB    'Q'    ;QUIET MODE
  200.     DEFW    QUIET
  201.     DEFB    'R'    ;READ FILES
  202.     DEFW    READ
  203.     DEFB    'S'    ;SAVE FILES
  204.     DEFW    SAVE
  205.     DEFB    'U'    ;SET COMMENTS
  206.     DEFW    UAREA
  207.     DEFB    'X'    ;PURGE SYMBOLS AND CONTROL
  208.     DEFW    PURGE
  209.     DEFB    'Z'    ;CLOSE ASM FILE
  210.     DEFW    CLOSE
  211.     DEFB    '?'    ;STATISTICS DISPLAY
  212.     DEFW    STAT
  213.     DEFB    0    ;END OF COMMAND TABLE
  214. ;
  215. ;COMMAND:  H
  216. ;  PRINT HELP INFORMATION
  217. ;
  218. HELP:
  219.     CALL    PSTRNG    ;JUST ONE BIG PRINT
  220. ;LINE  1
  221.     DEFB    0DH,0AH,'             HELP on DASM -- Command Summary'
  222. ;LINE  2
  223.     DEFB    0DH,0AH,';addr,comment    Enter Comment at addr    '
  224.     DEFB    ';addr        List comment at addr'
  225. ;LINE  3
  226.     DEFB    0DH,0AH,';        List Comments Table    '
  227.     DEFB    ';addr,        Delete Comment'
  228. ;LINE  4
  229.     DEFB    0DH,0AH,'A (see L)    Attempt to find DB''s    '
  230.     DEFB    'B (see L)    Build Symbol Table'
  231. ;LINE  5
  232.     DEFB    0DH,0AH,'C        Dump Control Table    '
  233.     DEFB    'Cnnnn        Dump Ctrl Table at nnnn'
  234. ;LINE  6
  235.     DEFB    0DH,0AH,'Cnnnn,x        Set Ctrl (x=BEHISW)    '
  236.     DEFB    'Dnnnn        Dump from nnnn on'
  237. ;LINE  7
  238.     DEFB    0DH,0AH,'Daaaa,bbbb    Dump over range        '
  239.     DEFB    'D,bbbb        Dump thru bbbb'
  240. ;LINE  8
  241.     DEFB    0DH,0AH,'D        Dump 80H more        '
  242.     DEFB    'D=nn        Set Dump Size Default'
  243. ;LINE  9
  244.     DEFB    0DH,0AH,'DS        Dump the Symbol Table    '
  245.     DEFB    'DS.symbol    Dump starting at symbol'
  246. ;LINE 10
  247.     DEFB    0DH,0AH,'Ennnn,.symbol    Enter symbol into table    '
  248.     DEFB    'Fnnnn,ssss    Find nnnn after ssss'
  249. ;LINE 11
  250.     DEFB    0DH,0AH,'F or Fnnnn    Cont Find or Find nnnn    '
  251.     DEFB    'Issss,oooo    Inc addrs>=ssss by oooo'
  252. ;LINE 12
  253.     DEFB    0DH,0AH,'K.symbol    Kill symbol from table    '
  254.     DEFB    'L        List next '
  255.     DEFB    (INITLCNT/10)+'0',(INITLCNT MOD 10)+'0'
  256.     DEFB    ' lines'
  257. ;LINE 13
  258.     DEFB    0DH,0AH,'Lssss,eeee    List over range        '
  259.     DEFB    'L,eeee        List to eeee'
  260. ;LINE 14
  261.     DEFB    0DH,0AH,'Lssss        List '
  262.     DEFB    (INITLCNT/10)+'0',(INITLCNT MOD 10)+'0'
  263.     DEFB    ' lines from ssss    '
  264.     DEFB    'L=nn[,others]    Set list default'
  265. ;LINE 15
  266.     DEFB    0DH,0AH,'O        Print current offset    '
  267.     DEFB    'Onnnn        Set new offset'
  268. ;LINE 16
  269.     DEFB    0DH,0AH,'Pssss,eeee    Generate program prolog    '
  270.     DEFB    'Q        Quiet prefix'
  271. ;LINE 17
  272.     DEFB    0DH,0AH,'Rfilename.COM    Read file @ offset+100H    '
  273.     DEFB    'Rfilename.CTL    Read Control Table'
  274. ;LINE 18
  275.     DEFB    0DH,0AH,'Rfilename.SYM    Read Symbol Table    '
  276.     DEFB    'Rfilename.DOC    Read Comments Table'
  277. ;LINE 19
  278.     DEFB    0DH,0AH,'Rfilename.ALL    Read CTL, SYM, DOC, COM    '
  279.     DEFB    'Sfilename.ASM    Save ASM File'
  280. ;LINE 20
  281.     DEFB    0DH,0AH,'Sfilename.CTL    Save CTL File        '
  282.     DEFB    'Sfilename.SYM    Save SYM File'
  283. ;LINE 21
  284.     DEFB    0DH,0AH,'Sfilename.DOC    Save DOC File        '
  285.     DEFB    'Sfilename.ALL    CTL, SYM, DOC, ASM'
  286. ;LINE 22
  287.     DEFB    0DH,0AH,'Unnnn        Set Comment Table addr    '
  288.     DEFB    'X        Restart DASM'
  289. ;LINE 23
  290.     DEFB    0DH,0AH,'Z        Write EOF to ASM File    '
  291.     DEFB    '?        Print Statistics'
  292. ;LINE 24
  293.     DEFB    0DH,0AH,0
  294.     JP    GETCMD
  295. ;
  296. ;COMMAND:  X
  297. ;  PURGE ALL SYMBOLS AND CONTROL
  298. ;
  299. PURGE:
  300.     CALL    PSTRNG    ;PROMPT USER
  301.     DEFB    'Restart DASM (Y/N)? ',0
  302.     CALL    CHIN    ;GET SINGLE CHAR AND CAP
  303.     CP    'Y'
  304.     JP    NZ,GETCMD
  305.     CALL    PSTRNG    ;PRINT FUNCTION
  306.     DEFB    'Restarting DASM',0DH,0AH,0
  307.     JP    CLEAN    ;RESTART DASM AT INIT
  308. ;
  309. ;  INPUT A SINGLE CHAR IN A VIA THE BDOS AND CAPITALIZE IT; FOLLOW WITH <CRLF>
  310. ;
  311. CHIN:
  312.     LD    C,1    ;GET CHAR FROM CON:
  313.     CALL    BDOS
  314.     AND    5FH    ;CAPITALIZE
  315.     PUSH    AF
  316.     CALL    CRLF
  317.     POP    AF
  318.     RET
  319. ;
  320. ;COMMAND:  P
  321. ;  ENTER PROLOG INTO ASSEMBLY LANGUAGE PROGRAM
  322. ;
  323. PROLOG:
  324.     LD    HL,INBUF+3    ;PT TO STARTING ADDRESS
  325.     LD    A,(HL)        ;NO ADDRESS SPECIFIED?
  326.     CP    0DH        ;ERROR IF SO
  327.     JP    Z,WHAT
  328.     CALL    CNVRT        ;CONVERT ADDRESS VALUE TO BINARY IN DE
  329.     CP    ' '        ;CHAR AFTER ADDRESS = <SP>?
  330.     JR    Z,PRLG0        ;CONT IF SO
  331.     CP    ','        ;CHAR AFTER ADDRESS = ','?
  332.     JP    NZ,WHAT        ;ERROR IF NOT ',' OR <SP>
  333. PRLG0:
  334.     INC    HL        ;PT TO 2ND ADDRESS
  335.     PUSH    DE        ;SAVE FIRST ADDRESS ON STACK
  336.     PUSH    HL        ;SAVE PTR TO 2ND ADDRESS
  337.     LD    A,1        ;TURN ON DISK OUTPUT
  338.     LD    (WRTENAB),A
  339.     CALL    PSTG        ;PRINT NEW ORG
  340.     DEFB    9,'ORG',9,0
  341.     POP    HL
  342.     POP    DE
  343.     LD    A,D        ;ORG AT FIRST ADDRESS
  344.     CALL    PASHEX        ;PRINT AS 'nnH'
  345.     LD    A,E
  346.     CALL    PHEX
  347.     LD    A,'H'
  348.     CALL    COUT
  349.     CALL    CRLF
  350.     PUSH    DE        ;SAVE FIRST ADDRESS
  351.     CALL    CNVRT        ;GET 2ND ADDRESS IN DE
  352.     CP    0DH        ;ERROR IF <CR>
  353.     JP    NZ,WHAT
  354.     POP    BC        ;BC=START ADDRESS, DE=END ADDRESS
  355.     LD    HL,SYMTAB    ;PT TO SYMBOL TABLE
  356. PRLG1:
  357.     INC    HL        ;SKIP OVER SYMBOL ADDRESS
  358.     INC    HL
  359.     LD    A,(HL)        ;GET 1ST CHAR OF SYMBOL
  360.     OR    A        ;END OF SYMBOL TABLE? (CHAR COUNT = 0)
  361.     JP    Z,GETCMD    ;DONE IF SO
  362.     DEC    HL        ;PT TO SYMBOL ADDRESS
  363.     DEC    HL
  364.     LD    A,(HL)        ;COMPARE SYMBOL ADDRESS TO CURRENT ADDRESS
  365.     SUB    C        ;... IN BC
  366.     INC    HL
  367.     LD    A,(HL)
  368.     SBC    A,B
  369.     JR    C,GENEQU    ;GENERATE EQU IF SYMBOL < START ADDRESS
  370.     DEC    HL        ;PT TO SYMBOL LOW-ORDER ADDRESS AGAIN
  371.     LD    A,(HL)        ;COMPARE SYMBOL ADDRESS TO END ADDRESS
  372.     SUB    E
  373.     INC    HL
  374.     LD    A,(HL)
  375.     SBC    A,D
  376.     JP    C,WITHIN    ;PROCESS NORMALLY IF START <= SYMBOL <= END
  377. ;
  378. ;  SYMBOL IS NOT IN RANGE OF:
  379. ;    START ADDRESS <= SYMBOL <= END ADDRESS
  380. ;  GENERATE EQUATE FOR IT
  381. ;
  382. GENEQU:
  383.     PUSH    HL    ;SAVE PTR TO SYMBOL
  384.     PUSH    BC    ;SAVE START ADDRESS
  385.     INC    HL    ;PT TO SYMBOL CHAR COUNT
  386.     LD    B,(HL)    ;B=CHAR COUNT
  387.     PUSH    HL    ;SAVE PTR TO CHAR COUNT
  388.     INC    HL    ;PT TO FIRST LETTER OF SYMBOL
  389.     LD    A,(HL)    ;GET IT
  390.     DEC    HL    ;PT BACK TO CHAR COUNT
  391.     CP    'A'    ;IF FIRST LETTER IS LESS THAN A, DON'T GENERATE 'EQU'
  392.     JR    C,PRLG3
  393. ;
  394. ;  SCAN SYMBOL FOR '+' OR '-' AND DON'T GENERATE 'EQU' IF IT CONTAINS ONE
  395. ;
  396. PRLG2:
  397.     INC    HL    ;PT TO NEXT CHAR
  398.     LD    A,(HL)    ;GET IT
  399.     CP    '+'    ;CHECK
  400.     JR    Z,PRLG3
  401.     CP    '-'    ;CHECK
  402.     JR    Z,PRLG3
  403.     DJNZ    PRLG2    ;LOOP
  404.     POP    HL    ;GET PTR TO SYMBOL CHAR COUNT
  405.     LD    B,(HL)    ;B=CHAR COUNT
  406.     LD    A,1    ;ENABLE DISK OUTPUT
  407.     LD    (WRTENAB),A
  408. ;
  409. ;  PRINT SYMBOL EQUATE; HL PTS TO BYTE BEFORE SYMBOL AND B=NUMBER OF CHARS
  410. ;
  411. LOOPB:
  412.     INC    HL    ;PT TO NEXT CHAR
  413.     LD    A,(HL)    ;GET IT
  414.     CALL    COUT    ;PRINT IT
  415.     DJNZ    LOOPB    ;LOOP FOR NUMBER OF CHARS IN B
  416.     CALL    PSTG
  417.     DB    9,'EQU',9,0
  418.     POP    BC    ;GET START ADR
  419.     POP    HL    ;PT TO CHAR COUNT OF CURRENT SYMBOL
  420.     LD    A,(HL)    ;CHECK FOR HIGH-ORDER VALUE
  421.     OR    A    ;DON'T PRINT SIGNIFICANT ZERO
  422.     CALL    NZ,PASHEX
  423.     DEC    HL    ;PT TO LOW-ORDER VALUE
  424.     LD    A,(HL)    ;GET IT
  425.     CALL    PHEX    ;PRINT IT
  426.     LD    A,'H'    ;FOLLOWING 'H' FOR 'nnH' AND NEW LINE
  427.     CALL    COUT
  428.     CALL    CRLF
  429.     XOR    A    ;DISABLE WRITE TO DISK
  430.     LD    (WRTENAB),A
  431.     INC    HL    ;PT TO HIGH-ORDER VALUE OF SYMBOL
  432. ;
  433. ;  SYMBOL IS WITHIN THE DESIRED RANGE (START <= SYMBOL <= END)
  434. ;
  435. WITHIN:
  436.     INC    HL    ;PT TO CHAR COUNT OF SYMBOL
  437.     LD    A,(HL)    ;GET IT
  438.     CALL    SKIP    ;SKIP TO NEXT SYMBOL
  439.     INC    HL    ;PT TO ITS ADDRESS
  440.     CALL    BRKCHK    ;CHECK FOR BREAK
  441.     JP    PRLG1    ;CONTINUE GENERATING PROLOG
  442. ;
  443. ;  SKIP CURRENT SYMBOL FOR ONE REASON OR ANOTHER
  444. ;
  445. PRLG3:
  446.     POP    HL    ;RESTORE REGS AND CONTINUE
  447.     POP    BC
  448.     POP    HL
  449.     JR    WITHIN
  450. ;
  451. ;COMMAND:  Q PREFIX
  452. ;  EXECUTE THE COMMAND IN THE QUIET MODE
  453. ;
  454. QUIET:
  455.     LD    A,1        ;TURN ON QUIET MODE
  456.     LD    (HUSH),A
  457.     LD    DE,INBUF+2    ;COPY COMMAND LINE LEFT 1 CHARACTER
  458.     LD    HL,INBUF+3
  459. SHFTBF:
  460.     LD    A,(HL)        ;COPY IN ORDER TO CONTINUE PROCESSING
  461.     LD    (DE),A        ;... NORMALLY
  462.     INC    HL
  463.     INC    DE
  464.     CP    0DH
  465.     JR    NZ,SHFTBF
  466.     JP    PRCEDE        ;RETURN TO MAIN COMMAND PROCESSOR
  467. ;
  468. ;COMMAND:  D
  469. ;  DUMP THE MEMORY, SYMBOL TABLE, OR SET THE DEFAULT DUMP LENGTH
  470. ;
  471. DUMP:
  472.     LD    HL,(DMPSTRT)    ;GET PTR TO STARTING ADR FOR DUMP
  473.     PUSH    HL
  474.     EX    DE,HL        ;... IN DE
  475.     LD    HL,(DMPLEN)    ;GET DEFAULT LENGTH OF DUMP
  476.     ADD    HL,DE        ;CALCULATE END ADDRESS OF DUMP
  477.     LD    (DMPEND),HL    ;SAVE IT
  478.     POP    DE
  479.     LD    HL,INBUF+3    ;LOOK AT COMMAND LINE
  480.     LD    A,(HL)        ;GET CHAR AFTER THE 'D'
  481.     CP    0DH        ;IF <CR>, THEN DUMP FROM DMPSTRT TO DMPEND
  482.     JP    Z,DMPHDR
  483.     CP    'S'        ;IF S, THEN DUMP THE SYMBOL TABLE
  484.     JP    Z,DMPSYM
  485.     CP    '='        ;IF =, THEN SET THE DEFAULT DUMP LENGTH
  486.     JP    Z,DUMP5
  487.     CP    ','        ;IF ',', THEN DUMP FROM CURRENT TO END SPEC
  488.     JP    Z,DUMP1
  489. ;
  490. ;  NUMBER SHOULD FOLLOW THE D -- PROCESS IT
  491. ;
  492. DUMP0:
  493.     CALL    CNVRT        ;GET VALUE
  494.     PUSH    HL        ;SAVE IT
  495.     LD    HL,(DMPLEN)    ;GET DEFAULT LENGTH
  496.     ADD    HL,DE        ;COMPUTE END OF DUMP
  497.     LD    (DMPEND),HL    ;SAVE IT
  498.     POP    HL        ;GET START ADDRESS OF DUMP
  499. ;
  500. ;  CHECK FOR DELIMITER AFTER FIRST NUMBER
  501. ;
  502. DUMP1:
  503.     CP    0DH        ;IF <CR>, DUMP FOR THE DEFAULT LENGTH
  504.     JR    Z,DUMP3
  505.     CP    ' '        ;IF <SP>, GET 2ND NUMBER
  506.     JR    Z,DUMP2
  507.     CP    ','        ;IF ',', GET 2ND NUMBER
  508.     JP    NZ,WHAT        ;ERROR IF NOT
  509. ;
  510. ;  EXTRACT 2ND NUMBER FROM DUMP COMMAND
  511. ;
  512. DUMP2:
  513.     INC    HL        ;PT TO NUMBER
  514.     PUSH    DE
  515.     CALL    CNVRT        ;RETURN IT IN DE
  516.     EX    DE,HL
  517.     LD    (DMPEND),HL    ;SET END ADDRESS OF DUMP
  518.     POP    DE        ;GET START ADDRESS OF DUMP IN DE
  519. ;
  520. ;  ADD OFFSET TO BEGINNING AND ENDING DUMP ADDRESSES
  521. ;    ON INPUT, DE=START OF DUMP ADDRESS
  522. ;
  523. DUMP3:
  524.     LD    HL,(OFFSET)    ;GET OFFSET
  525.     PUSH    HL        ;SAVE IT
  526.     ADD    HL,DE        ;ADD TO BEGINNING DUMP ADDRESS
  527.     LD    (DMPSTRT),HL    ;SET PTR
  528.     LD    HL,(DMPEND)    ;GET END ADDRESS OF DUMP
  529.     POP    DE        ;GET OFFSET IN DE
  530.     ADD    HL,DE        ;ADD OFFSET TO END ADDRESS OF DUMP
  531.     LD    (DMPEND),HL    ;NEW END ADDRESS OF DUMP
  532.     CP    0DH        ;MAKE SURE <CR> AFTER DUMP COMMAND
  533.     JP    NZ,WHAT        ;ERROR IF NOT
  534. ;
  535. ;  PRINT HEADER FOR DUMP AND THEN PERFORM DUMP
  536. ;
  537. DMPHDR:
  538.     CALL    PSTRNG        ;PRINT A HEADER FOR THE DUMP
  539.     DEFB    'Addr  +0   +2    +4   +6     +8   +A    +C   +E      ASCII'
  540.     DEFB    0DH,0AH,0
  541. ;
  542. ;  MAIN DUMP LOOP
  543. ;
  544. CNTDMP:
  545.     LD    HL,(DMPSTRT)    ;GET START ADDRESS OF DUMP
  546. DUMP4:
  547.     CALL    BRKCHK        ;CHECK FOR BREAK
  548.     PUSH    HL        ;SAVE PTR TO NEXT BYTE
  549.     CALL    TWOS        ;MAKE HL CONTAIN RELATIVE VALUE
  550.     CALL    PVALUE        ;... BY SUBTRACTING OFFSET; THEN PRINT IT
  551.     POP    HL        ;GET PTR
  552.     PUSH    HL        ;SAVE PTR
  553.     CALL    SPACE        ;PRINT A SPACE
  554. ;
  555. ;  DUMP AS HEX
  556. ;
  557. DMPLN:
  558.     LD    A,(HL)        ;GET BYTE
  559.     CALL    PHEX        ;PRINT AS HEX
  560.     INC    HL        ;PT TO NEXT
  561.     LD    A,L        ;PRINT ONE SPACE FOR EVERY 2 VALUES
  562.     AND    1
  563.     CALL    Z,SPACE
  564.     LD    A,L        ;PRINT TWO SPACES EVERY 4
  565.     AND    3
  566.     CALL    Z,SPACE
  567.     LD    A,L        ;PRINT THREE SPACES EVERY 8
  568.     AND    7
  569.     CALL    Z,SPACE
  570.     LD    A,L        ;CHECK FOR END OF DUMP LINE (EVERY 16)
  571.     AND    0FH
  572.     JR    NZ,DMPLN
  573.     LD    A,'!'        ;PRINT BEGINNING '!'
  574.     CALL    COUT
  575.     POP    HL        ;GET PTR TO FIRST BYTE
  576. ;
  577. ;  DUMP AS ASCII
  578. ;
  579. DMPASC:
  580.     LD    A,(HL)        ;GET CHAR
  581.     CP    ' '        ;PRINT . IF LESS THAN <SP>
  582.     JR    C,PERIOD
  583.     CP    7FH        ;PRINT . IF GREATER THAN <DEL>
  584.     JR    C,CHRCTR
  585. ;
  586. ;  PRINT '.'
  587. ;
  588. PERIOD:
  589.     LD    A,'.'
  590. ;
  591. ;  PRINT CHAR IN A AND ADVANCE FOR UP TO 16 CHARS
  592. ;
  593. CHRCTR:
  594.     CALL    COUT    ;PRINT CHAR
  595.     INC    HL    ;PT TO NEXT
  596.     LD    A,L    ;END OF LINE?
  597.     AND    0FH    ;EVERY 16
  598.     JR    Z,LCMPLT    ;DONE IF SO
  599.     AND    7    ;EXTRA SPACE FOR EVERY 8
  600.     CALL    Z,SPACE
  601.     JR    DMPASC    ;CONTINUE ASCII DUMP
  602. ;
  603. ;  TIDY UP THE LINE
  604. ;
  605. LCMPLT:
  606.     LD    A,'!'    ;PRINT ENDING '!'
  607.     CALL    COUT
  608.     CALL    CRLF    ;NEW LINE
  609.     LD    (DMPSTRT),HL    ;COMPARE CURRENT START ADDRESS TO END ADDRESS
  610.     LD    A,(DMPEND)
  611.     SUB    L
  612.     LD    A,(DMPEND+1)
  613.     SBC    A,H
  614.     JR    NC,DUMP4    ;CONTINUE IF CURRENT START <= END
  615.     JP    GETCMD        ;RETURN TO COMMAND PROCESSING OTHERWISE
  616. ;
  617. ;  SET THE DEFAULT NUMBER OF BYTES TO DUMP
  618. ;
  619. DUMP5:
  620.     INC    HL    ;PT TO VALUE
  621.     CALL    CNVRT    ;RETURN VALUE IN DE
  622.     INC    HL
  623.     DEC    DE
  624.     EX    DE,HL
  625.     LD    (DMPLEN),HL    ;SAVE VALUE
  626.     EX    DE,HL
  627.     CP    ','
  628.     JP    Z,DUMP0
  629.     CP    ' '
  630.     JP    Z,DUMP0
  631.     CP    0DH
  632.     JP    Z,GETCMD
  633.     JP    WHAT
  634. ;
  635. ;  DS -- DUMP THE SYMBOL TABLE
  636. ;
  637. DMPSYM:
  638.     CALL    IECNT        ;INIT ECNT
  639.     LD    HL,INBUF+4    ;PT TO CHAR AFTER 'DS'
  640.     LD    A,(HL)        ;GET IT
  641.     CP    '.'        ;SYMBOL SPECIFIED?
  642.     JR    NZ,FRMBGN    ;NO, SO DUMP FROM BEGINNING OF TABLE
  643.     CALL    LNGTH        ;COMPUTE LENGTH OF GIVEN SYMBOL
  644.     CALL    PLCSYM        ;RETURN PTR TO THIS SYMBOL IN HL
  645.     JR    NC,FRMSYM    ;PROCESS NORMALLY IF FOUND
  646.     LD    HL,(SYMRKR)
  647.     JR    FRMSYM
  648. FRMBGN:
  649.     LD    HL,SYMTAB    ;PT TO TABLE
  650. FRMSYM:
  651.     LD    E,(HL)        ;GET ADDRESS OF SYMBOL IN DE
  652.     INC    HL
  653.     LD    D,(HL)
  654.     INC    HL
  655.     LD    A,(HL)        ;GET LENGTH OF SYMBOL IN A
  656.     OR    A        ;DONE IF LENGTH = 0
  657.     JP    Z,SPITCR
  658.     EX    DE,HL        ;PRINT VALUE OF SYMBOL
  659.     CALL    PVALUE
  660.     EX    DE,HL
  661.     LD    A,'='    ;PRINT =
  662.     CALL    COUT
  663.     LD    B,(HL)        ;GET LENGTH OF SYMBOL IN B
  664.     LD    A,SYMMAX+1    ;COMPUTE DIFF FROM MAX
  665.     SUB    B
  666.     LD    C,A        ;DIFFERENCE IN C (NUMBER OF SPACES AFTER SYM)
  667.     INC    HL
  668. ;
  669. ;  PRINT THE SYMBOL PTED TO BY HL; B=NUMBER OF BYTES LONG THE SYMBOL IS
  670. ;
  671. SPIT:
  672.     LD    A,(HL)        ;GET SYMBOL CHAR
  673.     CALL    COUT        ;PRINT IT
  674.     INC    HL        ;PT TO NEXT
  675.     DJNZ    SPIT        ;UNTIL DONE
  676. ;
  677. ;  PRINT TRAILING SPACES AFTER SYMBOL
  678. ;
  679.     LD    B,C    ;SP COUNT IN B
  680. SPIT1:
  681.     CALL    SPACE
  682.     DJNZ    SPIT1
  683.     CALL    SPCRLF    ;NEW LINE
  684.     CALL    BRKCHK    ;CHECK FOR BREAK
  685.     JR    FRMSYM    ;CONTINUE
  686. ;
  687. ;  PRINT <CRLF> AND EXIT
  688. ;
  689. SPITCR:
  690.     CALL    CRLF    ;NEW LINE
  691.     JP    GETCMD
  692. ;
  693. ;  COUNT DOWN ECNT AND OUTPUT <CRLF> ON ZERO
  694. ;
  695. SPCRLF:
  696.     LD    A,(ECNT)    ;GET COUNT
  697.     DEC    A
  698.     LD    (ECNT),A
  699.     RET    NZ
  700.     CALL    CRLF    ;NEW LINE
  701. ;
  702. ;  INIT ECNT
  703. ;
  704. IECNT:
  705.     LD    A,4    ;SET 4 ENTRIES
  706.     LD    (ECNT),A
  707.     RET
  708. ;
  709. ;   PRINT THE VALUE OF THE OFFSET.
  710. ;
  711. PRNTOS:
  712.     CALL    PSTRNG
  713.     DB    'Offset = ',0
  714.     LD    HL,(OFFSET)    ;GET IT AND PRINT IT
  715.     CALL    PVALUE
  716.     CALL    CRLF        ;NEW LINE
  717.     JP    GETCMD
  718. ;
  719. ;COMMAND:  O
  720. ;  SET OR PRINT OFFSET ADDRESS
  721. ;
  722. SETOS:
  723.     LD    HL,INBUF+3    ;FORMAT: O c/r
  724.     LD    A,(HL)        ;.. or   Oxxxx c/r
  725.     CP    0DH        ;IF JUST O, DO IT VIA PRNTOS
  726.     JR    Z,PRNTOS
  727.     CALL    CNVRT        ;GET VALUE IN DE
  728.     CP    0DH        ;ERROR?
  729.     JP    NZ,WHAT
  730.     EX    DE,HL        ;SAVE AS OFFSET
  731.     LD    (OFFSET),HL
  732.     CALL    CRLF        ;NEW LINE AND PRINT NEW VALUE
  733.     JR    PRNTOS
  734. ;
  735. ;  SET UP THE FILE CONTROL BLOCK.
  736. ;
  737. SETFCB:
  738.     LD    A,(FOPEN)    ;FILE OPEN?
  739.     OR    A        ;0 IF NOT
  740.     JP    NZ,CANT
  741.     LD    (FCB),A        ;SET DEFAULT DRIVE
  742.     LD    (FCB+12),A    ;SET EXTENT NUMBER TO ZERO
  743.     LD    HL,INBUF+3    ;PT TO FIRST LETTER OF POSSIBLE FILE NAME
  744.     LD    A,(INBUF+4)    ;GET SECOND LETTER
  745.     CP    ' '        ;ERROR IF JUST <SP>
  746.     JP    Z,WHAT
  747.     CP    ':'        ;GET AND SET DRIVE IF ':'
  748.     JR    NZ,SMDRV
  749.     LD    A,(HL)        ;GET SPECIFIED DRIVE
  750.     SUB    '@'        ;CONVERT IT TO BINARY
  751.     LD    (FCB),A        ;SET DRIVE NUMBER IN FCB
  752.     INC    HL
  753.     INC    HL
  754. ;
  755. ;  WRITE FILE NAME AND TYPE INTO FCB
  756. ;
  757. SMDRV:
  758.     LD    DE,FCB+1    ;PT TO FILE NAME FIELD OF FCB
  759.     LD    B,8
  760.     CALL    SLIDE        ;PUT FILE NAME
  761.     LD    B,3
  762.     CALL    SLIDE        ;PUT FILE TYPE
  763.     RET    
  764. ;
  765. ;  WRITE CHARS PTED TO BY HL INTO BUFFER PTED TO BY DE; WRITE AT MOST B
  766. ;    CHARS, AND <SP> FILL THE BUFFER PTED TO BY DE
  767. ;
  768. SLIDE:
  769.     LD    A,(HL)    ;GET NEXT CHAR
  770.     CP    0DH    ;DONE?
  771.     JR    Z,BLANK    ;BLANK FILL IF SO
  772.     INC    HL    ;PT TO NEXT
  773.     CP    '.'    ;FILE TYPE FOLLOWS?
  774.     JR    Z,BLANK    ;BLANK FILL IF SO
  775.     LD    (DE),A    ;PUT CHAR
  776.     INC    DE    ;PT TO NEXT
  777.     DJNZ    SLIDE    ;COUNT DOWN
  778. ;
  779. ;  CHECK FOR ERROR IF AFTER 8 CHARACTERS IN THE FILENAME
  780. ;
  781. AFTR8:
  782.     LD    A,(HL)    ;GET NEXT CHAR
  783.     CP    0DH    ;OK IF <CR>
  784.     RET    Z
  785.     CP    '.'    ;OK IF '.'
  786.     INC    HL    ;PT TO NEXT AFTER '.'
  787.     RET    Z
  788.     JR    AFTR8
  789. ;
  790. ;  BLANK FILL FOR THE REMAINDER OF THE NAME
  791. ;
  792. BLANK:
  793.     LD    A,' '    ;GET <SP>
  794.     LD    (DE),A    ;PUT IT
  795.     INC    DE    ;PT TO NEXT
  796.     DJNZ    BLANK    ;COUNT DOWN
  797.     RET    
  798. ;
  799. ;COMMAND:  A
  800. ;  BUILD ASCII STRINGS USING DB'S
  801. ;
  802. ASCASM:
  803.     LD    A,1    ;SET FLAG
  804.     LD    (ASCBLD),A
  805.     XOR    A    ;TURN OFF BUILD BY B COMMAND
  806.     LD    (BUILD),A
  807.     JR    LIST1    ;PERFORM LIST
  808. ;
  809. ;COMMAND:  B
  810. ;  BUILD LABELS
  811. ;
  812. BLDASM:
  813.     LD    A,1    ;TURN ON BUILD BY B COMMAND
  814.     LD    (BUILD),A
  815.     XOR    A    ;TURN OFF BUILD BY A COMMAND
  816.     LD    (ASCBLD),A
  817.     JR    LIST1
  818. ;
  819. ;COMMAND:  L
  820. ;  DISASSEMBLE WITH THE 'L' OPTION
  821. ;
  822. LIST:
  823.     XOR    A    ;TURN OFF A AND B FLAGS
  824.     LD    (BUILD),A
  825.     LD    (ASCBLD),A
  826. LIST1:
  827.     XOR    A    ;DISABLE OUTPUT TO DISK
  828.     LD    (WRTENAB),A
  829.     LD    A,(NLINES)    ;SET LINE COUNT
  830.     LD    (LCTR),A
  831.     LD    (CNTENAB),A    ;ENABLE LINE COUNT
  832.     LD    HL,INBUF+3    ;PT TO CHAR AFTER L, A, OR B COMMAND
  833.     LD    A,(HL)        ;GET IT
  834.     CP    0DH        ;DO DEFAULT NUMBER IF EOL
  835.     JR    Z,TENL
  836.     CP    ','        ;USE CURRENT POSITION FOR FIRST ARG IF ','
  837.     JR    Z,LIST3
  838.     CP    ' '        ;SAME AS ','
  839.     JR    Z,LIST3
  840.     CP    '='        ;SET DEFAULT NUMBER OF LINES IF '='
  841.     JR    NZ,LIST2
  842. ;
  843. ;  SET DEFAULT NUMBER OF LINES FOR LIST
  844. ;
  845. NWLNCT:
  846.     INC    HL    ;PT TO ARG
  847.     CALL    CNVRT    ;GET IT IN DE
  848.     LD    A,E    ;ERROR IF ZERO
  849.     OR    A
  850.     JP    Z,WHAT
  851.     LD    (NLINES),A    ;SET COUNTS
  852.     LD    (LCTR),A
  853.     LD    A,(HL)    ;GET NEXT CHAR
  854.     INC    HL
  855.     CP    ','    ;CONTINUE IF COMMA OR SPACE
  856.     JR    Z,LIST2
  857.     CP    ' '
  858.     JR    Z,LIST2
  859.     CP    0DH    ;DONE IF <CR>
  860.     JP    Z,GETCMD
  861.     JP    WHAT    ;ERROR OTHERWISE
  862. ;
  863. ;  GET FIRST ARG FOR L, A, OR B FROM COMMAND LINE
  864. ;
  865. LIST2:
  866.     CALL    CNVRT    ;GET VALUE IN DE
  867.     EX    DE,HL
  868.     LD    (PC),HL    ;SET PC TO IT
  869.     EX    DE,HL
  870.     CP    0DH    ;DONE?
  871.     JR    Z,TENL    ;DO DEFAULT NUMBER IF SO
  872.     CP    ' '    ;GET 2ND ARG IF <SP>
  873.     JR    Z,LIST3
  874.     CP    ','    ;SAME IF ','
  875.     JP    NZ,WHAT    ;ERROR OTHERWISE
  876. ;
  877. ;  GET 2ND ARG FOR L, A, OR B COMMAND
  878. ;
  879. LIST3:
  880.     INC    HL    ;PT TO FIRST CHAR OF 2ND ARG
  881.     CALL    CNVRT    ;GET ITS VALUE IN DE
  882.     EX    DE,HL
  883.     LD    (ENDLST),HL    ;SET END OF LISTING TO IT
  884.     XOR    A    ;TURN OFF LINE COUNTING
  885.     LD    (CNTENAB),A
  886. ;
  887. ;  MAIN PROCESSING LOOP FOR L, A, AND B COMMANDS
  888. ;
  889. TENL:
  890.     CALL    BRKCHK    ;CHECK FOR BREAK
  891.     LD    A,(CNTENAB)    ;CHECK FOR LINE COUNTING IN PROGRESS
  892.     OR    A    ;0 = NO
  893.     JR    Z,CONTL    ;CONTINUE IF NOT
  894.     LD    A,(LCTR)    ;GET COUNT
  895.     DEC    A    ;COUNT DOWN
  896.     JP    M,GETCMD    ;RETURN TO COMMAND PROCESSING IF DONE
  897.     JR    FLAGA
  898. ;
  899. ;  COMPARE ENDLST WITH PC
  900. ;
  901. CONTL:
  902.     LD    HL,(ENDLST)    ;DONE WITH DISPLAY?
  903.     LD    A,(PC)
  904.     SUB    L
  905.     LD    A,(PC+1)
  906.     SBC    A,H
  907.     JP    NC,GETCMD
  908. ;
  909. ;  CHECK FOR A OR B COMMANDS
  910. ;
  911. FLAGA:
  912.     LD    A,(ASCBLD)    ;A COMMAND IF ASCBLD NOT ZERO
  913.     OR    A
  914.     JR    Z,MOREL
  915. ;
  916. ;  THIS IS THE MAJOR FUNCTION TO BUILD ASCII DB'S
  917. ;
  918. BUILDA:
  919.     LD    HL,(PC)    ;HL PTS TO NEXT BYTE (RELATIVE)
  920.     EX    DE,HL    ;PTR IN DE
  921.     LD    HL,(OFFSET)    ;HL CONTAINS OFFSET
  922.     ADD    HL,DE    ;HL PTS TO NEXT BYTE ABSOLUTE
  923.     LD    B,8    ;LOOK FOR 8 ASCII CHARS IN A ROW
  924. LOOP8:
  925.     LD    A,(HL)    ;CHECK FOR ASCII CHAR
  926.     CALL    ISITASC    ;IS IT ASCII?
  927.     JR    C,MOREL    ;NO, SKIP TO NEXT BYTE
  928.     INC    HL    ;YES, PT TO NEXT
  929.     DJNZ    LOOP8
  930. ;
  931. ;  FIND END OF THIS ASCII STRING
  932. ;
  933. FOLLOW:
  934.     LD    A,(HL)    ;LOOK UNTIL NON-ASCII
  935.     INC    HL    ;PT TO NEXT
  936.     CALL    ISITASC
  937.     JR    NC,FOLLOW
  938.     DEC    HL    ;PT TO NON-ASCII CHAR
  939.     CALL    TWOS    ;SUBTRACT OFFSET FROM LOCATION
  940.     EX    DE,HL    ;RESULT IN DE
  941.     PUSH    DE    ;SAVE PTR TO BYTE AFTER DB STRING FOR 'I' CONTROL
  942.     LD    HL,(PC)    ;GET VALUE OF BEGINNING OF ASCII STRING
  943.     EX    DE,HL    ;... IN DE
  944.     LD    A,'B'    ;SET B CONTROL POINT
  945.     CALL    FTCTL0    ;A='B', DE=ADDRESS
  946.     POP    HL
  947.     LD    (PC),HL    ;SET NEW ADDRESS TO CONTINUE FROM
  948.     EX    DE,HL
  949.     LD    A,'I'    ;A='I', DE=ADDRESS FOR INSTR CONTROL
  950.     CALL    FTCTL0
  951. ;
  952. ;  NOW LOOK FOR ANY COMMENTS AT THIS ADDRESS
  953. ;
  954. MOREL:
  955.     LD    HL,(COMST)    ;COMMENT TABLE IN USE?
  956.     LD    A,H    ;ADDRESS IS ZERO IF NOT
  957.     OR    L
  958.     JR    Z,NCMT
  959.     LD    HL,(PC)    ;HL PTS TO PC
  960.     EX    DE,HL    ;DE PTS TO PC
  961.     CALL    CMCHK    ;CHECK COMMENT TABLE FOR MATCH
  962.     JR    C,NCMT    ;NO MATCH
  963.     INC    HL    ;PT TO CHAR COUNT OF COMMENT
  964.     INC    HL
  965.     LD    B,(HL)    ;B=NUMBER OF CHARS IN COMMENT
  966.     INC    HL    ;PT TO FIRST CHARACTER
  967.     LD    A,(HL)    ;A=FIRST CHAR OF COMMENT
  968.     CP    ';'    ;A ';' COMMENT IS LISTED AFTER THE OPCODE
  969.     DEC    HL    ;PT BACK TO CHAR COUNT
  970.     JR    NZ,MOREL1    ;CONTINUE IF NO ';'
  971.     LD    (XCPTR),HL    ;SAVE THE COMMENT ADDRESS
  972.     JR    NCMT
  973. ;
  974. ;  THIS ROUTINE WILL
  975. ;  PRINT COMMENTS
  976. ;  LIKE THIS
  977. ;
  978. NWLN:
  979.     SCF    
  980. NWLN0:
  981.     LD    A,1    ;ENABLE WRITING
  982.     LD    (WRTENAB),A
  983.     CALL    C,SEMI    ;OUTPUT SEMI BEFORE NEW COMMENT
  984.     XOR    A
  985.     OR    B    ;CHECK CHAR COUNT FOR DONE
  986.     RET    Z    ;DONE IF ZERO CHARS LEFT
  987. CNTCMT:
  988.     INC    HL    ;PT TO NEXT CHAR
  989.     LD    A,(HL)    ;GET IT
  990.     CP    '\'    ;NEW LINE?
  991.     JR    NZ,NTBKSL
  992.     CALL    CRLF    ;NEW LINE
  993.     DEC    B    ;DEC CHAR COUNT
  994.     JR    NWLN    ;CONT
  995. NTBKSL:
  996.     CALL    COUT    ;PRINT CHAR
  997.     DEC    B    ;DECREMENT COUNT
  998.     JR    NZ,CNTCMT
  999.     RET    
  1000. MOREL1:
  1001.     CP    '*'        ; A '*' COMMENT REPLACES THE ENTIRE LINE
  1002.     JR    NZ,MOREL2
  1003.     LD    (RPLPTR),HL
  1004.     JR    NCMT
  1005. ;
  1006. ;  PRINT COMMENT PTED TO BY HL AND THEN NEW LINE
  1007. ;
  1008. MOREL2:
  1009.     CALL    NWLN    ;PRINT COMMENT
  1010.     CALL    CRLF
  1011. ;
  1012. ;  NOW PROCESS THE BYTE AS AN INSTRUCTION IF IT IS
  1013. ;
  1014. NCMT:
  1015.     LD    HL,(PC)    ;PT TO PC
  1016.     EX    DE,HL    ;... IN DE
  1017.     CALL    SCHCTL    ;CHECK CONTROL TABLE
  1018.     DEC    HL    ;PT TO CONTROL MODE OF PREVIOUS ENTRY
  1019.     JR    C,RDCTL    ;IF NO MATCH, CONTROL MODE OF PREVIOUS ENTRY IS IT
  1020.     INC    HL    ;SINCE MATCH, PT TO CONTROL MODE OF MATCHED ENTRY
  1021.     INC    HL
  1022.     INC    HL
  1023. ;
  1024. ;  CHECK CONTROL MODE
  1025. ;
  1026. RDCTL:
  1027.     LD    A,(HL)    ;GET CONTROL MODE
  1028.     CP    'I'    ;IS IT INSTRUCTION?
  1029.     JR    Z,ICTL    ;PROCESS IF SO
  1030.     CP    'E'    ;END OF PROGRAM?
  1031.     JP    Z,CLOSE    ;DONE IF SO
  1032.     PUSH    AF    ;ELSE SAVE CONTROL MODE
  1033.     INC    HL    ;PT TO ADDRESS OF NEXT CONTROL MODE
  1034.     LD    E,(HL)    ;ADDRESS IN DE
  1035.     INC    HL
  1036.     LD    D,(HL)
  1037.     PUSH    DE    ;SAVE ADDRESS OF NEXT CONTROL ENTRY
  1038.     LD    HL,(PC)    ;PT TO PC
  1039.     EX    DE,HL    ;... IN DE
  1040.     CALL    HSYM    ;PRINT SYMBOL IF THERE
  1041.     POP    HL    ;HL IS ADDRESS OF NEXT CONTROL ENTRY
  1042.     LD    (NXTCTL),HL    ;SAVE IT
  1043.     EX    DE,HL    ;... IN DE ALSO
  1044.     XOR    A    ;DISABLE WRITE
  1045.     LD    (WRTENAB),A
  1046.     POP    AF    ;GET CONTROL MODE
  1047.     CP    'S'    ;DS?
  1048.     JP    Z,DSMODE
  1049.     CP    'B'    ;DB?
  1050.     JP    Z,BMODE
  1051.     CP    'H'    ;DB HEX?
  1052.     JP    Z,HMODE
  1053.     CP    'W'    ;DW?
  1054.     JP    Z,WMODE
  1055.     CALL    COUT    ;ELSE PRINT AS ERROR
  1056.     CALL    PSTRNG
  1057.     DEFB    ': Invalid CTL Entry',0DH,0AH,0
  1058.     JP    GETCMD
  1059. ;
  1060. ;  EXECUTE HERE IF THE 'I' CTL IS IN EFFECT -- INTERPRET AS INSTRUCTION
  1061. ;    DE PTS TO BYTE WHICH IS BEING PROCESSED
  1062. ;
  1063. ICTL:
  1064.     CALL    DASM    ;INVOKE DISASSEMBLER
  1065.     XOR    A    ;DISABLE WRITE
  1066.     LD    (WRTENAB),A
  1067.     JP    TENL
  1068. ;
  1069. ;  DS CTL -- DE CONTAIN NEXT CTL ADDRESS
  1070. ;
  1071. DSMODE:
  1072.     PUSH    DE    ;SAVE NEXT CONTROL
  1073.     LD    A,(PC)    ;COMPUTE -PC IN HL
  1074.     CPL    
  1075.     LD    L,A
  1076.     LD    A,(PC+1)
  1077.     CPL    
  1078.     LD    H,A
  1079.     INC    HL
  1080.     ADD    HL,DE    ;HL = LENGTH OF SPACE DEFINED
  1081.     LD    A,1    ;ENABLE WRITING
  1082.     LD    (WRTENAB),A
  1083.     CALL    PSTG    ;PRINT 'DS'
  1084.     DEFB    'DS',9,0
  1085.     LD    A,H    ;PRINT SIZE OF AREA
  1086.     CALL    PASHEX
  1087.     LD    A,L
  1088.     CALL    PHEX
  1089.     LD    A,'H'
  1090.     CALL    COUT
  1091.     CALL    CRLF
  1092.     POP    HL    ;GET PTR TO NEXT CONTROL ENTRY
  1093.     LD    (PC),HL    ;SET PC TO IT
  1094.     JP    TENL    ;CONTINUE
  1095. ;
  1096. ;  DW CTL -- PROCESS DW AND LOOK FOR LABELS
  1097. ;
  1098. WMODE:
  1099.     LD    A,1    ;ENABLE WRITING
  1100.     LD    (WRTENAB),A
  1101.     CALL    PSTG    ;PRINT 'DW'
  1102.     DEFB    'DW',9,0
  1103.     LD    HL,(PC)    ;GET PC
  1104.     EX    DE,HL    ;... IN DE
  1105.     LD    HL,(OFFSET)    ;GET OFFSET
  1106.     ADD    HL,DE    ;HL PTS TO ACTUAL BYTE PAIR
  1107.     LD    E,(HL)    ;SET DE TO DW VALUE
  1108.     INC    HL
  1109.     LD    D,(HL)
  1110.     CALL    PRNTDE    ;PRINT DW VALUE
  1111.     CALL    CRLF
  1112.     LD    HL,(PC)    ;ADVANCE PC TO BYTE AFTER DW VALUE
  1113.     INC    HL
  1114.     INC    HL
  1115.     LD    (PC),HL
  1116.     JP    TENL    ;CONTINUE PROCESSING
  1117. ;
  1118. ;  NEW LINE AND CONTINUE
  1119. ;
  1120. STPLN:
  1121.     CALL    CRLF
  1122.     JP    TENL
  1123. ;
  1124. ;  DB HEX MODE -- BUILD HEX DB'S
  1125. ;
  1126. HMODE:
  1127.     XOR    A    ;SET FLAG
  1128.     LD    (ADB),A
  1129.     JR    BMODE1
  1130. ;
  1131. ;  DB MODE -- BUILD ASCII STRINGS LONGER THAN 8 CHARACTERS
  1132. ;
  1133. BMODE:
  1134.     LD    A,0FFH    ;SET FLAG FOR ASCII
  1135.     LD    (ADB),A
  1136. BMODE1:
  1137.     XOR    A    ;INIT LENGTH TO ZERO
  1138.     LD    (BLNGTH),A
  1139.     INC    A    ;ENABLE WRITING
  1140.     LD    (WRTENAB),A
  1141.     CALL    PSTG    ;PRINT 'DB'
  1142.     DEFB    'DB',9,0
  1143. ;
  1144. ;  PROCESS BYTES OF DB
  1145. ;
  1146. MOREB:
  1147.     LD    HL,(PC)    ;GET RELATIVE ADDRESS
  1148.     EX    DE,HL    ;... IN DE
  1149.     LD    HL,(OFFSET)    ;GET OFFSET
  1150.     ADD    HL,DE    ;PT TO ACTUAL BYTE
  1151.     LD    A,(ADB)    ;CHECK FOR ASCII BUILD
  1152.     OR    A    ;0=NO
  1153.     LD    A,(HL)    ;GET BYTE OF DB
  1154.     JR    Z,LTSPC    ;XXH BUILD
  1155.     CP    0AH    ;<LF>?
  1156.     JR    C,LTLF    ;PROCESS IF LESS THAN
  1157.     CP    ' '    ;<SP>
  1158.     JR    C,LTSPC    ;PROCESS IF LESS THAN <SP>
  1159.     CP    7FH    ;<DEL>?
  1160.     JP    C,LTRUB    ;PROCESS IF GREATER THAN
  1161. ;
  1162. ;  PRINT BYTE AS HEX NUMBER
  1163. ;
  1164. LTSPC:
  1165.     CALL    PASHEX    ;PRINT BYTE IN A AS HEX
  1166.     LD    A,'H'
  1167.     CALL    COUT
  1168.     LD    A,(BLNGTH)    ;INCREASE LENGTH BY 2
  1169.     ADD    A,2
  1170.     LD    (BLNGTH),A
  1171.     JR    MVUP
  1172. ;
  1173. ;  CHAR IS LESS THAN <LF> -- MAKE IT SINGLE DIGIT (LIKE 9 FOR TAB)
  1174. ;
  1175. LTLF:
  1176.     OR    '0'    ;MASK FOR ASCII
  1177.     CALL    COUT    ;PRINT DIGIT
  1178. ;
  1179. ;  ADVANCE TO NEXT BYTE
  1180. ;
  1181. MVUP:
  1182.     INC    HL    ;PT TO NEXT BYTE
  1183.     EX    DE,HL    ;... IN DE
  1184.     LD    HL,(PC)    ;PT TO PC
  1185.     INC    HL    ;ADVANCE PC
  1186.     LD    (PC),HL
  1187.     EX    DE,HL    ;DE PTS TO PC, HL PTS TO NEXT BYTE
  1188. ;
  1189. ;  CHECK TO SEE IF THE NEXT CONTROL POINT BEEN REACHED
  1190. ;
  1191. CNXCTL:
  1192.     LD    A,(NXTCTL)    ;COMPARE AGAINST PC
  1193.     CP    E
  1194.     JR    NZ,TRYSYM
  1195.     LD    A,(NXTCTL+1)
  1196.     CP    D
  1197.     JP    Z,QTB
  1198. ;
  1199. ;  SEE IF WE ARE POINTING TO A SYMBOL'S ADDRESS
  1200. ;
  1201. TRYSYM:
  1202.     LD    HL,(PC)    ;PC IN DE
  1203.     EX    DE,HL
  1204.     CALL    SYMSCH    ;LOOK FOR SYMBOL
  1205.     JP    NC,STPLN    ;NEW LINE IF THERE IS A SYMBOL
  1206.     LD    A,(BLNGTH)    ;INCREASE LINE BY 2
  1207.     ADD    A,2
  1208.     LD    (BLNGTH),A
  1209.     CP    27
  1210.     JP    NC,STPLN    ;NEW LINE IF STRING EXCEEDS 27 CHARS
  1211.     LD    A,','    ;SEPARATE BY COMMA OTHERWISE
  1212.     CALL    COUT
  1213.     JP    MOREB
  1214. ;
  1215. ;  VALID CHAR ... BEGIN PROCESSING AS QUOTED STRING
  1216. ;
  1217. LTRUB:
  1218.     LD    A,''''    ;OUTPUT QUOTE
  1219.     CALL    COUT
  1220.     LD    A,(BLNGTH)    ;INC LENGTH
  1221.     INC    A
  1222.     LD    (BLNGTH),A
  1223.     LD    A,(HL)    ;GET CHAR
  1224. ;
  1225. ;  OUTPUT AS ASCII CHARS
  1226. ;
  1227. MORASC:
  1228.     CALL    COUT    ;PRINT CHAR
  1229.     LD    A,(HL)    ;CHECK FOR QUOTE
  1230.     CP    ''''    ;COMPARE
  1231.     CALL    Z,COUT    ;DOUBLE QUOTE
  1232.     INC    HL    ;PT TO NEXT CHAR
  1233.     EX    DE,HL    ;... IN DE
  1234.     LD    HL,(PC)    ;INCR PC
  1235.     INC    HL
  1236.     LD    (PC),HL
  1237.     EX    DE,HL    ;DE=NEXT PC
  1238.     LD    A,(NXTCTL)    ;CHECK FOR CONTROL
  1239.     CP    E
  1240.     JR    NZ,YET
  1241.     LD    A,(NXTCTL+1)
  1242.     CP    D
  1243.     JR    Z,FNLQT
  1244. ;
  1245. ;  CHECK FOR SYMBOL HERE
  1246. ;
  1247. YET:
  1248.     PUSH    HL
  1249.     LD    HL,(PC)
  1250.     EX    DE,HL
  1251.     CALL    SYMSCH
  1252.     POP    HL
  1253.     JR    NC,FNLQT    ;OUTPUT ENDING QUOTE AND NEW LINE FOR SYMBOL
  1254.     LD    A,(BLNGTH)    ;  BREAK
  1255.     INC    A    ;INCR LINE LENGTH
  1256. ;
  1257. ;  KEEP THE LINES LESS THAN 27 LONG
  1258. ;
  1259.     LD    (BLNGTH),A
  1260.     CP    35
  1261.     JR    NC,LASTQT
  1262.     CP    27
  1263.     JR    C,STILL
  1264. ;
  1265. ;  OVER 17H CHARACTERS HAVE BEEN QUOTED
  1266. ;
  1267.     DEC    HL
  1268.     LD    A,(HL)
  1269.     INC    HL
  1270.     CP    ' '
  1271.     JR    Z,FNLQT
  1272. STILL:
  1273.     LD    A,(HL)
  1274.     CP    ' '
  1275.     JR    C,LASTQT
  1276.     CP    7FH
  1277.     JP    C,MORASC
  1278. ;
  1279. ;  PRINT A TRAILING QUOTE
  1280. ;
  1281. LASTQT:
  1282.     LD    A,''''    ;PRINT QUOTE
  1283.     CALL    COUT
  1284.     JP    CNXCTL
  1285. ;
  1286. ;  PRINT ENDING QUOTE AND NEW LINE
  1287. ;
  1288. FNLQT:
  1289.     LD    A,''''
  1290.     CALL    COUT
  1291. QTB:
  1292.     CALL    CRLF
  1293.     JP    TENL
  1294. ;
  1295. ;COMMAND:  I<address>,<offset>
  1296. ;  INCREMENT SYMBOL TABLE ADDRESSES AFTER AND ON <ADDRESS> BY <OFFSET>
  1297. ;  FOR DISASSEMBLY OF NEW VERSIONS OF PROGRAMS
  1298. ;
  1299. INCMNT:
  1300.     LD    HL,INBUF+3    ;LOOK AT COMMAND LINE
  1301.     LD    A,(HL)        ;GET CHAR AFTER 'I'
  1302.     CP    0DH        ;ERROR IF EOL
  1303.     JP    Z,WHAT
  1304.     CALL    CNVRT        ;GET FIRST VALUE IN DE
  1305.     PUSH    DE        ;SAVE STARTING ADDRESS ON STACK
  1306.     CP    ' '        ;CHECK FOR VALID DELIMITER
  1307.     JR    Z,INCM1
  1308.     CP    ','        ;' ' OR ',' DELIMITER
  1309.     JP    NZ,WHAT
  1310. INCM1:
  1311.     INC    HL        ;PT TO FIRST CHAR AFTER DELIMITER
  1312.     CALL    CNVRT        ;GET OFFSET IN DE
  1313.     CP    0DH        ;MUST BE EOL NOW
  1314.     JP    NZ,WHAT
  1315.     LD    B,D        ;BC=OFFSET
  1316.     LD    C,E
  1317.     POP    DE        ;DE=START ADDRESS
  1318.     LD    HL,SYMTAB    ;PT TO TABLE
  1319. ;  MAJOR LOOP FOR SCANNING SYMBOL TABLE -- HL PTS TO LOW SYM ADDRESS BYTE
  1320. INCM2:
  1321.     INC    HL        ;PT TO HI SYM ADDRESS
  1322.     LD    A,(HL)        ;GET HI
  1323.     DEC    HL        ;PT TO LOW SYM ADDRESS
  1324.     CP    D        ;COMPARE
  1325.     JR    C,INCM4        ;SKIP SYMBOL ENTRY
  1326.     JR    NZ,INCM3    ;SYMBOL IS GREATER SO ADD OFFSET TO IT
  1327.     LD    A,(HL)        ;GET LOW
  1328.     CP    E        ;COMPARE
  1329.     JR    C,INCM4        ;SKIP SYMBOL ENTRY
  1330. ;  ADD OFFSET TO SYMBOL ADDRESS PTED TO BY HL
  1331. INCM3:
  1332.     LD    A,(HL)        ;GET LOW ADDRESS BYTE
  1333.     ADD    A,C        ;ADD LOW OFFSET BYTE
  1334.     LD    (HL),A        ;PUT LOW ADDRESS BYTE
  1335.     INC    HL        ;PT TO HI ADDRESS BYTE
  1336.     LD    A,(HL)        ;GET HIGH ADDRESS BYTE
  1337.     ADC    A,B        ;ADD HI OFFSET BYTE
  1338.     LD    (HL),A        ;PUT HI ADDRESS BYTE
  1339.     DEC    HL        ;PT TO LOW ADDRESS BYTE
  1340. ;  SKIP TO NEXT SYMBOL -- HL PTS TO LOW ADDRESS BYTE
  1341. INCM4:
  1342.     INC    HL        ;PT TO HI ADDRESS
  1343.     INC    HL        ;PT TO CHAR COUNT
  1344.     LD    A,(HL)        ;GET CHAR COUNT
  1345.     OR    A        ;DONE IF ZERO
  1346.     JP    Z,GETCMD
  1347.     INC    HL        ;PT TO FIRST CHAR OF SYMBOL
  1348.     ADD    A,L        ;ADD SYMBOL LENGTH TO HL
  1349.     LD    L,A
  1350.     LD    A,0        ;ADD IN HI NOW
  1351.     ADC    A,H
  1352.     LD    H,A        ;HL PTS TO FIRST BYTE OF NEXT SYMBOL
  1353.     JR    INCM2        ;CONTINUE PROCESSING
  1354. ;
  1355. ;COMMAND:  ?
  1356. ;  STATISTIC OUTPUT
  1357. ;
  1358. STAT:
  1359.     CALL    PSTRNG    ;THIS IS RATHER STRAIGHT-FORWARD, SO FEW COMMENTS
  1360.     DEFB    'Scratch Area Start = ',0
  1361.     LD    HL,ENDALL
  1362.     CALL    PVALUE    ;PRINT VALUE
  1363.     CALL    PSTRNG
  1364.     DEFB    0DH,0AH
  1365.     DEFB    'Scratch Area End   = ',0
  1366.     LD    HL,(6)
  1367.     LD    L,0
  1368.     CALL    PVALUE        ;print the beginning of BDOS (not CCP)
  1369.     CALL    PSTRNG
  1370.     DEFB    0DH,0AH,0AH
  1371.     DEFB    'COM Start = 0100',0dh,0ah
  1372.     DEFB    'COM End   = ',0
  1373.     LD    HL,(RELEND)    ;GET END ADDRESS
  1374.     CALL    PVALUE
  1375.     CALL    PSTRNG
  1376.     DEFB    0DH,0AH,0AH
  1377.     DEFB    'SYMTBL = ',0
  1378.     LD    HL,SYMTAB
  1379.     CALL    PVALUE
  1380.     LD    HL,(SYMEND)
  1381.     CALL    PVALUE
  1382.     CALL    CRLF
  1383.     CALL    PSTRNG
  1384.     DEFB    'PC     = ',0
  1385.     LD    HL,(PC)
  1386.     CALL    PVALUE
  1387.     CALL    CRLF
  1388.     CALL    PSTRNG
  1389.     DEFB    'OFFSET = ',0
  1390.     LD    HL,(OFFSET)
  1391.     CALL    PVALUE
  1392.     CALL    CRLF
  1393.     LD    HL,(COMST)
  1394.     LD    A,H
  1395.     OR    L
  1396.     JR    Z,CTLSTT
  1397.     CALL    PSTRNG
  1398.     DEFB    'COMNTS = ',0
  1399.     LD    HL,(COMST)
  1400.     CALL    PVALUE
  1401.     LD    HL,(COMEND)
  1402.     CALL    PVALUE
  1403.     CALL    CRLF
  1404. CTLSTT:
  1405.     CALL    CTLST
  1406.     CALL    CMNTST
  1407.     JP    GETCMD
  1408. ;
  1409. ;  PRINT PARAMETERS OF CONTROL TABLE
  1410. ;
  1411. CTLST:
  1412.     CALL    PSTRNG        ;PRINT THE START AND END OF CONTROL TABLE
  1413.     DEFB    'CTLTBL = ',0
  1414.     LD    HL,CTLTBL
  1415.     CALL    PVALUE
  1416. ;
  1417. ;  FIND THE END OF THE CTLTBL (FF,FF)
  1418. ;
  1419. FNDEND:
  1420.     LD    A,(HL)    ;GET FIRST BYTE
  1421.     INC    HL    ;PT TO NEXT
  1422.     AND    (HL)    ;AND IT IN ... IF BOTH ARE 0FFH, RESULT IS 0FFH
  1423.     INC    HL    ;PT TO CTL LETTER
  1424.     INC    HL    ;PT TO NEXT BYTE OF ADDRESS
  1425.     INC    A    ;IF RESULT WAS 0FFH, A NOW EQUALS 0
  1426.     JR    NZ,FNDEND    ;CONTINUE UNTIL A=0
  1427.     DEC    HL    ;BACK UP TO PREVIOUS ENTRY (END OF TABLE)
  1428.     DEC    HL
  1429.     DEC    HL
  1430.     CALL    PVALUE    ;PRINT THE VALUE 0FFFFH
  1431.     JP    CRLF
  1432. ;
  1433. ;  PRINT THE STATUS MESSAGE OF THE SYMBOL COMMENTS FACILITY
  1434. ;
  1435. CMNTST:
  1436.     CALL    PSTRNG        ;PRINT THE STATUS OF SYMBOL COMMENTS
  1437.     DEFB    'Symbol Comments are O',0
  1438.     LD    A,(XCSW)
  1439.     OR    A
  1440.     LD    A,'N'
  1441.     JR    NZ,CMTST1
  1442.     LD    A,'F'
  1443.     CALL    COUT
  1444. CMTST1:
  1445.     CALL    COUT
  1446.     JP    CRLF
  1447. ;
  1448. ;COMMAND:  F
  1449. ;  FIND THE OCCURRENCE OF ADDRESSES
  1450. ;
  1451. FIND:
  1452.     LD    HL,INBUF+3
  1453.     LD    A,(HL)
  1454.     CP    0DH    ;CHECK FOR NO FURTHER ARGS
  1455.     JR    Z,PREVF
  1456.     CALL    CNVRT    ;GET ARG IN DE
  1457.     EX    DE,HL    ; ... IN HL
  1458.     LD    (FNDADD),HL    ;ADDRESS TO LOOK FOR
  1459.     LD    HL,(OFFSET)    ;GET OFFSET
  1460.     LD    (FNDPC),HL    ;SET START OF SEARCH ADDRESS
  1461.     EX    DE,HL    ;RESTORE HL TO PT TO CHAR IN COMMAND LINE
  1462.     CP    0DH    ;DONE?
  1463.     JR    Z,PREVF
  1464.     CP    ' '    ;<SP> OR ',' MEAN TO CONTINUE
  1465.     JR    Z,FIND0
  1466.     CP    ','
  1467.     JP    NZ,WHAT
  1468. FIND0:
  1469.     INC    HL
  1470.     CALL    CNVRT    ;GET 2ND ARG FOR FIND
  1471.     CP    0DH
  1472.     JP    NZ,WHAT
  1473.     LD    HL,(OFFSET)    ;SET THIS AS STARTING ADDRESS
  1474.     ADD    HL,DE    ;WITH PROPER OFFSET
  1475.     LD    (FNDPC),HL    ;START LOOKING FROM HERE
  1476. ;
  1477. ;  CONTINUE THE PREVIOUS 'F' COMMAND
  1478. ;
  1479. PREVF:
  1480.     LD    HL,(FNDADD)    ;GET ADDRESS WE ARE LOOKING FOR
  1481.     EX    DE,HL        ;... IN DE
  1482. NYET:
  1483.     CALL    BRKCHK    ;CHECK FOR BREAK
  1484.     LD    HL,(FNDPC)    ;PT TO PC
  1485.     LD    A,(HL)        ;GET BYTE AT PC
  1486.     INC    HL        ;PT TO NEXT
  1487.     LD    (FNDPC),HL
  1488.     CP    E        ;COMPARE BYTE WITH ADDRESS WE ARE LOOKING FOR
  1489.     JR    NZ,NYET
  1490.     LD    A,(HL)        ;PARTIAL MATCH -- TRY HIGH BYTE
  1491.     CP    D
  1492.     JR    NZ,NYET
  1493. ;
  1494. ;  WE FOUND ADDRESS IN MEMORY -- PRINT DATA
  1495. ;
  1496.     PUSH    HL
  1497.     PUSH    DE
  1498.     CALL    TWOS
  1499.     DEC    HL
  1500.     CALL    PVALUE    ;PRINT LOCATION OF FOUND ADDRESS (RELATIVE)
  1501.     POP    DE
  1502.     POP    HL
  1503.     CALL    SPACE    ;PRINT <SP>
  1504.     JR    NYET
  1505. ;
  1506. ;  HL=HL-OFFSET
  1507. ;   TAKE 2'S COMPLEMENT OF OFFSET AND ADD TO H & L.
  1508. ;
  1509. TWOS:
  1510.     LD    A,(OFFSET)    ;GET 2'S COMP OF OFFSET IN DE
  1511.     CPL    
  1512.     LD    E,A
  1513.     LD    A,(OFFSET+1)
  1514.     CPL    
  1515.     LD    D,A
  1516.     INC    DE
  1517.     ADD    HL,DE        ;HL=HL+DE
  1518.     RET    
  1519. ;
  1520. ;COMMAND:  Z
  1521. ;   CLOSE THE FILE
  1522. ;
  1523. CLOSE:
  1524.     CALL    HSYM
  1525.     LD    A,1    ;ENABLE WRITING TO DISK FILE
  1526.     LD    (WRTENAB),A
  1527.     CALL    PSTG    ;WRITE END STATEMENT
  1528.     DEFB    'END',0DH,0AH,0
  1529.     XOR    A    ;DISABLE WRITING TO FILE
  1530.     LD    (WRTENAB),A
  1531.     LD    A,(FOPEN)    ;CHECK IF FILE WAS OPEN
  1532.     OR    A
  1533.     JP    Z,GETCMD
  1534.     LD    A,1AH    ;FILL WITH ^Z
  1535.     CALL    WRTFILE
  1536.     CALL    NXTRCRD
  1537.     XOR    A    ;CLOSE FILE
  1538.     LD    (FOPEN),A
  1539.     CALL    PSTRNG    ;PRINT MESSAGE
  1540.     DEFB    '++ ASM File Closed ++',0DH,0AH,0
  1541.     JP    GETCMD
  1542. ;
  1543. ;COMMAND:  R
  1544. ;   READ A FILE OR FILES
  1545. ;
  1546. READ:
  1547.     CALL    SETFCB    ;LOAD THE FCB WITH THE PROPER FILE NAME AND TYPE
  1548.     LD    A,(FOPEN)    ;CHECK TO SEE IF A FILE IS ALREADY OPENED
  1549.     OR    A
  1550.     JP    NZ,CANT    ;ABORT IF SO
  1551.     LD    HL,FCBTYPE    ;CHECK FILE TYPE
  1552.     LD    DE,TPALL    ;IS IT 'ALL'?
  1553.     LD    C,3
  1554.     CALL    CHKSTG
  1555.     JP    NZ,NOTALL    ;PROCEED IF NOT
  1556. ;
  1557. ;  READ IN DOC, SYM, CTL FILES
  1558. ;
  1559.     CALL    ALLRD        ;READ IN ALL FILES
  1560.     JP    STAT        ;PRINT STATISTICS
  1561. ;
  1562. ;  READ IN ALL FILES -- COMMON ROUTINE
  1563. ;
  1564. ALLRD:
  1565.     LD    HL,TPDOC    ;SET FILE TYPE TO DOC
  1566.     CALL    FIXTYP
  1567.     CALL    PSTRNG        ;TELL USER WHAT IS HAPPENING
  1568.     DEFB    0dh,0ah
  1569.     DEFB    'Reading DOC file...',0dh,0ah,0
  1570.     CALL    DOCRD        ;READ FILE IN
  1571.     LD    HL,TPSYM    ;SET FILE TYPE TO SYM
  1572.     CALL    FIXTYP
  1573.     CALL    PSTRNG        ;TELL USER WHAT IS HAPPENING
  1574.     DEFB    'Reading SYM file...',0dh,0ah,0
  1575.     CALL    SYMRD        ;READ FILE IN
  1576.     LD    HL,TPCTL    ;SET FILE TYPE TO CTL
  1577.     CALL    FIXTYP
  1578.     CALL    PSTRNG        ;TELL USER WHAT IS HAPPENING
  1579.     DEFB    'Reading CTL file...',0dh,0ah,0
  1580.     CALL    CTLRD        ;READ FILE IN
  1581.  
  1582.     IF    RDCOMQ        ;ENABLE QUESTION OF COM FILE READ?
  1583.     CALL    PSTRNG
  1584.     DEFB    'Read in COM File (Y/N)? ',0
  1585.     CALL    CHIN        ;GET RESPONSE
  1586.     CP    'Y'
  1587.     JP    NZ,STAT        ;PRINT STATISTICS
  1588.     ENDIF
  1589.     
  1590.     LD    HL,TPCOM    ;SET FILE TYPE TO COM
  1591.     CALL    FIXTYP
  1592.     CALL    PSTRNG        ;TELL USER WHAT IS HAPPENING
  1593.     DEFB    'Reading COM file...',0dh,0ah,0
  1594.     CALL    COMRD        ;READ FILE IN
  1595.     RET
  1596. ;
  1597. ;  SET THE FILE TYPE TO THAT PTED TO BY HL
  1598. ;
  1599. FIXTYP:
  1600.     LD    DE,FCBTYPE
  1601.     LD    B,3
  1602.     XOR    A
  1603.     LD    (FCB+0CH),A    ;zero the extent byte
  1604.     JP    SLIDE
  1605. ;
  1606. ;  FILE TYPE WAS NOT 'ALL', SO CHECK TO SEE WHAT TYPE IT WAS AND PROCESS
  1607. ;
  1608. NOTALL:
  1609.     LD    HL,FCBTYPE    ;CHECK FOR SYM
  1610.     LD    DE,TPSYM
  1611.     LD    C,3
  1612.     CALL    CHKSTG
  1613.     JR    NZ,NOTSYM
  1614.     CALL    SYMRD        ;READ SYM FILE
  1615.     JP    STAT        ;PRINT STATS
  1616. NOTSYM:
  1617.     LD    HL,FCBTYPE    ;CHECK FOR COM
  1618.     LD    DE,TPCOM
  1619.     LD    C,3
  1620.     CALL    CHKSTG
  1621.     JP    NZ,NOTCOM
  1622.     CALL    COMRD        ;READ IN A COM FILE
  1623.     JP    GETCMD        ;CONTINUE COMMAND LINE PROCESSING
  1624. ;
  1625. ;  READ IN COM FILE
  1626. ;
  1627. COMRD:
  1628.     CALL    RDOPEN        ;OPEN COM FILE FOR READ
  1629.     LD    HL,(OFFSET)    ;HL=OFFSET
  1630.     LD    A,H
  1631.     CP    (SYMTAB+600H) SHR 8    ;CHECK FOR NO OVERWRITE OF SYMTABLE
  1632.     JP    C,OSERR
  1633.     LD    DE,0100H    ;SET DMA ADDRESS TO OFFSET PLUS 100H
  1634.     ADD    HL,DE
  1635. SETDMA:
  1636.     PUSH    HL    ;SET THE DMA ADDRESS.
  1637.     EX    DE,HL
  1638.     LD    C,1AH
  1639.     CALL    BDOS
  1640.     LD    DE,FCB    ;READ A RECORD.
  1641.     LD    C,14H
  1642.     CALL    BDOS
  1643.     OR    A    ;DONE?
  1644.     JR    NZ,RDCMPLT
  1645.     POP    HL
  1646.     LD    DE,RECLEN    ;PT TO NEXT BLOCK FOR READ
  1647.     ADD    HL,DE
  1648.     JP    SETDMA    ;CONTINUE
  1649. ;
  1650. ;  DONE WITH LOAD OF COM FILE
  1651. ;
  1652. RDCMPLT:
  1653.     POP    HL    ;GET DMA ADDRESS OF LAST READ
  1654.     CALL    PSTRNG
  1655.     DEFB    'Last Block Read into Memory at ',0
  1656.     CALL    PVALUE
  1657.     CALL    PSTRNG
  1658.     DEFB    0DH,0AH
  1659.     DEFB    'Last Block Ends at Relative ',0
  1660.     CALL    TWOS
  1661.     LD    (RELEND),HL    ;SAVE RELATIVE END ADDRESS
  1662.     CALL    PVALUE
  1663.     CALL    CRLF
  1664.     LD    DE,RECLEN    ;RESET THE DMA ADDRESS TO 80H
  1665.     LD    C,1AH
  1666.     CALL    BDOS
  1667.     RET
  1668. ;
  1669. ;  THE READ IS NOT A .SYM OR A .COM FILE
  1670. ;
  1671. NOTCOM:
  1672.     LD    HL,FCBTYPE    ;CHECK FOR CTL FILE
  1673.     LD    DE,TPCTL
  1674.     LD    C,3
  1675.     CALL    CHKSTG
  1676.     JR    NZ,NOTCTL
  1677.     JP    ISCTL        ;READ IN CTL FILE
  1678. NOTCTL:
  1679.     LD    HL,FCBTYPE    ;CHECK FOR DOC FILE
  1680.     LD    DE,TPDOC
  1681.     LD    C,3
  1682.     CALL    CHKSTG
  1683.     JP    NZ,WHAT        ;ERROR IF NOT COM, SYM, CTL, OR DOC
  1684.     CALL    DOCRD        ;READ IN DOC FILE
  1685.     JP    STAT
  1686. ;
  1687. ;  ERROR -- ATTEMPT TO OVERLAY THE SYMBOL TABLE OR DISASSEMBLER
  1688. ;
  1689. OSERR:
  1690.     CALL    PSTRNG
  1691.     DEFB    '++ NO, that would overlay '
  1692.     DEFB    'the Disassembler',0DH,0AH
  1693.     DEFB    'because the Offset is too small: '
  1694.     DEFB    0
  1695.     CALL    PRNTOS
  1696.     CALL    PSTRNG
  1697.     DEFB    ' ++',0DH,0AH,0
  1698.     RET
  1699. ;
  1700. ;  READ THE SYMBOL TABLE FROM DISK
  1701. ;
  1702. SYMRD:
  1703.     LD    HL,SYMTAB    ;PT TO SYMBOL TABLE
  1704.     CALL    READFILE    ;READ FILE INTO IT
  1705.     LD    (SYMEND),HL    ;SET END ADDRESS OF SYMBOL TABL
  1706.     INC    HL        ;PT TO NEXT SYMBOL CHAR COUNT
  1707.     INC    HL
  1708.     LD    (HL),0        ;SET CHAR COUNT TO ZERO
  1709.     RET    
  1710. ;
  1711. ;  READ THE DOC (COMMENTS) FILE FROM DISK
  1712. ;
  1713. DOCRD:
  1714.     CALL    AREACK        ;MAKE SURE COMMENTS AREA DEFINED
  1715.     LD    HL,(COMST)    ;PT TO START OF COMMENTS AREA
  1716.     CALL    READFILE    ;READ FILE IN
  1717.     LD    (COMEND),HL    ;SET END OF COMMENTS AREA
  1718.     LD    (HL),0FFH    ;STORE 0FFFFH AS ADDRESS OF NEXT COMMENT
  1719.     INC    HL
  1720.     LD    (HL),0FFH
  1721.     RET    
  1722. ;
  1723. ;  READ FILE SET IN FCB INTO MEMORY PTED TO BY HL
  1724. ;
  1725. READFILE:
  1726.     CALL    RDOPEN    ;OPEN FILE
  1727. RDFL1:
  1728.     CALL    READMA    ;READ NEXT BYTE (RETURNED IN A)
  1729.     CP    1AH    ;RETURN IF EOF EACHED
  1730.     RET    Z
  1731.     CP    9    ;IGNORE <TAB>, <CR>, <LF>
  1732.     JR    Z,RDFL1
  1733.     CP    0DH
  1734.     JR    Z,RDFL1
  1735.     CP    0AH
  1736.     JR    Z,RDFL1
  1737.     CALL    NUM1    ;CONVERT FROM HEX CHARS TO VALUE IN DE
  1738.     LD    (HL),E    ;SAVE THE ADDRESS
  1739.     INC    HL
  1740.     LD    (HL),D
  1741.     INC    HL
  1742.     PUSH    HL
  1743.     INC    HL
  1744.     LD    B,0    ;COUNT CHARS IN SYMBOL
  1745. SYMLUP:
  1746.     CALL    READMA    ;GET NEXT BYTE
  1747.     CP    9    ;DONE IF <TAB> OR <CR>
  1748.     JR    Z,SYMTERM
  1749.     CP    0DH
  1750.     JR    Z,SYMTERM
  1751.     LD    (HL),A    ;STORE BYTE
  1752.     INC    HL    ;PT TO NEXT
  1753.     INC    B    ;INCR CHAR COUNT
  1754.     JR    SYMLUP
  1755. SYMTERM:
  1756.     EX    (SP),HL
  1757.     LD    (HL),B
  1758.     POP    HL
  1759.     JP    RDFL1
  1760. ;
  1761. ;  READ NUMBER FROM DISK FILE (1ST HEX DIGIT IN A ON ENTRY)
  1762. ;    VALUE RETURNED IN DE
  1763. ;
  1764. NUM1:
  1765.     LD    DE,0    ;INIT NUMBER TO ZERO
  1766. LUP1:
  1767.     CP    ' '    ;DONE IF <SP>
  1768.     RET    Z
  1769.     CP    1AH    ;ERROR IF EOF
  1770.     JP    Z,ERROR1
  1771.     CP    '9'+1    ;WITHIN DIGIT RANGE?
  1772.     JR    C,NUMER1    ;IS A DIGIT
  1773.     SUB    7    ;CONVERT 'A' TO 'F' TO '9'+1 TO 'E'+1
  1774. NUMER1:
  1775.     SUB    '0'    ;CONVERT TO BINARY IN A
  1776.     EX    DE,HL    ;OLD VALUE IN HL
  1777.     ADD    HL,HL    ;*2
  1778.     ADD    HL,HL    ;*4
  1779.     ADD    HL,HL    ;*8
  1780.     ADD    HL,HL    ;*16
  1781.     ADD    A,L    ;+A
  1782.     LD    L,A    ;ONLY CHANGES LOW-ORDER BYTE
  1783.     EX    DE,HL    ;VALUE BACK IN DE
  1784.     CALL    READMA
  1785.     CP    1AH
  1786.     JP    Z,ERROR1
  1787.     JR    LUP1
  1788. ;
  1789. ;COMMAND:  S
  1790. ;  SAVE THE FILES
  1791. ;
  1792. SAVE:
  1793.     CALL    SETFCB        ;LOAD THE FCB FROM THE COMMAND LINE
  1794.     LD    A,(FOPEN)    ;CHECK FOR FILE ALREADY OPEN
  1795.     OR    A        ;ABORT IF SO
  1796.     JP    NZ,CANT
  1797.     LD    HL,FCBTYPE    ;CHECK FOR TYPE OF 'ALL'
  1798.     LD    DE,TPALL
  1799.     LD    C,3
  1800.     CALL    CHKSTG
  1801.     JP    NZ,NTALL    ;CHECK FOR SPECIFIC TYPE IF NOT ALL
  1802.     LD    HL,TPDOC    ;SAVE DOC FILE
  1803.     CALL    FIXTYP
  1804.     CALL    PSTRNG
  1805.     DEFB    0dh,0ah
  1806.     DEFB    'Saving .DOC file...',0dh,0ah,0
  1807.     CALL    DOCSV
  1808.     LD    HL,TPSYM    ;SAVE SYM FILE
  1809.     CALL    FIXTYP
  1810.     CALL    PSTRNG
  1811.     DEFB    'Saving .SYM file...',0dh,0ah,00
  1812.     CALL    SYMSV
  1813.     LD    HL,TPCTL    ;SAVE CTL FILE
  1814.     CALL    FIXTYP
  1815.     CALL    PSTRNG
  1816.     DEFB    'Saving .CTL file...',0dh,0ah,0
  1817.     CALL    SVCTL0
  1818.     CALL    PSTRNG        ;OPTIONALLY SAVE ASM FILE
  1819.     DEFB    'Create a New .ASM File (Y/N)? ',0
  1820.     CALL    CHIN    ;GET CHAR
  1821.     CP    'Y'
  1822.     JP    NZ,GETCMD
  1823.     LD    HL,TPASM    ;SAVE ASM FILE
  1824.     CALL    FIXTYP
  1825. ;
  1826. ;  SAVE THE ASM FILE
  1827. ;
  1828. SVASM:
  1829.     LD    A,1    ;MARK FILE AS OPEN
  1830.     LD    (FOPEN),A
  1831.     XOR    A    ;DISABLE WRITING AT THIS TIME
  1832.     LD    (WRTENAB),A
  1833.     CALL    OPEN    ;OPEN FILE FOR OUTPUT
  1834.     CALL    PSTRNG    ;PRINT MESSAGE
  1835.     DEFB    '++ Writing ASM Enabled'
  1836.     DEFB    0DH,0AH,'Use Z Command or '
  1837.     DEFB    'E Control to Close File ++'
  1838.     DEFB    0DH,0AH,0
  1839.     JP    GETCMD    ;NOW PROCESS USER'S NEXT COMMANDS
  1840. ;
  1841. ;  TYPE WAS NOT ALL, SO CHECK FOR SPECIFIC FILE TYPES
  1842. ;
  1843. NTALL:
  1844.     LD    HL,FCBTYPE    ;CHECK FOR SYM
  1845.     LD    DE,TPSYM
  1846.     LD    C,3
  1847.     CALL    CHKSTG
  1848.     JP    NZ,NTSYM
  1849.     CALL    SYMSV
  1850.     JP    GETCMD
  1851. ;
  1852. ;  ROUTINE TO SAVE THE SYMBOL TABLE
  1853. ;
  1854. SYMSV:
  1855.     LD    HL,SYMTAB    ;PT TO SYMBOL TABLE
  1856. SVFL:
  1857.     CALL    OPEN    ;OPEN THE FILE
  1858. LUP2:
  1859.     LD    E,(HL)    ;GET ADDRESS OF SYMBOL IN DE
  1860.     INC    HL
  1861.     LD    D,(HL)
  1862.     INC    HL
  1863.     LD    A,(HL)    ;GET LENGTH OF SYMBOL IN A
  1864.     INC    HL
  1865.     LD    B,A    ;... AND B
  1866.     OR    A    ;DONE IF LENGTH IS ZERO
  1867.     JP    Z,WRTEOF    ;WRITE EOF TO FILE IF DONE
  1868.     CALL    EXPND    ;WRITE ADDRESS IN DE AS ASCII CHARS ON DISK
  1869.     LD    A,' '    ;OUTPUT <SP>
  1870.     CALL    WRTFILE
  1871. WRTSYM:
  1872.     LD    A,(HL)    ;GET NEXT CHAR OF SYMBOL
  1873.     CALL    WRTFILE    ;WRITE TO DISK
  1874.     INC    HL    ;PT TO NEXT
  1875.     DJNZ    WRTSYM    ;COUNT DOWN SIZE OF SYMBOL
  1876.     LD    A,0DH    ;WRITE NEW LINE CHARS
  1877.     CALL    WRTFILE
  1878.     LD    A,0AH
  1879.     CALL    WRTFILE
  1880.     JR    LUP2
  1881. ;
  1882. ;  WRITE AN EOF
  1883. ;
  1884. WRTEOF:
  1885.     LD    A,1AH    ;WRITE EOF
  1886.     CALL    WRTFILE
  1887.     CALL    NXTRCRD
  1888.     RET    
  1889. ;
  1890. ;  EXPAND AN ADDRESS IN DE TO ASCII CHARS AND SAVE ON DISK
  1891. ;
  1892. EXPND:
  1893.     LD    A,D    ;OUTPUT HIGH NYBBLE OF HIGH-ORDER BYTE
  1894.     CALL    HINIB    ;ROUTINE TO DO THIS
  1895.     CALL    WRTFILE    ;WRITE ASCII CHAR IN A TO DISK
  1896.     LD    A,D    ;OUTPUT LOW NYBBLE
  1897.     CALL    LONIB
  1898.     CALL    WRTFILE
  1899.     LD    A,E    ;HIGH OF LOW-ORDER BYTE
  1900.     CALL    HINIB
  1901.     CALL    WRTFILE
  1902.     LD    A,E    ;LOW OF LOW-ORDER BYTE
  1903.     CALL    LONIB
  1904.     JP    WRTFILE
  1905. ;
  1906. ;  NOT OF TYPE SYM -- CHECK FOR CTL
  1907. ;
  1908. NTSYM:
  1909.     LD    HL,FCBTYPE    ;CHECK FOR CTL TYPE
  1910.     LD    DE,TPCTL
  1911.     LD    C,3
  1912.     CALL    CHKSTG
  1913.     JP    Z,SVCTL        ;YES, SO SAVE CTL FILE
  1914.     LD    HL,FCBTYPE    ;CHECK FOR DOC TYPE
  1915.     LD    DE,TPDOC
  1916.     LD    C,3
  1917.     CALL    CHKSTG
  1918.     JR    Z,SVDOC        ;YES, SO SAVE DOC FILE
  1919.     LD    HL,FCBTYPE    ;CHECK FOR ASM TYPE
  1920.     LD    DE,TPASM
  1921.     LD    C,3
  1922.     CALL    CHKSTG
  1923.     JP    NZ,WHAT        ;ERROR IF NOT ASM AT THIS POINT
  1924.     JP    SVASM        ;SAVE ASSEMBLY LANGUAGE (TYPE ALREADY ASM)
  1925. ;
  1926. ;  SAVE THE COMMENT TABLE
  1927. ;
  1928. SVDOC:
  1929.     CALL    DOCSV
  1930.     JP    GETCMD    
  1931. ;
  1932. ;  SAVE COMMENTS
  1933. ;
  1934. DOCSV:
  1935.     CALL    AREACK    ;FIND END OF COMMENTS
  1936.     LD    HL,(COMEND)    ;GET PTR IN HL
  1937.     INC    HL
  1938.     INC    HL
  1939.     LD    (HL),0    ;SET NULL FINAL COMMENT
  1940.     LD    HL,(COMST)    ;PT TO START OF TABLE
  1941.     JP    SVFL    ;PERFORM STRAIGHT SAVE
  1942. ;
  1943. ;  ATTEMPT TO OPEN ANOTHER FILE WHILE ASM FILE ALREADY OPENED
  1944. ;
  1945. CANT:
  1946.     CALL    PSTRNG
  1947.     DEFB    '++ No File Accessed Permitted '
  1948.     DEFB    'until ASM Closed ++',0DH,0AH
  1949.     DEFB    0
  1950.     JP    GETCMD
  1951. ;
  1952. ;  EOF ENCOUNTERED TOO SOON
  1953. ;
  1954. ERROR1:
  1955.     CALL    PSTRNG
  1956.     DEFB    '++ Unexpected EOF ++',0DH,0AH
  1957.     DEFB    0
  1958.     JP    GETCMD
  1959. ;
  1960. ;COMMAND:  C
  1961. ;  CONTROL TABLE ENTRIES ARE MADE HERE
  1962. ;
  1963. CTL:
  1964.     CALL    IECNT    ;INIT ECNT
  1965.     LD    HL,INBUF+3
  1966.     LD    A,(HL)
  1967.     CP    0DH    ;DUMP CONTROL TABLE IF JUST A 'C' COMMAND
  1968.     JP    Z,CDUMP1
  1969.     CALL    CNVRT    ;GET ADDRESS
  1970.     CP    0DH    ;ERROR?
  1971.     JP    Z,CDUMP    ;DUMP IF SO
  1972.     CP    ' '    ;DELIMITER?
  1973.     JR    Z,CTL0    ;PROCESS 2ND OPERAND IF SO
  1974.     CP    ','    ;SAME
  1975.     JP    NZ,WHAT    ;ERROR OTHERWISE
  1976. CTL0:
  1977.     INC    HL    ;PT TO 2ND OPERAND
  1978.     LD    A,(HL)    ;GET IT (CONTROL TYPE)
  1979.     CALL    FTCTL    ;PROCESS ENTRY WITH CONTROL TABLE
  1980.     JP    GETCMD
  1981. ;
  1982. ;  PLACE A NEW ENTRY INTO THE CONTROL TABLE
  1983. ;    A=TYPE OF ENTRY (B, E, I, K, S, W) AND DE=ADDRESS
  1984. ;
  1985. FTCTL0:
  1986.     PUSH    HL    ;SAVE REGS
  1987.     PUSH    DE    ;NEW ADDRESS
  1988.     PUSH    AF    ;NEW TYPE
  1989.     CALL    SCHCTL    ;FIND ENTRY IN CONTROL TABLE
  1990.     DEC    HL    ;PT TO TYPE OF PREVIOUS CONTROL ENTRY
  1991.     JR    C,FTCTL1    ;IF CARRY, WE DIDN'T MATCH
  1992.     INC    HL    ;PT TO TYPE OF CURRENT ENTRY WHICH MATCHES
  1993.     INC    HL
  1994.     INC    HL
  1995. FTCTL1:
  1996.     POP    AF    ;GET NEW TYPE AND
  1997.     POP    DE    ;... ADDRESS
  1998.     CP    (HL)    ;DO OUR TYPES MATCH?
  1999.     POP    HL    ;RESTORE HL
  2000.     RET    Z    ;NO CHANGE IF THEY DO
  2001. ;
  2002. ;  PLACE A NEW ENTRY INTO THE CONTROL TABLE
  2003. ;
  2004. FTCTL:
  2005.     LD    (OPCTP),A    ;SAVE TYPE OF ENTRY
  2006.     CALL    SCHCTL    ;SCAN FOR A MATCH
  2007.     JP    C,PLACE    ;NO MATCH, SO ENTRY MUST BE ADDED
  2008. ;
  2009. ;  MATCH OF ADDRESS, SO SIMPLY CHANGE CONTROL MODE AT THAT POINT
  2010. ;
  2011.     LD    A,(OPCTP)    ;GET TYPE OF ENTRY
  2012.     CP    'I'    ;INSTRUCTION?
  2013.     JR    Z,RNCTL
  2014.     CP    'W'    ;DW?
  2015.     JR    Z,RNCTL
  2016.     CP    'H'    ;DB HEX?
  2017.     JR    Z,RNCTL
  2018.     CP    'B'    ;DB?
  2019.     JR    Z,RNCTL
  2020.     CP    'S'    ;DS?
  2021.     JR    Z,RNCTL
  2022.     CP    'E'    ;END OF PROGRAM?
  2023.     JR    Z,RNCTL
  2024.     CP    'K'    ;KILL SYMBOL?
  2025.     JR    Z,DELCTL
  2026.     JP    WHAT    ;ERROR IF NONE OF THESE
  2027. ;
  2028. ;  READ A NEW CONTROL MODE
  2029. ;    ENTRY FORM IS:
  2030. ;    DW ADDRESS
  2031. ;    DB CONTROL MODE
  2032. ;
  2033. RNCTL:
  2034.     INC    HL        ;ADDRESS IS SAME
  2035.     INC    HL        ;PT TO CONTROL MODE
  2036.     LD    (HL),A        ;ONLY SET NEW CONTROL MODE
  2037.     RET    
  2038. ;
  2039. ;  DELETE THE ENTRY FROM THE CONTROL TABLE
  2040. ;
  2041. DELCTL:
  2042.     EX    DE,HL    ;DE PTS TO ENTRY TO DELETE
  2043.     LD    HL,3
  2044.     ADD    HL,DE    ;HL PTS TO NEXT ENTRY
  2045.     EX    DE,HL    ;DE PTS TO NEXT ENTRY, HL PTS TO ENTRY TO DELETE
  2046. ;
  2047. ;  COPY CONTROL TABLE DOWN
  2048. ;
  2049. CMPCT:
  2050.     LD    A,(HL)    ;CHECK FOR END OF CONTROL TABLE
  2051.     INC    HL
  2052.     AND    (HL)    ;ADDRESS IS 0FFFFH IF END
  2053.     DEC    HL
  2054.     INC    A    ;A=0 MEANS ADDRESS IS 0FFFFH
  2055.     JR    Z,PNTHLL
  2056.     LD    BC,3    ;NOT AT END -- COPY 3 BYTES DOWN AND CONTINUE
  2057.     EX    DE,HL    ;HL PTS TO SOURCE, DE TO DEST
  2058.     LDIR        ;COPY THE 3 BYTES
  2059.     EX    DE,HL    ;DE PTS TO NEXT ENTRY, HL PTS TO ENTRY TO DELETE
  2060.     JR    CMPCT    ;CONTINUE COPY OPERATION
  2061. ;
  2062. ;  COPY COMPLETE
  2063. ;
  2064. PNTHLL:
  2065.     CALL    CTLST    ;PRINT CONTROL TABLE INFORMATION
  2066.     JP    GETCMD
  2067. ;
  2068. ;  PLACE AN ENTRY INTO THE CONTROL TABLE
  2069. ;    ON ENTRY, HL PTS TO ENTRY TO INSERT BEFORE
  2070. ;
  2071. PLACE:
  2072.     LD    A,(OPCTP)    ;GET TYPE OF COMMAND
  2073.     CP    'K'        ;ERROR IF KILL
  2074.     JP    Z,WHAT
  2075.     CP    'E'        ;SET END OF PROGRAM AREA
  2076.     JR    Z,LGLCTL
  2077.     CP    'H'        ;DB HEX
  2078.     JR    Z,LGLCTL
  2079.     CP    'B'        ;DB
  2080.     JR    Z,LGLCTL
  2081.     CP    'W'        ;DW
  2082.     JR    Z,LGLCTL
  2083.     CP    'I'        ;INSTRUCTION
  2084.     JR    Z,LGLCTL
  2085.     CP    'S'        ;DS
  2086.     JP    NZ,WHAT        ;ERROR IF NONE OF THESE
  2087. ;
  2088. ;  PLACE ENTRY INTO CONTROL TABLE; A=TYPE, DE=ADDRESS, HL=ADDR OF ENTRY
  2089. ;    TO INSERT BEFORE
  2090. ;
  2091. LGLCTL:
  2092.     PUSH    DE        ;SAVE ADDRESS
  2093.     PUSH    HL        ;SAVE ADDRESS OF ENTRY TO INSERT BEFORE
  2094.     LD    HL,CTLTBL    ;PT TO FRONT OF TABLE
  2095. ;
  2096. ;  LOOP TO THE END OF THE TABLE
  2097. ;
  2098. LP2END:
  2099.     LD    A,(HL)        ;CHECK FOR 0FFFFH AT END OF TABLE
  2100.     INC    HL
  2101.     AND    (HL)        ;A=0FFH IF SO
  2102.     INC    HL        ;PT TO CURR CONTROL TYPE
  2103.     INC    HL        ;PT TO NEXT CONTROL ADDRESS
  2104.     INC    A        ;A=0 AND ZERO FLAG SET IF AT END
  2105.     JR    NZ,LP2END    ;CONTINUE UNTIL AT END OF TABLE
  2106.     LD    D,H        ;DE=HL=PTR TO NEW LAST TABLE ENTRY LOC
  2107.     LD    E,L
  2108.     INC    HL        ;PT TO ENTRY AFTER LAST ENTRY IN TABLE
  2109.     INC    HL
  2110.     INC    HL        ;HL PTS TO NEW LAST TABLE ENTRY LOCATION
  2111.     EX    DE,HL        ;DE PTS TO NEW, HL PTS TO OLD
  2112.     POP    BC        ;BC=ADDRESS OF ENTRY TO INSERT BEFORE
  2113. ;
  2114. ;  EXPAND THE TABLE BY 3 PLACES UNTIL THE PROPER PLACE IS REACHED
  2115. ;
  2116. EXPTBL:
  2117.     DEC    HL        ;BACK UP
  2118.     DEC    DE
  2119.     LD    A,(HL)        ;COPY PREVIOUS BYTE INTO NEW TABLE LOCATION
  2120.     LD    (DE),A
  2121.     LD    A,L        ;ARE WE AT ENTRY TO INSERT BEFORE?
  2122.     CP    C
  2123.     JR    NZ,EXPTBL    ;CONTINUE IF NOT
  2124.     LD    A,H        ;CHECK HIGH BYTES
  2125.     CP    B
  2126.     JR    NZ,EXPTBL
  2127.     POP    DE        ;DE=NEW ENTRY ADDRESS, HL=ADDRESS TO INSERT AT
  2128.     LD    (HL),E        ;PLACE NEW ENTRY ADDRESS INTO TABLE
  2129.     INC    HL
  2130.     LD    (HL),D
  2131.     INC    HL
  2132.     LD    A,(OPCTP)    ;PLACE NEW ENTRY TYPE INTO TABLE
  2133.     LD    (HL),A
  2134.     RET    
  2135. ;
  2136. ;  SEARCH CTL TBL FOR AN ENTRY FOR (DE)
  2137. ;    ON EXIT, HL PTS TO LOW-ORDER BYTE OF CONTROL TABLE ENTRY IF MATCHED
  2138. ;      OR LESS THAN
  2139. ;    MATCH: C=0
  2140. ;    NO MATCH:  C=1
  2141. ;
  2142. SCHCTL:
  2143.     LD    HL,CTLTBL    ;PT TO TABLE
  2144. ;
  2145. ;  IF NO MATCH THEN CARRY IS SET
  2146. ;
  2147. SMORE:
  2148.     LD    A,(HL)    ;GET LOW ADDRESS
  2149.     INC    HL    ;PT TO HIGH
  2150.     AND    (HL)    ;AND IN HIGH ADDRESS; IF ADDR=0FFFFH, THEN A=0FFH
  2151.     DEC    HL    ;PT TO LOW ADDRESS
  2152.     INC    A    ;IF A=0FFH BEFORE, NOW A=0
  2153.     SCF        ;SET CARRY FLAG FOR ERROR RETURN
  2154.     RET    Z    ;RETURN IF A=0 (WE ARE AT END OF TABLE)
  2155.     INC    HL    ;PT TO HIGH ADDRESS
  2156.     LD    A,D    ;GET ADDRESS TO COMPARE AGAINST
  2157.     CP    (HL)    ;DO COMPARE
  2158.     DEC    HL    ;PT TO LOW ADDRESS
  2159.     RET    C    ;RETURN IF ADDRESS IS LESS THAN TABLE ENTRY
  2160.     JR    NZ,NXTRY    ;CONTINUE IF NOT THE SAME
  2161.     LD    A,E    ;GET LOW ADDRESS
  2162.     CP    (HL)    ;COMPARE TO LOW ADDRESS
  2163.     RET    Z    ;CARRY IS OFF AND ZERO IS SET IF COMPLETE MATCH
  2164.     RET    C    ;CARRY IS ON AND ZERO IS NOT SET IF TARGET IS LESS
  2165. ;
  2166. ;  ADVANCE TO THE NEXT TABLE ENTRY
  2167. ;
  2168. NXTRY:
  2169.     INC    HL    ;PT TO HIGH ADDRESS
  2170.     INC    HL    ;PT TO TYPE OF NEXT CONTROL ENTRY
  2171.     INC    HL    ;PT TO LOW ADDRESS OF NEXT ENTRY IN TABLE
  2172.     JR    SMORE    ;CONTINUE
  2173. ;
  2174. ;  DUMP CONTROL TABLE FROM ADDRESS IN DE
  2175. ;
  2176. CDUMP:
  2177.     CALL    SCHCTL    ;FIND ENTRY IN CONTROL TABLE >= ADDRESS IN DE
  2178.     JR    CDUMP2
  2179. ;
  2180. ;  DUMP ENTIRE CONTROL TABLE
  2181. ;
  2182. CDUMP1:
  2183.     LD    HL,CTLTBL    ;PT TO FIRST ENTRY IN CONTROL TABLE
  2184. CDUMP2:
  2185.     CALL    BRKCHK    ;CHECK FOR ABORT
  2186.     LD    E,(HL)    ;GET ADDRESS OF CONTROL ENTRY IN DE
  2187.     INC    HL
  2188.     LD    D,(HL)
  2189.     INC    HL
  2190.     LD    A,D    ;CHECK FOR END OF TABLE
  2191.     AND    E    ;END IF DE=0FFFFH
  2192.     INC    A    ;SET A TO 0 IF SO
  2193.     JR    NZ,MOREDMP
  2194.     CALL    CRLF    ;DONE, SO OUTPUT NEW LINE AND PRINT CONTROL INFO
  2195.     CALL    CTLST
  2196.     JP    GETCMD
  2197. ;
  2198. ;  DUMP CONTROL TABLE ENTRY TO USER
  2199. ;
  2200. MOREDMP:
  2201.     PUSH    DE
  2202.     PUSH    HL
  2203.     CALL    SYMSCH    ;SEARCH FOR A SYMBOL WHOSE VALUE = ADDRESS IN DE
  2204.     JR    C,AHEAD    ;SKIP IF NOT FOUND
  2205. ;
  2206. ;   PRINT A SYMBOL SINCE IT WAS FOUND; SYMBOL PTED TO BY HL
  2207. ;
  2208.     CALL    IECNT    ;INIT ECNT
  2209.     CALL    CRLF    ;NEW LINE
  2210. PRNTSYM:
  2211.     LD    A,(HL)    ;OUTPUT CHARS OF SYMBOL
  2212.     CALL    COUT    ;... COUNT IN B FROM SYMSCH
  2213.     INC    HL
  2214.     DJNZ    PRNTSYM
  2215.     LD    A,':'    ;OUTPUT COLON AFTER SYMBOL
  2216.     CALL    COUT
  2217. ;
  2218. ;  OUTPUT CONTROL TABLE ENTRY
  2219. ;
  2220. AHEAD:
  2221.     POP    HL    ;GET PTR TO CONTROL MODE
  2222.     POP    DE    ;GET ADDRESS OF ENTRY
  2223.     CALL    SPACE    ;2 <SP>S
  2224.     CALL    SPACE
  2225.     EX    DE,HL    ;ADDRESS IN HL
  2226.     CALL    PVALUE    ;PRINT VALUE OF ADDRESS
  2227.     LD    A,'='    ;PRINT DELIMITERS
  2228.     CALL    COUT
  2229.     LD    A,' '
  2230.     CALL    COUT
  2231.     EX    DE,HL    ;RESTORE HL AS PTR TO CONTROL MODE
  2232.     LD    A,(HL)    ;GET CONTROL MODE LETTER
  2233.     CALL    COUT    ;PRINT IT
  2234.     CALL    SPACE    ;<SP> OUT
  2235.     CALL    SPACE
  2236.     CALL    SPCRLF    ;OUTPUT NEW LINE OCCASIONALLY
  2237.     INC    HL    ;PT TO NEXT CONTROL TABLE ENTRY
  2238.     JR    CDUMP2
  2239. ;
  2240. ;  SAVE THE CONTROL TABLE ON DISK
  2241. ;
  2242. SVCTL:
  2243.     CALL    SVCTL0    ;USE ROUTINE
  2244.     JP    GETCMD
  2245. ;
  2246. ;  ROUTINE TO SAVE THE CONTROL TABLE ON DISK
  2247. ;
  2248. SVCTL0:
  2249.     CALL    OPEN    ;OPEN FILE
  2250.     LD    HL,CTLTBL    ;PT TO TABLE
  2251. SVCTL1:
  2252.     LD    E,(HL)    ;GET ADDRESS IN DE
  2253.     INC    HL
  2254.     LD    D,(HL)
  2255.     INC    HL
  2256.     LD    A,D    ;CHECK FOR END (0FFFFH)
  2257.     AND    E
  2258.     INC    A    ;A=0 IF SO
  2259.     JR    Z,CTLSVED
  2260.     CALL    EXPND    ;OUTPUT ADDRESS IN DE AS 4 HEX CHARS
  2261.     LD    A,','    ;OUTPUT COMMA
  2262.     CALL    WRTFILE
  2263.     LD    A,(HL)    ;OUTPUT CONTROL MODE CHAR
  2264.     CALL    WRTFILE
  2265.     LD    A,0DH    ;OUTPUT NEW LINE
  2266.     CALL    WRTFILE
  2267.     LD    A,0AH
  2268.     CALL    WRTFILE
  2269.     INC    HL    ;PT TO NEXT CONTROL TABLE ENTRY
  2270.     JR    SVCTL1
  2271. ;
  2272. ;  THE CONTROL TABLE HAS BEEN SAVED
  2273. ;
  2274. CTLSVED:
  2275.     LD    A,1AH    ;WRITE EOF
  2276.     CALL    WRTFILE
  2277.     CALL    NXTRCRD
  2278.     RET
  2279. ;
  2280. ;  READ IN A CONTROL TABLE
  2281. ;
  2282. ISCTL:
  2283.     CALL    CTLRD    ;READ CONTROL FILE
  2284.     JP    STAT    ;PRINT STATISTICS
  2285. ;
  2286. ;  ROUTINE TO READ IN A CONTROL TABLE
  2287. ;
  2288. CTLRD:
  2289.     CALL    RDOPEN    ;OPEN FILE FOR READING
  2290.     LD    HL,CTLTBL    ;PT TO CONTROL TABLE
  2291. LUP:
  2292.     CALL    READMA    ;READ NEXT CHAR
  2293.     LD    DE,0    ;SET VALUE = 0
  2294. NUMLUP:
  2295.     CP    1AH    ;ERROR IF EOF ENCOUNTERED
  2296.     JR    Z,TERMF
  2297.     CP    ','    ;DONE WITH NUMBER IF COMMA FOUND
  2298.     JR    Z,STRDE
  2299.     CP    '9'+1    ;CHECK FOR DIGIT
  2300.     JR    C,NUM    ;PROCESS IF SO
  2301.     SUB    7    ;ADJUST FOR 'A'-'F'
  2302. NUM:
  2303.     SUB    '0'    ;CONVERT HEX ASCII TO BINARY
  2304.     EX    DE,HL    ;VALUE IN HL
  2305.     ADD    HL,HL    ;*2
  2306.     ADD    HL,HL    ;*4
  2307.     ADD    HL,HL    ;*8
  2308.     ADD    HL,HL    ;*16
  2309.     ADD    A,L    ;ADD IN NEW VALUE
  2310.     LD    L,A
  2311.     EX    DE,HL    ;VALUE BACK IN DE
  2312.     CALL    READMA    ;READ NEXT CHAR
  2313.     JR    NUMLUP    ;CONTINUE
  2314. ;
  2315. ;  STORE THE ADDRESS ACCUMULATED IN DE INTO THE CONTROL TABLE
  2316. ;
  2317. STRDE:
  2318.     LD    (HL),E    ;STORE ADDRESS
  2319.     INC    HL
  2320.     LD    (HL),D
  2321.     INC    HL
  2322.     CALL    READMA    ;READ CONTROL MODE CHAR
  2323.     LD    (HL),A    ;STORE IT
  2324.     INC    HL    ;PT TO NEXT CONTROL TABLE ENTRY
  2325.     JR    LUP
  2326. ;
  2327. ;  STORE ENDING 0FFFFH IN CONTROL TABLE
  2328. ;
  2329. TERMF:
  2330.     LD    (HL),0FFH
  2331.     INC    HL
  2332.     LD    (HL),0FFH
  2333.     RET
  2334. ;
  2335. ;COMMAND:  ;
  2336. ;  COMMENT ROUTINE.  IT ADDS OR LISTS COMMENTS
  2337. ;
  2338. CMNT:
  2339.     CALL    AREACK    ;VERIFY THAT COMMENT TABLE EXISTS
  2340.     LD    HL,INBUF+3    ;PT TO CHAR AFTER COMMAND
  2341.     LD    A,(HL)    ;GET IT
  2342.     CP    0DH    ;DONE?
  2343.     JP    Z,LSTCMT    ;YES, SO LIST COMMENTS
  2344.     CP    'O'        ;LOOK FOR 'ON/OFF' SWITCH
  2345.     JR    NZ,CMNT1
  2346.     INC    HL
  2347.     LD    A,(HL)        ;SECOND CHARACTER OF THE COMMENT
  2348.     SBC    A,'F'        ;CREATE A 0 FOR 'OFF'
  2349.     JR    Z,CMNT2
  2350.     CP    'N'-'F'        ;LOOK FOR AN 'N' (FOR 'ON')
  2351.     JP    NZ,WHAT
  2352. CMNT2:
  2353.     LD    (XCSW),A    ;TURN OFF COMMENTS
  2354.     JP    GETCMD
  2355. ;
  2356. ;  PROCESS NEW COMMENT ENTRY
  2357. ;
  2358. CMNT1:
  2359.     CALL    CNVRT    ;GET ADDRESS IN DE
  2360.     INC    HL    ;PT TO NEXT CHAR
  2361.     CP    0DH    ;IF DONE, WE DELETE COMMENT
  2362.     JP    Z,ONECMT
  2363.     CP    ' '    ;<SP> OR ',' SAYS TEXT FOLLOWS
  2364.     JR    Z,CMNT0
  2365.     CP    ','
  2366.     JP    NZ,WHAT    ;ERROR IF NOT <CR>, <SP>, OR ','
  2367. CMNT0:
  2368.     PUSH    HL    ;SAVE PTR TO NEXT CHAR
  2369.     CALL    CMCHK    ;CHECK FOR COMMENT ALREADY AT ADDRESS IN DE
  2370.     JR    C,ADDCMT    ;IF NOT, JUST ADD COMMENT
  2371.     CALL    DELCMT    ;IF SO, FIRST DELETE EXISTING COMMENT
  2372. ;
  2373. ;  ADD COMMENT TO COMMENT TABLE
  2374. ;
  2375. ADDCMT:
  2376.     POP    HL    ;GET PTR
  2377.     PUSH    HL
  2378.     LD    A,(HL)    ;CHECK FOR ANY TEXT
  2379.     CP    0DH    ;IF NONE, OLD COMMENT IS JUST DELETED
  2380.     JP    Z,GETCMD
  2381.     LD    HL,(COMEND)    ;PT TO END OF COMMENT TABLE
  2382.     LD    (HL),E    ;SAVE NEW ADDRESS OF COMMENT
  2383.     INC    HL
  2384.     LD    (HL),D
  2385.     INC    HL
  2386.     POP    DE    ;PT TO FIRST CHAR OF COMMENT
  2387.     LD    B,0    ;INIT CHAR COUNT TO ZERO
  2388.     PUSH    HL    ;SAVE ADDRESS TO CHAR COUNT OF COMMENT
  2389. ;
  2390. ;  SAVE TEXT OF COMMENT
  2391. ;
  2392. STRTXT:
  2393.     INC    HL    ;PT TO POSITION TO STORE AT
  2394.     LD    A,(DE)    ;GET COMMENT TEXT
  2395.     LD    (HL),A    ;STORE IT
  2396.     INC    DE    ;PT TO NEXT
  2397.     INC    B    ;INCR CHAR COUNT
  2398.     LD    A,(DE)    ;CHECK FOR DONE
  2399.     CP    0DH    ;DONE IF <CR>
  2400.     JR    NZ,STRTXT    ;CONTINUE IF NOT <CR>
  2401.     INC    HL    ;PT TO ADDRESS AFTER <CR>
  2402.     LD    (COMEND),HL    ;SET PTR TO END OF COMMENT TABLE
  2403.     LD    (HL),0FFH    ;STORE 0FFFFH AS NEXT ENTRY
  2404.     INC    HL
  2405.     LD    (HL),0FFH
  2406.     POP    HL    ;GET PTR TO COMMENT CHAR COUNT
  2407.     LD    (HL),B    ;SAVE CHAR COUNT
  2408.     JP    GETCMD
  2409. ;
  2410. ;  CHECK FOR A COMMENT AT THE ADDRESS IN DE
  2411. ;   MATCH: CARRY IS OFF (NC CONDITION)
  2412. ;
  2413. CMCHK:
  2414.     LD    HL,(COMST)    ;PT TO START OF COMMENT TABLE
  2415. CMCHK1:
  2416.     LD    A,(HL)    ;CHECK ADDRESS FOR 0FFFFH
  2417.     INC    HL
  2418.     AND    (HL)
  2419.     DEC    HL
  2420.     INC    A    ;A=0 IF SO
  2421.     SCF        ;PREP FOR ERROR RETURN
  2422.     RET    Z    ;NOT FOUND IF A=0
  2423.     INC    HL    ;PT TO ADDRESS HIGH
  2424.     LD    A,D    ;GET TARGET ADDRESS IN DE
  2425.     CP    (HL)    ;COMPARE AGAINST THAT STORED
  2426.     DEC    HL    ;PT TO ADDRESS LOW
  2427.     JR    NZ,NXTC    ;IF NOT A MATCH, CONTINUE
  2428.     LD    A,E    ;COMPARE LOW BYTES
  2429.     CP    (HL)
  2430.     RET    Z    ;THERE IS A COMMENT AT THIS ADDRESS, SO CARRY=1
  2431. NXTC:
  2432.     INC    HL    ;PT TO CHAR COUNT
  2433.     INC    HL
  2434.     LD    A,(HL)    ;GET CHAR COUNT
  2435.     CALL    SKIP    ;SKIP TO NEXT COMMENT
  2436.     INC    HL    ;PT TO LOW BYTE OF NEXT COMMENT
  2437.     JP    CMCHK1
  2438. ;
  2439. ;  DUMP COMMENT TABLE FROM A GIVEN ADDRESS FORWARD
  2440. ;
  2441. ONECMT:
  2442.     CALL    CMCHK    ;FIND COMMENT REFD IN DE
  2443.     JR    LSTAGN
  2444. ;
  2445. ;  DUMP ENTIRE COMMENT TABLE
  2446. ;
  2447. LSTCMT:
  2448.     LD    HL,(COMST)    ;PT TO FIRST COMMENT
  2449. LSTAGN:
  2450.     CALL    BRKCHK    ;CHECK FOR ABORT
  2451.     LD    E,(HL)    ;GET ADDRESS OF COMMENT IN DE
  2452.     INC    HL
  2453.     LD    D,(HL)
  2454.     INC    HL
  2455.     LD    A,D    ;CHECK FOR 0FFFFH AS END OF TABLE
  2456.     AND    E
  2457.     INC    A    ;A=0 IF SO
  2458.     JP    Z,GETCMD    ;DONE IF SO
  2459.     EX    DE,HL    ;VALUE IN HL
  2460.     CALL    PVALUE    ;PRINT IT
  2461.     EX    DE,HL    ;VALUE IN DE, PTR TO COMMENT CHAR COUNT IN HL
  2462.     LD    A,';'    ;PRINT SEMICOLON BEFORE COMMENT
  2463.     CALL    COUT
  2464.     LD    B,(HL)    ;GET CHAR COUNT IN B
  2465. TEXT:
  2466.     INC    HL    ;PT TO COMMENT CHAR
  2467.     LD    A,(HL)    ;GET AND PRINT IT
  2468.     CALL    COUT
  2469.     DJNZ    TEXT    ;CONTINUE UNTIL DONE
  2470.     CALL    CRLF    ;NEW LINE
  2471.     INC    HL    ;PT TO ADDRESS OF NEXT COMMENT
  2472.     JR    LSTAGN    ;CONTINUE
  2473. ;
  2474. ;  DELETE AN EXISTING COMMENT WHOSE ADDRESS IS IN DE; HL PTS TO CMT TABLE
  2475. ;
  2476. DELCMT:
  2477.     LD    A,(HL)    ;CHECK FOR END OF COMMENT TABLE
  2478.     INC    HL
  2479.     AND    (HL)
  2480.     INC    A    ;A=0 IF AT END
  2481.     RET    Z
  2482.     DEC    HL    ;PT TO ADDRESS IN CURRENT COMMENT
  2483.     PUSH    DE    ;SAVE ADDRESS TO DELETE
  2484.     LD    D,H    ;SAVE ADDRESS OF CURRENT COMMENT IN DE
  2485.     LD    E,L
  2486.     INC    HL    ;PT TO CHAR COUNT OF CURRENT COMMENT
  2487.     INC    HL
  2488.     LD    A,(HL)    ;GET IT IN A
  2489.     CALL    SKIP    ;SKIP TO NEXT COMMENT
  2490.     INC    HL    ;PT TO ITS ADDRESS
  2491.     LD    B,0    ;INIT TO NOT DONE FOR LOOP
  2492. ;
  2493. ;  COPY (HL) TO (DE) UNTIL FFFFH IS ENCOUNTERED
  2494. ;
  2495. SHFTCT:
  2496.     LD    A,(HL)    ;GET CHAR
  2497.     LD    (DE),A    ;PUT CHAR
  2498.     INC    HL    ;PT TO NEXT
  2499.     INC    DE
  2500.     LD    C,A    ;DONE IF BC=0FFFFH
  2501.     AND    B
  2502.     INC    A    ;A=0 IF DONE
  2503.     LD    B,C
  2504.     JR    NZ,SHFTCT    ;CONTINUE UNTIL TWO SUCCESSIVE FF'S FOUND
  2505.     EX    DE,HL    ;SET END OF COMMENT TABLE
  2506.     DEC    HL
  2507.     DEC    HL
  2508.     LD    (COMEND),HL
  2509.     POP    DE
  2510.     RET    
  2511. ;
  2512. ;  CHECK TO SEE THAT AREA FOR COMMENTS WAS DEFINED (START <> 0) AND
  2513. ;    ABORT WITH ERROR MESSAGE IF NOT
  2514. ;
  2515. AREACK:
  2516.     LD    HL,(COMST)    ;HL=START ADDRESS
  2517.     LD    A,H
  2518.     OR    L
  2519.     RET    NZ        ;ERROR IF ZERO
  2520.     CALL    PSTRNG
  2521.     DEFB    '++ COMMAND IGNORED ++',0DH
  2522.     DEFB    0AH,'++ Issue ''UNNNN'' to tell '
  2523.     DEFB    'DASM to use address '
  2524.     DEFB    'NNNN',0DH,0AH,'as the start '
  2525.     DEFB    'of the comments table ++',0DH
  2526.     DEFB    0AH,0
  2527.     JP    GETCMD
  2528. ;
  2529. ;COMMAND:  U
  2530. ;  DEFINE THE COMMENTS AREA
  2531. ;
  2532. UAREA:
  2533.     LD    HL,INBUF+3    ;CHECK ARGS
  2534.     LD    A,(HL)
  2535.     CP    0DH    ;ERROR IF JUST <CR>
  2536.     JP    Z,WHAT
  2537.     CP    '.'    ;ERROR IF SYMBOL
  2538.     JP    Z,WHAT
  2539.     CALL    CNVRT    ;CONVERT TO NUMBER IN DE
  2540.     EX    DE,HL    ;... IN HL
  2541.     LD    A,H    ;CHECK FOR WITHIN RANGE
  2542.     CP    (SYMTAB+600H) SHR 8    ;THIS ALLOWS 600H BYTES FOR SYM TBL
  2543.     JR    C,UAREA0    ;ERROR IF LESS
  2544.     LD    (COMST),HL    ;SET START AND END OF TABLE
  2545.     LD    (COMEND),HL
  2546.     LD    (HL),0FFH    ;SET ENDING 0FFFFH IN TABLE
  2547.     INC    HL
  2548.     LD    (HL),0FFH
  2549.     JP    GETCMD
  2550. UAREA0:
  2551.     CALL    PSTRNG    ;PRINT ERROR MESSAGE
  2552.     DEFB    'NO!! Address is less than '
  2553.     DEFB    0
  2554.     LD    HL,SYMTAB+600H
  2555.     LD    L,0
  2556.     CALL    PVALUE
  2557.     CALL    CRLF
  2558.     JP    GETCMD
  2559. ;
  2560. ;  HANDLE SYMBOLS FOR THE DISASSEMBLER; ADDRESS IN PC
  2561. ;    IF A SYMBOL EXISTS AT THIS ADDRESS, PRINT IT
  2562. ;
  2563. HSYM:
  2564.     PUSH    DE
  2565.     PUSH    HL
  2566.     LD    A,1    ;ENABLE DISK OUTPUT
  2567.     LD    (WRTENAB),A
  2568.     LD    HL,(PC)    ;GET ADDRESS OF PC
  2569.     EX    DE,HL    ;... IN DE
  2570.     CALL    SYMSCH    ;LOOK FOR SYMBOL
  2571.     JP    C,RESUME    ;GOTO RESUME IF NO SYMBOL
  2572.     LD    C,B    ;GET CHAR COUNT OF SYMBOL INTO C
  2573.     PUSH    HL    ;SAVE PTR TO IT
  2574. ;
  2575. ;  CHECK TO SEE THAT SYMBOL CONTAINS NO + OR -; DON'T PRINT IF IT DOES
  2576. ;
  2577. HSYM0:
  2578.     LD    A,(HL)    ;GET CHAR
  2579.     CP    '+'    ;CHECK IT
  2580.     JR    Z,HSYM1
  2581.     CP    '-'
  2582.     JR    Z,HSYM1
  2583.     INC    HL    ;PT TO NEXT
  2584.     DEC    C    ;CONTINUE TO END OF SYMBOL
  2585.     JR    NZ,HSYM0
  2586.     POP    HL    ;PT TO SYMBOL
  2587.     CALL    PRNT        ;PRINT THE SYMBOL
  2588.     LD    A,':'        ;.. AND A FOLLOWING COLON
  2589.     CALL    COUT
  2590.     CALL    TAB    ;PRINT THE TAB
  2591.     CALL    PDERTN    ;PRINT THE ADDRESS AS A COMMENT (ADR IN DE)
  2592.     CALL    CRLF    ;NEW LINE
  2593.     JR    RESUME    ;CONTINUE
  2594. HSYM1:
  2595.     POP    HL
  2596. RESUME:
  2597.     XOR    A        ;PRINT ADDRESS OF PC ON CRT
  2598.     LD    (WRTENAB),A    ;.. BUT NOT INTO THE FILE
  2599.     CALL    SPACE        ;<SP> OVER
  2600.     CALL    SPACE
  2601.     LD    HL,(PC)        ;PRINT PC VALUE
  2602.     CALL    PVALUE
  2603.     LD    A,1        ;REENABLE WRITE OF MNEMONIC
  2604.     LD    (WRTENAB),A
  2605.     CALL    TAB        ;TAB FOR FOLLOWING MNEMONIC
  2606.     POP    HL
  2607.     POP    DE
  2608.     RET    
  2609. ;
  2610. ;   BUILD A SYMBOL IN INBUF FOR THE VALUE IN DE
  2611. ;
  2612. BLDSYM:
  2613.     LD    HL,INBUF    ;PT TO INBUF
  2614.     LD    (HL),'L'    ;STORE LEADING L
  2615.     INC    HL        ;PT TO NEXT CHAR
  2616.     LD    A,D        ;GET VALUE IN DE
  2617.     CALL    ACCTOASC    ;STORE AS ASCII CHARS IN BUFFER
  2618.     LD    A,E
  2619.     CALL    ACCTOASC
  2620.     LD    HL,INBUF    ;PT TO SYMBOL
  2621.     LD    B,5        ;SYMBOL IS 5 CHARS LONG
  2622. ;
  2623. ;  INSERT A SYMBOL ALPHABETICALLY INTO TABLE
  2624. ;
  2625. INSERT:
  2626.     CALL    PLCSYM    ;FIND SYMBOL
  2627.     JR    C,NEWSYM    ;PROCESS AS NEW IF NOT FOUND
  2628.     LD    (HL),E    ;IF FOUND, SET NEW ADDRESS FOR IT
  2629.     INC    HL
  2630.     LD    (HL),D
  2631.     RET    
  2632. ;
  2633. ;  INSERT NEW SYMBOL INTO TABLE; LOCATION TO INSERT AT PTED TO BY HL
  2634. ;
  2635. NEWSYM:
  2636.     PUSH    HL
  2637.     PUSH    DE
  2638.     PUSH    BC
  2639.     LD    HL,(SYMEND)    ;MOVE THE TABLE BY LENGTH+3
  2640.     LD    D,H    ;DE PTS TO END OF SYMBOL TABLE
  2641.     LD    E,L
  2642.     LD    A,B    ;LENGTH OF SYMBOL IN A
  2643.     ADD    A,3    ;LENGTH OF SYMBOL + 3
  2644.     ADD    A,L    ;PT TO NEW END OF TABLE
  2645.     LD    L,A
  2646.     LD    A,H
  2647.     ADC    A,0
  2648.     LD    H,A
  2649.     LD    (SYMEND),HL    ;NEW END OF SYMBOL TABLE
  2650.     INC    HL    ;PT TO LENGTH OF SYMBOL AFTER LAST ONE
  2651.     INC    HL
  2652.     LD    (HL),0    ;SET THIS TO ZERO TO MARK END OF TABLE
  2653.     DEC    HL
  2654.     DEC    HL
  2655.     LD    B,H    ;ADDRESS OF LAST BYTE IN BC
  2656.     LD    C,L
  2657.     LD    HL,(SYMRKR)    ;ADDRESS OF REV DEST TO MOVE TO IN HL
  2658. ;
  2659. ;  EXPAND THE TABLE UNTIL SPACE IS MADE AT THE NEW SPOT
  2660. ;
  2661. LUP3:
  2662.     LD    A,E    ;AT DESTINATION?
  2663.     CP    L
  2664.     JR    NZ,AHD
  2665.     LD    A,D
  2666.     CP    H
  2667.     JR    Z,STICKAD    ;DONE IF SO
  2668. AHD:
  2669.     DEC    DE    ;COPY BACKWARDS (DE) TO (BC)
  2670.     DEC    BC
  2671.     LD    A,(DE)
  2672.     LD    (BC),A
  2673.     JR    LUP3
  2674. ;
  2675. ;  ENTER THE ADDRESS AND LENGTH
  2676. ;
  2677. STICKAD:
  2678.     POP    BC
  2679.     POP    DE
  2680.     LD    (HL),E    ;STORE ADDRESS OF SYMBOL
  2681.     INC    HL
  2682.     LD    (HL),D
  2683.     INC    HL
  2684.     LD    (HL),B    ;STORE LENGTH OF SYMBOL
  2685.     POP    DE
  2686. ;
  2687. ;  STORE THE SYMBOL STRING
  2688. ;
  2689. STICKSM:
  2690.     INC    HL
  2691.     LD    A,(DE)
  2692.     LD    (HL),A
  2693.     INC    DE
  2694.     DJNZ    STICKSM
  2695.     RET    
  2696. ;
  2697. ;  FIND SPOT FOR NEW SYMBOL PTED TO BY HL, VALUE IN DE, B=LENGTH OF SYMBOL
  2698. ;    RETURN: C=0 FOR MTCH, HL=SYMBOL
  2699. ;
  2700. PLCSYM:
  2701.     PUSH    DE    ;SAVE VALUE
  2702.     PUSH    HL    ;SAVE ADDRESS OF SYMBOL
  2703.     LD    HL,SYMTAB    ;PT TO SYMBOL TABLE
  2704. ANTHR:
  2705.     POP    DE    ;GET SYMBOL ADDRESS IN DE
  2706.     PUSH    DE
  2707.     INC    HL    ;PT TO SYMBOL CHAR COUNT
  2708.     INC    HL
  2709.     PUSH    HL
  2710.     LD    A,(HL)    ;GET CHAR COUNT
  2711.     INC    HL    ;PT TO FIRST CHAR
  2712.     OR    A    ;CHECK FOR END OF SYMBOL TABLE
  2713.     JR    Z,NONE    ;GOTO NONE IF AT END OF TABLE
  2714.     CP    B    ;COMPARE SYMBOL LENGTHS
  2715.     JR    C,LESS    ;NO MATCH IF NOT SAME LENGTH
  2716.     JR    NZ,NTLESS
  2717.     LD    C,A    ;SYMBOL LENGTH IN C
  2718.     CALL    CHKSTG    ;COMPARE (DE) TO (HL)
  2719.     JR    Z,FOUND
  2720.     JR    C,NONE
  2721. ;
  2722. ;  TARGET SYMBOL GOES BEHIND CURRENT SYMBOL
  2723. ;
  2724. LATER:
  2725.     POP    HL    ;GET ADDRESS OF SYMBOL TABLE SYMBOL
  2726.     LD    A,(HL)
  2727.     INC    HL
  2728.     CALL    SKIP    ;SKIP TO NEXT
  2729.     JR    ANTHR
  2730. ;
  2731. ;  MATCH OF SYMBOLS
  2732. ;
  2733. FOUND:
  2734.     POP    HL
  2735.     DEC    HL
  2736.     DEC    HL
  2737.     POP    DE
  2738.     POP    DE
  2739.     OR    A    ;RET WITH CARRY CLEAR FOR MATCH
  2740.     RET    
  2741. ;
  2742. ;  CHECK SHORTER STRING FOR PARTIAL MATCH
  2743. ;
  2744. LESS:
  2745.     LD    C,A
  2746.     CALL    CHKSTG
  2747.     JR    NC,LATER
  2748.     JR    NONE
  2749. NTLESS:
  2750.     LD    C,B
  2751.     CALL    CHKSTG
  2752.     JR    Z,NONE
  2753.     JR    NC,LATER
  2754. ;
  2755. ;  THERE IS NO SYMBOL FOR THIS VALUE, SO THIS VALUE SHOULD GO AT HL
  2756. ;
  2757. NONE:
  2758.     POP    HL
  2759.     DEC    HL
  2760.     DEC    HL
  2761.     LD    (SYMRKR),HL    ;SET MARKER
  2762.     POP    HL
  2763.     POP    DE
  2764.     SCF            ;SET CARRY FOR NO MATCH
  2765.     RET    
  2766. ;
  2767. ;  SEARCH THE SYMBOL TABLE FOR AN ENTRY WHOSE VALUE IS DE
  2768. ;    MATCH: C=0
  2769. ;
  2770. SYMSCH:
  2771.     LD    HL,SYMTAB    ;PT TO SYMBOL TABLE
  2772. ;
  2773. ;  (HL) IS START OF SYMBOL; (B) IS LENGTH
  2774. ;
  2775. MORE:
  2776.     LD    A,(HL)    ;GET AND COMPARE SYMBOL TABLE VALUES
  2777.     INC    HL
  2778.     CP    E
  2779.     JR    NZ,SKPOVR
  2780.     LD    A,(HL)
  2781.     CP    D
  2782.     JR    Z,FNDSYM
  2783. ;
  2784. ;  GOTO NEXT SYMBOL
  2785. ;
  2786. SKPOVR:
  2787.     INC    HL    ;CHECK CHAR COUNT FOR DONE
  2788.     LD    A,(HL)    ;0 IF DONE
  2789.     OR    A
  2790.     SCF        ;SET CARRY FOR NO MATCH IF SO
  2791.     RET    Z
  2792.     INC    HL    ;PT TO NEXT SYMBOL
  2793.     ADD    A,L
  2794.     LD    L,A
  2795.     JR    NC,MORE
  2796.     INC    H
  2797.     JR    MORE
  2798. ;
  2799. ;  RETURN WITH NO CARRY AND LENGTH IN B IF MATCHED
  2800. ;
  2801. FNDSYM:
  2802.     INC    HL
  2803.     LD    A,(HL)
  2804.     INC    HL
  2805.     LD    B,A
  2806.     OR    A    ;MATCH
  2807.     RET    NZ
  2808.     SCF        ;NO MATCH
  2809.     RET    
  2810. ;
  2811. ;COMMAND:  E
  2812. ;  PLACE A SYMBOL IN THE SYMBOL TABLE
  2813. ;
  2814. ENTER:
  2815.     LD    HL,INBUF+3    ;CHECK FOR CHARS AFTER THE E
  2816.     CALL    CNVRT        ;GET VALUE
  2817.     LD    A,(HL)    ;CHECK FOR ERROR
  2818.     CP    ' '    ;MUST BE FOLLOWED BY <SP> OR ','
  2819.     JR    Z,ENTER0
  2820.     CP    ','
  2821.     JP    NZ,WHAT
  2822. ;
  2823. ;  GET SYMBOL
  2824. ;
  2825. ENTER0:
  2826.     INC    HL    ;PT TO SYMBOL
  2827.     LD    A,(HL)    ;GET '.'
  2828.     CP    '.'    ;MUST BE '.'
  2829.     JP    NZ,WHAT
  2830.     PUSH    DE        ;SAVE THE SYMBOL'S VALUE
  2831.     PUSH    HL        ;SAVE THE BUFFER PTR
  2832.     CALL    SYMSCH        ;RETURN WITH C=0 FOR MATCH
  2833.                 ;.. B=LENGTH   HL=START OF STRING
  2834.     JR    C,ENTER1        ;NOTHING TO DELETE
  2835.     PUSH    HL
  2836.     CALL    CRLF        ;PRINT MESSAGE THAT SYMBOL WAS KILLED
  2837.     CALL    PRNT
  2838.     CALL    PSTRNG
  2839.     DEFB    ' was Killed',0DH,0AH,0
  2840.     POP    HL
  2841.     DEC    HL
  2842.     DEC    HL
  2843.     DEC    HL
  2844.     CALL    KILL0    ;KILL SYMBOL
  2845. ENTER1:
  2846.     POP    HL
  2847.     PUSH    HL
  2848.     CALL    LNGTH    ;COMPUTE LENGTH OF SYMBOL IN B
  2849.     POP    DE
  2850.     LD    A,B    ;CHECK FOR SYMBOL TOO LONG
  2851.     CP    SYMMAX+1
  2852.     JR    C,ENTER2
  2853.     PUSH    HL
  2854.     LD    BC,SYMMAX    ;SET TO MAX LENGTH
  2855.     LD    H,D    ;HL=DE
  2856.     LD    L,E
  2857.     INC    HL    ;ADD 1 FOR 1ST CHAR
  2858.     ADD    HL,BC
  2859.     LD    (HL),0    ;TERMINATE SYMBOL
  2860.     LD    B,C    ;B=SYMMAX
  2861.     POP    HL
  2862. ENTER2:
  2863.     POP    DE
  2864.     CALL    INSERT    ;INSERT SYMBOL INTO SYMBOL TABLE
  2865.     JP    GETCMD
  2866. ;
  2867. ;COMMAND:  K
  2868. ;   DELETE A SYMBOL FROM THE TABLE
  2869. ;
  2870. KILL:
  2871.     LD    HL,INBUF+3    ;CHECK FOR SYMBOL SPECIFIED
  2872.     LD    A,(HL)        ;MUST BE '.'
  2873.     CP    '.'
  2874.     JP    NZ,WHAT
  2875.     CALL    LNGTH    ;GET LENGTH IN B
  2876.     CALL    PLCSYM    ;FIND SYMBOL PTED TO BY HL
  2877.     JP    C,WHAT    ;ERROR IF NOT FOUND
  2878.     CALL    KILL0    ;KILL IT
  2879.     JP    GETCMD
  2880. ;
  2881. ;  KILL THE SYMBOL WHOSE VALUE IS PTED TO BY HL
  2882. ;
  2883. KILL0:
  2884.     LD    B,H    ;SAVE PTR IN BC
  2885.     LD    C,L
  2886.     INC    HL
  2887.     INC    HL
  2888.     LD    A,(HL)    ;GET THE LENGTH OF THE SYMBOL
  2889.     INC    HL
  2890.     CALL    SKIP    ;SKIP TO NEXT
  2891.     EX    DE,HL    ;DE PTS TO NEXT SYMBOL
  2892.     LD    HL,(SYMEND)    ;SHIFT THE SYMBOL TABLE DOWN TO DELETE SYM
  2893. LUP4:
  2894.     LD    A,E    ;SHIFT COMPLETE?
  2895.     CP    L
  2896.     JR    NZ,AHD1
  2897.     LD    A,D
  2898.     CP    H
  2899.     JR    Z,DEAD
  2900. AHD1:
  2901.     LD    A,(DE)    ;COPY DOWN
  2902.     LD    (BC),A
  2903.     INC    BC
  2904.     INC    DE
  2905.     JR    LUP4
  2906. ;
  2907. ;  THE SYMBOL IS DEAD -- SET NEW END OF SYMBOL TABLE
  2908. ;
  2909. DEAD:
  2910.     LD    H,B
  2911.     LD    L,C
  2912.     LD    (SYMEND),HL    ;SET END
  2913.     INC    HL
  2914.     INC    HL
  2915.     LD    (HL),0    ;SET END OF TABLE MARKER
  2916.     RET    
  2917. ;
  2918. ;  SCAN SYMBOL STARTING AT (HL) AND RETURN WITH LENGTH IN B, PTR TO FIRST
  2919. ;    CHAR OF SYMBOL IN HL, AND PTR TO CHAR AFTER LAST CHAR IN SYMBOL IN DE
  2920. ;
  2921. LNGTH:
  2922.     INC    HL    ;PT TO FIRST CHAR
  2923.     LD    B,0    ;INIT LENGTH
  2924.     PUSH    HL
  2925. CHAROK:
  2926.     LD    A,(HL)    ;GET CHAR
  2927.     INC    HL    ;PT TO NEXT
  2928.     INC    B    ;INCR LENGTH
  2929.     CP    '+'    ;CHECK FOR END OF SYMBOL MARK
  2930.     JR    Z,CHAROK
  2931.     CP    '-'
  2932.     JR    Z,CHAROK
  2933.     CP    '0'
  2934.     JR    C,ILLSYM
  2935.     CP    '9'+1
  2936.     JR    C,CHAROK
  2937.     CP    'A'
  2938.     JR    C,ILLSYM
  2939.     CP    'Z'+1
  2940.     JR    C,CHAROK
  2941. ;
  2942. ;  AN ILLEGAL CHARACTER FOUND IN A SYMBOL SCAN, SO SCAN IS DONE
  2943. ;
  2944. ILLSYM:
  2945.     DEC    B    ;COMPENSATE FOR COUNT
  2946.     JP    Z,WHAT    ;ERROR IF NO SYMBOL CHARS
  2947.     DEC    HL    ;BACK UP
  2948.     EX    DE,HL    ;PTR TO NEXT CHAR IN DE
  2949.     POP    HL    ;PT TO FIRST CHAR IN HL
  2950.     RET    
  2951. ;
  2952. ;  CONVERT THE ACCUMULATOR TO HEX ASCII IN MEMORY PTED TO BY HL (2 BYTES)
  2953. ;
  2954. ACCTOASC:
  2955.     PUSH    AF
  2956.     CALL    HINIB    ;CONVERT HIGH NYBBLE
  2957.     LD    (HL),A    ;STORE IT
  2958.     INC    HL    ;PT TO NEXT
  2959.     POP    AF
  2960.     CALL    LONIB    ;CONVERT LOW NYBBLE
  2961.     LD    (HL),A    ;STORE IT
  2962.     INC    HL    ;PT TO NEXT
  2963.     RET    
  2964. ;
  2965. ;  CONVERT THE HIGH NIBBLE OF A TO ASCII CHAR
  2966. ;
  2967. HINIB:
  2968.     RRA    ;ROTATE HIGH NYBBLE TO LOW NYBBLE
  2969.     RRA
  2970.     RRA
  2971.     RRA
  2972. ;
  2973. ;  CONVERT THE LOW NYBBLE OF A TO ASCII CHAR
  2974. ;
  2975. LONIB:
  2976.     AND    0FH    ;MASK OUT NEW HIGH NYBBLE
  2977.     CP    10    ;CHECK FOR DIGIT
  2978.     JR    C,AHD2    ;SKIP IF SO
  2979.     ADD    A,7    ;ADD OFFSET OF 7 FOR '9' TO 'A'
  2980. AHD2:
  2981.     ADD    A,'0'    ;CONVERT TO ASCII IN A
  2982.     RET    
  2983. ;
  2984. ;  PRINT THE HEX CHARACTERS FOR THE VALUE IN A
  2985. ;
  2986. PHEX:
  2987.     PUSH    AF
  2988.     CALL    HINIB    ;PRINT HIGH NYBBLE
  2989.     CALL    COUT
  2990.     POP    AF
  2991.     CALL    LONIB    ;PRINT LOW NYBBLE
  2992.     JP    COUT
  2993. ;
  2994. ;  PRINT THE 4 HEX CHARACTERS FOR CONTENTS OF HL
  2995. ;
  2996. PVALUE:
  2997.     LD    A,H    ;PRINT HIGH BYTE
  2998.     CALL    PHEX
  2999.     LD    A,L    ;PRINT LOW BYTE
  3000.     CALL    PHEX
  3001. ;
  3002. ;  PRINT A <SP>
  3003. ;
  3004. SPACE:
  3005.     LD    A,' '    ;PRINT <SP>
  3006.     JP    COUT
  3007. ;
  3008. ;  READ HEX ASCII FROM COMMAND LINE AND CONVERT AND PLACE IN (DE)
  3009. ;
  3010. CNVRT:
  3011.     LD    A,(HL)    ;GET FIRST CHAR
  3012.     CP    '.'    ;IT IS A SYMBOL IF '.'
  3013.     JR    Z,ITSASYM
  3014.     LD    DE,0    ;INIT VALUE TO ZERO
  3015. AGAIN:
  3016.     LD    A,(HL)    ;GET CHAR
  3017.     CP    '0'    ;IN RANGE?
  3018.     RET    C    ;DONE IF NOT
  3019.     CP    '9'+1    ;RANGE?
  3020.     JR    C,NUMER    ;OK IF SO
  3021.     CP    'A'    ;RANGE?
  3022.     RET    C    ;DONE IF NOT
  3023.     CP    'F'+1    ;RANGE?
  3024.     RET    NC    ;DONE IF NOT
  3025.     SUB    7    ;CONVERT FOR 'A'-'F'
  3026. NUMER:
  3027.     SUB    '0'    ;CONVERT FROM ASCII TO BINARY
  3028.     EX    DE,HL    ;HL=VALUE
  3029.     ADD    HL,HL    ;*2
  3030.     ADD    HL,HL    ;*4
  3031.     ADD    HL,HL    ;*8
  3032.     ADD    HL,HL    ;*16
  3033.     ADD    A,L    ;ADD IN NEW NYBBLE
  3034.     LD    L,A
  3035.     EX    DE,HL    ;DE=VALUE
  3036.     INC    HL    ;PT TO NEXT CHAR
  3037.     JR    AGAIN    ;CONTINUE
  3038. ;
  3039. ;  EVALUATE THE SYMBOL IN MEMORY AND RETURN WITH VALUE IN DE
  3040. ;
  3041. ITSASYM:
  3042.     CALL    LNGTH    ;DETERMINE LENGTH OF SYMBOL
  3043.     PUSH    DE
  3044.     CALL    PLCSYM    ;FIND IT IN TABLE
  3045.     JP    C,WHAT    ;ERROR IF NOT FOUND
  3046.     LD    E,(HL)    ;PUT ITS VALUE IN DE
  3047.     INC    HL
  3048.     LD    D,(HL)
  3049.     POP    HL
  3050.     LD    A,(HL)
  3051.     RET    
  3052. ;
  3053. ;  OPEN A FILE FOR READING
  3054. ;
  3055. RDOPEN:
  3056.     PUSH    HL
  3057.     LD    HL,0100H    ;SET DMA TO 100H
  3058.     LD    (DMAPTR),HL
  3059.     XOR    A        ;SET NEXT RECORD FIELD TO 0
  3060.     LD    (FCBNR),A
  3061.     LD    DE,FCB        ;PT TO FCB
  3062.     LD    C,0FH        ;OPEN THE FILE
  3063.     CALL    BDOS
  3064.     POP    HL
  3065.     INC    A        ;FILE FOUND?
  3066.     RET    NZ        ;RET IF SO
  3067.     CALL    PSTRNG        ;ERROR IF NOT
  3068.     DEFB    '  File Not Found',0DH,0AH,0
  3069.     EX    (SP),HL        ;SAVE HL ON STACK
  3070.     POP    HL        ;RESTORE HL
  3071.     RET
  3072. ;    JP    GETCMD    ;OLD ERROR RETURN
  3073. ;
  3074. ;  READ NEXT BYTE FROM DMA BUFFER AND RETURN IT IN A
  3075. ;
  3076. READMA:
  3077.     PUSH    HL    ;SAVE HL
  3078.     LD    HL,(DMAPTR)    ;PT TO NEXT BYTE
  3079.     LD    A,H    ;BEYOND END OF BUFFER?
  3080.     CP    1    ;1 IF SO
  3081.     JR    NZ,NOTREAD    ;IF NOT, THEN GET THE BYTE
  3082.     PUSH    BC    ;SAVE BC, DE
  3083.     PUSH    DE
  3084.     LD    DE,FCB    ;PT TO FCB
  3085.     LD    C,14H    ;READ RECORD INTO DMA ADDRESS
  3086.     CALL    BDOS
  3087.     OR    A    ;SET FLAG FOR ERROR
  3088.     POP    DE    ;RESTORE REGS
  3089.     POP    BC
  3090.     LD    HL,RECLEN    ;PT TO FIRST BYTE OF BUFFER
  3091.     JR    NZ,ERROR    ;ERROR IF EOF ENCOUNTERED
  3092. NOTREAD:
  3093.     LD    A,(HL)    ;GET NEXT CHAR IN A
  3094.     INC    HL    ;PT TO CHAR AFTER
  3095.     LD    (DMAPTR),HL    ;SET PTR FOR LATER USE
  3096.     POP    HL    ;RESTORE HL
  3097.     RET    
  3098. ERROR:
  3099.     CP    3
  3100.     JR    C,RDDMA0
  3101.     CALL    PSTRNG
  3102.     DEFB    '++ Unexpected EOF ++',0DH,0AH
  3103.     DEFB    0
  3104.     JP    GETCMD
  3105. ;
  3106. ;  AT EOF ... SET ^Z AS RESPONSE CHAR FROM READ
  3107. ;
  3108. RDDMA0:
  3109.     LD    A,1AH
  3110.     LD    (HL),A
  3111.     JR    NOTREAD
  3112. ;
  3113. ;  OPEN FILE PTED TO BY FCB FOR OUTPUT
  3114. ;
  3115. OPEN:
  3116.     PUSH    HL
  3117.     LD    DE,FCB    ;ERASE IT FIRST
  3118.     LD    C,13H
  3119.     CALL    BDOS
  3120.     LD    DE,FCB    ;NOW CREATE IT
  3121.     LD    C,16H
  3122.     CALL    BDOS
  3123.     INC    A    ;ERROR IN CREATING IT?
  3124.     JP    Z,WHAT    ;SAY SO (NO ROOM IN DIR)
  3125.     XOR    A    ;SET RECORD FIELD TO ZERO
  3126.     LD    (FCBNR),A
  3127.     LD    HL,RECLEN    ;SET DMA ADDRESS
  3128.     LD    (DMAPTR),HL
  3129.     POP    HL
  3130.     RET    
  3131. ;
  3132. ;  WRITE THE NEXT RECORD TO OPEN FILE
  3133. ;
  3134. NXTRCRD:
  3135.     LD    DE,FCB    ;WRITE IT
  3136.     LD    C,15H
  3137.     CALL    BDOS
  3138.     OR    A    ;ERROR?
  3139.     JR    NZ,WRTERR
  3140.     LD    DE,FCB    ;CLOSE THE FILE
  3141.     LD    C,10H
  3142.     CALL    BDOS
  3143.     INC    A    ;ERROR IN CLOSING?
  3144.     RET    NZ
  3145.     CALL    PSTRNG    ;SAY SO IF SO
  3146.     DEFB    '++ Close Error ++',0DH,0AH,0
  3147.     JP    GETCMD
  3148. ;
  3149. ;  AN ERROR OCCURRED DURING A WRITE RECORD ATTEMPT
  3150. ;
  3151. WRTERR:
  3152.     CALL    PSTRNG
  3153.     DEFB    '++ Write Error ++',0DH,0AH,0
  3154. ;
  3155. ;  WRITE INTO THE DMA BUFFER AND WRITE TO DISK WHEN IT FILLS
  3156. ;    CHAR TO WRITE PASSED IN A
  3157. ;
  3158. WRTFILE:
  3159.     PUSH    HL
  3160.     LD    HL,(DMAPTR)    ;GET PTR
  3161.     LD    (HL),A    ;STORE NEXT CHAR
  3162.     INC    L    ;PT TO NEXT
  3163.     LD    (DMAPTR),HL    ;SET NEXT DMA
  3164.     POP    HL
  3165.     RET    NZ    ;IF L REACHED ZERO, BUFFER WAS FULL; RET IF NZ
  3166.     PUSH    BC    ;WRITE RECORD TO DISK AND REINIT DMA PTR
  3167.     PUSH    DE
  3168.     PUSH    HL
  3169.     LD    DE,FCB    ;DO THE WRITE
  3170.     LD    C,15H
  3171.     CALL    BDOS
  3172.     OR    A    ;ERROR?
  3173.     JR    NZ,WRTERR
  3174.     LD    HL,RECLEN    ;RESET DMA PTR
  3175.     LD    (DMAPTR),HL
  3176.     POP    HL
  3177.     POP    DE
  3178.     POP    BC
  3179.     RET    
  3180. ;
  3181. ;  PRINT COMMENT IF PTED TO BY XCPTR
  3182. ;
  3183. DCRLF:
  3184.     LD    HL,(XCPTR)
  3185.     LD    A,H
  3186.     OR    L    ;LOOK FOR A COMMENT ADDRESS
  3187.     JR    Z,DCRLF3
  3188.     CALL    TAB    ;TABULATE COMMENT
  3189.     LD    B,(HL)    ;GET CHAR COUNT
  3190.     XOR    A    ;CHECK FOR NO COMMENT
  3191.     OR    B
  3192.     JR    Z,DCRLF2
  3193. DCRLF1:
  3194.     INC    HL    ;OUTPUT COMMENT
  3195.     LD    A,(HL)
  3196.     CALL    COUT
  3197.     DJNZ    DCRLF1
  3198. DCRLF2:
  3199.     LD    HL,0    ;SET NO COMMENT NOW
  3200.     LD    (XCPTR),HL
  3201. DCRLF3:
  3202.     LD    (RPLPTR),HL    ;SET RPLPTR=0
  3203. ;
  3204. ;  OUTPUT <CR> <LF>
  3205. ;
  3206. CRLF:
  3207.     LD    A,0DH
  3208.     CALL    COUT
  3209.     LD    A,0AH
  3210.     JP    COUT
  3211. ;
  3212. ;  PRINT THE PROMPT
  3213. ;
  3214. PRTSTAR:
  3215.     LD    A,'*'
  3216. ;
  3217. ;  PRINT THE CHARACTER IN A ON CON: AND/OR DISK
  3218. ;    THE FOLLOWING FLAGS TAKE EFFECT:
  3219. ;    HUSH (QUIET MODE) -- IF =0, CON: OUTPUT, ELSE NO CON: OUTPUT
  3220. ;    FOPEN (FILE OPEN) AND WRTENAB (WRITE ENABLE) -- IF BOTH <>0, DISK
  3221. ;        OUTPUT
  3222. ;    CNTENAB (COUNT ENABLE) -- IF <>0, ENABLE <LF> COUNT (LCTR)
  3223. ;
  3224. COUT:
  3225.     PUSH    AF    ;SAVE REGS
  3226.     PUSH    BC
  3227.     PUSH    DE
  3228.     PUSH    HL
  3229.     LD    E,A    ;CHAR IN E
  3230.     PUSH    DE    ;PREP TO PRINT CHAR
  3231.     LD    C,2    ;USE BDOS OUTPUT
  3232.     LD    A,(HUSH)    ;QUIET MODE?
  3233.     OR    A    ;0=YES
  3234.     CALL    Z,BDOS    ;PRINT THE CHAR IF NOT QUIET MODE
  3235.     POP    DE
  3236.     LD    A,(FOPEN)    ;GET FILE OPEN FLAG
  3237.     LD    HL,WRTENAB    ;PT TO FILE WRITE ENABLED FLAG
  3238.     AND    (HL)        ;IF BOTH ENABLED, WRITE CHAR TO DISK ALSO
  3239.     LD    A,E        ;CHAR IN A, NOT ZERO FLAG = DISK OUTPUT
  3240.     CALL    NZ,WRTFILE    ;WRITE TO DISK IF OK
  3241.     LD    A,E        ;CHECK FOR <LF>
  3242.     CP    0AH
  3243.     JR    NZ,COUT1
  3244.     LD    A,(CNTENAB)    ;DECREMENT THE LINE COUNT IF A <LF> WAS SENT
  3245.     OR    A        ;CHECK IF COUNTING ENABLED
  3246.     JR    Z,COUT1
  3247.     LD    HL,LCTR    ;PT TO LINE COUNT
  3248.     DEC    (HL)        ;DECREMENT IT
  3249. COUT1:
  3250.     POP    HL        ;RESTORE REGS AND EXIT
  3251.     POP    DE
  3252.     POP    BC
  3253.     POP    AF
  3254.     RET    
  3255. ;
  3256. ;  PROMPT AND READ A COMMAND LINE FROM THE KEYBOARD
  3257. ;
  3258. PROMPT:
  3259.     CALL    PRTSTAR    ;PRINT PROMPT
  3260.     LD    DE,INBUF    ;PT TO INPUT LINE BUFFER
  3261.     LD    A,80    ;SET BUFFER SIZE
  3262.     LD    (DE),A
  3263.     LD    C,10    ;READ INTO BUFFER FCT
  3264.     CALL    BDOS
  3265.     LD    HL,INBUF+1    ;PT TO CHAR COUNT READ
  3266.     LD    E,(HL)    ;GET IT IN DE
  3267.     LD    D,0
  3268.     ADD    HL,DE    ;PT TO AFTER LAST CHAR IN BUFFER
  3269.     INC    HL
  3270.     LD    (HL),0DH    ;STORE ENDING <CR>
  3271.     LD    HL,INBUF+1    ;PT TO CHAR COUNT OF BUFFER
  3272. ;
  3273. ;  CONVERT TO UPPER CASE
  3274. ;
  3275. UPPR:
  3276.     INC    HL    ;PT TO NEXT CHAR
  3277.     LD    A,(HL)    ;GET IT
  3278.     CP    0DH    ;DONE?
  3279.     JP    Z,CRLF
  3280.     CP    61H    ;SMALL A?
  3281.     JR    C,UPPR    ;OK IF LESS
  3282.     CP    7BH    ;SMALL Z + 1?
  3283.     JR    NC,UPPR    ;OK IF MORE
  3284.     AND    5FH    ;CAPITALIZE
  3285.     LD    (HL),A    ;PUT CHAR
  3286.     JR    UPPR    ;CONTINUE
  3287. ;
  3288. ;  PRINT THE STRING: ADDR AT TOP OF STACK, TERMINATED BY 0
  3289. ;
  3290. PSTRNG:
  3291.     XOR    A    ;DISABLE QUIET MODE AND DISK OUTPUT
  3292.     LD    (WRTENAB),A
  3293.     LD    (HUSH),A
  3294. PSTG:
  3295.     EX    (SP),HL    ;PT TO STRING IN HL AND SAVE OLD HL
  3296. LUP5:
  3297.     LD    A,(HL)    ;OUTPUT CHARS
  3298.     CALL    COUT
  3299.     INC    HL    ;PT TO NEXT
  3300.     LD    A,(HL)    ;GET NEXT CHAR
  3301.     OR    A    ;DONE?
  3302.     JR    NZ,LUP5
  3303.     INC    HL    ;PT TO AFTER STRING
  3304.     EX    (SP),HL    ;RESTORE HL AND SET NEW RET ADR
  3305.     RET    
  3306. ;
  3307. ;  INITIALIZE SPECIAL CONSTANTS SO CODE IS REENTRANT
  3308. ;
  3309. INIT0:
  3310.     LD    A,IBUFLEN    ;SIZE OF INPUT LINE BUFFER
  3311.     LD    (INBUF),A
  3312.     LD    A,INITDLEN-1    ;INITIAL SIZE OF MEMORY DUMP
  3313.     LD    (DMPLEN),A
  3314.     LD    A,INITLCNT    ;INITIAL SIZE OF LIST DISPLAY
  3315.     LD    (NLINES),A
  3316.     LD    (LCTR),A
  3317.     LD    HL,BLNGTH    ;INITIAL CTL PTR
  3318.     LD    (NXTCTL),HL
  3319.     LD    HL,INITPC    ;INITIAL VALUE OF PC
  3320.     LD    (DMPSTRT),HL
  3321.     LD    (DMPEND),HL
  3322.     LD    (PC),HL
  3323.     LD    HL,INITOFF    ;INITIAL OFFSET
  3324.     LD    (OFFSET),HL
  3325.     LD    HL,INITELST    ;INITIAL END OF LISTING VALUE
  3326.     LD    (ENDLST),HL
  3327.     LD    HL,COMTBL    ;INITIAL POSITION OF COMMENTS
  3328.     LD    (COMST),HL
  3329.     LD    (COMEND),HL
  3330.     RET
  3331. ;
  3332. ;  INITIALIZE SYMBOL TABLE, CONTROL TABLE, AND COMMENTS TABLE
  3333. ;  SET EOL
  3334. ;
  3335. INIT:
  3336.     XOR    A    ;A=0
  3337.     LD    (SYMTAB+2),A    ;CLEAR SYMBOL TABLE BY SET CHAR COUNT OF
  3338.     LD    HL,SYMTAB    ;... FIRST ENTRY TO ZERO
  3339.     LD    (SYMEND),HL    ;SET END ADDRESS OF SYMBOL TABLE
  3340.     LD    A,0DH        ;SET END OF INPUT LINE
  3341.     LD    (INBUF+3),A
  3342.     LD    HL,0FFFFH    ;SET NO ENTRIES IN CONTROL TABLE
  3343.     LD    (CTLTBL),HL
  3344.     LD    A,'I'        ;SET FOR INSTRUCTION MODE INITIALLY
  3345.     LD    (CTLTBL-1),A    ;"PREVIOUS" CONTROL TABLE ENTRY IS SET TO 'I'
  3346.     LD    HL,COMTBL    ;SET ADDRESS OF COMMENT TABLE
  3347.     LD    (COMST),HL    ;START ADDRESS
  3348.     LD    (COMEND),HL    ;END ADDRESS
  3349.     LD    (HL),0FFH    ;CLEAR FIRST ENTRY TO NO COMMENT
  3350.     INC    HL
  3351.     LD    (HL),0FFH
  3352.     RET    
  3353. ;
  3354. ;  RETURN WITH ZERO IF STRINGS (DE) AND (HL) MATCH; LENGTH IS (C)
  3355. ;
  3356. CHKSTG:
  3357.     LD    A,(DE)    ;GET CHAR
  3358.     CP    (HL)    ;COMPARE
  3359.     RET    NZ    ;NO MATCH
  3360.     INC    DE    ;PT TO NEXT
  3361.     INC    HL
  3362.     DEC    C    ;COUNT DOWN
  3363.     JR    NZ,CHKSTG
  3364.     RET    
  3365. ;
  3366. ;  WATCH THE CONSOLE FOR A BREAK KEY AND ABORT IF SO
  3367. ;
  3368. BRKCHK:
  3369.     PUSH    BC
  3370.     PUSH    DE
  3371.     PUSH    HL
  3372.     LD    C,0BH    ;CHECK FOR KEY PRESS
  3373.     CALL    BDOS
  3374.     OR    A    ;NONE IF ZERO
  3375.     JR    Z,AHD3
  3376.     LD    C,1    ;GET NEW CHAR
  3377.     CALL    BDOS
  3378.     CP    3    ;CHECK FOR ^C
  3379.     JR    Z,ABORT    ;ABORT IF SO
  3380.     CALL    CRLF    ;ELSE NEW LINE
  3381.     JP    GETCMD
  3382. ABORT:
  3383.     CALL    PSTRNG    ;PROMPT USER
  3384.     DEFB    0DH,0AH,'Abort (Y/N)? ',0
  3385.     CALL    CHIN
  3386.     CP    'Y'
  3387.     JP    Z,WBOOT
  3388.     JP    GETCMD
  3389. AHD3:
  3390.     POP    HL
  3391.     POP    DE
  3392.     POP    BC
  3393.     RET    
  3394. ;
  3395. ;  CHECK FOR AN ASCII CHARACTER IN A
  3396. ;    RETURN WITH ZERO TRUE AND NO CARRY FOR <CR>, <LF>
  3397. ;    RETURN WITH NO CARRY IF PRINTABLE ASCII
  3398. ;
  3399. ISITASC:
  3400.     CP    0DH
  3401.     RET    Z    ;NO CARRY
  3402.     CP    0AH
  3403.     RET    Z    ;NO CARRY
  3404.     CP    ' '
  3405.     RET    C    ;CARRY IF < <SP>
  3406.     CP    7FH
  3407.     CCF        ;CARRY IF > 7FH
  3408.     RET
  3409. ;
  3410. ;  FILE TYPES
  3411. ;
  3412. TPALL:
  3413.     DEFB    'ALL'    ;FILE TYPE FOR ALL (CTL, SYM, DOC, COM, AND ASM) FILES
  3414. TPASM:
  3415.     DEFB    'ASM'    ;ASM FILE TYPE
  3416. TPCOM:
  3417.     DEFB    'COM'    ;COM FILE TYPE
  3418. TPCTL:
  3419.     DEFB    'CTL'    ;CTL FILE TYPE
  3420. TPSYM:
  3421.     DEFB    'SYM'    ;SYM FILE TYPE
  3422. TPDOC:
  3423.     DEFB    'DOC'    ;DOC FILE TYPE
  3424.     DEFB    '.'
  3425. ;
  3426. ;  BUFFERS
  3427. ;
  3428. RELEND:
  3429.     DEFS    2    ;RELATIVE END ADDRESS OF COM FILE
  3430. DMPSTRT:
  3431.     DEFS    2    ;STARTING ADDRESS OF DUMP (CURRENT ADDR ALSO)
  3432. DMPEND:
  3433.     DEFS    2    ;ENDING ADDRESS OF DUMP
  3434. DMPLEN:
  3435.     DEFS    2    ;NUMBER OF BYTES TO DUMP AT ONE TIME - 1
  3436. OFFSET:
  3437.     DEFS    2    ;OFFSET VALUE
  3438. SYMEND:
  3439.     DEFS    2    ;END OF SYMBOL TABLE
  3440. PC:
  3441.     DEFS    2    ;CURRENT VALUE OF PC
  3442. ENDLST:
  3443.     DEFS    2    ;END OF LISTING PTR
  3444. BIASED:
  3445.     DEFS    2    ;BIASED OFFSET
  3446. COMST:
  3447.     DEFS    2    ;START ADDRESS OF COMMENTS
  3448. COMEND:
  3449.     DEFS    2    ;END ADDRESS OF COMMENTS
  3450. ADB:
  3451.     DEFS    1    ;FLAG FOR DB BUILD (0=HEX, <>0=ASCII AND HEX)
  3452. FNDPC:
  3453.     DEFS    2    ;TEMP PC FOR FIND FUNCTION
  3454. FNDADD:
  3455.     DEFS    2    ;TEMP ADDRESS FOR FIND FUNCTION
  3456. ECNT:
  3457.     DEFS    1    ;TEMP LINE COUNTER
  3458. NLINES:
  3459.     DEFS    1    ;NUMBER OF LINES FOR LIST
  3460. LCTR:
  3461.     DEFS    1    ;COUNTER FOR LINES
  3462. CNTENAB:
  3463.     DEFS    1    ;ENABLE LINE COUNT IF <> 0, ELSE DISABLE LINE CNT
  3464. WRTENAB:
  3465.     DEFS    1    ;OUTPUT TO FILE IS ENABLED IF <> 0, NOT IF 0
  3466. RPLPTR:
  3467.     DEFS    2    ;MISC PTR
  3468. XCPTR:
  3469.     DEFS    2    ;MISC PTR
  3470. XCSW:
  3471.     DEFS    1    ;MISC PTR
  3472. FOPEN:
  3473.     DEFS    1    ;FILE IS OPEN IF <> 0, NOT OPEN IF 0
  3474. HUSH:
  3475.     DEFS    1    ;DON'T PRINT COMMAND RESULT (QUIET MODE) IF 0
  3476. NXTCTL:
  3477.     DEFS    2    ;PTR TO NEXT CTL ENTRY
  3478. BLNGTH:
  3479.     DEFS    1    ;BUFFER LENGTH
  3480. SYMRKR:
  3481.     DEFS    2    ;SYMBOL MARKER
  3482. DMAPTR:
  3483.     DEFS    2    ;PT TO DMA ADDRESS
  3484. ASCBLD:
  3485.     DEFS    1    ;FLAG FOR A COMMAND (0=NOT A)
  3486. BUILD:
  3487.     DEFS    1    ;FLAG FOR B COMMAND (0=NOT B)
  3488. OPCTP:
  3489.     DEFS    3
  3490. ;
  3491. ;  INPUT LINE BUFFER
  3492. ;
  3493. INBUF:
  3494.     DEFS    1        ;SIZE OF BUFFER
  3495.     DEFS    IBUFLEN+1    ;SIZE OF INPUT LINE AND BUFFER CONTENTS
  3496. ;
  3497. ;  STACK AREA
  3498. ;
  3499.     DEFS    40        ;STACK SPACE
  3500. OLDST:
  3501.     DEFS    2        ;OLD STACK PTR
  3502. ;
  3503.     DEFS    1        ;1 BYTE FOR INITIAL 'I' IN CONTROL TABLE
  3504. ;
  3505. ;  NEXT PAGE AFTER PROGRAM MARKS BEGINNING OF BUFFER AREAS
  3506. ;
  3507.     ORG    $/100H*100H+100H
  3508. ENDALL    EQU    $
  3509.  
  3510.     END    
  3511.