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 / ZSYS / ZNODE-12 / I / ITOZ14.LBR / ITOZ14.ZZ0 / ITOZ14.Z80
Text File  |  1992-04-05  |  39KB  |  1,805 lines

  1. ; ITOZ.Z80
  2. ;
  3. Vers    equ    14        ; release version
  4. SubVers    equ    ' '        ; revision level
  5. ;
  6. ; For documentation and version history, see accompanying IOTZ.HLP file.
  7. ;
  8. ;    Gene Pizzetta
  9. ;    481 Revere St.
  10. ;    Revere, MA 02151
  11. ;
  12. ;    Voice:  (617) 284-0891
  13. ;    Newton Centre Z-Node:  (617) 965-7259
  14. ;    Ladera Z-Node Central:  (310) 670-9465
  15. ;
  16. ; System addresses . . .
  17. ;
  18. CpmFcb    equ    5Ch        ; default FCB (input)
  19. AltFcb    equ    6Ch        ; alternate FCB (output)
  20. CpmDma    equ    80h        ; default DMA buffer (write buffer)
  21. ;
  22. ; ASCII . . .
  23. ;
  24. CtrlC    equ    03h        ; ^C
  25. LF    equ    0Ah        ; line feed
  26. CR    equ    0Dh        ; carriage return
  27. CpmEof    equ    1Ah        ; CP/M end-of-file (^Z)
  28. ;
  29. ; Externals . . .
  30. ;
  31.     .request    zslib,z3lib,syslib
  32. ;
  33.     ext    zcheck,eatspc,eatnspc,paudc,getstp,setstp    ; ZSLIB
  34.     ext    gcomnam,comnam,hvtinit,hvdinit,hvon,hvoff
  35.     ext    z3init,envptr,gzmtop,getquiet,puter2,inverror    ; Z3LIB
  36.     ext    pfn2,eprint,epstr,cout,phlfdc,retud,logud    ; SYSLIB
  37.     ext    condin,getmtop,initfcb,setdma,f$open,f$make
  38.     ext    f$close,f$read,f$write,f$delete,f$rename,codend
  39. ;
  40.     jp    Start
  41. ;
  42.     db    'Z3ENV',1    ; ZCPR3 header
  43. Z3EAdr:    dw    0
  44. ;
  45. ; Configuration area . . .
  46. ;
  47.     dw    0        ; filler
  48.     db    'ITOZ'        ; for ZCNFG and ADNAME
  49.     db    Vers/10+'0',Vers mod 10+'0','  '
  50.     dw    MTABLE        ; MTABLE address for ADNAME
  51.     db    0        ; storage for ADNAME character count
  52. AstFlg:    db    0FFh        ; FFh=replace "*" with semi-colon, 0=don't
  53. ClnFlg:    db    0FFh        ; FFh=colons after labels, 0=as is
  54. DbFlag:    db    0FFh        ; FFh=use DB/DW/DS, 0=use DEFB/DEFW/DEFS
  55. QtFlag:    db    0        ; FFh=quiet, 0=verbose
  56. AbtFlg:    db    0        ; FFh=error on user abort, 0 = no error
  57. ;
  58. ; Start of program . . .
  59. ;
  60. Start:    ld    hl,(Z3EAdr)    ; initialize environment
  61.     call    zcheck
  62.     call    z3init
  63.     ld    (Stack),sp    ; save old stack
  64.     ld    sp,Stack    ; ..and set up new one
  65.     call    Init        ; initialize data area
  66.     ld    ix,CpmFcb    ; point to the input FCB
  67.     ld    a,(ix+1)
  68.     cp    ' '        ; anything there?
  69.     jp    z,Usage        ; (no)
  70.     cp    '/'        ; help request?
  71.     jr    nz,Start1    ; (no)
  72.     ld    a,(ix+2)
  73.     cp    '/'
  74.     jp    z,Usage        ; (yes)
  75. Start1:    call    GetDU        ; get source directory
  76.     ld    (InDir),bc    ; ..and save it
  77.     ld    ix,AltFcb    ; check for output directory (if any)
  78.     call    GetDU        ; ..get it (or the default if none)
  79.     ld    (OutDir),bc
  80.     ld    hl,CpmFcb+1    ; prepare to use default output filename
  81.     ld    bc,DftTyp    ; ..and default filetype
  82.     ld    a,(ix+1)    ; check for output filename
  83.     cp    ' '        ; anything there?
  84.     jr    z,Start2    ; (no, none given)
  85.     cp    '/'        ; options?
  86.     jr    z,Start2    ; (must be)
  87.     ld    hl,AltFcb+1    ; we've got a filename, so move it
  88.     ld    bc,AltFcb+9    ; ..and filetype
  89. Start2:    push    bc        ; save filetype pointer
  90.     push    hl        ; save filename pointer
  91.     ld    de,OutFcb+1    ; move filename
  92.     ld    bc,8
  93.     push    bc        ; save count
  94.     ldir
  95.     pop    bc        ; recover count
  96.     pop    hl        ; recover filename pointer
  97.     ld    de,OutFn+1    ; point to final filename storage
  98.     ldir            ; ..and put it there also
  99.     pop    hl        ; recover filetype pointer in HL
  100.     ld    c,3        ; DE points to final filetype storage
  101.     ldir            ; ..and move it also
  102.     ld    hl,'$$'        ; put temporary filetype ($$$)
  103.     ld    a,h        ; into FCB
  104.     ld    (OutFcb+9),hl
  105.     ld    (OutFcb+11),a
  106.     call    GetOpt        ; check for command line options
  107.     ld    a,(OpQFlg)
  108.     or    a
  109.     jr    nz,QSkip1
  110.     call    eprint
  111.     db    'Translating ',0
  112.     call    hvon
  113.     ld    bc,(InDir)
  114.     call    PrtDU
  115.     ld    de,CpmFcb+1    ; point to filename
  116.     call    pfn2        ; ..and print it
  117.     call    hvoff
  118. QSkip1:    ld    hl,CpmFcb+1
  119.     call    ChkAmb        ; check for ambiguous filename
  120.     call    InDU
  121.     ld    de,CpmFcb    ; point to FCB
  122.     call    initfcb        ; initialize it
  123.     call    f$open        ; ..and open file
  124.     jr    z,OpenOK    ; (opened okay)
  125.     ld    a,10        ; error code
  126.     call    eprint
  127.     db    ' File not found.',0
  128.     jp    ErExit
  129. ;
  130. OpenOK:    ld    a,(OpQFlg)
  131.     or    a
  132.     jr    nz,QSkip2
  133.     call    eprint
  134.     db    ' to ZILOG mnemonics as ',0
  135.     call    hvon
  136.     ld    bc,(OutDir)
  137.     call    PrtDU
  138.     ld    de,OutFn+1    ; point to output filename
  139.     call    pfn2        ; ..and print it
  140.     call    hvoff
  141.     call    eprint
  142.     db    ' .. ',0
  143. QSkip2:    ld    hl,OutFn+1
  144.     call    ChkAmb        ; check for ambiguous filename
  145.     call    OutDU
  146.     ld    de,OutFcb    ; point to FCB
  147.     call    initfcb
  148.     call    f$make        ; create an output file
  149.     inc    a        ; A = FFh on error
  150.     jr    nz,RdLoop    ; (created okay)
  151.     call    ClsIn
  152.     ld    a,11        ; error code
  153.     call    eprint
  154.     db    'No directory space.',0
  155.     jp    ErExit
  156. ;
  157. RdLoop:    call    ReadF         ; read file to MemTop
  158. ScLoop:    ld    de,(InPtr)
  159.     ld    a,(de)        ; get 1st character in next line
  160.     cp    CpmEof        ; end of file?
  161.     jr    z,Done        ; (yes)
  162.     ld    (IBoL),de    ; save start of program line
  163.     ld    hl,(OutPtr)
  164.     ld    (OBoL),hl    ; save start of result line
  165.     xor    a
  166.     ld    (CmtFlg),a    ; zero comment flag (and carry)
  167.     ld    hl,(LstByt)    ; get end of read buffer
  168.     sbc    hl,de        ; get difference to beginning of next line
  169.     jr    z,RdLoop    ; if next line starts at LstByt
  170.     ld    b,h        ; put length in BC
  171.     ld    c,l
  172.     ex    de,hl        ; get InPtr in HL (beginning of line)
  173.     push    bc
  174.     push    hl
  175.     ld    a,LF
  176.     cpir            ; is there a full line left?
  177.     pop    hl
  178.     pop    bc
  179.     jp    z,ST1        ; (yes, go process line)
  180.     ld    de,(InBuf)    ; no
  181.     ld    (InPtr),de
  182.     ldir            ; move last to start of read buffer
  183.     call    ReadF1        ; read more
  184.     jr    ScLoop
  185. ;
  186. ReadF:    ld    hl,(InBuf)    ; re-initialize InPtr
  187.     ld    (InPtr),hl
  188. ReadF1:    call    InDU
  189. ReadF2:    call    setdma        ; set DMA for next sector
  190.     ld    de,CpmFcb    ; read a sector
  191.     call    f$read
  192.     jr    nz,ReadF3    ; (end of file)
  193.     ld    de,128        ; set new DMA
  194.     add    hl,de
  195.     ex    de,hl        ; new DMA in DE
  196.     ld    hl,(MemTop)    ; top of memory
  197.     or    a        ; clear carry
  198.     sbc    hl,de        ; subtract new DMA from MemTop
  199.     ex    de,hl        ; restore new DMA to HL
  200.     jr    nc,ReadF2    ; keep going if not out of memory
  201. ReadF3:    ld    (LstByt),hl    ; save in LstByt one byte after last read
  202.     ld    hl,CpmDma    ; reset DMA to default buffer
  203.     call    setdma
  204.     ret
  205. ;
  206. Done:    ld    hl,(OutPtr)
  207.     ld    b,128
  208.     ld    a,CpmEof
  209. DoneLp:    ld    (hl),a
  210.     inc    hl
  211.     djnz    DoneLp
  212.     ld    hl,OutBuf    ; move last record to output buffer
  213.     ld    de,CpmDma
  214.     ld    bc,128
  215.     ldir
  216.     call    OutDU
  217.     ld    de,OutFcb    ; write final sector
  218.     call    f$write
  219.     jp    nz,WERR
  220.     call    ClsIn        ; close input file
  221.     call    ClsOut        ; close output file
  222.     call    DatStp        ; move the create date stamp
  223.     ld    hl,'AB'        ; move BAK to filetype
  224.     ld    a,'K'
  225.     ld    (OutFcb+9),hl
  226.     ld    (OutFcb+11),a
  227.     call    OutDU
  228.     ld    de,OutFcb
  229.     call    f$delete    ; blind erase any BAK-type file
  230.     ex    de,hl        ; HL -> BAK filename
  231.     ld    de,OutFn
  232.     call    f$rename    ; blind rename any existing file to BAK
  233.     ld    hl,'$$'        ; move $$$ type back to FCB
  234.     ld    a,h
  235.     ld    (OutFcb+9),hl
  236.     ld    (OutFcb+11),a
  237.     ex    de,hl        ; HL -> final filename
  238.     ld    de,OutFcb    ; DE -> temporary ($$$) name
  239.     call    f$rename
  240. ;
  241. Finish:    ld    a,(OpQFlg)
  242.     or    a
  243.     ld    a,(ErCode)    ; get possible syntax errors
  244.     jr    z,ErExit    ; (not quiet, so ignore this)
  245.     or    a
  246.     jr    z,ErExit    ; (no syntax errors)
  247.     call    eprint
  248.     db    'Syntax errors found in source file.',0
  249. ErExit:    ld    b,a        ; put error code in B
  250.     call    Z3Chk
  251.     jr    z,Exit
  252.     ld    a,b        ; recover error code
  253.     call    puter2        ; set program error flag
  254.     or    a
  255.     jr    z,Exit        ; (no error)
  256.     cp    80h        ; syntax error?
  257.     call    nz,inverror    ; call error handler, except for syntax errors
  258. Exit:    call    hvdinit
  259.     ld    sp,(Stack)
  260.     ret
  261. ;
  262. ; Support routines . . .
  263. ;
  264. BLL:    ld    a,e        ; put char before CR in A
  265.     ld    hl,(InPtr)
  266.     ld    de,(OutPtr)
  267.     ldir            ; copy blank lines and labels
  268.     ld    (InPtr),hl
  269.     ld    (OutPtr),de
  270.     cp    ':'        ; does label already have colon?
  271.     jr    z,BL1        ; (yes)
  272.     dec    a        ; was it blank line?
  273.     jr    z,BL1        ; (yes)
  274.     ld    a,(OpCFlg)    ; do we add a colon?
  275.     or    a
  276.     jr    z,BL1        ; (no)
  277.     ld    hl,(OutPtr)
  278.     inc    hl
  279.     ld    (OutPtr),hl    ; increment pointer
  280.     ex    de,hl
  281.     dec    de        ; point DE at byte after LF
  282.     ld    h,d
  283.     ld    l,e
  284.     dec    hl        ; point HL at LF
  285.     ld    c,2
  286.     lddr            ; move CRLF one byte ahead
  287.     ld    a,':'        ; insert colon
  288.     ld    (de),a
  289. BL1:    jp    ScLoop        ; get next line
  290. ;
  291. ST1:    ld    hl,(LCnt)    ; increment line count
  292.     inc    hl
  293.     ld    (LCnt),hl
  294.     ld    bc,1        ; initialize BC
  295.     ld    e,c        ; initialize E to non-colon
  296.     ld    hl,(InPtr)
  297. ST2:    inc    c
  298.     ld    a,(hl)
  299.     ld    d,a        ; save char in D
  300.     cp    CpmEof        ; end of file?
  301.     jp    z,Done        ; (yes)
  302.     cp    CR        ; end of line?
  303.     jr    z,BLL        ; (yes)
  304.     cp    ';'        ; comment line?
  305.     jr    z,CONT1        ; (yes)
  306.     cp    '*'        ; comment line?
  307.     jr    z,CONT1        ; (yes)
  308. ;
  309.     cp    ':'        ; fix for double colon
  310.     jr    z,ST4
  311. ;
  312.     ld    a,e
  313.     cp    ':'        ; was the last character a ":"?
  314.     jr    z,CONT1        ; (yes, instruction follows immediately)
  315. ST4:    ld    a,d        ; restore current byte in A
  316.     ld    e,a        ; ..and also in E
  317.     cp    ' '+1        ; is it greater than space?
  318.     inc    hl
  319.     jr    nc,ST2        ; (yes, loop)
  320. CKMORE:    ld    a,(hl)
  321.     cp    CR
  322.     jr    nz,SKIP
  323.     call    COMM
  324.     jp    CONT4
  325. ;
  326. SKIP:    cp    ' '+1
  327.     inc    hl
  328.     jr    c,CKMORE
  329. CONT1:    call    LINE        ; translate line
  330. CONT4:    ld    de,(OutPtr)
  331.     ld    a,(CmtFlg)    ; check comment flag
  332.     or    a
  333.     jr    z,CONT2         ; (no comment)
  334.     ld    hl,(LCAdr)    ; get end of instruction
  335.     ld    a,(LChar)
  336.     ld    (hl),a         ; restore byte
  337.     dec    de
  338.     dec    de
  339. CONT3:    call    TPFIN         ; finish line
  340. CONT2:    ld    hl,OutBuf+128
  341.     ex    de,hl
  342.     sbc    hl,de        ; more than 128 bytes at OutPtr
  343.     jp    c,ScLoop    ; (no, get next line)
  344. WRI:    call    CkAbrt
  345.     ld    hl,OutBuf    ; move 128 bytes from OutBuf to CpmDma
  346.     ld    de,CpmDma
  347.     ld    bc,128
  348.     ldir
  349.     call    OutDU
  350.     ld    de,OutFcb    ; write a sector
  351.     call    f$write
  352.     jr    z,NOERR
  353. WERR:    ld    a,11        ; error code
  354.     call    eprint
  355.     db    'Disk full.',0
  356.     jp    Abort
  357. ;
  358. NOERR:    ld    hl,OutBuf+CpmDma ; move remaining to start of OutBuf
  359.     ld    de,OutBuf
  360.     ld    bc,CpmDma
  361.     ldir
  362.     ld    hl,(OutPtr)     ; adjust OutPtr
  363.     ld    de,80h
  364.     or    a
  365.     sbc    hl,de
  366.     ld    (OutPtr),hl
  367.     jp    ScLoop        ; continue processing
  368. ;
  369. LINE:    ld    hl,LinBuf    ; clear line buffer
  370.     ld    de,LinBuf+1
  371.     ld    bc,255        ; clear plenty
  372.     ld    (hl),0
  373.     ldir
  374.     ld    hl,(InPtr)
  375.     dec    hl
  376.     ld    a,' '
  377. L1:    inc    hl        ; scan to 1st non-blank
  378.     cp    (hl)
  379.     jr    nc,L1         ; (if not greater than space)
  380.     ld    a,(hl)         ; get 1st character greater than space
  381.     cp    ';'        ; was character ";"?
  382.     jr    z,COMM        ; (yes, a comment line)
  383.     cp    '*'        ; was character "*"?
  384.     jr    nz,L2        ; (no, not a comment line)
  385.     ld    a,(OpAFlg)    ; do we change it to a semi-colon?
  386.     or    a
  387.     jr    z,COMM        ; (no, just copy line)
  388.     ld    (hl),';'    ; insert semi-colon
  389. COMM:    ld    hl,(InPtr)
  390.     call    TP12        ; put line at OutPtr without further ado
  391.     inc    hl
  392. COMM1:    inc    hl
  393.     ld    (InPtr),hl
  394.     ret
  395. ;
  396. L2:    call    SCN+3        ; test for EQU
  397.     push    hl
  398.     exx
  399.     pop    hl
  400.     ld    bc,3
  401.     ld    de,EQM
  402.     call    CHK1
  403.     ld    hl,SetFlg
  404.     set    6,(hl)        ; assume not
  405.     jr    nz,LIN3        ; (not EQU)
  406.     cp    ' '+1        ; is character after EQU a space or less?
  407.     jr    nc,LIN3        ; (no)
  408.     res    6,(hl)        ; it's EQU
  409.     ld    hl,(InPtr)
  410.     jp    LIN4
  411. ;
  412. CMSCN:    ld    hl,LinBuf    ; enter with char in A
  413. CMS1:    ld    c,a        ; save in C
  414. CMS2:    ld    a,(hl)        ; get char from M
  415.     cp    CR        ; end of line?
  416.     ld    a,c        ; restore A
  417.     jr    z,CMS3        ; (end of line)
  418.     cp    (hl)        ; match?
  419.     ret    z        ; (yes)
  420.     inc    hl        ; bump pointer
  421.     jr    CMS2        ; and loop
  422. ;
  423. CMS3:    or    a        ; clear carry
  424.     ret            ; return
  425. ;
  426. F3:    dec    hl        ; scan back to 1st character greater than space
  427.     ld    a,(hl)
  428.     cp    ' '+1
  429.     ret
  430. ;
  431. LIN3:    exx
  432.     push    hl
  433.     exx
  434.     pop    hl
  435.     ld    bc,3
  436.     ld    de,SEM
  437.     call    CHK1        ; check for SET
  438.     ld    hl,SetFlg
  439.     set    7,(hl)        ; assume not SET
  440.     jr    nz,NEWLIN
  441.     cp    ' '+1        ; is there a space or less after SET?
  442.     jr    nc,NEWLIN    ; (no)
  443.     res    7,(hl)        ; it's SET, so zero 8th bit of SetFlg
  444.     exx
  445.     ld    (hl),'~'
  446.     ld    hl,(InPtr)
  447.     jr    LIN4
  448. ;
  449. NEWLIN:    ld    hl,(InPtr)
  450.     ld    c,50        ; copy label, if any, to OutPtr
  451.     ld    de,(OutPtr)
  452.     ld    a,' '
  453.     cp    (hl)
  454.     jr    nc,LIN2        ; (no label)
  455. LIN1:    ldi            ; copy label to OutPtr
  456.     jp    po,ERROR
  457.     ld    a,(hl)
  458.     cp    ':'        ; are we at colon?
  459.     jr    nz,LIN84    ; (new code for double colon fix)
  460.     inc    hl
  461.     cp    (hl)
  462.     dec    hl
  463.     jr    nz,LIN21    ; (insert colon and scan to > space)
  464.     jr    LIN1
  465. ;
  466. LIN84:    cp    ' '+1        ; are we still looking at label?
  467.     jr    nc,LIN1        ; (yes,keep going)
  468.     ld    a,(OpCFlg)    ; check colon flag
  469.     or    a
  470.     jr    z,LIN21        ; (no colon)
  471.     ld    a,(SetFlg)    ; check for SET or EQU
  472.     and    0C0h
  473.     cp    0C0h
  474.     jr    nz,LIN21    ; (SET or EQU pseudo-op)
  475.     push    hl
  476.     push    de
  477. LINM:    ld    a,(hl)
  478.     cp    ' '+1
  479.     inc    hl
  480.     jr    c,LINM
  481.     dec    hl
  482.     ld    bc,5
  483.     ld    de,MACRM+1
  484.     call    CHK1
  485.     pop    de
  486.     pop    hl
  487.     jr    z,LIN21
  488.     ld    a,':'
  489.     ld    (de),a        ; insert colon
  490.     inc    de
  491. LIN21:    ld    a,' '
  492. LIN2:    ldi            ; copy to mnemonic field
  493.     jp    po,ERROR
  494.     cp    (hl)        ; there yet?
  495.     jr    nc,LIN2        ; (no,loop)
  496.     ld    (OutPtr),de
  497. LIN4:    ld    de,LinBuf    ; move line into buffer starting with
  498.     ld    c,127        ; ..mnemonic and ending with CR
  499.     ld    a,LF
  500. S2:    ldi
  501.     jp    po,ERROR
  502.     cp    (hl)
  503.     jr    nz,S2
  504.     inc    hl
  505.     ld    (InPtr),hl    ; save location in 8080 program
  506.     dec    de
  507.     ld    (LCAdr),de    ; save end of instruction location in LinBuf
  508.     ld    hl,LinBuf    ; check if comment in mnemonic field
  509.     ld    a,(hl)
  510.     cp    ';'
  511.     jp    z,TP12        ; (comment in field, so just copy line)
  512.     cp    '*'
  513.     jr    z,NFIX        ; (* in mnemonic field, must be pseudo-op)
  514.     ld    a,';'
  515.     call    CMSCN        ; is there a semicolon in line?
  516.     jr    nz,CHKA        ; (no semi-colon, check for asterisk)
  517.     ld    hl,LinBuf    ; get ready to scan line for semi-colon
  518. S6:    ld    a,(hl)        ; get character
  519.     cp    CR
  520.     jr    z,CHKA
  521.     cp    ';'        ; is it a semi-colon?
  522.     jr    z,F2        ; (yes, it's a comment line)
  523.     cp    ''''        ; is it a single quote?
  524.     inc    hl
  525.     jr    nz,S6        ; (no, keep looping)
  526.     call    CMS1        ; yes, scan for closing quote
  527.     jp    nz,ERROR    ; (error if none)
  528.     inc    hl
  529.     jr    S6
  530. ;
  531. CHKA:    ld    a,'*'        ; no semi-colon, check for asterisk as comment
  532.     call    CMSCN
  533.     jr    nz,NFIX        ; (none, so it's no comment)
  534.     ld    hl,LinBuf    ; set up to scan for asterisk
  535. A1:    ld    a,(hl)
  536.     cp    CR
  537.     jr    z,NFIX
  538.     cp    '*'
  539.     jr    nz,A2
  540.     call    ATEST
  541.     jr    c,FIX1        ; (yes)
  542. A2:    cp    ''''        ; is it a quote?
  543.     inc    hl
  544.     jr    nz,A1        ; (no, loop)
  545.     call    CMS1        ; check for closing quote
  546.     jp    nz,ERROR    ; (error if none)
  547.     inc    hl
  548.     jr    A1
  549. ;
  550. FIX1:    ld    a,(OpAFlg)    ; do we change "*" to ";"?
  551.     or    a
  552.     jr    z,F2        ; (no)
  553.     ld    (hl),';'    ; insert semicolon
  554. F2:    call    F3        ; scan back to end of operand
  555.     jr    c,F2
  556.     inc    hl
  557.     ld    a,(hl)
  558.     ld    (LChar),a    ; save 1st char after operand
  559.     ld    (LCAdr),hl    ; save location
  560.     ld    a,CR
  561.     ld    (hl),a        ; store CR after operand
  562.     ld    (CmtFlg),a    ; set comment flag
  563. NFIX:    ld    hl,SetFlg
  564.     bit    6,(hl)
  565.     jp    z,TP1        ; (it was EQU, so just copy line)
  566.     bit    7,(hl)
  567.     jr    nz,NFIX1    ; not SET
  568.     ld    hl,LinBuf    ; get beginning of line
  569.     ld    de,(OutPtr)    ; load place in output buffer
  570.     ld    a,'~'
  571.     call    CPY        ; copy to ~ mark
  572.     push    hl        ; save start of SET
  573.     ld    a,(DbFlag)    ; ASET or DEFL?
  574.     or    a
  575.     ld    hl,ASETM    ; assume move in ASET and tab
  576.     jr    nz,UASET    ; (we're right)
  577.     ld    hl,DEFLM    ; no, move in DEFL and tab
  578. UASET:    ld    bc,4
  579.     ldir
  580.     pop    hl
  581.     inc    hl
  582.     inc    hl
  583.     inc    hl        ; point to byte after SET
  584.     jp    TPFIN        ; finish copy to CR
  585. ;
  586. ATEST:    dec    hl
  587.     ld    c,a
  588.     ld    a,(hl)
  589.     cp    ' '+1
  590.     inc    hl
  591.     ld    a,c
  592.     ret
  593. ;
  594. NFIX1:    ld    de,LinBuf    ; calculate line length
  595.     ld    hl,(LCAdr)
  596.     or    a
  597.     sbc    hl,de
  598.     inc    hl
  599.     ld    (LLen),hl    ; store it here
  600.     ld    hl,MTABLE    ; point at main opcode table
  601.     ld    a,(hl)
  602.     ld    b,0
  603. TOP:    ld    c,a        ; find mnemonic from table
  604.     push    bc
  605.     push    hl
  606.     or    a        ; make sure carry is clear
  607.     call    CHK
  608.     jr    nz,CHK3        ; (no match)
  609.     ld    c,a        ; maybe a match, save A)
  610.     ld    a,(de)        ; get next character in LinBuf
  611.     cp    ' '+1        ; is it a space or less?
  612.     ld    a,c        ; restore A
  613. CHK3:    pop    hl
  614.     pop    bc
  615.     jr    c,MTCH        ; (yes, found match, type in A)
  616.     ld    a,(hl)        ; no match, so index to next
  617.     add    a,2
  618.     ld    e,a
  619.     ld    d,0
  620.     add    hl,de
  621.     ld    a,(hl)
  622.     or    a
  623.     jr    nz,TOP        ; (loop)
  624.     jp    ERROR        ; end of table
  625. ;
  626. CHK:    inc    hl        ; search for mnemonic
  627.     ld    de,LinBuf
  628. CHK1:    ld    a,(de)
  629.     cpi
  630.     ld    a,(hl)
  631.     inc    de
  632.     ret    nz
  633.     ret    po
  634.     jr    CHK1
  635. ;
  636. MTCH:    dec    a        ; found
  637.     ld    e,a
  638.     ld    d,0
  639.     ld    hl,JTABLE    ; index to jump table
  640.     add    hl,de
  641.     add    hl,de
  642.     ld    e,(hl)
  643.     inc    hl
  644.     ld    d,(hl)
  645.     ld    hl,(OutPtr)
  646.     ex    de,hl
  647.     jp    (HL)        ; go to routine with OutPtr in DE
  648. ;
  649. NCPY:    ld    a,(hl)        ; new routine to take care of trailing
  650.     cp    ' '+1        ; ..blanks or tabs before CRLF
  651.     ret    c
  652.     ld    (de),a
  653.     inc    hl
  654.     inc    de
  655.     jr    NCPY
  656. ;
  657. ;=======================
  658. ; TYPE 1 -- same as Zilog
  659. ;
  660. TP1:    ld    hl,LinBuf
  661. TP12:    ld    de,(OutPtr)
  662. TPFIN:    call    G2        ; copy rest of line and put CR
  663. TP11:    inc    de        ; add LF and exit
  664.     ld    a,LF
  665.     ld    (de),a
  666.     inc    de
  667.     ld    (OutPtr),de
  668.     ret
  669. ;
  670. ;=======================
  671. ; Type 2 -- one for one substitution
  672. ;
  673. TP2:    ld    hl,STABLE
  674.     call    TP21
  675.     jp    TPFIN
  676. ;
  677. TP21:    ld    c,(hl)        ; search for match in STABLE
  678.     call    CHK
  679.     jr    z,TP22        ; (found)
  680.     add    hl,bc        ; go to 2nd length byte
  681.     ld    c,(hl)
  682.     add    hl,bc        ; skip 2nd (8080) mnemonic
  683.     inc    hl        ; now pointing at next line in STABLE
  684.     jr    TP21
  685. ;
  686. TP22:    ld    c,(hl)        ; get length of 8080 mnemonic
  687.     inc    hl
  688.     push    de        ; save address of byte after mnemonic
  689.     ld    de,(OutPtr)
  690.     ldir
  691.     pop    hl        ; restore for copy (TPFIN)
  692.     ret
  693. ;
  694. TP26:    ld    a,CR        ; utility routine called many times elsewhere
  695.     ld    (de),a
  696.     jp    TP11
  697. ;
  698. SCN:    ld    hl,LinBuf-1    ; scans to field after mnemonic
  699.     ld    a,' '+1
  700. TP31:    inc    hl
  701.     cp    (hl)
  702.     jr    c,TP31
  703.     dec    a
  704. TP32:    cp    (hl)
  705.     inc    hl
  706.     jr    nc,TP32
  707.     dec    hl
  708.     ret            ; HL pointing to 1st character in opcode field
  709. ;
  710. ;=======================
  711. ; TYPE 3 -- MOV mnemonics
  712. ;
  713. TP3:    call    LDM
  714.     call    SCN
  715.     ld    a,(hl)
  716.     cp    'M'
  717.     jr    nz,TP33
  718. TP35:    call    PAR        ; put "(HL)" if M
  719.     inc    hl
  720.     jp    TPFIN
  721. TP33:    ld    bc,2
  722.     ldir            ; put register and comma
  723. TP331:    ld    a,(hl)
  724.     cp    'M'        ; is it MOV from M
  725.     jp    nz,TPFIN    ; (no)
  726. TP36:    call    PAR        ; yes, put "(HL)"
  727.     jp    TP26        ; finish line
  728. ;
  729. LDM:    ld    hl,LDM1        ; put "LD" and tab
  730.     ld    bc,3
  731.     ldir
  732.     ret
  733. ;
  734. PAR:    push    hl
  735.     ld    hl,PAR1
  736.     ld    bc,4
  737.     ldir
  738.     pop    hl
  739.     ret
  740. ;
  741. G2:    ld    a,CR        ; copy to end of line and put on CR
  742.     call    CPY
  743.     ld    (de),a
  744.     ret
  745. ;
  746. CPY:    ld    bc,127        ; copies to character in A
  747. CPY1:    cp    (hl)
  748.     ret    z
  749.     ldi
  750.     jp    po,ERROR
  751.     jr    CPY1
  752. ;
  753. ;=======================
  754. ; TYPE 4 -- MVI mnemonics
  755. ;
  756. TP4:    call    LDM
  757.     call    SCN
  758.     ld    a,(hl)
  759.     cp    'M'
  760.     jp    nz,TPFIN    ; copy rest of line if not M
  761.     jp    TP35        ; finish like MOV
  762. ;
  763. ;=======================
  764. ; TYPE 5 -- LDX and LDY mnemonics
  765. ;
  766. TP5:    call    LDM
  767.     ld    hl,LinBuf+2
  768.     ex    af,af'
  769.     ld    a,(hl)        ; put X or Y in alternate registers
  770.     ex    af,af'
  771.     call    SCN
  772. TP54:    ld    bc,2
  773.     ldir            ; copy register and comma
  774. TP53:    call    IDX        ; put "(IX+" or "(IY+"
  775.     jp    c,TP52
  776. TP51:    call    NCPY        ; copy displacement
  777. TP52:    ld    a,')'        ; put right parens
  778.     ld    (de),a
  779.     inc    de
  780.     jp    TP26        ; finish line
  781. ;
  782. IDX:    push    hl        ; see TP53 comment
  783.     ld    hl,IDX1
  784.     ld    bc,2
  785.     ldir
  786.     ex    af,af'
  787.     ld    (de),a
  788.     inc    de
  789.     pop    hl
  790.     ld    a,(hl)
  791.     cp    '0'
  792.     jp    z,IMPL
  793.     cp    '-'
  794.     ret    z
  795.     ld    a,'+'
  796.     ld    (de),a
  797.     inc    de
  798.     or    a
  799.     ret
  800. ;
  801. IMPL:    scf
  802.     ret
  803. ;
  804. ;=======================
  805. ; TYPE 6 -- STX, STY, MVIX, and MVIY mnemonics
  806. ;
  807. TP6:    call    LDM
  808.     ld    hl,LinBuf+2
  809.     ld    a,(hl)
  810.     cp    'I'        ; is it MVIX or MVIY?
  811.     jr    nz,TP61        ; (no)
  812.     inc    hl
  813. TP61:    ex    af,af'
  814.     ld    a,(hl)        ; put X or Y in alternate registers
  815.     ex    af,af'
  816.     call    CSCN        ; scan to comma
  817.     call    IDX        ; see TYPE 5
  818.     jp    c,TP69
  819.     call    NCPY        ; copy displacement
  820. TP69:    call    RPC        ; put right parens
  821.     call    SCN        ; Scan to register
  822.     ld    a,','
  823.     call    CPY        ; copy register or immediate byte or label
  824.     jp    TP26        ; finish line
  825. ;
  826. RPC:    push    hl        ; put right parens and comma
  827.     ld    hl,RPC1
  828.     ld    bc,2
  829.     ldir
  830.     pop    hl
  831.     ret
  832. ;
  833. CSCN:    ld    bc,(LLen)    ; scan to comma
  834.     ld    a,','
  835.     cpir
  836.     ret
  837. ;
  838. ;=======================
  839. ; TYPE 7 -- LDAX and LDA mnemonics
  840. ;
  841. TP7:    call    LDM
  842. TP75:    call    TP71        ; put "A,("
  843.     ld    hl,LinBuf+3
  844.     ld    a,(hl)        ; look at 4th character in mnemonic
  845.     cp    'X'        ; is it LDAX?
  846.     ex    af,af'        ; save flags
  847.     call    SCN        ; scan to operand field
  848.     ex    af,af'        ; restore flags
  849.     jp    nz,TP51        ; (no, it's LDA)
  850. TP751:    ld    a,(hl)        ; LDAX routine
  851.     ld    (de),a
  852.     inc    de
  853.     cp    'B'        ; is it LDAX B?
  854.     jr    z,TP74        ; (yes)
  855.     cp    'D'        ; is it LDAX D?
  856. TP73:    jp    nz,ERROR    ; (no, must be bad code)
  857. TP74:    inc    a        ; put in C or E
  858.     ld    (de),a
  859.     inc    de
  860.     jp    TP52
  861. ;
  862. TP71:    push    hl
  863.     ld    hl,TP72
  864.     ld    bc,3
  865.     ldir
  866.     pop    hl
  867.     ret
  868. ;
  869. ;=======================
  870. ; TYPE 8 -- STAX and STA mnemonics
  871. ;
  872. TP8:    call    LDM
  873. TP85:    ld    a,'('        ; put left parens
  874.     ld    (de),a
  875.     inc    de
  876.     ld    hl,LinBuf+3    ; look at 4th character
  877.     ld    a,(hl)
  878.     cp    'X'        ; is it X?
  879.     ex    af,af'        ; save flags
  880.     call    SCN        ; scan to operand field
  881.     ex    af,af'        ; restore flags
  882.     jr    nz,TP82        ; (no, must be LDA)
  883.     ld    a,(hl)        ; STAX routine
  884.     ld    (de),a
  885.     inc    de
  886.     cp    'B'        ; is it STAX B?
  887.     jr    z,TP81        ; (yes)
  888.     cp    'D'        ; is it STAX D?
  889.     jp    nz,ERROR    ; (no, bad code)
  890. TP81:    inc    a        ; put in C or E
  891.     ld    (de),a
  892.     inc    de
  893. TP83:    call    RPC        ; put right parens and comma
  894. TP84:    ld    a,'A'        ; put "A" and finish line
  895.     ld    (de),a
  896.     inc    de
  897.     jp    TP26
  898. ;
  899. TP82:    call    NCPY        ; copy to end of line
  900.     jr    TP83        ; finish like above
  901. ;
  902. ;=======================
  903. ; TYPE 9 -- LDAI, LDAR, STAI, and STAR mnemonics
  904. ;
  905. TP9:    call    LDM
  906.     ld    hl,LinBuf+1
  907.     ld    a,(hl)
  908.     cp    'T'        ; is it STAI or STAR?
  909.     jr    z,TP91        ; (yes)
  910.     call    TP71        ; put "A,("
  911.     dec    de        ; back up over left parens
  912.     inc    hl
  913.     inc    hl
  914.     ld    a,(hl)        ; get last character
  915. TP92:    ld    (de),a        ; put last character
  916.     inc    de
  917.     jp    TP26        ; finish line
  918. ;
  919. TP91:    inc    hl
  920.     inc    hl
  921.     ld    a,(hl)        ; get last character
  922.     ld    (de),a        ; put last character
  923.     inc    de
  924.     ld    a,','
  925.     ld    (de),a        ; put comma
  926.     inc    de
  927.     jp    TP84        ; put "A" and finish line
  928. ;
  929. ;=======================
  930. ; TYPE 10 -- LXI, LXIX, and LXIY mnemonics
  931. ;
  932. TPA:    call    LDM
  933.     ld    hl,LinBuf+3
  934.     ld    a,(hl)        ; get X, Y, or delimiter
  935.     cp    ' '+1
  936.     jr    c,TPA1        ; it's LXI
  937.     dec    hl
  938.     ld    bc,2
  939.     ldir            ; copy IX or IY
  940.     ld    a,','
  941.     ld    (de),a        ; put comma
  942.     inc    de
  943.     call    SCN
  944. TPA3:    jp    TPFIN        ; copy rest of line
  945. ;
  946. TPA1:    call    SCN
  947.     ld    a,(hl)
  948.     cp    'S'        ; is it SP?
  949.     jr    z,TPA3        ; (yes)
  950.     cp    '6'        ; is it SP?
  951.     jr    nz,TPA4        ; (no)
  952.     ld    a,'S'        ; (yes)
  953. TPA4:    call    DO2        ; copy right parens or SP
  954.     inc    hl
  955.     jr    TPA3        ; finish line
  956. ;
  957. DO2:    push    hl        ; copy right parens if 1st character in A
  958.     ld    hl,RPTAB
  959.     ld    bc,12
  960.     cpir
  961.     dec    hl
  962.     ld    c,2
  963.     ldir
  964.     pop    hl
  965.     ret
  966. ;
  967. ;=======================
  968. ; TYPE 11 -- LHLD, LddD, LIXD, and LIYD mnemonics
  969. ;
  970. TPB:    call    LDM
  971.     ld    hl,LinBuf+1
  972.     ld    bc,2
  973.     ldir            ; copy register pair
  974.     call    TPB1        ; copy comma and left parens
  975.     call    SCN
  976.     jp    TP51        ; finish like TYPE 5
  977. ;
  978. TPB1:    push    hl
  979.     ld    hl,TPB2
  980.     ld    bc,2
  981.     ldir
  982.     pop    hl
  983.     ret
  984. ;
  985. ;=======================
  986. ; TYPE 12 -- SHLD, SddD, SIXD, and SIYD mnemonics
  987. ;
  988. TPC:    call    LDM
  989.     ld    a,'('
  990.     ld    (de),a        ; put left parens
  991.     inc    de
  992.     call    SCN
  993.     call    NCPY        ; copy rest of line if greater than space
  994.     call    RPC        ; put right parens and comma
  995.     ld    hl,LinBuf+1
  996. TPC1:    ld    bc,2
  997.     ldir            ; copy register pair
  998.     jp    TP26        ; finish line
  999. ;
  1000. ;=======================
  1001. ; TYPE 13 -- SPHL, SPIX, and SPIY mnemonics
  1002. ;
  1003. TPD:    call    LDM
  1004.     ld    hl,LinBuf
  1005.     ld    bc,2
  1006.     ldir            ; copy "SP"
  1007.     ld    a,','
  1008.     ld    (de),a        ; put comma
  1009.     inc    de
  1010.     jr    TPC1        ; put last 2 characters
  1011. ;
  1012. ;=======================
  1013. ; TYPE 14 -- PUSH, POP, PUSHIX, and POPIX
  1014. ;
  1015. TPE:    ld    hl,LinBuf+1
  1016.     ld    a,(hl)
  1017.     cp    'O'        ; is it POP?
  1018.     ld    hl,TPE2
  1019.     ld    bc,5
  1020.     jr    nz,TPE1        ; (no)
  1021.     ld    hl,TPE5
  1022.     dec    bc        ; adjust for POP
  1023. TPE1:    ldir            ; copy PUSH or POP and tab
  1024.     ld    hl,LinBuf+3
  1025.     ld    a,'I'
  1026.     cp    (hl)        ; is it POPIX?
  1027.     jp    z,TPFIN        ; (yes, copy rest of line)
  1028.     inc    hl
  1029.     cp    (hl)        ; is it PUSHIX?
  1030.     jp    z,TPFIN        ; (yes, copy rest of line)
  1031.     call    SCN
  1032.     ld    a,(hl)
  1033.     cp    'P'        ; is it PSW?
  1034.     jr    z,TPE4        ; (yes)
  1035.     cp    '6'        ; is it PSW?
  1036.     jr    z,TPE4        ; (yes)
  1037.     call    DO2        ; copy register pair
  1038. TPE3:    jp    TP26        ; finish line
  1039. ;
  1040. TPE4:    ld    hl,AFM
  1041.     ld    bc,2
  1042.     ldir            ; copy "AF"
  1043.     jr    TPE3        ; finish line
  1044. ;
  1045. ;=======================
  1046. ; TYPE 15 -- exchange mnemonics (except EXX)
  1047. ;
  1048. TPF:    ld    hl,EXM
  1049.     ld    bc,3
  1050.     ldir            ; copy "EX" and tab
  1051.     ld    hl,LinBuf+1
  1052.     ld    a,(hl)
  1053.     cp    'T'        ; is it XTIX or XTIY?
  1054.     jr    z,TPF2        ; (yes)
  1055.     ld    hl,CHG
  1056.     ld    c,5
  1057.     cp    'C'        ; is it XCHG?
  1058.     jr    z,TPF1        ; (yes)
  1059.     ld    hl,XAF        ; else EXAF
  1060.     inc    bc        ; adjust for 6 characters
  1061. TPF1:    ldir
  1062.     jp    TP26        ; finish line
  1063. ;
  1064. TPF2:    inc    hl
  1065.     push    hl        ; save start of IX or IY
  1066.     ld    hl,SPM
  1067.     ld    c,5
  1068.     ldir            ; copy "(SP),"
  1069.     pop    hl
  1070.     ld    c,2
  1071.     jr    TPF1        ; copy "IX" or "IY" and finish
  1072. ;
  1073. ;=======================
  1074. ; TYPE 16 -- 8-bit arithmetic and logic (except immediate)
  1075. ;
  1076. TYP1:    ld    hl,LinBuf+1
  1077.     ld    bc,3
  1078.     ld    a,(hl)
  1079.     dec    hl
  1080.     cp    'D'
  1081.     jr    z,TYP11        ; copy mnemonic without change
  1082.     cp    'U'
  1083.     jr    z,TYP11        ; likewise
  1084.     ld    a,(hl)        ; get 1st character
  1085.     ld    hl,ARTAB
  1086. TYP12:    ld    c,(hl)
  1087.     inc    hl
  1088.     cpir            ; find match
  1089.     jr    nz,TYP12
  1090.     dec    hl        ; back up
  1091.     inc    bc        ; restore BC
  1092. TYP11:    ldir            ; copy match
  1093.     call    TYP17
  1094. TYP18:    inc    hl
  1095.     inc    hl
  1096.     ld    a,(hl)
  1097.     cp    ' '+1        ; is it an index register
  1098.     jr    nc,TYP14    ; (yes)
  1099.     call    SCN
  1100.     ld    a,(hl)
  1101.     cp    'M'        ; is it M
  1102.     jr    nz,TYP15    ; (no)
  1103.     call    PAR        ; put "(HL)"
  1104. TYP16:    jp    TP26        ; finish line
  1105. ;
  1106. TYP15:    ld    (de),a        ; put register
  1107.     inc    de
  1108.     jr    TYP16        ; finish
  1109. ;
  1110. TYP13:    call    TP71        ; put "A,("
  1111.     dec    de        ; back over left parens
  1112.     ret
  1113. ;
  1114. TYP14:    ld    c,a
  1115.     ex    af,af'
  1116.     ld    a,c        ; put X or Y in alternate
  1117.     ex    af,af'
  1118.     call    SCN
  1119.     jp    TP53        ; finish like TYPE 5
  1120. ;
  1121. TYP17:    ld    a,9
  1122.     ld    (de),a        ; put tab
  1123.     inc    de
  1124.     ld    hl,LinBuf+1
  1125.     ld    a,(hl)
  1126.     cp    'E'
  1127.     call    c,TYP13        ; if ADD, ADC, or SBB
  1128.     ret
  1129. ;
  1130. ;=======================
  1131. ; TYPE 17 -- 8-bit arithmetic and logic immediate
  1132. ;
  1133. TYP2:    ld    hl,AITAB
  1134.     call    TP21        ; find and put match
  1135.     call    TYP17        ; put tab and "A," if needed
  1136.     call    SCN
  1137.     jp    TPFIN        ; copy rest of line
  1138. ;
  1139. ;=======================
  1140. ; TYPE 18 -- INR and DCR mnemonics
  1141. ;
  1142. TYP3:    call    TYP32
  1143.     jp    TYP18        ; finish like TYPE 16
  1144. ;
  1145. TYP32:    ld    hl,LinBuf+1
  1146.     ld    bc,4
  1147.     push    hl
  1148.     ld    a,(hl)
  1149.     cp    'N'        ; is it INR?
  1150.     ld    hl,IRM
  1151.     jr    z,TYP31        ; (yes)
  1152.     add    hl,bc        ; index to DEC
  1153. TYP31:    ldir            ; copy INC or DEC and tab
  1154.     pop    hl
  1155.     ret
  1156. ;
  1157. ;=======================
  1158. ; TYPE 19 -- DAD, DSBC, DADC, and DADX mnemonics
  1159. ;
  1160. TYP4:    ld    hl,LinBuf+3
  1161.     ld    bc,3
  1162.     ld    a,(hl)
  1163.     push    af
  1164.     cp    'C'        ; is it DSBC or DADC?
  1165.     dec    hl
  1166.     dec    hl        ; back up to "S" or "A"
  1167.     jr    z,TYP41        ; (yes)
  1168.     ld    hl,ADM
  1169. TYP41:    ldir            ; copy ADD, SBC, or ADC
  1170.     ld    a,9
  1171.     ld    (de),a        ; put tab
  1172.     inc    de
  1173.     pop    af
  1174.     cp    'X'        ; is it "X"?
  1175.     ld    hl,HLM
  1176.     ld    c,2
  1177.     call    nc,TYP42    ; if X or Y
  1178.     ldir            ; copy HL, IX, or IY
  1179.     ld    a,','
  1180.     ld    (de),a        ; put comma
  1181.     inc    de
  1182. TYP43:    call    SCN
  1183.     ld    a,(hl)
  1184.     cp    'I'        ; is it "I"?
  1185.     jp    nc,TPFIN    ; copy IX, IY, or SP
  1186.     cp    '6'        ; is it SP?
  1187.     jr    nz,TYP44    ; (no)
  1188.     ld    a,'S'        ; yes
  1189. TYP44:    call    DO2        ; copy BC, DE, HL, or SP
  1190.     jp    TP26        ; finish line
  1191. ;
  1192. TYP42:    ld    hl,RPTAB+9
  1193.     cp    (hl)
  1194.     dec    hl        ; point at IX
  1195.     ret    z
  1196.     inc    hl
  1197.     inc    hl        ; point at IY
  1198.     ret
  1199. ;
  1200. ;=======================
  1201. ; TYPE 20 -- INX, DCX, and INXIX mnemonics
  1202. ;
  1203. TYP5:    call    TYP32
  1204.     inc    hl
  1205.     inc    hl
  1206.     ld    a,(hl)
  1207.     cp    ' '+1
  1208.     jp    nc,TPFIN
  1209.     jr    TYP43
  1210. ;
  1211. ;=======================
  1212. ; TYPE 21 -- shift and rotate group
  1213. ;
  1214. TYP6:    ld    hl,LinBuf+3
  1215.     ld    a,(hl)        ; get X or Y, if any
  1216.     push    af        ; save on stack
  1217.     ld    hl,LinBuf
  1218.     push    hl
  1219.     ld    bc,3
  1220.     ldir            ; copy mnemonic
  1221.     pop    hl
  1222.     inc    hl
  1223.     ld    a,(hl)
  1224.     cp    'A'        ; is it RL or RR (Zilog)?
  1225.     jp    nz,TYP61    ; (no)
  1226.     dec    de
  1227.     ld    a,(de)        ; get R or L
  1228.     dec    de
  1229.     ld    (de),a        ; put in 2nd position
  1230.     inc    de        ; adjust pointer
  1231. TYP61:    ld    a,9
  1232.     ld    (de),a        ; put tab
  1233.     inc    de
  1234.     call    SCN
  1235.     ex    af,af'
  1236.     pop    af
  1237.     cp    'X'        ; was it X or Y?
  1238.     jr    nc,TYP62    ; (yes)
  1239.     ld    a,(hl)
  1240.     cp    'M'        ; is it memory?
  1241.     jp    nz,TPFIN    ; (no, finish line)
  1242.     jp    TP36        ; put "(HL)" and finish
  1243. ;
  1244. TYP62:    ex    af,af'
  1245.     jp    TP53        ; do index register stuff
  1246. ;
  1247. ;=======================
  1248. ; TYPE 22 -- BIT, SET, RES, and RST mnemonics
  1249. ;
  1250. TYP7:    ld    hl,LinBuf
  1251.     ld    bc,3
  1252.     ldir            ; put 1st three characters
  1253.     ld    a,(hl)
  1254.     push    af        ; save fourth if any
  1255.     ld    a,9
  1256.     ld    (de),a        ; put tab
  1257.     inc    de
  1258.     ld    hl,LinBuf+1    ; point to 2nd character
  1259.     ld    a,(hl)
  1260.     cp    'S'        ; is it RST?
  1261.     push    af
  1262.     call    SCN
  1263.     pop    af
  1264.     jr    z,RSTT        ; (yes)
  1265.     ld    a,','        ; copy bit or label if used
  1266.     call    CPY
  1267.     ld    a,(hl)        ; put comma
  1268.     ld    (de),a
  1269.     inc    hl        ; bump pointers
  1270.     inc    de
  1271.     ex    af,af'
  1272.     pop    af
  1273.     cp    'X'        ; was fourth X or Y?
  1274.     jp    c,TP331        ; (no)
  1275.     ex    af,af'
  1276.     jp    TP53        ; do index stuff
  1277. ;
  1278. RSTT:    pop    af        ; balance stack
  1279.     ld    a,(hl)        ; get RST operand (0-7)
  1280.     sub    30h        ; subtract bias
  1281.     add    a,a        ; double it
  1282.     ld    c,a        ; put in BC
  1283.     ld    b,0
  1284.     ld    hl,RSTABL
  1285.     add    hl,bc        ; index to table
  1286.     ld    c,2
  1287.     ldir            ; copy 2 to output file
  1288.     jp    TP26        ; finish up
  1289. ;
  1290. ;=======================
  1291. ; TYPE 23 -- all jump and JR mnemonics
  1292. ;
  1293. TYP8:    ld    hl,LinBuf+1
  1294.     ld    bc,3
  1295.     ld    a,(hl)
  1296.     cp    'R'        ; is it relative jump?
  1297.     ld    hl,JPM
  1298.     jr    nz,TYP84    ; (no)
  1299.     ld    hl,JRM
  1300. TYP84:    ldir            ; put "JR" or "JP"
  1301.     ld    hl,LinBuf
  1302.     ld    a,'P'
  1303.     cp    (hl)        ; is it PCHL or PCIX?
  1304.     inc    hl
  1305.     inc    hl
  1306.     jr    z,TYP81        ; (yes)
  1307.     cp    (hl)        ; is it JMP?
  1308.     jr    z,TYP82        ; (yes)
  1309.     dec    hl
  1310.     ld    a,(hl)
  1311.     cp    'R'        ; is it relative jump?
  1312.     ld    a,' '
  1313.     jr    nz,TYP83    ; (no)
  1314.     inc    hl
  1315.     cp    (hl)        ; is it conditional?
  1316.     jr    nc,TYP82    ; (no)
  1317.     ld    c,3
  1318. TYP83:    ldi            ; put condition code
  1319.     cp    (hl)
  1320.     jr    c,TYP83
  1321.     ld    a,','
  1322.     ld    (de),a        ; put comma
  1323.     inc    de
  1324. TYP82:    call    SCN        ; scan to address
  1325.     jp    TPFIN        ; put rest of line
  1326. ;
  1327. TYP81:    ld    a,'('
  1328.     ld    (de),a        ; put left parens for PCHL, etc.
  1329.     inc    de
  1330.     jp    TP51        ; finish
  1331. ;
  1332. ;=======================
  1333. ; TYPE 24 -- CALL mnemonics
  1334. ;
  1335. TYP9:    ld    hl,CLM
  1336.     ld    bc,5
  1337.     ldir            ; put "CALL" and tab
  1338.     ld    hl,LinBuf+1
  1339.     ld    a,(hl)
  1340.     cp    'A'        ; is it CALL?
  1341.     jr    z,TYP82        ; (yes)
  1342.     ld    a,' '
  1343.     jr    TYP83        ; finish like conditional jumps
  1344. ;
  1345. ;=======================
  1346. ; TYPE 25 -- all RET mnemonics
  1347. ;
  1348. TYPA:    ld    hl,LinBuf+1
  1349.     ld    a,(hl)
  1350.     cp    'E'        ; is it RET?
  1351.     dec    hl
  1352.     jp    z,TPFIN        ; (yes, just copy whole line)
  1353.     inc    hl
  1354.     push    hl
  1355.     ld    hl,RTM
  1356.     ld    bc,4
  1357.     ldir            ; put "RET"
  1358.     pop    hl
  1359.     ld    a,' '
  1360. TYPA1:    ldi            ; put condition code
  1361.     cp    (hl)
  1362.     jr    c,TYPA1
  1363.     jp    TP26        ; finish line
  1364. ;
  1365. ;=======================
  1366. ; TYPE 26 -- IN mnemonics
  1367. ;
  1368. TYPB:    ld    hl,INM
  1369.     ld    bc,3
  1370.     ldir            ; put "IN"
  1371.     ld    hl,LinBuf+2
  1372.     ld    a,(hl)
  1373.     cp    'P'        ; is it INP?
  1374.     jp    nz,TP75        ; (no, finish like LDA)
  1375.     call    SCN
  1376.     ld    a,(hl)
  1377.     ld    (de),a        ; put register
  1378.     inc    de
  1379.     ld    hl,RCM
  1380.     ld    bc,4
  1381.     ldir            ; put comma and "(C)"
  1382.     jp    TP26        ; finish line
  1383. ;
  1384. ;=======================
  1385. ; TYPE 27 -- OUT mnemonics
  1386. ;
  1387. TYPC:    ld    hl,OTM
  1388.     ld    bc,4
  1389.     ldir            ; put "OUT" and tab
  1390.     ld    hl,LinBuf+3
  1391.     ld    a,(hl)
  1392.     cp    'P'        ; is it OUTP?
  1393.     jp    nz,TP85        ; (no, finish like STA)
  1394.     ld    hl,RCM+1
  1395.     ld    bc,4
  1396.     ldir            ; put "(C)" and comma
  1397.     call    SCN
  1398.     ld    a,(hl)
  1399.     ld    (de),a        ; put register
  1400.     inc    de
  1401.     jp    TP26        ; finish line
  1402. ;
  1403. ;=======================
  1404. ; TYPE 28 -- IM mnemonics
  1405. ;
  1406. TYPD:    ld    hl,IMM
  1407.     ld    bc,3
  1408.     ldir            ; put "IM" and tab
  1409.     ld    hl,LinBuf+2
  1410.     ld    a,(hl)
  1411.     ld    (de),a        ; put number
  1412.     inc    de
  1413.     jp    TP26        ; finish line
  1414. ;
  1415. ; ERROR -- Unrecognized opcodes lead here
  1416. ;
  1417. ERROR:    ld    sp,Stack    ; reset the stack
  1418.     ld    a,(OpQFlg)
  1419.     or    a
  1420.     jr    nz,QSkip3
  1421.     call    eprint
  1422.     db    CR,LF,'Syntax Error in Line ',0
  1423.     ld    hl,(LCnt)
  1424.     call    phlfdc
  1425.     call    eprint
  1426.     db    CR,LF,0
  1427.     ld    bc,127
  1428.     ld    hl,(IBoL)    ; get beginning of bad line
  1429.     push    hl
  1430.     ld    a,LF
  1431.     cpir            ; find beginning of next line
  1432.     ld    (InPtr),hl
  1433.     ld    a,(hl)        ; save first byte
  1434.     ex    af,af'
  1435.     ld    (hl),0        ; terminate string with this
  1436.     pop    de        ; restore beginning of bad line
  1437. ERR2:    ld    a,(de)        ; get byte
  1438.     cp    CR        ; are we at the end?
  1439.     jr    z,ERR1        ; (yes)
  1440.     call    cout
  1441.     inc    de        ; increment pointer
  1442.     jr    ERR2        ; ..and loop
  1443. ERR1:    ld    hl,(InPtr)
  1444.     ex    af,af'
  1445.     ld    (hl),a        ; restore byte
  1446. QSkip3:    ld    a,80h        ; set error code
  1447.     ld    (ErCode),a
  1448.     ld    de,(OBoL)    ; put message in output file
  1449.     ld    hl,BadMsg
  1450.     ld    bc,44
  1451.     ldir
  1452.     ld    hl,(IBoL)    ; restore beginning of bad line
  1453.     jp    CONT3        ; copy bad line and go process next
  1454. ;
  1455. ; Init -- initializes data areas
  1456. ;
  1457. Init:    call    hvtinit        ; initialize terminal
  1458.     ld    hl,DftNam    ; point to default name
  1459.     call    gcomnam        ; get disk name, if available
  1460.     call    Z3Chk        ; make a Z check
  1461.     push    af        ; save flags
  1462.     call    z,getmtop    ; get top of memory if not ZCPR3
  1463.     pop    af        ; recover flags
  1464.     call    nz,gzmtop    ; get top of memory if ZCPR3
  1465.     ld    l,0        ; zero low byte
  1466.     dec    h        ; come down one page
  1467.     ld    (MemTop),hl    ; ..and store top of memory
  1468.     call    codend        ; get end of code
  1469.     ld    (InBuf),hl    ; ..and make it the input buffer
  1470.     call    getquiet    ; is ZCPR quiet flag set?
  1471.     rra            ; make it 0 or FF
  1472.     sbc    a,a
  1473.     jr    nz,Init1    ; (yes)
  1474.     ld    a,(QtFlag)    ; no, get quiet configuration byte
  1475. Init1:    ld    (OpQFlg),a    ; ..and store in Q option flag
  1476.     ld    hl,OutBuf
  1477.     ld    (OutPtr),hl    ; initialize output buffer pointer
  1478.     ld    hl,(AstFlg)    ; move defaults (QtFlag done above)
  1479.     ld    (OpAFlg),hl
  1480.     xor    a        ; zero some data
  1481.     ld    b,4
  1482.     ld    hl,SetFlg
  1483. InitLp:    ld    (hl),a
  1484.     inc    hl
  1485.     djnz    InitLp
  1486.     ld    a,(DbFlag)    ; are we substituting pseudo-ops?
  1487.     or    a
  1488.     ret    z        ; (no)
  1489.     ld    hl,SUBTAB    ; yes, move them
  1490.     ld    de,STAB1
  1491.     ld    bc,50
  1492.     ldir
  1493.     ret
  1494. ;
  1495. ; GetOpt -- parses command line options, if any.
  1496. ;
  1497. GetOpt:    ld    hl,CpmDma+1    ; point to command tail
  1498.     call    eatspc        ; move past first token
  1499.     call    eatnspc
  1500.     call    eatspc
  1501.     ret    z        ; (no options)
  1502.     cp    '/'        ; slash?
  1503.     inc    hl        ; move past it
  1504.     jr    z,GotOpt    ; (we've got options)
  1505.     call    eatnspc        ; move past second token
  1506.     call    eatspc
  1507.     ret    z        ; (no options)
  1508.     cp    '/'
  1509.     jr    nz,GotOpt    ; (we've got options)
  1510.     inc    hl        ; move past slash
  1511. GotOpt:    ld    a,(hl)        ; get option
  1512.     inc    hl        ; point to next
  1513.     or    a
  1514.     ret    z        ; (end of options)
  1515.     cp    'Q'
  1516.     jr    z,OptQ
  1517.     cp    'A'
  1518.     jr    z,OptA
  1519.     cp    'C'
  1520.     jr    z,OptC
  1521.     cp    ' '        ; skip intervening and trailing spaces
  1522.     jr    z,GotOpt
  1523.     ld    a,19        ; error code
  1524.     call    eprint
  1525.     db    ' Invalid option.',0
  1526.     jp    ErExit
  1527. ;
  1528. OptQ:    ld    de,OpQFlg
  1529.     jr    DoOpt
  1530. ;
  1531. OptA:    ld    de,OpAFlg
  1532.     jr    DoOpt
  1533. ;
  1534. OptC:    ld    de,OpCFlg
  1535. ;
  1536. DoOpt:    ld    a,(de)
  1537.     cpl
  1538.     ld    (de),a
  1539.     jr    GotOpt
  1540. ;
  1541. ; Z3Chk -- Checks for ZCPR3 using high byte of ENVPTR.  Returns NZ
  1542. ; if Z-System.
  1543. ;
  1544. Z3Chk:    ld    a,(envptr+1)
  1545.     or    a
  1546.     ret
  1547. ;
  1548. ; GetDU -- Returns drive in B and user in C.  If no drive is found,
  1549. ; returns current drive.  Under CP/M, returns current user only.
  1550. ; Expects address of FCB in IX.  Uses AF and BC.
  1551. ;
  1552. GetDU:    call    retud        ; B=current drive, C=current user
  1553.     ld    a,(ix+0)    ; get drive byte
  1554.     or    a
  1555.     jr    z,GetDU1    ; (none)
  1556.     dec    a        ; make A=0, etc.
  1557.     ld    b,a        ; ..and put drive in B
  1558. GetDU1:    ld    a,(envptr+1)    ; Z-System?
  1559.     or    a
  1560.     ret    z        ; (no)
  1561.     ld    c,(ix+13)    ; put user in C
  1562.     ld    a,(ix+15)    ; get error byte
  1563.     or    a
  1564.     ret    z
  1565.     ld    a,2        ; error code
  1566.     call    eprint
  1567.     db    ' Invalid directory.',0
  1568.     jp    ErExit
  1569. ;
  1570. ; InDU and OutDU -- logs into correct directory for source file (InDU)
  1571. ; and destination file (OutDU).  Preserves all registers.
  1572. ;
  1573. InDU:    push    bc
  1574.     ld    bc,(InDir)
  1575.     jr    SetDU
  1576. ;
  1577. OutDU:    push    bc
  1578.     ld    bc,(OutDir)
  1579. SetDU:    call    logud
  1580.     pop    bc
  1581.     ret
  1582. ;
  1583. ; PrtDU -- Prints DU in BC.  Uses AF.
  1584. ;
  1585. PrtDU:    ld    a,b        ; get drive
  1586.     add    'A'        ; make it printable
  1587.     call    cout
  1588.     ld    a,c        ; get user
  1589.     call    paudc
  1590.     ld    a,':'        ; add a colon
  1591.     call    cout
  1592.     ret
  1593. ;
  1594. ; DatStp -- Get create stamp from original file, if available, and
  1595. ; transfer it to new file.  Uses temporary storage at StpTmp (5 bytes).
  1596. ;
  1597. DatStp:    call    InDU        ; setup for input file
  1598.     ld    de,CpmFcb
  1599.     call    initfcb        ; re-initialize FCB
  1600.     ld    hl,CpmDma    ; point to DMA buffer
  1601.     call    getstp        ; get ZSDOS file stamp
  1602.     ret    nz        ; (error, give up)
  1603.     ld    a,(CpmDma+1)    ; check for create date
  1604.     or    a
  1605.     jr    nz,DatSt1    ; (we've got a create date)
  1606.     ld    a,(CpmDma+11)    ; none, so check for modify date
  1607.     or    a
  1608.     ret    z        ; (no date stamp)
  1609.     ld    hl,CpmDma+10    ; point to modify date
  1610.     jr    DatSt2
  1611. DatSt1:    ld    hl,CpmDma    ; point to create date
  1612. DatSt2:    ld    de,StpTmp    ; move date to storage
  1613.     ld    bc,5
  1614.     ldir
  1615.     call    OutDU        ; setup for output file
  1616.     ld    de,OutFcb
  1617.     call    initfcb
  1618.     ld    hl,CpmDma    ; point to DMA buffer
  1619.     call    getstp        ; get file stamp
  1620.     ret    nz        ; (error, give up)
  1621.     ld    hl,StpTmp
  1622.     ld    de,CpmDma    ; move old create stamp to date string
  1623.     ld    bc,5
  1624.     ldir
  1625.     ld    de,OutFcb    ; setup for file stamping
  1626.     ld    hl,CpmDma
  1627.     call    setstp        ; set file stamp
  1628.     ret
  1629. ;
  1630. ; ClsIn -- close input file.
  1631. ;
  1632. ClsIn:    call    InDU
  1633.     ld    de,CpmFcb
  1634.     call    f$close
  1635.     ret
  1636. ;
  1637. ; ClsOut -- close output file.
  1638. ;
  1639. ClsOut:    call    OutDU
  1640.     ld    de,OutFcb
  1641.     call    f$close
  1642.     ret
  1643. ;
  1644. ; ChkAmb -- check for ambiguous filename at address in HL.
  1645. ;
  1646. ChkAmb:    ld    bc,11
  1647.     ld    a,'?'
  1648.     cpir
  1649.     ret    nz        ; (okay)
  1650.     call    ClsIn        ; in case...
  1651.     ld    a,8        ; error code
  1652.     call    eprint
  1653.     db    ' Ambiguous filename.',0
  1654.     jp    ErExit
  1655. ;
  1656. ; CkAbrt -- checks for user abort
  1657. ;
  1658. CkAbrt:    call    condin        ; check keyboard
  1659.     ret    z        ; (nothing)
  1660.     cp    CtrlC
  1661.     ret    nz        ; (not ^C)
  1662.     call    eprint
  1663.     db    CR,LF,'Aborted.',0
  1664.     ld    a,(AbtFlg)    ; get error code, if any
  1665. Abort:    push    af        ; save error code
  1666.     call    ClsIn        ; close files
  1667.     call    ClsOut
  1668.     ld    de,OutFcb    ; delete partial output
  1669.     call    f$delete
  1670.     pop    af        ; recover error code
  1671.     jp    ErExit
  1672. ;
  1673. ; Usage -- Intelligent help screen.
  1674. ;
  1675. Usage:    call    eprint
  1676. DftNam:    db    'ITOZ    Version '
  1677.     db    Vers/10+'0','.',Vers mod 10+'0',SubVers,CR,LF
  1678.     db    'Translates extended Intel opcodes to Zilog.',CR,LF
  1679.     db    'Usage:',CR,LF
  1680.     db    '   ',0
  1681.     ld    hl,comnam    ; print program name
  1682.     call    epstr
  1683.     call    eprint
  1684.     db    ' {dir:}infile {dir:}{outfile} {{/}options}',CR,LF
  1685.     db    'Default outfile is "infile.Z80".',CR,LF
  1686.     db    'Options:',CR,LF
  1687.     db    '   A   ',0
  1688.     ld    a,(OpAFlg)
  1689.     or    a
  1690.     call    nz,PrDont
  1691.     call    eprint
  1692.     db    'replace "*" with ";" before comments',CR,LF
  1693.     db    '   C   ',0
  1694.     ld    a,(OpCFlg)
  1695.     or    a
  1696.     call    nz,PrDont
  1697.     call    eprint
  1698.     db    'add missing colons after labels',CR,LF
  1699.     db    '   Q   quiet mode',0
  1700.     ld    a,(OpQFlg)
  1701.     or    a
  1702.     call    nz,PrOff
  1703.     call    eprint
  1704.     db    CR,LF
  1705.     db    'Opcodes in source file must be in upper-case.',0
  1706.     jp    Finish
  1707. ;
  1708. PrOff:    call    eprint
  1709.     db    ' off',0
  1710.     ret
  1711. ;
  1712. PrDont:    call    eprint
  1713.     db    'don''t ',0
  1714.     ret
  1715. ;
  1716. ; Initialized data . . .
  1717. ;
  1718. ; Message for flagging unknown opcodes in output file
  1719. BadMsg:    db    '; *** FOLLOWING INSTRUCTION NOT RECOGNIZED',CR,LF
  1720. ;
  1721. DftTyp:    db    'Z80'        ; default output filetype
  1722. ;
  1723. ; Small tables and strings used by various routines
  1724. ;
  1725. EQM:    db    'EQU'        ; used by L2
  1726. SEM:    db    'SET'        ; used by LIN3
  1727. DEFLM:    db    'DEFL'        ; used by NFIX
  1728. ASETM:    db    'ASET'        ; used by NFIX
  1729. LDM1:    db    'LD',9        ; used by LDM
  1730. PAR1:    db    '(HL)'        ; used by PAR
  1731. IDX1:    db    '(I'        ; used by IDX
  1732. RPC1:    db    '),'        ; used by RPC
  1733. RPTAB:    db    'BCDEHLSPIXIY'    ; used by DO2 and TYP42
  1734. TP72:    db    'A,('        ; used by TP71
  1735. TPB2:    db    ',('        ; used by TPB1
  1736. TPE2:    db    'PUSH',9    ; used by TPE
  1737. TPE5:    db    'POP',9        ; used by TPE
  1738. AFM:    db    'AF'        ; used by TPE4
  1739. EXM:    db    'EX',9        ; used by TPF
  1740. CHG:    db    'DE,HL'        ; used by TPF
  1741. XAF:    db    'AF,AF'''    ; used by TPF
  1742. SPM:    db    '(SP),'        ; used by TPF2
  1743. ;
  1744. ARTAB:    db    2,'CP',3,'SBC',3,'AND' ; used by TYP1
  1745.     db    2,'OR',3,'XOR'
  1746. ;
  1747. AITAB:    db    3,'ADI',3,'ADD'    ; used by TYP2
  1748.     db    3,'ACI',3,'ADC'
  1749.     db    3,'SUI',3,'SUB'
  1750.     db    3,'SBI',3,'SBC'
  1751.     db    3,'ANI',3,'AND'
  1752.     db    3,'ORI',2,'OR'
  1753.     db    3,'XRI',3,'XOR'
  1754.     db    3,'CPI',2,'CP'
  1755. ;
  1756. IRM:    db    'INC',9        ; used by TYP32
  1757.     db    'DEC',9
  1758. ;
  1759. ADM:    db    'ADD'        ; used by TYP4
  1760. HLM:    db    'HL'        ; used by TYP41
  1761. RSTABL:    db    '0008162432404856' ; used by RSTT
  1762. JPM:    db    'JP',9        ; used by TYP8
  1763. JRM:    db    'JR',9        ; used by TYP8
  1764. CLM:    db    'CALL',9    ; used by TYP9
  1765. RTM:    db    'RET',9        ; used by TYPA
  1766. INM:    db    'IN',9        ; used by TYPB
  1767. RCM:    db    ',(C),'        ; used by TYPB and TYPC
  1768. OTM:    db    'OUT',9        ; used by TYPC
  1769. IMM:    db    'IM',9        ; used by TYPD
  1770. ;
  1771.     MACLIB    IZTABLES    ; insert large tables here
  1772. ;
  1773. ; Uninitialized data . . .
  1774. ;
  1775.     DSEG
  1776. ;
  1777. SetFlg:    ds    1        ; SET/EQU flag
  1778. LCnt:    ds    2        ; line counter
  1779. ErCode:    ds    1        ; error code storage (80h if syntax error)
  1780. OutFn:    ds    12        ; final output filename
  1781. InDir:    ds    2        ; source directory
  1782. OutDir:    ds    2        ; destination directory
  1783. OpQFlg:    ds    1        ; quiet flag
  1784. OpAFlg:    ds    1        ; replace asterisks with semi-colons flag
  1785. OpCFlg:    ds    1        ; colons on labels flag
  1786. CmtFlg:    ds    1        ; comment/no comment flag
  1787. LChar:    ds    1        ; storage for character at end of instruction
  1788. LCAdr:    ds    2        ; storage for address of above
  1789. LLen:    ds    2        ; storage for line length
  1790. InPtr:    ds    2        ; current pointer to 8080 program buffer
  1791. IBoL:    ds    2        ; beginning of current input line
  1792. OBoL:    ds    2        ; beginning of current output line
  1793. MemTop:    ds    2        ; top of memory
  1794. OutPtr:    ds    2        ; current pointer to output buffer
  1795. LstByt:    ds    2        ; pointer to 1st byte after last read
  1796. InBuf:    ds    2        ; input buffer address
  1797. StpTmp:    ds    5        ; temporary date stamp storage
  1798. OutFcb:    ds    36        ; output FCB
  1799.     ds    100        ; stack
  1800. Stack:    ds    2        ; storage for original stack pointer
  1801. LinBuf:    ds    256        ; line buffer
  1802. OutBuf:    ds    256        ; output buffer
  1803. ;
  1804.     end
  1805.