home *** CD-ROM | disk | FTP | other *** search
/ ftp.barnyard.co.uk / 2015.02.ftp.barnyard.co.uk.tar / ftp.barnyard.co.uk / cpm / walnut-creek-CDROM / MBUG / MBUG112.ARC / Z8E14.LBR / Z8E.ZZ0 / Z8E.Z80
Text File  |  1979-12-31  |  185KB  |  7,215 lines

  1.     title    *   *** Z8E - Z80 Debug Monitor ***    *
  2.     subttl    (C) Copyright 1984, 1985   by Richard A. Surwilo  
  3.  
  4. ;------------------------------------------------------------------------------
  5. ;
  6. ;  Copyright (C) 1984, 1985   by Richard A. Surwilo.  All rights reserved. 
  7. ;
  8. ;  No part of this publication may be reproduced, transmitted, transcribed,
  9. ;  stored in a retrieval system, or translated into any language or computer 
  10. ;  language in any form or by any means, electronic, mechanical, magnetic,
  11. ;  optical, chemical, manual or otherwise, without express prior written 
  12. ;  permission of:
  13. ;
  14. ;      Richard  A. Surwilo  23 Plymouth Road   Stamford, CT   06906
  15. ;
  16. ;  (The above address does not seem to be correct)
  17. ;
  18. ;------------------------------------------------------------------------------
  19. ;
  20. ;                       Revision history
  21. ;
  22. ;  15 May 87 jrs v1.4    Renamed I(nput) command to L(oad) to make way for new
  23. ;            I(nitialise) command.  Documentation changed 13/6/87.
  24. ;            Source code filtered to all lower case.  Sometime
  25. ;            Between 1.0 and 1.2 The Comments Had Been Modified So
  26. ;            That Every Word Started With A Capital Letter And It
  27. ;            Looked Quite Silly.
  28. ;
  29. ;  20 Apr 87 jrs v1.3    Fixed register display in animated debug mode.  Z8E
  30. ;            now handles EX AF,AF' and EXX instructions correctly.
  31. ;            Added equates to tailor the source to assemblers
  32. ;            other than m80.
  33. ;
  34. ;  08 Mar 86 jrs v1.2    (No version number change - all mods purely cosmetic)
  35. ;            Modified org directives to bypass bug in m80
  36. ;            Added jterm conditional for testing
  37. ;            Added hazeltine conditional for tilde suppression
  38. ;            Changed dates to more universal format
  39. ;
  40. ;  16 Jan 86 ijb v1.2    Cursor addressing for post '=>' in jdbg75
  41. ;            to cover systems that have a destructive bs
  42. ;
  43. ;  25 Sep 85 ras v1.1    Fix case bug
  44. ;            Fix usym bug
  45. ;            Clean up comments                
  46. ;
  47. ;------------------------------------------------------------------------------
  48.  
  49. true    equ    -1
  50. false    equ    0
  51.  
  52. ;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  53. ;The following equ should be set to 0 to generate a "standard" z8e.com
  54. ;for distribution.  I only put it in for use while testing to save having
  55. ;to configure the object code for my terminal.   (jrs 8 mar 86)
  56.  
  57. jterm    equ    false        ;Should always be false for distribution
  58.  
  59. ;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  60. ;The following equ should normally be set to 0.  It is only required if
  61. ;you have a Hazeltine terminal which uses tilde as a command character
  62.  
  63. hazeltine equ    false
  64.  
  65. ;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  66. ;Configure this source to your favourite assembler by setting one of
  67. ;the following equates to true.  If you use an assembler not mentioned
  68. ;below then make up a new equate for it.
  69.  
  70. M80    equ    false        ;Microsoft's Macro-80
  71. ASMB    equ    false        ;Cromemco's Z80 assembler
  72. SLR    equ    true        ;SLR's lightning-fast Z80ASM assembler
  73.  
  74. ;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  75.  
  76.     if    not ASMB
  77.     .Z80            ;so M80 users don't need /z switch
  78.     endif
  79.  
  80.     if    ASMB
  81.     list    nogen
  82. page    macro            ;Equivalence M80's "page" and ASMB's "form"
  83.     form
  84.     endm
  85.     endif
  86.  
  87. maxbp    equ    16        ;Number    of breakpoints configured
  88.  
  89. bs    equ    08h        ;ASCII     backspace
  90. tab    equ    09h        ;    tab
  91. lf    equ    0ah        ;    line feed
  92. formf    equ    0ch        ;    form feed
  93. cr    equ    0dh        ;    carriage return
  94. esc    equ    1bh        ;       escape    
  95. ctlx    equ    'X' and    1fh    ;    control    x - delete line
  96. ctlc    equ    'C' and    1fh    ;    control    c - warm boot
  97. eof    equ    'Z' and    1fh    ;    control    z - logical eof
  98. quote    equ    27h        ;    quote
  99. tilde    equ    7eh        ;    tilde
  100. del    equ    7fh        ;    del
  101.  
  102. bdos    equ    5
  103. fcb5c    equ    5ch        ;CP/M default FCB
  104.  
  105. nop    equ    000        ;Z80 instructions
  106. jp    equ    0c3h
  107. rst38    equ    0ffh
  108.  
  109. iobuf    equ    80h        ;Disk read buffer for symbol loading
  110.  
  111.     page
  112.  
  113. ;******************************************************************************
  114. ;*
  115. ;*    nint:      initialization - relocating loader - symbol loader
  116. ;*
  117. ;*    Initialization:
  118. ;*    - Save system I    register
  119. ;*    - Determine max symbol length before loading symbol table
  120. ;*        permissable values are 6 and 14 which are converted to bit
  121. ;*      masks by bumping by one 
  122. ;*    - Set CP/M DMA address to 80h
  123. ;*    - Check first command line argument for (xx) where xx is the
  124. ;*      number of slots in the symbol table to reserve.
  125. ;*    - Move first file name found in command line to local memory
  126. ;*      since it will be loaded last.  At the end of initialization
  127. ;*      (or symbol loading if required) this file name will be loaded
  128. ;*      into the keyboard input buffer and the file will be loaded
  129. ;*      just as if the user had entered the info as a Z8E command.
  130. ;*    - Move all subsequent file names in the    command    line buffer to
  131. ;*      local input buffer (inbf) in low memory, where they can
  132. ;*      be found by the parse    routine (prsr).
  133. ;*
  134. ;*    Relocating loader:
  135. ;*    - Move absolute    memory image of    Z8E to top of TPA
  136. ;*    - Adjust all addresses in relocated monitor to reflect new
  137. ;*      execution area.  This is accomplished by repeated calls to
  138. ;*      zlen to calculate instruction    lengths.
  139. ;*    - All addresses    < the absolute value of    z8eorg are considered
  140. ;*      to be    absolute values    and are    not modified.
  141. ;*    - Relocate all address pointers    in command and operand jump
  142. ;*      tables.
  143. ;*
  144. ;******************************************************************************
  145.  
  146.       if    M80 or SLR
  147.     aseg
  148.       endif
  149.  
  150.       if ASMB
  151.     abs
  152.       endif
  153.  
  154.       if    ASMB
  155.     global    case,column,init,row,rowb4?,mxycp
  156.     global    ttyi,ttyi00,ttyo,ttyq,maxlen,bdos,xycp
  157.       endif
  158.  
  159.     org    100h
  160.  
  161.     jp    nint
  162.  
  163. mbannr:    defb    cr,lf
  164.     defb    'Z8E  V1.4'
  165.     defb    cr,lf
  166.     defb    'Copyright (c) 1984, 1985  Richard A. Surwilo'
  167.     defb    cr,lf,lf
  168.     defb    0
  169.  
  170. nint:
  171.     ld    sp,stack
  172.     ld    a,i        ;Save i reg for user
  173.     ld    (ireg),a
  174.     call    init
  175.     ld    de,mbannr    ;Dispense with formalities
  176.     call    print
  177.  
  178. ;do config based on max length of symbol names
  179.  
  180.     ld    a,(maxlen)    ;Check max symbol length
  181.     inc    a        ;Create mask        
  182.     cp    15
  183.     ld    b,a        ;B - maxlen mask - 15
  184.     ld    a,62        ;A - maxlin disassembly line length (62)
  185.     ld    c,68        ;C - column to display first byte of memory
  186.                 ;    window for J command
  187.     ld    d,3        ;D - bytes per line of memory window display
  188.     jp    z,nint00    ;Z - max symbol length is 14
  189.  
  190.                 ;If not 14 - use default values
  191.     ld    b,7        ;B - maxlen mask -  7
  192.     ld    a,30        ;A - maxlin disassembly line length (30)
  193.     ld    c,56        ;C - column to display first byte of memory
  194.     ld    d,7        ;    window for J command
  195. nint00:    ld    (maxlin),a
  196.     ld    a,b
  197.     ld    (maxlen),a
  198.     ld    a,c
  199.     ld    (fwndow),a
  200.     ld    a,d
  201.     ld    (nlmask),a
  202.  
  203. ;Reset cp/m dma address for those instances in which z8e is used to debug
  204. ;itself.  Otherwise dma address is left where z8e stopped loading itself.
  205.  
  206.     ld    de,80h
  207.     ld    c,26
  208.     call    bdos
  209.     
  210.     ld    a,jp        ;Initialize where l80 fears to tread
  211.     ld    (038h),a    ;Init trap to breakpoint handler
  212.     ld    hl,5dh        ;Save current contents of default fcb
  213.     ld    a,(hl)
  214.     cp    '('        ;Is first char in fcb a paren?
  215.     dec    hl        
  216.     jr    nz,nint25    ;Not paren - no user symbol table requested
  217.     inc    hl        ;Point back to paren
  218.     ld    de,inbf        ;Start of input buffer here in low memory
  219.     ld    b,15        ;Max chars in fcb following first paren
  220. nint05:    inc    hl        ;Bump fcb pointer
  221.     ld    (de),a        ;Move char to low memory keyboard input buffer
  222.                 ;so that prsr thinks this is keyboard input
  223.     inc    de        ;Bump input buffer pointer 
  224.     ld    a,(hl)
  225.     cp    ')'        ;Look for trailing paren
  226.     jr    z,nint10
  227.     djnz    nint05        ;Examine entire fcb at 5ch looking for paren
  228.     ld    hl,fcb5c    ;Trailing paren not found - this must be
  229.                 ;kookie file name
  230.     jr    nint25        ;Ignore
  231.                 
  232. ;Call iarg to determine amount of space to allocate in user symbol table.
  233. ;This arg must be enclosed in parentheses and must appear after the first
  234. ;arg in the command line.  Since opening and closing parens were found
  235. ;add a pound sign to make this into default decimal number then call xval
  236. ;to evaluate.
  237.  
  238. nint10:    ex    de,hl        ;hl - input buffer pointer
  239.     ld    (hl),'#'    ;add trailing paren before calling iarg
  240.                 ;who will evaluate argument as if it was
  241.                 ;entered from keyboard
  242.     inc    hl
  243.     ld    (hl),a        ;restore trailing paren following pound sign
  244.     inc    hl
  245.     ld    (hl),0        ;add end of line null
  246.     call    iarg
  247.     ex    de,hl        ;de - evaluated argument
  248.     ld    hl,fcb5c
  249.     jr    nz,nint25    ;arg error - ignore input
  250.     ld    hl,81h        ;start of command line tail
  251. nint15:    ld    a,(hl)
  252.     ld    (hl),' '    ;replace the text which appeared between
  253.                 ;the parens and the parens themselves with
  254.                 ;spaces
  255.  
  256.     cp    ')'        ;closing paren ends search
  257.     jr    z,nint20
  258.     inc    hl        ;point to char following closing paren
  259.     jr    nint15
  260. nint20:    ex    de,hl        ;arg to hl for mult times maxlen bytes per 
  261.                 ;symbol table entry
  262.     add    hl,hl
  263.     add    hl,hl
  264.     add    hl,hl
  265.     ld    a,(maxlen)    ;8 or 16 bytes per symbol table entry?
  266.     cp    7
  267.     jp    z,nint22    ;z - must be 8
  268.     add    hl,hl
  269. nint22:    ex    de,hl    
  270.     ld    (usymbl),de    ;save number of bytes to reserve
  271.     ld    hl,6ch        ;since user symbol table arg was present then
  272.                 ;target file must be in default fcb number 2
  273.  
  274. nint25:    ld    de,zbuf        ;local buffer
  275.     ld    bc,16
  276.     ldir            ;move fcb contents to local memory
  277.     ld    hl,80h        ;command line buffer address
  278.     ld    a,(hl)
  279.     and    a        ;test for no input
  280.     jr    z,nint55    ;no input - clear symbol table
  281.     ld    c,a        ;bc - number of    chars in command line buffer
  282.     ld    (hl),b        ;clear byte count
  283.     add    hl,bc        ;point to last char in buffer
  284.     inc    hl
  285.     ld    (hl),b        ;set end of line null after last char
  286.     ld    hl,81h
  287. nint30:    ld    a,(hl)        ;look for start    of first file name
  288.     and    a        ;found the end of line null?
  289.     jr    z,nint55    ;z - no    files to load
  290.     cp    ' '        ;leading space?
  291.     jr    nz,nint35    ;not space - found start of file name
  292.     inc    hl
  293.     dec    c        ;decrement command line    byte count
  294.     jr    nint30        ;keep looking for start    of file    name
  295. nint35:    ld    de,znmbuf    ;save name here    for later display
  296.     ld    (de),a
  297.     inc    de
  298. nint40:    inc    hl        ;find first trailing space
  299.     ld    a,(hl)
  300.     cp    ' '
  301.     jr    z,nint45    ;found space - move remainder of buffer
  302.     ld    (de),a        ;save file name    character for display
  303.     inc    de
  304.     and    a        ;end of    line?
  305.     jr    z,nint55    ;z - only one file specified
  306.     dec    c
  307.     jr    nint40
  308. nint45:    ld    a,c        ;check byte count
  309.     cp    inbfsz        ;versus    size of    our local input    buffer
  310.     jr    c,nint50    ;carry - dize is ok
  311.     ld    c,inbfsz    ;only move as much as will fit
  312. nint50:    ld    de,inbf
  313.     ldir            ;move command line to local memory
  314.     xor    a
  315.  
  316. nint55:    ld    hl,z8eorg    ;clear local symbol table to nulls
  317.     ld    b,z8e-z8eorg    ;symbol    table size
  318. nint60:    ld    (hl),a        ;nulls to entire local symbol table
  319.     inc    hl
  320.     djnz    nint60
  321.     ld    hl,(06)        ;start of bdos
  322.     ld    l,a        ;init stack address to 256 boundary
  323.     ld    bc,nmem        ;monitor size
  324.     and    a
  325.     sbc    hl,bc        ;hl - starting address of z8e in upper
  326.                 ;memory
  327.     ld    (z8eb),hl    ;monitor bias -    for relocation work
  328.     ld    de,(usymbl)
  329.     sbc    hl,de
  330.     ld    (ntpa),hl    ;end of    tpa - for symbol loading
  331.     ld    a,d        ;check for no user symbol table
  332.     or    e
  333.     jr    z,nint75    ;no table - no clearing required
  334. nint70:    ld    (hl),0        ;fill user symbol table with nulls
  335.     inc    hl
  336.     dec    de
  337.     ld    a,d
  338.     or    e
  339.     jr    nz,nint70
  340. nint75:    ex    de,hl        ;hl - start of z8e in hi memory
  341.     
  342.     ld    hl,bphn-z8eorg    ;entry point to    breakpoint handler
  343.     add    hl,de
  344.     ld    (039h),hl    ;init rst 038h trap location
  345.     ld    hl,z8eorg
  346.     ldir            ;z8e now in hi memory - relocate addresses
  347.     ld    hl,(z8eb)    ;recover hi memory starting address
  348.     ld    de,z8ecmd-z8eorg
  349.     add    hl,de        ;first instruction to relocate
  350.     ex    de,hl
  351. nint80:    call    zlen00        ;calculate instruction length
  352.     ld    h,d
  353.     ld    l,e        ;de - current instruction   hl - ditto
  354.     ld    b,0
  355.     add    hl,bc
  356.     ex    de,hl        ;de - next address to relocate
  357.     ld    a,c        ;test length
  358.     sub    3
  359.     jr    c,nint90    ;one or    two byters are non-relocatable
  360.     ld    c,a
  361.     add    hl,bc        ;bump if four byter
  362.     ld    a,(hl)
  363.     ld    hl,z80r        ;table of relocatable instructions
  364.     ld    c,z80rl        ;size
  365.     cpir
  366.     jr    nz,nint90    ;nz - not relocatable
  367.     ex    de,hl
  368.     dec    hl        ;point to address byte requiring bias
  369.     ld    a,(hl)
  370.     sub    z8eorg shr 8    ;test for absolute address < z8eorg
  371.     jr    c,nint85    ;absolute - no relocation needed
  372.     ld    b,a
  373.     ld    a,(z8ebh)    ;hi order byte of address bias
  374.     add    a,b        ;plus upper byte of operand address
  375.     ld    (hl),a        ;set relocated address
  376. nint85:    inc    hl
  377.     ex    de,hl        ;de - next address to test
  378. nint90:    ld    bc,nrel-z8eorg    ;end of    relocatable portion of monitor
  379.     ld    hl,(z8eb)
  380.     add    hl,bc        ;hl - absolute end of relocated    monitor
  381.     and    a
  382.     sbc    hl,de        ;reached end?
  383.     jr    nc,nint80    ;nc - more
  384.     ld    de,ncmd+zopjtl    ;size -    command    and operand jump tables
  385.     ld    hl,(z8eb)    ;base of relocated monitor
  386.     ld    a,-(high z8eorg); [was:  ld a,-(z8eorg/256)]
  387.     add    a,h        ;relocation bias byte to add to    ptrs
  388.     ld    d,a        ;d - bias to add  e - count of pointers
  389.                 ;              requiring relocation
  390.     add    hl,bc        ;first point to    operand    names
  391.     ld    bc,zopjtb    ;add length of operand name table
  392.     add    hl,bc        ;point to first    entry in jump table
  393. nint95:    inc    hl
  394.     ld    a,(hl)        ;hi byte jump table entry
  395.     add    a,d        ;plus bias
  396.     ld    (hl),a        ;replace in table
  397.     inc    hl
  398.     dec    e
  399.     jr    nz,nint95    ;nz - more table entries to relocate
  400.  
  401.  
  402. ;******************************************************************************
  403. ;*
  404. ;*    zsym:    symbol table build from    .sym and .prn files
  405. ;*
  406. ;*    lfcb called to parse the input buffer (inbf) in low memory.
  407. ;*    inbf contains the command line tail which bdos passed to us at
  408. ;*    80h and which we have since moved to inbf (so that prsr thinks
  409. ;*    it's just keyboard input).
  410. ;*
  411. ;*    all valid file names are opened for input.
  412. ;*
  413. ;*    if the file name terminates with a comma then we assume    the
  414. ;*    user is    specifying a bias which    is to be added to every    symbol
  415. ;*    loaded from the    file.
  416. ;*
  417. ;*    zsym    general    file handiling
  418. ;*    .sym    load L80 .sym file or load slr .lst file
  419. ;*    .prn    load M80 .prn file
  420. ;*
  421. ;*    symbol table always begins on an 8 or 16 byte boundary  
  422. ;*    depending on the value in maxlen. 
  423. ;*
  424. ;******************************************************************************
  425.  
  426. zsym:    call    lfcb        ;initialize fcb
  427.     jp    nz,zstx        ;nz - error
  428.     ld    de,mldg        ;display loading message
  429.     call    nprint        ;output    crlf - then print
  430.     ld    de,prsbf
  431.     call    print        ;display file name
  432.     ld    a,c         ;lfcb returns delimeter in c reg
  433.     ld    (delim),a    ;temp save delimiter so we know if a bias has
  434.                 ;been specified
  435.     call    crlf
  436.     call    lopn        ;try to    open symbol table file
  437.     dec    a        ;
  438.     jp    m,zfnf        ;m - file not found
  439.     ld    a,(delim)    ;check delimeter
  440.     cp    ','
  441.     ld    hl,00
  442.     jr    nz,zsym10    ;nz - no comma means no    symbol bias
  443.     call    prsr        ;let prsr extract symbol bias
  444.     jp    nz,zoff        ;parse error - use bias    of 0000
  445.     ld    (delim),a    ;save delimeter    which followed bias
  446.     ld    de,prsbf
  447.     ld    hl,00
  448.     call    xval        ;evaluate bias
  449.     jr    z,zsym10    ;z - numeric bias specified
  450.                 
  451.                 ;user has specified a bias in the form
  452.                 ;of a symbol name         
  453.     ld    hl,(ntpa)    ;check bias specified by symbol    name
  454.     ld    a,(maxlen)
  455.     cpl
  456.     ld    e,a
  457.     ld    d,0ffh        ;lower end of tpa by amount equal to 
  458.                 ;the value of maxlen negated to insert
  459.                 ;jump to bdos
  460.     add    hl,de
  461.     ld    a,(case)    ;check case of symbol table
  462.     and    a
  463.     jp    z,zsym05    ;z - symbol names are already in upper case
  464.     ld    de,prsbf    ;prsr stored symbol name here 
  465. zsym00:    ld    a,(de)
  466.     and    a
  467.     jp    z,zsym05    ;z - end of label symbol name
  468.     call    ilcs        ;change each char in symbol name to lower case
  469.     ld    (de),a
  470.     inc    de        ;store converted character
  471.     jp    zsym00
  472. zsym05:    ld    de,prsbf    
  473.     call    fsym00        ;search    symbol table
  474.     jp    nz,zoff        ;nz - not found
  475.     ld    a,(maxlen)
  476.     or    l
  477.     ld    l,a
  478.     ld    a,(hl)        ;fetch hi order    address    associated
  479.                 ;with symbol
  480.     dec    hl             
  481.     ld    l,(hl)         
  482.     ld    h,a        ;hl - symbol value
  483. zsym10:    ld    (bias),hl    ;bias to add to    each symbol address
  484.     ld    hl,00          
  485.     ld    a,(fcbtyp)     
  486.     ld    bc,(ntpa)    ;current end of tpa
  487.     cp    'S'        ;is this a .sym    file?
  488.     jp    z,.sym        ;.sym file loaded differently than .prn
  489.     cp    'L'
  490.     jp    nz,.prn        ;if not .lst then must be .prn
  491.     ld    de,.lst??    ;look for .lst string id string      
  492.     ld    (pstrng),de    ;store pointer to string to find
  493.     call    fstrng
  494.  
  495.                 ;bc - symbol table pointer
  496.  
  497. .sym:    ld    a,(maxlen)    ;lower tpa address by 16 or 8
  498.     cpl
  499.     and    c        ;for storing next symbol and address
  500.     ld    c,a
  501.     ld    a,(maxlen)
  502.     cpl            ;this is negate plus one
  503.     add    a,c
  504.     ld    c,a
  505.     jp    c,.sym00    ;treat carry as complement of subtraction
  506.     dec    b
  507. .sym00:
  508.     ex    de,hl
  509.     ld    hl,stack+8    ;check for monster symbol table    ready to eat us
  510.     and    a
  511.     sbc    hl,bc
  512.     jp    nc,zmem        ;end symbol load before    stack is clobbered
  513.     ex    de,hl
  514.     ld    a,(maxlen)    ;load symbol length mask (7 or 15)
  515.     dec    a        ;
  516.     ld    d,a        ;d - actual max length of symbols (6 or 14)
  517.     xor    a
  518. .sym10:    ld    (bc),a        ;init symbol table entry to nulls
  519.     inc    bc
  520.     dec    d
  521.     jr    nz,.sym10
  522.     ld    e,d        ;clear de for hex00
  523.     xor    a
  524.     ld    (star),a    ;clear ** found flag
  525.     ld    a,4        ;convert four bytes of address
  526.     ld    (bytes),a
  527. .sym20:    call    nchr        ;fetch next character in file
  528.     cp    eof
  529.     jp    z,.eof        ;end of this symbol file
  530.     cp    '0'
  531.     jr    nc,.sym25    ;c -  must be control character or space
  532.                 ;nc - possible first char of address
  533.     cp    lf
  534.     jp    z,.sym21    ;     
  535.     cp    '*'        ;** in slr .sym file?
  536.     jp    nz,.sym20
  537.     ld    (star),a
  538.     jp    .sym25
  539.     
  540. .sym21:
  541.     call    nchr        ;fetch char following lf    
  542.     cp    cr
  543.     jp    z,.sym22    ;z - consecutive crlf's means end of page
  544.     cp    '0'
  545.     jp    nc,.sym25    ;nc - symbol address on new line
  546.     cp    eof
  547.     jp      z,.eof
  548.     cp    '*'        ;** ?
  549.     jp    nz,.sym20
  550.     ld    (star),a
  551.     jp    .sym25
  552.     
  553. .sym22:
  554.     ld    a,(fcbtyp)
  555.     cp    'L'        ;z80asm .lst file?
  556.     jp    z,.sym23
  557.     cp    'P'        ;macro 80 v3.4?
  558.     jp    nz,.sym20    
  559. .sym23:
  560.     ld    de,.lst??    ;bypass inter-page verbiage
  561.     ld    (pstrng),de
  562.     call    fstrng
  563.     cp    eof
  564.     jp    z,.eof
  565.  
  566.     call    nchr
  567.     cp    eof
  568.     jp    z,.eof
  569.     
  570.  
  571. .sym25:    call    hex00        ;have first char of address - convert
  572.     call    totsym        ;bump total of symbols loaded
  573.     ld    a,(fcbtyp)    ;is this a .sym file?
  574.     cp    'S'
  575.     call    nz,nchr        ;eat addrress/symbol separator for .lst file
  576.     ld    a,(maxlen)
  577.     dec    a
  578.     ld    (bytes),a    ;init max symbol length counter
  579. .sym30:    call    nchr        ;read symbol name char
  580.     cp    tab
  581.     jp    z,.sym45
  582.     cp    cr
  583.     jp    z,.sym45
  584.     cp    ' '
  585.     jp    z,.sym45
  586.     ld    (bc),a
  587.         ld    a,(case)        ;check user requested case
  588.     and    a
  589.     jr    z,.sym35    ;z - upper case    requested by user
  590.     ld    a,(bc)        ;recover char
  591.     cp    'A'
  592.     jr    c,.sym35    ;c - must be number
  593.     cp    'Z'+1
  594.     jp    nc,.sym35
  595.     or    20h
  596.     ld    (bc),a          ;restore symbol name char as lower case
  597. .sym35:    inc    bc              
  598.     ld    a,(bytes)
  599.     dec    a
  600.     ld    (bytes),a
  601.     jr    nz,.sym30
  602. .sym40:    call    nchr
  603.     cp    21h
  604.     jp    nc,.sym40
  605. .sym45:    ld    a,(star)    ;check if this was ** in address field
  606.     and    a
  607.     jp    nz,.sym50  
  608.     ld    a,(relchr)    ;check for external symbol
  609.     cp    ' '
  610.     jp    z,.sym        ;space means absolute
  611.     cp    quote    
  612.     jp    z,.sym        ;quote means relocatable
  613. .sym50:    ld    a,(maxlen)
  614.     or    c
  615.     ld    c,a
  616.     inc    bc        ;point bc to next higher symbol block so
  617.                 ;that rewinding by maxlen bytes will actually
  618.                 ;overlay this symbol. this ensures that 
  619.                 ;external symbols are not kept in table. 
  620.     
  621.     jp    .sym
  622.  
  623.  
  624. .prn:    ld    de,.prn??
  625.     ld    (pstrng),de
  626.     call    fstrng
  627.     cp    eof
  628.     jp    nz,.prn00
  629.  
  630.     ld    de,msymnf       ;display symbol table not found message   
  631.     call    print
  632.     jp    .eof50          ;check for more symbol files to load
  633.  
  634. .prn00:
  635.     ld    bc,(ntpa)       ;bc - current end of the tpa
  636.     dec    bc              ;this points us into the next lower 
  637.                                 ;symbol table block
  638.                 ;this is first char of symbol table
  639.     xor    a
  640.     or    l        ;get next byte from file but without bumping
  641.                 ;pointer allowing us to reread same char (in
  642.                 ;case it is last character in buffer    
  643.  
  644.     call    z,read        ;only do true read if last character was last
  645.                 ;in buffer    
  646.     ld    a,(hl)
  647.     cp    '0'
  648.     jp    c,.pr325    ;non-numeric: macro-80 v3.44    
  649.                 
  650.     cp    '9'+1
  651.     jp    c,.pr4        ;numeric:     macro-80 v3.4
  652.  
  653.  
  654. ;macro-80 v3.4 dec 1980 symbol table load    
  655.                 
  656. .pr325:    ld    a,(maxlen)
  657.     cpl
  658.     and    c               ;now rewind within 8 or 16 byte block 
  659.                 ;(depending on maxlen) in order to point
  660.                 ;to first byte                               
  661.     ld    c,a
  662.  
  663.         ex    de,hl           ;de - save file buffer pointer 
  664.     ld    hl,stack + 16   ;check for encroaching symbol table
  665.     sbc    hl,bc           ;versus current symbol table address
  666.     jp    nc,zmem         ;nc - out of memory
  667.     ex    de,hl           ;return file buffer pointer
  668.     ld    a,(maxlen)
  669.     ld    d,a
  670.     dec    d        ;d - symbol name length
  671.     xor    a              
  672.     ld    e,a
  673. .pr330:    ld    (bc),a          ;pre-clear name portion of symbol table to 
  674.                                 ;nulls
  675.     inc    bc
  676.     dec    d               ;now any name less than maxlen chars in length
  677.     jp    nz,.pr330       ;is terminated with a null
  678.     ld    a,(maxlen)
  679.     cpl
  680.     and    c
  681.     ld    c,a
  682. .pr335:    call    nchr            ;next char from file buffer
  683.     cp    21h
  684.     jp    nc,.pr351    ;nc - this is first character of symbol name
  685.     cp    eof        ;end of    file?
  686.     jp    z,.eof
  687.     cp    lf        ;line feed?
  688.     jp    nz,.pr335
  689. .pr340:    call    nchr        ;get character following line feed
  690.     cp    cr
  691.     jp    z,.pr342
  692.     cp    formf        ;form feed?
  693.     jp    nz,.pr351
  694. .pr342:    ld    e,3        ;symbols resume    three lines hence following
  695.                 ;a form feed character - so count linefeeds
  696.     cp    cr        ;did we find cr or a formf?
  697.     jp    nz,.pr345    ;nz - formf
  698.     dec    e        ;just look for two lf's
  699. .pr345:    call    nchr
  700.     cp    lf
  701.     jp    nz,.pr345    ;loop til three found
  702.     dec    e
  703.     jp    nz,.pr345
  704.  
  705.     xor    a
  706.     or    l        ;get next byte from file but without bumping
  707.                 ;pointer allowing us to reread same char in
  708.                 ;case it is last character in buffer    
  709.  
  710.     call    z,read        ;only do true read if last character was last
  711.                 ;in buffer    
  712.     ld    a,(hl)
  713.     cp    cr        ;four crlf's is eof
  714.     jp    z,.eof
  715.  
  716. .pr350:    call    nchr            ;next char from file
  717.     cp    eof
  718.     jp    z,.eof
  719.     cp    tab
  720.     jp    z,.pr355
  721. .pr351:    ld    (bc),a        ;move character    of symbol name
  722.     ld    a,(case)        ;check user requested case
  723.     and    a
  724.     jr    z,.pr352        ;z - user wants upper case
  725.     ld    a,(bc)          ;get char back from symbol table
  726.     cp    'A'
  727.     jr    c,.pr352        ;must be numeric - no case here
  728.     cp    'Z'+1
  729.     jr    nc,.pr352
  730.     add    a,20h
  731.     ld    (bc),a          ;replace char with lower case equivalent
  732. .pr352:    inc    bc
  733.     jp    .pr350
  734.  
  735. .pr355:    ld    a,4
  736.     ld    (bytes),a
  737. .pr357:    call    nchr
  738.     cp    ' '
  739.     jp    z,.pr357
  740.  
  741.     call    hex00           ;now read the next four characters from the
  742.                 ;file and convert them to a hex address -
  743.                 ;store in symbol table entry
  744.  
  745.  
  746.     ld    a,(relchr)      ;recover char which followed address
  747.  
  748.     cp    ' '             ;this char followed address
  749.     jr    z,.pr370        ;microsoft absolute address 
  750.     cp    quote           ;relocatable address?
  751.     jp    nz,.pr325
  752.                                 ;by not rewinding the symbol table pointer
  753.                                 ;the next symbol will overlay this one.  
  754.  
  755. .pr370:    dec    bc
  756.     call    totsym
  757.  
  758.     jp    .pr325
  759.  
  760.  
  761. ;macro-80 v3.44 symbol loading routine
  762.                 
  763. .pr4:    ld    a,(maxlen)    ;lower tpa address by maxlen
  764.     cpl
  765.     and    c        ;for storing next symbol and address
  766.     ld    c,a        ;bc - next address of symbol table entry
  767.                 ;     on an 8 or 16 byte boundary    
  768.     ex    de,hl
  769.     ld    hl,stack+8    ;check for monster symbol table    
  770.     and    a
  771.     sbc    hl,bc
  772.     jp    nc,zmem        ;end symbol load before    stack is clobbered
  773.     ex    de,hl
  774.     ld    a,(maxlen)
  775.     dec    a        ;pre-clear symbol table entry with nulls
  776.     ld    d,a
  777.     xor    a
  778. .pr410:    ld    (bc),a        ;for length equal to maxlen
  779.     inc    bc
  780.     dec    d
  781.     jr    nz,.pr410
  782.     ld    e,d        ;clear de for hex00
  783.     ld    a,4        ;convert four bytes of address
  784.     ld    (bytes),a
  785. .pr420:    call    nchr        ;fetch next character in file
  786.     cp    eof
  787.     jp    z,.eof
  788.     cp    '0'
  789.     jr    nc,.pr425    ;nc - address digit
  790.     cp    lf
  791.     jp    nz,.pr420    ;nz - leading space or cr
  792.  
  793.  
  794.     call    nchr        ;check character following lf
  795.     cp    cr
  796.     jp    z,.eof        ;blank line is eof
  797.  
  798.     cp    formf        ;form feed?
  799.     jp    nz,.pr425    ;no - first character of next address
  800.  
  801.     ld    e,3        ;must be form feed
  802. .pr421:    call    nchr
  803.     cp    lf        ;three lf's follow form feed before symbols
  804.                 ;resume on next page
  805.     jp    nz,.pr421
  806.     dec    e
  807.     jp    nz,.pr421
  808.  
  809.     call    nchr
  810.     cp    eof
  811.     jp    z,.eof
  812.  
  813. .pr425:    
  814.     call    hex00        ;have first char of address - convert
  815.  
  816.     call    nchr        ;eat address/symbol separator
  817.  
  818.     ld    a,(maxlen)
  819.     dec    a
  820.     ld    (bytes),a    ;max chars to store in symbol table
  821.  
  822.  
  823. .pr430:    call    nchr        ;read symbol name char
  824.     cp    21h        
  825.     jp    c,.pr440    ;found separator
  826.     ld    (bc),a
  827.         ld    a,(case)        ;check user requested case
  828.     and    a
  829.     jr    z,.pr435    ;c - upper case    requested by user
  830.     ld    a,(bc)        ;recover char
  831.     cp    'A'
  832.     jr    c,.pr435    ;c - must be number
  833.     cp    'Z'+1
  834.     jr    nc,.pr435
  835.     or    20h
  836.     ld    (bc),a          ;restore symbol name char as lower case
  837. .pr435:    inc    bc              ;bump symbol table pointer
  838.     ld    a,(bytes)    ;character counter
  839.     dec    a
  840.     ld    (bytes),a
  841.     jp    nz,.pr430    ;not max length
  842.  
  843.                 
  844. .pr438:    call    nchr        ;eat chars until next address found
  845.     cp    eof        
  846.     jp    z,.eof
  847.     cp    ' '        ;found symbol/address
  848.     jp    nz,.pr438
  849.  
  850.  
  851. .pr440:    ld    a,(maxlen)
  852.     cpl
  853.     and    c
  854.     ld    c,a
  855.  
  856.     ld    a,(relchr)      ;recover char which followed address
  857.     cp    ' '             ;this char followed address
  858.     jr    z,.pr450        ;microsoft absolute address 
  859.     cp    quote           ;relocatable address?
  860.     jp    nz,.pr4            ;nz - must be  external symbol. we don't
  861.                                 ;actually load them or count them in total.
  862.                                 ;by not rewinding the symbol table pointer
  863.                                 ;the next symbol will overlay this one.  
  864.  
  865. .pr450:    dec    bc
  866.     call    totsym
  867.     jp    .pr4
  868.  
  869.  
  870.  
  871.  
  872. .eof:                           ;we always pre-decrement the symbol table
  873.                                 ;pointer in anticipation of storing the next
  874.                                 ;symbol. now that we hit the end of a symbol
  875.                                 ;table we must adjust the pointer in 
  876.                                 ;preparation for loading the symbols from the
  877.                                 ;next file (if there is one).
  878.         ld    a,(maxlen)
  879.     ld    l,a
  880.     ld    h,0
  881.     inc    l
  882.     add    hl,bc           ;point to last loaded symbol
  883.     ld    b,h
  884.     ld    c,l             ;bc - spare copy
  885.     cpl
  886.     and    c
  887.     ld    c,a
  888.     ld    (ntpa),bc       ;save current end of tpa address
  889.         ld    a,(nsymhi)      ;hi order number of symbols loaded (bcd)
  890.     call    hexc            ;convert to ascii  
  891.     ld    h,a             ;returned in a - move to h (other digit in l)
  892.     ld    (mhex),hl       ;store in message
  893.     ld    a,(nsymlo)
  894.     call    hexc            ;convert lo order
  895.     ld    h,a
  896.     ld    (mhex+2),hl
  897.     ld    de,msym..       ;display number of symbols loaded message
  898.     ld    c,9
  899.     call    bdos
  900.     ld    de,mhex         ;now look thru ascii number of symbols to 
  901.                                 ;strip leading zeros
  902.     ld    b,3
  903. .eof10:    ld    a,(de)          
  904.     cp    '0'
  905.     jr    nz,.eof20       ;nz - found first non-zero
  906.     inc    de
  907.     djnz    .eof10          ;if first three chars zero - fall thru and
  908.                                 ;print the fourth regardless
  909. .eof20: ld      c,09
  910.     call    bdos            ;print the number as string ending with $
  911.     call    crlf
  912.     ld    hl,(tsym)       ;now add in bcd total for this file to bcd
  913.                                 ;total for all files
  914.     ld    de,(nsym)       ;tsym - total for all files
  915.                                 ;nsym - total for this file
  916.     ld    a,h
  917.     add    a,d
  918.     daa
  919.     ld    h,a
  920.     ld    a,l
  921.     adc    a,e
  922.     daa
  923.     ld    l,a
  924.     ld    (tsym),hl
  925.     ld      hl,00           ;clear out total for next file
  926.     ld    (nsym),hl
  927.     ld    hl,(z8eb)
  928.     ld    de,symflg-z8eorg
  929.     add    hl,de           ;hl - pointer to symbol flag in hi memory
  930.     xor    a               
  931.     ld    (hl),a        ;zero -    symbol table present
  932.     ld    (symflg),a      ;also set flag in lo memory where we are
  933.                                 ;currently so that fsym knows theres a symbol
  934.                                 ;table to search thru if the user specified a
  935.                                 ;symbol name bias as part of the command line
  936.  
  937. .eof50:    ld    a,(delim)       ;check command line delimter
  938.     and    a               ;test for end of line null
  939.     jp    nz,zsym         ;nz - not null means more files
  940.  
  941.  
  942.  
  943.                     
  944. load:    ld    hl,(ntpa)    ;current end of    memory
  945.     ld    a,(symflg)    ;check for symbol table
  946.     and    a
  947.     jr    nz,load00    ;nz - no symbol    table
  948.     ld    d,a
  949.     ld    a,(maxlen)
  950.     ld    e,a        ;de - length of a symbol table block
  951.     inc    e
  952.     sbc    hl,de        ;compensate for    pre-increment of pointer
  953. load00:    ld    de,(06)        ;de - real entry point to bdos
  954.     ld    (06),hl        ;point to our origin in    hi memory
  955.     ld    (hl),jp        ;init jump to bdos at start of z8e
  956.     inc    hl
  957.     ld    (hl),e
  958.     inc    hl
  959.     ld    (hl),d
  960.     ld    e,0        ;de - old start of bdos address in also our 
  961.                                 ;ending address
  962.     ld    hl,(z8eb)       ;load out starting address in hi memory
  963.     ld    bc,z8e-z8eorg   ;fetch the number of bytes between z8e's base
  964.                                 ;address and the entry point of the command    
  965.                                 ;processor  - internal symbol table size
  966.  
  967.     add    hl,bc
  968.     ld    b,h
  969.     ld    c,l        ;bc - relocated    z8e address
  970.     ex    de,hl           ;de - entry point z8e   hl - old start of bdos
  971.     dec    hl              ;hl - last byte in our memory
  972.     ld    (hl),b
  973.     dec    hl
  974.     ld    (hl),c        ;z8e (monitor entry point) on stack
  975.     ld    sp,hl           ;now set current stack to just below our  
  976.                                 ;return address
  977.     ex    de,hl           ;hl - relocated address z8e
  978.     inc    hl
  979.     inc    hl              ;hl - points to ld  sp,0000 instruction at the
  980.                                 ;start of the command processor. replace 0000
  981.                                 ;with the address bdos-1 
  982.     ld    (hl),e          ;set real stack address
  983.     inc    hl
  984.     ld    (hl),d
  985.     ld    hl,(z8eb)    ;base of relocated code
  986.     ld    de,fcb-z8eorg    ;relative offset from start of monitor
  987.     add    hl,de
  988.     ex    de,hl        ;de - fcb address in relocated monitor in hi
  989.                                 ;memory
  990.     ld    hl,zbuf        ;
  991.     ld    bc,16
  992.     ldir            ;init fcb with saved file name
  993.     ld    de,mz8eld    ;print memory space occupied by    z8e
  994.     call    print
  995.     ld    hl,(z8eb)       ;display our base address in upper memory
  996.     call    outadr
  997.     ld    a,'-'           
  998.     call    ttyo
  999.     call    space
  1000.     call    space
  1001.     ld    hl,(06)         ;this points to the new jump to bdos
  1002.     inc    hl              
  1003.     ld    e,(hl)          ;de - old start of bdos address
  1004.     inc    hl
  1005.     ld    d,(hl)
  1006.     ex    de,hl
  1007.     ld    l,0             ;256 byte boundary to bypass cp/m serial no.
  1008.     call    outadr
  1009.  
  1010.     ld    a,(symflg)      ;test for presence of symbol table
  1011.     and    a
  1012.     jr    nz,load40       ;nz - no table
  1013.     ld    de,msymld       ;display start address of symbol table message
  1014.     call    print
  1015.     ld    hl,(06)         ;vector to bdos is start of symbol table
  1016.     call    outadr
  1017.     ld    a,'-'
  1018.     call    ttyo
  1019.     call    space
  1020.     call    space
  1021.     ld    hl,(z8eb)       ;start of internal symbol table is end of 
  1022.                                 ;symbol table built from files
  1023.     dec    hl
  1024.     call    outadr
  1025.  
  1026.     ld    a,(tsymhi)      ;total number of symbols from all files (bcd)
  1027.     call    hexc            ;convert to ascii
  1028.     ld    h,a             ;move hi order ascii digit to h
  1029.     ld    (mhex),hl       ;store double ascii digit
  1030.     ld    a,(tsymlo)
  1031.     call    hexc            ;convert lo order
  1032.     ld    h,a
  1033.     ld    (mhex+2),hl     ;save in string
  1034.     ld    de,tsym..       ;total symbols message
  1035.     ld    c,9
  1036.     call    bdos
  1037.     ld    de,mhex         ;address of ascii digits
  1038.     ld    b,3             ;check for leading zeros
  1039. load20:    ld    a,(de)          
  1040.     cp    '0'
  1041.     jr    nz,load30       ;nz - found first nz in string
  1042.     inc    de
  1043.     djnz    load20          ;check first three digits then fall thru and
  1044.                                 ;print fourth regardless
  1045. load30:    ld    c,09
  1046.     call    bdos
  1047.  
  1048. load40:    ld    hl,(06)
  1049.     dec    hl              ;hl - address of new tpa
  1050.     ld    de,mnvmem       ;display address as memory available
  1051.     call    print
  1052.     call    outadr
  1053.     call    crlf
  1054.     ld    (hl),0          ;now store two zeros at the top of the tpa and
  1055.                                 ;set stack pointer to this very same address.
  1056.                                 ;this allows users to do a warm boot via ret 
  1057.                                 ;in the same way as if they had been loaded by
  1058.                                 ;cp/m.
  1059.     dec    hl
  1060.     ld    (hl),0
  1061.     ld    bc,(z8eb)       ;our relocated address in hi memory 
  1062.     ex    de,hl           ;de - last available location in tpa
  1063.     ld    hl,spreg-z8eorg ;address (relative to the start of z8e) where
  1064.                                 ;we store the user stack pointer address
  1065.     add    hl,bc           ;hl - pointer to 
  1066.     ld    (hl),e          ;save user stack in spreg in hi memory 
  1067.     inc    hl
  1068.     ld    (hl),d
  1069.     ld    hl,z8e-z8eorg   
  1070.     ld    a,(zbufnm)    ;first char of file name
  1071.     cp    ' '             ;do we have a file to load?
  1072.     jr    z,load50        ;z - no 
  1073.     ld    de,mldg         ;display loading message and target file name
  1074.     call    nprint
  1075.     ld    de,znmbuf
  1076.     call    print           
  1077.                                 ;enter the monitor in hi memory at entry
  1078.                                 ;point lldr10 
  1079.         
  1080.     ld    hl,lldr10-z8eorg
  1081.     ld    bc,(z8eb)
  1082. load50:    add    hl,bc           ;hl - actual address of lldr10 in hi memory
  1083.     ex    de,hl           ;now clear out the buffer at 80h so the user
  1084.                                 ;program doesn't mistakenly think that our
  1085.                                 ;command line tail is really his.
  1086.     ld    hl,iobuf
  1087.     ld    (hl),0          ;set number of chars zero (80h)
  1088.     inc    hl
  1089.     ld    b,127           ;clear until start of tpa
  1090. load60:    ld    (hl),' '
  1091.     inc    hl
  1092.     djnz    load60
  1093.     ex    de,hl           ;lldr10 address back to hl
  1094.     jp    (hl)            ;hi-ho, hi-ho to the loader we must go 
  1095.  
  1096.  
  1097.  
  1098.     page
  1099. ;this routine reads one char from the disk i/o 
  1100. ;buffer returning it in a. upon entry we check
  1101. ;the lo order buffer pointer - 0 means we hit 
  1102. ;the  256 boundary (end of buffer) and a  read
  1103. ;is needed. 
  1104.  
  1105. nchr:    xor    a
  1106.     or    l
  1107.     call    z,read
  1108.     ld    a,(hl)
  1109.     inc    hl
  1110.     ret
  1111.  
  1112. read:    push    bc
  1113.     push    de
  1114.     ld    de,fcb
  1115.     ld    c,20            ;sequential file read
  1116.     call    bdos
  1117.     and    a               ;test for error
  1118.     ld    hl,iobuf        ;assume ok - init i/o buffer address
  1119.     pop    de
  1120.     pop    bc
  1121.     ret    z               ;z - no errors
  1122.     ld    de,msymnf       ;display symbol table not found message   
  1123.     call    print
  1124.     ld    sp,stack        ;reinit stack
  1125.     jp    .eof50          ;check for more symbol files to load
  1126.  
  1127.  
  1128. ;hexc
  1129. ;convert byte in a to two ascii hex digits.
  1130. ;return: a - converted hi order digit
  1131. ;        l -           lo order digit
  1132.  
  1133. hexc:    ld    h,a
  1134.     rrca
  1135.     rrca
  1136.     rrca
  1137.     rrca
  1138.     call    hexc00
  1139.     ld    l,a
  1140.     ld    a,h
  1141. hexc00:    and    0fh
  1142.     add    a,90h
  1143.     daa
  1144.     adc    a,40h
  1145.     daa
  1146.     ret
  1147.  
  1148.  
  1149. ;hex:
  1150. ;this routine is called by the symbol table
  1151. ;building routines, .sym and .prn and its
  1152. ;its function is to convert ascii addresses
  1153. ;into binary.  since we are reading files in
  1154. ;a known format we don't init any loop counts;
  1155. ;instead, we look for delimeters. 
  1156.  
  1157.  
  1158. hex:    call    nchr            ;get char from disk i/o buffer
  1159. hex00:    cp    3ah             ;convert ascii to hex
  1160.     jp    c,hex10         ;c - must be delimeter
  1161.     sub    7
  1162. hex10:    sub    '0'
  1163.     ex    de,hl           ;shift hl left four
  1164.     add    hl,hl
  1165.     add    hl,hl
  1166.     add    hl,hl
  1167.     add    hl,hl
  1168.     or    l               ;or in this new digit
  1169.     ld    l,a
  1170.     ex    de,hl
  1171.     ld    a,(bytes)
  1172.     dec    a
  1173.     ld    (bytes),a
  1174.     jp    nz,hex
  1175.     call    nchr
  1176.     cp    'I'             ;global?
  1177.     call    z,nchr          ;z - need to read next to determine absolute
  1178.                                 ;    or relocatable
  1179.  
  1180.     ld    (relchr),a      ;we need to save this character for .prn files
  1181.                                 ;so we can tell whether to add this symbol
  1182.                                 ;to the count of symbols loaded.  if this
  1183.                                 ;is an external name we skip the add.
  1184.  
  1185.     cp    ' '             ;space means absolute
  1186.     jr    z,hex30         ;no bias added to absolute symbols
  1187.     ld    a,(biaslo)
  1188.     add    a,e             ;add in bias as specified by user or default
  1189.                                 ;as initialized by us (zero)
  1190.     ld    e,a
  1191.     ld    a,(biashi)
  1192.     adc    a,d
  1193.     ld    d,a
  1194. hex30:    ld    a,(maxlen)      ;now point to last byte of symbol table
  1195.                                 ;entry, which is where we will store
  1196.                                 ;address just computed 
  1197.     cpl
  1198.     and    c
  1199.     ld    c,a
  1200.     ld    a,(maxlen)
  1201.     or    c
  1202.     ld    c,a             ;never worry about carry - we always start 
  1203.                                 ;with 256 boundary
  1204.         ld    a,d             ;store lo order symbol address
  1205.     ld    (bc),a
  1206.     dec    bc        ;point to penultimate byte in block
  1207.     ld    a,e             ;hi order byte of address into symbol table
  1208.     ld    (bc),a
  1209.     ld    a,(maxlen)    ;mask to rewind symbol table pointer to the
  1210.                 ;start of this block
  1211.     cpl
  1212.     and    c
  1213.     ld    c,a
  1214.     ret
  1215.  
  1216.  
  1217. totsym:    ld    de,nsymlo       ;nsym - bcd running count of the number of 
  1218.     ld    a,(de)        ;       symbols loaded so far
  1219.     add    a,1        ;bump by one symbol
  1220.     daa                     ;keep bcd format
  1221.     ld    (de),a
  1222.     ret    nc
  1223.     dec    de              ;account for carry by bumping hi order byte
  1224.     ld    a,(de)
  1225.     add    a,1
  1226.     daa
  1227.     ld    (de),a
  1228.     ret
  1229.                                 
  1230.  
  1231. ;zstx:            
  1232. ;possible syntax error was detected as lfcb tried to init the fcb.
  1233. ;however, we never keep track of how many files appeared in the 
  1234. ;command line we just keep calling lfcb.  hence, we will always get
  1235. ;an error return at some point when the input buffer runs out of 
  1236. ;valid input.  we check for real syntax error or end of command
  1237. ;line by examining the first byte of the parse buffer:  if zero then
  1238. ;prsr found no valid characters in the input buffer and this is the
  1239. ;end of input - else, lfcb found real syntax error.
  1240.  
  1241.  
  1242. zstx:    ld    a,(prsbf)
  1243.     and    a        ;real syntax error - or    end of input?
  1244.     jp    z,load          ;z - more files 
  1245.     ld    de,mldg        ;display loading message and symbol name
  1246.                 ;to preserve the syntax used on good loads
  1247.     call    nprint
  1248.     ld    de,prsbf    ;display file name currently in parse buffer so
  1249.                 ;user knows where goof was
  1250.     call    print
  1251.     call    crlf
  1252.     ld    de,msntx    ;now display syntax error
  1253.     call    print
  1254.     jp    .eof50        ;check for more files to load
  1255.  
  1256.  
  1257. zfnf:    ld    de,mfilnf    ;display file not found 
  1258.     call    print
  1259.     jp    .eof50
  1260.  
  1261.  
  1262. zmem:    ld    de,mmem??    ;display out of memory message
  1263.     call    print
  1264.     call    crlf
  1265.     ld    hl,maxlen
  1266.     ld    l,(hl)
  1267.     ld    h,00        
  1268.     add    hl,bc
  1269.     ld    (ntpa),hl
  1270.     jp    load
  1271.  
  1272.  
  1273. zoff:    ld    de,minvof    ;display invalid offset using 0000 message
  1274.     call    print
  1275.     ld    hl,00
  1276.     jp    zsym10
  1277.  
  1278.  
  1279. fstrng:    
  1280.     push    bc
  1281.     push    de
  1282. fstr00:    
  1283.     ld    de,(pstrng)     ;address of canned string pointer
  1284.     ld    a,(de)        ;length
  1285.     ld    b,a
  1286.     inc    de
  1287. fstr10:    call    nchr        ;get char
  1288.     cp    eof
  1289.     jp    z,fstr20
  1290.     ex    de,hl        ;de - buffer ptr  hl - "symbols:" string ptr
  1291.     cp    (hl)
  1292.     ex    de,hl
  1293.     jp    nz,fstr00    ;mismatch read more from file
  1294.     inc    de
  1295.     djnz    fstr10          ;check entire string length
  1296. fstr20:    pop    de
  1297.     pop    bc    
  1298.     ret
  1299.  
  1300. .lst??:    defb    .lstsz        ;string length
  1301.     defb    'Symbol Table:'
  1302.     defb    cr,lf,cr,lf
  1303. .lstsz    equ    $ - .lst?? - 1
  1304.  
  1305.  
  1306. .prn??:    defb    .prnsz        ;string length    
  1307.     defb    'Symbols:'    ;string to search for in M80's .prn files 
  1308.                 ;indicating start of symbol table
  1309.     defb    cr,lf
  1310. .prnsz    equ    $ - .prn?? - 1
  1311.  
  1312.  
  1313. tsym:
  1314. tsymhi:    defb    0
  1315. tsymlo:    defb    0
  1316.  
  1317. usymbl:    defw    0
  1318.  
  1319. pstrng:    defw    0
  1320.  
  1321. relchr:    defb    0
  1322.  
  1323. .idprn:    defb    0
  1324.  
  1325. star:    defb    0
  1326.  
  1327. nsym:
  1328. nsymhi:    defb    0
  1329. nsymlo:    defb    0
  1330. mhex:    defb    '    '
  1331.     defb    '$'
  1332.  
  1333. msym..:    defb    'Number Of Symbols Loaded: $'
  1334.  
  1335. tsym..:    defb    cr,lf
  1336.     defb    'Total Symbols:   $'
  1337.  
  1338. msymnf:    defb    'Symbol Table Not Found'
  1339.     defb    cr,lf,0
  1340.  
  1341. minvof:    defb    'Invalid Offset - Using 0000'
  1342.     defb    cr,lf,0
  1343.  
  1344. msymld:    defb    cr,lf
  1345.     defb    'Symbol Table:    '
  1346.     defb    0
  1347.  
  1348. mz8eld:    defb    cr,lf
  1349.     defb    'Z8E Relocated:   '
  1350.     defb    0
  1351.  
  1352. mnvmem:    defb    cr,lf
  1353.     defb    'Top Of Memory:   '
  1354.     defb    00
  1355.  
  1356. z8eb:    defb    00
  1357. z8ebh:    defb    00
  1358. ntpa:    defw    00
  1359.  
  1360. bytes:    defb    00
  1361.  
  1362. zbuf:    defb    00
  1363. zbufnm:    defb    0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
  1364. znmbuf:
  1365.     rept    18
  1366.     defw    0,0
  1367.     endm
  1368.     if    ASMB
  1369. init:
  1370.     else
  1371. init::
  1372.     endif
  1373.     ret
  1374.     defs    255
  1375.     page
  1376. ;******************************************************************************
  1377. ;*
  1378. ;*    z8e:    entry point to monitor
  1379. ;*
  1380. ;*        each command begins with the output of the '*' prompt.
  1381. ;*        command    character in validated by checking the cmd table,
  1382. ;*
  1383. ;*        relative position of command letter in cmd table also used
  1384. ;*        as index into command jump table jtcmd.
  1385. ;*
  1386. ;*        all commands entered with b = 0.
  1387. ;*
  1388. ;******************************************************************************
  1389.  
  1390.  
  1391.     org    ($+255) and 0ff00h
  1392. ;was    org    256*(($+255)/256)
  1393.  
  1394. z8eorg:
  1395.                 ;note: first three bytes here become a jump to
  1396.     defs    16        ;      bdos after we are loaded
  1397.                 ;
  1398.                 ;this is the internal symbol table
  1399.  
  1400. z8e:    and    a        ;any do-nothing    instruction with the sign
  1401.                 ;bit set to indicate end of internal symbol
  1402.                 ;table
  1403.  
  1404.     defb    31h        ;ld sp,nnnn - load monitor stack pointer
  1405. z8esp:    defw    8000h        ;actual    address    filled in by nint at load
  1406.                 ;time when we figure out where bdos is
  1407.  
  1408. z8ecmd:    ld    hl,z8e
  1409.     push    hl
  1410.     ld    de,prompt    ;display prompt (asterisk)
  1411.     call    nprint
  1412.     ld    hl,jstepf    ;full screen debugging in effect?
  1413.     ld    a,(hl)
  1414.     and    a
  1415.     jr    nz,z8e10    ;nz - no
  1416.  
  1417.     ld    c,10
  1418.     call    spaces        ;if this was jdbg clear command line residue
  1419.     ld    b,10        
  1420. z8e00:    call    bksp
  1421.     djnz    z8e00
  1422.  
  1423. z8e10:    call    inchar        ;read in command character
  1424.     call    ixlt        ;translate to upper case for compare
  1425.     ld    (lcmd),a
  1426.     cp    'J'        ;if command is anything but j then indicate
  1427.                 ;that screen is corrupted.  at next invokation
  1428.                 ;jdbg will know to repaint the screen. 
  1429.     jr    z,z8e20
  1430.     ld    (jstepf),a    ;full screen flag nz - full screen debugging
  1431.                 ;in progress
  1432.  
  1433.  
  1434. z8e20:    ld    bc,ncmd        ;total number of commands
  1435.     ld    hl,cmd        ;table of ascii    command    characters
  1436.     cpir
  1437.     jp    nz,e???        ;command letter not found in table
  1438.     ld    hl,jtcmd    ;command jump table
  1439.     add    hl,bc
  1440.     add    hl,bc        ;index into table
  1441.     ld    e,(hl)        ;lo order command processing routine
  1442.     inc    hl
  1443.     ld    d,(hl)        ;upper address
  1444.     ld    c,3
  1445.     call    spaces        ;print spaces regardless
  1446.     ex    de,hl        ;hl - address of command processing routine
  1447.     jp    (hl)
  1448.     page
  1449. ;******************************************************************************
  1450. ;*
  1451. ;*    bphn:    breakpoint handler - rst38s land here
  1452. ;*
  1453. ;*        bphn   - bphn00      save all user    registers
  1454. ;*        bphn10 - bphn20      check    that user pc matches entry in brktbl.
  1455. ;*        bphn80          special single step processing.
  1456. ;*
  1457. ;*    note:    sbps is    both a flag and    the count of the number    of step    bps.
  1458. ;*        sbps is    set to 1 merely    to indicate that the single-stepping
  1459. ;*        is in effect.  then the    number of step bps is added to one.
  1460. ;*        hence, if 1 step bp was    set then  sbps = 2 and if 2 step bps
  1461. ;*        were set (conditional jump, call, ret) sbps = 3.
  1462. ;*
  1463. ;******************************************************************************
  1464.  
  1465. bphn:    ld    (hlreg),hl    ;save user hl
  1466.     pop    hl        ;pop breakpoint    pc from    stack
  1467.     ld    (spreg),sp    ;save user sp
  1468.     ld    sp,(z8esp)    ;switch    to our stack
  1469.     dec    hl        ;point to location of rst instruction
  1470.     ld    (pcreg),hl    ;save user pc
  1471.     ld    (dereg),de    ;save user de
  1472.     ld    (bcreg),bc    ;save user bc
  1473.     push    af
  1474.     pop    hl        ;user accumulator and flag to hl
  1475.     ld    (afreg),hl    ;save user af
  1476.     ld    a,i
  1477.     ld    h,a        ;save user i reg
  1478.     ld    a,r
  1479.     ld    l,a        ;save user r reg
  1480.     ld    (rreg),hl
  1481.     ex    af,af'          ;Bank In Prime Regs
  1482.     exx
  1483.     ld    (hlpreg),hl    ;save
  1484.     ld    (depreg),de
  1485.     ld    (bcpreg),bc
  1486.     push    af
  1487.     pop    hl
  1488.     ld    (afpreg),hl
  1489.     ld    (ixreg),ix    ;save user ix
  1490.     ld    (iyreg),iy    ;save user iy
  1491.     ld    a,(bps)
  1492.     and    a        ;check for zero    bp count
  1493.     jp    z,bp???        ;error - no bps    set
  1494.     ld    b,a        ;b - number of breakpoints
  1495.     ld    hl,brktbl    ;breakpoint storage table
  1496.     xor    a
  1497.     ld    c,a        ;init breakpoint found flag
  1498. bphn10:    ld    e,(hl)
  1499.     inc    hl
  1500.     ld    d,(hl)        ;de - breakpoint address
  1501.     inc    hl
  1502.     ld    a,(hl)        ;saved contents    of breakpoint address
  1503.     inc    hl
  1504.     ld    (de),a        ;replace rst 38    with actual data
  1505.     ld    a,(pcregl)    ;user pc - lo order
  1506.     xor    e
  1507.     ld    e,a        ;versus    breakpoint address in table
  1508.     ld    a,(pcregh)
  1509.     xor    d        ;check hi order
  1510.     or    e
  1511.     jr    nz,bphn20    ;no match - check next entry in    table
  1512.     ld    c,b        ;pc found in table set c reg nz
  1513. bphn20:    djnz    bphn10        ;restore all user data
  1514.     ld    hl,sbps        ;fetch number of step bps (0-2)
  1515.     ld    b,(hl)
  1516.     xor    a
  1517.     ld    (hl),a        ;clear regardless
  1518.     or    c        ;test bp found flag
  1519.     jp    z,bp???        ;z - bp    not in table
  1520.     inc    hl        ;point to bp count
  1521.     ld    d,(hl)        ;d - bp count
  1522.     dec    b
  1523.     jp    m,bphn30    ;m - this was user bp not step or jdbg
  1524.     ld    a,(hl)
  1525.     sub    b        ;subtract number of step bps from bp count
  1526.     ld    (hl),a        ;restore bp count
  1527.     ld    a,(lcmd)    ;what command got us here?
  1528.     cp    'S'        ;step?
  1529.     jr    z,bphn90    ;step command - check count
  1530.  
  1531.                 ;now we know we have jdbg in progress.  need
  1532.                 ;to check for user specified bp at the same 
  1533.                 ;address. if we find one stop trace. 
  1534.     ld    a,b        ;number of step bps to accumulator (1 or 2).
  1535.                 
  1536.     sub    c        ;compare number of step bps with the offset 
  1537.                 ;into the bp table where the current bp was
  1538.                 ;found.  since step bps are always at the end
  1539.                 ;of the table we can determine how bp was set.
  1540.  
  1541.      jp    nc,jdbg30    ;nc - we are at end of table so more tracing
  1542.  
  1543. bphn30:    ld    a,c
  1544.     neg
  1545.     add    a,d        ;create index into pass count table
  1546.     add    a,a
  1547.     ld    hl,psctbl    ;pass count table
  1548.     add    a,l
  1549.     ld    l,a
  1550.     jr    nc,bphn35
  1551.     inc    h
  1552. bphn35:    ld    e,(hl)
  1553.     inc    hl
  1554.     ld    d,(hl)        ;de - pass count
  1555.     ld    a,d
  1556.     or    e
  1557.     jr    z,bphn50    ;no count in effect 
  1558.     dec    de
  1559.     ld    (hl),d
  1560.     dec    hl
  1561.     ld    (hl),e        ;restored updated count
  1562.     ld    a,d
  1563.     or    e        ;did it    just go    zero?
  1564.     jr    z,bphn50    ;count just expired
  1565.     ld    a,b        ;pass count not zero - go or jdbg?
  1566.     and    a
  1567.     jp    p,jdbg30    ;if step flag p we had step bps
  1568.     ld    hl,(pcreg)
  1569.     jp    g100        ;continue go command
  1570. bphn50:    or    b        ;test if we had step bps
  1571.     jp    m,bphn60    ;this was go - print bp message
  1572.     ld    a,'X'
  1573.     ld    (lcmd),a    ;clear command letter so xreg disassembles
  1574.     call    home        ;home cursor
  1575.     call    xreg
  1576.     ld    b,22        ;cursor on penultimate line 
  1577.     ld    c,00
  1578.     call    xycp
  1579.         
  1580. bphn60:    ld    de,bpmsg    ;print *bp*
  1581.     call    print        ;print message pointed to by de
  1582.     ld    hl,(pcreg)
  1583.     call    outadr        ;display breakpoint address
  1584.     ex    de,hl
  1585.     call    fadr        ;attempt to find label at this address
  1586.     ex    de,hl        ;de - bp address
  1587.     jp    nz,z8e        ;nz - no label found
  1588.     ld    a,(maxlen)
  1589.     dec    a        
  1590.     ld    c,a        ;c - max size of label
  1591.     call    printb
  1592.     jp    z8e
  1593. bphn90:    call    xreg        ;display all registers
  1594.     ld    hl,(nstep)    ;fetch trace count
  1595.     dec    hl
  1596.     ld    a,l
  1597.     or    h                  
  1598.     jp    z,z8e        ;count expired - prompt    for command
  1599.     call    ttyq        ;test for abort    trace
  1600.     cp    cr
  1601.     jp    z,z8e
  1602.     call    crlf        ;
  1603.     jp    step40        ;continue trace
  1604.  
  1605.  
  1606. bp???:    ld    de,bpemsg
  1607.     call    print
  1608.     ld    hl,(pcreg)
  1609.     call    outadr
  1610.     jp    z8e
  1611.  
  1612.  
  1613. e???:    ex    de,hl
  1614.     ld    de,em???
  1615.     call    print
  1616.     ex    de,hl
  1617.     ret
  1618.     page
  1619. ;******************************************************************************
  1620. ;*
  1621. ;*    jdbg:    animated debugger
  1622. ;*        
  1623. ;*    jdbg allows the user to view the z80 cpu actually executed the
  1624. ;*    code.  jdbg displays 18 disassembled instructions on the 
  1625. ;*    as well as a user defined memory block referred to in the 
  1626. ;*    comments as a window.
  1627. ;*
  1628. ;*    entry point jdbg:
  1629. ;*    
  1630. ;*    jdbg processes user input as a prelude to the actual animation
  1631. ;*    of the code.  the user enters the starting address to animate
  1632. ;*    optionally preceded by a subroutine qualifier. the subroutine
  1633. ;*    qualifier may be either a "*" which instructs z8e not to trace
  1634. ;*    any subroutines which are located below 100h (ie. bdos calls),
  1635. ;*    or it may be a "/" which means no tracing of any subroutines.
  1636. ;*    jdbg will also paint the original screen with the register
  1637. ;*    contents as well as the memory window. the contents of the 
  1638. ;*    memory window are also moved into argbuf so that we can compare
  1639. ;*    the 'old' contents with the 'new' contents once a the first bp
  1640. ;*    is reached.
  1641. ;*
  1642. ;*    entry point jdbg30:
  1643. ;*
  1644. ;*     entered here via bphn who determines that animation is in
  1645. ;*    effect.  in order to cut down on superfluous cursor move-
  1646. ;*    ment on the screen we compare the old register and memory
  1647. ;*    window contents with the new contents following the latest
  1648. ;*    bp.  we only output the changes. next we determine if the 
  1649. ;*    current pc exists in disassembled form somewhere on the 
  1650. ;*    screen; if not, we display 18 new disassembled instructions 
  1651. ;*    with the current pc as line one.
  1652. ;*
  1653. ;*    exit jdbg95:
  1654. ;*
  1655. ;*    save current register contents and jump to step40 for next
  1656. ;*    single step.
  1657. ;*
  1658. ;******************************************************************************
  1659.  
  1660. jdbg:
  1661.     call    iedtbc        ;get command line
  1662.     jp    p,jdbg02    ;p - have input
  1663.  
  1664. jdbg00:    ld    hl,lastro
  1665.     ld    b,(hl)        ;row position of arrow on screen
  1666.     ld    c,18        ;column
  1667.     call    xycp
  1668.     ld    c,2
  1669.     call    spaces
  1670.     ld    b,17h
  1671.     ld    c,00
  1672.     call    xycp
  1673.     ld    hl,jstepf
  1674.     ld    a,(hl)
  1675.     ld    (hl),1
  1676.     and    a
  1677.     jp    z,jdbg90    ;j was last means screen intact - just move
  1678.                 ;arrow.  else fall thru and repaint screen.
  1679.                 ;indicate single step
  1680.     ld    a,10
  1681.     jr    jdbg10        ;init timer    
  1682.  
  1683. jdbg02:    ld    a,(hl)        ;check first char of input
  1684.     ex    de,hl        ;de - save input buffer    address
  1685.     ld    hl,wflag    ;wflag tells us    whether    to trace subroutines
  1686.                 ;or walk around    them
  1687.     ld    (hl),0ffh    ;conditionally assume trace all
  1688.     sub    '/'        ;slash means don't trace any
  1689.     jr    z,jdbg03    ;
  1690.     add    a,'/'-'*'    ;check for star    - no trace of bdos subs
  1691.     jr    nz,jdbg05
  1692.     inc    a        ;set flag one to indicate no trace of subs
  1693.                 ;at address < 100h (bdos calls)
  1694. jdbg03:    ld    (hl),a        ;set wflag
  1695.     xor    a        ;if slash or space replace with    null in    inbf
  1696.                 ;so parser will    ignore
  1697.     ld    (de),a
  1698. jdbg05:    call    iarg        ;now evaluate address
  1699.     jr    z,jdbg08    ;z - no error
  1700.     ld    a,(inbfnc)    ;check number of characters
  1701.     dec    a        ;check for just / or just *
  1702.     jr    z,jdbg00    ;treat as single step
  1703.     ld    (jstepf),a    ;indicate screen corrupted
  1704.     jp    e???        ;error -
  1705. jdbg08:    ld    (pcreg),hl    ;save address at which to start    tracing
  1706.     and    a        ;check delimter
  1707.     ld    a,10        ;no delimeter use default timer value
  1708.     jr    z,jdbg10
  1709.     call    iarg        ;check if user wants non-default timer
  1710.     ld    a,10
  1711.     jr    nz,jdbg10    ;error - use default
  1712.     ld    a,l        ;a - timer value as entered by user
  1713. jdbg10:    ld    (timer),a
  1714.     ld    b,24        ;xmit crlf's to clear screen
  1715. jdbg15:    call    crlf        ;clear screen
  1716.     djnz    jdbg15
  1717.     call    rgdisp        ;display current user regs
  1718.     call    zwnw        ;display disassembled window
  1719.     ld    a,(wnwsiz)
  1720.     and    a        ;test if window being displayed
  1721.     jr    z,jdbg28
  1722.     ld    de,window    ;save user specified memory block til next bp
  1723.     ld    hl,(wnwtab)    ;start of memory window address
  1724.     ld    bc,3
  1725. jdbg20: ld    a,(fwndow)    ;position cursor starting at column 
  1726.     sub    6
  1727.     call    curs
  1728.            call    outadr        ;display address of memory window
  1729. jdbg25:    ld    a,(fwndow)
  1730.     call    curs        ;column position on screen of memory window
  1731.                 ;is (rel pos * 3) + (fwndow)
  1732.     ld    a,(hl)        ;display this byte
  1733.  
  1734.     ld    (de),a        ;save this byte in window between bps
  1735.     call    outhex
  1736.     inc    b        ;move and display user specifed number 
  1737.                                 ;of bytes (wnwsiz)
  1738.     ld    a,(wnwsiz)
  1739.     sub    b
  1740.     jr    z,jdbg28
  1741.     inc    hl
  1742.     inc    de
  1743.     ld    a,(nlmask)    ;check for new line time
  1744.     and    b
  1745.     jr    nz,jdbg25    ;not end of line - display next byte else...
  1746.     jr    jdbg20        ;...display address first
  1747. jdbg28:    ld    a,3        ;point to very first instruction
  1748.     jp    jdbg75
  1749.  
  1750.  
  1751.                 ;breakpoint handler jumps here for full
  1752.                 ;screen single step
  1753. jdbg30:    ld      c,3 
  1754.     call    spaces        ;remove => from screen
  1755.     ld    b,c        ;(c=0 after spaces executes)
  1756.     ld    hl,regcon    ;new contents of registers following bp
  1757.     ld    de,regsav    ;old prior to bp       
  1758. jdbg35:    ld    a,(de)        ;compare old vs new
  1759.     cp    (hl)
  1760.     inc    hl
  1761.     inc    de
  1762.     jr    nz,jdbg40    ;different - display new
  1763.     ld    a,(de)        ;check hi order byte of this reg pair 
  1764.     cp    (hl)
  1765.     jr    z,jdbg45    ;z - hi and lo bytes the same so try next reg
  1766. jdbg40:
  1767. ;    ld    a,4        ;col position of reg pair is (rel pos * 9) + 3
  1768. ;    and    b
  1769. ;    jr    z,jdbg42
  1770. ;    ld    a,3
  1771. ;    and    b        ;- 9 bytes deleted here
  1772. ;    inc    a
  1773.     push    bc        ;+save register number
  1774.     ld    c,b        ;+move it to c while we build line number
  1775.     ld    b,0        ;+assume first line for now
  1776.     ld    a,7        ;+regs-per-line mask
  1777.     cp    c        ;+generate carry if second line
  1778.     rl    b        ;+shift carry into line number
  1779.     and    c        ;+generate line-relative register number
  1780.     ld    c,a        ;+col = reg * 9 + 3 if non-prime
  1781.     add    a,a        ;+ *2
  1782.     add    a,a        ;+ *4
  1783.     add    a,a        ;+ *8
  1784.     add    a,c        ;+ *9
  1785.     bit    2,c        ;+is it a prime (alternate) register?
  1786.     jr    z,jdbg42    ;+skip if not
  1787.     add    a,c        ;+*10
  1788.     sub    3        ;+col = reg * 10 if prime
  1789. jdbg42:
  1790.     add    a,3        ;+
  1791.     ld    c,a        ;+
  1792.     call    xycp        ;+
  1793.     pop    bc        ;+ added 29 bytes
  1794.  
  1795. ;    add    a,3        ;- deleted another 5 bytes here
  1796. ;    call    curs        ;- nett cost = 14 bytes for new code
  1797. ;                ;- but we save 19 bytes in 'curs:' routine
  1798.  
  1799.     ld    a,(hl)        ;display upper byte of reg contents
  1800.     call    outhex
  1801.     dec    hl        ;rewind to pick up lo order byte
  1802.     ld    a,(hl)
  1803.     inc    hl
  1804.     call    outhex        ;display lo order
  1805. jdbg45:    inc    hl
  1806.     inc    de
  1807.     inc    b
  1808.     ld    a,regsiz/2    ;number of reg pairs to display
  1809.     sub    b
  1810.     jr    nz,jdbg35            
  1811.     call    space
  1812.     ld    b,1
  1813.     ld    c,36
  1814.     call    xycp
  1815.     
  1816.     ld    b,0
  1817.     call    psw        ;now display flag reg mnemonics
  1818.     
  1819.     ld    a,(wnwsiz)    ;check window size
  1820.     and    a
  1821.     jr    z,jdbg60    ;z - no memory window in effect
  1822.     ld    hl,(wnwtab)    ;hl - address of start of window
  1823.     ld    bc,03
  1824.     ld    de,window    ;old contents of window stored here 
  1825. jdbg50:    ld    a,(de)        ;compare old vs new
  1826.     cp    (hl)
  1827.     jr    z,jdbg55    ;same - no reason to display
  1828.     ld    a,(fwndow)    ;col position of byte is (rel pos * 3) + 50
  1829.     call    curs
  1830.     ld    a,(hl)        ;display byte
  1831.  
  1832.     ld    (de),a        ;we only need to move byte if it changed
  1833.  
  1834.     call    outhex
  1835. jdbg55:    inc    b        ;bump memory window byte count
  1836.     ld    a,(wnwsiz)      ;max size
  1837.     inc    hl
  1838.     inc    de
  1839.     sub    b
  1840.     jr    nz,jdbg50    ;loop until entire window examined
  1841.             
  1842. jdbg60:    ld    a,18        ;init count of disassembled instructions
  1843.     ld    (jlines),a
  1844.     ld    de,(zasmfl)    ;address of first disassembled instruction
  1845.                 ;on screen
  1846. jdbg65:    ld    hl,(pcreg)
  1847.     and    a
  1848.     sbc    hl,de
  1849.     jr    z,jdbg70    ;found - pc exists somewhere on screen
  1850.     call    zlen00        ;compute length    of this    instruction
  1851.     ld    b,0
  1852.     ex    de,hl        ;hl - address on disassembled instruction
  1853.     add    hl,bc        ;add length to compute address of next inline
  1854.                 ;instruction for display
  1855.     ex    de,hl        ;de - restore new istruction pointer
  1856.     ld    hl,jlines
  1857.     dec    (hl)        ;dec screen line count
  1858.     jr    nz,jdbg65
  1859.     ld    hl,(pcreg)    ;pc not    on screen - so current pc will be new
  1860.                 ;first pc on screen
  1861.     ld    (zasmfl),hl
  1862.     ld    bc,0300h    ;cursor    row 4 -    col 1
  1863.     call    xycp
  1864.     call    zwnw        ;instruction not on screen so paint a new
  1865.                 ;screen    starting at current pc
  1866.     ld    a,3        ;disassembled instructions start on line 4
  1867.     jr    jdbg75
  1868. jdbg70:    ld    a,(jlines)
  1869.     neg
  1870.     add    a,21        ;a - screen row    on which to position cursor
  1871. jdbg75:    ld    (lastro),a    ;save position of arrow
  1872.     ld    b,a        ;pass to xycp
  1873.     ld    c,18        ;pass column
  1874.     call    xycp        ;position cursor routine
  1875.     ld    de,mrrow
  1876.     call    print
  1877.     ld    a,(lastro)    ;xy positioning added after '=>' as
  1878.                 ;some systems have a destructive bs
  1879.     ld    c,17        ;new cursor loc
  1880.     call    xycp        ;put it there
  1881.     ld    a,(jstepf)
  1882.     dec    a        ;test if single stepping
  1883.     jp    z,jdbg95
  1884.     call    ttyq
  1885.     ld    hl,timer
  1886.     ld    b,(hl)
  1887.     jr    z,jdbg80
  1888.     cp    '0'
  1889.     jr    c,jdbg78
  1890.     cp    3ah
  1891.     jr    nc,jdbg95
  1892.     and    0fh
  1893.     ld    (hl),a
  1894.     ld    b,a
  1895.     jr    jdbg80
  1896. jdbg78:    cp    cr        ;carriage return ends command
  1897.     jr    z,jdbg95
  1898.         
  1899. jdbg80:    call    clok
  1900.  
  1901. jdbg90:    ld    de,regsav    ;move current reg contents to save area 
  1902.     ld    hl,regcon
  1903.     ld    bc,regsiz
  1904.     ldir
  1905.     jp    step40
  1906.  
  1907.  
  1908.                 ;user requested abort from console
  1909. jdbg95: ld    b,22        ;position cursor on line 23 for prompt
  1910.     ld    c,0
  1911.     call    xycp
  1912.     xor    a
  1913.     ld    (jstepf),a    ;indicate we have full screen of data
  1914.     jp    z8e        ;to z8e command processor 
  1915.  
  1916.  
  1917.  
  1918. zwnw:                ;display disassembly window
  1919.     ld    a,18        ;number of instructions to disassemble 
  1920. zwnw05:    ld    hl,(pcreg)
  1921.     ld    (zasmfl),hl    ;save pc of first line
  1922. zwnw10:    ld    (jlines),a
  1923.     ld    (zasmpc),hl    ;save here as well
  1924.     ld    de,zasmbf+96    ;disassemble in upper portion of buffer to
  1925.                 ;prevent overlap with big memory windows.
  1926.                 ;otherwise, every time we disassemble a new
  1927.                 ;screen we have to repaint the window.
  1928.  
  1929.     call    zasm10        ;disassemble first instruction
  1930.     ld    a,30        ;test line length
  1931.     cp    c
  1932.     jr    z,zwnw20
  1933.     ld    c,42
  1934. zwnw20:    call    printb
  1935.     call    crlf
  1936.     ld    hl,(zasmnx)    ;hl - next address to disassemble
  1937.     ld    a,(jlines)
  1938.     dec    a
  1939.     jr    nz,zwnw10
  1940.     ld    b,3        ;position cursor next to next instruction    
  1941.                 ;to execute which is the first one on the 
  1942.                 ;screen - line 4  col 20 
  1943.     ld    c,20
  1944.     call    xycp
  1945.     ret
  1946.  
  1947.  
  1948.                 ;display regs at top of screen:
  1949. rgdisp:    call    home        ;home cursor
  1950.     call    xreg        ;display regs
  1951.     call    psw        ;display flag reg
  1952.     jp    crlf
  1953.  
  1954.  
  1955.  
  1956. curs:    push    bc        ;this routine has been simplified and shortened
  1957.     push    de        ;by 19 bytes because it is no longer used for
  1958.     push    hl        ;register display positioning.  jrs 20/4/87
  1959.     ld    d,a
  1960.     ld    e,c        ;save base row address
  1961. ;    cp    3        ;test if reg or memory window (3 is reg)
  1962. ;    ld    a,7
  1963. ;    jr    z,curs00    ;z - regs are eight per line (first line)
  1964.  
  1965.     ld    a,(nlmask)
  1966. curs00:    and    b        ;item number mod lnmask is the relative pos of
  1967.     ld    c,a        ;reg contents or memory data byte
  1968.     add    a,a        ;
  1969.     add    a,c
  1970.     ld    c,a        ;c - rel pos times three
  1971.  
  1972. ;    ld    a,d        ;if base column address is < 50 then this is
  1973.                 ;reg display
  1974. ;    sub    3
  1975. ;    ld    h,a
  1976. ;    ld    a,c
  1977. ;    jr    nz,curs20    ;nz - not reg display - must be memory
  1978. ;    add    a,a        ;so multiply times three again 
  1979. ;    add    a,c        ;times 9 in all for register display
  1980.  
  1981. curs20:    add    a,d        ;add in base
  1982.     ld    c,a        ;c - absolute col number
  1983. ;    xor    a        ;test if this is reg or memory window display
  1984. ;    or    h
  1985. ;    jr    z,curs30    ;z - this is register display
  1986.     ld    a,(fwndow)
  1987.     cp    68        ;14-char symbols in effect?
  1988.     jp    z,curs40
  1989. curs30:    srl    b
  1990. curs40:    ld    a,0fch
  1991.     and    b        ;now compute row number 
  1992.     rrca
  1993.     rrca
  1994.     add    a,e        ;base row address
  1995.     ld    b,a        ;b - absolute row number
  1996.     call    xycp        ;convert row and column to xy cursor address
  1997.     pop    hl
  1998.     pop    de
  1999.     pop    bc
  2000.     ret
  2001.  
  2002.  
  2003.  
  2004. clok:
  2005.     ld    d,50          ;idle loop - decrement to 0 and reload
  2006.     ld    e,00
  2007.     dec    b        ;user specified the loop counter
  2008.     ret    m
  2009. clok10:    dec    de
  2010.     ld    a,e
  2011.     or    d
  2012.     jr    nz,clok10
  2013.     jr    clok
  2014.  
  2015.     page
  2016. ;******************************************************************************
  2017. ;*
  2018. ;*    exam:    examine    memory and display in hex and ascii.  user is allowed
  2019. ;*        to modify memory after every byte is displayed.    ilin called
  2020. ;*        to parse input buffer into a single string of bytes which is
  2021. ;*        returned in argbuf.  the byte count of the string is returned
  2022. ;*        in argbc, and this number of bytes is transferred to the
  2023. ;*        current    memory address.
  2024. ;*
  2025. ;*        user may optionally scan memory    by entering cr.     command
  2026. ;*        terminates when    a single space is entered.
  2027. ;*
  2028. ;*        enter:    b - 0
  2029. ;*               de - address at which to    display    first byte
  2030. ;*
  2031. ;******************************************************************************
  2032.  
  2033. exam:    call    ilin
  2034.     jp    nz,e???
  2035.     ex    de,hl    
  2036. exam00:    call    newlin
  2037.     ld    a,(de)        ;fetch byte to display regardless
  2038.     call    outbyt
  2039.     call    byte
  2040.     jr    nz,exam00     ;nz - don't replace memory contents
  2041.     cp    '.'
  2042.     jr    nz,exam10
  2043.     ld    a,(inbfnc)
  2044.     dec    a
  2045.     ret    z
  2046. exam10:    ld    hl,argbc    ;byte count to c
  2047.     ld    c,(hl)
  2048.     ld    b,0
  2049.     ld    (exampt),de
  2050.     ld    hl,argbf    ;start of evaluated input
  2051.     ldir
  2052.     ld    a,(trmntr)
  2053.     cp    cr
  2054.     jr    z,exam00
  2055.     ld    de,(exampt)
  2056.     jr    exam00
  2057.     page
  2058. ;******************************************************************************
  2059. ;*
  2060. ;*    hsym:    display symbol table
  2061. ;*
  2062. ;*        user may display the symbol table on the console.  if no arg
  2063. ;*        entered on command line then the entire table is dumped start-
  2064. ;*        ing with the first symbol.  if a valid symbol is entered then
  2065. ;*        we will try to find the symbol in the table; if found, the 
  2066. ;*        table is dumped starting at that point.  if the symbol is not
  2067. ;*        found the user gets a ? and the command terminates.
  2068. ;*
  2069. ;*        symbols are displayed in blocks of 32.  after each block the 
  2070. ;*        user is given the opportunity of continuing or ending the 
  2071. ;*        command:
  2072. ;*
  2073. ;*            cr - display next
  2074. ;*            not cr - terminate
  2075. ;*
  2076. ;******************************************************************************
  2077.  
  2078. hsym:    call    ilin        ;read in line of data
  2079.     ld    hl,z8e        ;assume no symbol entered
  2080.     jr    nz,hsym10    ;nz - no input means display entire table
  2081.     ld    de,prsbf    
  2082.     call    fsym        ;attempt to find this symbol name in table
  2083.     jp    nz,e???        ;error - symbol    not found in symbol table
  2084.     ld    a,(maxlen)
  2085.     or    l        ;point to next symbol table entry (next block)
  2086.     ld    l,a        ;hl - ptr to last byte in this entry 
  2087.     inc    hl        ;now next entry toward hi memory
  2088. hsym10:    ld    a,(maxlen)    ;max size of symbol name
  2089.     ld    c,a
  2090.     dec    c
  2091.     inc    a        ;make 8 or 16
  2092.     ld    e,a
  2093.     xor    a
  2094.     ld    d,a        ;de - size of symbol table entry
  2095.     sbc    hl,de        ;previous entry toward lo memory
  2096.     ld    a,(hl)        ;null means this is unused slot is user 
  2097.                 ;defined symbol table
  2098.     and    a
  2099.     jr    z,hsym10
  2100.     dec    a        ;neg means this is jp opcode (0c3h) of jump to
  2101.                 ;bdos
  2102.     ret    m
  2103.     ld    a,(maxlen)
  2104.     srl    a
  2105.     srl    a
  2106.     xor    2
  2107.     and    b        ;check symbols per line count
  2108.     call    z,crlf        ;crlf every fourth
  2109.     dec    b        ;now decrement symbols per line count
  2110.     call    printb        ;treat symbol table entry as a buffer and 
  2111.                 ;six chars or until null, whichever is first
  2112.     inc    c        ;tack on two spaces
  2113.     inc    c
  2114.     call    spaces
  2115.     ld    a,(maxlen)
  2116.     or    l        ;point to last byte in symbol table block
  2117.     ld    l,a
  2118.     ld    d,(hl)        ;upper byte of symbol address
  2119.     dec    hl
  2120.     ld    e,(hl)        ;lo order
  2121.     ex    de,hl
  2122.     call    outadr        ;hl - symbol address to display
  2123.     ld    c,4
  2124.     call    spaces        ;next symbol name starts 4 spaces to the right
  2125.     ex    de,hl        ;hl - symbol table pointer
  2126.     ld    a,(maxlen)
  2127.     cpl
  2128.     and    l        ;rewind to point to byte zero of entry
  2129.     ld    l,a
  2130.     ld    a,b
  2131.     and    31        ;displayed block of 32 symbols?
  2132.     jr    nz,hsym10
  2133.     call    crlf
  2134.     call    ttyi        ;test if user wants abort
  2135.     cp    cr
  2136.     jr    z,hsym10
  2137.     ret            ;not cr - end command
  2138.     page
  2139. ;*****************************************************************************
  2140. ;*
  2141. ;*    usym:   write symbol table to disk
  2142. ;*
  2143. ;*****************************************************************************
  2144.  
  2145. usym:    call    iedtbc        ;get a command line 
  2146.     ret    m        ;no input ends command
  2147.     call    bldf        ;build fcb
  2148.     jp    nz,esntx    ;syntax error
  2149.     ld    hl,z8e        ;start at beginning
  2150.     ld    a,(symflg)    ;do we even have a symbol table?
  2151.     and    a
  2152.     ret    nz        ;no table - end command
  2153.     ld    b,128        ;disk write buffer size
  2154.     ld    (lines),a    ;clear symbols per line counter
  2155.     ld    de,symbuf
  2156. usym10:    ld    a,(maxlen)
  2157.     ld    c,a        ;max size of symbol name
  2158.     cpl
  2159.     and    l        ;rewind to byte zero of symbol table entry
  2160.     ld    l,a
  2161.     ld    a,b        ;temp save buffer count
  2162.     ld    b,0
  2163.     sbc    hl,bc
  2164.     dec    hl        ;point to 8 or 16 byte boundary
  2165.     ld    b,a        ;restore buffer count    
  2166.  
  2167.     ld    a,(hl)        ;null means this is unused slot in user 
  2168.                 ;defined symbol table
  2169.     and    a
  2170.     jr    z,usym10
  2171.     dec    a        ;neg means this is jp opcode (0c3h) of jump to
  2172.                 ;bdos
  2173.     jp    p,usym20
  2174.     call    pcrlf        ;hit end of table - put crlf in buffer
  2175.     ld    a,eof
  2176.     ld    b,1        ;force buffer write
  2177.     call    putc        ;put eof in file
  2178.     jp    closef        ;this is a wrap
  2179.  
  2180. usym20:    ld    a,(maxlen)    
  2181.     or    l
  2182.     ld    l,a        ;point to hi order byte of symbol address
  2183.     call    pbin        ;put address in buffer
  2184.     ld    a,' '
  2185.     call    putc        ;followed by space just like l80
  2186.     ld    a,(maxlen)
  2187.     cpl
  2188.     and    l        ;rewind to byte zero of symbol entry
  2189.     ld    l,a
  2190.  
  2191.     dec    c        ;09-14-85   restore maxlen size as count
  2192.     
  2193. usym25:    ld    a,(hl)        ;fetch char of symbol name
  2194.     and    a        ;null?
  2195.     jr    z,usym40    ;name is less than 6 chars long
  2196.     call    putc        ;put valid symbol name chars in buffer
  2197.     dec    c
  2198.     jr    z,usym40    ;z - just moved last char    
  2199.     inc    hl
  2200.     jr    usym25
  2201. usym40:    ld    a,tab        ;tab separates name and next address
  2202.     call    putc        ;insert tab before address field
  2203.     ld    a,(lines)
  2204.     dec    a
  2205.     ld    (lines),a
  2206.     and    3        ;insert crlf every fourth symbol
  2207.     jr    nz,usym10
  2208.     call    pcrlf
  2209.     jr    usym10
  2210.  
  2211.  
  2212.  
  2213. pcrlf:    ld    a,cr
  2214.     call    putc
  2215.     ld    a,lf
  2216.     jr    putc
  2217.  
  2218.  
  2219.                 ;convert two byte binary address to ascii
  2220.                 ;and put into buffer
  2221. pbin:    call    pbin00        ;
  2222.     dec    hl
  2223. pbin00:    ld    a,(hl)
  2224.     call    binx            
  2225.     call    putc        ;
  2226.     ld    a,(hl)
  2227.     call    binx00
  2228.  
  2229.  
  2230. putc:    ld    (de),a        ;just like pascal - put char into buffer
  2231.     inc    de
  2232.     dec    b        ;buffer count passed in b 
  2233.     ret    nz
  2234. putc00:    ld    de,symbuf    ;hit end of buffer - reinit pointer to start
  2235.     call    bwrite        ;write current buffer
  2236.     ld    b,128        ;reinit tally
  2237.     ret
  2238.     page
  2239.  
  2240. ;******************************************************************************
  2241. ;*
  2242. ;*    dump:  dump memory in hex and ascii
  2243. ;*
  2244. ;*    memory is dumped in hex    and ascii in user specified block size.
  2245. ;*    if the d command is given without arguments then memory    is dumped
  2246. ;*    beginning at the address where we left off as store in blkptr.
  2247. ;*    user is    queried    after each block is dumped:
  2248. ;*
  2249. ;*        cr - dump next consecutive block
  2250. ;*        not    cr - end command
  2251. ;*
  2252. ;******************************************************************************
  2253.  
  2254. dump:    call    iedtbc        ;solicit input
  2255.     jp    p,dump00    ;p - input present
  2256.     ld    de,(bsiz)    ;no input means    use previous block size
  2257.     ld    hl,(blkptr)    ;   ...    and address
  2258.     jr    dump30
  2259. dump00:    call    iarg        ;read in next arg (starting address)
  2260.     jp    nz,e???        ;invalid starting address
  2261.     ex    de,hl        ;de - starting address to dump
  2262.     call    iarg        ;next arg (block size)
  2263.     jr    z,dump15    ;z - no    errors
  2264.     ld    hl,000        ;default to block size of 256
  2265.     jr    dump20
  2266. dump15:    xor    a
  2267.     or    h        ;test for block    size or    ending address
  2268.     jr    z,dump20    ;less than 256 must be block size
  2269.     sbc    hl,de        ;compute size
  2270.     jp    c,e???
  2271. dump20:    ld    a,l
  2272.     or    h
  2273.     jr    nz,dump25
  2274.     inc    h
  2275. dump25:    ld    (bsiz),hl
  2276.     ex    de,hl        ;de - block size   hl -    memory pointer
  2277. dump30:    ld    b,16        ;init bytes per    line count
  2278.     call    ttyq
  2279.     cp    cr
  2280.     ret    z
  2281.     call    crlf        ;display current address on new line
  2282.     call    outadr
  2283.     ld    c,2
  2284.     call    spaces        ;hex display starts two    spaces right
  2285. dump40:    dec    b        ;decrement column count
  2286.     ld    a,(hl)
  2287.     inc    hl
  2288.     call    othxsp        ;display memory    in hex
  2289.     inc    c        ;tally of hex bytes displayed
  2290.     dec    de        ;decrement block count
  2291.     ld    a,d
  2292.     or    e        ;test for end of block
  2293.     jr    z,dump50    ;z - end of block
  2294.     xor    a
  2295.     or    b        ;end of    line?
  2296.     jr    nz,dump40    ;not end of line - dump    more in    hex
  2297.     jr    dump60
  2298. dump50:    ld    a,(bsizhi)
  2299.     and    a        ;block size greater than 256?
  2300.     jr    nz,dump55    ;nz - greater
  2301.     ld    a,(bsizlo)
  2302.     and    0f0h        ;block size less than 16?
  2303.     jr    z,dump60    ;z - less
  2304. dump55:    ld    a,(bsizlo)
  2305.     and    0fh        ;block size multiple of    16?
  2306.     jr    z,dump60    ;multiple of 16
  2307.     neg
  2308.     add    a,16
  2309.     ld    b,a
  2310.     add    a,a
  2311.     add    a,b
  2312. dump60:    add    a,3        ;plus three - begin ascii display
  2313.     ld    b,a        ;pad line until    ascii display area
  2314. dump70:    call    space
  2315.     djnz    dump70
  2316.     sbc    hl,bc        ;rewind    memory point by    like amount
  2317. dump80:    ld    a,(hl)        ;start ascii display
  2318.     inc    hl
  2319.     call    asci
  2320.     dec    c
  2321.     jr    nz,dump80
  2322.     call    ttyq        ;cr aborts command
  2323.     cp    cr
  2324.     jp    z,z8e
  2325.     ld    a,d        ;test for block    size tally expired
  2326.     or    e
  2327.     jr    nz,dump30    ;
  2328.     ld    de,(bsiz)    ;reinit    block size
  2329.     call    ttyi        ;query user for    more
  2330.     cp    cr
  2331.     call    z,crlf
  2332.     jr    z,dump30    ;not cr    - next block
  2333.     ld    (blkptr),hl
  2334.     ret            ;end command
  2335.     page
  2336. ;******************************************************************************
  2337. ;*
  2338. ;*    rgst:  display and optionally modify individual    registers
  2339. ;*
  2340. ;*    call iedt:   read edited input into inbf
  2341. ;*    call prsr:   parse input
  2342. ;*    call mreg:   validate register name and    map into reg storage
  2343. ;*    call iarg:   query user    for replacement
  2344. ;*
  2345. ;******************************************************************************
  2346.  
  2347. rgst:    ld    c,' '        ;get edited input
  2348.     ld    b,inbfsz
  2349.     call    iedt
  2350.     ret    m
  2351.     ld    a,(trmntr)
  2352.     cp    ' '
  2353.     call    z,bksp
  2354.     call    prsr
  2355.     or    b        ;unbalanced quotes (prime reg?)
  2356.     jp    p,rgst00
  2357.     and    7fh
  2358.     cp    3
  2359.     jr    nz,rgst25
  2360.     dec    hl
  2361.     ld    a,(hl)
  2362.     sub    quote
  2363.     jr    nz,rgst25
  2364.     ld    (hl),a
  2365. rgst00:    ld    a,(inbfnc)    ;number    of characters in buffer
  2366.     cp    4
  2367.     jr    nc,rgst25    ;error - too many chars
  2368.     neg
  2369.     add    a,4        ;calculate space padding
  2370.     ld    c,a
  2371.     cp    3        ;was it    one?
  2372.     jr    nz,rgst10
  2373.     ld    a,(de)
  2374.     call    ixlt
  2375.     cp    'P'
  2376.     jr    nz,rgst10
  2377.     ld    (inbfnc),a    ;any number > 2    indicates 16 bit register
  2378. rgst10:    call    spaces
  2379.     ld    a,(hl)        ;check last char in parse buffer
  2380.     sub    quote
  2381.     jr    nz,rgst15    ;not quote
  2382.     ld    (hl),a        ;replace with null
  2383. rgst15:    call    mreg        ;validate register name
  2384.     jr    nz,rgst25    ;error
  2385.     ld    a,(regtrm)    ;mreg stored char following reg    name
  2386.     and    a
  2387.     jr    nz,rgst25    ;error - no operators allowed
  2388.     ld    a,(inbfnc)    ;now check number of chars in buffer
  2389.     ld    b,a        ;save in b reg for 8 or    16 bit reg test
  2390.     dec    a        ;test for one -    8 bit reg
  2391.     ld    c,3
  2392.     jr    z,rgst20
  2393.     ld    a,(hl)
  2394.     call    outhex        ;display byte of reg contents
  2395.     dec    hl
  2396.     ld    c,1
  2397. rgst20:    ld    a,(hl)
  2398.     call    othxsp
  2399.     call    spaces        ;reg c - number    of spaces to print
  2400.     ex    de,hl        ;de - save reg contents    pointer
  2401. rgst22:    call    istr        ;query user for    reg value replacement
  2402.     ld    a,(inbfnc)    ;test number of    chars in input buffer
  2403.     dec    a        ;
  2404.     jp    m,rgst40    ;none -    prompt for next    reg name
  2405.     call    irsm
  2406.     jr    z,rgst30
  2407.     ld    a,(inbfnc)
  2408.     and    a
  2409.     jr    z,rgst22
  2410. rgst25:    call    e???        ;
  2411.     jr    rgst40        ;accept    new reg    name
  2412. rgst30:    ex    de,hl
  2413.     ld    (hl),e
  2414.     dec    b        ;test for 16 bit reg
  2415.     jr    z,rgst40    ;z - 8 bit reg
  2416.     inc    hl
  2417.     ld    (hl),d        ;save upper byte of user input
  2418. rgst40:    call    crlf
  2419.     call    space5
  2420.     jp    rgst
  2421.  
  2422.  
  2423.  
  2424. mreg:    ld    c,23        ;number    of reserved operands
  2425.     call    oprn00        ;check validity    of register name
  2426.     ld    a,(de)        ;last char examined by operand routine
  2427.     call    oprtor
  2428.     ret    nz        ;error - not null or valid operator
  2429.     ld    (regtrm),a    ;save terminator character for rgst
  2430.     ld    a,c
  2431.     cp    17        ;valid reg names are less than 17
  2432.     jr    c,mreg00    ;so far    so good
  2433.     sub    23        ;last chance - may be pc
  2434.     ret    nz        ;error - invalid reg name
  2435.     ld    a,10        ;make pc look like p for mapping
  2436. mreg00:    ld    hl,regmap    ;ptrs to register contents storage
  2437.     add    a,l        ;index into table by operand value
  2438.     ld    l,a
  2439.     jr    nc,mreg05
  2440.     inc    h
  2441. mreg05:    ld    a,b        ;b reg set m by    prsr if    trailing quote
  2442.     and    a
  2443.     ld    a,0        ;assume    no quote - not prime reg
  2444.     jp    p,mreg10    ;p - correct assumption
  2445.     ld    a,8        ;bias pointer for prime    reg contents
  2446. mreg10:    add    a,(hl)
  2447.     ld    c,a        ;save mapping byte
  2448.     and    7fh        ;strip sign
  2449.                 ;so iarg knows 16 bit reg pair
  2450.     ld    hl,regcon    ;use mapping byte to build pointer
  2451.     add    a,l
  2452.     ld    l,a
  2453.     jr    nc,mreg50
  2454.     inc    h
  2455. mreg50:    xor    a        ;hl - pointer to register contents
  2456.     ret
  2457.  
  2458.     page
  2459. ;******************************************************************************
  2460. ;*
  2461. ;*    qprt:    read and display / write to i/o    ports
  2462. ;*
  2463. ;*        contents of ports are displayed    and the    user is    queried
  2464. ;*        input character    effects    the current port address:
  2465. ;*
  2466. ;*        space -    display    next sequential    port on    same line
  2467. ;*        lf    -    display    next sequential    port on    new line
  2468. ;*        cr    -    end command
  2469. ;*        slash -    display    same port on same line
  2470. ;*        ^     -    display    previous port on new line
  2471. ;*
  2472. ;*        any other input    is treated as a    replacement byte and
  2473. ;*        is output to the current port address.    any of the
  2474. ;*        above characters may be    used to    continue the display.
  2475. ;*
  2476. ;*        enter: e  - port at which to begin display
  2477. ;*
  2478. ;******************************************************************************
  2479.  
  2480. qprt:
  2481. nprt:
  2482.     xor    a
  2483.     ld    (parenf),a
  2484.       call    iedtbc        ;get port specified by user
  2485.     ld    hl,port
  2486.     ld    e,(hl)
  2487.     jp    m,qprt30    ;m - no input means use last port number
  2488.     ex    de,hl
  2489.         call    iarg        ;extract address
  2490.     jp    nz,e???
  2491.     ex    de,hl         ;e - new port number
  2492.     ld    (hl),e
  2493.     ld    a,(parenf)
  2494.     cp    '('
  2495.     jr    nz,qprt30
  2496.     ld    c,2
  2497.     call    spaces
  2498. qprt00:    ld    c,e
  2499.     in    a,(c)
  2500.     ld    b,a
  2501.     call    outhex
  2502.     ld    c,2
  2503.     call    spaces
  2504.     ld    c,8        ;number of bits to display
  2505. qprt10:    sla    b        ;most significant bit to carry
  2506.     ld    a,'0'        
  2507.     adc    a,0        ;carry makes it a 1
  2508.     call    ttyo
  2509.     dec    c
  2510.     jr    nz,qprt10
  2511.     ld    c,e
  2512.     ld    b,3
  2513.     call    ttyq
  2514.     cp    cr
  2515.     ret    z
  2516.     call    clok        ;so we don't go faster than the terminal
  2517.     ld    e,c
  2518.     ld    a,b
  2519.     and    a
  2520.     ret    p
  2521.     ld    b,12
  2522. qprt20:    call    bksp
  2523.     djnz    qprt20
  2524.     jr    qprt00
  2525. qprt30:    call    crlf
  2526.     ld    a,e
  2527.     ld    (port),a
  2528.     call    othxsp
  2529.     call    space
  2530.     ld    c,e
  2531.     ld    a,(lcmd)
  2532.     cp    'N' 
  2533.     jr    z,qprt50
  2534.            in    a,(c)    
  2535.     call    outbyt        
  2536. qprt50:    call    byte
  2537.     ld    a,(trmntr)
  2538.     jr    nz,qprt60
  2539.     cp    '.'
  2540.     ret    z
  2541.     ld    hl,argbc
  2542.     ld    b,(hl)
  2543.     ld    hl,argbf
  2544.     ld    c,e        ;port number
  2545.     otir
  2546.     jr    qprt30    
  2547. qprt60:    cp    ' '
  2548.     jr    nz,qprt30
  2549.     dec    de
  2550.     jr    qprt30
  2551.  
  2552.  
  2553.     page
  2554. ;******************************************************************************
  2555. ;*
  2556. ;*    break:    set breakpoint routine
  2557. ;*
  2558. ;*    breakpoint address storage table (brktbl) is examined and user
  2559. ;*    specified breakpoint is    considered valid unless:
  2560. ;*
  2561. ;*             - table full
  2562. ;*             - address already exists in table
  2563. ;*
  2564. ;*    optional pass counts can be specified by the user immediatley following
  2565. ;*    the breakpoint if they are enclosed in parens.
  2566. ;*
  2567. ;*    entry point brk30:
  2568. ;*          entered from single step command to set breakpoint.  two table
  2569. ;*          slots are    permanently available for step breakpoints. step
  2570. ;*          routine calls with c pos to tell us not to look for more args
  2571. ;*          in the input buffer.
  2572. ;*
  2573. ;******************************************************************************
  2574.  
  2575. break:    call    iedtbc
  2576.     ret    m        ;end command - no input
  2577.     ld    c,0ffh        ;set neg - distinguish ourselves from step
  2578. brk10:    ld    a,(bps)        ;fetch current bp count
  2579.     cp    maxbp        ;table full
  2580.     jp    nc,e???        ;full -    abort command
  2581.     ld    b,a        ;save current count
  2582.     call    iarg
  2583.     jp    nz,e???
  2584.     ex    de,hl        ;de - breakpoint address to set
  2585. brk30:    ld    hl,brktbl
  2586.     xor    a
  2587.     or    b        ;check for no breakpoints in effect
  2588.     jr    z,brk60        ;none -    bypass check for duplicate
  2589. brk40:    ld    a,e
  2590.     cp    (hl)        ;check lo order    address    match
  2591.     inc    hl
  2592.     jr    nz,brk50    ;no match - check next
  2593.     ld    a,d
  2594.     sub    (hl)        ;check hi order
  2595.     jr    nz,brk50    ;no match - check next
  2596.     or    c
  2597.     ret    p
  2598.     ld    hl,bps        ;pointer to bp count
  2599.     ld    a,(hl)
  2600.     sub    b        ;create    index into psctbl
  2601.     jr    brk70
  2602. brk50:    inc    hl
  2603.     inc    hl        ;bump past contents storage byte
  2604.     djnz    brk40
  2605. brk60:    ld    (hl),e        ;set in    table
  2606.     inc    hl
  2607.     ld    (hl),d
  2608.     ld    hl,bps        ;breakpoint count
  2609.     ld    a,(hl)        ;fetch current count for user as index
  2610.     inc    (hl)        ;bump bp count
  2611. brk70:    ld    de,psctbl    ;base of pass count table
  2612.     add    a,a        ;two byte table
  2613.     add    a,e
  2614.     ld    e,a
  2615.     jr    nc,brk80
  2616.     inc    d
  2617. brk80:    xor    a
  2618.     ld    (de),a        ;pre-clear pass    count table entry
  2619.     inc    de
  2620.     ld    (de),a
  2621.     or    c        ;test if this was step calling
  2622.     ret    p        ;i'm positive it was
  2623.     ld    a,(delim)    ;check delimeter which followed    bp address
  2624.     and    a
  2625.     ret    z        ;end of    line null - terminate command
  2626.     cp    ','        ;check for pass    count delimeter
  2627.     jp    nz,brk10    ;not comma means treatt    this as    new bp
  2628.     call    iarg        ;get next arg
  2629.     jp    nz,e???        ;nz - evaluation error
  2630.     ex    de,hl        ;de - pass count as entered by user
  2631.     ld    (hl),d        ;store pass count in table
  2632.     dec    hl
  2633.     ld    (hl),e
  2634.     and    a        ;check delimeter
  2635.     jp    nz,brk10    ;nz - more arguments follow
  2636.     ret            ;end of    line null - terminate command
  2637.     page
  2638.  
  2639. ;******************************************************************************
  2640. ;*
  2641. ;*    cbreak:    clear breakpoint 
  2642. ;*
  2643. ;*    breakpoint address storage table (brktbl) is examined and breakpoint
  2644. ;*    is removed if found. breakpoint    is removed by bubbling up all bp
  2645. ;*    addresses which    follow,    ditto for pass counts.
  2646. ;*
  2647. ;******************************************************************************
  2648.  
  2649. cbreak:    call    iedtbc
  2650.     ret    m        ;no input ends command
  2651.     ld    a,(bps)        ;fetch breakpoint count
  2652.     or    a        ;any if    effect
  2653.     ret    z        ;no
  2654.     ld    b,a        ;temp save count
  2655.     call    iarg        ;extract address to clear from input buffer
  2656.     ld    de,brktbl    ;bp address storage table
  2657.     jr    z,cbrk10
  2658.     ld    a,(prsbf)
  2659.     cp    '*'
  2660.     jp    nz,e???
  2661.     ld    a,(inbfnc)
  2662.     dec    a
  2663.     jp    nz,e???
  2664.     ld    (bps),a
  2665.     ret
  2666.  
  2667. cbrk10:    ld    a,(de)        ;test lo order address for match
  2668.     cp    l
  2669.     inc    de
  2670.     jr    nz,cbrk20    ;no match - examine next entry
  2671.     ld    a,(de)
  2672.     cp    h        ;versus    hi order bp address
  2673. cbrk20:    inc    de
  2674.     inc    de        ;bump past contents save location
  2675.     jr    z,cbrk30    ;zero -    found bp in table
  2676.     djnz    cbrk10
  2677.     jp    e???        ;error - breakpoint not    found
  2678. cbrk30:    ld    h,0ffh        ;rewind    to point to bp address
  2679.     ld    l,-3
  2680.     add    hl,de
  2681.     ex    de,hl        ;de - ptr to bp      hl - ptr to next bp
  2682.     ld    a,b        ;multiply number of bps    remaining in table
  2683.                 ;times three bytes per entry
  2684.     add    a,a
  2685.     add    a,b
  2686.     ld    c,a        ;init c    for ldir
  2687.     ld    a,b        ;save number of    bps remaining
  2688.     ld    b,0
  2689.     ldir            ;bubble    up all remaining entries in table
  2690.     ld    c,a        ;
  2691.     ld    hl,bps        ;address of bp count
  2692.     ld    a,(hl)        ;
  2693.     dec    (hl)        ;decrement system breakpoint count
  2694.     sub    c        ;compute relative number of pass count table
  2695.                 ;entry we wish to clear
  2696.     add    a,a        ;times two bytes per entry
  2697.     ld    l,a
  2698.     ld    h,b        ;cheap clear
  2699.     ld    de,psctbl
  2700.     add    hl,de        ;index into pass count table
  2701.     ex    de,hl
  2702.     ld    hl,02
  2703.     add    hl,de        ;de - ptr to pass count     hl - next in table
  2704.     sla    c        ;number    of pass    counts to move
  2705.     ldir
  2706.     ld    a,(delim)    ;recheck delimeter
  2707.     and    a
  2708.     jr    nz,cbreak    ;not end of line terminator - clear more
  2709.     ret
  2710.     page
  2711. ;***********************************************************************
  2712. ;*
  2713. ;*     obreak:    output all breakpoints and associated pass counts to
  2714. ;*        console.  search symbol    table for match, if symbol name
  2715. ;*        found display it along with address.
  2716. ;*
  2717. ;*     wbreak:    wipe out (clear) all breakpoints currently in effect
  2718. ;*
  2719. ;*        entered:  b - zero
  2720. ;*
  2721. ;***********************************************************************
  2722.  
  2723. obreak:    ld    a,(bps)        ;fetch bp count
  2724.     dec    a        ;test for no breakpoints
  2725.     ret    m        ;m - none
  2726.     ld    b,a        ;save count
  2727. obrk00:    ld    hl,brktbl    ;base of breakpoint storage table
  2728.     ld    e,b        ;use current breakpoint    count as index
  2729.     ld    d,0        ;clear
  2730.     add    hl,de        ;this is a three byte table
  2731.     add    hl,de
  2732.     add    hl,de
  2733.     ld    e,(hl)        ;fetch lo order    bp address
  2734.     inc    hl
  2735.     ld    d,(hl)        ;upper address
  2736.     ex    de,hl
  2737.     call    outadr        ;display address
  2738.     ex    de,hl        ;hl - breakpoint table
  2739.     call    fadr        ;check symbol table for    name match
  2740.                 ;   symbol table pointer returned in de
  2741.                 ;   zero flag set if found
  2742.     ld    a,(maxlen)
  2743.     ld    c,a
  2744.     dec    bc        ;max number of chars in    a symbol name
  2745.     ex    de,hl        ;hl - symbol table address if
  2746.     call    z,printb    ;display name if found in symbol table
  2747.     ld    a,b
  2748.     add    a,a        ;bp number times two
  2749.     ld    hl,psctbl    ;base of pass count table
  2750.     add    a,l
  2751.     ld    l,a
  2752.     jr    nc,obrk10
  2753.     inc    h
  2754. obrk10:    ld    e,(hl)        ;lo order pass count
  2755.     inc    hl
  2756.     ld    d,(hl)        ;upper byte
  2757.     ld    a,d        ;test if pass count in effect
  2758.     or    e
  2759.     jr    z,obrk20    ;z - no    pass count for this bp
  2760.     inc    c
  2761.     call    spaces        ;
  2762.     ex    de,hl
  2763.     call    outadr        ;display pass count in hex
  2764. obrk20:    call    crlf
  2765.     ld    c,5
  2766.     call    spaces
  2767.     dec    b        ;dec bp    count
  2768.     jp    p,obrk00
  2769.     ret
  2770.  
  2771.  
  2772.  
  2773. kdmp:    call    iedtbc        ;let user input address of memory to display
  2774.     ret    m        ;no input ends command
  2775.     call    iarg        ;evaluate user arg        
  2776.     jp    nz,e???
  2777.     ex    de,hl        ;de - save memory address
  2778.     call    iarg        ;now get count
  2779.     ld    a,0
  2780.     jr    nz,kdmp20    ;error during input - display 00 bytes
  2781.     or    h
  2782.     jp    nz,e???        ;greater than 256 is error
  2783.     ld    a,(maxlen)    ;max symbol length
  2784.     ld    b,2        ;assume big names
  2785.     cp    15        
  2786.     ld    a,18        ;number of disassembled lines displayed
  2787.     jr    z,kdmp00
  2788.     ld    b,3        ;double number of lines one extra time
  2789. kdmp00:    add    a,a        ;times two
  2790.     djnz    kdmp00
  2791.     cp    l
  2792.     jr    c,kdmp20    ;if number of bytes specified by user is too
  2793.                 ;large then use default
  2794.     ld    a,l        ;use value specified by user
  2795. kdmp20:    ld    (wnwtab),de
  2796.     ld    (wnwsiz),a
  2797.     ret
  2798.     page
  2799. ;**************************************************************************
  2800. ;*
  2801. ;*             begin/resume execution of user program
  2802. ;*
  2803. ;*    address    entered:     execution begins at entered address
  2804. ;*    no address entered:  execution resumed at specified by saved pc
  2805. ;*
  2806. ;*    breakpoint table examined:
  2807. ;*          -    memory contents    from each address is removed from user
  2808. ;*        program    and saved in breakpoint    table
  2809. ;*          -    rst 38 instruction is placed at    each breakpoint    address
  2810. ;*        in user    program
  2811. ;*
  2812. ;*    user registers restored
  2813. ;*
  2814. ;***************************************************************************
  2815.  
  2816. go:    call    iedtbc        ;query user for    execution address
  2817.     ret    m        ;no - input reprompt
  2818.     call    iarg
  2819.     jp    nz,e???        ;error - invalid argument
  2820.     call    crlf
  2821.     call    crlf
  2822. g100:    ld    (jmplo),hl    ;store execution address
  2823.     ld    a,jp
  2824.     ld    (jmp),a        ;set jp    instruction
  2825.     ld    (jmp2jp),a    ;just in case 
  2826.     ld    a,(bps)        ;check breakpoint count
  2827.     and    a
  2828.     jp    z,g600        ;z - no    bps in effect -    no restoration needed
  2829.     ld    b,a
  2830.     ld    hl,brktbl
  2831.     ld    c,0ffh
  2832. g300:    ld    e,(hl)
  2833.     inc    hl
  2834.     ld    d,(hl)        ;de - breakpoint address removed from table
  2835.     inc    hl        ;point to contents save    byte in    table
  2836.     ld    a,(de)
  2837.     ld    (hl),a
  2838.     ld    a,(jmplo)
  2839.     cp    e        ;check if bp from table    matches    next pc
  2840.     jr    nz,g400        ;no match - set    breakpoint
  2841.     ld    a,(jmphi)
  2842.     cp    d        ;check hi order    next pc    address
  2843.     jr    nz,g400        ;no match - set    bp
  2844.     ld    c,b        ;set flag - current pc matches breakpoint
  2845.     jr    g500
  2846. g400:    ld    a,rst38        ;set rst38 instruction
  2847.     ld    (de),a        ;save user byte    in brktbl
  2848. g500:    inc    hl
  2849.     djnz    g300        ;examine all entries
  2850.     inc    c        ;current pc match breakpoint?
  2851.     jp    z,g600        ;z - no (c reg not 0ffh)
  2852.     ld    a,(sbps)    ;check number of step breakpoints
  2853.     and    a        ;tracing?
  2854.     jp    nz,g600        ;nz - this is trace
  2855.  
  2856.                 ;pc points to address in breakpoint table
  2857.                 ;next instruction will not be executed where
  2858.                 ;it resides.  it will be moved to our internal
  2859.                 ;buffer (execbf) and executed there. then we
  2860.                 ;set an rst38 at actual location in user 
  2861.                 ;program.  this allows us to debug loops in 
  2862.                 ;which only one bp is set.  otherwise we would
  2863.                 ;not be able to set a bp at the address where
  2864.                 ;the pc points and debugging loops would be
  2865.                 ;impossible.      
  2866.     ld    hl,execbf
  2867.     ld    de,(jmplo)    ;de - pointer to next instruction to execute
  2868.     ld    (jmplo),hl    ;execute buffer
  2869.     ld    b,4        ;clear execute buffer
  2870. g505:    ld    (hl),nop
  2871.     inc    hl
  2872.     djnz    g505
  2873.     call    zlen00        ;calculate length
  2874.                 ;if instruction modifies pc then zlen lets us
  2875.                 ;know by setting b reg nz and c contains 
  2876.                 ;instruction length
  2877.  
  2878.     ld    (jropnd),hl    ;if this is a jr instruction we need to save
  2879.                 ;address where we will be jumping 
  2880.  
  2881.  
  2882.                 ;default execbf has been initialized:
  2883.                 ;
  2884.                 ;four nops     
  2885.                 ;     jp   user program 
  2886.                 ;     
  2887.     ex    de,hl        ;hl - ptr to user instruction
  2888.     ld    de,execbf
  2889.     ld    a,(hl)        ;first object byte from    user program
  2890.     ld    (hl),rst38    ;replace
  2891.     push    bc        ;b - if nz this is a pc modifying instruction
  2892.                 ;c - number of bytes of object code for this
  2893.                 ;    instruction
  2894. g520:    ld    (de),a        ;into execute buffer
  2895.     inc    de
  2896.     inc    hl        ;bump user program pointer
  2897.     ld    a,(hl)        ;next byte of instruction from user program
  2898.     dec    c
  2899.     jr    nz,g520
  2900.     pop    bc
  2901.                 ;the four nops in execbf have now been replaced
  2902.                 ;by from one to four bytes of actual user
  2903.                 ;instruction.  if user instruction was shorter
  2904.                 ;than four bytes the nops remain and are 
  2905.                 ;executed until the jump back to the user 
  2906.                 ;program at jmp2jp is reached.
  2907.  
  2908.  
  2909.     ld    (jmp2),hl    ;address of next inline instruction within
  2910.                 ;user code    
  2911.  
  2912.     ex    de,hl        ;de - next inline instruction in user program
  2913.     xor    a
  2914.     or    b
  2915.     jr    z,g600        ;z - the instruction in execbf is not a pc 
  2916.                 ;modifying instruction
  2917.  
  2918.     ld    a,(execbf)    ;first byte of instruction
  2919.     dec    c        ;one byte instruction?
  2920.     jr    z,g600
  2921.     dec    c
  2922.     jr    z,g550        ;two byter
  2923.     dec    c
  2924.     jr    nz,g600        ;nz - must be four byter
  2925.     ld    b,c        ;clear for cpir
  2926.     ld    c,z803sl    ;test for call instruction
  2927.     ld    hl,z803s    ;load list of first byte of call instructions
  2928.     cpir
  2929.     jr    nz,g600        ;nz - not call
  2930.  
  2931.                 ;moving call instructions and executing them
  2932.                 ;locally requires special processing because
  2933.                 ;the z80 will store the address pc+3 on the
  2934.                 ;stack.  in this case we do not want the 
  2935.                 ;address  execbf+3 on the stack.  we want the
  2936.                 ;address of the actual location of the user
  2937.                 ;instruction+3 on the stack.  we must do this
  2938.                 ;by simulating a call instruction. we use the
  2939.                 ;jp instruction which is equivalent to the
  2940.                 ;call and we also push a computed return 
  2941.                 ;address on to the user stack pointed to by 
  2942.                 ;spreg.
  2943.  
  2944.     ld    bc,08        ;point to jump instruction which is equivalent
  2945.                 ;to call (call nz = jp nz)
  2946.     add    hl,bc
  2947.     ld    a,(hl)        ;fetch jump object byte 
  2948.     ld    hl,(spreg)    ;push next pc onto user stack
  2949.     dec    hl        ;decrement user sp
  2950.     ld    (hl),d        ;de - "return address"
  2951.     dec    hl
  2952.     ld    (hl),e
  2953.     ld    (spreg),hl
  2954.     ld    (execbf),a    ;store jp op code    
  2955.     ld    hl,jmp2        ;if conditional call and we fall thru
  2956.                 ;we need to go back to address of call
  2957.                 ;in user program + 3
  2958.     ld    (hl),e
  2959.     inc    hl
  2960.     ld    (hl),d
  2961.     jr    g600
  2962.                 ;if next instruction to execute is a 
  2963.                 ;relative jump we need to replace it with
  2964.                 ;an absolute equivalent.  this is because
  2965.                 ;having relocated the user jr instruction
  2966.                 ;into execbf we will undoubtedly be out of
  2967.                 ;range of the destination.
  2968.  
  2969. g550:    ld    c,z802cl    ;check if this is relative jump
  2970.     ld    hl,z802c
  2971.     and    a        ;clear carry
  2972.     cpir
  2973.     jr    nz,g600        ;not a jr
  2974.     ld    a,c
  2975.     ld    bc,z802c
  2976.     sbc    hl,bc
  2977.     dec    hl
  2978.     ld    bc,z803c
  2979.     add    hl,bc        ;point to equivalent absolute jump
  2980.     and    a
  2981.     ld    a,(hl)
  2982.     ld    hl,execbf
  2983.     jr    nz,g555        ;nz - not last in list (not djnz)
  2984.  
  2985.                 ;replace djnz with  dec   b
  2986.                 ;            jp    nz,
  2987.              
  2988.     ld    (hl),05        ;dec b instruction
  2989.     inc    hl
  2990.     ld    a,0c2h        ;jp nz absolute
  2991. g555:    ld    (hl),a
  2992.     inc    hl
  2993.     ld    bc,(jropnd)    ;if this is a conditional jr we need the
  2994.                 ;absolute destination of the jump
  2995.     ld    (hl),c
  2996.     inc    hl
  2997.     ld    (hl),b
  2998.  
  2999. g600:    ld    iy,(iyreg)    ;restore user iy
  3000.     ld    ix,(ixreg)    ;restore user ix
  3001.     ld    a,(rreg)
  3002.     ld    r,a        ;restore user r    reg
  3003.     ld    a,(ireg)
  3004.     ld    i,a        ;restore user i    reg
  3005.     ld    bc,(bcpreg)    ;restore user grade a prime regs
  3006.     ld    de,(depreg)
  3007.     ld    hl,(afpreg)
  3008.     push    hl
  3009.     pop    af
  3010.     ld    hl,(hlpreg)
  3011.     ex    af,af'
  3012.     exx
  3013.     ld    hl,(afreg)    ;restore user accumulator and flag
  3014.     push    hl
  3015.     pop    af
  3016.     ld    bc,(bcreg)    ;restore user bc
  3017.     ld    de,(dereg)    ;restore user de
  3018.     ld    hl,(hlreg)    ;restore user hl
  3019.     ld    sp,(spreg)    ;restore user sp
  3020.     jp    jmp
  3021.     page
  3022. ;******************************************************************************
  3023. ;*
  3024. ;*    step:  single step (trace) routine
  3025. ;*
  3026. ;*    call zlen to determine where to    set breakpoint.
  3027. ;*
  3028. ;*        pass:       de -    current    pc address
  3029. ;*
  3030. ;*        returned:  b:  z - next    instruction will not modify pc.
  3031. ;*                   set bp at address specified by pc+length.
  3032. ;*
  3033. ;*               b: nz - next    instruction will modify    pc (jumps,
  3034. ;*                   calls, and returns) thus set    bp at address
  3035. ;*                   returned in hl.
  3036. ;*
  3037. ;*               c:     - number of bytes in current instruction.
  3038. ;*
  3039. ;*        zlen handles secondary breakpoint to set for all conditional
  3040. ;*        call, return, and jump instructions.
  3041. ;*
  3042. ;*    call brk00 to set breakpoint.
  3043. ;*
  3044. ;*        pass:       b - current number of breakpoints.
  3045. ;*              hl - address at which    to set breakpoint.
  3046. ;*
  3047. ;*    entry point step:    entered by    user via (s)ingle step command.
  3048. ;*    entry point step40:  entered by    breakpoint handler - step count    nz
  3049. ;*
  3050. ;*    exit:    to go routine to resume    execution.
  3051. ;*
  3052. ;******************************************************************************
  3053.  
  3054. step:    ld    a,0ffh
  3055.     ld    (wflag),a    ;set trace subroutine flag on
  3056.     call    iedtbc        ;query user for    trace count
  3057.     ld    hl,0001
  3058.     jp    m,step40    ;null input - step count of one
  3059.     call    prsr
  3060.     jp    nz,e???
  3061.     ld    a,(de)        ;first character from parse buffer
  3062.     sub    '/'
  3063.     ld    (wflag),a    ;may be    slash -    no subroutine tracing
  3064.     ld    hl,00
  3065.     jr    nz,step20
  3066.     ld    (de),a
  3067.     ld    a,(inbfnc)
  3068.     dec    a
  3069.     inc    hl
  3070.     jr    z,step40
  3071.     dec    hl
  3072. step20:    call    xval        ;evaluate contents of parse buffer
  3073.     jp    nz,e???
  3074.     ld    de,(pcreg)
  3075.     ld    a,(de)        ;first byte of op code at current pc
  3076.     cp    0c7h        ;test for rst
  3077.     jp    z,e???        ;no tracing of rsts 
  3078. step40:    ld    (nstep),hl    ;save step count
  3079.     ld    hl,sbps        ;set step flag nz - trace in effect
  3080.     inc    (hl)
  3081.     ld    de,(pcreg)    ;fetch current pc
  3082.     call    zlen00        ;determine number of bytes in instruction
  3083.     inc    b        ;test where to set breakpoint
  3084.     djnz    step50        ;nz - set at address in    hl
  3085.     ex    de,hl
  3086.     add    hl,bc        ;z - set at address pc + instruction length
  3087. step50:    ld    a,(bps)        ;get current number of bps
  3088.     ld    b,a        ;pass to set bp    routine    in b reg
  3089.     ex    de,hl        ;de - bp address to set
  3090.     call    brk30
  3091.     ld    hl,(pcreg)    ;resume    execution at next pc
  3092.     xor    a
  3093.     or    b
  3094.     jp    nz,g100        ;nz - collision    with user bp
  3095.     ex    de,hl
  3096.     ld    hl,sbps        ;step bp set by    brk30 -    bump count
  3097.     inc    (hl)
  3098.     ex    de,hl
  3099.     jp    g100
  3100.     page
  3101. ;******************************************************************************
  3102. ;*
  3103. ;*    asmblr:    z80 assembler
  3104. ;*
  3105. ;******************************************************************************
  3106.  
  3107. asmblr:
  3108.     call    ilin
  3109.     jp    nz,e???
  3110. asm000:    call    crlf
  3111.     ld    (zasmpc),hl    ;save here as well
  3112.     call    zasm08        ;disassemble first instruction
  3113.  
  3114. asm005:
  3115.     ld    hl,(asmbpc)
  3116. asm010:    call    crlf
  3117.     call    outadr        ;display current assembly pc
  3118.     ld    c,22        ;
  3119.     call    spaces        ;leave room for    object code
  3120.     ld    a,3
  3121.     ld    hl,objbuf    ;zero scratch object code buffer
  3122. asm015:    ld    (hl),c
  3123.     inc    hl
  3124.     dec    a
  3125.     jp    p,asm015
  3126.     ld    (oprn01),a    ;init operand key values to 0ffh
  3127.     ld    (oprn02),a
  3128.     call    iedtbc        ;get user input
  3129.     ret    m        ;m - no    input ends command
  3130.     call    cret
  3131.     call    prsr        ;parse to obtain label
  3132.     ld    a,(hl)        ;check last character
  3133.     cp    ':'
  3134.     jr    nz,asm040    ;no colon found    - must be op code
  3135.     ld    (hl),0        ;erase colon
  3136.     ld    a,(de)        ;fetch first char of label from    parse buffer
  3137.     cp    'A'
  3138.     jp    c,asm??l    ;error - first character must be alpha
  3139.     cp    'z'+1
  3140.     jp    nc,asm??l    ;label error
  3141.     cp    'a'
  3142.     jr    nc,asm030
  3143.     cp    'Z'+1
  3144.     jp    nc,asm??l
  3145. asm030:    ld    hl,00
  3146.     ld    (isympt),hl    ;clear pointer
  3147.     call    isym        ;attempt to insert symbol into symbol table
  3148.     jp    nz,asm??t    ;error - symbol    table full
  3149.     ld    (isympt),hl    ;save pointer to symbol    value in symbol    table
  3150.     call    prsr        ;extract opcode
  3151.     jp    m,asm005    ;m - statement contains    label only
  3152. asm040:    ld    a,(delim)    ;check delimeter
  3153.     cp    ','        ;check for invalid terminator
  3154.     jp    z,asm??o
  3155.     ld    c,73        ;number    of opcodes in table as index
  3156. asm050:    dec    c
  3157.     jp    m,asm??o    ;opcode    not found
  3158.     ld    b,0
  3159.     ld    hl,zopcnm    ;table of opcode names
  3160.     add    hl,bc
  3161.     add    hl,bc        ;index times four
  3162.     add    hl,bc
  3163.     add    hl,bc
  3164.     ld    de,prsbf    ;start of parse    buffer
  3165.     ld    b,4
  3166. asm060:    ld    a,(de)        ;character from    parse buffer
  3167.     and    a        ;null?
  3168.     jr    nz,asm070
  3169.     ld    a,' '        ;for comparison    purposes
  3170. asm070:    call    ixlt        ;force upper case for compare
  3171.     cp    (hl)
  3172.     jr    nz,asm050    ;mismatch - next opcode    name
  3173.     inc    de
  3174.     inc    hl
  3175.     djnz    asm060        ;must match all    four
  3176.     ld    a,(de)        ;null following    opcode?
  3177.     and    a
  3178.     jp    nz,asm??o    ;error - opcode    more than 4 characaters
  3179.     ld    hl,ikey        ;relative position in table is key value
  3180.     ld    (hl),c        ;save opcode key value
  3181.     call    prsr        ;extract first operand
  3182.     jp    m,asm085    ;m - none
  3183.     call    oprn        ;evaluate operand
  3184.     jr    nz,asm??u    ;error - bad first operand
  3185.     ld    de,oprn01
  3186.     call    opnv        ;save operand value and    key
  3187.     ld    a,(delim)
  3188.     cp    ','
  3189.     jr    nz,asm085    ;need comma for    two operands
  3190.     call    prsr        ;extract second    operand
  3191.     jp    m,asm??s    ;error - comma with no second operand
  3192.     cp    ','
  3193.     jp    z,asm??s    ;illegal line termination
  3194.     call    oprn        ;evaluate operand
  3195.     jr    nz,asm??u    ;error - bad second operand
  3196.     ld    de,oprn02
  3197.     call    opnv        ;save second operand value and key
  3198. asm085:    xor    a
  3199.     ld    c,a
  3200. asm090:    ld    hl,zopcpt    ;opcode    name pointer table
  3201.     ld    b,0
  3202.     add    hl,bc        ;index into table
  3203.     ld    a,(ikey)    ;fetch opcode key value
  3204.     cp    (hl)        ;check for match
  3205.     jr    nz,asm095    ;
  3206.     inc    h        ;point to first    operand    table
  3207.     ld    de,oprn01    ;address of first operand key value
  3208.     call    opnm        ;check validity
  3209.     jr    nz,asm095    ;no match - next
  3210.     ld    b,a        ;save modified key value
  3211.     inc    h        ;point to second operand table
  3212.     ld    de,oprn02    ;address of second operand key value
  3213.     call    opnm
  3214.     jr    z,ibld        ;match - attempt final resolution
  3215. asm095:    inc    c        ;bump index
  3216.     jr    nz,asm090    ;nz - check more
  3217. asm??u:    ld    a,'U'        ;error
  3218.     jp    asm???
  3219.  
  3220.  
  3221.  
  3222.  
  3223. ibld:    ld    hl,objbuf    ;object    code temp buffer
  3224.     ld    e,a        ;save second operand key
  3225.     ld    a,(hl)        ;check first byte of object buffer
  3226.     and    a        ;null?
  3227.     ld    a,c        ;instruction key to accumulator    regardless
  3228.     ld    c,e        ;save second operand modified key
  3229.     jr    z,ibld00    ;z - not ix or iy instruction
  3230.     inc    hl        ;point to byte two of object code
  3231. ibld00:    cp    40h
  3232.     jr    c,ibld55    ;c - 8080 instruction
  3233.     cp    0a0h
  3234.     jr    nc,ibld10    ;nc - not ed instruction
  3235.     ld    (hl),0edh    ;init byte one of object code
  3236.     inc    hl
  3237.     cp    80h        ;check which ed    instruction we have
  3238.     jr    c,ibld55    ;c - this is exact object byte
  3239.     add    a,20h        ;add bias to obtain object byte
  3240.     jr    ibld55
  3241. ibld10:    cp    0e0h
  3242.     jr    nc,ibld20
  3243.     add    a,20h        ;8080 type - range 0c0h    to 0ffh
  3244.     jr    ibld55        ;object    byte built
  3245. ibld20:    cp    0e8h        ;
  3246.     jr    c,ibld50    ;8 bit reg-reg arithmetic or logic
  3247.     cp    0f7h        ;check for halt    disguised as ld (hl),(hl)
  3248.     jr    nz,ibld30    ;
  3249.     ld    a,76h        ;halt object code
  3250.     jr    ibld55
  3251. ibld30:    cp    0f8h
  3252.     jr    nc,ibld50    ;8 bit reg-reg load
  3253.     ld    d,a        ;temp save instruction key value
  3254.     ld    a,(objbuf)
  3255.     and    a        ;check for previously stored first object byte
  3256.     ld    a,d
  3257.     ld    (hl),0cbh    ;init byte regardless
  3258.     inc    hl
  3259.     jr    z,ibld40    ;z - not ix or iy instruction
  3260.     inc    hl        ;bump object code pointer - this is four byter
  3261. ibld40:    add    a,0a8h        ;add bias for comparison purposes
  3262.     cp    98h
  3263.     jr    c,ibld50    ;c - shift or rotate instruction
  3264.     rrca
  3265.     rrca
  3266.     and    0c0h        ;this is skeleton for bit instuctions
  3267.     jr    ibld55
  3268. ibld50:    add    a,a        ;form skeleton
  3269.     add    a,a
  3270.     add    a,a
  3271.     add    a,80h
  3272. ibld55:    ld    (hl),a        ;store object byte
  3273.     xor    a
  3274.     or    c        ;second    operand    need more processing?
  3275.     ld    de,oprn02
  3276.     call    nz,rslv        ;resolve second    operand
  3277.     jp    nz,asm??v    ;error - invalid operand size
  3278.     ld    de,oprn01
  3279.     ld    a,b
  3280.     and    a        ;first operand resolved?
  3281.     call    nz,rslv        ;more work to do
  3282.     jp    nz,asm??v    ;error - invalid operand size
  3283.     ld    a,(ikey)
  3284.     sub    67        ;org directive?
  3285.     jr    nz,ibld60
  3286.     ld    d,(hl)
  3287.     dec    hl
  3288.     ld    e,(hl)
  3289.     ex    de,hl
  3290.     jp    asm000        ;z - org directive
  3291. ibld60:    ld    de,objbuf
  3292.     jr    c,ibld70    ;c - instruction  nc - directive
  3293.     ld    b,a        ;number    of bytes for defb or defw or ddb
  3294.     inc    de        ;point past erroneous assembled    opcode
  3295.     inc    de
  3296.     sub    3        ;test for ddb
  3297.     jr    c,ibld75    ;c - must be defb or defw
  3298.     dec    a
  3299.     jr    nz,ibld65    ;nz - must be ddb
  3300.     ld    d,(hl)        ;must be equ
  3301.     dec    hl
  3302.     ld    e,(hl)
  3303.     ld    hl,(isympt)    ;fetch pointer to entry    in symbol table
  3304.     ld    a,h
  3305.     or    l
  3306.     jp    z,asm??u    ;error - no label on equ statement
  3307.     ld    (hl),d
  3308.     dec    hl
  3309.     ld    (hl),e        ;store value of    symbol in symbol table
  3310.     ld    c,6
  3311.     call    spaces
  3312.     ld    a,d
  3313.     call    othxsp
  3314.     ld    a,e
  3315.     call    othxsp
  3316.     jp    asm005        ;ready for next    input
  3317. ibld65:    dec    b        ;set count of object bytes to 2
  3318.     ld    c,(hl)        ;exchange hi and lo order bytes    for ddb
  3319.     dec    hl
  3320.     ld    a,(hl)
  3321.     ld    (hl),c        ;new hi order
  3322.     inc    hl
  3323.     ld    (hl),a        ;new hi order replaces old lo order
  3324.     jr    ibld75
  3325. ibld70:    call    zlen00        ;compute length    of instruction in bytes
  3326.     ld    b,c        ;b - number of bytes of    object code
  3327. ibld75:    ld    hl,(asmbpc)
  3328.     call    outadr        ;re-display current location counter
  3329. ibld80:    ld    a,(de)        ;move from scratch object buffer
  3330.     ld    (hl),a        ;into address pointed to by location counter
  3331.     inc    hl
  3332.     inc    de
  3333.     call    othxsp        ;display each object code byte
  3334.     djnz    ibld80
  3335. ibld90:    ld    (asmbpc),hl
  3336.     jp    asm005        ;next input from user
  3337.  
  3338.  
  3339.  
  3340.  
  3341. opnm:    ld    a,(de)        ;key value computed by operand routine
  3342.     xor    (hl)        ;compare with table operand table entry
  3343.     ret    z        ;true match of operand key values
  3344.     xor    (hl)        ;restore
  3345.     add    a,a        ;86 all    no operand key values (0ffh)
  3346.     ret    m
  3347.     ld    a,(hl)        ;fetch table entry
  3348.     and    7fh        ;sans paren flag for comparison    purposes
  3349.     cp    1bh        ;check table entry 8 bit - 16 bit - $ rel ?
  3350.     jr    c,opnm00    ;c - none of the above
  3351.     ld    a,(de)        ;fetch computed    key
  3352.     xor    (hl)        ;compare with paren flags
  3353.     ret    m        ;error - paren mismatch
  3354.     ld    a,(de)        ;fetch key once    more
  3355.     and    7fh        ;remove    paren flag
  3356.     cp    17h        ;computed as 8 bit - 16    bit - $    rel?
  3357.     jr    z,opnm40    ;so far    so good
  3358.     ret            ;
  3359. opnm00:    cp    19h        ;check for 8 bit reg
  3360.     jr    nc,opnm20    ;8 bit register    match
  3361.     cp    18h        ;table says must be hl - ix - iy
  3362.     ret    nz        ;computed key disagrees
  3363.     ld    a,(de)        ;fetch computed    key
  3364.     and    7        ;computed as hl    - ix - iy ?
  3365.     ret    nz        ;no
  3366. opnm10:    ld    a,(de)        ;fetch computed    key
  3367.     xor    (hl)
  3368.     ret    m        ;error - paren mismatch    on hl -    ix - iy
  3369.     jr    opnm40
  3370. opnm20:    ld    a,(de)        ;fetch computed    key of 8 bit reg
  3371.     and    a        ;
  3372.     jr    nz,opnm30    ;nz - not (hl)
  3373.     dec    a        ;error - 8 bit (hl) missing parens
  3374.     ret
  3375. opnm30:    cp    8        ;test user entered valid 8 bit reg
  3376.     jr    c,opnm40    ;c - ok
  3377.     and    a        ;test if no carry caused by paren flag
  3378.     ret    p        ;error - this is not 8 bit reg with parens
  3379.     and    7        ;psuedo    8 bit reg: (hl)    (ix) (iy)?
  3380.     ret    nz        ;no
  3381. opnm40:    ld    a,(hl)        ;fetch table entry
  3382.     and    7fh
  3383.     sub    18h        ;make values 18    thru 1f    relative zero
  3384.     cp    a        ;zero means match
  3385.     ret
  3386.  
  3387. rslv:    dec    a
  3388.     jr    z,rslv00    ;z - 8 bit reg (bits 0-2 of object byte)
  3389.     dec    a
  3390.     jr    nz,rslv20    ;nz - not 8 bit    reg (bits 3-5 of object    byte)
  3391.     dec    a        ;make neg to indicate shift left required
  3392. rslv00:    ld    c,a
  3393.     ld    a,(de)        ;fetch computed    operand    key
  3394.     and    07        ;lo three bits specify reg
  3395.     xor    6        ;create    true object code bits
  3396.     inc    c        ;test if bits 0-2 or bits 3-5
  3397.     jr    nz,rslv10    ;nz - 0    thru 2
  3398.     add    a,a
  3399.     add    a,a
  3400.     add    a,a
  3401. rslv10:    or    (hl)        ;or with skeleton
  3402.     ld    (hl),a        ;into scratch object buffer
  3403.     cp    a        ;set zero - no error
  3404.     ret
  3405. rslv20:    inc    de        ;point to low order of operand value
  3406.     ld    c,(hl)        ;c - current skeleton  (if needed)
  3407.     inc    hl        ;bump object code buffer pointer
  3408.     dec    a
  3409.     jr    nz,rslv30    ;nz - not relative jump
  3410.     ex    de,hl        ;save object code pointer in de
  3411.     ld    a,(hl)
  3412.     inc    hl
  3413.     ld    h,(hl)
  3414.     ld    l,a        ;hl - operand value computed by    xval
  3415.     ld    a,b
  3416.     ld    bc,(asmbpc)    ;current location counter
  3417.     inc    bc
  3418.     inc    bc
  3419.     sbc    hl,bc        ;calculate displacement    from current counter
  3420.     ex    de,hl        ;de - displacement  hl - object    code pointer
  3421.     ld    b,a        ;restore b reg
  3422.     ld    a,e        ;lo order displacement
  3423.     inc    d        ;test hi order
  3424.     jr    z,rslv25    ;must have been    ff (backward displacement)
  3425.     dec    d
  3426.     ret    nz        ;error - hi order not zero or ff
  3427.     cpl            ;set sign bit for valid    forward    displacement
  3428. rslv25:    xor    80h        ;toggle    sign bit
  3429.     ret    m        ;error - sign bit disagrees with upper byte
  3430.     ld    (hl),e        ;store displacement object byte
  3431.     cp    a        ;set zero flag - no errors
  3432.     ret
  3433. rslv30:    dec    a
  3434.     jr    nz,rslv40    ;nz - not 8 bit    immediate
  3435.     ld    a,36h        ;test for reg indirect - (hl),nn
  3436.     cp    c
  3437.     jr    nz,rslv35
  3438.     ld    a,(objbuf)    ;test first object byte
  3439.     cp    c
  3440.     jr    z,rslv35    ;z - (hl),nn
  3441.     inc    hl        ;must be (ix+index),nn    or  (iy+index),nn
  3442. rslv35:    ld    a,(de)        ;move lo order operand value to    object buffer
  3443.     ld    (hl),a
  3444.     inc    de
  3445.     ld    a,(de)        ;test hi order
  3446.     and    a        ;
  3447.     ret    z        ;z - must be 0 thru +255
  3448.     inc    a        ;error if not -1 thru -256
  3449.     ret
  3450. rslv40:    dec    a
  3451.     jr    nz,rslv50    ;nz - not 16 bit operand
  3452.     ld    a,(de)        ;move both bytes of operand to object buffer
  3453.     ld    (hl),a
  3454.     inc    hl
  3455.     inc    de
  3456.     ld    a,(de)        ;byte two
  3457.     ld    (hl),a
  3458.     cp    a        ;set zero flag - no errors of course
  3459.     ret
  3460. rslv50:    dec    a        ;test restart instruction or bit number
  3461.     jr    nz,rslv60    ;nz - bit or interrupt mode number
  3462.     ld    a,(de)        ;check restart value specified
  3463.     and    0c7h        ;betweed 0 and 38h?
  3464.     ret    nz        ;error
  3465.     ld    a,(de)        ;fetch lo order    operand    value
  3466.     or    0c7h        ;or with instruction skeleton
  3467.     dec    hl
  3468.     ld    (hl),a        ;rewind    object code pointer
  3469.     inc    de
  3470.     ld    a,(de)        ;check hi order    operand    value
  3471.     and    a        ;error if not zero
  3472.     ret
  3473. rslv60:    dec    hl        ;rewind    object code buffer pointer    
  3474.     ld    a,(de)
  3475.     and    0f8h        ;ensure    bit number in range 0 -    7
  3476.     ret    nz        ;error
  3477.     ld    a,(ikey)    ;fetch opcode key value
  3478.     sub    13h        ;is this bit number of interrupt mode number?
  3479.     ld    a,(de)        ;fetch operand value regardless
  3480.     jr    nz,rslv70    ;nz - bit number
  3481.     ld    (hl),46h
  3482.     and    03        ;im 0?
  3483.     ret    z
  3484.     ld    (hl),56h
  3485.     dec    a        ;im 1?
  3486.     ret    z
  3487.     ld    (hl),5eh
  3488.     dec    a        ;error if not im 2
  3489.     ret
  3490. rslv70:    add    a,a        ;shift bit number left three
  3491.     add    a,a
  3492.     add    a,a
  3493.     or    (hl)        ;or with skeleton
  3494.     ld    (hl),a
  3495.     cp    a        ;indicate no error
  3496.     ret
  3497.  
  3498.  
  3499.  
  3500. oprn:    ld    bc,22        ;count of reserved operand
  3501. oprn00:    ld    de,prsbf    ;buffer    contains operand
  3502.     ld    a,(hl)        ;last character    of operand in parse buffer
  3503.     sub    ')'
  3504.     jr    nz,oprn20    ;not paren
  3505.     ld    (hl),a        ;remove    trailing paren - replace with null
  3506.     ld    a,(de)        ;check first character of parse    buffer
  3507.     sub    '('
  3508.     ret    nz        ;error - unbalanced parens
  3509.     ld    (de),a        ;remove    leading    paren -    replace    with null
  3510.     inc    de        ;point to next character in parse buffer
  3511. oprn20:    ld    hl,zopnm    ;index into reserved operand name table
  3512.     ld    a,c
  3513.     add    a,a        ;index times two
  3514.     add    a,l
  3515.     ld    l,a
  3516.     jr    nc,oprn25
  3517.     inc    h
  3518. oprn25:    ld    a,(de)        ;from parse buffer
  3519.     call    ixlt        ;translate to upper case for compare
  3520.     cp    (hl)        ;versus    table entry
  3521.     inc    de
  3522.     jr    nz,oprn70    ;no match - check next
  3523.     ld    a,(de)        ;check second character
  3524.     call    ixlt        ;translate to upper case
  3525.     and    a        ;if null - this    is one character reg name
  3526.     jr    nz,oprn30
  3527.     ld    a,' '        ;for comparison    purposes
  3528. oprn30:    inc    hl        ;bump table pointer
  3529.     sub    (hl)
  3530.     jr    nz,oprn70    ;no match - check next
  3531.     inc    de        ;have match - bump buffer pointer
  3532.     or    b        ;
  3533.     ret    nz        ;nz - mreg calling
  3534.     ld    a,c        ;check index value
  3535.     and    07
  3536.     jr    nz,oprn80    ;not hl    ix iy -    check for residue
  3537.     ld    a,(de)
  3538.     call    oprtor        ;check for expression operator
  3539.     jr    nz,oprn85    ;no operator but not end of operand
  3540.     ld    a,ix.. or iy..    ;special ix iy hl processing
  3541.     and    c        ;test for index    reg
  3542.     jr    z,oprn35    ;z - must be hl
  3543.     and    10h        ;transform index into 0ddh or ofdh
  3544.     add    a,a
  3545.     add    a,0ddh        ;a - first byte    of index reg opcode
  3546. oprn35:    ld    c,a        ;temp save first object    byte
  3547.     ld    hl,objbuf
  3548.     xor    (hl)
  3549.     jr    z,oprn40    ;z - first operand matches second
  3550.     cp    c        ;
  3551.     ret    nz        ;illegal ix iy hl combination
  3552.     ld    a,(oprn01)
  3553.     and    a        ;test if index reg was first operand
  3554.     jr    nz,oprn40
  3555.     dec    a        ;error - hl illegal as second
  3556.     ret
  3557.  
  3558.  
  3559. oprn40:    ld    (hl),c        ;init first byte of object code
  3560.     ld    a,(prsbf)
  3561.     and    a        ;check for previously removed parens
  3562.     ld    a,c
  3563.     ld    c,0
  3564.     jr    nz,oprn80    ;no parens - no    indexed    displacement
  3565.     and    a        ;check for ix or iy indexed instruction
  3566.     jr    z,oprn80    ;z - not index reg instruction
  3567.  
  3568.     sbc    hl,hl        ;clear hl
  3569.     ld    a,(de)        ;index reg displacement    processing
  3570.     and    a        ;test for default displacement
  3571.     call    nz,xval        ;not zero - evaluate
  3572.     jr    nz,oprn85    ;nz - displacement in error
  3573.     ld    c,00
  3574.     ld    a,l
  3575.     ld    (objbuf+2),a    ;displacement always third byte
  3576.     inc    h        ;check upper byte of index value
  3577.     jr    z,oprn50    ;must have been    0ffh
  3578.     dec    h        ;
  3579.     ret    nz        ;error - index not -128    to +127
  3580.     cpl
  3581. oprn50:    xor    80h        ;check sign bit
  3582.     ret    m        ;bit on    - index    out of range
  3583.     cp    a        ;no error - set    zero flag
  3584.     ret
  3585. oprn70:    dec    c        ;decrement reserved operand table index
  3586.     jp    m,oprn85    ;m - not a reserved operand
  3587.     dec    de        ;rewind    parse buffer pointer
  3588.     jp    oprn20        ;next table entry
  3589. oprn80:    ld    a,(de)        ;check for end of parse    buffer
  3590.     and    a
  3591.     ret    z        ;found end of line null
  3592. oprn85:    ld    de,prsbf    ;rewind    to start of input
  3593.     xor    a
  3594.     or    b
  3595.     ret    nz        ;nz - this was mreg calling
  3596.     sbc    hl,hl        ;clear hl
  3597.     call    xval        ;evaluate operand
  3598.     ld    c,17h        ;assume    numeric    operand    found
  3599.     ret
  3600.  
  3601.  
  3602. xval:    ld    a,(de)        ;check first char of parse buffer
  3603.     and    a
  3604.     jr    nz,xval00
  3605.     inc    de        ;bump past previously removed paren
  3606. xval00:    ld    (mexp),hl    ;init expression accumulator
  3607.     xor    a
  3608.     ld    (base10),a    ;clear upper digit decimal accumulator
  3609.     sbc    hl,hl        ;clear hl
  3610.     ld    (fndsym),hl    ;clear symbol found flag
  3611.     ld    (pass2),hl
  3612. xval05:    ld    a,(de)        ;char from parse buffer
  3613.     call    ixlt        ;translate to upper case
  3614.     ld    c,a        ;save character
  3615.     inc    de        ;bump parse buffer pointer
  3616.     cp    '0'        ;check for valid ascii hex digit
  3617.     jr    c,xval25
  3618.     cp    ':'
  3619.     jr    c,xval15
  3620.     cp    'A'
  3621.     jr    c,xval25
  3622.     cp    'G'
  3623.     jr    nc,xval25
  3624.     xor    a        ;check number entered flag (b reg sign bit)
  3625.     or    b
  3626.     jp    m,xval10    ;m - this was not first    char
  3627.     ld    a,(symflg)    ;check if symbol table present in memory
  3628.     and    a
  3629. xval10:    ld    a,c        ;input character back to accumulator
  3630.     jp    p,xval25    ;p - have symbol table or invalid hex digit
  3631.     sub    7
  3632. xval15:    sub    '0'        ;ascii hex to hex nibble
  3633.     add    a,a        ;shift left five - hi bit of nibble to carry
  3634.     add    a,a
  3635.     add    a,a
  3636.     add    a,a
  3637.     add    a,a
  3638.     ld    c,4        ;loop count
  3639. xval20:    adc    hl,hl        ;hl left into carry - rotate carry into    hl
  3640.     adc    a,a        ;next bit of nibble into carry
  3641.     dec    c
  3642.     jr    nz,xval20
  3643.     ld    (base10),a    ;store what was    shifted    left out of hl
  3644.     ld    a,80h        ;set sign of b - number    entered    flag
  3645.     or    b
  3646.     ld    b,a
  3647.     jr    xval05        ;next character
  3648.  
  3649. xval25:    call    oprtor        ;have expression operator?
  3650.     jr    z,xval30
  3651.     ld    a,(pass2)
  3652.     and    a
  3653.     ret    nz
  3654.     ld    a,(pass2+1)
  3655.     and    a
  3656.     jp    z,xval35
  3657.     ret
  3658.  
  3659. xval30:    xor    a
  3660.     or    b        ;check number entered flag
  3661.     ld    a,c        ;restore unmodified input character to a
  3662.     jp    nz,xval90    ;nz - take care    of previous operator
  3663.     and    a        ;end of    line null?
  3664.     ret    z        ;
  3665.     ld    b,c        ;this operator was first char of parse buffer
  3666.     jr    xval05        ;extract what follows this leading operator
  3667.  
  3668. xval35:    ld    a,c        ;recover character
  3669.     cp    '#'        ;decimal processing?
  3670.     jr    nz,xval50    ;nz - not decimal
  3671.     ld    a,b        ;check number entered flag
  3672.     xor    80h        ;toggle
  3673.     ret    m        ;error - pound sign with no number
  3674.     ld    b,a
  3675.     push    bc
  3676.     push    de
  3677.     ex    de,hl        ;save hex number in de
  3678.     ld    hl,base10
  3679.     ld    a,6
  3680.     cp    (hl)        ;check ten thousands digit
  3681.     jr    c,xval40    ;error - obviously greater than    65535
  3682.     rrd            ;nibble    to accumulator
  3683.      inc    hl
  3684.     ld    (hl),d        ;store hex number in temp buffer
  3685.     inc    hl
  3686.     ld    (hl),e        ;lo order hex number
  3687.     dec    hl        ;point back to upper byte
  3688.     ld    e,a
  3689.     xor    a
  3690.     ld    d,a        ;de - hex nibble
  3691.     call    bcdx        ;convert hi order byte
  3692.     jr    nz,xval40    ;nz - error detected during conversion
  3693.     inc    hl        ;bump to lo byte to convert
  3694.     call    bcdx
  3695.     ex    de,hl        ;hl - converted    value
  3696. xval40:    pop    de
  3697.     pop    bc
  3698.     jr    z,xval65    ;z - no    errors detected
  3699.     ret
  3700.  
  3701.  
  3702.  
  3703. xval50:    cp    quote        ;ascii literal processing
  3704.     jr    nz,xval60    ;nz - not quote
  3705.     ex    de,hl        ;
  3706.     ld    e,(hl)        ;fetch literal from buffer
  3707.     inc    hl
  3708.     cp    (hl)        ;trailing quote    found?
  3709.     jr    z,xval55    ;found
  3710.     ld    d,e        ;make literal just fetch hi order of operand
  3711.     ld    e,(hl)        ;fetch new literal as lo order
  3712.     inc    hl
  3713.     cp    (hl)        ;trailing quote?
  3714.     ret    nz        ;error - more than two chars between quotes
  3715. xval55:    ex    de,hl        ;de - parse buffer ptr     hl - operand
  3716.     inc    de        ;bump past trailing quote
  3717.     jr    xval65
  3718.  
  3719.  
  3720. xval60:    dec    de        ;point to start    of operand in parse buffer
  3721.     ld    (pass2),de
  3722.     call    fsym        ;search    symbol table
  3723.     jp    z,xval62    ;symbol    found
  3724.     ld    a,(de)
  3725.     inc    de
  3726.     cp    '$'        ;check for pc relative expression
  3727.     jp    nz,xval61
  3728.     ld    hl,(asmbpc)    ;current location value    is expression value
  3729.     jr    xval65
  3730.                 ;symbol not found - retry evaluation process
  3731.                 ;with pass2 flag set.  now token must be a
  3732.                 ;valid hex digit or error 
  3733. xval61:    ld    de,(pass2)    
  3734.     ld    a,b
  3735.     or    80h        ;set sign in b - valid digit detected which
  3736.                 ;tells xval this must be hex number
  3737.     ld    b,a
  3738.     sbc    hl,hl        ;clear hex number accumulator
  3739.     jp    xval05
  3740. xval62:    ld    a,(maxlen)    ;point to last byte of sym table entry
  3741.     or    l
  3742.     ld    l,a
  3743.     ld    a,(hl)        ;hi order symbol address
  3744.     dec    hl
  3745.     ld    l,(hl)        ;lo order
  3746.     ld    h,a
  3747. xval65:    ld    a,b        ;check number entered flag
  3748.     and    a
  3749.     ret    m        ;error - numbers entered previous to symbol
  3750.     xor    80h        ;toggle    flag
  3751.     ld    b,a
  3752.     ld    a,(de)        ;check char following symbol name in buffer
  3753.     ld    c,a        ;make it new current character
  3754.     inc    de
  3755.     jp    xval30
  3756.  
  3757.  
  3758.  
  3759.  
  3760.  
  3761. xval90:    ld    c,a        ;temp save operator
  3762.     ld    a,80h        ;toggle    number entered flag
  3763.     xor    b
  3764.     ret    m        ;return    nz - consecutive operators
  3765.     ld    b,c        ;new on    deck operator
  3766.     cp    '-'        ;test last operator
  3767.     push    de        ;save buffer pointer
  3768.     jr    nz,xval95    ;nz - addition
  3769.     ex    de,hl
  3770.     sbc    hl,hl        ;clear
  3771.     sbc    hl,de        ;force current value neg by subtraction from 0
  3772. xval95:    ex    de,hl
  3773.     ld    hl,(mexp)    ;fetch accumulated operand total
  3774.     add    hl,de        ;add in    current
  3775.     pop    de        ;restore buffer    pointer
  3776.     ld    a,b        ;check operator    that got us here
  3777.     and    a        ;end of    line null?
  3778.     jp    nz,xval00    ;no -
  3779.     ret            ;operand processing complete
  3780.  
  3781.  
  3782.  
  3783. fsym:
  3784.     ld    hl,(06)        ;de - buffer   hl - symbol table
  3785. fsym00:    ld    a,(maxlen)
  3786.     and    l        ;
  3787.     ld    c,a
  3788.     ld    a,b        ;temp save
  3789.     ld    b,0
  3790.     ex    de,hl        ;de - symbol table ptr    hl - parse buffer
  3791.     sbc    hl,bc        ;rewind    parse buffer to    start of symbol
  3792.     ex    de,hl        ;de - parse buffer  hl - symbol    table pointer
  3793.     ld    b,a        ;restore b reg
  3794.     ld    a,(maxlen)
  3795.     or    l
  3796.     ld    l,a
  3797.     inc    hl        ;next block of symbol table
  3798.     ld    a,(hl)        ;first character of symbol name
  3799.     dec    a        ;
  3800.     ret    m        ;end of    table
  3801.     ld    a,(maxlen)
  3802.     dec    a
  3803.     ld    c,a        ;chars per symbol 
  3804. fsym10:    ld    a,(de)        ;fetch char from buffer
  3805.     call    oprtor
  3806.     jr    nz,fsym20    ;nz - not operator or end of line null
  3807.     ld    a,(hl)
  3808.     and    a        ;null means end    of symbol name in symbol table
  3809.     jr    nz,fsym00    ;
  3810.     ld    (fndsym),hl    ;set symbol found flag nz -
  3811.     ret
  3812. fsym20:    cp    (hl)
  3813.     jr    nz,fsym00
  3814.     inc    hl
  3815.     inc    de
  3816.     dec    c
  3817.     jr    nz,fsym10
  3818.     ld    (fndsym),hl    ;set symbol found flag nz -
  3819. fsym30:    ld    a,(de)
  3820.     call    oprtor
  3821.     ret    z
  3822.     inc    de
  3823.     jr    fsym30
  3824.  
  3825.  
  3826.  
  3827. isym:    call    fsym        ;search    for symbol in table
  3828.     jr    z,isym00    ;z - symbol found
  3829.     ld    a,(hl)        ;test for empty    slot in    table
  3830.     and    a
  3831.     ret    nz        ;symbol    table full
  3832.     ld    (symflg),a    ;indicate non-empty symbol table
  3833. isym00:    ld    a,(maxlen)    ;rewind    point to start of table    entry
  3834.     ld    c,a
  3835.     cpl    
  3836.     and    l
  3837.     ld    l,a
  3838.     ex    de,hl        ;de - pointer to start of symbol
  3839.     ld    hl,prsbf
  3840.     ld    b,0        ;move symbol from parse    buffer to table
  3841.     dec    c
  3842.     ldir
  3843.     ld    hl,(asmbpc)    ;fetch value of    symbol
  3844.     ex    de,hl        ;hl - pointer to address storage
  3845.     ld    (hl),e        ;lo order current location into    table
  3846.     inc    hl
  3847.     ld    (hl),d        ;upper byte
  3848.     xor    a
  3849.     ret
  3850.     page
  3851. ;******************************************************************************
  3852. ;*
  3853. ;*    prsr:    command    line parse routine
  3854. ;*
  3855. ;*    prsr will extract one argument from the    input buffer (inbf) and
  3856. ;*    write it into the parse    buffer (prsbf).    an argument is treated
  3857. ;*    as starting with the first non-delimeter character encountered
  3858. ;*    in the input buffer and ends with the next delimeter found.
  3859. ;*    all intervening    characters between the two delimeters are
  3860. ;*    treated    as the argument    and are    moved to prsbf.
  3861. ;*
  3862. ;*    as each character is extracted from inbf a zero is written back
  3863. ;*    to replace it.  thus a program which needs to extract multiple args
  3864. ;*    need not save pointers in between calls    since prsr is trained
  3865. ;*    to strip leading delimeters while looking for the start    of an
  3866. ;*    argument:
  3867. ;*
  3868. ;*         delimeters: null, space, comma
  3869. ;*
  3870. ;*    exit:        de - starting address of parse buffer
  3871. ;*             b - sign bit: set if unbalanced parens, else sign reset
  3872. ;*             bits 6-0: number of chars in the parse    buffer
  3873. ;*             a - actual    delimter char which caused to terminate
  3874. ;*             f - zero flag set if no error
  3875. ;*        quoflg - set equal to ascii quote if at    leeat one quote    found
  3876. ;*
  3877. ;*    error exit:  f - zero flag reset
  3878. ;*
  3879. ;******************************************************************************
  3880.  
  3881. prsr:    xor    a
  3882.     ld    (quoflg),a    ;clear quote flag
  3883.     ld    hl,prsbf    ;start of parser scratch buffer
  3884.     ld    b,prsbfz    ;buffer    size
  3885.     ld    c,b
  3886. prsr10:    ld    (hl),0        ;clear parse buffer to nulls
  3887.     inc    hl
  3888.     djnz    prsr10
  3889.     ld    hl,prsbf    ;start of parse    buffer
  3890.     ld    de,inbf        ;start of input    buffer
  3891.     ld    c,inbfl        ;max size of input buffer
  3892. prsr20:    ld    a,(de)        ;from input buffer
  3893.     ex    de,hl
  3894.     ld    (hl),0        ;erase as we pick from input buffer
  3895.     ex    de,hl
  3896.     dec    c        ;decrement buffer size tally
  3897.     ret    m        ;error -  end of input buffer reached
  3898.     inc    de        ;bump input buffer pointer
  3899.     call    zdlm00        ;check for delimeter
  3900.     jr    z,prsr20    ;delimeter found - continue search
  3901.     ld    (parenf),a
  3902.     ld    c,nprsbf-prsbf    ;parse buffer size
  3903. prsr30:    ld    (hl),a
  3904.     and    a
  3905.     jr    z,prsr60    ;end of    line null always ends parse
  3906.     cp    quote        ;quote?
  3907.     jr    nz,prsr50
  3908.     ld    (quoflg),a
  3909.     ld    a,b        ;quote found - toggle flag
  3910.     xor    80h
  3911.     ld    b,a
  3912. prsr50:    dec    c        ;decrement buffer size tally
  3913.     ret    m        ;error - end of    parse buffer reached
  3914.     ld    a,(de)        ;next char from    input buffer
  3915.     ex    de,hl
  3916.     ld    (hl),0        ;clear as we remove
  3917.     ex    de,hl
  3918.     inc    de
  3919.     inc    b        ;bumping character count tests quote flag
  3920.     call    p,zdlm        ;only look for delimeters if quote flag off
  3921.     inc    hl        ;bump parse buffer pointer
  3922.     jr    nz,prsr30
  3923.     dec    hl
  3924. prsr60:    ld    de,prsbf    ;return    pointing to start of parse buffer
  3925.     ld    (delim),a
  3926.     ret            ;zero flag set - no errors
  3927.  
  3928.  
  3929.  
  3930. asm??l:    ld    a,'L'
  3931.     jr    asm???
  3932. asm??o:    ld    a,'O'
  3933.     jr    asm???
  3934. asm??p:    ld    a,'P'
  3935.     jr    asm???
  3936. asm??s:    ld    a,'S'
  3937.     jr    asm???
  3938. asm??t:    ld    a,'T'
  3939.     jr    asm???
  3940. asm??v:    ld    a,'V'
  3941.  
  3942. asm???:    ld    (asmflg),a
  3943.     call    cret
  3944.     ld    hl,(asmbpc)
  3945.     call    outadr
  3946.     ld    de,m????
  3947.     call    print
  3948.     jp    asm010
  3949.  
  3950.  
  3951. zdlm:    cp    ','
  3952.     ret    z
  3953. zdlm00:    and    a
  3954.     ret    z
  3955.     cp    tab
  3956.     ret    z
  3957.     cp    ' '
  3958.     ret
  3959.  
  3960. oprtor: cp    '+'
  3961.     ret    z
  3962.     cp    '-'
  3963.     ret    z
  3964.     and    a
  3965.     ret
  3966.  
  3967.  
  3968.  
  3969. opnv:    ex    de,hl        ;de - operand value  hl    - operand key storage
  3970.     ld    a,(prsbf)    ;check first byte of parse buffer
  3971.     and    a        ;if null - paren was removed
  3972.     ld    a,c        ;key value to accumulator
  3973.     jr    nz,opnv00    ;nz - no paren
  3974.     or    80h        ;found null - set paren    flag
  3975. opnv00:    ld    (hl),a        ;store key value
  3976.     inc    hl
  3977.     ld    (hl),e        ;lo order operand value
  3978.     inc    hl
  3979.     ld    (hl),d        ;hi order
  3980.     ret                                                
  3981.  
  3982.  
  3983.     page
  3984. ;******************************************************************************
  3985. ;*
  3986. ;*    zlen:  determine the number of bytes in    a z80 instruction
  3987. ;*
  3988. ;*
  3989. ;*    entry point zlen00: used to return instruction length.
  3990. ;*
  3991. ;*                de:     address of instruction
  3992. ;*
  3993. ;*    return:     b:  z - inline    instruction (next pc will be pc    plus length)
  3994. ;*            nz - pc modifying instruction such as call,     jump, or ret
  3995. ;*             (see hl below)
  3996. ;*         c:     number    of bytes in this instruction.
  3997. ;*        de:     preserved
  3998. ;*        hl:     next pc following the execution of the    instruction
  3999. ;*             pointed to by de.
  4000. ;*
  4001. ;******************************************************************************
  4002.  
  4003. zlen00:    ld    a,(de)        ;fetch first byte of op    code
  4004.     cp    0cbh        ;test for shift/bit manipulation instruction
  4005.     ld    bc,02
  4006.     ret    z        ;10-4 this is a    cb and length is always    2
  4007.     cp    0edh        ;test for fast eddie
  4008.     jr    nz,zlen15    ;
  4009.     inc    de        ;fetch byte two    of ed instruction
  4010.     ld    a,(de)
  4011.     dec    de        ;restore pointer
  4012.     ld    hl,z80ed    ;ed four byter table
  4013.     ld    c,z80edl    ;length
  4014.     cpir
  4015.     ld    c,4        ;assume    ed four    byter
  4016.     ret    z        ;correct assumption
  4017.     ld    c,2        ;set length for    return - if not    2 must be 4
  4018.     cp    45h        ;test for retn
  4019.     jr    z,zlen10
  4020.     cp    4dh        ;test for reti
  4021.     ret    nz        ;non-pc    modifying two byte ed
  4022. zlen10:    ld    a,0c9h        ;treat as ordinary return instruction
  4023.     jp    zlen80
  4024. zlen15:    cp    0ddh        ;check for dd and fd index reg instructions
  4025.     jr    z,zlen20
  4026.     cp    0fdh
  4027.     jr    nz,zlen40
  4028. zlen20:    inc    de        ;fetch byte two    of index reg instruction
  4029.     ld    a,(de)
  4030.     dec    de        ;restore pointer
  4031.     cp    0e9h        ;check for reg indirect    jump
  4032.     jr    nz,zlen30    ;
  4033.     inc    b        ;reg indirect jump - set pc modified flag nz
  4034.     ld    a,(de)        ;recheck for ix    or iy
  4035.     ld    hl,(ixreg)    ;assume    ix
  4036.     cp    0ddh
  4037.     ret    z        ;correct assumption
  4038.     ld    hl,(iyreg)
  4039.     ret
  4040. zlen30:    ld    hl,z80fd    ;check for dd or fd two    byter
  4041.     ld    c,z80fdl
  4042.     cpir
  4043.     ld    c,2        ;assume    two
  4044.     ret    z
  4045.     ld    hl,z80f4    ;not two - try four
  4046.     ld    c,z80f4l
  4047.     cpir
  4048.     ld    c,4        ;assume    four
  4049.     ret    z        ;correct assumption
  4050.     dec    c        ;must be three
  4051.     ret
  4052. zlen40:    and    0c7h        ;check for 8 bit immediate load
  4053.     cp    06
  4054.     ld    c,2        ;assume    so
  4055.     ret    z
  4056.     dec    c        ;assume    one byte op code
  4057.     ld    a,(de)
  4058.     cp    3fh
  4059.     jr    c,zlen50    ;opcodes 0 - 3f    require    further    investigation
  4060.     cp    0c0h        ;8 bit reg-reg loads and arithmetics do    not
  4061.     ret    c
  4062. zlen50:    ld    hl,z803        ;check for three byter
  4063.     ld    c,z803l
  4064.     cpir
  4065.     jr    nz,zlen60    ;nz - not three
  4066.     ld    hl,z803s    ;established three byter - test conditional
  4067.     ld    c,z803cl
  4068.     cpir
  4069.     ld    c,3        ;set length
  4070.     ret    nz        ;nz - three byte inline    instruction
  4071.     ld    hl,z803s
  4072.     ld    c,z803sl    ;now weed out jumps from calls
  4073.     cpir
  4074.     ld    c,3
  4075.     ld    b,c        ;set pc    modified flag -    we have    call or    jump
  4076.     ex    de,hl
  4077.     inc    hl
  4078.     ld    e,(hl)
  4079.     inc    hl
  4080.     ld    d,(hl)        ;de - address from instruction
  4081.     ex    de,hl
  4082.     dec    de
  4083.     dec    de        ;restore instruction pointer
  4084.     jr    z,zlen55    ;z - this is a call
  4085.     cp    jp        ;test for unconditional jump
  4086.     jr    nz,zlen85
  4087.     ret
  4088. zlen55:    ld    a,(wflag)    ;test for no subroutine    trace flag
  4089.     and    a        ;zero means no sub tracing
  4090.     ld    b,a        ;clear for return - if sub trace off
  4091.     ret    z        ;subroutine trace off -    return with b reg 00
  4092.                 ;so bp is set at next inline instruction
  4093.     dec    b
  4094.     jr    nz,zlen58
  4095.     ld    a,b
  4096.     or    h
  4097.     ret    z
  4098. zlen58:    ld    a,(de)        ;recover call object byte
  4099.     ld    b,c        ;set nz    - pc modifying instruction
  4100.     cp    0cdh        ;unconditional call??
  4101.     jr    nz,zlen85    ;zlen85    - set secondary    breakpoint if tracing
  4102.     ret
  4103. zlen60:    ld    hl,z802
  4104.     ld    c,z802l        ;test for two byter
  4105.     cpir
  4106.     jr    nz,zlen70    ;not two
  4107.     ld    hl,z802c    ;test for relative jump
  4108.     ld    c,z802cl
  4109.     cpir
  4110.     ld    c,2        ;in any    case length is two
  4111.     ret    nz        ;nz - not relative jump
  4112.     ld    h,b        ;clear
  4113.     inc    b        ;set pc    modified flag nz
  4114.     inc    de        ;fetch relative    displacement
  4115.     ld    a,(de)
  4116.     ld    l,a
  4117.     add    a,a        ;test forward or backward
  4118.     jr    nc,zlen65    ;p - forward
  4119.     dec    h        ;set hl    negative
  4120. zlen65:    add    hl,de        ;compute distance from instruction
  4121.     inc    hl        ;adjust    for built in bias
  4122.     dec    de        ;restore pointer
  4123.     ld    a,(de)        ;fetch first byte of instruction
  4124.     cp    18h        ;uncondtional jump?
  4125.     jr    nz,zlen85    ;conditional - set secondary bp    if tracing
  4126.     ret
  4127. zlen70:    ld    hl,z801        ;check for return instruction
  4128.     ld    c,z801l
  4129.     cpir
  4130.     ld    c,1        ;length    must be    1 in any case
  4131.     ret    nz
  4132.     cp    0e9h        
  4133.     jr    nz,zlen80    ;nz - not  jp (hl)
  4134.     inc    b        ;set pc    modified flag
  4135.     ld    hl,(hlreg)    ;next pc contained in hlreg
  4136.     ret
  4137. zlen80:    ld    hl,(spreg)    ;return    instructions hide next pc in stack
  4138.     ld    b,(hl)
  4139.     inc    hl
  4140.     ld    h,(hl)
  4141.     ld    l,b        ;hl - return address removed from stack
  4142.     ld    b,c        ;set b nz - pc modification flag
  4143.     cp    0c9h
  4144.     ret    z        ;unconditional return
  4145. zlen85:    ld    a,(sbps)    ;count of special step breakpoints
  4146.     and    a        ;test for zero
  4147.     ret    z        ;zero -    monitor    is not tracing
  4148.     ld    a,(bps)        ;fetch number of bps currently in effect
  4149.     ld    b,a        ;pass to set breakpoint    routine    in b reg
  4150.     ex    de,hl        ;de - bp to set
  4151.     call    brk30        ;set conditional breakpoint
  4152.     xor    a
  4153.     or    b
  4154.     ld    b,0
  4155.     ld    de,(pcreg)    ;for setting inline bp - condition not m
  4156.     ret    nz        ;nz - collision    with user bp
  4157.     ld    hl,sbps
  4158.     inc    (hl)        ;bump count of step bps
  4159.     ret
  4160.     page
  4161. ;******************************************************************************
  4162. ;*
  4163. ;*    psw:    display    current    state of flag register
  4164. ;*
  4165. ;*    pswbit:    table of bit masks with    which to test f    reg.
  4166. ;*        two byte entry per bit (sign, zero, carry, parity).
  4167. ;*
  4168. ;*    pswmap - table of offsets into operand name table featuring a
  4169. ;*         two byte entry    for each flag bit.
  4170. ;*         bit 4 (unused by z80) from pswbit entry is on/off flag
  4171. ;*         lo bytes are the off states (p    nz nc po).
  4172. ;*         hi bytes are the on states  (m     z  c pe).
  4173. ;*
  4174. ;*    - current state    of flag    register is displayed
  4175. ;*    - user queried for changes
  4176. ;*    - input    is parsed and tested for valid flag reg    mnemonics
  4177. ;*    - if valid mnemonic found flag bit is set or reset accordingly
  4178. ;*
  4179. ;*    exit:    to z8e for next    command
  4180. ;*
  4181. ;******************************************************************************
  4182.  
  4183. psw:    ld    de,3
  4184. psw00:    ld    hl,pswbit        ;table of bit mask for flags
  4185.     add    hl,de            ;
  4186.     add    hl,de            ;index times two
  4187.     ld    a,e
  4188.     neg                ;now calculate index into pswmap
  4189.     add    a,3
  4190.     add    a,a
  4191.     ld    c,a
  4192.     ld    a,(freg)        ;fetch current flag of user
  4193.     and    0f7h
  4194.     and    (hl)            ;unused    bit in flag - ensure it's off
  4195.     ld    hl,pswmap
  4196.     add    hl,bc            ;pointer to mnemonic is    8 bytes    away
  4197.     jr    z,psw10            ;this is an off    bit (nz    nc p po)
  4198.     inc    hl            ;on
  4199. psw10:    ld    c,(hl)            ;fetch index into operand name table
  4200.     ld    hl,zopnm
  4201.     add    hl,bc            ;two bytes per table entry
  4202.     add    hl,bc
  4203.     ld    c,2            ;print both chars of mnemonic name
  4204.     call    printb
  4205.     call    space
  4206.     dec    e            ;do all    four flag bits
  4207.     jp    p,psw00
  4208.     call    crlf
  4209.     ld    a,(lcmd)
  4210.     cp    'J'
  4211.     ret    z
  4212.     call    space5
  4213. psw50:    call    iedtbc
  4214.     ret    m            ;no input
  4215. psw55:    call    prsr
  4216.     ret    nz            ;parse error - end command
  4217.     ld    bc,116h            ;
  4218.     call    oprn20            ;check validity    of this    token
  4219.     ld    a,c
  4220.     ld    bc,pswcnt        ;number    of flag    reg mnemonics
  4221.     ld    hl,pswmap
  4222.     cpir                ;check table
  4223.     jp    nz,e???            ;error - nmemonic not found
  4224.     ld    hl,pswbit        ;bit mask table
  4225.     add    hl,bc
  4226.     ld    a,(hl)            ;fetch mask
  4227.     ex    de,hl            ;
  4228.     ld    hl,freg            ;de - mask ptr     hl - user flag    ptr
  4229.     and    08            ;bit says turn on or off
  4230.     ld    a,(de)            ;new copy of mask
  4231.     jr    nz,psw60        ;nz - turn on
  4232.     cpl
  4233.     and    (hl)            ;and with current user flag
  4234.     ld    (hl),a            ;return    flag reg with bit now off
  4235.     jr    psw55            ;check for more    input
  4236. psw60:    and    0f7h            ;turn off on/off flag (bit 4)
  4237.     or    (hl)
  4238.     ld    (hl),a            ;now turn on specified bit
  4239.     jr    psw55
  4240.     page
  4241. ;******************************************************************************
  4242. ;*
  4243. ;*    movb:    move memory
  4244. ;*
  4245. ;*    call bcde to fetch destination block address and byte count
  4246. ;*    call prsr
  4247. ;*    check for head to head or tail to tail move
  4248. ;*
  4249. ;*    exit: to z8e for next command
  4250. ;*
  4251. ;******************************************************************************
  4252.  
  4253. movb:    call    bcde        ;bc - byte count  de - destination  hl - source
  4254.     jp    nz,e???        ;input error ends command
  4255.     xor    a
  4256.     sbc    hl,de
  4257.     adc    a,a
  4258.     add    hl,de
  4259.     add    hl,bc
  4260.     dec    hl
  4261.     ex       de,hl        ;de - address of last byte of source block
  4262.     sbc    hl,de
  4263.     adc    a,a
  4264.     add    hl,de        ;hl - original destination address
  4265.     ex    de,hl
  4266.     cp    3
  4267.     jr    nz,movb00    ;head to head
  4268.     ex    de,hl
  4269.     add    hl,bc
  4270.     dec    hl
  4271.     ex    de,hl
  4272.     lddr
  4273.     ret
  4274. movb00:    inc    hl
  4275.     and    a
  4276.     sbc    hl,bc
  4277.     ldir    
  4278.     ret
  4279.     page
  4280. ;******************************************************************************
  4281. ;*
  4282. ;*    yfil:    fill memory
  4283. ;*
  4284. ;*    call bcde to get byte count, starting address, and fill byte
  4285. ;*
  4286. ;*    exit:    to z8e for next    command
  4287. ;*
  4288. ;******************************************************************************
  4289.  
  4290. yfil:    call    bcde        ;bc - byte count  de - fill byte  hl - block
  4291.     jp    nz,e???        ;input error ends command
  4292.     ex    de,hl
  4293. yfil00:    ld    hl,argbf
  4294.     ld    a,(argbc)
  4295. yfil10:    ldi
  4296.     inc    b
  4297.     djnz    yfil20
  4298.     inc    c
  4299.     dec    c
  4300.     ret    z
  4301. yfil20:    dec    a
  4302.     jr    nz,yfil10
  4303.     jr    yfil00
  4304.     page
  4305. ;******************************************************************************
  4306. ;*
  4307. ;*    initialise default fcb fields and command line    (16 may 87  jrs)
  4308. ;*
  4309. ;*    calls iedtbc to get command tail
  4310. ;*          lfcb   twice to extract file names
  4311. ;*
  4312. ;*    exit:    fcb name fields at 5ch and 6ch initialised
  4313. ;*        command tail set up at 80h
  4314. ;*
  4315. ;******************************************************************************
  4316.  
  4317. ifcb:
  4318.     call    iedtbc        ;get command tail
  4319.     dec    hl        ;point at input buffer length
  4320.     push    hl        ;save input buffer pointer
  4321.     ld    hl,fcb5c    ;zero out the default fcb
  4322.     ld    d,h
  4323.     ld    e,l
  4324.     inc    de
  4325.     push    de
  4326.     xor    a
  4327.     ld    (hl),a
  4328.     ld    bc,31
  4329.     ldir
  4330.     pop    hl        ;recover pointer to file name in default fcb
  4331.     call    iblank        ;blank out the name part
  4332.     pop    hl        ;get input buffer pointer
  4333.     ld    de,80h        ;destination is command line buffer
  4334.     ld    b,(hl)        ;get input buffer length
  4335.     ld    a,b        ;load length ready to put in command buffer
  4336.     inc    b        ;account for the length byte itself
  4337. ifcb02:
  4338.     ld    (de),a        ;store character in command buffer
  4339.     inc    de        ;increment pointers
  4340.     inc    hl
  4341.     ld    a,(hl)        ;load character from input buffer
  4342.     call    ixlt        ;translate to upper case
  4343.     djnz    ifcb02        ;loop until all copied
  4344.     xor    a        ;terminate the command buffer properly
  4345.     ld    (de),a
  4346.     call    lfcb        ;get a file name (if any)
  4347.     jr    nz,ifcb12    ;skip if error
  4348.     ld    de,fcb5c    ;copy fcb to default fcb at 5ch
  4349.     ld    hl,fcb
  4350.     ld    bc,12        ;(only move 12 bytes)
  4351.     ldir
  4352. ifcb12:
  4353.     call    lfcb        ;do second file name (if any)
  4354.     ret    nz        ;exit now if error
  4355.     ld    hl,fcb        ;copy file name part of fcb to
  4356.     ld    de,fcb5c+16    ; second segment of default fcb
  4357.     ld    bc,12
  4358.     ldir
  4359.     ret
  4360.  
  4361. iblank:                ;blank out 11 bytes at hl
  4362.     ld    d,h
  4363.     ld    e,l
  4364.     inc    de
  4365.     ld    (hl),' '
  4366.     ld    bc,10
  4367.     ldir
  4368.     ret
  4369.  
  4370. iwild:                ;expand asterisks in file names
  4371.     ld    bc,8
  4372.     call    iexp
  4373.     ld    bc,3
  4374. ;    call    iexp
  4375. ;    ret
  4376. iexp:
  4377.     ld    a,'*'
  4378.     cpir
  4379.     ret    nz
  4380.     inc    bc
  4381.     dec    hl
  4382. iexp10:
  4383.     ld    (hl),'?'
  4384.     inc    hl
  4385.     dec    c
  4386.     ret    z
  4387.     jr    iexp10
  4388.     page
  4389. ;******************************************************************************
  4390. ;*
  4391. ;*    lldr:    load file
  4392. ;*    user may supply    optional load bias if file name ends with comma
  4393. ;*
  4394. ;*    lfcb: parse input buffer (inbf)    and init fcb
  4395. ;*
  4396. ;*        return:    z  - fcb initialized
  4397. ;*            nz - syntax error
  4398. ;*
  4399. ;*    lopn: attempt to open file
  4400. ;*
  4401. ;*        return:    nz - file opened
  4402. ;*             z - file not found
  4403. ;*
  4404. ;*    lmem: test if sufficient memory    available for loading
  4405. ;*
  4406. ;*        return:    nc - out of memory
  4407. ;*
  4408. ;*    lbin: loader
  4409. ;*
  4410. ;*        eof found:     end command
  4411. ;*        out of memory: query user whether to continue
  4412. ;*
  4413. ;******************************************************************************
  4414.  
  4415. lldr:    call    iedtbc        ;get file name
  4416.     jp     p,lldr00         ;p - have input in inbf
  4417.     ld    hl,(loadn)
  4418.     ld    a,l
  4419.     or    h
  4420.     jp    z,e???
  4421.     ld    c,a
  4422.     jp    lbin22
  4423. lldr00:    call    crlf
  4424.     call    lfcb        ;init fcb with name and    drive
  4425.     jp    nz,esntx    ;nz - syntax error
  4426.     ld    de,mldg        ;display loading string
  4427.     call    nprint
  4428.     ld    de,prsbf    ;
  4429.     ld    a,(de)        ;a - first char    of file    name
  4430.     ld    b,a
  4431.     call    print
  4432.     ld    a,','        ;
  4433.     cp    c        ;c - terminator    following file name (from lfcb)
  4434.     ld    hl,100h        ;assume    no bias
  4435.     jr    nz,lldr05    ;nz - no comma means no    load bias
  4436.     call    iarg        ;check for load    bias
  4437.     jp    nz,esntx    ;error - bad argument
  4438.     call    imem        ;check available memory
  4439.     jp    nc,emem??    ;out of    memory
  4440. lldr05:    ld    (loadb),hl    ;save load bias
  4441.     ld    a,'.'        ;test if file name is period
  4442.     sub    b
  4443.     jr    z,lbin        ;file name is period - no open needed
  4444. lldr10:    call    lopn        ;attempt to open file -    entry from nint
  4445.     jp    z,efilnf    ;z - file not found
  4446.  
  4447.  
  4448. lbin:
  4449.     ld    hl,(loadb)    ;fetch starting    load address
  4450. lbin00:    push    hl
  4451.     ex    de,hl
  4452.     ld    c,26        ;set cp/m dma address
  4453.     call    bdos        ;
  4454.     ld    de,fcb
  4455.     ld    c,20        ;cp/m sequential file read
  4456.     call    bdos
  4457.     pop    de        ;recover dma address
  4458.     ld    hl,80h
  4459.     add    hl,de        ;compute next dma address
  4460.     ld    (cflag),a    ;save eof indicator as continuation flag
  4461.     ld    c,a
  4462.     and    a
  4463.     jr    nz,lbin20    ;nz - end of file
  4464.     call    imem        ;test if memory    availtable to load next sector
  4465.     jr    c,lbin00    ;c - not out of    memory
  4466. lbin20:    ex    de,hl
  4467.     dec    hl
  4468.     ld      (loadn),hl    ;end of load address
  4469. lbin22: ld    de,mlodm    ;print loaded message
  4470.     call    nprint
  4471.     ex    de,hl        ;de - ending address of    load
  4472.     ld    hl,(loadb)    ;
  4473.     call    outadr        ;display starting address of load
  4474.     ex    de,hl
  4475.     call    outadr        ;display ending    address
  4476.     and    a
  4477.     sbc    hl,de
  4478.     inc    h
  4479.     ld    de,mlodpg
  4480.     call    nprint        ;display pages string
  4481.     ld    l,a        ;zero l    reg
  4482.     ld    a,h        ;hi byte of ending address is number of    pages
  4483.     cp    100
  4484.     jr    c,lbin30    ;less than 100
  4485.     ld    l,'2'
  4486.     sub    200
  4487.     jr    nc,lbin25    ;greater than 200
  4488.     dec    l        ;change    to ascii 1
  4489.     add    a,100        ;restore actual    page count less    100
  4490. lbin25:    ld    h,a        ;save page count
  4491.     ld    a,l
  4492.     call    ttyo
  4493. lbin30:    ld    d,2fh
  4494.     ld    a,h
  4495. lbin35:    inc    d        ;tens and units    decimal    conversion loop
  4496.     sub    10
  4497.     jr    nc,lbin35
  4498.     add    a,10        ;restore remainder
  4499.     ld    e,a        ;temp save while we print tens
  4500.     ld    a,d
  4501.     inc    l
  4502.     dec    l        ;test l    reg
  4503.     jr    nz,lbin40    ;nz - ascii 1 or 2 in l
  4504.     cp    '0'        ;suppress leading zero - less than 10 pages
  4505. lbin40:    call    nz,ttyo        ;print tens digit
  4506.     ld    a,e
  4507.     or    '0'
  4508.     call    ttyo        ;print units
  4509.     call    crlf
  4510.     xor    a        ;test eof flag
  4511.     or    c
  4512.     jp    nz,z8e        ;nz - true eof means file loading complete
  4513.     ld    de,mmem??    ;print out of memory message
  4514.     call    print
  4515.     ld    de,mcntu
  4516.     call    print        ;print continue? prompt
  4517.     call    inchar
  4518.     call    ixlt        ;make sure its upper case
  4519.     cp    'Y'
  4520.     call    crlf
  4521.     jp    z,lbin        ;user wants more loading
  4522.     jp    z8e        ;next command
  4523.  
  4524.  
  4525. lfcb:    call    prsr        ;parse input buffer to extract file name
  4526.     ld    d,a        ;save char which terminated file name
  4527.     ld    a,14
  4528.     cp    b        ;over 14 chars is ng file name
  4529.     ret    c
  4530.     ld    c,b        ;b and c - byte    count of file name
  4531.     djnz    lfcb00        ;test for only one char    in name
  4532.     ld    a,(prsbf)    ;only one - is it period?
  4533.     sub    '.'
  4534.     jr    nz,lfcb00
  4535.     ld    c,d        ;return    terminator
  4536.     ld    a,(cflag)    ;continuation allowed?
  4537.     and    a        ;let lldr decide
  4538.     ret
  4539. lfcb00:    ld    b,0
  4540.     ld    a,':'        ;check for drive specifier in input
  4541.     cpdr
  4542.     ld    b,c        ;b - number of chars preceding colon
  4543.     ld    c,d        ;return    terminator in c
  4544.     ld    de,fcb
  4545.     ld    a,0
  4546.     jr    nz,lfcb10    ;nz - no colon
  4547.     dec    b
  4548.     ret    nz        ;syntax    error -    more than one char
  4549.     ld    a,(hl)        ;fetch drive specifier
  4550.     call    ixlt
  4551.     ld    (hl),a        ;back to parse buffer as upper case    
  4552.     sub    40h        ;make name into    number
  4553.     inc    hl
  4554. lfcb10:                
  4555.            ld    (de),a        ;store drive number in fcb
  4556.     ld    a,' '
  4557.     ld    b,11        ;clear file name in fcb    to spaces
  4558. lfcb20:    inc    de
  4559.     ld    (de),a
  4560.     djnz    lfcb20
  4561.     ld    b,8        ;max chars allowed in file name
  4562.     ld    de,fcbnam
  4563. lfcb30:    call    lfcb90
  4564.     ret    m        ;error - too many chars    in file    name
  4565.     ld    b,3        ;max chars allowed in file type
  4566.     ld    de,fcbtyp
  4567.     and    a
  4568.     ret    z        ;z - no    file type after    all
  4569.  
  4570.  
  4571.  
  4572. lfcb90:    inc    hl        ;bump buffer pointer
  4573.     ld    a,(hl)
  4574.     and    a        ;test for eof null
  4575.     ret    z        ;null found - read file
  4576.     call    ixlt
  4577.     ld    (hl),a        ;translate parse buffer    to upper case
  4578.     cp    '.'
  4579.     ret    z        ;period    found -    move file type into fcb
  4580.     dec    b        ;dec max chars allowed
  4581.     ret    m        ;error
  4582.     ld    (de),a        ;upper case only into fcb
  4583.     inc    de
  4584.     jr    lfcb90
  4585.  
  4586.  
  4587. lopn:
  4588.     ld    hl,fcbnam    ;test for file name present
  4589.     ld    a,(hl)
  4590.     cp    ' '
  4591.     ret    z        ;space found means not file
  4592. ;;    dec    hl
  4593. ;;    ld    a,(hl)        ;drive specifier
  4594. ;;    and    a        ;test for default drive
  4595. ;    jr    z,lopn00    ;z - default means no selection    required
  4596. ;    dec    a        ;select    drive
  4597. ;    ld    e,a
  4598. ;    ld    c,14
  4599. ;    call    bdos
  4600. lopn00:    ld    de,fcb
  4601.     ld    b,nfcb-fcbext
  4602.     ld    hl,fcbext    ;clear remainder of fcb
  4603. lopn10:    ld    (hl),0
  4604.     inc    hl
  4605.     djnz    lopn10
  4606.     ld    c,15
  4607.     call    bdos        ;tell bdos to open file
  4608.     inc    a        ;test open return code
  4609.     ret            ;nz - open ok
  4610.  
  4611. imem:    ex    de,hl        ;de - next load    address
  4612.     ld    a,d
  4613.     ld    hl,07        ;ptr to    prt to start of    z8e
  4614.     cp    (hl)
  4615.     ex    de,hl
  4616.     ret    c        ;c - not out of memory
  4617.     ex    de,hl
  4618.     ret            ;de - last address loaded plus one
  4619.  
  4620. esntx:    ld    de,msntx    ;print syntax error
  4621.     jr    eprint
  4622.  
  4623. emem??:    ld    de,mmem??    ;print out of memory
  4624.     call    nprint
  4625.     jr    eprint
  4626.  
  4627. efilnf:    ld    de,mfilnf    ;print file not    found
  4628.  
  4629. eprint:    call    nprint
  4630.     jp    z8e
  4631.     page
  4632. ;*****************************************************************************
  4633. ;*
  4634. ;*            write memory segment to disk command
  4635. ;*
  4636. ;*****************************************************************************
  4637.  
  4638. writ:    call    iedtbc        ;fetch line of input
  4639.     ret    m        ;no input - 
  4640.     call    bldf        ;build fcb with first arg in buffer
  4641.     jr    nz,esntx    ;oops - syntax error
  4642.     ld    a,(delim)    ;check char that terminated file name
  4643.     and    a
  4644.     jr    nz,writ10    ;nz - not null means user entered addresses
  4645.  
  4646.     ld    de,(loadb)    ;use default begin and end address of the last
  4647.     ld    hl,(loadn)    ;file loaded
  4648.     jr    writ30
  4649. writ10:    call    iarg        ;get address
  4650.     jp    nz,e???        ;invalid address
  4651.     ex    de,hl
  4652.     cp    ' '        ;space terminator
  4653.     jp    nz,e???        ;anything but is error
  4654. writ20:    call    iarg        ;get end address 
  4655.     jp    nz,e???
  4656. writ30:    ld    (endw),hl    ;save address of where to end writing
  4657.     ex    de,hl
  4658.     ld    c,3
  4659.     call    spaces
  4660.     call    outadr        
  4661.     ex    de,hl
  4662.     ld    c,6
  4663.     call    spaces
  4664. writ40:    call    bwrite
  4665.     ld    hl,127
  4666.     add    hl,de
  4667.     ld    b,6
  4668. writ50:    call    bksp
  4669.     djnz    writ50
  4670.     call    outadr
  4671.     inc    hl
  4672.     ex    de,hl
  4673.     ld    hl,(endw)
  4674.     sbc    hl,de
  4675.     jr    nc,writ40
  4676.     jp    closef
  4677.     
  4678.     
  4679.  
  4680. ;******************************************************************************
  4681. ;*
  4682. ;*    find:    locate string in memory
  4683. ;*
  4684. ;*        call iarg - get    starting address of seach
  4685. ;*
  4686. ;*        call in00 - get    match data concatenating multiple arguments
  4687. ;*                into a single string
  4688. ;*
  4689. ;*        addresses at which matches found displayed 8 per line.
  4690. ;*        search continues until end of memory reached
  4691. ;*        user may cancel    search at any time by hitting any key.
  4692. ;*
  4693. ;*        exit: to z8e for next command
  4694. ;*
  4695. ;******************************************************************************
  4696.  
  4697. find:    call    iedtbc
  4698.     ret    m        ;m - no    input
  4699.     call    iarg        ;extract starting address of search
  4700.     jp    nz,e???        ;error
  4701.     ex    de,hl        ;save starting address of search in de
  4702. find00:    call    in00        ;extract search    string concatenating multiple
  4703.                 ;arguments
  4704.     jp    nz,e???        ;error - output    command    prompt
  4705.     xor    a
  4706.     ld    (lines),a    ;clear crlf flag
  4707.     ex    de,hl        ;starting address of search - hl
  4708.     ld    de,argbf    ;argument stored here
  4709.     
  4710.     ld    bc,(fndsym)
  4711.     ld    a,c
  4712.     or    b        ;symbol found?
  4713.     jp    z,find40    ;no
  4714.     
  4715.     ex    de,hl        ;hl - argument buffer
  4716.     ld    b,(hl)        ;reverse order of the two bytes for symbols
  4717.     inc    hl
  4718.     ld    a,(hl)
  4719.     ld    (hl),b
  4720.     dec    hl
  4721.     ld    (hl),a
  4722.     ex    de,hl
  4723.     
  4724. find40:    ld    bc,(argbc)    ;number    of bytes to look for
  4725.     call    crlf
  4726. find50:    call    srch        ;do the    search
  4727.     jr    nz,find60    ;not found
  4728.     call    outadr        ;display address where match found
  4729.     ld    a,(lines)
  4730.     dec    a        ;carriage return after 8 addresses displayed
  4731.     ld    (lines),a
  4732.     and    7
  4733.     call    z,crlf
  4734.     call    ttyq        ;user requesting abort?
  4735.     cp    cr
  4736.     ret    z        ;abort - return    to z8e
  4737. find60:    inc    hl        ;point to next address at which    to start search
  4738.     add    hl,bc        ;ensure    we won't hit end of memory by adding
  4739.                 ;in string size
  4740.     ret    c        ;impending end of memory
  4741.     sbc    hl,bc        ;restore pointer
  4742.     jr    find50
  4743.  
  4744. srch:    push    bc
  4745.     push    de
  4746.     push    hl
  4747. srch00:    ld    a,(de)
  4748.     cpi
  4749.     jp    nz,srch10    ;no match
  4750.     inc    de
  4751.     jp    pe,srch00    ;tally not expired - check next
  4752. srch10:    pop    hl
  4753.     pop    de
  4754.     pop    bc
  4755.     ret
  4756.  
  4757.  
  4758.     page
  4759. ;******************************************************************************
  4760. ;*
  4761. ;*    verify:    verify two blocks of data are identical
  4762. ;*
  4763. ;*        enter: de - starting address of    block 1
  4764. ;*
  4765. ;*        call bcde to get address of block 2 and    byte count
  4766. ;*
  4767. ;*        mismatch:   block 1 address and    byte are displayed
  4768. ;*                block 2 address and    byte are displayed
  4769. ;*                console intrrogated    - any input terminates verify
  4770. ;*
  4771. ;*        exit:    to z8e for next    command
  4772. ;*
  4773. ;******************************************************************************
  4774.  
  4775. verify:    call    bcde        ;get block 2 address and byte count
  4776.     jp    nz,e???
  4777.     ex    de,hl
  4778. verf00:    ld    a,(de)        ;byte from block 1
  4779.     xor    (hl)        ;versus    byte from block    two
  4780.     jr    z,verf10    ;match - no display
  4781.     call    newlin
  4782.     ld    a,(de)
  4783.     call    othxsp        ;display block 1 data
  4784.     call    space
  4785.     call    outadr        ;display block two address
  4786.     ld    a,(hl)
  4787.     call    outhex        ;display results of xor
  4788.     call    ttyq        ;check input status
  4789.     cp    cr
  4790.     ret    z
  4791. verf10:    inc    hl        ;bump block 1 pointer
  4792.     inc    de        ;bump block 2 pointer
  4793.     dec    bc        ;dec byte count
  4794.     ld    a,b
  4795.     or    c
  4796.     jr    nz,verf00
  4797.     ret
  4798.     page
  4799. ;******************************************************************************
  4800. ;*
  4801. ;*    xreg:    display    machine    state
  4802. ;*
  4803. ;*        regptr:    table contains offsets to names    in operand name    table.
  4804. ;*            sign bit set indicates prime register.
  4805. ;*
  4806. ;*        regmap:    table contains offsets to reg contents table (regcon)
  4807. ;*            sign bit ignored (used by rgst command).
  4808. ;*
  4809. ;*        regcon:    table of register contents.
  4810. ;*
  4811. ;*        exit:    make current pc    current    disassembly location counter.
  4812. ;*            set bit    6 of disassembly flag byte (zasmfb)
  4813. ;*            jump to    zasm30 to disassemble current instruction.
  4814. ;*
  4815. ;******************************************************************************
  4816.  
  4817. xreg:    call    cret
  4818.     ld    bc,0        ;init reg index
  4819. xreg00:    call    xreg05        ;display reg name and contents
  4820.     inc    c
  4821.     ld    a,c
  4822.     cp    8
  4823.     call    z,crlf
  4824.     ld    a,c
  4825.     cp    0ch
  4826.     ld    b,0
  4827.     jr    nz,xreg00
  4828.     ld    a,(lcmd)
  4829.     cp    'J'        ;animated command in effect?
  4830.     ret    z        ;z - no disassembly required
  4831.     ld    hl,(pcreg)
  4832.     ld    (zasmpc),hl
  4833.     jp    zasm30
  4834.  
  4835. xreg05:    ld    hl,regptr        ;map of    reg name pointers
  4836.     ld    d,b
  4837.     add    hl,bc
  4838.     ld    a,(hl)            ;extract pointer
  4839.     and    7fh            ;strip sign for    name indexing
  4840.     ld    e,a
  4841.     ld    b,(hl)            ;save copy of offset - need sign later
  4842.     ld    hl,zopnm        ;register name table
  4843.     add    hl,de
  4844.     add    hl,de            ;two bytes per entry
  4845.     ld    a,(hl)
  4846.     call    ttyo            ;display character one
  4847.     inc    hl
  4848.     ld    a,(hl)
  4849.     cp    ' '            ;is second character a space?
  4850.     jr    nz,xreg10
  4851.     ld    a,'C'            ;replace space - this is pc
  4852. xreg10:    call    ttyo            ;display second    character
  4853.     xor    a
  4854.     or    b            ;now test sign
  4855.     jp    p,xreg20        ;sign not set -    not prime reg
  4856.     ld    a,27h            ;display quote
  4857.     call    ttyo
  4858. xreg20:    ld    a,':'
  4859.     call    ttyo
  4860.     ld    hl,regmap        ;map of    pointers to reg    contents
  4861.     add    hl,de
  4862.     ld    a,(hl)
  4863.     jp    p,xreg30        ;p - not prime reg
  4864.     add    a,8            ;prime contents    8 bytes    past non-prime
  4865. xreg30:    and    7fh            ;ignore    sign
  4866.     ld    e,a
  4867.     ld    hl,regcon        ;start of register contents storage
  4868.     add    hl,de
  4869.     ld    d,(hl)            ;hi order contents
  4870.     dec    hl
  4871.     ld    e,(hl)
  4872.     ex    de,hl
  4873.     call    outadr            ;display contents
  4874.     ret
  4875.  
  4876.     page
  4877. ;******************************************************************************
  4878. ;*
  4879. ;*    zasm
  4880. ;*
  4881. ;*    the disassembler is divided into two routines:
  4882. ;*
  4883. ;*    zasm - computes    the instruction    key value and finds the    opcode nmemonic
  4884. ;*    opn  - uses the    key value to determine the number of operands and
  4885. ;*           displays    the operands.
  4886. ;*
  4887. ;*    entered: de - starting address to disassemble
  4888. ;*
  4889. ;*        zasm maps the 695 z80 instrucions into 256 key values. 
  4890. ;*              the instruction key value becomes the index into the
  4891. ;*              opcode name pointer table (zopcnm), the first operand table
  4892. ;*        (zopnd1), and the second operand table (zopnd2).
  4893. ;*
  4894. ;*        disassembly is done in user specified block sizes if the
  4895. ;*        disassembly count evaluates to a number    between    1 and 255. if
  4896. ;*        the count is greater than 255 the block    is disassembled    and the
  4897. ;*        the command terminates.
  4898. ;*
  4899. ;*
  4900. ;*        zasm15 - start of the disassembly loop
  4901. ;*        zasmpc - address of the    instruction being disassembled
  4902. ;*        zasmfb - disassembly flag byte
  4903. ;*        zmflag - flag indicating directive processing (defb and    defw)
  4904. ;*
  4905. ;*                bit    6 - xreg calling
  4906. ;*                bit    5 - asmblr calling
  4907. ;*                bit    0 - write to disk flag
  4908. ;*
  4909. ;*
  4910. ;*
  4911. ;******************************************************************************
  4912.  
  4913.  
  4914. zasm:
  4915.     call    iedtbc
  4916.     ret    m
  4917.     call    iarg
  4918.     jp    nz,e???
  4919.     ex    de,hl
  4920.     call    iarg        ;read in block size
  4921.     ld    b,a        ;save delimeter
  4922.     jr    z,zasm00
  4923.     ld    hl,1        ;change    zero count to one
  4924. zasm00:    xor    a
  4925.     or    h
  4926.     jr    z,zasm05
  4927.     sbc    hl,de
  4928.     jp    c,e???        ;error - start address greater than end
  4929.     add    hl,de
  4930. zasm05:    ld    (zasmct),hl    ;save as permanent block count
  4931.     ld    (zasmwt),hl    ;save as working tally
  4932.     ex    de,hl        ;hl - current instruction pointer
  4933.     ld    (zasmpc),hl
  4934.     call    crlf
  4935.     ld    a,b        ;check command line delimeter
  4936.     ld    (dwrite),a    ;save as write to disk flag:
  4937.                 ;z - no write   nz - write
  4938.     and    a
  4939.     call    nz,bldf        ;not end of line - build fcb
  4940.     jp    nz,esntx
  4941.  
  4942. zasm08:    ld    de,zasmbf    ;start of disassembly buffer
  4943.  
  4944. zasm10:    ld    (zasmio),de    ;init pointer
  4945.  
  4946. zasm15:    ld    de,(zasmpc)    ;fetch address to disassemble
  4947.     call    zlen00        ;calculate length
  4948.     ex    de,hl
  4949.  
  4950.                 ;loop back here for interactive disassembly -
  4951.                 ;user requests format change. c reg:
  4952.                 ;     6 and 7 off: disassemble as code
  4953.                 ;     6       on:  hex defb
  4954.                 ;     7       on:  hex defw or ascii defb
  4955.  
  4956. zasm18:    call    outadr        ;display instruction address
  4957.     ld    de,zmflag
  4958.     ld    a,c        ;save instruction length and format bits 
  4959.     ld    (de),a
  4960.     and    3fh
  4961.     ld    b,a        ;b  - length
  4962.     ld    c,a        ;c  - ditto
  4963. zasm20:    ld    a,(hl)
  4964.     call    othxsp        ;display object    code
  4965.     inc    hl
  4966.     djnz    zasm20
  4967.     ld    a,c        ;number    of object bytes
  4968.     dec    a
  4969.     xor    3
  4970.     ld    b,a        ;calculate space padding
  4971.     add    a,a
  4972.     add    a,b
  4973.     add    a,2
  4974.     ld    b,a
  4975. zasm25:    call    space
  4976.     djnz    zasm25
  4977.     ld    (zasmnx),hl    ;store address of next instruction
  4978.     and    a        ;clear carry
  4979.     sbc    hl,bc        ;point to first    byte in    instruction
  4980. zasm30:    ex    de,hl        ;de - current instruction pointer
  4981.     ld    hl,(zasmio)    ;buffer    address    storage
  4982.     ld    a,(maxlin)
  4983.     ld    b,a        ;line length based on max symbol size
  4984. zasm35:    ld    (hl),' '    ;space out buffer
  4985.     inc    hl
  4986.     djnz    zasm35
  4987.     ld    a,b
  4988.     ld    (opnflg),a
  4989.     ld    (hl),cr        ;append    crlf
  4990.     inc    hl
  4991.     ld    (hl),lf
  4992.     call    fadr        ;find address match
  4993.     ld    hl,(zasmio)
  4994.     jr    nz,zasm40    ;nz - no table or not found
  4995.     call    xsym
  4996.     ld    (hl),':'
  4997.     ld    de,(zasmpc)
  4998. zasm40:    ld    hl,zmflag    ;check interactive disassembly flag
  4999.     ld    a,(hl)        ;sign bit tells all
  5000.     and    a
  5001.     jp    p,zasm42    ;bit off - not interactive
  5002.     ld    b,6dh        ;test for defb
  5003.     sub    82h
  5004.     jr    z,zasm90
  5005.     xor    a        ;must be defw
  5006.     dec    b
  5007.     jr    zasm90
  5008. zasm42:    ld    a,(de)        ;first byte of op code
  5009.     ld    hl,op1000    ;table of z80 specific opcodes
  5010.     ld    c,4
  5011. zasm45:    cpir            ;check for fd dd ed or cb
  5012.     jr    z,zasm55    ;z - found
  5013. zasm50:    cp    40h
  5014.     jr    c,zasm90    ;opcode    range 0    - 3f
  5015.     ld    b,0e0h        ;
  5016.     cp    0c0h        ;
  5017.     jr    nc,zasm90    ;opcode    range c0 - ff
  5018.     cp    80h
  5019.     jr    nc,zasm85    ;opcode    range 80 - bf
  5020.     ld    b,0f8h        ;
  5021.     cp    76h        ;test for halt instruction
  5022.     jr    nz,zasm85    ;opcode    range 40 - 7f
  5023.     ld    a,0ffh        ;set halt instruction key value    to 0f7h
  5024.     jr    zasm90
  5025. zasm55:    inc    de
  5026.     ld    a,(de)        ;byte two of multi-byte    instruction
  5027.     dec    c        ;test for ed instruction
  5028.     jr    nz,zasm65    ;nz - not an ed
  5029.     cp    80h
  5030.     jr    nc,zasm60    ;opcode    range ed 40 - ed 7f
  5031.     cp    40h
  5032.     jr    nc,zasm90    ;legal
  5033.     ld    a,09fh
  5034.     jr    zasm90        ;map to    question marks
  5035. zasm60:    ld    b,0e0h        ;set bias
  5036.     cp    0c0h        ;test for illegal ed
  5037.     jr    c,zasm90    ;legal
  5038.     ld    a,0bfh        ;map to    question marks
  5039.     jr    zasm90        ;opcode    range ed a0 - ed bb
  5040.  
  5041.  
  5042. zasm65:    inc    c
  5043.     jr    z,zasm80    ;z - cb    instruction
  5044.     cp    0cbh        ;fd or dd - check for cb in byte two
  5045.     jr    nz,zasm70
  5046.     inc    de        ;fetch last byte of fdcb or ddcb
  5047.     inc    de
  5048.     ld    a,(de)
  5049.     rrca
  5050.     jr    c,zasm75
  5051.     and    3
  5052.     cp    3
  5053.     jr    nz,zasm75    ;error
  5054.     ld    a,(de)
  5055.     jr    zasm80
  5056. zasm70:    ld    a,(zmflag)
  5057.     sub    3
  5058.     ld    a,(de)
  5059.     jr    nz,zasm50
  5060.     ld    hl,z80f3
  5061.     ld    c,z80f3l
  5062.     cpir
  5063.     jr    z,zasm50
  5064. zasm75:    ld    a,09fh
  5065.     jr    zasm90
  5066. zasm80:    cp    40h        ;test type of cb instruction
  5067.     ld    b,0e8h
  5068.     jr    c,zasm85    ;opcode    range cb 00 - cb 3f (shift)
  5069.     rlca
  5070.     rlca
  5071.     and    03        ;hi order bits become index
  5072.     ld    b,0f0h
  5073.     jr    zasm90        ;opcode    range cb 40 - cb ff
  5074. zasm85:    rrca
  5075.     rrca
  5076.     rrca            ;bits 3-5 of cb    shift yield key
  5077.     and    07h
  5078. zasm90:    add    a,b        ;add in    bias from b reg
  5079.     ld    c,a        ;c - instruction key value
  5080.     xor    a
  5081.     ld    b,a
  5082.     ld    hl,zopcpt    ;opcode    name pointer table
  5083.     add    hl,bc        ;index into table
  5084.     ld    l,(hl)        ;fetch opname index
  5085.     ld    h,a
  5086.     add    hl,hl
  5087.     add    hl,hl        ;index times four
  5088.     ld    de,zopcnm    ;op code name table
  5089.     add    hl,de
  5090.     ex    de,hl        ;de - pointer to opcode    name
  5091.     ld    hl,(zasmio)    ;buffer    pointer    storage
  5092.     ld    a,c
  5093.     ld    (zasmkv),a    ;opcode key value 
  5094.     ld    a,(maxlen)
  5095.     ld    c,a
  5096.     inc    c        ;set label length based on max size
  5097.     
  5098.     ld    a,(lcmd)    ;if xreg use compressed output format
  5099.     cp    'X'
  5100.     jr    z,zasm92
  5101.     cp    'S'        ;step needs compressed format
  5102. zasm92:    add    hl,bc
  5103.     ld    c,4
  5104.     ex    de,hl        ;de - buffer   hl - opcode name    pointer
  5105.     ldir
  5106.     inc    bc        ;one space after opcode    for compressed format
  5107.     jr    z,zasm95
  5108.     ld    c,4        ;four spaces for true disassembly
  5109. zasm95:    ex    de,hl        ;hl - buffer pointer
  5110.     add    hl,bc        ;start of operand field    in buffer
  5111.     ld    a,(zasmkv)    ;save the instruction key value
  5112.     cp    09fh
  5113.     jr    nz,zasm99
  5114.     ld    de,(zasmpc)
  5115.     ld    a,(zmflag)
  5116.     ld    b,a
  5117. zasm97:    ld    a,(de)
  5118.     ld    c,d
  5119.     call    zhex
  5120.     dec    b
  5121.     jp    z,opn020
  5122.     ld    (hl),','
  5123.     inc    hl
  5124.     ld    d,c
  5125.     inc    de
  5126.     jr    zasm97
  5127. zasm99:    ld    de,zopnd1    ;table of first    operands
  5128.     add    a,e
  5129.     ld    e,a        ;instant offset
  5130.     ld    a,d
  5131.     adc    a,b
  5132.     ld    d,a
  5133.     ld    a,(de)
  5134.     inc    a
  5135.     jr    z,opn040    ;no operands
  5136.  
  5137.     page
  5138. ;******************************************************************************
  5139. ;*
  5140. ;*                          - operand processing -
  5141. ;*
  5142. ;*    enter:    b - zero (process first    operand)
  5143. ;*        c - instruction    key value
  5144. ;*
  5145. ;*   instruction key value is used to fetch operand key value:
  5146. ;*
  5147. ;*    operand    key value is in    the range 0 - 1fh
  5148. ;*    operand key value interpretted as follows:
  5149. ;*
  5150. ;*      0 - 17h  use as index to fetch literal from operand
  5151. ;*         name table (sign bit set - parens required)
  5152. ;*
  5153. ;*     18 - 1fh  operand requires processing - use as index
  5154. ;*             into oprerand jump table which is located
  5155. ;*             immediately after name table
  5156. ;*
  5157. ;*       0ffh  no operand
  5158. ;*
  5159. ;*   operand key value jump table routines: (buffer address in de)
  5160. ;*
  5161. ;*
  5162. ;*   entry point   key         action
  5163. ;*
  5164. ;*     opn100       18h     relative jump
  5165. ;*     opn200       19h     convert 8 bit operand to hex
  5166. ;*     opn300       1ah     convert 16 bit    operand    to hex
  5167. ;*     opn400       1ch     register specified in instruction
  5168. ;*     opn600       1dh     hl/ix/iy instruction
  5169. ;*     opn700       1eh     mask rst operand from bit 3-5 of rst instruction
  5170. ;*     opn800       1fh     bit number is specified in bits 3-5 of    op code
  5171. ;*
  5172. ;*    exit: to zasm15 to continue block disassembly
  5173. ;*
  5174. ;******************************************************************************
  5175.  
  5176. opn:    dec    a        ;save operand key value
  5177.     jp    p,opn010
  5178.     ld    (hl),'('
  5179.     inc    hl
  5180. opn010:    ex    de,hl        ;de - buffer address
  5181.     ld    b,a
  5182.     add    a,a        ;operand key value times two
  5183. opn012:    ld    hl,zopnm    ;base of operand name/jump table
  5184.     add    a,l        ;index into table
  5185.     ld    l,a
  5186.     jr    nc,opn014
  5187.     inc    h        ;account for carry
  5188. opn014:    ld    a,1fh
  5189.     and    b
  5190.     cp    zopnml        ;test if processing required
  5191.     jr    c,opn015    ;c - operand is    a fixed    literal
  5192.     ld    a,(hl)        ;fetch processing routine address
  5193.     inc    hl
  5194.     ld    h,(hl)        ;
  5195.     ld    l,a        ;hl - operand processing routine
  5196.     jp    (hl)        ;geronimoooooooo
  5197. opn015:    ldi            ;first byte of operand literal
  5198.     inc    bc        ;compensate for    ldi
  5199.     ex    de,hl        ;hl - buffer
  5200.     ld    a,(de)
  5201.     cp    ' '        ;test for space    as byte    two of literal
  5202.     jr    z,opn020    ;ignore    spaces appearing in byte two
  5203.     ld    (hl),a
  5204.     inc    hl        ;bump buffer pointer
  5205. opn020:    ld    a,b        ;operand key value
  5206.     cp    80h        ;test for closed paren required
  5207.     jr    c,opn030    ;c - none required
  5208.     ld    (hl),')'
  5209.     inc    hl
  5210. opn030:    ld    a,(opnflg)    ;get flag byte
  5211.     xor    0ffh        ;toggle operand number
  5212.     ld    (opnflg),a    ;
  5213.     jr    z,opn040    ;z - just finished number two
  5214.     ld    a,(zasmkv)    ;get op code key value
  5215.     ld    de,zopnd2    ;index into operand2 table
  5216.     add    a,e
  5217.     ld    e,a
  5218.     jr    nc,opn035
  5219.     inc    d
  5220. opn035:    ld    a,(de)        ;get operand2 key value 
  5221.     inc    a
  5222.     jr    z,opn040    ;z - no    second operand
  5223.     ld    (hl),','    ;separate operands with comma in buffer
  5224.     inc    hl
  5225.     jr    opn
  5226. opn040:    ld    hl,(zasmio)    ;rewind    buffer pointer
  5227.     ld    a,(maxlin)
  5228.     ld    c,a
  5229. opn041:
  5230.     ld    a,(case)
  5231.     and    a
  5232.     jr    z,opn043    ;upper case requested - no need to convert
  5233.                 ;reg names    
  5234. opn042:    ld    a,(hl)
  5235.     and    a        ;if sign on no case conversion
  5236.     call    p,ilcs
  5237.     and    7fh        ;in case we fell thru
  5238.     ld    (hl),a
  5239.     inc    hl
  5240.     dec    c
  5241.     jr    nz,opn042
  5242.     ld    a,(maxlin)
  5243. opn043:    cp    30
  5244.     jp    z,opn044
  5245.     ld    a,44        ;allow 16 comment chars
  5246. opn044:
  5247.     ld    c,a        ;number of chars to print (omit crlf)
  5248.     ld    hl,(zasmio)
  5249.     ld    a,(lcmd)
  5250.     cp    'J'        ;j command
  5251.     ret    z        ;end of the line for full screen animation
  5252.     call    printb        ;print buffer
  5253.     inc    hl        ;point past crlf to next 32 byte group
  5254.     inc    hl
  5255.     ex    de,hl
  5256.     ld    a,(lcmd)    ;jettison all commands except z
  5257.     cp    'X'
  5258.     jp    z,crlf
  5259.     cp    'A'
  5260.     jp    z,crlf        
  5261.     cp    'S'
  5262.     jp    z,crlf
  5263.     xor    a
  5264.     ld    (zasmf),a
  5265.     ld    hl,(zasmct)    ;check disassembly count
  5266.     dec    hl        
  5267.     ld    a,h
  5268.     or    l        ;test for count expired
  5269.     jp    nz,opn060    ;nz - this is not a count of one so this is not
  5270.                 ;interactive disassebly
  5271.  
  5272.     call    ttyi        ;check input command letter for interactive
  5273.     call    ixlt        ;force upper case
  5274.     ld    (zasmf),a
  5275.     cp    'C'        ;code?
  5276.     call    z,cret        ;if user wants code return cursor to start of
  5277.                 ;line and disassemble again
  5278.     jp    z,zasm15
  5279.     ld    c,82h        ;assume defw
  5280.     cp    'D'        
  5281.     jr    z,opn045    ;defw -    082h
  5282.     dec    c        ;assume ascii defb
  5283.     cp    'A'
  5284.     jr    z,opn045    ;ascii defb - 081h
  5285.     cp    'B'
  5286.     jr    nz,opn046    ;none of the above
  5287.     ld    c,0c1h        ;hex defb - 0c1h
  5288. opn045:    call    cret
  5289.     ld    hl,(zasmpc)
  5290.     jp    zasm18
  5291.  
  5292.                 ;zasmf - 0 means this is block disassembly
  5293.                 ;      - nz means char entered during 
  5294.                       ;        interactive mode was not c d a or b. 
  5295.         
  5296. opn046:    cp    ';'        ;check if user wants to insert comments
  5297.     jr    nz,opn060    ;nz - user does not want to add comment    
  5298.  
  5299.     call    ttyo        ;echo semicolon
  5300.     dec    de
  5301.     dec    de        ;point to carriage return
  5302.     ld    a,' '
  5303.     ld    (de),a        ;clear crlf from buffer
  5304.     inc    de
  5305.     ld    (de),a
  5306.     inc    de
  5307.     call    write        ;end of buffer - write if required
  5308.     ld    b,29
  5309.     ld    a,(maxlin)
  5310.     sub    30
  5311.     jp    z,opn048
  5312.     dec    de
  5313.     ld    b,16
  5314.     xor    a
  5315. opn048:    ld    c,a
  5316.     push    bc
  5317.     push    de        ;save disassembly buffer pointer
  5318.     ld    d,a
  5319.     call    iedt03
  5320.     pop    de
  5321.     pop    bc
  5322.     ld    a,b        ;recover max size of comment
  5323.     dec    hl
  5324.     ld    b,(hl)        ;number actually entered
  5325.     sub    b
  5326.     ld    c,a        ;trailing spaces 
  5327.     inc    hl
  5328.     ex    de,hl        ;de - input buffer   hl - disassembly buffer
  5329.     ld    (hl),';'
  5330.     inc    hl
  5331. opn049:    dec    b        ;pre-test count
  5332.     jp    m,opn050
  5333.     ld    a,(de)        ;first char of input
  5334.     inc    de
  5335.     ld    (hl),a        ;into disassembly buffer
  5336.     inc    hl
  5337.     jr    opn049
  5338. opn050:    dec    c
  5339.     jp    m,opn055
  5340.     ld    (hl),' '
  5341.     inc    hl
  5342.     jr    opn050
  5343. opn055:    ld    (hl),cr
  5344.     inc    hl
  5345.     ld    (hl),lf
  5346.     inc    hl
  5347.     ex    de,hl
  5348.     jp    opn065
  5349.  
  5350. opn060:
  5351.     ld    a,(maxlin)    
  5352.     cp    30        ;test for 6 chars in label
  5353.     jp    z,opn065    ;z - buffer point ok
  5354.     ld    a,64-46        ;bump buffer pointer to next 64 byte chunk
  5355.     add    a,e
  5356.     ld    e,a
  5357.     jp    nc,opn065     
  5358.     inc    d
  5359.  
  5360. opn065:    call    write        ;check if write to disk flag in effect    
  5361.     
  5362.     call    crlf
  5363.     ld    (zasmio),de    ;save new buffer pointer
  5364.     ld    hl,(zasmwt)    ;check disassembly count
  5365.     xor    a
  5366.     or    h        ;less than 256?
  5367.     jr    z,opn080    ;less -    this is    tally
  5368.     ld    bc,(zasmnx)    ;fetch next disassembly    address
  5369.     sbc    hl,bc        ;versus    requested end address
  5370.     jr    c,opn095    ;c - end
  5371.     add    hl,bc        ;restore next disassembly address
  5372.     jr    opn085        ;more
  5373. opn080:    dec    hl
  5374.     ld    a,h
  5375.     or    l
  5376.     jr    nz,opn085    ;nz - more
  5377.     ld    hl,(zasmct)    ;fetch permanent block size
  5378.     ld    a,(zasmf)
  5379.     and    a
  5380.     call    z,ttyi        ;query user - more?
  5381.     cp    cr        ;return    means end
  5382.     jr    z,opn095
  5383.     jr    opn090
  5384. opn085:
  5385.     call    ttyq
  5386.     cp    cr
  5387.     jr    z,opn095    ;nz - terminate    disassembly
  5388. opn090:
  5389.     ld    (zasmwt),hl    ;restore count
  5390.     ld    hl,(zasmnx)    ;next instruction pointer
  5391.     ld    (zasmpc),hl    ;make current
  5392.     jp    zasm15        ;disassemble next instruction
  5393.  
  5394. opn095:    ld    a,(dwrite)    ;writing to disk?
  5395.     and    a
  5396.     ret    z
  5397.     ld    a,eof        ;
  5398.     ld    (de),a        ;set eof
  5399.     ld    de,zasmbf
  5400.     call    write
  5401.  
  5402.  
  5403.  
  5404. closef:    ld    de,fcb        ;close file
  5405.     ld    c,16
  5406.     jp    bdos
  5407.  
  5408.  
  5409.  
  5410. write:    push    bc    
  5411.     push    hl
  5412.     ld    hl,nzasm    ;address of end of disassembly buffer    
  5413.     and    a
  5414.     sbc    hl,de
  5415.     jr    nz,wrt10    ;not end of buffer
  5416.     ld    de,zasmbf    ;need to rewind buffer pointer 
  5417.     ld    a,(dwrite)    ;test write to disk flag
  5418.     and    a
  5419.     call    nz,bwrite    ;nz - writing to disk
  5420. wrt10:    pop    hl
  5421.     pop    bc
  5422.     ret
  5423.  
  5424.  
  5425.  
  5426. bwrite:    push    bc        ;bdos write routine
  5427.     push    de
  5428.     push    hl
  5429.     ld    c,26        ;set dma address
  5430.     call    bdos
  5431.     ld    de,fcb
  5432.     ld    c,21
  5433.     call    bdos        ;write buffer
  5434.     pop    hl
  5435.     pop    de
  5436.     pop    bc
  5437.     ret
  5438.  
  5439.  
  5440.  
  5441. bldf:    call    lfcb        ;initialize fcb
  5442.     ret    nz        ;error - invalid file name
  5443.     call    lopn
  5444.     jr    z,bldf00    ;no file - create one
  5445.     ld    de,fcb
  5446.     ld    c,19        ;file exists - delete it
  5447.     call    bdos 
  5448. bldf00:    ld    de,fcb        ;create    new file
  5449.     ld    c,22
  5450.     call    bdos        ;if no file create one
  5451.     xor    a
  5452.     ret
  5453.  
  5454.     page
  5455.  
  5456. opn100:    ld    hl,(zasmpc)
  5457.     inc    hl
  5458.     ld    a,(hl)        ;fetch relative    displacement
  5459.     ld    c,a
  5460.     inc    c
  5461.     add    a,a        ;test sign for displacement direction
  5462.     ld    b,0
  5463.     jr    nc,opn105
  5464.     dec    b        ;produce zero for forward - ff for back
  5465. opn105:    add    hl,bc        ;adjust    pc
  5466.     ex    de,hl        ;de - instruction ptr    hl - buffer
  5467.     call    fadr
  5468.     call    z,xsym
  5469.     jp    z,opn040    ;symbol    found
  5470.     ld    (hl),'$'    ;
  5471.     inc    hl
  5472.     ld    a,c
  5473.     inc    a
  5474.     ld    b,0
  5475.     cp    82h
  5476.     jp    opn610        ;convert to displacement to ascii
  5477.  
  5478. opn200:    call    zmqf        ;check for interactive disassembly
  5479.     jr    nc,opn205    ;sign off - not interactive
  5480.     add    a,a        ;shift out bit 6
  5481.     ld    a,(hl)
  5482.     jr    c,opn215    ;on - must be hex defb
  5483.     call    zascii        ;user wants ascii - check validity
  5484.     jr    nz,opn215    ;nz - untable to convert to ascii
  5485.     jp    opn020
  5486. opn205:    call    zndx        ;check for ix or iy instruction
  5487.     ex    de,hl        ;buffer back to de
  5488.     jr    nz,opn210    ;nz - not ix or    iy
  5489.     inc    hl
  5490.     inc    hl        ;must be  ld (ix+ind),nn
  5491. opn210:    inc    hl        ;
  5492.     ld    a,(hl)        ;fetch object byte
  5493.     jr    z,opn215    ;no conversion of ix and iy displacements 
  5494.                 ;to ascii        
  5495.     ld    a,(zasmkv)    ;check for in or out instruction
  5496.     cp    0b3h    
  5497.     jr    z,opn215    ;no conversion of port addresses to ascii
  5498.     cp    0bbh
  5499.     jr    z,opn215
  5500.     ld    a,(hl)    
  5501.     call    zascii
  5502.     jp    z,opn020
  5503. opn215:    ex    de,hl
  5504.     ld    a,(de)
  5505.     cp    10        ;decimal number?
  5506.     jr    nc,opn220    ;no - convert to hex
  5507.     call    zhex20        ;86 the    leading    zero and trailing h
  5508.     jp    opn020
  5509. opn220:    call    zhex        ;do hex    to asii    conversion
  5510.     ld    (hl),'H'    ;following 8 bit hex byte
  5511.     inc    hl
  5512.     jp    opn020
  5513.  
  5514. opn300:    call    zmqf
  5515.     jr    c,opn315    ;c - this is defw
  5516.     call    zndx
  5517.     ex    de,hl        ;de - buffer   hl - instruction    pointer
  5518.     jr    nz,opn310    ;nz - not ix or    iy
  5519.     inc    hl
  5520. opn310:    inc    hl
  5521. opn315:    ld    a,(hl)        ;fetch lo order    16 bit operand
  5522.     inc    hl
  5523.     ld    h,(hl)        ;hi order
  5524.     ld    l,a
  5525.     ex    de,hl        ;de - 16 bit operand   hl - buffer
  5526.     call    fadr
  5527.     call    z,xsym
  5528.     jp    z,opn020    ;symbol    found
  5529.     ld    a,d        ;convert hi order to hex
  5530.     ld    c,a        ;save spare copy
  5531.     call    zhex
  5532.     ld    a,e
  5533.     ld    d,a
  5534.     call    zhex10
  5535.     xor    a
  5536.     or    c
  5537.     jr    nz,opn320
  5538.     ld    a,d
  5539.     cp    10
  5540.     jp    c,opn020
  5541. opn320:    ld    (hl),'h'
  5542.     inc    hl
  5543.     jp    opn020
  5544.  
  5545. opn400:
  5546.     call    zndx
  5547.     jr    nz,opn410    ;nz - not ix or    iy instruction
  5548.     inc    de
  5549.     ld    a,(de)
  5550.     cp    0cbh        ;check for indexed bit instruction
  5551.     jr    nz,opn410
  5552.     inc    de        ;byte of interest is number four
  5553.     inc    de
  5554. opn410:    ld    a,01        ;check low bit of operand key value
  5555.     and    b
  5556.     ld    a,(de)        ;fetch op code
  5557.     jr    nz,opn500    ;nz - index 01bh
  5558.     rra            ;register specified in bits 0-5
  5559.     rra
  5560.     rra
  5561. opn500:    and    007        ;register specified in bits 0-2
  5562.     xor    006        ;from the movie    of the same name
  5563.     jp    nz,opn010    ;nz - not hl or    ix or iy
  5564.     ld    a,(zasmpc)    ;
  5565.     xor    e        ;test if pc was    incremented
  5566.     ld    (hl),'('    ;set leading paren
  5567.     inc    hl
  5568.     ld    b,080h        ;set sign bit -    closed paren required
  5569.     ex    de,hl        ;de - buffer
  5570.     jp    z,opn012
  5571.  
  5572.  
  5573.  
  5574. opn600:
  5575.     call    zndx        ;determine if ix or iy
  5576.     jr    z,opn605    ;z - must be ix    of iy
  5577.     ld    a,80h
  5578.     and    b
  5579.     jp    opn010
  5580. opn605:    ld    (hl),'i'    ;set first character
  5581.     inc    hl
  5582.     adc    a,'x'        ;carry determines x or y (from zndx)
  5583.     ld    (hl),a
  5584.     inc    hl
  5585.     ld    a,80h        ;test for parens
  5586.     and    b
  5587.     jp    z,opn030    ;z - not indexed instruction
  5588.     inc    de
  5589.     ld    a,(de)        ;fetch second byte of instruction
  5590.     cp    0e9h        ;test for jp (ix) or jp    (iy)
  5591.     jp    z,opn020    ;output    closed paren
  5592.     inc    de
  5593.     ld    a,(de)        ;fetch displacement byte
  5594.     cp    80h        ;test sign
  5595. opn610:    ld    (hl),'+'    ;assume    forward
  5596.     jr    c,opn620    ;c - forward
  5597.     neg            ;force positive
  5598.     ld    (hl),'-'
  5599. opn620:    inc    hl        ;bump buffer pointer
  5600.     and    7fh        ;strip sign
  5601.     call    zhex        ;convert to hex
  5602.     ld    a,9
  5603.     cp    d
  5604.     jp    nc,opn020
  5605.     ld    (hl),'h'
  5606.     inc    hl
  5607.     jp    opn020        ;output    closed paren
  5608.  
  5609.  
  5610.  
  5611.  
  5612. opn700:    ld    hl,(zasmpc)
  5613.     ld    a,(hl)        ;fetch restart instruction
  5614.     ex    de,hl        ;de - buffer   hl instruction pointer
  5615.     and    038h        ;
  5616.     call    zhex        ;convert restart number    to ascii
  5617.     ld    (hl),'H'
  5618.     jp    opn020
  5619.  
  5620.  
  5621.  
  5622. opn800:    call    zndx
  5623.     jr    nz,opn810    ;nz - not ddcb or fdcb instruction
  5624.     inc    de
  5625.     inc    de
  5626.     inc    de        ;
  5627.     ld    a,(de)        ;byte 4    of ix or iy bit    instruction
  5628.     jr    opn820
  5629. opn810:    cp    10h        ;weed out interrupt mode instructions
  5630.     ld    a,(de)        ;second    byte of    instruction regardless
  5631.     jr    nz,opn820    ;nz - cb bit instruction
  5632.     xor    046h        ;
  5633.     jr    z,opn830    ;z - interrupt mode zero
  5634.     sub    8
  5635. opn820:    rra
  5636.     rra
  5637.     rra
  5638.     and    07        ;leave only bit    number
  5639. opn830:    call    zhex20        ;convert to ascii
  5640.     jp    opn030
  5641.     page
  5642. ;******************************************************************************
  5643. ;*
  5644. ;*             disassembler utility subroutines
  5645. ;*
  5646. ;*    zndx:      determines if    fd dd ed or cb instruction
  5647. ;*          caller uses returned values on an individual basis
  5648. ;*
  5649. ;*           z  -    dd fd
  5650. ;*          nz  -    neither    of the above
  5651. ;*          current instruction pointer bumped if    cb or ed instruction
  5652. ;*
  5653. ;*    zhex:      convert to byte in the accumulator to ascii with leading zero
  5654. ;*          store    in buffer
  5655. ;*          d - reg destroyed
  5656. ;*
  5657. ;*    zhex10:      no leading zero permitted
  5658. ;*    zhex20:      convert lo order nibble only
  5659. ;*
  5660. ;******************************************************************************
  5661.  
  5662. zndx:    ld    hl,(zasmpc)    ;fetch current instruction pointer
  5663.     ex    de,hl        ;de - instruction pointer   hl - buffer
  5664.     ld    a,(de)
  5665.     add    a,-0fdh        ;iy check
  5666.     ret    z
  5667.     sub    0ddh-0fdh    ;ix check
  5668.     ret    z
  5669.     cp    10h        ;ed check
  5670.     jr    z,zndx00
  5671.     cp    0eeh        ;cb check
  5672.     ld    a,0        ;clear
  5673.     ret    nz
  5674. zndx00:    inc    de        ;cb or ed - bump instruction pointer
  5675.     cpl
  5676.     and    a        ;ensure    nz set
  5677.     cpl
  5678.     ret
  5679.  
  5680.  
  5681.  
  5682. zhex:    ld    d,a
  5683.     cp    0a0h        ;test byte to convert
  5684.     jr    c,zhex00    ;starts    with decimal digit - 86    the lead zero
  5685.     ld    (hl),'0'
  5686.     inc    hl
  5687.     jr    zhex10
  5688. zhex00:    cp    10
  5689.     jr    c,zhex20
  5690. zhex10:    rrca
  5691.     rrca
  5692.     rrca
  5693.     rrca
  5694.     and    0fh
  5695.     add    a,90h
  5696.     daa
  5697.     adc    a,40h
  5698.     daa            ;a - ascii digit
  5699.     ld    (hl),a
  5700.     inc    hl
  5701.     ld    a,d        ;lo nibble conversion
  5702. zhex20:    and    0fh
  5703.     add    a,90h
  5704.     daa
  5705.     adc    a,40h
  5706.     daa
  5707.     ld    (hl),a
  5708.     inc    hl
  5709.     ret
  5710.  
  5711.  
  5712.  
  5713. zmqf:    ld    hl,zmflag    ;check interactive disassembly flag
  5714.     ld    a,(hl)        ;
  5715.     ld    (hl),0        ;clear regardless
  5716.     ld    hl,(zasmpc)    ;fetch current disassembly address
  5717.     add    a,a        ;check sign - on means interactive
  5718.     ret
  5719.  
  5720.  
  5721. zascii:    cp    ' '
  5722.     ret    c
  5723.     and    a
  5724.     ret    m
  5725.     cp    7fh        ;rubout?
  5726.     jr    z,zasc10
  5727.     cp    quote
  5728.     jr    nz,zasc20
  5729. zasc10:    and    a        ;set nz - conversion not done
  5730.     ret
  5731. zasc20:    ex    de,hl
  5732.     ld    (hl),quote    ;defb -    quoted character
  5733.     inc    hl
  5734.     or    80h        ;hi bit on - no case conversion for this guy
  5735.     ld    (hl),a
  5736.     inc    hl
  5737.     ld    (hl),quote
  5738.     cp    a
  5739.     ret
  5740.  
  5741.  
  5742.  
  5743. fadr:    push    bc
  5744.     push    hl
  5745.     ld    hl,(06)        ;fetch top of tpa - start of symbol table
  5746.     ld    bc,(maxlen)
  5747.     add    hl,bc        ;point to start of symbol name
  5748.     inc    hl
  5749. fadr00:    ld    a,(hl)        ;first byte of symbol name
  5750.     dec    a        ;check validity
  5751.     jp    m,fadr30    ;end of    table
  5752.     add    hl,bc
  5753.     ld    a,(hl)        ;fetch hi order    address    from table
  5754.     cp    d
  5755.     jp    nz,fadr10
  5756.     dec    hl
  5757.     ld    a,(hl)
  5758.     inc    hl
  5759.     cp    e
  5760.     jp    z,fadr20
  5761. fadr10:    inc    hl
  5762.     jp    fadr00
  5763. fadr20:    ex    de,hl        ;return pointer in de
  5764.     ld    a,c
  5765.     cpl
  5766.     and    e
  5767.     ld    e,a
  5768.     xor    a
  5769. fadr30:    pop    hl
  5770.     pop    bc
  5771.     ret
  5772.  
  5773. xsym:
  5774.     ld    a,(maxlen)
  5775.     dec    a
  5776.     ld    c,a
  5777. xsym00:    ld    a,(de)
  5778.     and    a
  5779.     ret    z
  5780.     ld    (hl),a
  5781.     inc    hl
  5782.     inc    de
  5783.     dec    c
  5784.     jr    nz,xsym00
  5785.     ret
  5786.     page
  5787.  
  5788.  
  5789. ;******************************************************************************
  5790. ;*
  5791. ;*    bcde:  query user for 3    arguments: source address
  5792. ;*                       destination address
  5793. ;*                       byte    count
  5794. ;*
  5795. ;*           used by move, verify, and yfil routines
  5796. ;*
  5797. ;*           return: bc - byte count
  5798. ;*               de - destination
  5799. ;*               hl - source pointer
  5800. ;*            z - no errors
  5801. ;*
  5802. ;*               nz - no input entered
  5803. ;*              - untable to evaluate argument
  5804. ;*              - destination    address    < source
  5805. ;*
  5806. ;******************************************************************************
  5807.  
  5808. bcde:    call    iedtbc
  5809.     ret    m        ;no input is treated as    error
  5810.     call    iarg        ;read in starting block    address
  5811.     ret    nz
  5812.     ex    de,hl
  5813.     call    iarg
  5814.     ret    nz
  5815.     sbc    hl,de        ;end - start = byte count - 1
  5816.     ret    c
  5817.     ld    b,h
  5818.     ld    c,l
  5819.     inc    bc
  5820.     call    in00        ;read in destination block address
  5821.     ret    nz
  5822.     ex    de,hl        ;set regs right
  5823.     ret
  5824.  
  5825.     page
  5826.  
  5827. ;******************************************************************************
  5828. ;*
  5829. ;*               console i/o routines
  5830. ;*
  5831. ;*   "physical"    i/o routines: ttyi - keyboard input
  5832. ;*                  ttyo - console output
  5833. ;*                  ttyq - console status
  5834. ;*
  5835. ;*   logical input routines:  inchar - input character processing
  5836. ;*                       control characters echoed with ^    
  5837. ;*
  5838. ;*   logical output routines: crlf   - output carriage return/line feed
  5839. ;*                  cret   - output carriage return only
  5840. ;*                 space   - output space
  5841. ;*                spaces   - output number of    spaces in passed in c
  5842. ;*                outhex   - output hex byte in a
  5843. ;*                othxsp   - output hex byte in a followed by    space
  5844. ;*                outadr   - output 16 bit hex value in hl followed
  5845. ;*                       by space    - hl preserved
  5846. ;*                 print   - output string - address in de
  5847. ;*                       string terminated by null
  5848. ;*                printb   - output string - address in hl
  5849. ;*                               byte count in c
  5850. ;*                               end at first null
  5851. ;*
  5852. ;******************************************************************************
  5853.  
  5854.     if    ASMB
  5855. ttyq:
  5856.     else
  5857. ttyq::
  5858.     endif
  5859.     push    bc
  5860.     push    de
  5861.     push    hl
  5862.     ld    c,11
  5863.     call    bdos
  5864.     and    a
  5865.     ld    c,6
  5866.     ld    e,0ffh
  5867.     call    nz,bdos
  5868.     pop    hl
  5869.     pop    de
  5870.     pop    bc
  5871.     and    7fh
  5872.     ret
  5873.  
  5874.     if not jterm
  5875.     org    ttyq+32
  5876.     endif
  5877.  
  5878.     if    ASMB
  5879. ttyi:
  5880.     else
  5881. ttyi::
  5882.     endif
  5883.     push    bc
  5884.     push    de
  5885.     push    hl
  5886.     if    ASMB
  5887. ttyi00:
  5888.     else
  5889. ttyi00::
  5890.     endif
  5891.     ld    c,6
  5892.     ld    e,0ffh
  5893.     call    bdos
  5894.     and    7fh
  5895.     jr    z,ttyi00
  5896.     pop    hl
  5897.     pop    de
  5898.     pop    bc
  5899.     ret
  5900.  
  5901.     if not jterm
  5902.     org    ttyi+32
  5903.     endif
  5904.  
  5905.     if    ASMB
  5906. ttyo:
  5907.     else
  5908. ttyo::
  5909.     endif
  5910.     push    af
  5911.     push    bc
  5912.     push    de
  5913.     push    hl
  5914.     ld    e,a
  5915.     if    jterm        ;my terminal uses tab as cursor position
  5916.     ld    c,6        ;lead-in and i don't want the bdos to expand
  5917.     else            ;the tab to a string of spaces.
  5918.     ld    c,2
  5919.     endif
  5920.     call    bdos
  5921.     pop    hl
  5922.     pop    de
  5923.     pop    bc
  5924.     pop    af
  5925.     ret
  5926.  
  5927.     if not jterm
  5928.     org    ttyo+32
  5929.     endif
  5930.  
  5931. inchar:    call    ttyi
  5932.     cp    ctlc
  5933.     jp    z,00
  5934.     cp    cr
  5935.     ret    z
  5936.     cp    tab
  5937.     ret    z
  5938.     cp    lf
  5939.     ret    z
  5940.     cp    bs
  5941.     ret    z
  5942.     cp    ctlx
  5943.     ret    z
  5944.     cp    ' '
  5945.     jr    nc,ttyo
  5946.     push    af
  5947.     ld    a,'^'
  5948.     call    ttyo
  5949.     pop    af
  5950.     xor    40h
  5951.     call    ttyo
  5952.     xor    40h
  5953.     ret
  5954.  
  5955.  
  5956. ilcs:    cp    'A'
  5957.     ret    c
  5958.     cp    'Z'+1
  5959.     ret    nc
  5960.     or    20h
  5961.     ret
  5962.  
  5963.  
  5964.  
  5965. ixlt:    cp    'a'
  5966.     ret    c
  5967.     cp    'z'+1
  5968.     ret    nc
  5969.     sub    20h
  5970.     ret
  5971.  
  5972.     page
  5973. crlf:    ld    a,lf
  5974.     call    ttyo
  5975. cret:    ld    a,cr
  5976.     jp    ttyo
  5977.  
  5978. othxsp:    call    outhex
  5979.  
  5980. space:    ld    a,' '
  5981.     jp    ttyo
  5982.  
  5983. space5:    ld    c,5
  5984.  
  5985. spaces:    call    space
  5986.     dec    c
  5987.     jr    nz,spaces
  5988.     ret
  5989.  
  5990.  
  5991.  
  5992. newlin:    call    crlf
  5993.     ex    de,hl
  5994.     call    outadr
  5995.     ex    de,hl
  5996.     ret
  5997.  
  5998.     
  5999. outadr:    ld    a,h
  6000.     call    outhex
  6001.     ld    a,l
  6002.     call    othxsp
  6003.     jr    space
  6004.  
  6005.  
  6006.  
  6007. outhex:    push    af
  6008.     call    binx
  6009.     call    ttyo
  6010.     pop    af
  6011.     call    binx00
  6012.     jp    ttyo
  6013.  
  6014.  
  6015.  
  6016. binx:    rrca
  6017.     rrca
  6018.     rrca
  6019.     rrca
  6020. binx00:    and    0fh
  6021.     add    a,90h
  6022.     daa
  6023.     adc    a,40h
  6024.     daa
  6025.     ret
  6026.     page
  6027. ilin:    push    bc
  6028.     push    de
  6029.     ld    b,inbfsz
  6030.     ld    c,0
  6031.     call    in
  6032.     pop    de
  6033.     pop    bc
  6034.     ret
  6035.  
  6036.  
  6037. istr:    push    bc
  6038.     push    de
  6039.     ld    b,1
  6040.     ld    c,' '
  6041.     call    iedt
  6042.     pop    de
  6043.     pop    bc
  6044.     ret
  6045.  
  6046.         
  6047.                 ;resume input after reading in one char
  6048.  
  6049. irsm:    push    bc
  6050.     push    de
  6051.     ld    b,inbfsz-1    ;max input size less one char already read in
  6052.     ld    c,' '        ;this is terminator char
  6053.     ld    d,1        ;preset byte count
  6054.     ld    a,d
  6055.     ld    (strngf),a    ;set nz - this is string function
  6056.     ld    hl,inbf+1    ;init buffer pointer
  6057.     call    iedt05
  6058.     xor    a
  6059.     ld    (strngf),a    ;this is no longer string function
  6060.     or    d
  6061.     call    p,in00
  6062.     pop    de
  6063.     pop    bc
  6064.     ret
  6065.  
  6066.  
  6067.  
  6068. in:    call    iedt
  6069.     ret    m
  6070. in00:    xor    a
  6071.     ld    (argbc),a
  6072.     ld    hl,argbf
  6073.     ld    (argbpt),hl
  6074. in10:    call    iarg
  6075.     ret    nz
  6076.     and    a
  6077.     jr    nz,in10
  6078.     ret
  6079.  
  6080.  
  6081.  
  6082. iarg:    push    bc
  6083.     push    de
  6084.     call    parg
  6085.     ld    a,(delim)
  6086.     pop    de
  6087.     pop    bc
  6088.     ret
  6089.     page
  6090. parg:    call    prsr        ;extract next argument
  6091.     ret    nz        ;parse error
  6092.     ld    a,(quoflg)    ;test for ascii    literal
  6093.     and    a
  6094.     jr    z,parg10    ;quote character not found
  6095.     xor    a
  6096.     or    b        ;test for balanced quotes
  6097.     ret    m        ;error - unbalanced quotes
  6098.     ld    a,(de)        ;first character of parse buffer
  6099.     sub    quote
  6100.     jr    nz,parg50    ;invalid literal string but may be expression
  6101.                 ;involving a literal
  6102.     ld    l,b        ;l - character count of    parse buffer
  6103.     ld    h,a        ;clear
  6104.     add    hl,de        ;
  6105.     dec    hl        ;hl - pointer to last char in parse buffer
  6106.     ld    a,(hl)        ;
  6107.     sub    quote        ;ensure    literal    string ends with quote
  6108.     jr     nz,parg50
  6109.     ld    (hl),a        ;clear trailing quote
  6110.     ld    c,b        ;c - character count of    parse buffer
  6111.     ld    b,a        ;clear
  6112.     dec    c        ;subtract the quote characters from the    count
  6113.     dec    c
  6114.     dec    c        ;extra dec set error flag nz for '' string
  6115.     ret    m        ;inform    caller of null string
  6116.     inc    c        ;c - actual string length
  6117.     ld    a,c        ;spare copy
  6118.     inc    de        ;point to second character of parse buffer
  6119.     ld    hl,(argbpt)    ;caller    wants evaluated    arg stored here
  6120.     ex    de,hl
  6121.     ldir
  6122.     ex    de,hl
  6123.     dec    hl
  6124.     ld    e,(hl)
  6125.     dec    hl
  6126.     ld    d,(hl)
  6127.     inc    hl
  6128.     inc    hl        ;point to where to store next arg
  6129.     dec    a        ;argument length 1?
  6130.     jr    nz,parg00
  6131.     ld    d,a
  6132. parg00:    ld    c,a
  6133.     inc    c        ;account for increment
  6134.     ld    a,(argbc)    ;fetch current argument byte counter
  6135.     add    a,c
  6136.     jr    parg90
  6137. parg10:    call    mreg        ;check for register specified
  6138.     jr    nz,parg50    ;nz - invalid register name
  6139.     ld    a,c
  6140.     add    a,a
  6141.     jr    c,parg60    ;sign bit reset    - 16 bit register pair
  6142. parg50:    ld    hl,00
  6143.     ld    b,l
  6144.     ld    de,prsbf    ;reinit    starting address of parse buffer
  6145.     call    xval
  6146.     jr    z,parg70
  6147.     ret
  6148. parg60:    ld    a,(hl)
  6149.     dec    hl
  6150.     ld    l,(hl)
  6151.     ld    h,a
  6152.     ld    a,(prsbf)    ;check paren flag for indirection
  6153.     and    a
  6154.     jr    nz,parg65    ;nz - parens not removed
  6155.     inc    de        ;bump past trailing null
  6156.     ld    a,(hl)
  6157.     inc    hl
  6158.     ld    h,(hl)
  6159.     ld    l,a
  6160. parg65:    ld    b,80h
  6161.     call    xval
  6162.     ret    nz
  6163. parg70:    ex    de,hl
  6164.     ld    hl,(argbpt)
  6165.     ld    a,(argbc)
  6166.     inc    d
  6167.     dec    d
  6168.     jr    z,parg80
  6169.     ld    (hl),d
  6170.     inc    hl
  6171.     inc    a
  6172. parg80:    ld    (hl),e
  6173.     inc    hl
  6174.     inc    a
  6175. parg90:    ld    (argbc),a
  6176.     ld    (argbpt),hl
  6177.     ex    de,hl
  6178.     xor    a
  6179.     ret
  6180.     page
  6181. outbyt:    ld    b,a        ;save spare copy    
  6182.     call    othxsp        ;hex - display
  6183.     call    space
  6184.     ld    a,b        ;display byte in ascii
  6185.     call    asci        ;display ascii equivalent
  6186.     ld    c,3
  6187.     jp    spaces        ;solicit input three spaces right
  6188.  
  6189. byte:    call    istr
  6190.     ld    a,(inbfnc)    ;number    of chars in input buffer
  6191.     dec    a        ;test for input    buffer count of    zero
  6192.     inc    de        ;assume    zero - examine next
  6193.     ret    m        ;no input means examine next
  6194.     dec    de        ;incorrect assumption
  6195.     ld    a,(inbf)    ;check first char of input buffer
  6196.     cp    '.'
  6197.     ret    z        ;period    ends command
  6198.     cp    '='        ;new address?
  6199.     jr    nz,byte10
  6200.     xor    a        ;clear equal sign so prsr ignores it
  6201.     ld    (inbf),a
  6202.     call    irsm        ;fetch new address to examine
  6203.     jr    nz,byte30    ;error
  6204.     ld    a,(inbfnc)
  6205.     sub    2
  6206.     jr    c,byte30    ;c - error - equal sign was only char of input
  6207.     ex    de,hl        ;return new address in de
  6208.     scf            ;ensure nz set for caller - no replacement data
  6209.                 ;was entered
  6210.     sbc    a,a
  6211.     ret
  6212. byte10:    cp    '^'        ;
  6213.     jr    nz,byte15    ;nz - not up arrow means need more input
  6214.     dec    de        ;dec current memory pointer
  6215.     scf             ;set nz - no replacement data entered
  6216.     sbc    a,a
  6217.     ret
  6218. byte15:    call    irsm        ;resume    input from console
  6219.     ret    z        ;no errors on input
  6220.     ld    a,(inbfnc)    ;check number of chars input
  6221.     and    a        
  6222.     jr    z,byte        ;none - user hit control x or backspaced to
  6223.                 ;beginning of buffer
  6224. byte30:    call    e???
  6225.     scf
  6226.     sbc    a,a        ;set nz - no replacement
  6227.     ret
  6228.     page
  6229. ;******************************************************************************
  6230. ;*
  6231. ;*    bdos function 10 replacement to    make romming this program easier since
  6232. ;*    only two console i/o routines (ttyi and    ttyo) are required. this
  6233. ;*    routine    supports backspace, line delete, and tab expansion.
  6234. ;*
  6235. ;*    all input stored in input buffer inbf.
  6236. ;*
  6237. ;*
  6238. ;*    iedtbc:    solicit    console    for new    input and initialize b and c registers
  6239. ;*        for max    size and input and no special line terminator.
  6240. ;*
  6241. ;*
  6242. ;*    iedt:    solicit    console    for new    input using non-default    byte count for
  6243. ;*        buffer or non-standard terminator.
  6244. ;*
  6245. ;*        called:     b - max number    of characters to receive
  6246. ;*             c - special terminator    other than carriage return
  6247. ;*
  6248. ;*
  6249. ;*    iedt00:    resume input - used by routines    which call iedt    with a buffer
  6250. ;*        count of 1 to check for    special    character as the first char
  6251. ;*        received (such as exam looking for period).
  6252. ;*
  6253. ;*        called:     b - max number    of characters to receive
  6254. ;*             c - special terminator    other than carriage return
  6255. ;*
  6256. ;******************************************************************************
  6257.  
  6258.  
  6259. iedtbc:    ld    b,inbfsz
  6260.     xor    a
  6261.     ld    c,a
  6262.     ld    (strngf),a
  6263. iedt:    xor    a
  6264.     ld    d,inbfsz
  6265.     ld    hl,inbf
  6266. iedt00:    ld    (hl),a
  6267.     inc    hl
  6268.     dec    d
  6269.     jr    nz,iedt00
  6270.     ld    (argbc),a    ;init number of    arguments tally
  6271.     ld    hl,argbf
  6272.     ld    (argbpt),hl    ;init pointer to start of buffer
  6273. iedt03:    ld    hl,inbf        ;start of input    buffer
  6274.     ld    (quoflg),a
  6275. iedt05:    call    inchar        ;read char from    console
  6276.     ld    (trmntr),a    ;assume line terminator until proven otherwise
  6277.     cp    cr        ;end of    line?
  6278.     jr    z,iedt90    ;z - end
  6279.     ld    e,a
  6280.     cp    quote
  6281.     ld    a,(quoflg)
  6282.     jr    nz,iedt10
  6283.     xor    quote
  6284.     ld    (quoflg),a
  6285.     ld    a,quote
  6286.     jr    iedt60
  6287. iedt10:    and    a        ;quote flag on?
  6288.     ld    a,e        ;recover input character
  6289.     jr    z,iedt15    ;off - check terminator
  6290.     ld    a,(lcmd)
  6291.     call    ixlt
  6292.     cp    'R'
  6293.     ld    a,e
  6294.     jr    nz,iedt20
  6295. iedt15:    cp    c        ;compare with auxiliary terminator
  6296.     jr    z,iedt90    ;z - end
  6297. iedt20:    cp    tab
  6298.     jr    nz,iedt35    ;nz - not tab check backspace
  6299. iedt25:    call    space        ;space out until char position mod 8 = zero
  6300.     ld    (hl),a        ;store space in buffer as we expand tab
  6301.     inc    hl 
  6302.     inc    d
  6303.     ld    a,7
  6304.     and    d
  6305.     jr    nz,iedt25
  6306.     ld    (hl),0        ;set end of line null    
  6307.     jr    iedt70
  6308. iedt35:    ld    e,1        ;assume    one backspace required
  6309.     cp    bs
  6310.     jr    z,iedt40    ;z - correct assumption
  6311.     cp    ctlx        ;erase line?
  6312.     jr    nz,iedt60    ;nz - process normal input character
  6313.     ld    e,d        ;backspace count is number of chars in buffer
  6314. iedt40:    xor    a        ;test if already at beginning of buffer
  6315.     or    d
  6316.     jr    z,iedt05    ;z - at    beginning so leave cursor as is
  6317. iedt50:    call    bksp        ;transmit bs - space - bs string
  6318.     dec    d        ;sub one from input buffer count
  6319.     dec    hl        ;rewind    buffer pointer on notch
  6320.     ld    a,(hl)        ;check for control characters
  6321.     ld    (hl),0
  6322.     cp    quote        ;check for backspacing over a quote
  6323.     jr    nz,iedt55
  6324.     ld    a,(quoflg)    ;toggle quote flag so we keep track of balance
  6325.                 ;factor
  6326.     xor    quote
  6327.     ld    (quoflg),a
  6328.     jr    iedt58
  6329. iedt55:    cp    ' '
  6330.     call    c,bksp        ;c - control char requires extra bs for caret
  6331. iedt58:    dec    e        ;dec backspace count
  6332.     jr    nz,iedt50    ;more backspacing
  6333.     ld    a,(strngf)    ;string    function flag on?
  6334.     and    a
  6335.     jr    z,iedt05    ;off - get next    input char
  6336.     xor    a        ;did we    backspace to start of buffer?
  6337.     or    d        ;test via character count
  6338.     jr    nz,iedt05    ;not rewound all the way
  6339.     ld    (inbfnc),a    ;set a zero byte count so caller knows
  6340.     dec    d        ;something is fishy
  6341.     ret
  6342. iedt60:    ld    (hl),a        ;store char in inbf
  6343.     inc    hl        ;bump inbf pointer
  6344.     ld    (hl),0        ;end of line
  6345.     inc    d        ;bump number of    chars in buffer
  6346. iedt70:    ld    a,d        ;current size
  6347.     sub    b        ;versus    max size requested by caller
  6348.     jp    c,iedt05    ;more room in buffer
  6349. iedt90:    ld    hl,inbfnc    ;store number of characters received ala
  6350.                 ;bdos function 10
  6351.     ld    (hl),d
  6352.     inc    hl        ;point to first    char in    buffer
  6353.     dec    d        ;set m flag if length is zero
  6354.     ret            ;sayonara
  6355.  
  6356.  
  6357.  
  6358.  
  6359. bksp:    call    bksp00
  6360.     call    space
  6361. bksp00:    ld    a,bs
  6362.     jp    ttyo
  6363.  
  6364.  
  6365. asci:    and    7fh        ;convert contents of accumulator to ascii   
  6366.     if    hazeltine    ;hazeltine terminal?
  6367.     cp    tilde        ;    check for tilde or del
  6368.     jr    nc,asci00    ;    yes - translate to '.'
  6369.     else            ;non-hazeltine terminal
  6370.     cp    del        ;    check for del
  6371.     jr    z,asci00    ;    yes - translate to '~'
  6372.     endif            ;any terminal - other characters
  6373.     cp    20h        ;    check for control character
  6374.     jp    nc,ttyo        ;    no - output as is
  6375. asci00:                ;    yes - translate to '~' or '.'
  6376.     if    hazeltine    ;hazeltine terminals don't like tilde
  6377.     ld    a,'.'
  6378.     else
  6379.     ld    a,tilde        ;non-printables replaced with squiggle
  6380.     endif
  6381.            jp    ttyo
  6382.  
  6383.  
  6384.  
  6385. bcdx:    call    bcdx00
  6386.     ret    nz
  6387. bcdx00:    rld
  6388.     ex    de,hl
  6389.     add    hl,hl
  6390.     ld    b,h
  6391.     ld    c,l
  6392.     add    hl,hl
  6393.     add    hl,hl
  6394.     add    hl,bc
  6395.     ld    c,a
  6396.     ld    a,9
  6397.     cp    c
  6398.     ret    c
  6399.     xor    a
  6400.     ld    b,a
  6401.     add    hl,bc
  6402.     ex    de,hl
  6403.     adc    a,a
  6404.     ret
  6405.  
  6406.  
  6407.  
  6408. nprint:    call    crlf
  6409. print:    ld    a,(de)
  6410.     and    a
  6411.     ret    z
  6412.     call    ttyo
  6413.     inc    de
  6414.     jr    print
  6415.  
  6416.  
  6417. printb:    ld    a,(hl)
  6418.     and    a
  6419.     ret    z
  6420.     call    ttyo
  6421.     inc    hl
  6422.     dec    c
  6423.     jr    nz,printb
  6424.     ret
  6425.  
  6426.  
  6427.  
  6428. home:    ld    bc,00
  6429.  
  6430.  
  6431.     if    ASMB
  6432. xycp:
  6433.     else
  6434. xycp::
  6435.     endif
  6436.     push    bc        ;enter with row in b and column in c
  6437.     push    de
  6438.     push    hl
  6439.     ld    hl,mxycp
  6440.     ld    a,(row)        ;add in row offset
  6441.     add    a,b
  6442.     ld    b,a        ;save row character
  6443.     ld    a,(column)    ;add column bias
  6444.     add    a,c
  6445.     ld    c,a
  6446.     ld    e,(hl)        ;number of chars in cursor addressing string
  6447. xycp00:
  6448.     inc    hl
  6449.     ld    a,(hl)
  6450.     call    ttyo
  6451.     dec    e
  6452.     jr    nz,xycp00
  6453.     ld    a,(rowb4?)
  6454.     and    a
  6455.     jr    nz,xycp10
  6456.     ld    a,b
  6457.     ld    b,c
  6458.     ld    c,a
  6459. xycp10:
  6460.     ld    a,b
  6461.     call    ttyo
  6462.     ld    a,c
  6463.     call    ttyo
  6464.     pop    hl
  6465.     pop    de
  6466.     pop    bc
  6467.     ret
  6468.  
  6469.     if    not jterm        ;..then leave room for patching
  6470.     org    xycp+128        ;  the object code
  6471.     endif
  6472.  
  6473. nrel:                    ;end of    relocatable code
  6474.     page
  6475.  
  6476. zopnm:
  6477.     defb    'HL'
  6478.     defb    'A '
  6479.     defb    'H '
  6480.     defb    'L '
  6481.     defb    'D '
  6482.     defb    'E '
  6483.     defb    'B '
  6484.     defb    'C '
  6485. ix.:    defb    'IX'
  6486.     defb    'SP'
  6487.     defb    'P '
  6488.     defb    'R '
  6489.     defb    'I '
  6490.     defb    'AF'
  6491.     defb    'BC'
  6492.     defb    'DE'
  6493. iy.:    defb    'IY'
  6494.     defb    'Z '
  6495.     defb    'NC'
  6496.     defb    'NZ'
  6497.     defb    'PE'
  6498.     defb    'PO'
  6499.     defb    'M '
  6500.     defb    'PC'
  6501.  
  6502. ix..    equ    (ix.-zopnm)/2        ;relative position - ix
  6503. iy..    equ    (iy.-zopnm)/2        ;             iy
  6504.  
  6505. zopnml    equ    ($-zopnm)/2
  6506.  
  6507. zopjtb    equ     $-nrel            ;nrel to jump table bias for loader
  6508.  
  6509. zoprjt:
  6510.     defw    opn600            ;18 - hl/ix/iy test
  6511.     defw    opn400            ;19 - register specified in bits 0-2
  6512.     defw    opn400            ;1a - register specified in bits 3-5
  6513.     defw    opn100            ;1b - relative jump
  6514.     defw    opn200            ;1c - nn
  6515.     defw    opn300            ;1d - nnnn
  6516.     defw    opn700            ;1e - restart
  6517.     defw    opn800            ;1f - bit number
  6518.  
  6519. zasmio:    defw    zasmbf
  6520.  
  6521. zopjtl    equ    ($-zoprjt)/2        ;length    of operand jump    table
  6522.  
  6523. jtcmd:
  6524.     defw    ifcb            ; i
  6525.     defw    asmblr            ; a
  6526.     defw    usym            ; u
  6527.     defw    nprt            ; n
  6528.     defw    jdbg            ; j
  6529.     defw    zasm            ; z
  6530.     defw    exam            ; e
  6531.     defw    rgst            ; r
  6532.     defw    go            ; g
  6533.     defw    yfil            ; y
  6534.     defw    movb            ; m
  6535.     defw    verify            ; v
  6536.     defw    psw            ; p
  6537.     defw    break            ; b
  6538.     defw    cbreak            ; c
  6539.     defw    find            ; f
  6540.     defw    hsym            ; h
  6541.     defw    step            ; s
  6542.     defw    obreak            ; o
  6543.     defw    lldr            ; l
  6544.     defw    dump            ; d
  6545.     defw    qprt            ; q
  6546.     defw    xreg            ; x
  6547.     defw    kdmp            ; k
  6548.     defw    writ            ; w
  6549. cmd:
  6550.     defb    'WKXQDLOSHFCB'
  6551.     defb    'PVMYGREZJNUAI'
  6552. ncmd    equ    $-cmd        ;number    of commands
  6553.  
  6554. bpemsg:
  6555.     defb    '*ERROR*'
  6556. bpmsg:
  6557.     defb    '*BP* @ '
  6558.     defb    0
  6559. prompt:
  6560.     defb    '*',' ',bs,0
  6561.  
  6562. mrrow:    defb    '=','>'        ;backspaces taken out
  6563.     defb    00
  6564.  
  6565. m????:    defb    '??'
  6566. m??:    defb    ' ??  '
  6567.  
  6568.  
  6569. asmflg:    defb    ' '
  6570.     defb    0
  6571.  
  6572. lcmd:    defb    ' '
  6573. em???:    defb    ' ??'
  6574.     defb    0
  6575.  
  6576. mldg:
  6577.     defb    'Loading: '
  6578.     defb    0
  6579.  
  6580. mfilnf:
  6581.     defb    'File Not Found'
  6582.     defb    cr,lf,00
  6583.  
  6584.  
  6585. mlodm:
  6586.     defb    'Loaded:  '
  6587.     defb    0
  6588. mlodpg:
  6589.  
  6590.     defb    'Pages:   '
  6591.     defb    0
  6592.  
  6593. msntx:
  6594.     defb    'Syntax Error'
  6595.     defb    cr,lf,0
  6596.  
  6597. mmem??:    defb    'Out Of Memory'
  6598.     defb    0
  6599.  
  6600. mcntu:    defb    ' - Continue? '
  6601.     defb    0
  6602.  
  6603. mireg:
  6604.     defb    'IR: '
  6605.     defb    0
  6606.     page
  6607.  
  6608. z80fd:    defb    009h,019h,02bh
  6609.     defb    023h,029h,039h,0e1h
  6610.     defb    0e3h,0e5h,0e9h,0f9h
  6611. z80fdl    equ    $-z80fd
  6612.  
  6613. z80f4:    defb    021h,022h,02ah,036h,0cbh
  6614. z80f4l    equ    $-z80f4
  6615.  
  6616.  
  6617. z801:    defb    0c0h,0e9h,0c9h,0d8h
  6618.     defb    0d0h,0c8h,0e8h,0e0h
  6619.     defb    0f8h,0f0h
  6620. z801l    equ    $-z801
  6621.  
  6622.  
  6623. z802:    defb    036h,0c6h,0ceh,0d3h
  6624.     defb    0d6h,0dbh,0deh,0e6h
  6625.     defb    0eeh,0f6h,0feh
  6626. z802c:    defb    018h,038h,030h
  6627.     defb    028h,020h,010h
  6628. z802l    equ    $-z802
  6629. z802cl    equ    $-z802c
  6630.  
  6631.  
  6632. z80r:
  6633. z803:    defb    001h,011h,021h,022h
  6634.     defb    02ah,031h,032h,03ah
  6635.  
  6636. z803s:    defb    0cdh
  6637.     defb    0dch,0d4h,0cch,0c4h
  6638.     defb    0ech,0e4h,0fch,0f4h
  6639.  
  6640. z803sl    equ    $-z803s            ;number    of call    instructions
  6641.  
  6642. z803c:    defb    0c3h
  6643.     defb    0dah,0d2h,0cah,0c2h
  6644.     defb    0eah,0e2h,0fah,0f2h
  6645.  
  6646. z803l    equ    $-z803            ;number    of 3 byte instructions
  6647. z803cl    equ    $-z803s            ;number    of 3 byte pc mod instructions
  6648.  
  6649. z80ed:    defb    043h,04bh,053h
  6650.     defb    05bh,073h,07bh
  6651.  
  6652. z80edl    equ    $-z80ed
  6653.  
  6654. z80rl    equ    $-z80r            ;number    relocatable z80    instructions
  6655.  
  6656. z80f3:
  6657.     defb    034h,035h,046h,04eh
  6658.     defb    056h,05eh,066h,06eh
  6659.     defb    070h,071h,072h,073h
  6660.     defb    074h,075h,077h,07eh
  6661.     defb    086h,08eh,096h,09eh
  6662.     defb    0a6h,0aeh,0b6h,0beh
  6663. z80f3l    equ    $-z80f3
  6664.     page
  6665. ;***********************************************************************
  6666. ;*
  6667. ;*
  6668. ;*
  6669. ;*
  6670. ;*
  6671. ;***********************************************************************
  6672.  
  6673.     org    ($+3) and 0fffch
  6674. zopcpt:
  6675.     defb    022h,01ch,01ch,015h    ;nop    ld    ld    inc    00 - 03
  6676.     defb    015h,00ch,01ch,031h    ;inc    dec    ld    rlca    04 - 07
  6677.     defb    010h,000h,01ch,00ch    ;ex    add    ld    dec    08 - 0b
  6678.     defb    015h,00ch,01ch,036h    ;inc    dec    ld    rrca    0c - 0f
  6679.     defb    00eh,01ch,01ch,015h    ;djnz    ld    ld    inc    10 - 13
  6680.     defb    015h,00ch,01ch,02fh    ;inc    dec    ld    rla    14 - 17
  6681.     defb    01bh,000h,01ch,00ch    ;jr    add    ld    dec    18 - 1b
  6682.     defb    015h,00ch,01ch,034h    ;inc    dec    ld    rra    1c - 1f
  6683.     defb    01bh,01ch,01ch,015h    ;jr    ld    ld    inc    20 - 23
  6684.     defb    015h,00ch,01ch,00bh    ;inc    dec    ld    daa    24 - 27
  6685.     defb    01bh,000h,01ch,00ch    ;jr    add    ld    dec    28 - 2b
  6686.     defb    015h,00ch,01ch,00ah    ;inc    dec    ld    cpl    2c - 2f
  6687.     defb    01bh,01ch,01ch,015h    ;jr    ld    ld    inc    30 - 33
  6688.     defb    015h,00ch,01ch,03ah    ;inc    dec    ld    scf    34 - 37
  6689.     defb    01bh,000h,01ch,00ch    ;jr    add    ld    dec    38 - 3b
  6690.     defb    015h,00ch,01ch,004h    ;inc    dec    ld    ccf    3c - 3f
  6691.  
  6692.  
  6693.     defb    014h,026h,039h,01ch    ;in    out    sbc    ld    ed 40
  6694.     defb    021h,02dh,013h,01ch    ;neg    retn    im    ld
  6695.     defb    014h,026h,001h,01ch    ;in    out    adc    ld
  6696.     defb    022h,02ch,022h,01ch    ;....    reti    ...    ld
  6697.     defb    014h,026h,039h,01ch    ;in    out    sbc    ld
  6698.     defb    022h,022h,013h,01ch    ;...    ...    im    ld
  6699.     defb    014h,026h,001h,01ch    ;in    out    adc    ld
  6700.     defb    022h,022h,013h,01ch    ;...    ...    im    ld
  6701.     defb    014h,026h,039h,022h    ;in    out    sbc    ...
  6702.     defb    022h,022h,002h,037h    ;...    ...    ...    rrd
  6703.     defb    014h,026h,001h,022h    ;in    out    adc    ...
  6704.     defb    044h,045h,046h,032h    ;defb*    defw*    ddb*    rld
  6705.     defb    043h,047h,039h,01ch    ;org*    equ*    sbc    ld    ed 70
  6706.     defb    022h,022h,022h,022h    ;...    ...    ...    ...
  6707.     defb    014h,026h,001h,01ch    ;in    out    adc    ld
  6708.     defb    022h,022h,022h,022h    ;...    ...    ...    ...    ed 7f
  6709.  
  6710.  
  6711.     defb    01fh,008h,018h,028h    ;ldi    cpi    ini    outi
  6712.     defb    022h,022h,022h,022h    ;...    ...    ...    ...
  6713.     defb    01dh,006h,016h,027h    ;ldd    cpd    ind    outd
  6714.     defb    022h,022h,022h,022h    ;...    ...    ...    ...
  6715.     defb    020h,009h,019h,025h    ;ldir    cpir    inir    otir
  6716.     defb    022h,022h,022h,022h    ;...    ...    ...    ...
  6717.     defb    01eh,007h,017h,024h    ;lddr    cpdr    indr    otdr
  6718.     defb    022h,022h,022h,044h    ;...    ....    ....    defb*
  6719.  
  6720.  
  6721.     defb    02bh,029h,01ah,01ah    ;ret    pop    jp    jp    c0 - c3
  6722.     defb    003h,02ah,000h,038h    ;call    push    add    rst    c4 - c7
  6723.     defb    02bh,02bh,01ah,022h    ;ret    ret    jp    ...    c8 - cb
  6724.     defb    003h,003h,001h,038h    ;call    call    adc    rst    cc - cf
  6725.     defb    02bh,029h,01ah,026h    ;ret    pop    jp    out    d0 - d3
  6726.     defb    003h,02ah,03eh,038h    ;call    push    sub    rst    d4 - d7
  6727.     defb    02bh,011h,01ah,014h    ;ret    exx    jp    in    d8 - db
  6728.     defb    003h,022h,039h,038h    ;call    ...    sbc    rst    dc - df
  6729.     defb    02bh,029h,01ah,010h    ;ret    pop    jp    ex    e0 - e3
  6730.     defb    003h,02ah,002h,038h    ;call    push    and    rst    e4 - e7
  6731.     defb    02bh,01ah,01ah,010h    ;ret    jp    jp    ex    e8 - eb
  6732.     defb    003h,022h,03fh,038h    ;call    ...    xor    rst    ec - ef
  6733.     defb    02bh,029h,01ah,00dh    ;ret    pop    jp    di    f0 - f3
  6734.     defb    003h,02ah,023h,038h    ;call    push    or    rst    f4 - f7
  6735.     defb    02bh,01ch,01ah,00fh    ;ret    ld    jp    ei    f8 - fb
  6736.     defb    003h,022h,005h,038h    ;call    ...    cp    rst    fc - ff
  6737.  
  6738.     defb    000h,001h,03eh,039h    ;add    adc    sub    sbc
  6739.     defb    002h,03fh,023h,005h    ;and    xor    or    cp
  6740.  
  6741.  
  6742.     defb    030h,035h,02eh,033h    ;rlc    rrc    rl    rr
  6743.     defb    03bh,03ch,022h,03dh    ;sla    sra    ...    srl
  6744.     defb    022h,040h,041h,042h    ;...    bit    res    set
  6745.  
  6746.  
  6747.     defb    022h,022h,022h,012h    ;...    ...    ...    halt
  6748.  
  6749.  
  6750.     defb    01ch,01ch,01ch,01ch    ;ld    ld    ld    ld
  6751.     defb    01ch,01ch,01ch,01ch    ;ld    ld    ld    ld
  6752.  
  6753.     page
  6754. ;****************************************************************************
  6755. ;*
  6756. ;*            table of first operands
  6757. ;*
  6758. ;****************************************************************************
  6759.  
  6760. zopnd1:
  6761.     defb    0ffh,00eh,08eh,00eh    ;00 - 03
  6762.     defb    006h,006h,006h,0ffh    ;04 - 07
  6763.     defb    00dh,018h,001h,00eh    ;08 - 0b
  6764.     defb    007h,007h,007h,0ffh    ;0c - 0f
  6765.     defb    01bh,00fh,08fh,00fh    ;10 - 13
  6766.     defb    004h,004h,004h,0ffh    ;14 - 17
  6767.     defb    01bh,018h,001h,00fh    ;18 - 1b
  6768.     defb    005h,005h,005h,0ffh    ;1c - 1f
  6769.     defb    013h,018h,09dh,018h    ;20 - 23
  6770.     defb    002h,002h,002h,0ffh    ;24 - 27
  6771.     defb    011h,018h,018h,018h    ;28 - 2b
  6772.     defb    003h,003h,003h,0ffh    ;2c - 2f
  6773.     defb    012h,009h,09dh,009h    ;30 - 33
  6774.     defb    098h,098h,098h,0ffh    ;34 - 37
  6775.     defb    007h,018h,001h,009h    ;38 - 3b
  6776.     defb    001h,001h,001h,0ffh    ;3c - 3f
  6777.  
  6778.     defb    006h,087h,000h,09dh    ;40 - 43
  6779.     defb    0ffh,0ffh,01fh,00ch    ;44 - 47
  6780.     defb    007h,087h,000h,00eh    ;48 - 4b
  6781.     defb    0ffh,0ffh,0ffh,00bh    ;4c - 4f
  6782.     defb    004h,087h,000h,09dh    ;50 - 53
  6783.     defb    0ffh,0ffh,01fh,001h    ;54 - 57
  6784.     defb    005h,087h,000h,00fh    ;58 - 5b
  6785.     defb    0ffh,0ffh,01fh,001h    ;5c - 5f
  6786.     defb    002h,087h,000h,0ffh    ;60 - 63
  6787.     defb    0ffh,0ffh,0ffh,0ffh    ;64 - 67
  6788.     defb    003h,087h,000h,0ffh    ;68 - 6b
  6789.     defb    01ch,01dh,01dh,0ffh    ;6c - 6f    defb  defw  ddb
  6790.     defb    01dh,01dh,000h,09dh    ;70 - 73    org   equ
  6791.     defb    0ffh,0ffh,0ffh,0ffh    ;74 - 77
  6792.     defb    001h,087h,000h,009h    ;78 - 7b
  6793.     defb    0ffh,0ffh,0ffh,0ffh    ;7c - 7f
  6794.  
  6795.     defb    0ffh,0ffh,0ffh,0ffh    ;a0 - bf
  6796.     defb    0ffh,0ffh,0ffh,0ffh    ;a4 - a7
  6797.     defb    0ffh,0ffh,0ffh,0ffh    ;a8 - ab
  6798.     defb    0ffh,0ffh,0ffh,0ffh    ;ac - af
  6799.     defb    0ffh,0ffh,0ffh,0ffh    ;b0 - b3
  6800.     defb    0ffh,0ffh,0ffh,0ffh    ;b4 - b7
  6801.     defb    0ffh,0ffh,0ffh,0ffh    ;b8 - bb
  6802.     defb    0ffh,0ffh,00fh,0ffh    ;bc - bf
  6803.  
  6804.     defb    013h,00eh,013h,01dh    ;c0 - c3
  6805.     defb    013h,00eh,001h,01eh    ;c4 - c7
  6806.     defb    011h,0ffh,011h,0ffh    ;c8 - cb
  6807.     defb    011h,01dh,001h,01eh    ;cc - cf
  6808.     defb    012h,00fh,012h,09ch    ;d0 - d3
  6809.     defb    012h,00fh,01ch,01eh    ;d4 - d7
  6810.     defb    007h,0ffh,007h,001h    ;d8 - db
  6811.     defb    007h,0ffh,001h,01eh    ;dc - df
  6812.     defb    015h,018h,015h,089h    ;e0 - e3
  6813.     defb    015h,018h,01ch,01eh    ;e4 - e7
  6814.     defb    014h,098h,014h,00fh    ;e8 - eb
  6815.     defb    014h,0ffh,01ch,01eh    ;ec - ef
  6816.     defb    00ah,00dh,00ah,0ffh    ;f0 - f3
  6817.     defb    00ah,00dh,01ch,01eh    ;f4 - f7
  6818.     defb    016h,009h,016h,0ffh    ;f8 - fb
  6819.     defb    016h,0ffh,01ch,01eh    ;fc - ff
  6820.  
  6821.  
  6822.     defb    001h,001h,019h,001h    ;8 bit logic and arithmetic
  6823.     defb    019h,019h,019h,019h    ;
  6824.  
  6825.  
  6826.     defb    019h,019h,019h,019h    ;shift and rotate
  6827.     defb    019h,019h,019h,019h    ;
  6828.     defb    0ffh,01fh,01fh,01fh    ;bit - res - set
  6829.  
  6830.     defb    0ffh,0ffh,0ffh,0ffh    ;filler
  6831.  
  6832.     defb    01ah,01ah,01ah,01ah    ;8 bit load
  6833.     defb    01ah,01ah,01ah,01ah    ;
  6834.  
  6835.     page
  6836. ;***********************************************************************
  6837. ;*
  6838. ;*            table of second    operands
  6839. ;*
  6840. ;***********************************************************************
  6841.  
  6842.  
  6843. zopnd2:
  6844.     defb    0ffh,01dh,001h,0ffh    ;00 - 03
  6845.     defb    0ffh,0ffh,01ch,0ffh    ;04 - 07
  6846.     defb    00dh,00eh,08eh,0ffh    ;08 - 0b
  6847.     defb    0ffh,0ffh,01ch,0ffh    ;0c - 0f
  6848.     defb    0ffh,01dh,001h,0ffh    ;10 - 13
  6849.     defb    0ffh,0ffh,01ch,0ffh    ;14 - 17
  6850.     defb    0ffh,00fh,08fh,0ffh    ;18 - 1b
  6851.     defb    0ffh,0ffh,01ch,0ffh    ;1c - 1f
  6852.     defb    01bh,01dh,018h,0ffh    ;20 - 23
  6853.     defb    0ffh,0ffh,01ch,0ffh    ;24 - 27
  6854.     defb    01bh,018h,09dh,0ffh    ;28 - 2b
  6855.     defb    0ffh,0ffh,01ch,0ffh    ;2c - 2f
  6856.     defb    01bh,01dh,001h,0ffh    ;30 - 33
  6857.     defb    0ffh,0ffh,01ch,0ffh    ;34 - 37
  6858.     defb    01bh,009h,09dh,0ffh    ;38 - 3b
  6859.     defb    0ffh,0ffh,01ch,0ffh    ;3c - 3f
  6860.  
  6861.  
  6862.     defb    087h,006h,00eh,00eh    ;40 - 43
  6863.     defb    0ffh,0ffh,0ffh,001h    ;44 - 47
  6864.     defb    087h,007h,00eh,09dh    ;48 - 4b
  6865.     defb    0ffh,0ffh,0ffh,001h    ;4c - 4f
  6866.     defb    087h,004h,00fh,00fh    ;50 - 53
  6867.     defb    0ffh,0ffh,0ffh,00ch    ;54 - 57
  6868.     defb    087h,005h,00fh,09dh    ;58 - 5b
  6869.     defb    0ffh,0ffh,0ffh,00bh    ;5c - 5f
  6870.     defb    087h,002h,000h,0ffh    ;60 - 63
  6871.     defb    0ffh,0ffh,0ffh,0ffh    ;64 - 67
  6872.     defb    087h,003h,000h,0ffh    ;68 - 6b
  6873.     defb    0ffh,0ffh,0ffh,0ffh    ;6c - 6f
  6874.     defb    0ffh,0ffh,009h,009h    ;70 - 73
  6875.     defb    0ffh,0ffh,0ffh,0ffh    ;74 - 77
  6876.     defb    087h,001h,009h,09dh    ;78 - 7b
  6877.     defb    0ffh,0ffh,0ffh,0ffh
  6878.  
  6879.     defb    0ffh,0ffh,0ffh,0ffh    ;a0 - bf
  6880.     defb    0ffh,0ffh,0ffh,0ffh    ;a4 - a7
  6881.     defb    0ffh,0ffh,0ffh,0ffh    ;a8 - ab
  6882.     defb    0ffh,0ffh,0ffh,0ffh    ;ac - af
  6883.     defb    0ffh,0ffh,0ffh,0ffh    ;b0 - b3
  6884.     defb    0ffh,0ffh,0ffh,0ffh    ;b4 - b7
  6885.     defb    0ffh,0ffh,0ffh,0ffh    ;b8 - bb
  6886.     defb    0ffh,0ffh,00fh,0ffh    ;bc - bf
  6887.  
  6888.     defb    0ffh,0ffh,01dh,0ffh    ;c0 - c3
  6889.     defb    01dh,0ffh,01ch,0ffh    ;c4 - c7
  6890.     defb    0ffh,0ffh,01dh,0ffh    ;c8 - cb
  6891.     defb    01dh,0ffh,01ch,0ffh    ;cc - cf
  6892.     defb    0ffh,0ffh,01dh,001h    ;d0 - d3
  6893.     defb    01dh,0ffh,0ffh,0ffh    ;d4 - d7
  6894.     defb    0ffh,0ffh,01dh,09ch    ;d8 - db
  6895.     defb    01dh,0ffh,01ch,0ffh    ;dc - df
  6896.     defb    0ffh,0ffh,01dh,018h    ;e0 - e3
  6897.     defb    01dh,0ffh,0ffh,0ffh    ;e4 - e7
  6898.     defb    0ffh,0ffh,01dh,000h    ;e8 - eb
  6899.     defb    01dh,0ffh,0ffh,0ffh    ;ec - ef
  6900.     defb    0ffh,0ffh,01dh,0ffh    ;f0 - f3
  6901.     defb    01dh,0ffh,0ffh,0ffh    ;f4 - f7
  6902.     defb    0ffh,018h,01dh,0ffh    ;f8 - fb
  6903.     defb    01dh,0ffh,0ffh,0ffh    ;fc - ff
  6904.  
  6905.     defb    019h,019h,0ffh,019h    ;8 bit logic and arithmetic
  6906.     defb    0ffh,0ffh,0ffh,0ffh    ;
  6907.  
  6908.     defb    0ffh,0ffh,0ffh,0ffh    ;shift and rotate
  6909.     defb    0ffh,0ffh,0ffh,0ffh    ;
  6910.     defb    0ffh,019h,019h,019h    ;bit - res - set
  6911.  
  6912.     defb    0ffh,0ffh,0ffh,0ffh
  6913.  
  6914.     defb    019h,019h,019h,019h    ;8 bit load
  6915.     defb    019h,019h,019h,019h
  6916.     page
  6917.  
  6918. ;***********************************************************************
  6919. ;*
  6920. ;*            table of op code names
  6921. ;*
  6922. ;***********************************************************************
  6923.  
  6924.  
  6925. zopcnm:
  6926.     defb    'ADD ADC AND CALL'
  6927.     defb    'CCF CP  CPD CPDR'
  6928.     defb    'CPI CPIRCPL DAA '
  6929.     defb    'DEC DI  DJNZEI  '
  6930.     defb    'EX  EXX HALTIM  '
  6931.     defb    'IN  INC IND INDR'
  6932.     defb    'INI INIRJP  JR  '
  6933.     defb    'LD  LDD LDDRLDI '
  6934.     defb    'LDIRNEG NOP OR  '
  6935.     defb    'OTDROTIROUT OUTD'
  6936.     defb    'OUTIPOP PUSHRET '
  6937.     defb    'RETIRETNRL  RLA '
  6938.     defb    'RLC RLCARLD RR  '
  6939.     defb    'RRA RRC RRCARRD '
  6940.     defb    'RST SBC SCF SLA '
  6941.     defb    'SRA SRL SUB XOR '
  6942.     defb    'BIT RES SET ORG '
  6943.     defb    'DEFBDEFWDDB EQU '
  6944.  
  6945.  
  6946.  
  6947.  
  6948. op1000:
  6949.     defb     0fdh,0ddh,0edh,0cbh
  6950.  
  6951.  
  6952.  
  6953. pswbit:    defb    10001000b        ;minus
  6954.     defb    10000000b        ;positive
  6955.     defb    00001100b        ;even parity
  6956.     defb    00000100b        ;odd parity
  6957.     defb    01001000b        ;zero
  6958.     defb    01000000b        ;not zero
  6959.     defb    00001001b        ;carry
  6960.     defb    00000001b        ;no carry
  6961.  
  6962. pswmap:    defb    18,07,19,17,21,20,10,22
  6963. pswcnt    equ    $-pswmap
  6964.  
  6965.  
  6966. regmap:
  6967.     defb    87h,01h,07h,06h,05h,04h
  6968.     defb    03h,02h,95h,93h,91h,18h
  6969.     defb    19h,81h,83h,85h,97h
  6970.  
  6971. regptr:
  6972.     defb    0dh,0eh,0fh,00h
  6973.     defb    8dh,8eh,8fh,80h
  6974.     defb    0ah,09h,08h,10h
  6975.  
  6976. siotbl:    defb    0f5h,0f7h
  6977.  
  6978. symflg:    defb    0ffh        ;symbol    table flag   00    - table    present
  6979.                 ;             ff    - no table
  6980.  
  6981. bsiz:                ;dump block size storage
  6982. bsizlo:    defb    0        ;     lo order
  6983. bsizhi:    defb    1        ;     hi order
  6984. blkptr:    defw    100h        ;dump block address
  6985.  
  6986. loadb:    defw    100h        ;z8e load bias for lldr command
  6987. loadn:    defw    00        ;end of load address
  6988.  
  6989. asmbpc:                ;next pc location for assembly
  6990. zasmpc:    defw    100h        ;next pc location for disassemble
  6991.                 ;default at load time: start of    tpa
  6992. zasmfl:    defw    00        ;first disassembled address on jdbg screen
  6993.  
  6994.  
  6995. from:
  6996. oprn01:
  6997. rlbias:
  6998. lines:
  6999. exampt:
  7000. endw:
  7001. zasmnx:    defb    0        ;address of next instruction to    disassemble
  7002. oprx01:    defb    0
  7003. bias:
  7004. biaslo:
  7005. zasmct:    defb    0        ;disassembly count
  7006. biashi:
  7007. oprn02:    defb    0
  7008. oprx02:
  7009. zasmwt:    defw    0        ;disassembly count - working tally
  7010. opnflg:    defb    0        ;00 - operand 1   ff - operand 2   zasm
  7011.                 ;and input character storage for interactive
  7012.                 ;disassembly 
  7013. quoflg:    defb    0
  7014. wflag:    defb    0ffh        ;trace subroutine flag:    nz - trace subs
  7015.                 ;             z - no    trace
  7016.  
  7017. nstep:
  7018. nstepl:    defb    0
  7019. nsteph:    defb    0
  7020.  
  7021. sbps:    defb    0        ;number    of step    breakpoints
  7022. bps:    defb    0        ;number    of normal breakpoints
  7023.  
  7024. zmflag:    defb    0
  7025. zasmf:    defb    0
  7026. execbf:                ;execute buffer    for relocated code
  7027. jlines:
  7028. parenf:    
  7029. nument:    defb    0        ;number    of digits entered
  7030. delim:    defb    0        ;argument delimeter character
  7031.     defb    0
  7032. base10:    defb    0
  7033. jmp2jp:    defb    0
  7034. jmp2:    defb    0
  7035. dwrite:
  7036. cflag:    defb    0
  7037.  
  7038. ikey:
  7039. zasmkv:
  7040. jmp:    defb    0
  7041. mexp:
  7042. jmplo:    defb    0
  7043. strngf:
  7044. jmphi:    defb    0
  7045. timer:
  7046. first:    defb    0
  7047. regtrm:    defb    0
  7048. trmntr: defb    0
  7049. isympt:    defw    0
  7050.  
  7051. jropnd:
  7052. pass2:    defw    0
  7053.  
  7054. fndsym:    defw    0
  7055.  
  7056.     if    ASMB
  7057. maxlen:
  7058.     else
  7059. maxlen::
  7060.     endif
  7061.     defw    14
  7062.  
  7063. maxlin:    defw    62
  7064.  
  7065. fwndow:    defb    00
  7066.  
  7067. nlmask:    defb    00    
  7068.     
  7069.     if    ASMB
  7070. case:
  7071.     else
  7072. case::
  7073.     endif
  7074.     defb    0ffh        ;flag to indicate case of output
  7075.                 ;nz - lower   z - upper
  7076.  
  7077. jstepf:    defb    0ffh        ;00 -   screen is intact, if user wants j 
  7078.                 ;       single step no need to repaint screen, 
  7079.                 ;       just move arrow.
  7080.                 ;01   - user wants single-step j command
  7081.                 ;else - j screen corrupted by non-j command
  7082.  
  7083. lastro:    defb    03
  7084.  
  7085.     if    ASMB
  7086. rowb4?:
  7087.     else
  7088. rowb4?::
  7089.     endif
  7090.     if jterm            ;my terminal uses xy addressing
  7091.     defb    0
  7092.     else            ;most others use yx
  7093.     defb    1
  7094.     endif
  7095.  
  7096.     if    ASMB
  7097. mxycp:
  7098.     else
  7099. mxycp::
  7100.     endif
  7101.     if jterm
  7102.     defb    1,9        ;jrs special (Datapoint 8227)
  7103.     else
  7104.     defb    2,1bh,'='    ;ADM 3a in "standard" version
  7105.     defb    0,0,0,0,0,0,0,0
  7106.     endif
  7107.  
  7108. xyrow:    defb    0
  7109. xycol:    defb    0
  7110.  
  7111.     if    ASMB
  7112. row:
  7113.     else
  7114. row::
  7115.     endif
  7116.     if jterm                ;my terminal uses no bias for
  7117.     defb    0            ;cursor coordinates
  7118.     else
  7119.     defb    ' '            ;bias for most other terminals
  7120.     endif
  7121.     if    ASMB
  7122. column:
  7123.     else
  7124. column::
  7125.     endif
  7126.     if jterm                ;see above
  7127.     defb    0
  7128.     else
  7129.     defb    ' '
  7130.     endif
  7131.  
  7132. wnwtab:    defw    0
  7133. wnwsiz:    defw    0
  7134.  
  7135. port:    defw    0
  7136.  
  7137. brktbl:    defs    (maxbp+2)*3
  7138. psctbl:    defs    maxbp*2
  7139.  
  7140.  
  7141. regcon:
  7142. afreg:
  7143. freg:    defb    00
  7144.     defb    00
  7145. bcreg:    defw    00
  7146. dereg:    defw    00
  7147. hlreg:    defw    00
  7148. afpreg:    defw    00
  7149. bcpreg:    defw    00
  7150. depreg:    defw    00
  7151. hlpreg:    defw    00
  7152. pcreg:
  7153. pcregl:    defb    00
  7154. pcregh:    defb    01
  7155. spreg:    defw    00
  7156. ixreg:    defw    00
  7157. iyreg:    defw    00
  7158.  
  7159. regsiz    equ    $-regcon
  7160.  
  7161. rreg:    defb    00
  7162. ireg:    defb    00
  7163.  
  7164.  
  7165. fstart:    defw    0
  7166. argbc:    defw    0
  7167. argbpt:    defw    argbf
  7168.  
  7169. regsav    equ    $        ;storage for register contents in between bps
  7170.                 ;while jdbg is in control
  7171.  
  7172. window    equ    regsav+regsiz    ;memory window save area
  7173.  
  7174. argbsz    equ    62
  7175.  
  7176. argbf:    defs    argbsz
  7177.  
  7178. fcb    equ     argbf+argbsz-36 ;cp/m file control block
  7179. fcbnam    equ    fcb+1        ;start of file name in fcb
  7180. fcbtyp    equ    fcbnam+8    ;start of file type in fcb
  7181. fcbext    equ    fcbtyp+3    ;current extent    number
  7182. nfcb    equ    $        ;last byte of fcb plus one
  7183.  
  7184. gpbsiz    equ    164        ;size of general purpose buffer
  7185.  
  7186. symbuf:
  7187. objbuf:                ;object    code buffer
  7188.     rept    gpbsiz
  7189.     defb    0
  7190.     endm
  7191. inbfsz    equ    gpbsiz/2
  7192. inbfmx    equ    objbuf+4    ;input buffer -    max byte count storage
  7193. inbfnc    equ    inbfmx+1    ;          -    number chars read in
  7194. inbf    equ    inbfnc+1    ;          -    starting address
  7195. inbfl    equ    inbfsz-1    ;          -    last relative position
  7196. ninbf    equ    inbf+inbfl    ;          -    address    of last    char
  7197.  
  7198. prsbfz    equ    gpbsiz/2
  7199. prsbf    equ    inbf+inbfsz    ;parse buffer -    starting address
  7200. lprsbf    equ    prsbf+prsbfz-1    ;          -    last char of parse buf
  7201. nprsbf    equ    lprsbf+1    ;          -    end address plus one
  7202.  
  7203. nzasm    equ    $        ;end of disassembly buffer
  7204. zasmbf    equ    nzasm-128    ;start of disassembly buffer
  7205.  
  7206.     defs    40
  7207. stack:
  7208. nmem    equ    ((($+255) and 0ff00h)-z8eorg) and 0ff00h
  7209. ;    was    (256*(($+255)/256)-z8eorg) and 0ff00h
  7210.  
  7211.     if M80
  7212.     .list            ;enable printer output for symbol table
  7213.     endif
  7214.     end
  7215.