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 / BEEHIVE / COMMS / CP411SRC.ARK / cpscom.asm < prev    next >
Assembly Source File  |  1991-08-27  |  44KB  |  1,372 lines

  1. ; CPSCOM.ASM
  2. ;       KERMIT - (Celtic for "FREE")
  3. ;
  4. ;       This is the CP/M-80 implementation of the Columbia University
  5. ;       KERMIT file transfer protocol.
  6. ;
  7. ;       Version 4.0
  8. ;
  9. ;       Copyright June 1981,1982,1983,1984,1985
  10. ;       Columbia University
  11. ;
  12. ; Originally written by Bill Catchings of the Columbia University Center for
  13. ; Computing Activities, 612 W. 115th St., New York, NY 10025.
  14. ;
  15. ; Contributions by Frank da Cruz, Daphne Tzoar, Bernie Eiben,
  16. ; Bruce Tanner, Nick Bush, Greg Small, Kimmo Laaksonen, Jeff Damens, and many
  17. ; others. 
  18. ;
  19. ;       This file contains some of the main loop commands, all SET xxx and
  20. ;    status routines.  File split from CPSMIT.ASM as that file 
  21. ;    was getting too big.
  22. ;
  23. ; revision history:
  24. ;
  25. ;edit 13, 25-Mar-1991 by MF. Require confirmation if a STAY command
  26. ;    (code at "noexit") is given and a question-mark is entered.
  27. ;edit 12, 21-Mar-1991 by MF.  Change SET COLLISSION REPLACE to
  28. ;    SET COLLISION OVERWRITE to conform with C-Kermit. Modify SET COLLISION
  29. ;    help text slightly.
  30.  
  31. ;edit 11, 27-Feb-1991 by MF. Show Kermit version in VERSION command
  32. ;    ("shover").
  33. ;edit 10, 12-Feb-1991 by MF. Modified OUTPUT command to get a "confirm"
  34. ;    after accepting the string to be output so that the OUTPUT command
  35. ;    doesn't immediately execute if a terminator other than <cr> is typed
  36. ;    (immediate execution confuses some users new to Kermit). This
  37. ;    situation should seldom, if ever, occur, as the OUTPUT command
  38. ;    is most likely to be executed in a TAKE-file but one should
  39. ;    protect oneself, shouldn't one?
  40. ;    Also commented out case-sensivity code as it is unlikely to be used.
  41. ;edit 9, 4-Dec-1990 by MF. Add "stautr" routine to display Autoreceive
  42. ;    status in SHOW/STATUS/<ESC>S commands.
  43. ;edit 8, 30-Nov-1990 by MF. Modify routine "statvt" (terminal status) to
  44. ;    display setting of "quiet" switch. Although I presume that Mr.
  45. ;    Schou thought the code would accommodate display of QUIET or
  46. ;    REGULAR, the code does not in fact allow this since the emulation
  47. ;    flag is not involved in the "quiet" setting.
  48. ;    Also fix SET TERMINAL's help text a bit.
  49. ;edit 7, 8-Nov-1990 by MF.  In SET {RECEIVE/SEND} PACKET-LENGTH routines,
  50. ;    call utility routine subbc from CPSUTL.ASM to do 16-bit subtraction
  51. ;    rather than doing it in-line to save a few bytes.  Eliminate
  52. ;    commented-out instructions.
  53. ;edit 6, 1-Nov-1990 by MF.  Changed SET BAUD-RATE to SET SPEED in the quest
  54. ;    for uniformity of nomenclature (per request of FDC).
  55. ;edit 5, 17-Oct-1990 by MF.  Change SET {RECEIVE SEND} PACKET-SIZE to
  56. ;    SET {RECEIVE SEND} PACKET-LENGTH to conform with the nomenclature
  57. ;    suggested in Chapter 10 of the 6th edition of the Kermit Protocol
  58. ;    Manual.
  59. ;edit 4, 14-Sep-1990 by MF.  Implemented SET FILE-COLLISION (SET COLLISION)
  60. ;    command (except for SET COLLISION ASK and SET COLLISION APPEND).
  61. ;    How one APPENDs to a CP/M file depends upon whether it's ASCII or
  62. ;    BINARY -- something we may not know.
  63. ;    Also implemented SET INCOMPLETE-FILE command.
  64. ;    Let's also restore SET FILE-MODE DEFAULT:  I never use it but if
  65. ;    we leave the DEFAULT code, as Version 4.09 does, the user is entitled
  66. ;    to be able to select it if he/she wishes (I'd favor getting rid
  67. ;    of it altogether but as soon as I did that, someone'd come out
  68. ;    of the woodwork and complain vehemently that he/she **likes** 
  69. ;    SET FILE-MODE DEFAULT and would the so-and-so who took it out
  70. ;    please put it back in.  Such is life.  In any case, the user can
  71. ;    always set the file-mode from a take-file.
  72. ;edit 3, 9-Sep-1990 by MF.  Implemented setting of packet sizes for
  73. ;    packets up thru length 94 characters for SEND and RECEIVE.  Even
  74. ;    for standard-length packets, variable sizes are useful.
  75. ;    Correct 16-bit subtraction in stspks/strpks to set carry if needed
  76. ;    Also corrected bug in routine getnp wherein a JMP KERMIT
  77. ;    instruction was left out after trying to parse a confirm, thus
  78. ;    skipping loading of number into HL.
  79. ;    Fixed bug in PRTSTR wherein BC/HL were not saved under certain
  80. ;    conditions, thus causing garbage to appear when PRTSTR was
  81. ;    called with QUIETD set.
  82. ; edit 2, September 10, 1987, by OBSchou.  Changed SET IBM to reset the 
  83. ;    flow control flag.  IBMs use 13h as a turnaround character (so they
  84. ;    say) so no flow control.  Anybody willing to add comments etsc, as I 
  85. ;    have NO IDEA what IBMs do or need.
  86. ;    Also removed the SET FILE-MODE DEFAULT option, as it always causes
  87. ;    so much trouble.  Assume the default mode to be ASCII.  Moved a test
  88. ;    for key pressed from the status routine to the CPSUTL file.
  89. ;
  90. ; edit 1, April 8th, 1987.
  91. ;    Hived off the SET command etc from CPSMIT.ASM to 
  92. ;    make a more manageable file
  93.  
  94.  
  95. comver:    db    'CPSCOM.ASM (13) 25-Mar-1991$'    ;name, edit no. and date
  96. ;
  97. ;
  98. ; This is the SET command.
  99.  
  100. setcom:    lxi    d,settab    ;Parse a keyword from the set table.
  101.     lxi    h,sethlp
  102.     call    keycmd
  103.     xchg        ; Get result (dispatch address) into HL
  104.     pchl        ; Dispatch.
  105.  
  106. settab:    db    26        ;[pcc013] 16 entries [Toad Hall] [9], now 17
  107.                 ;[11] removed XMIT and added CASE and FLOW-CTL
  108.                 ; Value is address of processing routine.
  109.                 ;[14] removed SET CASE-SENSITIVE for now
  110.                 ;[DRJ] Added SET USER. settab = 22
  111.                 ;[OBS] Added SET AUTORECEIVE. 
  112.                 ; and SET NO-EXIT.  settab = 24
  113.                 ;[MF]Added SET COLLISION, settab=25
  114.                 ;[MF]Added Set Incomplete settab=26
  115.     db    11,    'AUTORECEIVE$'
  116.         dw setaut
  117.     db    16,    'BLOCK-CHECK-TYPE$'
  118.         dw blkset
  119.     db    11,    'BUFFER-SIZE$'
  120.         dw setbuf
  121. ;       db      14,    'CASE-SENSITIVE$'   ;[10]
  122. ;               dw setcase              ;[10]
  123.     db    9,'COLLISION$'    ;[MF]
  124.     dw    setcol        ;[MF]
  125.     db    5,    'DEBUG$'
  126.         dw setdbg
  127.     db    12,    'DEFAULT-DISK$'
  128.         dw setdisk
  129.     db    19,    'DIRECTORY-FILE-SIZE$'
  130.         dw hidef
  131.     db    6,    'ESCAPE$'
  132.         dw escape
  133.     db    9,    'FILE-MODE$'
  134.         dw setcpm
  135.     db    12,    'FLOW-CONTROL$'    ;[10]
  136.         dw setflo        ;[10]
  137.     db    3,    'IBM$'
  138.         dw ibmset
  139.     db    16,'INCOMPLETE-FILES$'
  140.     dw    setinc        ;[MF]Set Incomplete
  141.     db    10,    'LOCAL-ECHO$'
  142.         dw locall
  143.     db    7,    'LOGGING$'        ;[pcc013]
  144.         dw setlog        ;[pcc013]
  145.     db    7,    'NO-EXIT$'
  146.         dw noexit
  147.     db    6,    'PARITY$'
  148.         dw parset
  149.     db    4,    'PORT$'
  150.         dw prtset
  151.     db    7,    'PRINTER$'
  152.         dw setprn
  153.     db    7,    'RECEIVE$'        ;[gnn]
  154.         dw setrec        ;[gnn]
  155.     db    4,    'SEND$'        ;[gnn]
  156.         dw setsnd        ;[gnn]
  157.     db    5,    'SPEED$';[MF]
  158.         dw baud
  159.     db    7,    'TACTRAP$'
  160.         dw settac
  161.     db    8,    'TERMINAL$'
  162.         dw vt52em
  163.     db    5,    'TIMER$'
  164.         dw settim
  165.     db    4,    'USER$'        ;[DJR]
  166.         dw user        ;[DJR]
  167.     db    7,    'WARNING$'
  168.         dw filwar
  169.  
  170. ; help message for SET command. Caps indicate keywords
  171.  
  172. sethlp:    db    cr,lf,'AUTORECEIVE to automatically re-receive files'
  173.     db    cr,lf,'BLOCK-CHECK-TYPE for error detection'
  174.     db    cr,lf,'BUFFER-SIZE for multi-sector buffering'
  175. ;       db      cr,lf,'CASE-SENSITIVE to equate lower and upper case'   ;[10]
  176.     db    cr,lf,'COLLISION to specify action for filename conflicts'
  177.     db    cr,lf,'DEBUG message control'
  178.     db    cr,lf,'DEFAULT-DISK to receive data'
  179.     db    cr,lf,'DIRECTORY-FILE-SIZE when displaying directories'
  180.     db    cr,lf,'ESCAPE character during CONNECT'
  181.     db    cr,lf,'FILE-MODE for outgoing files'
  182.     db    cr,lf,'FLOW-CONTROL to set XON/XOFF flow control'    ;[10]
  183.     db    cr,lf,'IBM mode: parity and turn around handling'
  184.     db    cr,lf,'INCOMPLETE-FILE disposition'
  185.     db    cr,lf,'LOCAL-ECHO (half-duplex)'
  186.     db    cr,lf,'LOGGING of terminal sessions'    ;[pcc013]
  187.     db    cr,lf,'NO-EXIT to prevent exit to CP/M after a command tail'
  188.     db    cr,lf,'PARITY for communication line'
  189.     db    cr,lf,'PORT to communicate on'
  190.     db    cr,lf,'PRINTER copy control'
  191.     db    cr,lf,'RECEIVE parameters'    ;not all currently implemented
  192.     db    cr,lf,'SEND parameters'        ;Ditto
  193.     db    cr,lf,'SPEED of communication line'
  194.     db    cr,lf,'TAC interface support'
  195.     db    cr,lf,'TERMINAL to set a terminal type'
  196.     db    cr,lf,'TIMER control'
  197.     db    cr,lf,'USER to set a user number'        ;[DJR]
  198.     db    cr,lf,'WARNING for filename conflicts'
  199.     db    '$'
  200.  
  201. ;
  202. ; SET AUTORECEIVE on/off command
  203. setaut:    call    onoff        ; set it either on or off
  204.     sta    autorc        ; and save the flag
  205.     jmp    kermit        ; and do next command
  206.  
  207. ;SET BLOCK-CHECK-TYPE command.
  208.  
  209. blkset:    lxi    d,blktab    ;Get the address of the block-check table
  210.     lxi    h,blkhlp    ;And the address of the help text
  211.     call    chkkey        ;Go check input (val returns in A).
  212.     sta    chktyp        ;Save desired checksum type
  213.     jmp    kermit        ;Go get another command
  214.  
  215. blktab:    db    3        ;Three entries.
  216.     db    20,    '1-CHARACTER-CHECKSUM$',    '1','1'
  217.     db    20,    '2-CHARACTER-CHECKSUM$',    '2','2'
  218.     db    21,    '3-CHARACTER-CRC-CCITT$',    '3','3'
  219.  
  220. blkhlp:    db    cr,lf,'1-CHARACTER-CHECKSUM'
  221.     db    cr,lf,'2-CHARACTER-CHECKSUM'
  222.     db    cr,lf,'3-CHARACTER-CRC-CCITT$'
  223.  
  224. ;
  225. ;       This is the SET BUFFER-SIZE command.  
  226. ;       Sets to maximum number of sectors to use for multiple sector 
  227. ;       buffering.  Sorts a lot f problems on some slow disc-access machines..
  228. setbuf:    mvi    a,cmnum        ; get a number from the user 
  229.     call    comnd
  230.     jmp    kermit        ; error if nothing
  231.     lhld    number        ; get the value
  232.     mov    a,h
  233.     ana    a
  234.     jnz    setbu1        ; if number greater than 255 then error
  235.     lda    maxbsc        ; get maximum no sectors allowed by system
  236.     cmp    l        ; set flags from a-l
  237.     jm    setbu1        ; if l > a then error
  238.     mov    a,l        ; only ls bits used
  239.     sta    bufsec
  240.     jmp    kermit
  241.  
  242. setbu1:    lxi    d,erms25
  243.     call    prtstr
  244.     jmp    kermit
  245.  
  246.  
  247. ;SET DEFAULT DISK command
  248.  
  249. setdisk:lxi    d,fcb
  250.     mvi    a,cmifin    ;get "file-spec" silently
  251.     call    comnd
  252.     jmp    setdi1
  253. setdi1:    lda    fcb
  254.     ora    a        ;Was a drive specified? (if zero, no)
  255.     jnz    setdi2        ;he typed a drive-spec
  256.     lda    curdsk        ;he didn't - give him default
  257. setdi2:    sta    curdsk
  258.     mvi    c,inbdos    ;reset disks
  259.     call    bdos
  260.     lda    curdsk
  261.     dcr    a        ;LOGDSK is relative 0
  262.     mov    e,a
  263.     mvi    c,logdsk
  264.     call    bdos        ;and "LOG" it
  265.     jmp    kermit        ;all done
  266. ;
  267. ;SET SEND command.  Sort of supported
  268.  
  269. setsnd:    lxi    d,stsntb    ;Parse a keyword from the set send table.
  270.     lxi    h,stshlp
  271.     call    keycmd
  272.     xchg        ; Get dispatch address into HL
  273.     pchl        ; Go for it.
  274.  
  275. stsntb:    db    4        ;Two entries.  four entries
  276.     db    8, 'PAD-CHAR$'
  277.         dw stspac
  278.     db    7, 'PADDING$'
  279.         dw stspad
  280.     db    15, 'START-OF-PACKET$'    ;[gnn]
  281.         dw stssop        ;[gnn]
  282.     db    13,'PACKET-LENGTH$'    ;
  283.         dw stspks        ;
  284. ;    db    9,'CHECKTYPE$'        ;
  285. ;        dw stsckt        ;
  286.  
  287. stshlp:    db    cr,lf,'PAD-CHAR to define the pad character to use'
  288.     db    cr,lf,'PADDING to define the number of PAD-CHAR to use'
  289.     db    cr,lf,'START-OF-PACKET to define the start of packet character'    ;[gnn]
  290.     db    cr,lf,'PACKET-LENGTH for the length of transmitted packet';
  291. ;    db    cr,lf,'CHECKTYPE to define the check-type to use';[21]
  292.     db    '$'        ;[gnn]
  293.  
  294. ; SET SEND START-OF-PACKET   [gnn]
  295. stssop:    call    cfmcmd
  296.     lxi    d,sopmes
  297.     call    prtstr
  298.     mvi    c,conin
  299.     call    bdos
  300.     sta    sndsop
  301.     jmp    kermit
  302.  
  303. ; SET SEND PADDING command. does nothing.  get value to dspad
  304. stspad:    call    getnp        ; get the number of padding characters
  305.     sta    dspad        ; save ad default send no. pad characters
  306.     jmp    kermit
  307.  
  308. ; SET SEND PAD-CHAR command. does nothing.  gets char to dspadc
  309. stspac:    call    getpad        ; get the character to use
  310.     sta    dspadc        ; save as default send pad character
  311.     jmp    kermit
  312.  
  313. ; SET SEND PACKET-LENGTH command.  Max 95, but could be more for long pkts...
  314. stspks:    call    getnp        ; get number into hl
  315.     lxi    b,(maxpkt-1)    ;[MF] One below upper limit of packet-size
  316.     push    h        ;[MF] Save number
  317.     call    subbc        ;[MF] Do 16-bit subtraction, even though
  318.                 ;[MF] getnp puts low-order bits in a,
  319.                 ;[MF] in case long packets are
  320.                 ;[MF] implemented
  321.     pop    h        ;[MF] Restore number
  322.     lxi    d,erms26    ; packet length to long error
  323.     jnc    stspk1
  324.     mov    a,l
  325.     sta    spsiz        ;[MF] Save as default send packet length
  326.     jmp    kermit
  327. stspk1:    call    prtstr
  328.     jmp    kermit        ; error exit
  329.  
  330. ; SET SEND CHECKTYPE command. Accepts 1,2 or 3
  331. stsckt:    call    getnp        ; get a number
  332.     cpi    4        ; if more than 3 then error
  333.     jnz    stsck1
  334. stsck2:    lxi    d,erms27    ; checktype wrong
  335.     jmp    kermit
  336. stsck1:    cpi    0        ; error also for null
  337.     jz    stsck2
  338.     adi    30h        ; make it printable
  339.     sta    sdckt        ; save as default send checktype
  340.     jmp    kermit
  341.  
  342.  
  343. ;SET RECEIVE command.   [gnn]
  344. setrec:    lxi    d,strctb    ;Parse a keyword from the set rec table.
  345.     lxi    h,stshlp    ; use same help for send and receive
  346.     call    keycmd
  347.     xchg        ; Get dispatch address into HL
  348.     pchl        ; Go for it.
  349.  
  350. strctb:    db    4        ;  Three entries.  four entries
  351.     db    8, 'PAD-CHAR$'
  352.         dw strpac    ; use dummy entry of set send
  353.     db    7, 'PADDING$'
  354.         dw strpad    ; use dummy entry of set send
  355.     db    15,'START-OF-PACKET$'
  356.         dw strsop
  357.     db    13,'PACKET-LENGTH$'        ;
  358.         dw strpks        ;
  359. ;    db    9,'CHECKTYPE$'        ;
  360. ;        dw strckt        ;
  361.  
  362. ; SET RECEIVE START-OF-PACKET  
  363. strsop:    call    cfmcmd
  364.     lxi    d,sopmes
  365.     call    prtstr
  366.     mvi    c,conin
  367.     call    bdos
  368.     sta    rcvsop
  369.     jmp    kermit
  370.  
  371. ; SET RECEIVE PADDING
  372. strpad:    mvi    a,cmnum        ; go parse a number
  373.     call    comnd        ; get it
  374.     jmp    kermit        ; duff entry, so die
  375.     mvi    a,cmcfm        ; ask to confirm
  376.     call    comnd
  377.     lhld    number        ; get the number of padding charaters
  378.     mov    a,l        ; assume 255 or less
  379.     sta    dspad        ; save ad default send no. pad characters
  380.  
  381. ; SET SEND RECEIVE routines
  382. getpad:    call    cfmcmd
  383.     lxi    d,padcms    ; tell user we want the pad character
  384.     call    prtstr
  385.     mvi    c,conin        ; get it verbatum
  386.     call    bdos
  387.     ret
  388.  
  389. ; SET RECEIVE PAD-CHAR routine
  390. strpac:    call    getpad        ; get the character to use
  391.     sta    drpadc        ; save it
  392.     jmp    kermit
  393.  
  394. ; SET RECEIVE PACKET-LENGTH.  Max 95, but could be more for long pkts...
  395. strpks:    call    getnp        ; get number into hl
  396.     lxi    b,(maxpkt-1)    ;[MF] One below upper limit of packet-size
  397.     push    h        ;[MF] Save number
  398.     call    subbc        ;[MF] Do 16-bit subtraction, even though
  399.                 ;[MF] getnp puts low-order bits in a,
  400.                 ;[MF] in case long packets are
  401.                 ;[MF] implemented
  402.     pop    h        ;[MF] Restore number
  403.     lxi    d,erms26    ; packet length to long error
  404.     jnc    strpk1
  405.     mov    a,l
  406.     sta    rpsiz        ;[MF] Save as default receive packet-length
  407.     jmp    kermit
  408. strpk1:    call    prtstr
  409.     jmp    kermit        ; error exit
  410.  
  411.  
  412. ; SET RECEIVE CHECKTYPE
  413. strckt:    call    getnp        ; get a number
  414.     cpi    4        ; if more than 3 then error
  415.     jnz    strck1
  416. strck2:    lxi    d,erms27    ; checktype wrong
  417.     jmp    kermit
  418. strck1:    cpi    0        ; error also for null
  419.     jz    strck2
  420.     adi    30h        ; make it printable
  421.     sta    rdckt        ; save as default receive checktype
  422.     jmp    kermit
  423.  
  424. getnp:    mvi    a,cmnum        ; go parse a number
  425.     call    comnd        ; get it
  426.     jmp    kermit        ; duff entry, so die
  427.     mvi    a,cmcfm        ; ask to confirm
  428.     call    comnd
  429.       jmp    kermit        ;[MF] Die!
  430.     lhld    number        ; get the number of padding charaters
  431.     mov    a,l        ; assume 255 or less
  432.     ret        ; return to caller
  433.  
  434.  
  435. ; SET NO-EXIT on/off.  Sets a flag to prevent automatically dropping 
  436. ;    back to CPM after a command tail has been "done".  No other use.
  437. noexit:    call    cfmcmd        ;[MF]Get a "confirm" in case here via STAY
  438.     xra    a
  439.     sta    nexitf        ; no exit to CP/M
  440.     jmp    kermit
  441.  
  442. ;[pcc013]
  443. ;       This is the SET LOGGING ON/OFF subcommand
  444.  
  445. setlog:    call    onoff        ;[pcc013] Get on/off
  446.     sta    logflg        ;[pcc013] Store flag
  447.     jmp    kermit
  448. ;
  449. ;       This is the SET ESCAPE character subcommand.
  450.  
  451. escape:    call    cfmcmd
  452.     lxi    d,escmes    ;Get the address of the escape message.
  453.     call    prtstr
  454.     mvi    c,conin        ;Get the char.
  455.     call    bdos
  456.     sta    escchr        ;Store the new escape character.
  457.     jmp    kermit
  458.  
  459. ;       This is the SET LOCAL-ECHO subcommand.
  460.  
  461. locall:    call    onoff        ;Get on/off setting [Toad Hall]
  462.     sta    ecoflg        ;Store local echo flag.
  463.     jmp    kermit
  464.  
  465. ;       This is the SET PRINTER ON/OFF subcommand
  466.  
  467. setprn:    call    onoff        ;Get on/off setting [Toad Hall]
  468.     sta    prnflg        ;Store printer flag
  469.     jmp    kermit
  470.  
  471. ;       This is the SET DEBUG ON/OFF subcommand
  472.  
  473. setdbg:    call    onoff        ;Get on/off setting [Toad Hall]
  474.     sta    dbgflg        ;Store debug flag
  475.     jmp    kermit
  476.  
  477. ;[jd] this is the SET TIMER subcommand
  478.  
  479. settim:    call    onoff        ;Get on/off setting [Toad Hall]
  480.     sta    timflg        ;Store timer flag value
  481.     jmp    kermit
  482.  
  483. ;This is the SET FILE-WARNING subcommand
  484.  
  485. filwar:    call    onoff        ;Get on/off setting [Toad Hall]
  486.     sta    flwflg        ;Store file-warning flag.
  487.     jmp    kermit
  488.  
  489. ;[MF]This is the SET COLLISION subcommand
  490. ;[MF]First, the requisite tables:
  491. ;
  492. coltab:    db    4        ;[MF]4 entries
  493.     db    6,'BACKUP$',02h,02h
  494.     db    7,'DISCARD$',03h,03h
  495.     db    9,'OVERWRITE$',00h,00h
  496.     db    6,'RENAME$',01h,01h
  497. ;
  498. colhlp:    db    cr,lf,'BACKUP (rename) existing files'
  499.     db    cr,lf,'DISCARD new versions of existing files'
  500.     db    cr,lf,'OVERWRITE existing files'
  501.     db    cr,lf,'RENAME new versions of existing files'
  502.     db    '$'
  503. ;
  504. ;[MF]Now the routine proper
  505. ;
  506. setcol:    lxi    d,coltab    ;[MF]Table address
  507.     lxi    h,colhlp    ;[MF]Help address
  508.     call    chkkey        ;[MF]Get user's answer
  509.     sta    flwflg        ;[MF]and remember it
  510.     jmp    kermit        ;[MF]Back to main loop
  511.  
  512. ;[10] This is the SET FLOW-CONTROL subcommand.
  513. setflo:    call    onoff        ;is it on or off
  514.     sta    floctl        ; store flow contol flag
  515.     jmp    kermit
  516.  
  517. ;[10] SET CASE-SENSITIVE on or off
  518. ;setcase:    
  519. ;    call    onoff        ; set it on or off
  520. ;    sta    casens        ; save it
  521. ;    jmp    kermit
  522.  
  523. ; SET FILE-SIZE on or off.  If on, then show file size during DIR
  524. ;
  525. hidef:    call    onoff        ; see if on or off
  526.     sta    hidefs
  527.     jmp    kermit
  528.  
  529. ;
  530. ;       This is the SET IBM command.
  531. ;
  532. ;    If SET IBM ON, we should do
  533. ;        1)  Flow Control = off
  534. ;        2)  Parity = mark
  535. ;        3)  Local echo = on
  536. ;        4)  Timer = on
  537. ;
  538. ;    If SET IBM OF, we should assume (& do)
  539. ;        1)  Flow control = off (default)
  540. ;        2)  Parity = none
  541. ;        3)  Local Echo = off
  542. ;        4)  Timer = off
  543.  
  544.  
  545. ibmset:    call    onoff        ;Get on/off setting [Toad Hall]
  546.     sta    ibmflg        ;Store IBM flag.
  547.     ora    a        ;Is it turned on?
  548.     jz    ibmst1        ;If not, set parity to the default.
  549. ;
  550. ; SET IBM ON code
  551.     mvi    a,ibmpar    ;Get the IBM parity.
  552.     sta    parity
  553.     mvi    a,1        ;Set local echo on.
  554.     sta    ecoflg
  555.     sta    timflg        ; also set timer on
  556.     xra    a        ; no flow control
  557.     sta    floctl
  558.     jmp    ibmst2        ; exit
  559. ;
  560. ; SET IBM OFF code
  561.  
  562. ibmst1:    mvi    a,defpar    ; set default parity (none)
  563.     sta    parity
  564.     xra    a        ;Set local echo off.
  565.     sta    ecoflg
  566.     sta    timflg        ;[jd] timer is same as local echo
  567.     sta    floctl        ;[obs] set flow control off
  568. ibmst2:    jmp    kermit        ; exit from here
  569.  
  570. ;
  571. ;       SET FILE-MODE command.
  572. ;[OBS] assume only ascii and binary, no default.
  573.  
  574. setcpm:    lxi    d,typtab
  575.     lxi    h,typhlp
  576.     call    chkkey        ;Get and confirm keyword, or die trying
  577.     sta    cpmflg        ;Set the CPM flag.
  578.     jmp    kermit
  579.  
  580. typtab:    db    3        ;Three entries, now two entries
  581.                 ;[MF]Now 3 again!
  582.     db    5, 'ASCII$',    01H,01H
  583.     db    6, 'BINARY$',    02H,02H
  584.     db    7, 'DEFAULT$',    00H,00H    ; Default
  585.  
  586. typhlp:    db    cr,lf,'ASCII    BINARY    DEFAULT'
  587.     db    '$'
  588. ;
  589. ;setinc - Set Incomplete-file [MF]
  590. ;
  591. setinc:    lxi    d,inctab    ;[MF]Point to tables
  592.     lxi    h,inchlp    ;[MF]...
  593.     call    chkkey        ;[MF]Get user's answer or croak
  594.     sta    incflg        ;[MF]Remember the answer
  595.     jmp    kermit        ;[MF]We are done.
  596. ;
  597. inctab:    db    2        ;two entries
  598.     db    7,'DISCARD$'
  599.     db    00h,00h        ;Discard incomplete files
  600.     db    4,'KEEP$'
  601.     db    01h,01h        ;Keep incomplete files
  602. ;
  603. inchlp:    db    cr,lf,'DISCARD    KEEP'
  604.     db    '$'
  605.  
  606. ;       This is the SET PARITY subcommand.
  607.  
  608. parset:    lxi    d,partab
  609.     lxi    h,parhlp
  610.     call    chkkey        ;Get and confirm keyword, or die trying
  611.     sta    parity        ;Set the parity flag.
  612.     jmp    kermit
  613.  
  614. partab:    db    5        ;Five entries.
  615.     db    4, 'EVEN$',    parevn,parevn
  616.     db    4, 'MARK$',    parmrk,parmrk
  617.     db    4, 'NONE$',    parnon,parnon
  618.     db    3, 'ODD$',    parodd,parodd
  619.     db    5, 'SPACE$',    parspc,parspc
  620.  
  621. parhlp:    db    cr,lf,'EVEN    MARK    NONE    ODD    SPACE$'
  622.  
  623. ;       This is the SET TACTRAP subcommand.
  624. ;       options are ON, OFF, or CHARACTER.  (for CHARACTER, we request the
  625. ;       new TAC Intercept character, and turn the TACtrap on)
  626.  
  627. settac:    lxi    d,tactab
  628.     lxi    h,tachlp
  629.     call    chkkey        ;Get and confirm keyword
  630.     ora    a        ;Was it "OFF" (zero)?
  631.     jz    settc2        ;If so, go disable TACtrap.
  632.     cpi    1        ;Was it "ON"?
  633.     jz    settc1        ;If so, go enable TACtrap.
  634.     lxi    d,tacmes    ;"CHARACTER". request new TAC Intercept char.
  635.     call    prtstr
  636.     mvi    c,conin        ;Get the char.
  637.     call    bdos
  638.     sta    tacchr        ;Store the new TAC Intercept character.
  639. settc1:    lda    tacchr        ;Copy tacchr to tacflg to enable TACtrap.
  640. settc2:    sta    tacflg        ;Enable/disable TACtrap
  641.     jmp    kermit
  642.  
  643. tactab:    db    3        ;Three entries.
  644.     db    9,    'CHARACTER$',    02H,02H
  645.     db    3,    'OFF$',        00H,00H
  646.     db    2,    'ON$',        01H,01H
  647.  
  648. tachlp:    db    cr,lf,'ON to enable TAC trap'
  649.     db    cr,lf,'OFF to disable TAC trap'
  650.     db    cr,lf,'CHARACTER to enable TAC trap and'
  651.     db    ' specify intercept character$'
  652.  
  653. ;       This is the SET VT52-EMULATION subcommand.
  654. ; Now SET TERMINAL xxx
  655. ;vt52em:    lda    vtflg        ;get the flag value
  656. ;    cpi    0ffH        ;0ffH means not allowed -
  657. ;    jz    notimp        ; say it's not implemented.
  658. ;    call    onoff        ;Get keyword (ON or OFF)
  659. ;    sta    vtflg        ;Set the VT52 emulation flag.
  660. ;    jmp    kermit
  661. vt52em:    lxi    d,sttert    ; set terminal type
  662.     lxi    h,stterh    ; help table
  663.     call    chkkey        ; get it
  664.     mov    a,d        ; value returned in DE
  665.     cpi    vtdefe        ; was it selecting an external terminal?
  666.     jnz    vt52e1        ; no, so save new value
  667.     lhld    extern+1    ; if external, lets see if one is in place
  668.     mov    a,h
  669.     ora    l
  670.     mvi    a,vtdefe    ; restore external flag
  671.     jnz    vt52e1        ; we have one, so we can save value
  672.     call    prcrlf
  673.     lxi    d,inms11    ; load up sorry message
  674.     call    prtstr
  675.     jmp    kermit
  676.  
  677. vt52e1:    cpi    40h        ; are we to have a quiet display?
  678.     jnz    vt52e2
  679.     sta    quietd        ; store it
  680.     jmp    kermit
  681.  
  682. vt52e2:    cpi    80h        ; are we to be a noisy display?
  683.     jnz    vt52e3
  684.     xra    a
  685.     sta    quietd
  686.     jmp    kermit
  687.  
  688. vt52e3:    sta    vtflg        ; else save new set parameter..
  689.     jmp    kermit        ; and exit
  690.  
  691. ; tabe with string entry, and the returned value as two identical bytes.
  692. sttert:    db    6        ; six types
  693.     db    4,'DUMB$',vtdefd,vtdefd        ; assume our terminal is thick
  694.     db    8,'EXTERNAL$',vtdefe,vtdefe    ; assume off, but terminal is in dep. code
  695.     db    5,'QUIET$',40h,40h        ; display quiet
  696.     db    7,'REGULAR$',80h,80h        ; display loud
  697.     db    3,'OFF$',vtdefo,vtdefo        ; assume our terminal does everything
  698.     db    4,'VT52$',vtdefv,vtdefv        ; VT52 as before
  699.  
  700. stterh:    db    cr,lf,'DUMB - only printable characters passed to terminal'
  701.     db    cr,lf,'EXTERNAL - with emulation code system specific'
  702.     db    cr,lf,'OFF - all characters passed to terminal'
  703.     db    cr,lf,'QUIET - display nothing during transfers'
  704.     db    cr,lf,'REGULAR - normal display for transfers'
  705.     db    cr,lf,'VT52 - assume Kermit can emulate a VT52'
  706.     db    '$'
  707.  
  708. ;
  709. ;       Note:  For the SET BAUD and SET PORT commands, which might not be
  710. ;       supported for the current system, the command tables are stored in
  711. ;       the overlay.  We locate them through pointers in the linkage area:
  712. ;       spdtab for SET BAUD, prttab for SET PORT.  The contents of spdtab
  713. ;       (or prttab) is the address of the beginning of the table (the table
  714. ;       does NOT begin at spdtab).  If the address is zero, the command is
  715. ;       not supported.  If the table address is nonzero, then there is a
  716. ;       corresponding help message pointed to by (NOT starting at) spdhlp
  717. ;       or prthlp.
  718.  
  719. ;       This is the SET BAUD command
  720.  
  721. baud:    lhld    spdtab        ; get pointer to speed table
  722.     mov    a,h
  723.     ora    l        ; test for NULL (zero)
  724.     jz    notimp        ; if so, say it's not implemented
  725.     xchg        ; move speed table address to DE
  726.     lhld    spdhlp        ; get pointer to speed help text
  727.     call    keycmd
  728.     push    d        ; save selected speed
  729.     call    cfmcmd        ; confirm...
  730.     pop    h        ; restore speed to HL
  731.     shld    speed        ; save all 16 bits of speed value
  732.     xchg        ; move speed to DE
  733.     call    sysspd        ; do system-dependent speed setting.
  734.     jmp    kermit        ; return to command level
  735.  
  736. ;       This is the SET PORT command
  737.  
  738. prtset:    lhld    prttab        ; get pointer to port table
  739.     mov    a,h
  740.     ora    l        ; test for NULL
  741.     jz    notimp        ; not supported if pointer was null.
  742.     xchg        ; move port table address to DE
  743.     lhld    prthlp        ; get pointer to port help text
  744.     call    keycmd
  745.     push    d        ; save selected port entry
  746.     call    cfmcmd        ; confirm...
  747.     pop    h        ; restore table address to HL
  748.     shld    port        ;[hh] save all 16 bits of port value
  749.     call    sysprt        ; go do port stuff
  750.     jmp    kermit
  751. ;
  752. ;       Subroutines for SET subcommands
  753.  
  754. ;       ontab - command table for onoff.
  755. ;       onhlp - help text for onoff.
  756. ;       onoff - accept "ON" or "OFF" keyword.
  757. ;       returns:
  758. ;          success: value in A (non-zero = ON)
  759. ;          error: no return to caller. print error message and return to
  760. ;               main loop.
  761. ontab:    db    2        ;Two entries.
  762.     db    3, 'OFF$',    00H,00H
  763.     db    2, 'ON$',    01H,01H
  764.  
  765. onhlp:    db    cr,lf,'OFF    ON$'
  766.  
  767. onoff:    lxi    d,ontab
  768.     lxi    h,onhlp
  769.     ;Fall through to check input.  [Toad Hall]
  770.  
  771. ;       chkkey - parse and confirm keyword.
  772. ;       called with:
  773. ;          DE/ address of keyword table
  774. ;          HL/ address of help text
  775. ;       returns:
  776. ;          success: low byte of keyword value (from table) in A.
  777. ;          error: no return to caller.  print error message and return to
  778. ;               main loop.  (Since the main loop reloads the stack pointer,
  779. ;               we don't have to attempt to clean up the stack here)
  780.  
  781. chkkey:    call    keycmd        ; Parse a keyword (might not return)
  782.     sta    temp1        ; Save the parsed value
  783.     call    cfmcmd        ; Request confirmation (might not return)
  784.     lda    temp1        ; Get saved value
  785.     ret        ; Return
  786.  
  787. ;[hh]   fndkyw - find a keyword string from a table using 
  788. ;               it's associated value
  789. ;       called with:
  790. ;          HL/ address of keyword table
  791. ;           A/ value associated with keyword string
  792. ;       returns:
  793. ;          success: HL points to first byte of keyword string
  794. ;                   CY flag is cleared
  795. ;          error:   HL points to error string (?Not found)
  796. ;                   CY flag is set
  797.  
  798. fndkyw:    mov    d,m        ;get count of entries
  799.     inx    h        ;advance over count value
  800. fndkw1:    mov    b,m        ;get string length
  801.     inr    b        ;account for $
  802.     inx    h        ;advance over length value
  803.     shld    temp1        ;save string pointer
  804. fndkw2:    inx    h        ;loop over string
  805.     dcr    b
  806.     jnz    fndkw2
  807.     mov    c,m        ;get keyword value from table
  808.     cmp    c        ;do they match?
  809.     jz    fndkw3        ;Yup
  810.     inx    h        ;bump to next keyword
  811.     inx    h        ;
  812.     dcr    d        ;decrement entry count
  813.     jnz    fndkw1        ;check the remaining keywords
  814.     lxi    h,kywdnf    ;point to not found message
  815.     stc        ;give calling routine a not found flag
  816.     ret
  817. fndkw3:    ora    a        ;clear CY to tell caller we succeeded
  818.     lhld    temp1        ;restore the saved string pointer
  819.     ret
  820.  
  821. kywdnf:    db    cr,lf,'?Not found$'    ;not found message
  822.  
  823. ;
  824. ;       This is the SHOW command.
  825.  
  826. show:    call    cfmcmd
  827. ;* Reconcile this and status.
  828.     call    clrtop        ;[hh] Clear screen first
  829.     call    stat01        ;For now just cop out.
  830.     jmp    kermit
  831.  
  832. ;       This is the STATUS command.
  833.  
  834. status:    call    cfmcmd
  835.     call    clrtop        ;[hh] Clear screen first
  836.     call    stat01
  837.     jmp    kermit
  838.  
  839. ;       processor for SHOW, STATUS and <escape>S commands
  840. ;       called by: show, status, intchr
  841.  
  842. stat01:    lda    fileio        ;Are we in transmit?
  843.     ora    a
  844.     jz    sta01b        ;No
  845.     lxi    d,xmtst        ;Yes,say so
  846.     call    prtstr
  847.  
  848. ;       The following block of code - down to RET - re-ordered by  [DJR]
  849. ;       DJR January 1987 to get SHOW/STATUS output in the same     [DJR]
  850. ;       (alphabetical) order as SET's HELP.                        [DJR]
  851. sta01b:
  852.     call    stautr        ;[MF]Show AUTORECEIVE state
  853.         call    stabcc          ; Tell current block check type
  854.         call    stabsz          ; Tell user about multi-sector buffers
  855.     call    stacol        ;[MF]COLLISION state
  856.         call    stadbg          ; [DJR] Debug mode
  857.         call    stacurd         ; [DJR] Current disk
  858.         call    stahfs          ; Tell user if file sizez are hidden during DIR
  859.         call    staesc          ; Tell current escape character
  860.         call    stafil          ; Tell about file type
  861.         call    staflo          ;[10] Tell about flow control
  862.         call    staibm          ; Tell about IBM flag
  863.     call    stainc        ;[MF]Tell about incomplete file disposition
  864. ;
  865. ; Ask user to press a key before continuing
  866. ;
  867.     call    pausit        ; wait for a while till user presses a key
  868. ;
  869.         call    staeco          ; Tell about local echo flag
  870.         call    stalog          ; [pcc003] Tell about log file status
  871.     call    stapar          ; Tell about parity
  872.         lhld    prttab          ;[hh] Got a port table? (is pointer nonzero?)
  873.         mov     a,h             ;[hh]
  874.         ora     l               ;[hh]
  875.         cnz     stapor          ;[hh] If so, tell which port we're using
  876.         call    stalpt          ; Tell about printer copy flag
  877.     call    starps        ;[MF]Show receive packet length
  878.         call    starsp          ;[gnn] tell rec. start-of-pkt char
  879.     call    stasps        ;[MF]Show send packet length
  880.         call    stassp          ;[gnn] tell send start-of-pkt char
  881.         lhld    spdtab          ; Got a speed table? (is pointer nonzero?)
  882.         mov     a,h
  883.         ora     l
  884.         cnz     staspd          ; If so, tell what speed we're running.
  885.         call    statac          ; Tell about TAC flag/intercept character.
  886.         call    statim        ; Tell about timer flag
  887.         call    stusr        ;[7] Tell about user
  888.         call    statvt        ; Tell about what emulation we are doing
  889.         call    stawrn          ; Tell about file-warning flag
  890.         ret
  891.  
  892. ;    stautr - Show Autoreceive setting [MF]
  893. ;
  894. stautr:    lxi    d,autrst    ;[MF]Point to "Autoreceive" string
  895.     call    prtstr        ;[MF]and print it
  896.     lda    autorc        ;[MF]Get Autoreceive flag
  897.     jmp    staton        ;[MF]Say "on" or "off" and return
  898.  
  899. ;       Show the value of the LOCAL-ECHO flag (On or Off).
  900.  
  901. staeco:    lxi    d,locst        ;Get the address of the local echo string.
  902.     call    prtstr
  903.     lda    ecoflg        ;Get the local echo flag.
  904.     jmp    staton        ;Say ON or OFF, and return
  905.  
  906. ;       Show the value of the VT52-EMULATION flag (On, Off, or Not Supported).
  907. ;    Also show terminal display mode (regular, quiet)
  908.  
  909. statvt:    lxi    d,vtdpst    ;[MF]Get address of terminal display string
  910.     call    prtstr        ;[MF]Print it
  911.     lxi    d,vtdpsr    ;[MF]Assume a regular (loud) display
  912.     lda    quietd        ;[MF]Get "quiet" flag
  913.     ora    a        ;[MF]a quiet display?
  914.     jz    statva        ;[MF]No, print "regular" message
  915.     lxi    d,vtdpsq    ;[MF]Yes, point to "quiet" string
  916. statva:    call    prtstr        ;[MF]and print it
  917.     lxi    d,vtemst    ; Get the address of the VT52 emulation string.
  918.     call    prtstr
  919.     lda    vtflg        ; Get the VT52 emulation flag.
  920.     cpi    0ffh        ; isterminal emulation possible?
  921.     jnz    statv0        ; yes, maybe
  922.     lxi    h,inms11    ; ... no, load up not implemented message ...
  923.     jmp    prvtv        ; so tell user
  924.  
  925.  
  926. statv0:    mov    c,a        ; save it to C
  927.     lxi    h,sttert    ; get table listing what we can do
  928.     mov    b,m        ; get number of terminal types to b
  929. statv1:    inx    h        ; point to first entry
  930.     mov    e,m        ; get length of entry
  931.     mvi    d,0
  932.     inx    h        ; point to text part of entry
  933.     xchg        ; save address in de
  934.     dad    d        ; start + length
  935.     inx    h        ;... + 1 for the dollar...
  936.     inx    h        ; plus point to seconcd copy of ter. type value
  937.     cmp    m        ; is it the one we want?
  938.     jz    prvtv        ; yes, then print the terminal type value
  939.     dcr    b        ; have we completed?
  940.     rz        ; yes, then just exit back to status
  941.     jmp    statv1        ; else try next entry.  HL points to next -1
  942.  
  943. prvtv:    jmp    prtstr        ; print string from DE
  944.                 ;[MF]and return
  945.  
  946. ;       Show the value of the FILE-MODE flag (ASCII, Binary, or Default).
  947.  
  948. stafil:    lxi    d,cpmst        ; Get the address of the file mode message.
  949.     call    prtstr
  950.     lda    cpmflg        ; Get the file mode flag.
  951.     lxi    d,defstr    ; Assume Default (0).
  952.     ora    a        ; Is it?
  953.     jz    prtstr        ; If so, say so, and return.
  954.     lxi    d,ascstr    ; Not default, assume ASCII
  955.     cpi    1        ; Is it ASCII?
  956.     jz    prtstr        ; Say ASCII, and return
  957.     lxi    d,binstr    ; Not default or ASCII, must be binary
  958.     jmp    prtstr        ; Print type, and return.
  959. ;
  960. ;Show current disposition for incomplete files [MF]
  961. ;
  962. stainc:    lxi    d,incst        ;[MF]Announce what's to be shown
  963.     call    prtstr        ;[MF]...
  964.     lxi    d,dscstr    ;[MF]Assume "discard"
  965.     lda    incflg        ;[MF]Get flag
  966.     ora    a        ;[MF]Really discarding incomplete files?
  967.     jz    prtstr        ;[MF]Yes, say so and return
  968.     lxi    d,kepstr    ;[MF]No, say we're keeping incomplete files
  969.     jmp    prtstr        ;[MF]and return
  970.  
  971. ;       show if file sizes are hidden during DIR (Would have thought this
  972. ;       obvious, but its in for completeness
  973. stahfs:    lxi    d,hfsod        ; get hide file size on dir
  974.     call    prtstr
  975.     lda    hidefs
  976.     jmp    staton        ; say if on or off
  977.  
  978. ;       Show the value of the IBM-MODE flag (On or Off).
  979.  
  980. staibm:    lxi    d,ibmst        ;IBM string.
  981.     call    prtstr
  982.     lda    ibmflg        ; Get IBM flag.
  983.     jmp    staton        ; Print its value and return
  984.  
  985. ;       Show the value of the FILE-WARNING flag (On or Off).
  986.  
  987. stawrn:    lxi    d,filst        ; File warning string.
  988.     call    prtstr
  989.     lda    flwflg        ; File warning flag.
  990.     jmp    staton        ; Say ON or OFF
  991.  
  992. ;       Show the value of the PRINTER flag (On or Off).
  993.  
  994. stalpt:    lxi    d,prst        ;Printer copy string
  995.     call    prtstr
  996.     lda    prnflg        ;Printer ON/OFF flag
  997.     jmp    staton        ; Say ON or OFF
  998.  
  999.  
  1000. ;       Show status of log file
  1001. stalog: lxi     d,logst         ;[pcc003] Logging lead-in message
  1002.         call    prtstr          ;[pcc003]
  1003. ;       name of logging file
  1004. ;   Code derived from [JD's] code for GET, and uses his FNBUF  [DJR]
  1005.         lxi    d,fnbuf         ;[DJR] point to destination
  1006.         lxi    h,lognam        ;[DJR] source of filespec
  1007.         mov    a,m             ;[DJR] get drive byte
  1008.         ora    a               ;[DJR] zero = default disc
  1009.         jnz    stalg1          ;[DJR] if drive has been specified
  1010.         lda    curdsk          ;[DJR]  otherwise get the default
  1011. stalg1: adi    'A'-1           ;[DJR] make it printable
  1012.         stax   d               ;[DJR] into dest block
  1013.         inx    d               ;[DJR]
  1014.         mvi    a,':'           ;[DJR] colon after drive
  1015.         stax   d               ;[DJR] 
  1016.         inx    d               ;[DJR] 
  1017.  
  1018.         mvi    c,8             ;[DJR] length of name part
  1019.         lxi    h,lognam+1      ;[DJR] start of name
  1020.         mvi    b,0             ;[DJR] first-time-thru flag
  1021. stalga: mov    a,m             ;[DJR] get a char from the name
  1022.         inx    h               ;[DJR] pass it
  1023.         cpi    ' '             ;[DJR] end of this part of name?
  1024.         jz     stalgb          ;[DJR] yes, skip rest...
  1025.         stax   d               ;[DJR] else drop char into dest
  1026.         inx    d               ;[DJR] increment dest ptr
  1027.         dcr    c               ;[DJR] decrement count
  1028.         jnz    stalga          ;[DJR] and continue if more to go
  1029.  
  1030. stalgb: mov    a,b             ;[DJR]
  1031.         ora    a               ;[DJR] first time thru?
  1032.         jnz    stalgc          ;[DJR] no, no period
  1033.         mvi    a,'.'           ;[DJR] period between parts
  1034.         stax   d               ;[DJR] 
  1035.         inx    d               ;[DJR] 
  1036.         mvi    b,0ffh          ;[DJR] not first time thru anymore
  1037.         mvi    c,3             ;[DJR] length of ext part
  1038.         lxi    h,lognam+9      ;[DJR] start of extension
  1039.         jmp    stalga          ;[DJR] keep copying
  1040.  
  1041. stalgc: mvi    a,'$'
  1042.         stax   d               ;[DJR] end the name string
  1043.         lxi    d,fnbuf         ;[DJR] Print the file name
  1044.         call   prtstr          ;[DJR]
  1045.  
  1046.     lxi    d,logst2        ;[DJR] second part of message
  1047.         call   prtstr          ;[DJR]
  1048.  
  1049. ;    Show status of logging
  1050.     lda    logflg        ;[pcc003] get the flag
  1051.     ani    7FH        ;[pcc003] ignore open flag
  1052.     cpi    2        ;[pcc003] is it suspended?
  1053.     jnz    staton        ;[pcc003] no, must be on or off
  1054.     lxi    d,susstr    ;[pcc003] suspended
  1055.     jp    prtstr        ;[pcc003] print and return
  1056.  
  1057. ;       Show the value of the PARITY flag (Odd, Even, Mark, Space, or None).
  1058.  
  1059. stapar:    lxi    d,parst        ;Parity string.
  1060.     call    prtstr
  1061.     lda    parity        ;Get the parity setting.
  1062.     lxi    d,pnonst    ;Assume parity is NONE
  1063.     cpi    parnon        ;Were we right?
  1064.     jz    prtstr        ;Yep, go say None, and return
  1065.     lxi    d,pmrkst    ;Get ready to say Mark
  1066.     cpi    parmrk        ;Is it mark?
  1067.     jz    prtstr        ;Yep, go say Mark, and return
  1068.     lxi    d,pspcst    ;Get ready to say Space
  1069.     cpi    parspc        ;Is it space?
  1070.     jz    prtstr        ;Yep, go say Space, and return
  1071.     lxi    d,poddst    ;Get ready to say Odd
  1072.     cpi    parodd        ;Is it odd?
  1073.     jz    prtstr        ;Yep, go say Odd, and return
  1074.     lxi    d,pevnst    ;Must be Even.
  1075.     jmp    prtstr        ;Say Even, and return.
  1076.  
  1077. ; [gnn] Show start of packet characters
  1078. stassp:    lxi    d,sspmsg    ;message of send s-o-p
  1079.     call    prtstr
  1080.     lda    sndsop
  1081.     adi    'A'-1        ;convert to printable character
  1082.     mov    e,a
  1083.     mvi    c,conout
  1084.     jmp    bdos        ;and print it
  1085. starsp:    lxi    d,rspmsg    ;rec. s-o-p message
  1086.     call    prtstr
  1087.     lda    rcvsop
  1088.     adi    'A'-1        ;convert to printable character
  1089.     mov    e,a
  1090.     mvi    c,conout
  1091.     jmp    bdos        ;and print it
  1092. ;
  1093. ;[MF]Show receive packet length
  1094. ;
  1095. starps:    lxi    d,rpsmsg    ;[MF]Point to message
  1096.     call    prtstr        ;[MF]and print it
  1097.     lda    rpsiz        ;[MF]Get receive packet length
  1098.     mov    l,a        ;[MF]Put in HL
  1099.     mvi    h,0        ;[MF]...
  1100.     jmp    nout        ;[MF]Print receive packet length in decimal
  1101. ;
  1102. ;[MF]stasps - Print send packet length
  1103. ;
  1104. stasps:    lxi    d,spsmsg    ;[MF]Point to message
  1105.     call    prtstr        ;[MF]and print it
  1106.     lda    spsiz        ;[MF]Get send packet length
  1107.     mov    l,a        ;[MF]into HL
  1108.     mvi    h,0        ;[MF]...
  1109.     jmp    nout        ;[MF]and print in decimal
  1110.  
  1111. ;[hh]   Show the current port (if known).
  1112.  
  1113. stapor:    lxi    d,porst        ;[hh]
  1114.     call    prtstr        ;[hh]
  1115.     lda    port        ;[hh] Get current port value
  1116.     lxi    h,spdust    ;[hh] Assume undefined (this error msg is fine)
  1117.     cpi    0FFH        ;[hh] Is it?
  1118.     jz    stat73        ;[hh] Yup. Say so
  1119.     lhld    prttab        ;[hh] Address of port keyword table
  1120.     call    fndkyw        ;[hh] Look for correct keyword string
  1121.     jnc    stpr1        ;[hh] Found a match
  1122.     lxi    h,spdust    ;[hh] No match found - say it's undefined
  1123. stpr1:    jmp    stat73        ;[hh] Print it and return
  1124.  
  1125. ;       Show the current line speed (if known).
  1126.  
  1127. staspd:    lxi    d,spdst
  1128.     call    prtstr
  1129.     lda    speed        ;Get current speed.
  1130.     lxi    h,spdust    ;Assume undefined.
  1131.     cpi    0FFH        ;Is it?
  1132.     jz    stat73        ;Yes.
  1133.     lhld    spdtab        ;Start scanning keyword table.
  1134.     mov    d,m        ; get count of entries
  1135.     inx    h        ; advance over it.
  1136. stat70:    mov    b,m        ;Get string length.
  1137.     inr    b        ;Account for $.
  1138.     inx    h
  1139.     shld    temp1        ;Save string pointer.
  1140. stat71:    inx    h        ;Loop over string.
  1141.     dcr    b
  1142.     jnz    stat71
  1143.     mov    c,m        ;Get speed value
  1144.     cmp    c        ;Match?
  1145.     jz    stat72        ;Yes.
  1146.     inx    h        ;Bump to next keyword.
  1147.     inx    h
  1148.     dcr    d        ; decrement entry count
  1149.     jnz    stat70        ; if more left, check them.
  1150.     lxi    h,spdust    ; can't find it. say it's undefined.
  1151.     jmp    stat73        ; print the message.
  1152.  
  1153. stat72:    lhld    temp1        ;Restore saved string pointer.
  1154.     xchg        ;[MF] Set into DE for display
  1155.     call    prtstr        ;[MF] Print speed
  1156.     lxi    h,spdst2    ;[MF] Point to "bps" message
  1157. stat73:    xchg        ;Set into DE for display.
  1158.     jmp    prtstr        ; print it, and return.
  1159.  
  1160. ;       Show the current BLOCK-CHECK-TYPE (1-, 2-, or 3-character).
  1161.  
  1162. stabcc:    lxi    d,bckst        ;Get the string
  1163.     call    prtstr        ;Print "Block check type: "
  1164.     lda    chktyp        ;Get the type (character 1, 2, or 3)
  1165.     mov    e,a        ;Put into E
  1166.     mvi    c,conout    ;Want to print it
  1167.     call    BDOS        ;Do so
  1168.     lxi    d,bckst1    ;Get rest of text ("-character")
  1169.     jmp    prtstr        ;Print it and return
  1170. ;
  1171. ;[MF]stacol - Print "SET COLLISION" state
  1172. ;
  1173. stacol:    lxi    d,collst    ;[MF]Get message
  1174.     call    prtstr        ;[MF]Print it
  1175.     lxi    h,coltab    ;[MF]Point to COLLISION keywords
  1176.     lda    flwflg        ;[MF]Get COLLISION state
  1177.     call    fndkyw        ;[MF]Get COLLISION state
  1178.                 ;[MF](Since user doesn't control flwflg
  1179.                 ;[MF]directly, no need to check for errors
  1180.     xchg        ;[MF]Prepare for printing
  1181.     jmp    prtstr        ;[MF]Print COLLISION state and return
  1182.  
  1183. ;       Print the current escape character
  1184.  
  1185. staesc:    lxi    d,escst        ;Escape string.
  1186.     call    prtstr
  1187.     call    escpr        ;Print the escape char.
  1188. ;    jmp    prcrlf        ;removed [DJR] Print CR/LF and return  [Toad Hall]
  1189.     ret        ;[DJR] added
  1190.  
  1191. ;       Show number proportion of buffers used in multiple sector buffering
  1192. stabsz:    lxi    d,bufsz1
  1193.     call    prtstr        ; do first bit of string
  1194.     lxi    h,0
  1195.     lda    bufsec
  1196.     mov    l,a        ; get size used...
  1197.     call    nout        ;... to screen
  1198.     lxi    d,bufsz2    ; and then say max value
  1199.     call    prtstr
  1200.     lxi    h,0
  1201.     lda    maxbsc        ; get max for this system
  1202.     mov    l,a
  1203.     call    nout        ;.. thence to screen
  1204. ;    jmp    prcrlf        ; removed [DJR] cr lf and out
  1205.     ret        ;[DJR]
  1206.  
  1207. ;
  1208. ;       Show the value of the TIMER flag
  1209. statim:    lxi    d,timmsg    ;[jd] 
  1210.     call    prtstr        ;[jd] 
  1211.     lda    timflg
  1212.     jmp    staton        ;Tell whether it's on or off.
  1213.  
  1214. ;       Show internal versions (edit strings)
  1215. shover:    call    cfmcmd
  1216.     call    prcrlf
  1217.     lxi    d,version    ;[MF]Point to Kermit version
  1218.     call    prtstr        ;[MF]and show it
  1219.     lxi    d,modmsg    ;[MF]Continue the message
  1220.     call    prtstr        ;[MF]...
  1221.     call    prcrlf        ;[MF]End the line
  1222.     lxi    h,vertab    ; Get address of version list
  1223. shovr1:    mov    e,m        ; Get next word from list
  1224.     inx    h
  1225.     mov    d,m        ; Next version string is in DE
  1226.     inx    h
  1227.     mov    a,d        ; Test for zero (end of list)
  1228.     ora    e
  1229.     jz    shovr2        ; Done with list if zero
  1230.     push    h        ; Save position in list
  1231.     call    prtstr        ; Not zero.  Print it.
  1232.     call    prcrlf        ; Follow with crlf
  1233.     pop    h        ; Restore position in list
  1234.     jmp    shovr1        ;  and go see if there are any more.
  1235.  
  1236. shovr2:    lhld    ovlver        ; Get overlay version string
  1237.     xchg        ;  into DE
  1238.     call    prtstr        ; Print it
  1239.     call    prcrlf        ; Output crlf
  1240.     lhld    family        ;[11] New entry in overlay.  Get string of 
  1241.     xchg        ;[11]  family of machines (eg apple) and  print
  1242.     call    prtstr        ;[11]  it.  For "common" m/c do a $ only.
  1243.     jmp    kermit        ; Return to main loop.
  1244.  
  1245. ; table of pointers to version strings.
  1246. vertab:    dw    mitver        ; CPSMIT
  1247.     dw    comver        ; CPSCOM
  1248.     dw    pk1ver        ; CPSPK1
  1249.     dw    pk2ver        ; CPSPK2
  1250.     dw    remver        ; CPSREM
  1251.     dw    server        ; CPSSER
  1252.     dw    ttver        ; CPSTT
  1253.     dw    cpmver        ; CPSCPM
  1254.     dw    wldver        ; CPSWLD
  1255.     dw    cmdver        ; CPSCMD
  1256.     dw    utlver        ; CPSUTL
  1257.     dw    datver        ; CPSDAT
  1258.     dw    0        ; end of list
  1259.  
  1260. ;       Show TACTrap status (On or Off, and intercept character)
  1261. statac:    lxi    d,tacst        ;"Current TACTrap status/char: "
  1262.     call    prtstr
  1263.     lxi    d,offstr    ;Assume set off
  1264.     lda    tacflg        ;Get the TACTrap char/flag
  1265.     ora    a        ;Is it off?
  1266.     jz    prtstr        ;Yep, go print OFF...
  1267.     mvi    c,conout    ;Display...
  1268.     mov    e,a        ;...the current intercept char
  1269.     call    bdos
  1270.     jmp    prcrlf
  1271.  
  1272. ;       Show if flow control is set on or off
  1273. staflo:    lxi    d,flost        ; Flow control string
  1274.     call    prtstr
  1275.     lda    floctl        ; get the flag
  1276.     jmp    staton
  1277.  
  1278. ;       Show if Case sensitvity is on or off
  1279. ;stasens:
  1280. ;    lxi    d,senst        ; case sensitivity string
  1281. ;    call    prtstr        ;
  1282. ;    lda    casens
  1283. ;    jmp    staton        ; say if its on or off
  1284.  
  1285.  
  1286. ;       Show the current user. (Should do this under directory...)
  1287. stusr:
  1288.     mvi    c,usrcod
  1289.     mvi    e,0ffh        ;[9] get the current user
  1290.     call    bdos
  1291.     mov    l,a        ;[9] print hl as a number...
  1292.     mvi    h,0
  1293.     push    h        ;[9] got the user number
  1294.     lxi    d,usrst        ;[9] tell the user number
  1295.     call    prtstr
  1296.     pop    h        ;[9] now do number
  1297.     call    nout        ;[6] using routine for writing packet nos.
  1298.     ret
  1299.  
  1300. ;
  1301. ;
  1302. ;       [DJR] Show debug mode
  1303. stadbg:
  1304.         lxi     d,dbgst         ;[DJR] Display string
  1305.         call    prtstr          ;[DJR]
  1306.         lda     dbgflg          ;[DJR] load flag
  1307.         jmp     staton          ;[DJR]
  1308.  
  1309.  
  1310. ;       [DJR] Show default disk
  1311. stacurd:
  1312.         lxi     d,curdst        ;[DJR]
  1313.         call    prtstr          ;[DJR]
  1314.         lda     curdsk          ;[DJR]
  1315.         adi     'A'-1           ;[DJR]
  1316.         mov     e,a             ;[DJR]
  1317.         mvi     c,conout        ;[DJR]
  1318.         jmp     bdos            ;[DJR]
  1319.  
  1320. ;
  1321. ;       Display current state of a boolean flag.
  1322. ;       called with A/ value (zero = Off, non-zero = On)
  1323.  
  1324. staton:    lxi    d,onstr        ; Assume it's on.
  1325.     ora    a        ; Is it on?
  1326.     jnz    prtstr        ; If so, say so, then return.
  1327.     lxi    d,offstr    ; No, say off.
  1328.     jmp    prtstr        ; Print the string, then return.
  1329.  
  1330. ;       STRING command
  1331. ;       get a string from the user and send it to the host.
  1332. string:    mvi    a,cmtxt        ; get the text
  1333.     lxi    d,stbuff    ; where to put it
  1334.     call    comnd
  1335.     jmp    kermit        ; if we cannot do it, then back to command level
  1336.     sta    strcnt        ; save the string count
  1337.     ana    a        ; if it is zero, then do nowt
  1338.     jz    kermit
  1339.     call    cfmcmd        ;[MF]Otherwise, get a "confirm"
  1340.     call    selmdm        ; then select the modem
  1341.     lxi    d,stbuff    ; where to get the string
  1342. stlop:    ldax    d        ; get byte
  1343.     inx    d        ; pointer plus one
  1344.     push    d        ; update pointer, and save de, and the character
  1345.     call    setpar        ; set whatever parity
  1346.     mov    e,a        ; outmdm wants character in e
  1347.     call    outmdm        ; send character in a to line
  1348.     pop    d
  1349.     lda    strcnt        ; get the count
  1350.     dcr    a
  1351.     sta    strcnt        ; less one
  1352.     jnz    stlop        ; else still looping
  1353.     call    selcon        ; re-select the console
  1354.     jmp    kermit
  1355.  
  1356. ;       Print "(not implemented)".
  1357. ;       here from vt52em, baud, prtset, stavt
  1358.  
  1359. notimp:    lxi    d,inms12    ; Say it's not implemented.
  1360.     call    prtstr
  1361.     jmp    kermit        ; Return to main loop.
  1362.  
  1363. ; Little code to allow some expansion of code without changing
  1364. ;  every futher address, only up to the end of this file.
  1365. ;   TO BE REMOVED FRO RELEASE!
  1366.  
  1367. ;    org ($+100h) AND 0FF00H
  1368.  
  1369. IF lasm                ; If using LASM, chain to the next file.
  1370.     LINK    CPSPK1        ;[obs] break down them big files...
  1371. ENDIF;lasm
  1372.