; CP4MIT.ASM ; KERMIT - (Celtic for "FREE") ; ; This is the CP/M-80 implementation of the Columbia University ; KERMIT file transfer protocol. ; ; Version 4.0 ; ; Copyright June 1981,1982,1983,1984,1985 ; Columbia University ; ; Originally written by Bill Catchings of the Columbia University Center for ; Computing Activities, 612 W. 115th St., New York, NY 10025. ; ; Contributions by Frank da Cruz, Daphne Tzoar, Bernie Eiben, ; Bruce Tanner, Nick Bush, Greg Small, Kimmo Laaksonen, Jeff Damens, and many ; others. ; ; This file contains the system-independent initialization, the main ; loop, and the commands that don't have any place better to go ; (BYE, EXIT, HELP, LOG, SET, SHOW, and STATUS). ; ; revision history: ; edit 8: February 6, 1895 ; Add a PORT status/show routine for those machines that have more ; than one they can talk to. It also required a port storage variable ; a la SPEED and the necessary code to handle it in the SET routine. ; [Hal Hostetler] ; ; edit 7: 13-Jan-85 by Vanya J.Cooper Pima Commun. College Tel: 602-884-6809 ; ;pcc003-pcc005 2-Jan-85 vjc modules:cp4mit,cp4tt,cp4utl ; These edits must all be installed together and change the way ; logging is handled. The log file spec is moved to a separate ; fcb, and not opened until an actual CONNECT command is given. ; This takes care of a NASTY bug that if you used any other file ; command between the LOG and CONNECT, the log file would get ; written over the last file used. This also allows logging to ; be "permanently" enabled until an CLOSE (new command) for all ; CONNECT sessions, like most other kermits do. If a log file ; already exists, it will be appended to. Also add two new ; CONNECT mode commands Q to suspend logging and R to ; resume. R means something else during TRANSMIT, but ; logging is never on then, so there shouldn't be any conflict. ; I also changed the write code, so that it can handle one more ; character after the XOFF is send to stop the host. This allows ; a little "slop" for systems that don't stop immediately (such ; as TOPS10), but it didn't help much. ;pcc012 4-Jan-85 vjc modules:cp4mit,cp4tt,cp4utl ; Use the big buffer for the log file. Move the log file back ; into the common fcb and only save the drive, name, and ; extension between connects. Add new routines to cp4utl to ; create or append to an existing file, and to conditionally ; advance buffers only if in memory. Remove edit pcc003 that ; allows one more character after the xoff, since it didn't ; really work very well and does not fit in well with the way ; the buffer advancing routines are set up. If someone still ; thinks this would be useful, it could be put back in with a ; little more work. ; ; While testing this edit, I also noticed another bug that ; the command parsing routines do not limit or check the ; length of command lines or file specs, trashing what ever ; comes after them. Currently because of where the fcb and ; command buffer are located, this does not usually cause a ; problem, but could if an extremely long line was typed in, ; or in the future multiple fcbs defined elsewhere in memory ; were used. Maybe this should be put on the bug list ; somewhere. ;pcc013 8-Jan-85 vjc modules:cp4mit,cp4utl,cp4typ ; Replace CLOSE command to cancel session logging to SET ; LOGGING ON/OFF. This seems to fit in with the command ; structure better. Default the log file to KERMIT.LOG ; incase no previous LOG command. Logging is also enabled ; by LOG command, as before. ; edit 6: September 8, 1984 ; Add VERSION command, to display the internal version strings. ; Move command tables here from CP4UTL, and translate string ; lengths in them to decimal (how many fingers do YOU got?). ; Replace some jump tables with dispatch addresses in tables. ; Make help text for SET command consistent with top level help text. ; ; edit 5: August 21, 1984 ; Add word at 0100H to allow us to exit cleanly from DDT (shifting ; entry section by two bytes). ; ; edit 4: August 3, 1984 (CJC) ; Remove "mover" from entry section, as it now lives in CP4SYS. ; ; edit 3: July 27, 1984 (CJC) ; Merge LASM support from Toad Hall: most of CP4MIT is now in CP4UTL. ; When assembling with LASM, CP4MIT is linked by CP4DEF; it links to ; CP4PKT. Add SET TACTRAP command. Separate out display routines so ; we can eventually do "SHOW ". Save both bytes of baud ; rate in speed, and check both bytes when displaying baud rate. Move ; header info to CP4KER.ASM. Add onoff and chkkey routines to simplify ; SET command (Toad Hall) ; ; edit 2: June 8, 1984 ; formatting and documentation; delete unreferenced variables and some ; unnecessary labels; move setpar here from cp4pkt; add module version ; string; make this version 4.01. ; ; edit 1: May, 1984 ; extracted from CPMBASE.M80 version 3.9; modifications are described ; in the accompanying .UPD file. ; ASEG ORG 100H ; The CCP invokes programs with a CALL 100H, with the stack pointer set to ; 100H. When we exit to CP/M, we do so with a RET, avoiding a warm boot. ; Unfortunately, DDT starts programs with a jump, not a call, so when we ; attempt to return to CP/M, we blow the stack and use the word at 100H as ; the new PC. Put a 0 there so we reboot instead of dying horribly. ; (Fortunately, this happens to be two NOP's). dw 0 jmp start ; Bypass entry section ; ; Entry section for system-independent part. This contains ; jumps to routines needed by the system support module. ; entries: jmp kermit ; reentry address jmp nout ; output HL in decimal entsiz equ $-entries ; length of entry section ; ; End of entry section. As a consistency check, the expected ; length of this section is stored by the system-dependent ; module in the linkage section at the end of Kermit, and ; tested at initialization. mitver: db 'CP4MIT.ASM (8) 6-Feb-85$' ; name, edit number, date ; ; ; Initialization ; start: lxi h,0 ; Clear out hl pair dad sp ; and fetch the system stack pointer shld oldsp ; and save for later restoral lxi sp,stack ; move in our own stack. lxi d,version ; print Kermit version call prtstr ; before we do too much mvi c,rddrv ;Get our logged in drive call BDOS inr a ;relative 1 sta CURDSK ;and save it for later ; ; Make sure the overlay is in place... ; lhld lnkflg mov a,h ora l ; if lnkflg is still zero, jz start1 ; the configuration overlay is missing. lxi d,-lnksiz ; if it's not equal to lnksiz, dad d ; we've probably got the wrong mov a,h ; version of the configuration overlay. ora l jnz start2 lhld lnkent ; make sure the overlay knows how long lxi d,-entsiz ; our entry section is, so they don't miss. dad d mov a,h ora l jnz start2 ; might be ok. call sysinit ; do system-dependent initialization lxi d,inms26 ; offer some advice on getting help call prtstr jmp kermit ; Start main loop. start1: lxi d,erms20 ; "Kermit has not been configured" call prtstr ; print error message jmp exit2 ; and exit. start2: lxi d,erms21 ; "Consistency check on configuration failed" call prtstr ; print error message jmp exit2 ; and exit. ; ;This is the main KERMIT loop. It prompts for and gets the users commands. kermit: lxi sp,stack ; get new stack pointer, old one might be bad. call selcon ; make sure console is selected. xra a sta mfflg1 ;reset MFNAME sta mfflg2 ;ditto lda curdsk ; update the prompt adi 'A'-1 sta kerm1 lxi d,kerm call prompt ;Prompt the user. lxi d,comtab lxi h,tophlp call keycmd ; Get a keyword xchg ; Get result (dispatch address) into HL pchl ; Dispatch. ; here from: log, setcom, read, cfmcmd kermt3: lxi d,ermes3 ;"Not confirmed" call prtstr jmp kermit ;Do it again. ; Structure of command table: ; ; 1) Number of entries. ; 2) Each entry is arranged as follows: ; a) length of command in bytes. ; b) 'name of command and $-sign' ; c) address of routine to process command ; ; ---> Note this command table is in alphabetic order. ; comtab: db 17 ;[pcc013] 17 entries db 3, 'BYE$' dw bye db 7, 'CONNECT$' dw telnet db 9, 'DIRECTORY$' dw dir db 5, 'ERASE$' dw era db 4, 'EXIT$' dw exit db 6, 'FINISH$' dw finish db 3, 'GET$' dw read ;Same as RECEIVE db 4, 'HELP$' dw help db 3, 'LOG$' dw log db 6, 'LOGOUT$' dw logout db 7, 'RECEIVE$' dw read db 4, 'SEND$' dw send db 3, 'SET$' dw setcom db 4, 'SHOW$' dw show db 6, 'STATUS$' dw status db 8, 'TRANSMIT$' dw xmit db 7, 'VERSION$' dw shover ; top-level help message. Caps indicate keywords. ; this text is also printed by the HELP command. tophlp: db cr,lf,'BYE to host (LOGOUT) and exit to CP/M' db cr,lf,'CONNECT to host on selected port' db cr,lf,'ERASE a CP/M file' db cr,lf,'EXIT to CP/M' db cr,lf,'FINISH running Kermit on the host' db cr,lf,'HELP by giving this message' db cr,lf,'DIRECTORY of current used Micro-disk' db cr,lf,'LOG the terminal sessions to a file' db cr,lf,'LOGOUT the host' db cr,lf,'RECEIVE file from host' db cr,lf,'SEND file to host' db cr,lf,'SET a parameter' db cr,lf,'SHOW the parameters' db cr,lf,'STATUS of Kermit' db cr,lf,'TRANSMIT file to host (in connect state)' db cr,lf,'VERSION of Kermit running$' ;[pcc005] ; ; This is the BYE command. It tells the remote KERSRV to logout, ; then exits. bye: call cfmcmd call logo ;Tell the main frame to logout. jmp kermit ;If it fails, don't exit. call sysbye ; success. do system-dependent cleanup jmp exit1 ;Exit Kermit. ; This is the EXIT command. It leaves KERMIT and returns to CP/M. ; alternate entries: exit1, from BYE command; ; exit2, from initialization (if it fails) exit: call cfmcmd ; confirm... exit1: call sysexit ; do system-dependent termination exit2: lhld oldsp ;Get back the system stack sphl ;and restore it. ret ;Then return to system. ; This is the HELP command. It gives a list of the commands. help: call cfmcmd lxi d,tophlp ;The address of the help message. call prtstr jmp kermit ; ; This is the LOG command. It logs a session to a file. log: mvi a,cmofi ;[pcc005] Parse an output file spec. lxi d,fcb ;[pcc012] where to put it call comnd jmp kermt3 call cfmcmd lxi h,fcb ;[pcc012] copy file name and ext lxi d,lognam ;[pcc012] to a safe place lxi b,12 ;[pcc012] 12 bytes call mover ;[pcc012] zap ... mvi a,1 ;[pcc005] set flag for logging sta logflg ;[pcc005] jmp kermit ;[pcc005] ; ; This is the SET command. setcom: lxi d,settab ;Parse a keyword from the set table. lxi h,sethlp call keycmd xchg ; Get result (dispatch address) into HL pchl ; Dispatch. settab: db 16 ;[pcc013] 16 entries [Toad Hall] ; Value is address of processing routine. db 9, 'BAUD-RATE$' dw baud db 16, 'BLOCK-CHECK-TYPE$' dw blkset db 5, 'DEBUG$' dw setdbg db 12, 'DEFAULT-DISK$' dw setdisk db 6, 'ESCAPE$' dw escape db 9, 'FILE-MODE$' dw setcpm db 3, 'IBM$' dw ibmset db 10, 'LOCAL-ECHO$' dw locall db 7, 'LOGGING$' ;[pcc013] dw setlog ;[pcc013] db 6, 'PARITY$' dw parset db 4, 'PORT$' dw prtset db 7, 'PRINTER$' dw setprn ;* db 7, 'RECEIVE$' ;* dw kermt3 ;Not implemented yet. ;* db 4, 'SEND$' ;* dw setsnd ;Ditto db 7, 'TACTRAP$' dw settac db 5, 'TIMER$' dw settim db 14, 'VT52-EMULATION$' dw vt52em db 7, 'WARNING$' dw filwar ; help message for SET command. Caps indicate keywords sethlp: db cr,lf,'BAUD-RATE' db cr,lf,'BLOCK-CHECK-TYPE for error detection' db cr,lf,'DEBUG message control' db cr,lf,'DEFAULT-DISK to receive data' db cr,lf,'ESCAPE character during CONNECT' db cr,lf,'FILE-MODE for outgoing files' db cr,lf,'IBM mode: parity and turn around handling' db cr,lf,'LOCAL-ECHO (half-duplex)' db cr,lf,'LOGGING of terminal sessions' ;[pcc013] db cr,lf,'PARITY for communication line' db cr,lf,'PORT to communicate on' db cr,lf,'PRINTER copy control' ;* db cr,lf,'RECEIVE parameters' ;Not currently implemented ;* db cr,lf,'SEND parameters' ;Ditto db cr,lf,'TAC interface support' db cr,lf,'TIMER control' db cr,lf,'VT52-EMULATION' db cr,lf,'WARNING for filename conflicts' db '$' ; ;SET BLOCK-CHECK-TYPE command. blkset: lxi d,blktab ;Get the address of the block-check table lxi h,blkhlp ;And the address of the help text call chkkey ;Go check input (val returns in A). sta chktyp ;Save desired checksum type jmp kermit ;Go get another command blktab: db 3 ;Three entries. db 20, '1-CHARACTER-CHECKSUM$', '1','1' db 20, '2-CHARACTER-CHECKSUM$', '2','2' db 21, '3-CHARACTER-CRC-CCITT$', '3','3' blkhlp: db cr,lf,'1-CHARACTER-CHECKSUM' db cr,lf,'2-CHARACTER-CHECKSUM' db cr,lf,'3-CHARACTER-CRC-CCITT$' ;SET DEFAULT DISK command setdisk:lxi d,fcb mvi a,cmifin ;get "file-spec" silently call comnd jmp setdi1 setdi1: lda fcb ora a ;Was a drive specified? (if zero, no) jnz setdi2 ;he typed a drive-spec lda curdsk ;he didn't - give him default setdi2: sta curdsk mvi c,inbdos ;reset disks call bdos lda curdsk dcr a ;LOGDSK is relative 0 mov e,a mvi c,logdsk call bdos ;and "LOG" it jmp kermit ;all done ; ;SET SEND command. (not supported yet) setsnd: lxi d,stsntb ;Parse a keyword from the set send table. lxi h,stshlp call keycmd xchg ; Get dispatch address into HL pchl ; Go for it. stsntb: db 2 ;Two entries. db 8, 'PAD-CHAR$' dw stpdch db 7, 'PADDING$' dw stpad stshlp: db cr,lf,'PAD-CHAR' db cr,lf,'PADDING$' ; SET SEND PADDING command. does nothing. stpad: call cfmcmd jmp kermit ; SET SEND PAD-CHAR command. does nothing. stpdch: call cfmcmd jmp kermit ;[pcc013] ; This is the SET LOGGING ON/OFF subcommand setlog: call onoff ;[pcc013] Get on/off sta logflg ;[pcc013] Store flag jmp kermit ; ; This is the SET ESCAPE character subcommand. escape: call cfmcmd lxi d,escmes ;Get the address of the escape message. call prtstr mvi c,conin ;Get the char. call bdos sta escchr ;Store the new escape character. jmp kermit ; This is the SET LOCAL-ECHO subcommand. locall: call onoff ;Get on/off setting [Toad Hall] sta ecoflg ;Store local echo flag. jmp kermit ; This is the SET PRINTER ON/OFF subcommand setprn: call onoff ;Get on/off setting [Toad Hall] sta prnflg ;Store printer flag jmp kermit ; This is the SET DEBUG ON/OFF subcommand setdbg: call onoff ;Get on/off setting [Toad Hall] sta dbgflg ;Store debug flag jmp kermit ;[jd] this is the SET TIMER subcommand settim: call onoff ;Get on/off setting [Toad Hall] sta timflg ;Store timer flag value jmp kermit ;This is the SET FILE-WARNING subcommand filwar: call onoff ;Get on/off setting [Toad Hall] sta flwflg ;Store file-warning flag. jmp kermit ; This is the SET IBM command. ibmset: call onoff ;Get on/off setting [Toad Hall] sta ibmflg ;Store IBM flag. ora a ;Is it turned on? jz ibmst1 ;If not, set parity to the default. mvi a,ibmpar ;Get the IBM parity. mvi b,1 ;Set local echo on. jmp ibmst2 ibmst1: mvi a,defpar mvi b,0 ;Set local echo off. ibmst2: sta parity ;Save them. mov a,b sta ecoflg sta timflg ;[jd] timer is same as local echo jmp kermit ; ; SET FILE-MODE command. setcpm: lxi d,typtab lxi h,typhlp call chkkey ;Get and confirm keyword, or die trying sta cpmflg ;Set the CPM flag. jmp kermit typtab: db 3 ;Three entries db 5, 'ASCII$', 01H,01H db 6, 'BINARY$', 02H,02H db 7, 'DEFAULT$', 00H,00H typhlp: db cr,lf,'ASCII BINARY DEFAULT$' ; This is the SET PARITY subcommand. parset: lxi d,partab lxi h,parhlp call chkkey ;Get and confirm keyword, or die trying sta parity ;Set the parity flag. jmp kermit partab: db 5 ;Five entries. db 4, 'EVEN$', parevn,parevn db 4, 'MARK$', parmrk,parmrk db 4, 'NONE$', parnon,parnon db 3, 'ODD$', parodd,parodd db 5, 'SPACE$', parspc,parspc parhlp: db cr,lf,'EVEN MARK NONE ODD SPACE$' ; This is the SET TACTRAP subcommand. ; options are ON, OFF, or CHARACTER. (for CHARACTER, we request the ; new TAC Intercept character, and turn the TACtrap on) settac: lxi d,tactab lxi h,tachlp call chkkey ;Get and confirm keyword ora a ;Was it "OFF" (zero)? jz settc2 ;If so, go disable TACtrap. cpi 1 ;Was it "ON"? jz settc1 ;If so, go enable TACtrap. lxi d,tacmes ;"CHARACTER". request new TAC Intercept char. call prtstr mvi c,conin ;Get the char. call bdos sta tacchr ;Store the new TAC Intercept character. settc1: lda tacchr ;Copy tacchr to tacflg to enable TACtrap. settc2: sta tacflg ;Enable/disable TACtrap jmp kermit tactab: db 3 ;Three entries. db 9, 'CHARACTER$', 02H,02H db 3, 'OFF$', 00H,00H db 2, 'ON$', 01H,01H tachlp: db cr,lf,'ON to enable TAC trap' db cr,lf,'OFF to disable TAC trap' db cr,lf,'CHARACTER to enable TAC trap and' db ' specify intercept character$' ; This is the SET VT52-EMULATION subcommand. vt52em: lda vtflg ;get the flag value cpi 0ffH ;0ffH means not allowed - jz notimp ; say it's not implemented. call onoff ;Get keyword (ON or OFF) sta vtflg ;Set the VT52 emulation flag. jmp kermit ; ; Note: For the SET BAUD and SET PORT commands, which might not be ; supported for the current system, the command tables are stored in ; the overlay. We locate them through pointers in the linkage area: ; spdtab for SET BAUD, prttab for SET PORT. The contents of spdtab ; (or prttab) is the address of the beginning of the table (the table ; does NOT begin at spdtab). If the address is zero, the command is ; not supported. If the table address is nonzero, then there is a ; corresponding help message pointed to by (NOT starting at) spdhlp ; or prthlp. ; This is the SET BAUD command baud: lhld spdtab ; get pointer to speed table mov a,h ora l ; test for NULL (zero) jz notimp ; if so, say it's not implemented xchg ; move speed table address to DE lhld spdhlp ; get pointer to speed help text call keycmd push d ; save selected speed call cfmcmd ; confirm... pop h ; restore speed to HL shld speed ; save all 16 bits of speed value xchg ; move speed to DE call sysspd ; do system-dependent speed setting. jmp kermit ; return to command level ; This is the SET PORT command prtset: lhld prttab ; get pointer to port table mov a,h ora l ; test for NULL jz notimp ; not supported if pointer was null. xchg ; move port table address to DE lhld prthlp ; get pointer to port help text call keycmd push d ; save selected port entry call cfmcmd ; confirm... pop h ; restore table address to HL shld port ;[hh] save all 16 bits of port value call sysprt ; go do port stuff jmp kermit ; ; Subroutines for SET subcommands ; ontab - command table for onoff. ; onhlp - help text for onoff. ; onoff - accept "ON" or "OFF" keyword. ; returns: ; success: value in A (non-zero = ON) ; error: no return to caller. print error message and return to ; main loop. ontab: db 2 ;Two entries. db 3, 'OFF$', 00H,00H db 2, 'ON$', 01H,01H onhlp: db cr,lf,'OFF ON$' onoff: lxi d,ontab lxi h,onhlp ;Fall through to check input. [Toad Hall] ; chkkey - parse and confirm keyword. ; called with: ; DE/ address of keyword table ; HL/ address of help text ; returns: ; success: low byte of keyword value (from table) in A. ; error: no return to caller. print error message and return to ; main loop. (Since the main loop reloads the stack pointer, ; we don't have to attempt to clean up the stack here) chkkey: call keycmd ; Parse a keyword (might not return) sta temp1 ; Save the parsed value call cfmcmd ; Request confirmation (might not return) lda temp1 ; Get saved value ret ; Return ;[hh] fndkyw - find a keyword string from a table using ; it's associated value ; called with: ; HL/ address of keyword table ; A/ value associated with keyword string ; returns: ; success: HL points to first byte of keyword string ; CY flag is cleared ; error: HL points to error string (?Not found) ; CY flag is set fndkyw: mov d,m ;get count of entries inx h ;advance over count value fndkw1: mov b,m ;get string length inr b ;account for $ inx h ;advance over length value shld temp1 ;save string pointer fndkw2: inx h ;loop over string dcr b jnz fndkw2 mov c,m ;get keyword value from table cmp c ;do they match? jz fndkw3 ;Yup inx h ;bump to next keyword inx h ; dcr d ;decrement entry count jnz fndkw1 ;check the remaining keywords lxi h,kywdnf ;point to not found message stc ;give calling routine a not found flag ret fndkw3: ora a ;clear CY to tell caller we succeeded lhld temp1 ;restore the saved string pointer ret kywdnf: db cr,lf,'?Not found$' ;not found message ; ; This is the SHOW command. show: call cfmcmd ;* Reconcile this and status. call clrtop ;[hh] Clear screen first call stat01 ;For now just cop out. jmp kermit ; This is the STATUS command. status: call cfmcmd call clrtop ;[hh] Clear screen first call stat01 jmp kermit ; processor for SHOW, STATUS and S commands ; called by: show, status, intchr stat01: lda fileio ;Are we in transmit? ora a jz sta01b ;No lxi d,xmtst ;Yes,say so call prtstr sta01b: call staeco ; Tell about local echo flag lda vtflg ; Get the VT52 emulation flag cpi 0ffH ; Supported for this terminal? cnz stavt ; If so, tell whether it's on or off. call stafil ; Tell about file type call staibm ; Tell about IBM flag call stawrn ; Tell about file-warning flag call stalpt ; Tell about printer copy flag call stalog ; [pcc003] Tell about log file status call stapar ; Tell about parity lhld prttab ;[hh] Got a port table? (is pointer nonzero?) mov a,h ;[hh] ora l ;[hh] cnz stapor ;[hh] If so, tell which port we're using lhld spdtab ; Got a speed table? (is pointer nonzero?) mov a,h ora l cnz staspd ; If so, tell what speed we're running. call stabcc ; Tell current block check type call staesc ; Tell current escape character call statim ; Tell about timer flag call statac ; Tell about TAC flag/intercept character. ret ; Show the value of the LOCAL-ECHO flag (On or Off). staeco: lxi d,locst ;Get the address of the local echo string. call prtstr lda ecoflg ;Get the local echo flag. jmp staton ;Say ON or OFF, and return ; Show the value of the VT52-EMULATION flag (On, Off, or Not Supported). stavt: lxi d,vtemst ; Get the address of the VT52 emulation string. call prtstr lda vtflg ; Get the VT52 emulation flag. cpi 0ffH ; Is it supported? jnz staton ; If so, say ON or OFF, and return jmp notimp ; Not supported. print appropriate message. ; Show the value of the FILE-MODE flag (ASCII, Binary, or Default). stafil: lxi d,cpmst ; Get the address of the file mode message. call prtstr lda cpmflg ; Get the file mode flag. lxi d,defstr ; Assume Default (0). ora a ; Is it? jz prtstr ; If so, say so, and return. lxi d,ascstr ; Not default, assume ASCII cpi 1 ; Is it ASCII? jz prtstr ; Say ASCII, and return lxi d,binstr ; Not default or ASCII, must be binary jmp prtstr ; Print type, and return. ; Show the value of the IBM-MODE flag (On or Off). staibm: lxi d,ibmst ;IBM string. call prtstr lda ibmflg ; Get IBM flag. jmp staton ; Print its value and return ; Show the value of the FILE-WARNING flag (On or Off). stawrn: lxi d,filst ; File warning string. call prtstr lda flwflg ; File warning flag. jmp staton ; Say ON or OFF ; Show the value of the PRINTER flag (On or Off). stalpt: lxi d,prst ;Printer copy string call prtstr lda prnflg ;Printer ON/OFF flag jmp staton ; Say ON or OFF ; Show status of log file stalog: lxi d,logst ;[pcc003] Logging call prtstr ;[pcc003] lda logflg ;[pcc003] get the flag ani 7FH ;[pcc003] ignore open flag cpi 2 ;[pcc003] is it suspended? jnz staton ;[pcc003] no, must be on or off lxi d,susstr ;[pcc003] suspended jp prtstr ;[pcc003] print and return ; Show the value of the PARITY flag (Odd, Even, Mark, Space, or None). stapar: lxi d,parst ;Parity string. call prtstr lda parity ;Get the parity setting. lxi d,pnonst ;Assume parity is NONE cpi parnon ;Were we right? jz prtstr ;Yep, go say None, and return lxi d,pmrkst ;Get ready to say Mark cpi parmrk ;Is it mark? jz prtstr ;Yep, go say Mark, and return lxi d,pspcst ;Get ready to say Space cpi parspc ;Is it space? jz prtstr ;Yep, go say Space, and return lxi d,poddst ;Get ready to say Odd cpi parodd ;Is it odd? jz prtstr ;Yep, go say Odd, and return lxi d,pevnst ;Must be Even. jmp prtstr ;Say Even, and return. ;[hh] Show the current port (if known). stapor: lxi d,porst ;[hh] call prtstr ;[hh] lda port ;[hh] Get current port value lxi h,spdust ;[hh] Assume undefined (this error msg is fine) cpi 0FFH ;[hh] Is it? jz stat73 ;[hh] Yup. Say so lhld prttab ;[hh] Address of port keyword table call fndkyw ;[hh] Look for correct keyword string jnc stpr1 ;[hh] Found a match lxi h,spdust ;[hh] No match found - say it's undefined stpr1: jmp stat73 ;[hh] Print it and return ; Show the current line speed (if known). staspd: lxi d,spdst call prtstr lda speed ;Get current speed. lxi h,spdust ;Assume undefined. cpi 0FFH ;Is it? jz stat73 ;Yes. lhld spdtab ;Start scanning keyword table. mov d,m ; get count of entries inx h ; advance over it. stat70: mov b,m ;Get string length. inr b ;Account for $. inx h shld temp1 ;Save string pointer. stat71: inx h ;Loop over string. dcr b jnz stat71 mov c,m ;Get speed value cmp c ;Match? jz stat72 ;Yes. inx h ;Bump to next keyword. inx h dcr d ; decrement entry count jnz stat70 ; if more left, check them. lxi h,spdust ; can't find it. say it's undefined. jmp stat73 ; print the message. stat72: lhld temp1 ;Restore saved string pointer. stat73: xchg ;Set into DE for display. jmp prtstr ; print it, and return. ; Show the current BLOCK-CHECK-TYPE (1-, 2-, or 3-character). stabcc: lxi d,bckst ;Get the string call prtstr ;Print "Block check type: " lda chktyp ;Get the type (character 1, 2, or 3) mov e,a ;Put into E mvi c,conout ;Want to print it call BDOS ;Do so lxi d,bckst1 ;Get rest of text ("-character") jmp prtstr ;Print it and return ; Print the current escape character staesc: lxi d,escst ;Escape string. call prtstr call escpr ;Print the escape char. jmp prcrlf ;Print CR/LF and return [Toad Hall] ; Show the value of the TIMER flag statim: lxi d,timmsg ;[jd] call prtstr ;[jd] lda timflg jmp staton ;Tell whether it's on or off. ; Show internal versions (edit strings) shover: call cfmcmd call prcrlf lxi h,vertab ; Get address of version list shovr1: mov e,m ; Get next word from list inx h mov d,m ; Next version string is in DE inx h mov a,d ; Test for zero (end of list) ora e jz shovr2 ; Done with list if zero push h ; Save position in list call prtstr ; Not zero. Print it. call prcrlf ; Follow with crlf pop h ; Restore position in list jmp shovr1 ; and go see if there are any more. shovr2: lhld ovlver ; Get overlay version string xchg ; into DE call prtstr ; Print it call prcrlf ; Output crlf jmp kermit ; Return to main loop. ; table of pointers to version strings. vertab: dw mitver ; CP4MIT dw pktver ; CP4PKT dw ttver ; CP4TT dw cpmver ; CP4CPM dw wldver ; CP4WLD dw cmdver ; CP4CMD dw utlver ; CP4UTL dw 0 ; end of list ; Show TACTrap status (On or Off, and intercept character) statac: lxi d,tacst ;"Current TACTrap status/char: " call prtstr lxi d,offstr ;Assume set off lda tacflg ;Get the TACTrap char/flag ora a ;Is it off? jz prtstr ;Yep, go print OFF... mvi c,conout ;Display... mov e,a ;...the current intercept char call bdos jmp prcrlf ; Display current state of a boolean flag. ; called with A/ value (zero = Off, non-zero = On) staton: lxi d,onstr ; Assume it's on. ora a ; Is it on? jnz prtstr ; If so, say so, then return. lxi d,offstr ; No, say off. jmp prtstr ; Print the string, then return. ; Print "(not implemented)". ; here from vt52em, baud, prtset, stavt notimp: lxi d,inms12 ; Say it's not implemented. call prtstr jmp kermit ; Return to main loop. IF lasm ; If using LASM, chain to the next file. LINK CP4PKT ENDIF;lasm