home *** CD-ROM | disk | FTP | other *** search
/ CP/M / CPM_CDROM.iso / simtel / sigm / vols000 / vol093 / modem798.asm < prev    next >
Assembly Source File  |  1984-04-29  |  85KB  |  4,721 lines

  1.     TITLE  'CP/M MODEM PROGRAM Version 7.98  12/31/82'
  2. ;
  3. ;THE FOLLOWING IS AN EXTENSIVE REVISION OF THE CP/M MODEM PROGRAM
  4. ;CREATED BY WARD CHRISTENSEN FOR THE CP/M USERS LIBRARY.  IT ALSO
  5. ;INCORPORATES ROUTINES FOUND IN THE POTOMAC MICRO-MAGIC MODEM
  6. ;MANUAL WHICH MAY BE USED IF YOU HAVE A PMMI MODEM BOARD.
  7. ;
  8. ;         ********* N O T I C E S *********
  9. ;
  10. ;    Revisers releasing new versions should only
  11. ;    change the version number by 1 digit in the
  12. ;    last place.
  13. ;
  14. ;    Except for PMMI routines, revisers should
  15. ;    only make nonspecialized changes for
  16. ;    distribution. Please make configuration files,
  17. ;    such as MCNFG7xx.ASM and MCOSB7xx.ASM, for
  18. ;    particular computers, uarts or modems.
  19. ;
  20. ;         **********************************
  21. ;
  22. ;##### This file requires MODEM797.LIB and MAC.COM to assemble. #####
  23. ;
  24. ;##### The file MCNFG797.ASM can be used to overlay the HEX #####
  25. ;##### or COM file versions with your own modem routines and #####
  26. ;##### configuration options. The file MODEM797.SET can be used #####
  27. ;##### as a reference for directly setting the modem equates #####
  28. ;##### and configuration options with the S command in DDT. #####
  29. ;
  30. ;Fix log in MODEM797.HIS
  31. ;
  32. ;
  33.           MACLIB MODEM797    ;Contains the CMDLINE, INBUF, INLNCOMP,
  34.                 ;DIRLIST, SENDTIME, PRTBAUD, and MFACCESS
  35.                 ;routines.
  36. ;
  37. ;Note that the library has not been changed since version 7.97.
  38. ;
  39. ;
  40. TRUE    EQU    0FFH
  41. FALSE    EQU    0
  42. ;
  43. CPM2X    EQU    TRUE    ;TRUE IF CP/M 2.X
  44. DBUFSIZ    EQU    16    ;BUFFER SIZE FOR FILE TRANSFER IN KBYTES
  45. ;
  46. ERRCRC    EQU    6    ;NUMBER OF TIMES TO TRY CRC MODE BEFORE
  47.             ;SWITCHING TO CHECKSUM
  48. ERRLIM    EQU    10    ;NUMBER OF TIMES TO RETRY
  49.             ;SEND/RECEIVE ERRORS BEFORE QUIT
  50. ;
  51. ; PMMI EQUATES
  52. PORT    EQU    0C0H    ;PMMI BASE ADDRESS
  53. ;
  54. MODCTLP     EQU    PORT    ;MODEM CONTROL PORT
  55. MODDATP     EQU    PORT+1    ;MODEM DATA PORT
  56. BAUDRP     EQU    PORT+2    ;BAUD RATE PORT
  57. MODCTL2     EQU    PORT+3    ;2ND MODEM CONTROL PORT
  58. MODRCVB     EQU    02H    ;MODEM RECEIVE BIT (DAV)
  59. MODRCVR     EQU    02H    ;MODEM RECEIVE READY
  60. MODSNDB     EQU    01H    ;MODEM SEND BIT (XMIT BUFF EMPTY)
  61. MODSNDR     EQU    01H    ;MODEM SEND READY
  62. NOPARMSK EQU    10H    ;MASK TO RESET TO NO PARITY
  63. EVPARMSK EQU    20H    ;MASK TO SET EVEN PARITY
  64. ODPARMSK EQU    0CFH    ;MASK TO SET ODD PARITY
  65. BRKMSK     EQU    0FBH    ;MASK TO SET BREAK
  66. ERRCDMSK EQU    38H    ;MASK TO BLOCK ALL BITS EXCEPT ERROR CODES
  67. FRMER     EQU    20H     ;FRAMING ERROR MASK
  68. ORUNER     EQU    10H    ;OVERRUN ERROR MASK
  69. PARER     EQU    08H    ;PARITY ERROR MASK
  70. ANSWMOD     EQU    1EH    ;ANSWER MODE
  71. ORIGMOD     EQU    1DH    ;ORIGINATE MODE
  72. WAITCTS     EQU    255    ;NUMBER OF SECONDS X 10 TO WAIT FOR COMPUTER
  73.             ;TONE AFTER PMMI AUTO-DIAL FUNCTION 255 MAX.
  74. ;
  75. CRC       EQU   'C'         ;USED TO REQUEST 'CRC' INSTEAD OF 'CKSUM'
  76. ESC      EQU    '['-40H        ; ^[ = ESCAPE
  77. SOH       EQU   'A'-40H     ; ^A = START OF HEADER
  78. EOT       EQU   'D'-40H     ; ^D = END OF TEXT
  79. ACK       EQU   'F'-40H     ; ^F = ACKNOWLEDGE
  80. OKNMCH    EQU   'F'-40H     ; ^F = OKAY NAME MATCH
  81. BELL      EQU   'G'-40H     ; ^G = BELL CHARACTER
  82. BKSP      EQU    'H'-40H     ; ^H = BACKSPACE
  83. LF        EQU   'J'-40H     ; ^J = LINEFEED
  84. CR        EQU   'M'-40H     ; ^M = CARRIAGE RETURN
  85. XON       EQU   'Q'-40H     ; ^Q = XON CHARACTER
  86. XOFF      EQU   'S'-40H     ; ^S = XOFF CHARACTER
  87. NAK       EQU   'U'-40H     ; ^U = NOT ACKNOWLEDGE
  88. CAN       EQU   'X'-40H     ; ^X = CANCEL SEND/RECEIVE
  89. EOFCHAR   EQU   'Z'-40H     ; ^Z = END OF FILE
  90. BDNMCH    EQU   75H         ; BAD NAME MATCH
  91. RUB      EQU    7FH        ; RUB
  92. ;
  93. BOTTRAM   SET   LAST+100H AND 0FF00H
  94. ;
  95.           ORG   0100H
  96. ;
  97.           JMP   START
  98. ;
  99. ;THESE ROUTINES AND EQUATES ARE AT THE BEGINNING OF THE PROGRAM SO
  100. ;THEY CAN BE PATCHED BY A MONITOR OR OVERLAY FILE WITHOUT RE-ASSEMBLING
  101. ;THE PROGRAM.
  102. ;
  103. PMMIBYTE:    DB    TRUE    ;true=PMMI modem
  104. SETUPTST:    DB    FALSE    ;true=non-PMMI setup routine
  105. SCRNTEST:    DB    FALSE    ;true=if home cursor and clear screen
  106.                 ;routine at CLRSCRN
  107. CLOCK:        DB    4    ;clock speed in MHz, 8 MHz maximum
  108. BAKUPBYTE:    DB    FALSE    ;true=make .BAK file
  109. CKSUMDFLT:    DB    FALSE    ;true=default to Checksum checking
  110.                 ;false=default to CRC checking
  111. TOGGLECRC:    DB    TRUE    ;true=allow toggling of Checksum to CRC
  112. CONVBKSP:    DB    FALSE    ;true=convert backspace to rub
  113. TOGGLEBK:    DB    TRUE    ;true=allow toggling of bksp to rub
  114. ADDLF:        DB    FALSE    ;true=add LF after CR
  115. TOGGLELF:    DB    TRUE    ;true=allow toggling of LF after CR
  116. TRANLOGON:    DB    FALSE    ;true=allow transmission of logon
  117.                 ;write logon sequence at location LOGON
  118. SAVCCP:        DB    TRUE    ;true=do not overwrite CCP
  119. LOCONEXTCHR:    DB    FALSE    ;true=local command if EXTCHR precedes
  120.                 ;false=not local command if EXTCHR precedes
  121. TOGGLELOC:    DB    TRUE    ;true=allow toggling of LOCONEXTCHR
  122. LSTTST:        DB    TRUE    ;true=allow toggling of printer on/off
  123.                 ;in terminal mode. Set to false if your
  124.                 ;printer can't keep up with the modem
  125. XOFFTST:    DB    FALSE    ;true=allow testing of XOFF from remote
  126.                 ;while transmitting a file in terminal mode
  127. XONWAIT:    DB    FALSE    ;true=wait for XON after sending CR while
  128.                 ;transmitting a file in terminal mode
  129. TOGXOFF:    DB    TRUE    ;true=allow toggling of XOFF/XON testing
  130. MSPEED:        DB    1    ;sets the display time to send a file
  131.                 ;0=110 1=300 2=450 3=600 4=710 5=1200
  132.                 ;6=2400 7=4800 8=9600
  133. BYTDLY:        DB    0    ;default time to send character in
  134.                 ;terminal mode file transfer
  135.                 ;0=0 delay, 1=0.02 sec, -- ,9=0.18 sec
  136. CRDLY:        DB    0    ;default time for extra wait after CR
  137.                 ;in terminal mode file transfer
  138.                 ;0=0 delay, 1=0.02 sec, -- ,9=0.18 sec
  139. BELRPT:        DB    30    ;bell repeat time = value*0.03 sec
  140. EXITCHR:    DB    'E'-40H    ; ^E = Exit without disconnect
  141. LOGCHR:        DB    'O'-40H    ; ^O = Send logon
  142. LSTCHR:        DB    'P'-40H    ; ^P = Toggle printer
  143. UNSAVECHR:    DB    'R'-40H    ; ^R = Close input text buffer
  144. TRANCHR:    DB    'T'-40H ; ^T = Transmit file to remote
  145. SAVECHR:    DB    'Y'-40H    ; ^Y = Open input text buffer
  146. EXTCHR:        DB    '^'-40H    ; ^^ = Send next character
  147. ;
  148. ;Equates used only by PMMI routines grouped together here.
  149. PULSERATE:    DB    125    ;125 for 20pps, 250 for 10pps on PMMI
  150.                 ;not used if PMMI FALSE
  151. CLDBOOT:    DW    00000H    ;currently set to warm boot with
  152.                 ;BYE routine for PMMI, put your cold
  153.                 ;boot entry here if you have one and
  154.                 ;desire to do on BYE
  155. BRKCHR:        DB    '@'-40H ; ^@ = Transmit "BREAK" with PMMI
  156. CHGBAUD:    DB    'B'-40H    ; ^B = Used with PMMI in terminal
  157.                 ;  mode to change baud rate on fly
  158. DISCCHR:    DB    'D'-40H    ; ^D = PMMI Disconnect
  159. ;
  160. ;
  161. IN$MODCTLP:    IN    MODCTLP ! RET    ;in modem control port
  162. OUT$MODDATP:    OUT    MODDATP ! RET    ;out modem data port
  163. IN$MODDATP:    IN    MODDATP ! RET    ;in modem data port
  164. ANI$MODSNDB:    ANI    MODSNDB ! RET    ;bit to test for send ready
  165. CPI$MODSNDR:    CPI    MODSNDR ! RET    ;value of send bit when ready
  166. ANI$MODRCVB:    ANI    MODRCVB ! RET    ;bit to test for receive ready
  167. CPI$MODRCVR:    CPI    MODRCVR ! RET    ;value of receive bit when ready
  168. ;
  169. ;THE FOLLOWING ARE TYPICALLY USED ONLY BY PMMI
  170. IN$BAUDRP:    IN    BAUDRP    ! RET    ;in baudrate port
  171. OUT$BAUDRP:    OUT    BAUDRP    ! RET    ;out baudrate port
  172. OUT$MODCTL2:    OUT    MODCTL2    ! RET    ;out modem control port #2
  173. OUT$MODCTLP:    OUT    MODCTLP        ;out modem control port
  174.         STA UARTCTLB    ! RET    ;and store control byte
  175. ;
  176. LOGONPTR:    DW    LOGON
  177. JMP$INITMOD:    JMP    INITMOD
  178. JMP$SETUPR:    JMP    SETUPR
  179. ;Clear sequences are for H19.  Change to yours.
  180. CLREOS:        CALL    JMP$ILPRT
  181.         DB    ESC,'J',0,0,0
  182.         RET
  183. CLRSCRN:    CALL    JMP$ILPRT
  184.         DB    ESC,'E',0,0,0
  185.         RET
  186. ;
  187. ;NEXT THREE LINES SHOULD NOT BE CHANGED BY USER OVERLAY
  188. JMP$ILPRT:    JMP    ILPRT
  189. JMP$ILCOMP:    JMP    ILCOMP
  190. JMP$INBUFF:    JMP    INBUFF
  191. JMP$SYSVER:    JMP    SYSVER
  192. JMP$DIALPL:    JMP    DIALPL
  193. JMP$DISCONNT:    JMP    DISCONNT
  194. ;
  195. SYSVER:
  196.     LDA    PMMIBYTE    ;USING THE PMMI S-100 MODEM?
  197.     ORA    A
  198.     JZ    SYSVER1        ;GO IF NOT
  199.     CALL    ILPRT
  200.     DB    'Version for: PMMI S-100 MODEM Starting at Port ',0
  201.     LDA    IN$MODCTLP+1
  202.     CALL    HEXO
  203.     CALL    ILPRT
  204.     DB    'H',CR,LF,0
  205.     RET
  206. ;
  207. SYSVER1:
  208.     CALL    ILPRT    ;IF NOT USING THE PMMI S-100 BOARD
  209.     DB    'Version for: Non-PMMI MODEM',CR,LF,0
  210.     RET
  211. ;
  212. ;INSERT YOUR LOGON HERE, MUST END IN 0.
  213. LOGON:    DB    0
  214. ;
  215. ;INSERT YOUR INITIALIZATION ROUTINE HERE IF NEEDED.
  216. ;CAN REPLACE THE FOLLOWING SECTION WHICH IS PRESENTLY
  217. ;USED FOR THE PMMI BOARD.
  218. ;
  219. INITMOD:
  220.     LDA    PMMIBYTE
  221.     ORA    A
  222.     RZ
  223.     LDA    ANSWFLG    ;IF ANSWER OR ORIGINATE MODE..
  224.     ORA    A    ;..IS NOT REQUESTED OR NO..
  225.     JNZ    SKIPB1    ;..BAUDRATE SPECIFIED, THEN..
  226.     CALL    GETBAUD    ;..ROUTINE RETURNS WITH CHANGE..
  227.     JMP    FIXBAUD    ;..OF BAUD. IF OPT REQUESTED,..
  228. ;
  229. SKIPB1:    LDA    ORIGFLG    ;..A BLANK FORCES 300 BAUD..
  230.     ORA    A    ;..ELSE A 0 FROM NEWBAUD..
  231.     RNZ        ;..FORCES 300 BAUD.
  232.     CALL    GETBAUD
  233. FIXBAUD:
  234.     CALL    OUT$BAUDRP
  235.     CALL    CHGMSPD
  236.     MOV    A,C
  237.     STA    MSPEED
  238.     MOV    A,B
  239.     CPI    52
  240.     MVI    A,5FH
  241.     JC    GT300
  242.     MVI    A,7FH
  243. GT300:    CALL    OUT$MODCTL2
  244.     STA    MODCTLB    ;SAVE MODEM CONTROL BYTE
  245.     LDA    ORIGFLG
  246.     ORA    A
  247.     MVI    A,ORIGMOD
  248.     JZ    OFFHOOK
  249.     LDA    ANSWFLG
  250.     ORA    A
  251.     MVI    A,ANSWMOD
  252.     RNZ
  253. OFFHOOK:
  254.     LXI    H,4000
  255. OFFDLY:    DCR    L
  256.     JNZ    OFFDLY
  257.     DCR    H
  258.     JNZ    OFFDLY
  259.     CALL    OUT$MODCTLP
  260.     RET
  261. ;
  262. GETBAUD:
  263.     LDA    FCB+9
  264.     CPI    ' '
  265.     MVI    A,52
  266.     RZ
  267.     LDA    FCB+9
  268.     CPI    0
  269.     MVI    A,52
  270.     RZ
  271.     LXI    D,FCB+9
  272.     LXI    H,0
  273. DECLP:    LDAX    D
  274.     INX    D
  275.     CPI    ' '
  276.     JZ    DECLP
  277.     CPI    '0'
  278.     JC    BADRATE
  279.     CPI    '9'+1
  280.     JNC    BADRATE
  281.     SUI    '0'
  282.     MOV    B,H
  283.     MOV    C,L
  284.     DAD    H
  285.     DAD    H
  286.     DAD    B
  287.     DAD    H
  288.     ADD    L
  289.     MOV    L,A
  290.     JNZ    DIGNC
  291.     INR    H
  292. DIGNC:    MOV    A,E
  293.     CPI    FCB+12
  294.     JNZ    DECLP
  295.     MOV    A,H
  296.     CMA
  297.     MOV    D,A
  298.     MOV    A,L
  299.     CMA
  300.     MOV    E,A
  301.     INX    D
  302.     LXI    H,15625
  303.     LXI    B,-1
  304. DIVLP:    INX    B
  305.     DAD    D
  306.     JC    DIVLP
  307.     MOV    A,B
  308.     ORA    A
  309.     MOV    A,C
  310.     RZ
  311. BADRATE:
  312.     CALL    ERXIT
  313.     DB    '++ Invalid baud rate ++$'
  314. ;
  315. CHGMSPD:        ;CHANGES MSPEED FOR 110-710 BAUD
  316.     MVI    C,0    ;CONTAINS MSPEED
  317.     MOV    B,A    ;SAVE BAUD RATE DIVISOR
  318.     CPI    100    ; < 300 BAUD
  319.     RNC
  320.     INR    C
  321.     CPI    40    ; < 450 BAUD
  322.     RNC
  323.     INR    C
  324.     CPI    30    ; < 600 BAUD
  325.     RNC
  326.     INR    C
  327.     CPI    24    ; < 710 BAUD
  328.     RNC
  329.     INR    C    ;MUST BE 710 BAUD
  330.     RET
  331. ;
  332. ;DIALING ROUTINES TAKEN (AND GREATLY MODIFIED) FROM PMMI MANUAL.
  333. ;MODEM CONTROL COMMAND WORDS
  334. ;
  335. CLEAR    EQU 3FH    ;IDLE MODE
  336. MAKEM    EQU 1    ;TELE LINE MAKE (OFF HOOK)
  337. BRKM    EQU 0    ;TELE LINE ON HOOK (BREAK DURING DIALING)
  338. DTMSK    EQU 1    ;DIAL TONE MASK
  339. RBLMT    EQU 70    ;# OF SEC*10 TO WAIT BEFORE GIVING NO RING HEARD MSG
  340. RBWAIT    EQU 50    ;# OF SEC*10 DELAY BEFORE REDIALING NUMBER
  341. TMPUL    EQU 80H    ;TIMER PULSES MASK BIT
  342. TRATE    EQU 250    ;VALUE FOR 0.1 SECOND
  343. ;
  344. DIALPL:
  345.     LDA    PMMIBYTE   ;FLAG FOR PMMI OPERATION
  346.     ORA    A          ;SET FLAGS
  347.     RZ                 ;PMMI FALSE, RETURN
  348.     XRA    A          ;0
  349.     STA    CRFLAG     ;CONTINUOUS REDIAL FLAG
  350. DPL1:    LXI    H,CMDBUF+1 ;POINT # OF CHARS IN BUFF
  351.     MOV    A,M        ;GET # OF CHARS
  352.     CPI    4          ;4 OR MORE CHARS TYPED BEFORE <CR>?
  353.     JC    ENTNUM     ;NO, ASK FOR NUMBER
  354.     LXI    H,CMDBUF+6 ;POINT TO NUMBER TO DIAL
  355.     JMP    DIAL10     ;CHECK IF LIB #, & DIAL
  356. ;
  357. DIALPL0:
  358.     CALL    DISCONNT
  359.     CALL    ILPRT
  360.     DB    CR,LF,'Waiting for dial tone',CR,LF,0
  361.     MVI    A,MAKEM     ;MAKE MAKE (OFF-HOOK)
  362.     CALL    OUT$MODCTLP ;DO IT
  363.     MVI    D,DTMSK     ;DIAL TONE MASK
  364.     MVI    C,100       ;10 SECOND WAIT
  365.     CALL    WAIT        ;WAIT FOR DIAL TONE
  366.     NOP                 ;DELAY
  367. ;
  368. ; WAIT SUBROUTINE WILL RETURN WITH CARRY SET IF UNABLE TO
  369. ; GET DIALTONE, ELSE CARRY NOT SET MEANS DIALTONE RECEIVED
  370. ;
  371.     RNC        ;IF DIAL TONE WITHIN 10 SECONDS
  372.     CALL    ILPRT    ;ELSE, MESSAGE AND RETURN WITH CARRY SET
  373.     DB    CR,LF,'<< No dial tone >>',CR,LF,0
  374.     CALL    DISCONNT
  375.     STC
  376.     RET
  377. ;
  378. ;THIS IS ALL THE SET-UP FOR THE PRINT AT 'ENTNUM2'.
  379. ;
  380. ENTNUM:
  381.     MVI    C,13       ;NUMBER OF LINES TO MOVE
  382.     LXI    H,NUMBLIB  ;ADDRESS OF SOURCE MEMORY
  383.     LXI    D,DBUF     ;ADDRESS OF TARGET MEMORY
  384.     CALL    NEWLINE    ;START WITH CRLF
  385.     STAX    D          ;+LF
  386.     INX    D          ;AND BUMP IT
  387. ENTNUM1:
  388.     MVI    B,32    ;NUMBER OF BYTES TO MOVE
  389.     CALL    MOVE    ;MOVE TO BUFFER
  390.     CALL    SPACES    ;2 ENTRIES + 3 SPACES = 67 CHARACTERS
  391.     MVI    B,32
  392.     CALL    MOVE
  393.     CALL    NEWLINE
  394.     DCR    C    ;NUMBER OF LINES TO PRINT
  395.     JZ    ENTNUM2
  396.     JMP    ENTNUM1
  397. ;
  398. ENTNUM2:
  399.     MVI    A,'$'
  400.     STAX    D
  401.     CALL    CLRTST
  402.     MVI    C,PRINT
  403.     LXI    D,DBUF    ;POINT TO TABLE OF NUMBERS TO PRINT
  404.     CALL    BDOS
  405.     CALL    ILPRT
  406.     DB    CR,LF,'Enter number or library letter - <CR> when finished,'
  407.     DB    CR,LF,'Ctrl-X cancels while dialing: ',0
  408.     LXI    D,CMDBUF
  409.     CALL    INBUFF
  410. DIALLP1:
  411.     LDA    CMDBUF+1
  412.     ORA    A    ;NULL MEANS <CR> WAS TYPED
  413.     JZ    BORTIT    ;ABORT DIALING, RETURN TO MENU
  414.     LXI    H,CMDBUF+2 ;FIRST TYPED CHAR OF NUMBER TO DIAL
  415. ;
  416. ; ENTER THIS ROUTINE WITH HL POINTING TO NUMBER TO DIAL
  417. ;
  418. DIAL10:
  419.     PUSH    H    ;SAVE HL
  420.     CALL    DIALPL0    ;DISCONNECT, RECONNECT, WAIT FOR DIAL TONE
  421.     POP    H    ;GET HL
  422.     JC    DILAGN    ;NO DIALTONE?, ASK RETRY
  423.     MVI    B,'A'    ;FIRST LETTER OF ALPHABET
  424.     MVI    E,0    ;COUNTS NUMBER OF LETTERS TO MATCH
  425.     MVI    C,26    ;NUMBER OF LETTERS IN ALPHABET
  426.     MOV    A,M    ;GET CHAR BUFFER
  427. DIAL11:
  428.     CMP    B    ;NUMBER FROM TABLE?
  429.     JZ    LIBSET
  430.     INR    B    ;MAKE NEXT LETTER (A-Z)
  431.     INR    E    ;COUNT UP
  432.     DCR    C    ;COUNT DOWN
  433.     JZ    DIALLPX    ;NOT A LETTER
  434.     JMP    DIAL11    ;LOOP
  435. ;
  436. LIBSET:
  437.     LXI    H,NUMBLIB ;PHONE NUMBER LIBRARY
  438.     LXI    B,32    ;LENGTH OF LIBRARY ENTRY
  439.     MOV    A,E    ;NUMBER OF TIMES TO ADD 32 TO HL
  440.     ORA    A    ;SET FLAGS
  441.     JZ    DIAL13
  442. DIAL12:
  443.     MOV    A,M    ;GET FIRST CHAR OF SELECTED LIB ENTRY
  444.     ORA    A    ;SET FLAGS
  445.     JZ    DIALLPA    ;SEND BAD LIBRARY MSG AND ABORT
  446.     DAD    B    ;INCREMENT HL BY 32
  447.     DCR    E    ;COUNTDOWN
  448.     JNZ    DIAL12    ;NOT THERE YET, LOOP
  449. DIAL13:
  450.     MVI    B,32    ;NUMBER OF CHARACTERS TO GET FROM TABLE
  451.     LXI    D,CMDBUF+1 ;POINT TO BUFFER
  452.     XCHG        ;HL POINTS TO CMDBUF+1
  453.     MOV    M,B    ;STORE # OF BYTES IN A TABLE ENTRY
  454.     XCHG        ;RESTORE REG.
  455.     INX    D    ;POINT TO FIRST CHAR POSITION IN BUFFER
  456.     CALL    MOVE    ;MOVE TABLE ENTRY TO BUFFER
  457. DIALLPX:
  458.     LDA    CMDBUF+1
  459.     MOV    E,A    ;NUMBER OF CHARS IN BUFF
  460.     LXI    H,CMDBUF+2 ;POINT FIRST CHAR
  461. DIALLP2:
  462.     MOV    A,M    ;GET FIRST # FROM BUFFER
  463.     ORA    A    ;SET FLAGS
  464.     JNZ    NOBLMSG
  465. ;
  466. ; PRINT BAD LIBRARY MESSAGE AND ABORT IF NULL ENCOUNTERED
  467. DIALLPA:
  468.     CALL    ILPRT
  469.     DB    CR,LF,'++ Bad library number called ++',CR,LF,0
  470.     JMP    BORTIT    ;ABORT
  471. ;
  472. ; DIAL A DIGIT, CHECK KBD FOR ABORT
  473. ;
  474. NOBLMSG:
  475.     CALL    DIAL    ;DIAL IT
  476.     CALL    STAT    ; KEYPRESS?
  477.     ORA    A    ;SET FLAGS
  478.     CNZ    KEYIN    ;YES, GO GET IT
  479.     CPI    CAN    ;^X?
  480.     JZ    BORTIT    ;YES, ABORT
  481.     INX    H    ;BUMP POINTER
  482.     PUSH    D    ;SAVE DE
  483.     PUSH    H    ;SAVE HL
  484.     MVI    B,1    ;WAIT 1 TIME INTERVAL
  485.     CALL    TIMER
  486.     POP    H    ;RESTORE HL
  487.     POP    D    ;RESTORE DE
  488.     DCR    E    ;COUNT DOWN CHARS IN BUFF
  489.     JNZ    DIALLP2    ;NOT DONE, LOOP
  490.     JZ    DIALDN    ;DIALING DONE
  491. DISCONNT:
  492.     XRA    A    ;0
  493.     CALL    OUT$MODCTL2 ;CLEAR DAV, ESD, ETC
  494.     CALL    OUT$MODCTLP ;HANG-UP
  495.     PUSH    B
  496.     MVI    B,8    ;WAIT FOR PMMI TO DISCONNECT
  497.     CALL    TIMER
  498.     POP    B
  499.     RET
  500. TIMER:
  501.     MVI    A,TRATE    ;TRATE 250, VALUE FOR .1 SEC INTERVAL
  502.     CALL    OUT$BAUDRP ;B-REG CONTAINS NUMBER OF .1 SEC INTERVALS
  503. TIMES:
  504.     CALL    IN$BAUDRP  ;TO COUNT
  505.     ANI    TMPUL
  506.     JZ    TIMES      ;WAIT FOR TIMER TO GO HIGH
  507. TIMEE:
  508.     CALL    IN$BAUDRP
  509.     ANI    TMPUL
  510.     JNZ    TIMEE      ;WAIT FOR TIMER TO GO LOW
  511.     DCR    B
  512.     JNZ    TIMES
  513.     RET
  514. BORTIT:
  515.     CALL    DISCONNT
  516.     CALL    CRLF
  517.     JMP    MENU
  518. ;
  519. ;AUTO DIALER
  520. ;
  521. DIAL:
  522.     CALL    TYPE    ;PRINT WHATEVER CHARACTER, DASHES, ETC.
  523.     CPI    30H
  524.     RC        ;DIGIT MUST BE AT LEAST 0..
  525.     CPI    'R'    ;COULD IT BE A RINGBACK CHARACTER
  526.     JNZ    DIAL1    ;NO? - JUMP
  527.     PUSH    PSW    ;SAVE ACCUMULATOR & FLAGS
  528.     MOV    A,E    ;GET # OF CHAR LEFT INTO ACC.
  529.     CPI    01H    ;IS THIS THE LAST CHARACTER?
  530.     JZ    RINGBK    ;IF SO, IT MUST BE RINGBACK CHAR - DO RINGBACK
  531.     POP    PSW    ;EVERYTHING BACK AS IT WAS
  532. DIAL1:    CPI    3AH
  533.     RNC        ;..AND NOT MORE THAN 9
  534.     ANI    0FH    ;STRIP ASCII -- COULD ALSO DO SUI 30H ('0')
  535.     JNZ    DIALS
  536.     MVI    A,10    ;CONVERT ZERO TO 10 PULSES
  537. DIALS:    MOV    C,A
  538.     LDA    PULSERATE ;CONTAINS VALUE FOR DIAL SPEED
  539.     CALL    OUT$BAUDRP
  540. DIALC:    CALL    IN$BAUDRP
  541.     ANI    TMPUL
  542.     JNZ    DIALC
  543. DIALB:    CALL    IN$BAUDRP
  544.     ANI    TMPUL
  545.     JZ    DIALB
  546. MAKEP:    MVI    A,MAKEM
  547.     CALL    OUT$MODCTLP
  548. TIMEM:    CALL    IN$BAUDRP
  549.     ANI    TMPUL
  550.     JNZ    TIMEM
  551.     MVI    A,BRKM
  552.     CALL    OUT$MODCTLP
  553. TIMEB:    CALL    IN$BAUDRP
  554.     ANI    TMPUL
  555.     JZ    TIMEB
  556.     DCR    C
  557.     JNZ    MAKEP
  558.     MVI    A,MAKEM
  559.     CALL    OUT$MODCTLP
  560.     MVI    B,2
  561.     CALL    TIMER
  562.     RET
  563. ;
  564. RINGBK:
  565.     POP    PSW       ;TO GET IT OFF THE STACK
  566.     LDA    CMDBUF+1  ;GET # OF CHAR IN BUFFER
  567.     SUI    01H       ;SUBTRACT 1 TO AVOID THE RINGBACK CHAR
  568.     STA    CMDBUF+1  ;STORE THE NEW VALUE
  569.     MVI    D,DTMSK   ;LOAD TONE DETECT MASK
  570.     MVI    C,RBLMT   ;SET TIMER FOR RBLMT NUMBER OF SECONDS
  571.     CALL    WAIT
  572.     JC    RBTIME    ;JUMP IF NO RING DETECTED
  573.     MVI    B,25      ;WAIT 2.5 SEC
  574.     CALL    TIMER
  575.     CALL    IN$BAUDRP ;IS TONE STILL PRESENT?
  576.     ANA    D
  577.     JNZ    RNGBK1
  578.     JMP    DILAGN    ;YES, MUST BE BUSY
  579. ;
  580. RNGBK1:
  581.     CALL    HANGP     ;HANG UP THE PHONE
  582.     MVI    B,RBWAIT  ;WAIT X SEC
  583.     CALL    TIMER
  584.     CALL    DIALPL0   ;GO OFF HOOK & LISTEN FOR DIAL TONE
  585.     JNC    DIALLPX   ;GO REDIAL NUMBER
  586.     JMP    DILAGN    ;NO DIAL TONE HEARD
  587. ;
  588. RBTIME:
  589.     CALL    CRLF
  590.     JMP    RNGBK1    ;HANGUP, REDIAL, & LISTEN FOR CARRIER
  591. ;
  592. ;TIME OUT ROUTINE. MUST BE CALLED WITH MASK IN D REG FOR INPUT
  593. ;AT RELATIVE PORT 2 AND NUMBER OF SECONDS * 10 IN C REG.
  594. ;
  595. WAIT:
  596.     MVI    B,1    
  597.     CALL    TIMER    ;WAIT FOR TIMER TO GO HIGH THEN LOW
  598.     CALL    IN$BAUDRP ;PMMIADDR+2 (MODEM STATUS PORT)
  599.     ANA    D    ;(CTS or DIALTONE MASK)
  600.     RZ        ;ACTIVE LOW, SO RETURN ON 0
  601.     PUSH    B    ;SAVE..
  602.     PUSH    D    ;..ACTIVE REG'S
  603.     CALL    STAT    ;KEYPRESS?
  604.     ORA    A    ;SET FLAGS
  605.     CNZ    KEYIN    ;YES, GET CHAR
  606.     CPI    CAN    ;^X?
  607.     JZ    WAIT1    ;YES, DISCONNECT, JMP TO MENU
  608.     POP D        ;RESTORE..
  609.     POP B        ;..REGS
  610.     DCR C        ;COUNT-DOWN
  611.     JNZ    WAIT
  612.     STC        ;SET CARRY TO INDICATE MASK NOT SET
  613.     RET
  614. ;
  615. WAIT1:
  616.     POP    D    ;RESET..
  617.     POP    B    ;..STACK
  618.     JMP    DISCON1    ;DISCONNECT
  619. ;
  620. HANGP:
  621.     MVI    A,CLEAR
  622.     CALL    OUT$MODCTL2
  623.     MVI    A,0
  624.     CALL    OUT$MODCTLP
  625.     RET
  626. ;
  627. DIALDN:
  628.     CALL    CRLF
  629.     MVI    A,07FH       ;TURN ON DTR
  630.     CALL    OUT$MODCTL2  ;TIMER RATE?
  631.     MVI    B,1
  632.     CALL    TIMER        ;WAIT FOR MODEM TO TURN ON DTR
  633.     MVI    A,5DH        ;2 STOP BITS, NO PARITY, 8 DATA BITS
  634.     CALL    OUT$MODCTLP
  635.     MVI    D,4          ;CLEAR TO SEND MASK
  636.     MVI    C,WAITCTS    ;WQAIT TIME FOR CTS (25.5 SEC MAX)
  637.     CALL    WAIT
  638.     JNC    CONMADE      ;CONNECTION MADE
  639.     CALL    DISCONNT
  640. DILAGN:    LDA    CRFLAG       ;CONTINUOUS REDIAL FLAG
  641.     ORA    A
  642.     JNZ    DILAGN0
  643.     CALL    ILPRT
  644.     DB    CR,LF,'No answer after time-out.  Redial? (Y/N/C): ',BELL,0
  645.     CALL    KEYIN    ;GET RESPONSE
  646.     CALL    TYPE    ;ECHO IT
  647.     CALL    UCASE    ;ANI 5FH
  648.     CALL    CRLF    ;NEW LINE
  649.     CPI    'N'    ;REDIAL?
  650.     JZ    MENU    ;NO, GO MENU
  651.     CPI    'Y'    ;REDIAL?
  652.     JZ    DILAGN0    ;YES, REDIAL
  653.     CPI    'C'    ;CONTINUOUS REDIAL?
  654.     JNZ    DILAGN    ;INVALID RESPONSE, ASK AGAIN
  655.     XRA    A
  656.     CMA        ;0FFH
  657.     STA    CRFLAG    ;CONTINUOUS REDIAL FLAG
  658.  DILAGN0:
  659.     MVI    B,70    ;7 SECONDS WAIT FOR PMMI RESET
  660.     CALL    TIMER    ;ELSE BUSY TONE MAY BE SENSED AS DIALTONE
  661.     LXI    H,CMDBUF+1    ;CHECK IF 'CAL LIBNUM'
  662.     MOV    A,M
  663.     CPI    4    ;MORE THAN 4 CHARACTERS TYPED
  664.     JC    DIALLP1    ;NO, THEN GET MENU CHOICE
  665.     JMP    DPL1    ;YES, THEN USE CAL LETTER
  666. ;
  667. CONMADE:
  668.     CALL    ILPRT
  669.     DB    CR,LF,'Connection established - Select options: ',BELL,0
  670. DILAGN1:
  671.     CALL    STAT    ;KEYPRESS?
  672.     ORA    A    ;SET FLAGS
  673.     JNZ    GETCMD    ;KEY PRESSED, GO GET OPTIONS
  674.     MVI    A,BELL
  675.     CALL    TYPE    ;RING BELL
  676.     LXI    B,2000H
  677. DILAGN2:
  678.     DCR    C
  679.     JNZ    DILAGN2    ;KILL SOME TIME FOR TERMINAL TO PROCESS BELL
  680.     DCR    B
  681.     JNZ    DILAGN2
  682.     JMP    DILAGN1    ;LOOP
  683. ;
  684. CRFLAG:        DB    0        ;CONTINUOUS REDIAL FLAG
  685. ;
  686. ; END OF PMMI ROUTINES
  687. ;
  688. ;
  689. ;THE NON PMMI SETUP ROUTINES ARE INTENDED TO COME FROM
  690. ;THE USER OVERLAY. THE FOLLOWING IS A SAFETY NET
  691. ;
  692. SETUPR:        RET
  693. ;
  694. ; PHONE NUMBER LIBRARY TABLE FOR DIALING FROM LIBRARY
  695. ; OF NUMBERS STORED IN THESE DB'S AT ASSEMBLY-TIME.
  696. ; EACH DB MUST BE 32 CHARACTERS LONG FOR PROPER OPERATION.
  697. ; A 'DB 0' INDICATES NO DIALING, PROGRAM WILL DISCONNECT
  698. ; AND RETURN TO COMMAND MODE.  LAST DB MUST BE DB 0. UP TO
  699. ; 26 NUMBERS ARE ALLOWED.
  700. ;
  701. NUMBLIB:
  702. ;    '----5---10---15---20---25-----32'
  703. DB    'A=Amrad           1-703-734-1387'    ;'A'
  704. DB    'B=Ben Bronson     1-312-955-4493'    ;'B'
  705. DB    'C=CBBS Pasadena   1-213-799-1632'    ;'C'
  706. DB    'D=PMMI            1-703-379-0303'    ;'D'
  707. DB    'E=Tech. CBBS      1-313-846-6127'    ;'E'
  708. DB    'F=Ron Fowler     1-313-729-1905R'    ;'F'
  709. DB    'G=Gasnet NASA     1-301-344-9156'    ;'G'
  710. DB    'H=Dave Hardy      1-313-846-6127'    ;'H'
  711. DB    'I=Wayne Hammerly  1-301-953-3753'    ;'I'
  712. DB    'J=RBBS Pasadena   1-213-356-1034'    ;'J'
  713. DB    'K=David Kozinn    1-216-334-4604'    ;'K'
  714. DB    'L=Program Store   1-202-337-4694'    ;'L'
  715. DB    'M=Kelly Smith     1-805-527-9321'    ;'M'
  716. DB    'N=SuperBrain Sys  1-617-862-0781'    ;'N'
  717. DB    'O=R.L.Plouffe     1-703-524-2549'    ;'O'
  718. DB    'P=K.Petersen     1-313-759-6569R'    ;'P'
  719. DB    'Q=Bruce Ratoff    1-201-272-1874'    ;'Q'
  720. DB    'R=Mark Pulver     1-312-789-0499'    ;'R'
  721. DB    'S=                              '    ;'S'
  722. DB    'T=                              '    ;'T'
  723. DB    'U=                              '    ;'U'
  724. DB    'V=                              '    ;'V'
  725. DB    'W=                              '    ;'W'
  726. DB    'X=                              '    ;'X'
  727. DB    'Y=                              '    ;'Y'
  728. DB    'Z=                              '    ;'Z'
  729. DB    0                    ; end
  730. ;    '----5---10---15---20---25-----32'
  731. ;
  732. START:
  733.     LXI    H,0
  734.     DAD    SP    ;GET CP/M'S STACK
  735.     SHLD    STACK    ;SAVE IT
  736.     LXI    SP,STACK    ;START LOCAL STACK
  737.     CALL    ILPRT
  738.     DB    CR,LF,'MODEM 7.98 - 12/31/82',CR,LF,0
  739.     CALL    INITADR    ;INITIALIZE ADDRESSES
  740.     CALL    JMP$SYSVER    ;GIVE CONFIGURATION MESSAGE
  741.     CALL    GETUSR    ;GET USER
  742.     STA    SAVUSR    ;SAVE FOR EXIT
  743.     MVI    A,TRUE    ;0FFH
  744.     STA    NFILFLG
  745.     CMA        ;0
  746.     STA    SAVEFLG
  747.     LDA    FCB+1        ;IS THERE A COMMAND TAIL?
  748.     STA    OPTION
  749.     CPI    ' '
  750.     JNZ    START0        ;IF YES, DIGEST IT
  751.     SUB    A
  752.     STA    EXITFLG        ;ELSE SAY WE WANT MENU
  753.     JMP    START1
  754. START0:
  755.     LXI    H,80H        ;SIMULATE COMMAND LINE INPUT FROM MENU
  756.     MOV    B,M        ;SAVE CHAR CNT
  757. STARTA:
  758.     INX    H
  759.     MOV    A,M        ;SKIP OVER LEADING SPACES IN COMMAND TAIL
  760.     CPI    ' '
  761.     JNZ    STARTB
  762.     DCR    B
  763.     JMP    STARTA
  764. STARTB:
  765.     MOV    A,B
  766.     STA    CMDBUF+1    ;STORE COMMAND CHAR COUNT LESS LEADING SPACES
  767.     INR    B        ;MOVE 1 EXTRA BYTE (SHOULD BE A NULL)
  768.     LXI    D,CMDBUF+2
  769.     CALL    MOVE
  770.     CALL    SETFCB        ;DIGEST COMMAND LINE AND OPTIONS
  771. START1:
  772.     LDA    UARTFLG
  773.     ORA    A
  774.     MVI    A,ANSWMOD
  775.     STA    UARTCTLB
  776.     JNZ    RESTART
  777.     MVI    A,ORIGMOD
  778.     STA    UARTCTLB
  779. ;
  780. RESTART:
  781.     LXI    SP,STACK;MAKE SURE WE HAVE A CLEAN STACK
  782.     LXI    D,CMDBUF+1    ;MAY BE USEFUL WHERE WE ARE GOING
  783.     LDA    OPTION    ;GET MAIN OPTION
  784.     MOV    B,A    ;SAVE IT
  785.     LDA    PMMIBYTE ;PMMI?
  786.     ORA    A    ;SET FLAGS
  787.     MOV    A,B    ;GET OPTION BACK
  788.     JZ    S1    ;NOT PMMI
  789.     CPI    'C'    ;CALL (DIAL) FUNCTION?
  790.     JZ    JMP$DIALPL    ;YES, GO TO IT
  791.     CPI    'D'    ;DISCONNECT?
  792.     JZ    DISCON1    ;YES, DISCONNECT & GO MENU
  793. S1:    CPI    ' '    ;NO OPTION SPEC'D?
  794.     JZ    MENU    ;TRUE, GO MENU
  795.     CPI    'H'    ;MENU ASKED FOR?
  796.     JZ    MENU2    ;YES, GO MENU2
  797.     CALL    JMP$INITMOD
  798.     CALL    MOVEFCB
  799.     CALL    IN$MODDATP ;GOBBLE UP GARBAGE..
  800.     CALL    IN$MODDATP ;..CHARACTERS ON LINE
  801.     XRA    A
  802.     STA    ECHOFLG    ;RESET ECHO FLAG
  803.     STA    LOCFLG    ;RESET LOCAL FLAG
  804.     LDA    OPTION    ;PROCESS MAIN OPTION
  805.     CPI    'E'    ;ECHO MODE?
  806.     JNZ    NOECH    ;JUMP IF NOT
  807.     MVI    A,TRUE    ;SET ECHO TO TRUE
  808.     STA    ECHOFLG
  809.     JMP    DSKSAVE
  810. NOECH:    CPI    'L'    ;LOCAL ECHO MODE
  811.     JNZ    NOLOC
  812.     MVI    A,TRUE
  813.     STA    LOCFLG
  814.     JMP    DSKSAVE
  815. NOLOC:    CPI    'T'    ;TERMINAL MODE?
  816.     JZ    DSKSAVE    ;YES
  817.     CPI    'S'    ;SEND A FILE?
  818.     JZ    SENDFIL    ;YES
  819.     CPI    'R'    ;RECEIVE A FILE?
  820.     JZ    RCVFIL    ;YES
  821.     CALL    NOTVLDMSG    ;SAY NOT A VALID OPTION
  822.     JMP    MENU    ;NO VALID OPTION SPEC'D, GO MENU
  823. ;
  824. ;REVISED TERMINAL ROUTINE ALLOWING MEMORY SAVE
  825. ;
  826. DSKSAVE:
  827.     LDA    FCB+1    ;FIRST CHAR OF FILENAME
  828.     CPI    ' '    ;FILE SPEC'D
  829.     JNZ    GOODNM    ;YES, GOOD NAME
  830.     MVI    A,TRUE    ;0FFH
  831.     STA    NFILFLG
  832.     CMA        ;0
  833.     STA    SAVEFLG
  834.     JMP    TERM
  835. ;
  836. GOODNM:
  837.     CALL    ERASFIL
  838.     CALL    MOVE2
  839.     LXI    D,FCB3
  840.     MVI    C,MAKE
  841.     CALL    BDOS
  842.     LXI    D,FCB3
  843.     MVI    C,OPEN
  844.     CALL    BDOS
  845.     LXI    H,BOTTRAM
  846.     SHLD    HLSAVE
  847.     XRA    A
  848.     STA    NFILFLG
  849.     STA    LISTMOR        ;STOP ANY BUFFERED PRINTER OUTPUT
  850. TERM:    LDA    UARTFLG
  851.     STA    ORIGSAV
  852.     ORA    A
  853.     MVI    A,ANSWMOD
  854.     STA    UARTCTLB
  855.     JNZ    TERM2
  856.     MVI    A,ORIGMOD
  857.     STA    UARTCTLB
  858. TERM2:    LDA    LISTMOR        ;ANY BUFFERED PRINTER OUTPUT?
  859.     ORA    A
  860.     CNZ    GOLIST        ;GO IF SO
  861.     CALL    STAT    ;KEYPRESS?
  862.     JZ    TERML    ;NO, CHECK LINE
  863.     CALL    KEYIN    ;GET CHAR FROM KBD
  864.     CPI    ' '
  865.     JNC    NOTOG    ;GO IF NOT CONTROL CHARACTER
  866.     MOV    B,A    ;SAVE
  867.     CPI    BKSP    ;TEST FOR BACKSPACE
  868.     JNZ    NOBKSP
  869.     LDA    CONVBKSP  ;CONVERT BACKSPACE TO RUB?
  870.     ORA    A
  871.     JZ    NOBKSP    ;GO IF NO CONVERSION
  872.     MVI    A,RUB
  873.     JMP    NOTOG
  874. NOBKSP:    LDA    EXACFLG
  875.     ORA    A    ;EXACT?
  876.     MVI    A,0
  877.     STA    EXACFLG        ;CLR FOR NEXT TIME
  878.     JZ    NOTEXAFLG    ;GO OF EXAFLG FALSE
  879.     LDA    LOCONEXTCHR
  880.     ORA    A    ;SHOULD WE SEND ON EXAFLG?
  881.     MOV    A,B
  882.     JZ    NOTOG    ;YES, IF LOCONEXTCHR FALSE
  883.     LDA    EXTCHR    ;WE WANT TO SEND EXTCHR IN ANY CASE
  884.     CMP    B
  885.     MOV    A,B
  886.     JZ    NOTOG    ;SEND IF EXTCHR
  887.     JMP    LOCCHK    ;OTHERWISE DO LOCAL STUFF
  888. NOTEXAFLG:
  889.     LDA    EXTCHR    ;TREAT NEXT CHARACTER IN SPECIAL WAY?
  890.     CMP    B
  891.     JZ    EXTFLG    ;YES, SET EXAFLG FOR NEXT CHAR
  892.     LDA    LOCONEXTCHR
  893.     ORA    A    ;SHOULD WE SEND IF NOT EXAFLG
  894.     MOV    A,B
  895.     JNZ    NOTOG    ;YES, IF LOCONEXTCHR TRUE
  896. LOCCHK:    LDA    EXITCHR    ;RETURN TO MENU?
  897.     CMP    B
  898.     JZ    EXITMEN    ;YES, RETURN TO MENU
  899.     LDA    TRANCHR    ;OUTPUT TEXT FILE TO REMOTE?
  900.     CMP    B
  901.     CZ    TRANSFER  ;SEND-A-FILE (BLIND SEND)
  902.     JZ    TERM2      ;LOOP
  903.     LDA    TRANLOGON
  904.     ORA    A
  905.     JZ    SKPLOGON
  906.     LDA    LOGCHR    ;SEND LOGON?
  907.     CMP    B
  908.     JZ    SENDLOG
  909. SKPLOGON:
  910.     LDA    LSTTST
  911.     ORA    A
  912.     JZ    NOLST
  913.     LDA    LSTCHR
  914.     CMP    B
  915.     JNZ    NOLST
  916.     LDA    LISTFLG
  917.     CMA
  918.     STA    LISTFLG
  919.     CALL    CRLF
  920.     CALL    CRLF
  921.     CALL    LSTMSG
  922.     CALL    CRLF
  923.     JMP    TERML
  924. NOLST:    LDA    PMMIBYTE
  925.     ORA    A
  926.     JZ    S2
  927.     LDA    DISCCHR    ;PMMI DISCONNECT?
  928.     CMP    B
  929.     JZ    DISCON1    ;YES, DISCONNECT & RETURN TO MENU
  930.     LDA    BRKCHR    ;PMMI BREAK?
  931.     CMP    B
  932.     JZ    BREAK
  933.     LDA    CHGBAUD    ;PMMI CHANGE BAUD?
  934.     CMP    B
  935.     PUSH    PSW
  936.     PUSH    H
  937.     CZ    NEWBAUD
  938.     POP    H
  939.     POP    PSW
  940.     JZ    TERML
  941. S2:    LDA    UNSAVECHR    ;CLOSE INPUT BUFFER?
  942.     CMP    B
  943.     JZ    S2A    ;IF YES, DISABLE COPY
  944.     LDA    SAVECHR    ;OPEN INPUT BUFFER?
  945.     CMP    B
  946.     MOV    A,B    ;RESTORE CHARACTER TYPED
  947.     JNZ    NOTOG
  948.     LDA    NFILFLG    ;DO NOT ALLOW SAVE IF..
  949.     CPI    TRUE    ;..THIS FLAG IS SET.
  950.     JZ    TERML
  951.     MVI    A,TRUE    ;0FFH -- ALLOW COPY INTO FILE
  952.     JMP    S2B
  953. S2A:    MVI    A,FALSE    ;0 -- STOP COPY INTO FILE
  954. S2B:    STA    SAVEFLG
  955.     CALL    BUFMSG
  956.     JMP    TERML
  957. ;
  958. BUFMSG:    CALL    ILPRT
  959.     DB    CR,LF,LF,'** Memory buffer ',0
  960.     LDA    SAVEFLG
  961.     ORA    A
  962.     JZ    BUFMSG2
  963.     CALL    ILPRT
  964.     DB    'open **',CR,LF,LF,':',BELL,0
  965.     RET
  966. ;
  967. BUFMSG2:
  968.     CALL    ILPRT
  969.     DB    'closed **',CR,LF,LF,BELL,0
  970.     RET
  971. ;
  972. EXITMEN:
  973.     CALL    CRLF
  974.     CALL    CLREOS    ;CLEAR TO END OF SCREEN TO CLEAN UP ANY MESS
  975.     JMP    MENU0
  976. ;
  977. SENDREADY:
  978.     CALL    IN$MODCTLP
  979.     CALL    ANI$MODSNDB
  980.     JMP    CPI$MODSNDR
  981. ;
  982. SENDLF:    CALL    SENDREADY
  983.     JNZ    NOLFYET        ;GO IF NOT READY FOR OUTPUT YET
  984.     MVI    A,LF
  985.     JMP    NOTOG        ;SEND LF
  986. NOLFYET:
  987.     CALL    EXITTEST
  988.     JNC    EXITMEN        ;GO IF SO, SO DON'T GET HUNG UP
  989.     JMP    SENDLF        ;ELSE KEEP TRYING TO SEND LF
  990. ;
  991. SENDLOG:
  992.     PUSH    H
  993.     LHLD    LOGONPTR    ;HL POINTS TO START OF LOGON MESSAGE
  994. LOGLP:    CALL    SENDREADY
  995.     JNZ    NOSENDLOG    ;GO IF NOT READY
  996.     MOV    A,M        ;GET LOGON BYTE
  997.     INX    H
  998.     CPI    0        ;IS IT THE END?
  999.     JZ    ENDLOG        ;GO IF SO
  1000.     CALL    OUT$MODDATP
  1001.     JMP    LOGLP
  1002. NOSENDLOG:
  1003.     CALL    EXITTEST    ;TEST SO DON'T GET HUNG UP
  1004.     JNC    EXITLOG        ;GO IF OPERATOR WANTS EXIT
  1005.     JMP    LOGLP
  1006. ;
  1007. ENDLOG:    POP    H
  1008.     JMP    TERML
  1009. ;
  1010. EXITLOG:
  1011.     POP    H
  1012.     JMP    EXITMEN
  1013. ;
  1014. EXITTEST:
  1015.     CALL    STAT    ;KEYPRESS?
  1016.     JZ    NOKEY
  1017.     CALL    KEYIN    
  1018.     MOV    B,A
  1019.     LDA    EXITCHR    ;SEE IF OPERATOR WANTS EXIT
  1020.     CMP    B
  1021.     JNZ    NOKEY    ;GO IF WRONG KEY        
  1022.     STC
  1023.     CMC        ;RESET FOR EXIT
  1024.     RET
  1025. NOKEY:    STC        ;SET FOR NO KEY OR WRONG KEY
  1026.     RET
  1027. ;
  1028. EXTFLG:    MVI    A,TRUE
  1029.     STA    EXACFLG
  1030.     JMP    TERML
  1031. ;
  1032. RCVREADY:
  1033.     CALL    IN$MODCTLP
  1034.     CALL    ANI$MODRCVB
  1035.     JMP    CPI$MODRCVR
  1036. ;
  1037. LSTMSG:    LDA    LISTFLG
  1038.     ORA    A
  1039.     JZ    LSTMSG2
  1040.     CALL    ILPRT
  1041.     DB    'Printer is on',CR,LF,0
  1042.     RET
  1043. LSTMSG2:
  1044.     CALL    ILPRT
  1045.     DB    'Printer is off',CR,LF,0
  1046.     RET
  1047. ;
  1048. NOTOG:    CALL    OUT$MODDATP
  1049.     MOV    B,A
  1050.     LDA    LOCFLG
  1051.     ORA    A
  1052.     JNZ    LTYPE
  1053.     LDA    ECHOFLG
  1054.     ORA    A
  1055.     JZ    CHKCR
  1056. LTYPE:    MOV    A,B
  1057.     CALL    TYPE
  1058.     CALL    CHKSAVE        ;TO STORE LOCAL IF BUFFER OPEN
  1059.     CALL    CHKPRNT
  1060. CHKCR:    MVI    A,CR
  1061.     CMP    B
  1062.     JNZ    TERML
  1063.     LDA    ADDLF
  1064.     ORA    A
  1065.     JZ    TERML
  1066.     JMP    SENDLF
  1067. ;
  1068. TERML:    CALL    RCVREADY    ;TEST FOR RECEIVED CHARACTER
  1069.     JNZ    TERM2
  1070.     CALL    IN$MODDATP
  1071.     ANI    7FH    ;STRIP PARITY
  1072.     JZ    TERM2        
  1073. GIVLF:    CALL    TYPE
  1074.     MOV    B,A
  1075.     CALL    CHKSAVE
  1076.     CALL    CHKPRNT
  1077.     LDA    ECHOFLG
  1078.     ORA    A
  1079.     JZ    NOECHO
  1080.     MOV    A,B
  1081.     CALL    OUT$MODDATP
  1082. NOECHO:    MVI    A,CR
  1083.     CMP    B
  1084.     JNZ    TERM2
  1085.     LDA    ADDLF
  1086.     JZ    TERM2
  1087.     LDA    ECHOFLG
  1088.     ORA    A
  1089.     JNZ    SENDLF
  1090.     MVI    A,LF
  1091.     JMP    GIVLF
  1092. ;
  1093. CHKSAVE:
  1094.     LDA    SAVEFLG
  1095.     ORA    A
  1096.     RZ
  1097.     MOV    M,B
  1098.     INX    H
  1099.     SHLD    HLSAVE    ;MENU COMMAND DESTROYS HL-REG..
  1100.     MVI    A,LF
  1101.     CMP    B
  1102.     JNZ    NOCOLON    ;..TYPE ":" AFTER EACH LINE FEED..
  1103.     MVI    A,':'    ;..WHEN MEMORY SAVE ACTIVE.
  1104.     CALL    TYPE
  1105. NOCOLON:
  1106.     CALL    GETMAX
  1107.     CMP    H
  1108.     PUSH    B
  1109.     CZ    INTDSKSV
  1110.     POP    B
  1111.     RET
  1112. ;
  1113. GETMAX:    LDA    SAVCCP
  1114.     ORA    A
  1115.     LDA    7
  1116.     JZ    SUB1
  1117.     SBI    8    ;..PAGE BELOW CCP ..
  1118. SUB1:    DCR    A    ;..OR BDOS HAS BEEN..
  1119.     RET        ;..REACHED AND DISKSAVE IS NEEDED.
  1120. ;
  1121. CHKPRNT:
  1122.     LDA    LISTFLG    ;OUT TO PRINTER?
  1123.     ORA    A
  1124.     RZ        ;RETURN IF NOT
  1125.     LDA    NFILFLG    ;IS BUFFER USED FOR FILE?
  1126.     ORA    A
  1127.     JZ    NOBUFF    ;DON'T BUFFER PRINTER IF SO, HOWEVER CHARACTERS
  1128.             ;WILL BE LOST IF PRINTER IS SLOWER THAN MODEM
  1129.     CALL    GETMAX    ;GET MAXIMUM FOR BUFFER
  1130.     LHLD    HLSAVE1    
  1131.     CMP    H    ;ARE WE THERE?
  1132.     JNZ    NOTMAX    ;GO IF NOT
  1133.     LXI    H,BOTTRAM    ;FLUSH BUFFER
  1134.     SHLD    HLSAVE1
  1135.     SHLD    HLSAVE2
  1136. NOTMAX:    
  1137.     MOV    M,B    ;SAVE CHARACTER IN BUFFER
  1138.     INX    H    ;INCREMENT END OF BUFFER
  1139.     SHLD    HLSAVE1
  1140.     MVI    A,TRUE    ;SET FLAG FOR PRINTER OUTPUT
  1141.     STA    LISTMOR
  1142.     RET
  1143. ;
  1144. NOBUFF:
  1145.     CALL    LSTSTAT    
  1146.     RZ        ;RETURN IF PRINTER BUSY
  1147.     MOV    C,B    ;ELSE PRINT CHARACTER
  1148.     JMP    LISTER
  1149. ;
  1150. GOLIST:
  1151.     CALL    LSTSTAT
  1152.     RZ        ;RETURN IF PRINTER BUSY
  1153.     LHLD    HLSAVE2    ;GET LOCATION OF NEXT CHARACTER TO PRINT
  1154.     MOV    C,M    ;GET CHARACTER
  1155.     INX    H    ;INCREMENT POINTER
  1156.     SHLD    HLSAVE2
  1157.     CALL    CMPBUFF    ;CHECK FOR END OF BUFFER
  1158.     JMP    LISTER    ;PRINT
  1159. ;
  1160. ;ROUTINE CHECKS FOR END OF BUFFER, RESETS BUFFER IF SO AND STOPS
  1161. ;PRINTER OUTPUT
  1162. ;
  1163. CMPBUFF:
  1164.     LHLD    HLSAVE2
  1165.     XCHG
  1166.     LHLD    HLSAVE1
  1167.     MOV    A,L
  1168.     SUB    E
  1169.     MOV    L,A
  1170.     MOV    A,H
  1171.     SBB    D
  1172.     ORA    L
  1173.     RNZ
  1174.     LXI    H,BOTTRAM
  1175.     SHLD    HLSAVE1
  1176.     SHLD    HLSAVE2
  1177.     XRA    A
  1178.     STA    LISTMOR
  1179.     RET
  1180. ;
  1181. INTDSKSV:
  1182.     MVI    A,XOFF       ;SEND A CTRL-S TO STOP..
  1183.     CALL    OUT$MODDATP  ;..REMOTE COMPUTER OUTPUT.
  1184.     MVI    D,0          ;D IS THE BUFFER COUNT
  1185.     CALL    INMODEM      ;GET LAST BYTES SENT..
  1186.     STA    LASTBYT1     ;..AFTER CTRL-S.
  1187.     CALL    INMODEM      ;ADD MORE CALLS TO INMODEM..
  1188.     STA    LASTBYT2     ;..AND STA LASTBYT# IF YOU ARE..
  1189.     PUSH    D
  1190.     CALL    NUMREC1
  1191.     CALL    WRTDSK       ;WRITE THE RECORDS
  1192.     POP    D
  1193.     LXI    H,BOTTRAM
  1194.     INR    D
  1195.     DCR    D            ;TEST BUFFER COUNT FOR ZERO
  1196.     JZ    CTRLQ
  1197.     LDA    LASTBYT1     ;GET THE LAST BYTES THAT WERE..
  1198.     MOV    M,A          ;..SAVED AND PUT THEM IN..
  1199.     INX    H            ;..BOTTRAM.
  1200.     CALL    TYPE
  1201.     DCR    D
  1202.     JZ    CTRLQ
  1203.     LDA    LASTBYT2
  1204.     MOV    M,A
  1205.     INX    H
  1206.     CALL    TYPE
  1207. CTRLQ:
  1208.     MVI    A,XON        ;SEND START CHARACTER..
  1209.     JMP    OUT$MODDATP  ;..TO REMOTE COMPUTER.
  1210. ;
  1211. BREAK:
  1212.     PUSH    D    ;SAVE IT
  1213.     LXI    D,0    ;ZERO IT
  1214.     LDA    MODCTLB    ;GET THE LAST MODEM CONTROL BYTE
  1215.     ANI    0FBH    ;SET THE TRANSMIT BREAK BIT LOW - ACTIVE LOW
  1216.     CALL    OUT$MODCTL2 ;SEND IT TO THE MODEM
  1217.     PUSH    H
  1218.     LXI    H,225
  1219.     CALL    FIXCNT
  1220.     PUSH    H
  1221.     POP    B
  1222.     POP    H
  1223. BRK1:    CALL    TIMERL
  1224.     JZ    BRK2    ;IF TIME IS UP RESET BREAK
  1225.     CPI    0    ;CHECK FOR NULLS
  1226.     JZ    BRK1    ;DON'T PROCESS THEM
  1227.     ANI    7FH    ;STRIP PARITY
  1228.     CALL    TYPE
  1229.     PUSH    PSW
  1230.     LDA    SAVEFLG
  1231.     CPI    FALSE
  1232.     JZ    NOSAVEB
  1233.     POP    PSW
  1234.     MOV    M,A
  1235.     INX    H
  1236.     SHLD    HLSAVE    ;MENU COMMAND DESTROYS HL-REG..
  1237.             ;..GET    HL WHEN ENTERING VIA 'NOL' CMD.
  1238. COLONB:
  1239.     CPI    LF
  1240.     JNZ    BRK1    ;..TYPE ":" AFTER EACH LINE FEED..
  1241.     MVI    A,':'    ;..WHEN MEMORY SAVE ACTIVE.
  1242.     CALL    TYPE
  1243.     JMP    BRK1
  1244. ;
  1245. NOSAVEB:
  1246.     POP    PSW    ;RESTORE IT
  1247.     JMP    BRK1
  1248. ;
  1249. BRK2:
  1250.     LDA    MODCTLB    ;GET MODEM CONTROL BYTE
  1251.     CALL    OUT$MODCTL2
  1252.     POP    D
  1253.     LHLD    HLSAVE    ;LAST ADDRESS WRITTEN IF DATA BEING SAVED
  1254.     LDA    SAVCCP
  1255.     ORA    A
  1256.     JZ    SUB2
  1257.     LDA    7    ;CHECK TO SEE IF..
  1258.     SBI    8    ;..PAGE BELOW CCP ..
  1259.     JMP    SUB2A
  1260. ;
  1261. SUB2:
  1262.     LDA    7
  1263. SUB2A:
  1264.     DCR    A    ;..OR BDOS HAS BEEN ..
  1265.     CMP    H    ;..REACHED AND DISKSAVE IS NEEDED.
  1266.     JNZ    TERM2    ;NO PROBLEM - GO BACK TO NORMAL ROUTINE
  1267.     CALL    ILPRT
  1268.     DB    CR,LF,'Memory save buffer full',CR,LF,BELL,0
  1269.     JMP    TERM2
  1270. ;
  1271. ;THIS SUBROUTINE WILL LOOP UNTIL THE MODEM RECEIVES A CHARACTER
  1272. ;OR 100 MILLISECONDS. IF A CHARACTER IS RECEIVED, A FLAG IS SET
  1273. ;TO STORE THE CHARACTER. A MAXIMUM OF TWO CHARACTERS ARE STORED,
  1274. ;BUT MORE MAY BE STORED IF DESIRED (SEE COMMENT IN "INTDSKSV"
  1275. ;ABOVE).
  1276. ;
  1277. INMODEM:
  1278.     PUSH    H
  1279.     LXI    H,625
  1280.     CALL    FIXCNT
  1281.     PUSH    H
  1282.     POP    B
  1283.     POP    H
  1284. TIMERL:
  1285.     CALL    RCVREADY
  1286.     JZ    GETBYTE
  1287.     DCX    B
  1288.     MOV    A,B
  1289.     ORA    C
  1290.     JNZ    TIMERL
  1291.     RET
  1292. ;
  1293. GETBYTE:
  1294.     CALL    IN$MODDATP
  1295.     INR    D
  1296.     RET
  1297. ;
  1298. NUMRECS:
  1299.     MVI    M,EOFCHAR
  1300.     INX    H
  1301.     LXI    D,127
  1302.     DAD    D
  1303. NUMREC1:
  1304.     LXI    D,-(BOTTRAM)
  1305.     DAD    D
  1306.     MOV    A,L    ;DIVIDE HL BY 128..
  1307.     ORA    A
  1308.     RAL        ;..TO GET THE..
  1309.     MOV    L,H    ;..NUMBER OF SECTORS
  1310.     MVI    H,0
  1311.     PUSH    PSW
  1312.     DAD    H
  1313.     POP    PSW
  1314.     MVI    A,0
  1315.     ADC    L
  1316.     MOV    L,A    ;RETURNS WITH NUMBER OF..
  1317.     RET        ;..128 BYTE RECORDS IN HL.
  1318. ;
  1319. WRTDSK:    LXI    D,BOTTRAM
  1320. NEXTWRT:
  1321.     MVI    C,STDMA
  1322.     CALL    BDOSRT
  1323.     PUSH    D
  1324.     LXI    D,FCB3
  1325.     MVI    C,WRITE
  1326.     CALL    BDOSRT
  1327.     POP    D
  1328.     XCHG
  1329.     PUSH    D
  1330.     LXI    D,128
  1331.     DAD    D
  1332.     POP    D
  1333.     XCHG
  1334.     DCX    H
  1335.     MOV    A,H
  1336.     ORA    L
  1337.     JNZ    NEXTWRT
  1338.     RET
  1339. ;
  1340. CLOSE3:    LXI    D,FCB3
  1341.     MVI    C,CLOSE
  1342.     JMP    BDOS
  1343. ;
  1344. BDOSRT:
  1345.     PUSH    B
  1346.     PUSH    D
  1347.     PUSH    H
  1348.     PUSH    PSW
  1349.     CALL    BDOS
  1350.     POP    PSW
  1351.     POP    H
  1352.     POP    D
  1353.     POP    B
  1354.     RET
  1355. ;
  1356. MOVE2:
  1357.     LXI    H,FCB3
  1358.     CALL    INITFCBS
  1359.     LXI    H,FCB
  1360.     LXI    D,FCB3
  1361.     MVI    B,12
  1362.     JMP    MOVE
  1363. ;
  1364. ;FILE TRANSFER ROUTINE - CALLED WITH 
  1365. ;CONTROL-T FROM TERMINAL ROUTINE.
  1366. ;TRANSFER MAY BE CANCELLED WHILE SENDING BY USING CONTROL-X.
  1367. ;
  1368. TRANSFER:
  1369.     PUSH    H
  1370.     PUSH    D
  1371.     PUSH    B
  1372.     PUSH    PSW
  1373.     LXI    H,FCB4
  1374.     CALL    INITFCBS ;INITIALIZES FCBS POINTED..
  1375.     LXI    H,FCB+16 ;..TO BY HL REG.
  1376.     CALL    INITFCBS
  1377. GET:
  1378.     CALL    GETNAME
  1379.     LDA    CMDBUF+2 ;WAS FILE ENTERED
  1380.     CPI    20H
  1381.     JZ    TRANSL2
  1382.     CALL    MOVE4
  1383.     CALL    OPEN4
  1384.     CPI    0FFH    ;RETURN WITH 0FFH MEANS
  1385.     JNZ    CONTIN    ;FILE DOES NOT EXIST
  1386. TRANSL1:
  1387.     CALL    ILPRT
  1388.     DB    CR,LF,'++File does not exist++',CR,LF,0
  1389. TRANSL2:
  1390.     CALL    ILPRT
  1391.     DB    'Type "R" to return to modem',CR,LF
  1392.     DB    'Type "A" to re-enter name: ',BELL,0
  1393.     CALL    KEYIN
  1394.     CALL    UCASE
  1395.     CALL    TYPE    ;ECHO RESPONSE
  1396.     CALL    CRLF
  1397.     CPI    'A'
  1398.     JZ    GET
  1399.     CPI    'R'
  1400.     JZ    RETURN
  1401.     JMP    TRANSL2
  1402. ;
  1403. CONTIN:
  1404.     LXI    D,80H
  1405.     MVI    C,STDMA
  1406.     CALL    BDOS
  1407. READMR:
  1408.     CALL    READ80
  1409.     CPI    1    ;END OF FILE
  1410.     JZ    RETURNS
  1411.     CPI    2    ;BAD READ
  1412.     JZ    RETURNU
  1413.     CALL    SEND80C
  1414.     CPI    EOFCHAR    ;END OF FILE - OMIT IF OBJECT..
  1415.     JZ    RETURNS    ;..CODE IS TO BE SENT.
  1416.     CPI    CAN    ;CANCELLATION?
  1417.     JZ    TRANCAN
  1418.     JMP    READMR
  1419. ;
  1420. RETURNS:
  1421.     CALL    ILPRT
  1422.     DB    CR,LF,'++File transfer completed++',CR,LF,BELL,0
  1423.     JMP    RETURN
  1424. ;
  1425. RETURNU:
  1426.     CALL    ILPRT
  1427.     DB    CR,LF,'++File transfer unsuccessful++',CR,LF,BELL,0
  1428.     JMP    RETURN
  1429. ;
  1430. TRANCAN:
  1431.     CALL    ILPRT
  1432.     DB    CR,LF,LF,'++ Transfer cancelled ++',CR,LF,BELL,0
  1433. RETURN:
  1434.     POP    PSW
  1435.     POP    B
  1436.     POP    D
  1437.     POP    H
  1438.     RET
  1439. ;
  1440. INITFCBS:        ;ENTRY AT +2 WILL LEAVE..
  1441.     MVI    M,0    ;..DRIVE NO. INTACT.
  1442.     INX    H    ;WILL INITIALIZE AN FCB..
  1443.     MVI    B,11    ;..POINTED TO BY HL-REG. FILLS 1ST POS
  1444. LOOP10:
  1445.     MVI    M,' '    ;..WITH 0, NEXT 11 WITH..
  1446.     INX    H    ;..WITH BLANKS, AND LAST..
  1447.     DCR    B    ;..21 WITH NULLS.
  1448.     JNZ    LOOP10
  1449.     MVI    B,21
  1450. LOOP11:
  1451.     MVI    M,0
  1452.     INX    H
  1453.     DCR    B
  1454.     JNZ    LOOP11
  1455.     RET
  1456. ;
  1457. GETNAME:
  1458.     CALL    ILPRT
  1459.     DB    CR,LF,'Enter file name to be transferred -  C/R TO QUIT: ',0
  1460.     LXI    D,CMDBUF
  1461.     CALL    INBUFF
  1462.     JMP    CRLF
  1463. ;
  1464. MOVE4:
  1465.     LXI    D,CMDBUF
  1466.     LXI    H,FCB4
  1467.     JMP    CPMLINE
  1468. ;
  1469. OPEN4:
  1470.     LXI    D,FCB4
  1471.     MVI    C,OPEN
  1472.     JMP    BDOS
  1473. ;
  1474. READ80:
  1475.     LXI    D,FCB4
  1476.     MVI    C,READ
  1477.     JMP    BDOS
  1478. ;
  1479. SEND80C:
  1480.     MVI    B,80H
  1481.     LXI    H,80H
  1482. SENDCH1:
  1483.     PUSH    D
  1484.     CALL    SPEED
  1485.     POP    D
  1486.     MOV    A,M
  1487.     CALL    MODOUT
  1488.     CPI    EOFCHAR
  1489.     RZ
  1490.     CALL    STAT    ;TEST TO SEE IF
  1491.     ORA    A    ;CANCELLATION REQUESTED
  1492.     JZ    SKIP12
  1493.     CALL    KEYIN
  1494.     CPI    CAN
  1495.     RZ
  1496. SKIP12:
  1497.     INX    H
  1498.     DCR    B
  1499.     JNZ    SENDCH1
  1500.     RET
  1501. ;
  1502. MODOUT:
  1503.     PUSH    PSW
  1504. MODOUTL:
  1505.     LDA    XOFFTST
  1506.     ORA    A
  1507.     CNZ    TXOFF
  1508.     CALL    SENDREADY
  1509.     JNZ    MODOUTL
  1510.     POP    PSW
  1511.     CALL    OUT$MODDATP
  1512.     CALL    TYPE
  1513.     CPI    CR
  1514.     JZ    DLYCR
  1515.     RET
  1516. ;
  1517. DLYCR:    INX    H    ;ALWAYS DISPLAY LF AFTER CR
  1518.     MVI    A,LF
  1519.     CMP    M
  1520.     DCX    H
  1521.     JZ    LFSKIP
  1522.     CALL    TYPE
  1523. LFSKIP:    LDA    XONWAIT    ;WAIT FOR XON AFTER CR?
  1524.     ORA    A
  1525.     JNZ    WAITXON
  1526.     LDA    CRDLY    ;EXTRA DELAY AFTER CR
  1527.     JMP    DLYCR2
  1528. ;
  1529. SPEED:    LDA    BYTDLY    ;GET SPEED VALUE (0-9)
  1530.             ;DELAY IS FROM 0.02 SEC FOR SPDVAL = 1
  1531.             ;TO 0.18 SEC FOR SPDVAL    = 9
  1532. DLYCR2:    ORA    A
  1533.     RZ        ;RETURN IF 0
  1534.     MOV    C,A
  1535. SPDLP:    CALL    SPD1    ;OUTER LOOP
  1536.     DCR    C
  1537.     RZ
  1538.     JMP    SPDLP
  1539. ;
  1540. SPD1:    PUSH    H
  1541.     LXI    H,357    ;ABOUT 0.02 SEC AT 2 MHZ
  1542.     LDA    XOFFTST
  1543.     ORA    A
  1544.     JZ    SPD2
  1545.     LXI    H,102    ;ADJUST FOR XOFF TESTING
  1546.     LDA    ECHOFLG
  1547.     ORA    A
  1548.     JZ    SPD2
  1549.     LDA    LOCFLG
  1550.     ORA    A
  1551.     JZ    SPD2
  1552.     LXI    H,76    ;ADJUST AGAIN FOR REMOTE ECHO
  1553. SPD2:    CALL    FIXCNT
  1554.     PUSH    H
  1555.     POP    D
  1556.     POP    H
  1557. SPDLP1:    DCX    D    ;INNER LOOP
  1558.     LDA    XOFFTST
  1559.     ORA    A
  1560.     CNZ    TXOFF
  1561.     MOV    A,E
  1562.     ORA    D
  1563.     RZ
  1564.     JMP    SPDLP1
  1565. ;
  1566. TXOFF:    CALL    RCVREADY
  1567.     RNZ
  1568.     CALL    IN$MODDATP
  1569.     ANI    7FH
  1570.     CPI    XOFF
  1571.     CZ    WAITXON
  1572.     RET
  1573. ;
  1574. WAITXON:
  1575.     CALL    RCVREADY
  1576.     JNZ    WTXON2
  1577.     CALL    IN$MODDATP
  1578.     ANI    7FH
  1579.     CPI    XON
  1580.     RZ
  1581. WTXON2:    CALL    STAT    ;TEST TO SEE IF
  1582.     ORA    A    ;CANCELLATION REQUESTED
  1583.     JZ    WAITXON ;SO DON'T GET HUNG UP
  1584.     CALL    KEYIN
  1585.     CPI    CAN
  1586.     RZ
  1587.     JMP    WAITXON
  1588. ;
  1589. ;SEND A CP/M FILE
  1590. ;
  1591. SENDFIL:
  1592.     MVI    A,TRUE    ;ALWAYS FORCE CHECKSUM MODE INITIALLY ON SEND
  1593.     STA    CKSUMFLG
  1594. SENDFIL1:
  1595.     CALL    PARITY    ;SET PARITY IF REQUESTED
  1596.     LDA    BATCHFLG  ;CHECK IF MULTIPLE FILE..
  1597.     ORA    A    ;..MODE IS SET.
  1598.     JNZ    SENDC1
  1599.     MVI    A,TRUE    ;INDICATE SEND FOR BATCH MODE
  1600.     STA    SENDFLG
  1601.     LDA    FSTFLG    ;IF FIRST TIME THRU..
  1602.     ORA    A    ;..SCAN THE COMMAND LINE..
  1603.     CNZ    TNMBUF    ;..FOR MULTIPLE NAMES.
  1604.     CALL    SENDFN    ;SENDS FILE NAME TO RECEIVER
  1605.     JNC    SENDC2    ;CARRY SET MEANS NO MORE FILES.
  1606.     MVI    A,'B'    ;STOP BATCH..
  1607.     STA    BATCHFLG  ;..MODE OPTION.
  1608.     MVI    A,EOT    ;FINAL XFER END
  1609.     CALL    SEND
  1610.     JMP    DONE
  1611. ;
  1612. SENDC1:
  1613.     LDA    FCB+1
  1614.     CPI    ' '
  1615.     JZ    BLKFILE
  1616. SENDC2:
  1617.     CALL    CNREC    ;GET NUMBER OF RECORDS
  1618.     CALL    OPENFIL
  1619.     MVI    E,80
  1620.     CALL    WAITNAK
  1621. SENDLP:
  1622.     CALL    RDSECT
  1623.     JC    SENDEOF
  1624.     CALL    INCRSNO
  1625.     MVI    A,1
  1626.     STA    ERRCT
  1627. SENDRPT:
  1628.     CALL    SENDHDR
  1629.     CALL    SENDSEC
  1630.     LDA    CKSUMFLG
  1631.     ORA    A
  1632.     CZ    SENDCRC
  1633.     CNZ    SENDCKS
  1634.     CALL    GETACK
  1635.     JC    SENDRPT
  1636.     JMP    SENDLP
  1637. ;
  1638. SENDEOF:
  1639.     MVI    A,EOT
  1640.     CALL    SEND
  1641.     CALL    GETACK
  1642.     JC    SENDEOF
  1643.     JMP    DONE
  1644. ;
  1645. ;RECEIVE A FILE
  1646. ;
  1647. RCVFIL:
  1648.     LDA    CKSUMDFLT    ;GET MODE REQUESTED BY OPERATOR
  1649.     STA    CKSUMFLG    ;STORE IT
  1650. RCVFIL1:
  1651.     CALL    PARITY    ;SET PARITY IF REQUESTED
  1652.     LDA    BATCHFLG ;CHECK IF MULT..
  1653.     ORA    A    ;..FILE MODE.
  1654.     JNZ    RCVC1
  1655.     MVI    A,FALSE    ;FLAG WHERE TO RETURN..
  1656.     STA    SENDFLG    ;..FOR NEXT FILE TRANS.
  1657.     CALL    GETFN    ;GET THE FILE NAME.
  1658.     JNC    RCVC2    ;CARRY SET MEANS NO MORE FILES.
  1659.     MVI    A,'B'    ;STOP BATCH..
  1660.     STA    BATCHFLG ;..MODE OPTION.
  1661.     JMP    DONE
  1662. ;
  1663. RCVC1:
  1664.     LDA    FCB+1    ;MAKE SURE FILE IS NAMED
  1665.     CPI    ' '
  1666.     JZ    BLKFILE
  1667. ;
  1668. RCVC2:
  1669.     CALL    CKCPM2
  1670.     CALL    CKBAKUP
  1671. RCVC3:
  1672.     CALL    ERASFIL
  1673.     CALL    MAKEFIL
  1674.     LDA    BATCHFLG
  1675.     ORA    A    ;DON'T PRINT MSG IF..
  1676.     JZ    RCVFST    ;..IN BATCH
  1677.     CALL    ILPRT
  1678.     DB    'File open, ready to receive',CR,LF,0
  1679. RCVFST:
  1680.     LDA    CKSUMFLG
  1681.     ORA    A
  1682.     MVI    A,NAK
  1683.     JNZ    RCVFIL2
  1684.     MVI    A,CRC
  1685. RCVFIL2:
  1686.     CALL    SEND
  1687.     LDA    QFLG
  1688.     ORA    A
  1689.     JZ    RCVLP
  1690.     LDA    CKSUMFLG
  1691.     ORA    A
  1692.     JNZ    RCVNAKM        ;IF IN CRC MODE
  1693.     CALL    ILPRT        ;THEN SAY SO
  1694.     DB    'CRC in effect',CR,LF,0
  1695.     JMP    RCVLP
  1696. RCVNAKM:
  1697.     CALL    ILPRT        ;ELSE SAY CHECKSUM MODE
  1698.     DB    'Checksum in effect',CR,LF,0
  1699. RCVLP:
  1700.     CALL    RCVSECT
  1701.     JC    RCVEOT
  1702.     CALL    WRSECT
  1703.     CALL    INCRSNO
  1704.     CALL    SENDACK
  1705.     JMP    RCVLP
  1706. ;
  1707. RCVEOT:
  1708.     CALL    WRBLOCK
  1709.     CALL    SENDACK
  1710.     CALL    CLOSFIL
  1711.     JMP    DONE
  1712. ;    
  1713. ;SUBROUTINES
  1714. ;
  1715. SENDFN:
  1716.     LDA    QFLG
  1717.     ORA    A
  1718.     JZ    SWNAK
  1719.     CALL    ILPRT
  1720.     DB    'Awaiting name NAK',CR,LF,0
  1721. SWNAK:
  1722.     MVI    E,80
  1723.     CALL    WAITNLP
  1724.     MVI    A,ACK    ;GOT NAK, SEND ACK
  1725.     CALL    SEND
  1726.     LXI    H,FILECT
  1727.     DCR    M
  1728.     JM    NOMRNM
  1729.     LHLD    NBSAVE    ;GET FILE NAME..
  1730.     LXI    D,FCB    ;..IN FCB
  1731.     MVI    B,12
  1732.     CALL    MOVE
  1733.     SHLD    NBSAVE
  1734.     CALL    SENDNM    ;SEND IT
  1735.     ORA    A    ;CLEAR CARRY
  1736.     RET
  1737. ;
  1738. NOMRNM:    MVI A,EOT
  1739.     CALL SEND
  1740.     STC
  1741.     RET
  1742. ;
  1743. SENDNM:    PUSH    H
  1744. SENDNM1:
  1745.     MVI    D,11    ;COUNT CHARS IN NAME
  1746.     MVI    C,0    ;INIT CHECKSUM
  1747.     MOV    A,C
  1748.     STA    FTYCNT    ;INITIATE FILE TYPE COUNT
  1749.     LXI    H,FCB+1    ;ADDRESS NAME
  1750. NAMLPS:    MOV    A,M    ;SEND NAME
  1751.     ANI    7FH    ;STRIP HIGH ORDER BIT SO CP/M 2..
  1752.     CALL    SEND    ;..WON'T SEND R/O FILE DESIGNATION.
  1753.     LDA    QFLG    ;SHOW NAME IF..
  1754.     ORA    A    ;..QFLG NOT SET.
  1755.     MOV    A,M
  1756.     JZ    ACKLP
  1757.     CALL    FTYTST    ;TYPE CHARACTER ETC.
  1758. ACKLP:    PUSH    B    ;SAVE CKSUM
  1759.     MVI    B,1    ;WAIT FOR RECEIVER..
  1760.     CALL    RECV    ;..TO ACKNOWLEDGE..
  1761.     POP    B    ;..GETTING LETTER.
  1762.     JC    SCKSER
  1763.     CPI    ACK
  1764.     JNZ    ACKLP
  1765.     INX    H    ;NEXT CHAR
  1766.     DCR    D
  1767.     JNZ    NAMLPS
  1768.     MVI    A,EOFCHAR ;TELL RECEIVER END OF NAME
  1769.     CALL    SEND
  1770.     LDA    QFLG
  1771.     ORA    A
  1772.     CNZ    CRLF
  1773.     MOV    D,C    ;SAVE CHECKSUM
  1774.     MVI    B,1
  1775.     CALL    RECV    ;GET CHECKSUM..
  1776.     CMP    D    ;..FROM RECEIVER.
  1777.     JZ    NAMEOK
  1778. SCKSER:    MVI    A,BDNMCH ;BAD NAME-TELL RECEIVER
  1779.     CALL    SEND
  1780.     LDA    QFLG
  1781.     ORA    A
  1782.     JZ    SKCSER1
  1783.     CALL    ILPRT
  1784.     DB    'Checksum error',CR,LF,0
  1785. SKCSER1:
  1786.     MVI    E,80    ;DO HANDSHAKING OVER
  1787.     CALL    WAITNLP    ;DON'T PRINT "AWAITING NAK" MSG
  1788.     MVI    A,ACK
  1789.     CALL    SEND
  1790.     JMP    SENDNM1
  1791. ;
  1792. NAMEOK:
  1793.     MVI    A,OKNMCH ;GOOD NAME-TELL RECEIVER
  1794.     CALL    SEND
  1795.     POP    H
  1796.     RET    
  1797. ;
  1798. GETFN:    LXI    H,FCB
  1799.     CALL    INITFCBS+2 ;DOES NOT INITIALIZE DRIVE
  1800.     LDA    QFLG
  1801.     ORA    A
  1802.     JZ    GNAMELP
  1803.     CALL    ILPRT
  1804.     DB    'Awaiting file name',CR,LF,0
  1805. GNAMELP:
  1806.     CALL    HSNAK
  1807.     JC    GNAMELP
  1808.     CALL    GETNM    ;GET THE NAME
  1809.     CPI    EOT    ;IF EOT, THEN NO MORE FILES
  1810.     JZ    NOMRNMG
  1811.     ORA    A    ;CLEAR CARRY
  1812.     RET
  1813. ;
  1814. NOMRNMG:
  1815.     STC
  1816.     RET
  1817. ;
  1818. GETNM:
  1819.     PUSH    H
  1820. GETNM1:
  1821.     MVI    C,0    ;INIT CHECKSUM
  1822.     MOV    A,C
  1823.     STA    FTYCNT    ;INITIATE COUNT FOR FILE TYPE
  1824.     LXI    H,FCB+1
  1825. NAMELPG:
  1826.     MVI    B,5
  1827.     CALL    RECV    ;GET CHAR
  1828.     JNC    GETNM3
  1829.     LDA    QFLG
  1830.     ORA    A
  1831.     JZ    GETNM2
  1832.     CALL    ILPRT
  1833.     DB    'Time out receiving filename',CR,LF,0
  1834. GETNM2:    JMP    GCKSER
  1835. ;
  1836. GETNM3:
  1837.     CPI    EOT    ;IF EOT, THEN NO MORE FILES
  1838.     JZ    GNRET
  1839.     CPI    EOFCHAR    ;GOT END OF NAME
  1840.     JZ    ENDNAME
  1841.     MOV    M,A    ;PUT NAME IN FCB
  1842.     LDA    QFLG    ;CAN TYPE IT IF NO QFLG
  1843.     ORA    A
  1844.     JZ    SKPTYP
  1845.     CALL    FTYTST
  1846. SKPTYP:    PUSH    B    ;SAVE CKSUM
  1847.     MVI    A,ACK    ;ACK GETTING LETTER
  1848.     CALL    SEND
  1849.     POP    B
  1850.     INX    H    ;GET NEXT CHAR
  1851.     MOV    A,L    ;DON'T LET NOISE...
  1852.     CPI    7FH    ;..CAUSE OVERFLOW..
  1853.     JZ    GCKSER    ;..INTO PROGRAM AREA.
  1854.     JMP    NAMELPG
  1855. ;
  1856. FTYTST:
  1857.     LDA    FTYCNT
  1858.     INR    A
  1859.     STA    FTYCNT
  1860.     CPI    9    ;ARE WE AT THE FILE TYPE?
  1861.     JZ    SPCTST    ;GO IF SO
  1862. ENDSPT:    MOV    A,M
  1863.     CPI    ' '    ;TEST FOR SPACE
  1864.     CNZ    TYPE    ;TYPE IF NOT
  1865.     RET
  1866. ;
  1867. SPCTST:    MOV    A,M
  1868.     CPI    ' '    ;TEST FOR SPACE IN FIRST FILE TYPE BYTE
  1869.     RZ        ;DON'T OUTPUT PERIOD IF SPACE
  1870.     MVI    A,'.'    
  1871.     CALL    TYPE
  1872.     JMP    ENDSPT    ;OUTPUT FIRST FILE TYPE BYTE
  1873. ;
  1874. ENDNAME:
  1875.     LDA    QFLG
  1876.     ORA    A
  1877.     CNZ    CRLF
  1878.     MOV    A,C    ;SEND CHECKSUM
  1879.     CALL    SEND
  1880.     MVI    B,1
  1881.     CALL    RECV    ;CHECKSUM GOOD?
  1882.     CPI    OKNMCH    ;YES IF OKNMCH SENT..
  1883.     JZ    GNRET    ;..ELSE DO OVER.
  1884. GCKSER:    LXI    H,FCB    ;CLEAR FCB (EXCEPT DRIVE)..
  1885.     CALL    INITFCBS+2 ;..SINCE IT MIGHT BE DAMAGED..
  1886.     LDA    QFLG    ;..BY TOO MANY CHARS.
  1887.     ORA    A
  1888.     JZ    GCKSER1
  1889.     CALL    ILPRT
  1890.     DB    'Checksum error',CR,LF,0
  1891. GCKSER1:
  1892.     CALL    HSNAK    ;DO HANDSHAKING OVER
  1893.     JC    GCKSER1
  1894.     JMP    GETNM1
  1895. ;
  1896. GNRET:    POP    H
  1897.     RET
  1898. ;
  1899. HSNAK:    MVI    A,NAK    ;SEND NAK UNTIL..
  1900.     CALL    SEND    ;..RECEIVING ACK.
  1901.     CALL    CKABORT    ;DON'T GET HUNG UP HERE
  1902.     MVI    B,2    ;WAIT 2 SECONDS..
  1903.     CALL    RECV    ;..IN RECEIVE.
  1904.     CPI    ACK    ;IF ACK,RETURN WITH..
  1905.     RZ        ;..CARRY CLEAR.
  1906.     STC
  1907.     RET
  1908. ;
  1909. TNMBUF:    MVI    A,FALSE    ;CALL FROM SENDFIL ONLY ONCE.
  1910.     STA    FSTFLG
  1911.     STA    FILECT
  1912.     CALL    SCAN
  1913.     LXI    H,NAMEBUF
  1914.     SHLD    NBSAVE    ;SAVE ADDR OF 1ST NAME
  1915. TNLP1:    CALL    TRTOBUF
  1916.     LXI    H,FCB
  1917.     LXI    D,FCBBUF
  1918.     CALL    CPMLINE    ;PARSE NAME TO CP/M FORMAT
  1919. TNLP2:    CALL    MFNAME    ;SEARCH FOR NAMES (* FORMAT)
  1920.     JC    NEXTNM
  1921.     LDA    FCB+10    ;IF CP/M 2 $SYS FILE..
  1922.     ANI    80H    ;..DON'T SEND
  1923.     JNZ    TNLP2
  1924.     LHLD    NBSAVE    ;GET NAME
  1925.     LXI    D,FCB    ;MOVE IT TO FCB
  1926.     XCHG
  1927.     MVI    B,12
  1928.     CALL    MOVE
  1929.     XCHG
  1930.     SHLD    NBSAVE    ;ADDR OF NEXT NAME
  1931.     LXI    H,FILECT    ;COUNT FILES FOUND
  1932.     INR    M
  1933.     JMP    TNLP2
  1934. ;
  1935. NEXTNM:    LXI    H,NAMECT ;COUNT NAMES FOUND
  1936.     DCR    M
  1937.     JNZ    TNLP1
  1938.     LXI    H,NAMEBUF  ;SAVE START OF BUFFER
  1939.     SHLD    NBSAVE
  1940.     LDA    FILECT
  1941.     CPI    65    ;NO MORE THAN 64 TRANSFERS
  1942.     RC
  1943.     MVI    A,64    ;ONLY X'FER FIRST 64
  1944.     STA    FILECT
  1945.     RET
  1946. ;
  1947. ;SCANS CMDBUF COUNTING NAMES AND PUTTING DELIMITER (SPACE)
  1948. ;AFTER LAST NAME
  1949. ;
  1950. SCAN:    PUSH    H
  1951.     LXI    H,NAMECT
  1952.     MVI    M,0
  1953.     LXI    H,CMDBUF+1  ;FIND END OF CMD LINE..
  1954.     MOV    C,M         ;..AND PUT SPACE THERE.
  1955.     MVI    B,0
  1956.     LXI    H,CMDBUF+2
  1957.     DAD    B
  1958.     MVI    M,20H
  1959.     LXI    H,CMDBUF+1
  1960.     MOV    B,M
  1961.     INR    B
  1962.     INR    B
  1963. SCANLP1:
  1964.     INX    H
  1965.     DCR    B
  1966.     JZ    DNSCAN
  1967.     MOV    A,M
  1968.     CPI    20H
  1969.     JNZ    SCANLP1
  1970. SCANLP2:
  1971.     INX    H    ;EAT EXTRA SPACES
  1972.     DCR    B
  1973.     JZ    DNSCAN
  1974.     MOV    A,M
  1975.     CPI    20H
  1976.     JZ    SCANLP2
  1977.     SHLD    BGNMS    ;SAVE START OF NAMES IN CMDBUF
  1978.     INR    B
  1979.     DCX    H
  1980. SCANLP3:
  1981.     INX    H
  1982.     DCR    B
  1983.     JZ    DNSCAN
  1984.     MOV    A,M
  1985.     CPI    20H
  1986.     JNZ    SCANLP3
  1987.     LDA    NAMECT    ;COUNTS NAMES
  1988.     INR    A
  1989.     STA    NAMECT
  1990. SCANLP4:
  1991.     INX    H    ;EAT SPACES
  1992.     DCR    B
  1993.     JZ    DNSCAN
  1994.     MOV    A,M
  1995.     CPI    20H
  1996.     JZ    SCANLP4
  1997.     JMP    SCANLP3
  1998. ;
  1999. DNSCAN:
  2000.     MVI    M,20H    ;SPACE AFTER LAST CHAR
  2001.     POP    H
  2002.     RET
  2003. ;
  2004. ;PLACES NEXT NAME IN BUFFER SO 'CPMLINE' MAY PARSE IT
  2005. ;
  2006. TRTOBUF:
  2007.     LHLD    BGNMS
  2008.     MVI    B,0
  2009.     LXI    D,FCBBUF+2
  2010. TBLP:
  2011.     MOV    A,M
  2012.     CPI    20H
  2013.     JZ    TRBFEND
  2014.     STAX    D
  2015.     INX    H
  2016.     INX    D
  2017.     INR    B    ;COUNT CHARS IN NAME
  2018.     JMP    TBLP
  2019. ;
  2020. TRBFEND:
  2021.     INX    H
  2022.     MOV    A,M    ;EAT EXTRA SPACES
  2023.     CPI    20H
  2024.     JZ    TRBFEND
  2025.     SHLD    BGNMS
  2026.     LXI    H,FCBBUF+1 ;PUT # CHARS BEFORE NAME
  2027.     MOV    M,B
  2028.     RET
  2029. ;
  2030. ;IN CP/M V.2, IF FILE IS R/O OR SYS, IT IS CHANGED TO 'BAK'.
  2031. ;
  2032. CKCPM2:
  2033.     MVI    C,12
  2034.     CALL    BDOS
  2035.     ORA    A    ;RETURN 0 MEANS CP/M 1
  2036.     RZ
  2037.     MVI    C,STDMA
  2038.     LXI    D,80H
  2039.     CALL    BDOS
  2040.     MVI    C,SRCHF    ;SEARCH FOR FILE
  2041.     LXI    D,FCB
  2042.     CALL    BDOS
  2043.     CPI    0FFH
  2044.     RZ
  2045.     ADD    A
  2046.     ADD    A    ;MULT A-REG BY..
  2047.     ADD    A
  2048.     ADD    A    ;..32 TO FIND..
  2049.     ADD    A    ;..NAME IN DMA.
  2050.     LXI    H,80H
  2051.     ADD    L
  2052.     MOV    L,A    ;HL POINTS TO DIR NAME
  2053.     LXI    D,9
  2054.     DAD    D    ;POINT TO R/O ATTRIB BYTE
  2055.     MOV    A,M
  2056.     ANI    80H    ;TEST MSB
  2057.     JNZ    MKCHG    ;IF SET, MAKE CHANGE
  2058.     INX    H    ;CHECK SYSTEM ATTRIB BYTE
  2059.     MOV    A,M
  2060.     ANI    80H
  2061.     RZ        ;NOT $SYS OR $R/O
  2062.     DCX    H
  2063. MKCHG:    LXI    D,-8
  2064.     DAD    D    ;POINT HL TO FILENAME + 1
  2065.     LXI    D,FCB+1    ;MOVE DIR NAME TO FCB..
  2066.     MVI    B,11    ;..WITHOUT CHANGING DRIVE.
  2067.     CALL    MOVE
  2068.     LXI    H,FCB+9    ;R/O ATTRIB
  2069.     MOV    A,M
  2070.     ANI    7FH    ;STRIP R/O ATTRIB
  2071.     MOV    M,A
  2072.     INX    H    ;SYS ATTRIB
  2073.     MOV    A,M
  2074.     ANI    7FH
  2075.     MOV    M,A
  2076.     LXI    D,FCB
  2077.     MVI    C,30    ;SET NEW ATTRIBS IN DIR
  2078.     CALL    BDOS
  2079. ;
  2080. ;MAY BE CALLED BY CKBAKUP BELOW. ITS RETURN DONE HERE
  2081. ;
  2082. PLANCHG:
  2083.     LXI    H,FCB    ;CHANGE NAME TO TYPE "BAK"
  2084.     LXI    D,6CH
  2085.     MVI    B,9    ;MOVE DRIVE AND NAME (NOT TYPE)
  2086.     CALL    MOVE
  2087.     LXI    H,75H    ;START OF TYPE IN FCB2
  2088.     MVI    M,'B'
  2089.     INX    H
  2090.     MVI    M,'A'
  2091.     INX    H
  2092.     MVI    M,'K'
  2093.     LXI    D,6CH
  2094.     MVI    C,ERASE    ;ERASE ANY PREV BACKUPS
  2095.     CALL    BDOS
  2096.     LXI    H,6CH    ;FCB2 DR FIELD SHOULD..
  2097.     MVI    M,0    ;..0 FOR RENAME.
  2098.     LXI    D,FCB
  2099.     MVI    C,23    ;RENAME
  2100.     JMP    BDOS
  2101. ;
  2102. CKBAKUP:
  2103.     LDA    BAKUPBYTE
  2104.     ORA    A
  2105.     RZ
  2106.     MVI    C,SRCHF
  2107.     LXI    D,FCB
  2108.     CALL    BDOS
  2109.     INR    A
  2110.     RZ    ;FILE NOT FOUND
  2111.     JMP    PLANCHG    ;IN "CKCPM2" - RET DONE THERE
  2112. ;
  2113. ;MULTI-FILE ACCESS SUBROUTINE FROM CP/M USER'S GROUP
  2114. ;FIXED BY MARK ZEIGER 8/17/80
  2115. ;CARRY IS SET IF NO MORE NAMES CAN BE FOUND
  2116. ;
  2117. MFNAME:
  2118.     MFACCESS    ;A MACRO IN MACROS.LIB
  2119. ;
  2120. RCVSECT:
  2121.     MVI    A,1
  2122.     STA    ERRCT
  2123. RCVRPT:
  2124.     XRA    A    ;ZERO ACCUM
  2125.     STA    ERRCDE    ;CLEAR RECEIVE ERROR CODE
  2126.     LDA    QFLG
  2127.     ORA    A
  2128.     JZ    RCVSQ
  2129.     CALL    ILPRT
  2130.     DB    CR,'Awaiting # ',0
  2131.     PUSH    H    ;SAVE IT
  2132.     LHLD    SECTNO    ;GET SECTOR NUMBER
  2133.     INX    H    ;BUMP IT
  2134.     CALL    DECOUT    ;PRINT SECTOR NUMBER IN DECIMAL
  2135.     CALL    ILPRT
  2136.     DB    ' (', 0
  2137.     CALL    DHXOUT    ;16 BIT HEX CONVERSION & OUTPUT
  2138.     CALL    ILPRT
  2139.     DB    'H)',0
  2140.     MOV    A,L    ;ONLY LOW BYTE USED BY PROGRAM
  2141.     POP    H    ;RESTORE IT
  2142. ;
  2143. RCVSQ:            ;WAIT FOR SOH OR EOT
  2144.     MVI    B,10    ;10 SECONDS
  2145.     CALL    RECV
  2146.     JC    RCVSTOT
  2147.     CALL    RCVERR    ;CHECK FOR ERRORS
  2148.     JC    RCVDERR    ;JUMP IF THERE WAS AN ERROR
  2149.     CPI    SOH
  2150.     JZ    RCVSOH
  2151.     ORA    A
  2152.     JZ    RCVSQ
  2153.     CPI    EOT
  2154.     STC
  2155.     RZ
  2156.     MOV    B,A
  2157.     LDA    QFLG
  2158.     ORA    A
  2159.     JZ    RCVSERR
  2160. RCVSEH:
  2161.     MOV    A,B
  2162.     CALL    CRLF
  2163.     CALL    HEXO
  2164.     CALL    ILPRT
  2165.     DB    'H recv''d, not SOH',CR,LF,0
  2166. RCVSERR:
  2167.     MVI    B,1    ;WAIT FOR 1 SEC..
  2168.     CALL    RECV    ;..WITH NO CHARS
  2169.     JNC    RCVSERR ;LOOP UNTIL SENDER DONE
  2170.     LDA    CKSUMFLG    ;GET CHECKSUM FLAG
  2171.     ORA    A    ;CRC IN EFFECT?
  2172.     MVI    A,NAK    ;PUT NAK IN ACCUM
  2173.     JNZ    RCVSER2    ;NO, SEND THE NAK
  2174.     LDA    FIRSTME ;GET FIRST TIME SWITCH
  2175.     ORA    A    ;HAS FIRST SOH BEEN RECEIVED?
  2176.     MVI    A,NAK    ;PUT NAK IN ACCUM
  2177.     JZ    RCVSER2    ;YES, THEN SEND NAK
  2178.     MVI    A,CRC    ;TELL SENDER CRC IS IN EFFECT
  2179. RCVSER2:
  2180.     CALL    SEND    ;..THE NAK or CRC request
  2181.     LDA    ERRCT    ;ABORT IF..
  2182.     INR    A    ;..WE HAVE REACHED..
  2183.     STA    ERRCT    ;..THE ERROR..
  2184.     CPI    ERRLIM    ;..LIMIT?
  2185.     JC    RCVRPT    ;..NO, TRY AGAIN
  2186.     LDA    QFLG
  2187.     ORA    A
  2188.     JZ    RCVSABT
  2189. RCVCKQ:    CALL    CKQUIT
  2190.     JZ    RCVSECT
  2191. RCVSABT:
  2192.     CALL    CLOSFIL
  2193.     CALL    ERXIT
  2194.     DB    CR,LF,'++ Unable to receive block - Aborting ++',CR,LF,'$'
  2195. ;
  2196. RCVSTOT:
  2197.     LDA    QFLG
  2198.     ORA    A
  2199.     JZ    RCVSCRC
  2200. RCVSPT:    CALL    ILPRT
  2201.     DB    CR,LF,'++ Timeout ++ ',0
  2202. RCVPRN:    LDA    ERRCT
  2203.     PUSH    H
  2204.     MVI    H,0
  2205.     MOV    L,A
  2206.     CALL    DECOUT
  2207.     POP    H
  2208.     CALL    CRLF
  2209. RCVSCRC:
  2210.     CALL    RCVSCRC2
  2211.     JMP    RCVSERR
  2212. ;
  2213. ;ROUTINE WILL SWITCH FROM CRC TO CHECKSUM IF ERCNT REACHES ERRCRC
  2214. ;AND FIRSTME IS TRUE
  2215. ;
  2216. RCVSCRC2:
  2217.     LDA    ERRCT
  2218.     CPI    ERRCRC
  2219.     RNZ
  2220.     LDA    FIRSTME
  2221.     ORA    A
  2222.     RZ
  2223.     LDA    CKSUMFLG
  2224.     ORA    A
  2225.     RNZ
  2226.     CMA
  2227.     STA    CKSUMFLG
  2228.     STA    CKSUMDFLT
  2229.     LDA    QFLG
  2230.     ORA    A
  2231.     RZ
  2232.     CALL    ILPRT
  2233.     DB    '++ Switching to Checksum mode ++',CR,LF
  2234.     DB    '++ Sender may not be CRC capable ++',CR,LF,BELL,0
  2235.     RET
  2236. ;
  2237. ;---->    RCVERR:
  2238. ;
  2239. ;    Checks for framing, overrun, and parity errors. Parity errors
  2240. ;    cannot be detected unless the parity option has been selected.
  2241. ;    1.Error code (ERRCDE) was set in RECV routine.
  2242. ;    2.ERRCDE=0 for no errors, ERRCDE<>0 for errors.
  2243. ;    3.If there is an error, routine returns with carry flag set.
  2244. ;
  2245. RCVERR:    PUSH    PSW    ;SAVE CHAR TRANSMITTED
  2246.     LDA    ERRCDE    ;GET RECEIVE ERROR CODE
  2247.     ANA    A    ;IS IT ZERO?
  2248.     JZ    RCVERR2    ;YES, NO RECEIVE ERROR
  2249.     POP    PSW    ;RESTORE CHAR TRANSMITTED
  2250.     STC        ;SET CARRY ON TO INDICATE AN ERROR
  2251.     RET
  2252. RCVERR2:
  2253.     POP    PSW    ;RESTORE CHAR TRANSMITTED
  2254.     RET
  2255. ;
  2256. ;---->    RCVDERR: Checks for a receive error and displays appropriate
  2257. ;                error message.  Then goes to RCVSERR to purge the line
  2258. ;                and send a NAK.
  2259. ;
  2260. RCVDERR:
  2261.     LDA    QFLG    ;QUIET...
  2262.     ORA    A    ;...MODE?
  2263.     JZ    RCVSERR    ;YES, NO MSG
  2264. RCVDERRP:
  2265.     CALL ILPRT
  2266.     DB    CR,LF,0
  2267.     LDA    ERRCDE    ;GET RECEIVE ERR CODE
  2268.     ANI    FRMER    ;WAS THERE A FRAMING ERROR?
  2269.     JZ    RCVDERR2 ;NO, GO CHECK FOR OVERRUN
  2270.     CALL    ILPRT
  2271.     DB    '++ Framing error ++ ',0
  2272.     CALL    RCVDERR5 ;PRINT # OF ERROR
  2273.  
  2274. RCVDERR2:
  2275.     LDA    ERRCDE    ;GET RECEIVE ERR CODE
  2276.     ANI    ORUNER    ;WAS THERE AN OVERRUN
  2277.     JZ    RCVDERR3 ;NO, GO CHECK FOR PARITY ERROR
  2278.     CALL    ILPRT
  2279.     DB    '++ Overrun error ++ ',0
  2280.     CALL    RCVDERR5
  2281. RCVDERR3:
  2282.     LDA    ERRCDE    ;GET RECEIVE ERR CODE
  2283.     ANI    PARER    ;WAS THERE A PARITY ERROR?
  2284.     JZ    RCVDERR4 ;NO, GO PURGE LINE
  2285.     CALL    ILPRT
  2286.     DB    '++ Parity error ++ ',0
  2287.     CALL    RCVDERR5
  2288. RCVDERR4:
  2289.     JMP    RCVSERR    ;GO PURGE LINE, SEND NAK
  2290. ;
  2291. ;Display the number of the error, do a carriage return and line feed.
  2292. ;
  2293. RCVDERR5:
  2294.     LDA    ERRCT    ;GET ERROR NUMBER
  2295.     PUSH    H
  2296.     MVI    H,0
  2297.     MOV    L,A
  2298.     CALL    DECOUT    ;DISPLAY IT
  2299.     POP    H
  2300.     JMP    CRLF    ;DO CR, LF
  2301. ;
  2302. ;Got SOH - get block #, block # complemented
  2303. ;
  2304. RCVSOH:    XRA    A    ;ZERO ACCUM
  2305.     STA    FIRSTME ;INDICATE FIRST SOH RECV'D
  2306.     MVI    B,1    ;TIMEOUT = 1 SEC
  2307.     CALL    RECV    ;GET SECTOR
  2308.     JC    RCVSTOT ;GOT TIMEOUT
  2309.     CALL    RCVERR    ;CHECK FOR RECEIVE ERROR
  2310.     JC    RCVDERR
  2311.     MOV    D,A
  2312.     MVI    B,1
  2313.     CALL    RECV
  2314.     JC    RCVSTOT
  2315.     CALL    RCVERR    ;CHECK FOR RECEIVE ERROR
  2316.     JC    RCVDERR
  2317.     CMA
  2318.     CMP    D
  2319.     JZ    RCVDATA
  2320.     LDA    QFLG
  2321.     ORA    A
  2322.     JZ    RCVSERR
  2323. RCVBSE:
  2324.     CALL    ILPRT
  2325.     DB    CR,LF,'++  Bad sector # in Hdr',CR,LF,0
  2326.     JMP    RCVSERR
  2327. ;
  2328. RCVDATA:
  2329.     MOV    A,D
  2330.     STA    RCVSNO
  2331.     MVI    A,1
  2332.     STA    DATAFLG
  2333.     MVI    C,0
  2334.     CALL    CLRCRC    ;CLEAR CRC COUNTER
  2335.     LXI    H,80H
  2336. RCVCHR:
  2337.     MVI    B,1
  2338.     CALL    RECV
  2339.     JC    RCVSTOT
  2340.     CALL    RCVERR    ;CHECK FOR RECEIVE ERROR
  2341.     JC    RCVDERR
  2342.     MOV    M,A
  2343.     INR    L
  2344.     JNZ    RCVCHR
  2345.     LDA    CKSUMFLG
  2346.     ORA    A
  2347.     JZ    RCVCRC
  2348.     MOV    D,C
  2349.     XRA    A
  2350.     STA    DATAFLG
  2351.     MVI    B,1
  2352.     CALL    RECV
  2353.     JC    RCVSTOT
  2354.     CALL    RCVERR    ;CHECK FOR RECEIVE ERROR
  2355.     JC    RCVDERR
  2356.     CMP    D
  2357.     JNZ    RCVCERR
  2358. CHKSNUM:
  2359.     LDA    RCVSNO
  2360.     MOV    B,A
  2361.     LDA    SECTNO
  2362.     CMP    B
  2363.     JZ    RECVACK
  2364.     INR    A
  2365.     CMP    B
  2366.     JNZ    ABORT
  2367.     RET
  2368. ;
  2369. RCVCRC:
  2370.     MVI    E,2    ;NUMBER OF CRC BYTES
  2371. RCVCRC2:
  2372.     MVI    B,1
  2373.     CALL    RECV
  2374.     JC    RCVSTOT
  2375.     CALL    RCVERR
  2376.     JC    RCVDERR
  2377.     DCR    E
  2378.     JNZ    RCVCRC2
  2379.     CALL    CHKCRC
  2380.     ORA    A
  2381.     JZ    CHKSNUM
  2382.     LDA    QFLG
  2383.     ORA    A
  2384.     JZ    RCVSERR
  2385. RCVCRER:
  2386.     CALL    ILPRT
  2387.     DB    CR,LF,'++ CRC error ++',0
  2388.     JMP    RCVPRN
  2389. ;
  2390. RCVCERR:
  2391.     LDA    QFLG
  2392.     ORA    A
  2393.     JZ    RCVSERR
  2394. RCVCPR:
  2395.     CALL    ILPRT
  2396.     DB    CR,LF,'++ Checksum error ++ ',0
  2397.     JMP    RCVPRN
  2398. ;
  2399. RECVACK:
  2400.     CALL    SENDACK
  2401.     JMP    RCVSECT
  2402. ;
  2403. SENDACK:
  2404.     MVI    A,ACK
  2405.     JMP    SEND
  2406. ;
  2407. SENDHDR:
  2408.     LDA    QFLG
  2409.     ORA    A
  2410.     JZ    SENDHNM
  2411.     CALL    ILPRT
  2412.     DB    CR,'Sending # ',0
  2413.     PUSH    H
  2414.     LHLD    SECTNO    ;GET SECTOR NUMBER
  2415.     CALL    DECOUT    ;PRINT IT IN DECIMAL
  2416.     CALL    ILPRT
  2417.     DB    ' (',0
  2418.     CALL    DHXOUT    ;16 BIT HEX CONVERSION & OUTPUT
  2419.     CALL    ILPRT
  2420.     DB    'H)',0
  2421.     POP    H
  2422. SENDHNM:
  2423.     MVI    A,SOH
  2424.     CALL    SEND
  2425.     LDA    SECTNO
  2426.     CALL    SEND
  2427.     LDA    SECTNO
  2428.     CMA
  2429.     JMP    SEND
  2430. ;
  2431. SENDSEC:
  2432.     MVI    A,1
  2433.     STA    DATAFLG
  2434.     MVI    C,0
  2435.     CALL    CLRCRC
  2436.     LXI    H,80H
  2437. SENDC:
  2438.     MOV    A,M
  2439.     CALL    SEND
  2440.     INR    L
  2441.     JNZ    SENDC
  2442.     XRA    A
  2443.     STA    DATAFLG
  2444.     RET
  2445. ;
  2446. SENDCKS:
  2447.     MOV    A,C
  2448.     JMP    SEND
  2449. ;
  2450. SENDCRC:
  2451.     CALL    FINCRC
  2452.     MOV    A,D
  2453.     CALL    SEND
  2454.     MOV    A,E
  2455.     CALL    SEND
  2456.     XRA    A
  2457.     RET
  2458. ;
  2459. GETACK:    MVI    B,10        ;10 SECONDS
  2460.     CALL    RECVDG
  2461.     JC    GETATOT
  2462.     CPI    ACK
  2463.     RZ
  2464.     MOV    B,A
  2465.     LDA    QFLG
  2466.     ORA    A
  2467.     JZ    ACKERR
  2468.     MOV    A,B
  2469.     CALL    CRLF
  2470.     CALL    HEXO
  2471.     CALL    ILPRT
  2472.     DB    'H Recv''d, not ACK',CR,LF,0
  2473. ACKERR:    LDA    ERRCT
  2474.     INR    A
  2475.     STA    ERRCT
  2476.     DCR    A
  2477.     CPI    ERRLIM
  2478.     RC
  2479.     LDA    QFLG
  2480.     ORA    A
  2481.     JZ    CSABORT
  2482. GACKV:    CALL    CKQUIT
  2483.     STC
  2484.     RZ
  2485. CSABORT:
  2486.     CALL    ERXIT
  2487.     DB    CR,LF,'Can''t send sector -- Aborting',CR,LF,'$'
  2488. GETATOT:
  2489.     LDA    QFLG
  2490.     ORA    A
  2491.     JZ    ACKERR
  2492.     CALL    ILPRT
  2493.     DB    CR,LF,'Timeout on ACK',CR,LF,0
  2494.     JMP ACKERR
  2495. ;
  2496. CKABORT:
  2497.     LDA    QFLG
  2498.     ORA    A
  2499.     RZ    
  2500. CKABGO:
  2501.     CALL    STAT
  2502.     RZ
  2503.     CALL    KEYIN
  2504.     CPI    CAN
  2505.     RNZ
  2506. ABORT:
  2507.     LXI    SP,STACK
  2508. ABORTL:
  2509.     MVI    B,1
  2510.     CALL    RECV
  2511.     JNC    ABORTL
  2512.     MVI    A,CAN
  2513.     CALL    SEND
  2514. ABORTW:
  2515.     MVI    B,1
  2516.     CALL    RECV
  2517.     JNC    ABORTW
  2518.     MVI    A,' '
  2519.     CALL    SEND
  2520.     CALL    ILPRT
  2521.     DB    CR,LF,'Routine cancelled',CR,LF,BELL,0
  2522.     MVI    A,'B'     ;TURN MULTI-FILE MODE..
  2523.     STA    BATCHFLG  ;..OFF SO ROUTINE ENDS.
  2524.     JMP    DONETCE
  2525. ;
  2526. INCRSNO:
  2527.     PUSH    H
  2528.     LHLD    SECTNO    ;GET SECTOR NUMBER
  2529.     INX    H    ;BUMP IT
  2530.     SHLD    SECTNO    ;STORE IT
  2531.     MOV    A,L
  2532.     POP    H
  2533.     RET
  2534. ;
  2535. ERASFIL:
  2536.     LDA    BATCHFLG ;DON'T ASK FOR ERASE..
  2537.     ORA    A    ;..IN MULTI-FILE MODE,..
  2538.     JZ    NOASK    ;..JUST DO IT.
  2539.     LXI    D,FCB
  2540.     MVI    C,SRCHF
  2541.     CALL    BDOS
  2542.     INR    A
  2543.     RZ
  2544.     CALL    ILPRT
  2545.     DB    'File exists -- Type ''Y'' to erase: ',BELL,0
  2546.     CALL    KEYIN
  2547.     PUSH    PSW
  2548.     CALL    TYPE
  2549.     POP    PSW
  2550.     CALL    UCASE
  2551.     CPI    'Y'
  2552.     JNZ    MENU
  2553.     CALL    CRLF
  2554. NOASK:    LXI    D,FCB
  2555.     MVI    C,ERASE
  2556.     JMP    BDOS
  2557. ;
  2558. BLKFILE:
  2559.     CALL    ILPRT    ;ROUTINE IF NO FILE IS NAMED FOR "SEND" OR "RECEIVE"
  2560.     DB    CR,LF,'No file specified',CR,LF,BELL,0
  2561.     JMP    MENU
  2562.  
  2563. MAKEFIL:
  2564.     LXI    D,FCB
  2565.     MVI    C,MAKE
  2566.     CALL    BDOS
  2567.     INR    A
  2568.     RNZ
  2569.     CALL    ERXIT
  2570.     DB    'Error - Can''t make file',CR,LF
  2571.     DB    'Directory is likely full',CR,LF,'$'
  2572. ;
  2573.     IF    CPM2X
  2574. ;
  2575. CNREC:    MVI    C,FILSIZ ;COMPUTE FILE SIZE FUNCTION IN CP/M 2.x
  2576.     LXI    D,FCB    ;POINT TO FILE CONTROL BLOCK
  2577.     CALL    BDOS
  2578.     LHLD    FCB+33    ;GET RECORD COUNT
  2579.     SHLD    RCNT    ;STORE IT
  2580.     LXI    H,0    ;ZERO HL
  2581.     SHLD    FCB+33    ;RESET RANDOM RECORD IN FCB
  2582.     RET
  2583. ;
  2584.     ENDIF    ;CPM2X
  2585. ;
  2586.     IF    NOT CPM2X
  2587. ;
  2588. CNREC:    MVI    A,'?'    ;MATCH ALL EXTENTS
  2589.     STA    FCBEXT
  2590.     MVI    A,0FFH
  2591.     STA    MAXEXT    ;INIT MAX EXT NO.
  2592.     MVI    C,SRCHF    ;GET 'SEARCH FIRST' FNC
  2593.     LXI    D,FCB
  2594.     CALL    BDOS    ;READ FIRST
  2595.     INR    A    ;WERE THERE ANY?
  2596.     JNZ    SOME    ;GOT SOME
  2597.     CALL    ERXIT
  2598.     DB    '++ File not found ++$'
  2599. ;
  2600. ;READ MORE DIRECTORY ENTRIES
  2601. ;
  2602. MOREDIR:
  2603.     MVI    C,SRCHN    ;SEARCH NEXT
  2604.     LXI    D,FCB
  2605.     CALL    BDOS    ;READ DIR ENTRY
  2606.     INR    A    ;CHECK FOR END (0FFH)
  2607.     JNZ    SOME    ;NOT END OF DIR...PROCESS EXTENT
  2608.     LDA    MAXEXT    ;HIT END...GET HIGHEST EXTENT NO. SEEN
  2609.     MOV    L,A    ;WHICH GIVES EXTENT COUNT -1
  2610.     MVI    H,0
  2611.     MOV    D,H
  2612.     LDA    RCNT    ;GET RECORD COUNT OF MAX EXTENT SEEN
  2613.     MOV    E,A    ;SAVE IT IN DE
  2614.     DAD    H
  2615.     DAD    H    ;MULTIPLY # OF EXTENTS -1
  2616.     DAD    H    ; TIMES 128
  2617.     DAD    H
  2618.     DAD    H
  2619.     DAD    H
  2620.     DAD    H
  2621.     DAD    D    ;ADD IN SIZE OF LAST EXTENT
  2622.     SHLD    RCNT    ;SAVE TOTAL RECORD COUNT
  2623.     RET        ;AND EXIT
  2624. ;
  2625. ;POINT TO DIRECTORY ENTRY
  2626. ;
  2627. SOME:    DCR    A    ;UNDO PREV 'INR A'
  2628.     ANI    3    ;MAKE MODULUS 4
  2629.     ADD    A    ;MULTIPLY...
  2630.     ADD    A    ;..BY 32 BECAUSE
  2631.     ADD    A    ;..EACH DIRECTORY
  2632.     ADD    A    ;..ENTRY IS 32
  2633.     ADD    A    ;..BYTES LONG
  2634.     LXI    H,80H    POINT TO BUFFER
  2635.     ADD    L    ;POINT TO ENTRY
  2636.     ADI    15    ;OFFSET TO RECORD COUNT
  2637.     MOV    L,A    ;HL NOW POINTS TO REC COUNT
  2638.     MOV    B,M    ;GET RECORD COUNT
  2639.     DCX    H
  2640.     DCX    H    ;BACK DOWN TO EXTENT NUMBER
  2641.     DCX    H
  2642.     LDA    MAXEXT    ;COMPARE WITH CURRENT MAX.
  2643.     ORA    A    ;IF NO MAX YET
  2644.     JM    BIGGER    ;THEN SAVE RECORD COUNT ANYWAY
  2645.     CMP    M
  2646.     JNC    MOREDIR
  2647. BIGGER:    MOV    A,B    ;SAVE NEW RECORD COUNT
  2648.     STA    RCNT
  2649.     MOV    A,M    ;SAVE NEW MAX. EXTENT NO.
  2650.     STA    MAXEXT
  2651.     JMP    MOREDIR    ;GO FIND MORE EXTENTS
  2652. ;
  2653.     ENDIF    ;NOT CPM2X
  2654. ;
  2655. OPENFIL:
  2656.     XRA    A
  2657.     STA    FCBEXT
  2658.     LXI    D,FCB
  2659.     MVI    C,OPEN
  2660.     CALL    BDOS
  2661.     INR    A
  2662.     JNZ    OPENOK
  2663.     CALL    ERXIT
  2664.     DB    'Can''t open file$'
  2665. OPENOK:
  2666.     LDA    BATCHFLG
  2667.     ORA    A        ;ONLY IF SINGLE FILE...
  2668.     RZ
  2669.     JMP    SENDTIM        ;A LIB MACRO SHOWS TIME TO SEND    
  2670. ;
  2671. CLOSFIL:
  2672.     LXI    D,FCB
  2673.     MVI    C,CLOSE
  2674.     CALL    BDOS
  2675.     INR    A
  2676.     RNZ
  2677.     CALL    ERXIT
  2678.     DB    'Can''t close file$'
  2679. RDSECT:
  2680.     LDA    SECINBF
  2681.     DCR    A
  2682.     STA    SECINBF
  2683.     JM    RDBLOCK
  2684.     LHLD    SECPTR
  2685.     LXI    D,80H
  2686.     CALL    MOVE128
  2687.     SHLD    SECPTR
  2688.     RET
  2689. ;
  2690. RDBLOCK:
  2691.     LDA    EOFLG
  2692.     CPI    1
  2693.     STC
  2694.     RZ
  2695.     MVI    C,0
  2696.     LXI    D,DBUF
  2697. RDSECLP:
  2698.     PUSH    B
  2699.     PUSH    D
  2700.     MVI    C,STDMA
  2701.     CALL    BDOS
  2702.     LXI    D,FCB
  2703.     MVI    C,READ
  2704.     CALL    BDOS
  2705.     POP    D
  2706.     POP    B
  2707.     ORA    A
  2708.     JZ    RDSECOK
  2709.     DCR    A
  2710.     JZ    REOF
  2711.     CALL    ERXIT
  2712.     DB    '++ File read error ++$'
  2713. RDSECOK:
  2714.     LXI    H,80H
  2715.     DAD    D
  2716.     XCHG
  2717.     INR    C
  2718.     MOV    A,C
  2719.     CPI    DBUFSIZ*8 ;BUFFER SIZE IN 128 BYTE SECTORS
  2720.     JZ    RDBFULL
  2721.     JMP    RDSECLP
  2722. ;
  2723. REOF:    MVI    A,1
  2724.     STA    EOFLG
  2725.     MOV    A,C
  2726. RDBFULL:
  2727.     STA    SECINBF
  2728.     LXI    H,DBUF
  2729.     SHLD    SECPTR
  2730.     LXI    D,80H
  2731.     MVI    C,STDMA
  2732.     CALL    BDOS
  2733.     JMP    RDSECT
  2734. ;
  2735. WRSECT:
  2736.     LHLD    SECPTR
  2737.     XCHG
  2738.     LXI    H,80H
  2739.     CALL    MOVE128
  2740.     XCHG
  2741.     SHLD    SECPTR
  2742.     LDA    SECINBF
  2743.     INR    A
  2744.     STA    SECINBF
  2745.     CPI    DBUFSIZ*8 ;BUFFER SIZE IN 128 BYTE SECTORS
  2746.     RNZ
  2747. WRBLOCK:
  2748.     LDA    SECINBF
  2749.     ORA    A
  2750.     RZ
  2751.     MOV    C,A
  2752.     LXI    D,DBUF
  2753. DKWRLP:
  2754.     PUSH    H
  2755.     PUSH    D
  2756.     PUSH    B
  2757.     MVI    C,STDMA
  2758.     CALL    BDOS
  2759.     LXI    D,FCB
  2760.     MVI    C,WRITE
  2761.     CALL    BDOS
  2762.     POP    B
  2763.     POP    D
  2764.     POP    H
  2765.     ORA    A
  2766.     JNZ    WRERR
  2767.     LXI    H,80H
  2768.     DAD    D
  2769.     XCHG
  2770.     DCR    C
  2771.     JNZ    DKWRLP
  2772.     XRA    A
  2773.     STA    SECINBF
  2774.     LXI    H,DBUF
  2775.     SHLD    SECPTR
  2776.     RET
  2777. ;
  2778. WRERR:    MVI    C,CAN
  2779.     CALL    SEND
  2780.     CALL    ERXIT
  2781.     DB    CR,LF,'Error writing file',CR,LF,'$'
  2782. ;
  2783. ;---->    RECV: Receive a character
  2784. ;
  2785. ;Timeout time is in B, in seconds. Entry via 'RECVDG' deletes garbage
  2786. ;characters on the line. For example, having just sent a sector, calling
  2787. ;RECVDG will delete any line noise induced characters LONG before the
  2788. ;ACK/NAK would be received.
  2789. ;
  2790. RECVDG:    EQU $
  2791.     CALL    IN$MODDATP
  2792.     CALL    IN$MODDATP
  2793. RECV:    PUSH    D
  2794. MSEC:    PUSH    H
  2795.     LXI    H,7500
  2796.     CALL    FIXCNT
  2797.     PUSH    H
  2798.     POP    D
  2799.     POP    H
  2800.     CALL    CKABORT
  2801. MWTI:
  2802.     CALL    RCVREADY
  2803.     JZ    MCHAR
  2804.     DCR    E
  2805.     JNZ    MWTI
  2806.     DCR    D
  2807.     JNZ    MWTI
  2808.     DCR    B
  2809.     JNZ    MSEC
  2810.     POP    D
  2811.     STC
  2812.     RET
  2813. ;
  2814. MCHAR:
  2815.     LDA    PMMIBYTE    ;IS THE MODEM A PMMI?
  2816.     ORA    A           ;SET FLAGS
  2817.     JZ    MCHAR1      ;YES, JUMP
  2818.     CALL    IN$MODCTLP  ;GET ERROR-STATUS BYTE
  2819.     ANI    ERRCDMSK    ;MASK OUT ALL EXCEPT ERROR BITS (3-5)
  2820.     STA    ERRCDE      ;SAVE THE ERROR CODE
  2821. MCHAR1:
  2822.     CALL    IN$MODDATP
  2823.     POP    D
  2824.     PUSH    PSW
  2825.     CALL    UPDCRC      ;CALCULATE CRC
  2826.     ADD    C    
  2827.     MOV    C,A
  2828.     LDA    RSEEFLG
  2829.     ORA    A
  2830.     JZ    MONIN
  2831.     LDA    VSEEFLG
  2832.     ORA    A
  2833.     JNZ    NOMONIN
  2834.     LDA    DATAFLG
  2835.     ORA    A
  2836.     JZ    NOMONIN
  2837. MONIN:    POP    PSW
  2838.     PUSH    PSW
  2839.     CALL    SHOW
  2840. NOMONIN:
  2841.     POP    PSW
  2842.     ORA    A
  2843.     RET
  2844. ;
  2845. SEND:    PUSH    PSW
  2846.     LDA    SSEEFLG
  2847.     ORA    A
  2848.     JZ    MONOUT
  2849.     LDA    VSEEFLG
  2850.     ORA    A
  2851.     JNZ    NOMONOT
  2852.     LDA    DATAFLG
  2853.     ORA    A
  2854.     JZ    NOMONOT
  2855. MONOUT:    POP    PSW
  2856.     PUSH    PSW
  2857.     CALL    SHOW
  2858. NOMONOT:
  2859.     POP    PSW
  2860.     PUSH    PSW
  2861.     CALL    UPDCRC    ;CALCULATE CRC
  2862.     ADD    C
  2863.     MOV    C,A
  2864. SENDW:    CALL    SENDREADY
  2865.     JNZ    SENDW
  2866.     POP    PSW
  2867.     JMP    OUT$MODDATP
  2868. ;
  2869. WAITNAK:
  2870.     LDA    QFLG
  2871.     ORA    A
  2872.     JZ    WAITNLP
  2873.     CALL    ILPRT
  2874.     DB    'Awaiting initial NAK',CR,LF,0
  2875. WAITNLP:
  2876.     CALL    CKABORT
  2877.     MVI    B,1
  2878.     CALL    RECV
  2879.     CPI    NAK
  2880.     RZ
  2881.     CPI    CRC    ;CRC REQUEST?
  2882.     JZ    WAITCRC    ;YES, GO SET CRC FLAG
  2883.     CPI    CAN    ;CANCEL?
  2884.     JZ    ABORT
  2885.     DCR    E
  2886.     JZ    ABORT
  2887.     JMP    WAITNLP
  2888. ;
  2889. WAITCRC:
  2890.     LDA    QFLG
  2891.     ORA    A
  2892.     JZ    WAITCRC1
  2893.     CALL    ILPRT
  2894.     DB    'CRC request received',CR,LF,0
  2895. WAITCRC1:
  2896.     XRA    A
  2897.     STA    CKSUMFLG
  2898.     RET
  2899. ;
  2900. ;--->PARITY: Routine to setup PMMI for odd/even parity.
  2901. ;
  2902. PARITY:
  2903.     LDA    PMMIBYTE ;IS MODEM A PMMI?
  2904.     ORA    A    ;SET FLAGS
  2905.     RZ        ;NO, RETURN
  2906.     LDA    OPARITY    ;GET ODD PARITY REQUEST BYTE
  2907.     ORA    A    ;SET FLAGS
  2908.     JNZ    EVENPAR    ;IF NOT ODD SEE IF IT IS EVEN
  2909.     LDA    UARTCTLB ;GET UART/MODEM CONTROL BYTE
  2910.     ANI    ODPARMSK
  2911.     JMP    PARITY1
  2912. ;
  2913. EVENPAR:
  2914.     LDA    EPARITY   ;GET EVEN PARITY REQUEST BYTE
  2915.     ORA    A         ;SET FLAGS
  2916.     RNZ               ;IF EVEN PARITY NOT SPECIFIED RETURN
  2917.     LDA    UARTCTLB  ;GET UART/MODEM CONTROL BYTE
  2918.     ANI    ODPARMSK  ;SET FOR PARITY
  2919.     ORI    EVPARMSK  ;NOW SET FOR EVEN PARITY
  2920. PARITY1:
  2921.     JMP    OUT$MODCTLP  ;SEND TO PMMI -
  2922.                  ;WHEN OUT$MODCTLP DOES RET IT
  2923.                  ;WILL GO BACK TO CALLING ROUTINE
  2924. ;
  2925. NOPARIT:
  2926.     LDA    PMMIBYTE
  2927.     ORA    A
  2928.     RZ
  2929.     LDA    UARTCTLB     ;GET UART/MODEM CONTROL BYTE
  2930.     ORI    NOPARMSK     ;RESET PARITY BIT ON PMMI
  2931.     JMP    OUT$MODCTLP
  2932. ;
  2933. INITADR:
  2934.     LHLD    1
  2935.     LXI    D,3
  2936.     DAD    D
  2937.     SHLD    VSTAT+1
  2938.     DAD    D
  2939.     SHLD    VKEYIN+1
  2940.     DAD    D
  2941.     SHLD    VTYPE+1
  2942.     DAD    D
  2943.     SHLD    VLIST+1
  2944.     LXI    D,30
  2945.     DAD    D
  2946.     SHLD    VLSTAT+1
  2947.     LDA    PMMIBYTE
  2948.     ORA    A
  2949.     RZ            ;RETURN DONE FROM THIS ROUTINE..
  2950.     LDA    IN$MODCTLP+1    ;..IF NOT PMMI
  2951.     STA    OUT$MODCTLP+1
  2952.     INR    A
  2953.     STA    OUT$MODDATP+1
  2954.     STA    IN$MODDATP+1
  2955.     INR    A
  2956.     STA    IN$BAUDRP+1
  2957.     STA    OUT$BAUDRP+1
  2958.     INR    A
  2959.     STA    OUT$MODCTL2+1
  2960.     RET
  2961. ;
  2962. ; CHECK OPTIONS, PUT 0 IN APPROPRIATE PLACES IN OPTION TABLE
  2963. ; IF OPTION SELECTED
  2964. ;
  2965. PROCOPT:
  2966.     LXI    D,FCB+1
  2967.     LDAX    D
  2968.     STA    OPTION
  2969. OPTLP:    INX    D
  2970.     LDAX    D
  2971.     CPI    ' '
  2972.     JZ    ENDOPT
  2973.     LXI    H,OPTBL
  2974.     MVI    B,OPTBE-OPTBL
  2975. OPTCK:    CMP    M
  2976.     JNZ    OPTNO
  2977.     CPI    'O'
  2978.     JNZ    OPTCK1
  2979.     XRA    A
  2980.     STA    UARTFLG
  2981.     JMP    OPTCK2
  2982. ;
  2983. OPTCK1:    CPI    'A'
  2984.     JNZ    OPTCK2
  2985.     MVI    A,TRUE
  2986.     STA    UARTFLG
  2987. OPTCK2:    MVI    M,0
  2988.     JMP    OPTLP
  2989. ;
  2990. OPTNO:    INX    H
  2991.     DCR    B
  2992.     JNZ    OPTCK
  2993.     CALL    NOTVLDMSG
  2994.     POP    PSW    ;PRESERVE STACK
  2995.     JMP    MENU
  2996. ;
  2997. ENDOPT:    LDA    VSEEFLG    
  2998.     ORA    A
  2999.     RNZ
  3000.     STA    QFLG    ;IF VIEWING SUPPRESS ALL ELSE
  3001.     RET
  3002. ;
  3003. DONE:
  3004.     LDA    BATCHFLG
  3005.     ORA    A
  3006.     JNZ    DONETC
  3007.     LDA    QFLG
  3008.     ORA    A
  3009.     JZ    NMSTRNS
  3010.     MVI    B,12        ;ZERO OUT FTRNMSG
  3011.     LXI    H,FTRNMSG
  3012.     MVI    A,0
  3013. ZEROLP:    MOV    M,A
  3014.     INX    H
  3015.     DCR    B
  3016.     JNZ    ZEROLP
  3017.     MVI    B,12        ;PUT FILE NAME IN FTRNMSG
  3018.     LXI    H,FCB+1        
  3019.     LXI    D,FTRNMSG
  3020. LOADMSG:
  3021.     MVI    A,4    ;START OF FILE TYPE?
  3022.     CMP    B
  3023.     JZ    PERIOD    ;PUT IN PERIOD IF SO
  3024.     MOV    A,M    
  3025.     CPI    ' '    ;DON'T PUT IN SPACE
  3026.     JZ    SKPSP    
  3027.     STAX    D    ;STORE IN FTRNMSG
  3028.     INX    D
  3029. SKPSP:    INX    H
  3030.     DCR    B
  3031.     MOV    A,B
  3032.     ORA    A        ;END OF FILE NAME?
  3033.     JZ    FTRNMSG0    ;DISPLAY FILE NAME
  3034.     JMP    LOADMSG        ;LOOP FOR ANOTHER CHARACTER
  3035. ;
  3036. PERIOD:
  3037.     MOV    A,M
  3038.     CPI    ' '        ;IS FILE TYPE EMPTY?
  3039.     JZ    FTRNMSG0    ;GO IF SO
  3040.     MVI    A,'.'        ;ELSE PUT PERIOD IN MESSAGE
  3041.     STAX    D
  3042.     INX    D
  3043.     DCR    B
  3044.     JMP    LOADMSG    
  3045. ;
  3046. FTRNMSG0:
  3047.     CALL    ILPRT
  3048.     DB    CR,LF
  3049. FTRNMSG:
  3050.     DS    12
  3051.     DB    0
  3052.     CALL    ILPRT
  3053.     DB    ' Transferred',CR,LF,LF,0
  3054. NMSTRNS:
  3055.     LDA    FCB    ;SAVE DRIVE NO.
  3056.     STA    DISKNO
  3057.     LXI    H,FCB    ;BLANK OUT FILE CONTROL BLOCKS
  3058.     CALL    INITFCBS
  3059.     LDA    DISKNO    ;PUT DRIVE NUMBER BACK
  3060.     STA    FCB
  3061.     LXI    H,RESTSN ;RESTORE SECTORE NUMBERS..
  3062.     LXI    D,SECTNOB ;..FOR NEW FILE TRANSFER.
  3063.     MVI    B,SECTNOE-SECTNOB ;ROUTINE ALSO DONE IN MENU.
  3064.     CALL    MOVE
  3065.     LDA    SENDFLG    ;GOES TO EITHER SEND OR..
  3066.     ORA    A    ;..RECEIVE FILE, DEPENDING..
  3067.     JNZ    SENDFIL1    ;..UPON WHICH ROUTINE SET..
  3068.     JMP    RCVFIL1    ;..THE FLAG IN MULTI-FILE MODE.
  3069. ;
  3070. DONETC:
  3071.     CALL    ILPRT
  3072.     DB    CR,LF,'Transfer completed',CR,LF,BELL,0
  3073. DONETCA:
  3074.     LDA    DISCFLG    ;SEE IF DISCONNECT WHEN THROUGH
  3075.     ORA    A
  3076.     JNZ    DONETCE    ;NO, DON'T DISCONNECT
  3077. DONETCB:
  3078.     CALL    ILPRT
  3079.     DB    CR,LF,'Press RETURN to disconnect',BELL,CR,LF,0
  3080.     MVI    C,RDCON
  3081.     CALL    BDOS    ;WAIT FOR RESPONSE
  3082.     CPI    0DH    ;CARRIAGE RETURN
  3083.     JNZ    DONETCB    ;NOPE
  3084.     CALL    ILPRT
  3085.     DB    CR,LF,'Disconnected',CR,LF,0
  3086.     CALL    JMP$DISCONNT  ;HANG-UP THE PMMI
  3087.     JMP    EXIT    ;GO TO CP/M
  3088. ;
  3089. DONETCE:
  3090.     CALL    NOPARIT    ;RESET TO NO PARITY
  3091.     MVI    A,TRUE
  3092.     STA    FIRSTME    ;SET FIRST-TIME FLAG
  3093.     STA    FSTFLG    ;RESET MULTIFILE TRANS
  3094.     STA    NFILFLG    ;..USED IN TERMINAL ROUTINE
  3095.     CMA
  3096.     STA    SAVEFLG    ;STOP MEMORY SAVE IN TERM ROUTINE
  3097.     STA    LISTMOR    ;STOP ANY BUFFERED OUTPUT TO PRINTER
  3098.     LXI    H,BOTTRAM    ;RESET PRINTER BUFFER POINTERS
  3099.     SHLD    HLSAVE1
  3100.     SHLD    HLSAVE2
  3101.     LDA    TERMFLG    ;SEE IF RETURN TO..
  3102.     ORA    A    ;..TERMINAL MODE..
  3103.     JNZ    MENU    ;..AFTER X'FER.
  3104.     CALL    CRLF
  3105.     JMP    TERM
  3106. ;
  3107. MOVEFCB:
  3108.     LXI    H,FCB+16
  3109.     LXI    D,FCB
  3110.     MVI    B,16
  3111.     CALL    MOVE
  3112.     XRA    A
  3113.     STA    FCBSNO
  3114.     STA    FCBEXT
  3115.     RET
  3116. ;
  3117. SHOW:    CPI    LF
  3118.     JZ    CTYPE
  3119.     CPI    CR
  3120.     JZ    CTYPE
  3121.     CPI    9
  3122.     JZ    CTYPE
  3123.     CPI    ' '
  3124.     JC    SHOWHEX
  3125.     CPI    7FH
  3126.     JC    CTYPE
  3127. SHOWHEX:
  3128.     PUSH    PSW
  3129.     MVI    A,'('
  3130.     CALL    CTYPE
  3131.     POP    PSW
  3132.     CALL    HEXO
  3133.     MVI    A,')'
  3134.     JMP    CTYPE
  3135. ;
  3136. CTYPE:    PUSH    B
  3137.     PUSH    D
  3138.     PUSH    H
  3139.     MOV    E,A
  3140.     MVI    C,WRCON
  3141.     CALL    BDOS
  3142.     POP    H
  3143.     POP    D
  3144.     POP    B
  3145.     RET
  3146. ;
  3147. CRLF:    PUSH    PSW
  3148.     MVI    A,CR
  3149.     CALL    TYPE
  3150.     MVI    A,LF
  3151.     CALL    TYPE
  3152.     POP    PSW
  3153.     RET
  3154. ;
  3155. TYPE:    PUSH    PSW
  3156.     PUSH    B
  3157.     PUSH    D
  3158.     PUSH    H
  3159.     MOV    C,A
  3160. VTYPE:    CALL    $-$
  3161.     POP    H
  3162.     POP    D
  3163.     POP    B
  3164.     POP    PSW
  3165.     RET
  3166. ;
  3167. STAT:
  3168.     PUSH    B
  3169.     PUSH    D
  3170.     PUSH    H
  3171. ;
  3172. VSTAT:    CALL    $-$
  3173.     POP    H
  3174.     POP    D
  3175.     POP    B
  3176.     ORA    A
  3177.     RET
  3178. ;
  3179. KEYIN:
  3180.     PUSH    B
  3181.     PUSH    D
  3182.     PUSH    H
  3183. VKEYIN:    CALL    $-$
  3184.     POP    H
  3185.     POP    D
  3186.     POP    B
  3187.     RET
  3188. ;
  3189. LISTER:
  3190.     PUSH    B
  3191.     PUSH    D
  3192.     PUSH    H
  3193. VLIST:    CALL    $-$
  3194.     POP    H
  3195.     POP    D
  3196.     POP    B
  3197.     RET
  3198. ;
  3199. LSTSTAT:
  3200.     PUSH    B
  3201.     PUSH    D
  3202.     PUSH    H
  3203. VLSTAT:    CALL    $-$
  3204.     POP    H
  3205.     POP    D
  3206.     POP    B
  3207.     ORA    A
  3208.     RET
  3209. ;
  3210. UCASE:
  3211.     CPI    61H    ;CHANGES LOWER CASE CHARACTER..
  3212.     RC        ;..IN A-REG TO UPPER CASE.
  3213.     CPI    7BH
  3214.     RNC
  3215.     ANI    5FH
  3216.     RET
  3217. ;
  3218. DECOUT:    PUSH    PSW
  3219.     PUSH    B
  3220.     PUSH    D
  3221.     PUSH    H
  3222.     LXI    B,-10
  3223.     LXI    D,-1
  3224. DECOU2:    DAD    B
  3225.     INX    D
  3226.     JC    DECOU2
  3227.     LXI    B,10
  3228.     DAD    B
  3229.     XCHG
  3230.     MOV    A,H
  3231.     ORA    L
  3232.     CNZ    DECOUT
  3233.     MOV    A,E
  3234.     ADI    '0'
  3235.     CALL    CTYPE
  3236.     POP    H
  3237.     POP    D
  3238.     POP    B
  3239.     POP    PSW
  3240.     RET
  3241. ;
  3242. ;---->    DHXOUT: - DOUBLE PRECISION HEX OUTPUT ROUTINE.
  3243. ;
  3244. DHXOUT:
  3245.     PUSH    H
  3246.     PUSH    PSW
  3247.     MOV    A,H    ;GET MS BYTE
  3248.     CALL    HEXO    ;OUTPUT HIGH ORDER BYTE
  3249.     MOV    A,L    ;GET LS BYTE
  3250.     CALL    HEXO    ;OUTPUT LOW ORDER BYTE
  3251.     POP    PSW
  3252.     POP    H
  3253.     RET
  3254. ;
  3255. HEXO:
  3256.     PUSH    PSW
  3257.     RAR
  3258.     RAR
  3259.     RAR
  3260.     RAR
  3261.     CALL    NIBBL
  3262.     POP    PSW
  3263. NIBBL:
  3264.     ANI    0FH
  3265.     CPI    10
  3266.     JC    ISNUM
  3267.     ADI    7
  3268. ISNUM:
  3269.     ADI    '0'
  3270.     JMP    TYPE
  3271. ;
  3272. ;RETURNS W/ ZERO SET IF RETRY ASKED. IF MULTI-FILE MODE, THEN
  3273. ;NO QUESTIONS ASKED, JUST QUIT
  3274. ;
  3275. CKQUIT:
  3276.     LDA    BATCHFLG
  3277.     ORA    A
  3278.     JNZ    CKQTASK    ;ASK FOR RETRY
  3279.     INR    A    ;RESET ZERO FLG
  3280.     RET
  3281. ;
  3282. CKQTASK:
  3283.     MVI    A,1
  3284.     STA    ERRCT
  3285.     CALL    ILPRT
  3286.     DB    CR,LF,'Multiple errors encountered.',CR,LF
  3287.     DB    'Type Q to quit, R to retry:  ',BELL,0
  3288.     CALL    KEYIN
  3289.     PUSH    PSW
  3290.     CALL    CRLF
  3291.     POP    PSW
  3292.     CALL    UCASE    ;INSTEAD OF "ANI 5FH"
  3293.     CPI    'R'
  3294.     RZ
  3295.     CPI    'Q'
  3296.     JNZ    CKQUIT
  3297.     ORA    A
  3298.     RET
  3299. ;
  3300. SHFTYPE:
  3301.     PUSH    PSW
  3302.     CALL    ILPRT
  3303.     DB    'ctrl-',0
  3304.     POP    PSW
  3305.     ADI    40H
  3306.     CALL    TYPE
  3307. ;
  3308. ;WRITE A STRING OF CHARACTERS
  3309. ;
  3310. ILPRT:
  3311.     XTHL
  3312. ILPLP:
  3313.     MOV    A,M
  3314.     ORA    A
  3315.     JZ    ILPRET
  3316.     CALL    CTYPE
  3317.     INX    H
  3318.     JMP    ILPLP
  3319. ILPRET:
  3320.     XTHL
  3321.     RET
  3322. ;
  3323. PRTMSG:
  3324.     MVI    C,PRINT
  3325.     JMP    BDOS
  3326. ;
  3327. ERXIT:
  3328.     POP    D
  3329.     CALL    PRTMSG
  3330.     MVI    A,BELL
  3331.     CALL    TYPE
  3332.     LDA    BATCHFLG
  3333.     ORA    A
  3334.     JNZ    DONETCE
  3335.     MVI    A,'Q'    ;RESET QFLG
  3336.     STA    QFLG
  3337.     JMP    ABORT    ;ABORT OTHER COMPUTER
  3338. ;
  3339. EXIT:
  3340.     CALL    ILPRT
  3341.     DB    '%%% Exiting MODEM %%%',0
  3342.     LDA    SAVUSR
  3343.     MOV    E,A
  3344.     CALL    SETUSR
  3345.     LXI    D,80H
  3346.     MVI    C,STDMA
  3347.     CALL    BDOS
  3348.     LHLD    STACK
  3349.     SPHL
  3350.     LDA    SAVCCP
  3351.     ORA    A
  3352.     JZ    0    ;WARM BOOT
  3353.     RET
  3354. ;
  3355. MOVE128:
  3356.     MVI    B,128
  3357. MOVE:    MOV    A,M
  3358.     STAX    D
  3359.     INX    H
  3360.     INX    D
  3361.     DCR    B
  3362.     JNZ    MOVE
  3363.     RET
  3364. ;
  3365. ;INITIALIZES CP/M FILE CONTROL BLOCKS AT 5CH AND 6CH
  3366. ;
  3367. SETFCB:
  3368.     LXI    D,CMDBUF
  3369.     LXI    H,FCB
  3370.     CALL    CPMLINE
  3371.     CALL    PROCOPT
  3372. CHECKNM:
  3373.     LDA    FCB+1    ;CHECK ON THE PRIMARY OPTION
  3374.     CPI    'E'    ;RETURN IF ECHO OPTION
  3375.     RZ
  3376.     CPI    'H'    ;RETURN IF HELP OPTION
  3377.     RZ
  3378.     CPI    'L'    ;RETURN IF LOCAL ECHO OPTION
  3379.     RZ
  3380.     MOV    B,A
  3381.     LDA    PMMIBYTE
  3382.     ORA    A
  3383.     MOV    A,B
  3384.     JZ    S4
  3385.     CPI    'C'
  3386.     RZ
  3387. S4:    CPI    'T'
  3388.     JZ    TERMSEL
  3389.     CPI    'S'
  3390.     JZ    CKFILE
  3391.     CPI    'R'
  3392.     JNZ    BDOPT
  3393.     LDA    BATCHFLG ;IF MULT FILE MODE, THEN..
  3394.     ORA    A     ;..RECV OPT DOES NOT NEED..
  3395.     RZ         ;..NAME.
  3396.     JMP    CKFILE
  3397. BDOPT:    CALL    ILPRT
  3398.     DB    CR,LF,'++ Bad Option ++',CR,LF,0
  3399.     JMP    REENT
  3400. CKFILE:    LDA    FCB+17    ;IF OPTION THAT NEEDS FILE NAME,..
  3401.     CPI    ' '    ;..THEN CHECK TO SEE IF NAME..
  3402.     RNZ        ;..EXISTS. IF NOT..
  3403. REENT:    CALL    ILPRT    ;..DO EVERYTHING OVER.
  3404.     DB    CR,LF,'Re-enter PRIMARY option and file name only: ',BELL,0
  3405.     LXI    D,CMDBUF
  3406.     CALL    INBUFF
  3407.     JMP    SETFCB
  3408. ;
  3409. TERMSEL:
  3410.     LDA    FCB+17
  3411.     CPI    ' '
  3412.     JNZ    SAVAGN
  3413.     MVI    A,FALSE
  3414.     STA    SAVEFLG
  3415.     MVI    A,TRUE
  3416.     STA    NFILFLG
  3417.     RET
  3418. ;
  3419. SAVAGN:
  3420.     MVI    A,FALSE
  3421.     STA    NFILFLG
  3422.     RET
  3423. ;
  3424. NEWBAUD:
  3425.     LDA    PMMIBYTE
  3426.     ORA    A
  3427.     RZ
  3428.     CALL    ILPRT
  3429.     DB    CR,LF,'Enter New Baudrate: ',0
  3430.     LXI    H,FCB+9
  3431.     MVI    M,0    ;PUTS A ZERO IN FIRST POSITION SO AS TO
  3432. LOOP5:
  3433.     CALL    KEYIN    ;FORCE THE DEFAULT OPTION OF 300 BAUD.
  3434.     CPI    CR    ;CARRIAGE RET ENTERS BAUD RATE
  3435.     JNZ    CONNEWB    ;GOES TO THE ESTABLISHED ROUTINE - RETURN TO MAIN
  3436.     CALL    CRLF    ;PROGRAM IS DONE THERE.
  3437.     JMP    JMP$INITMOD
  3438. ;
  3439. CONNEWB:
  3440.     CPI    30H    ;MAKE SURE IT'S..
  3441.     JC    LOOP5    ;..A DIGIT, ELSE..
  3442.     CPI    3AH    ;..DON'T ACCEPT IT.
  3443.     JNC    LOOP5
  3444.     MOV    M,A
  3445.     MOV    C,A
  3446.     CALL    TYPE    ;ECHO THE CHARACTER ENTERED
  3447.     INX    H
  3448.     JMP    LOOP5
  3449. ;
  3450. ;****************************************************************
  3451. ;*                                *
  3452. ;*   CRCSUBS (Cyclic Redundancy Code Subroutines) version 1.20    *
  3453. ;*   8080 Mnemonics                        *
  3454. ;*                                *
  3455. ;*     These subroutines will compute and check a true 16-bit    *
  3456. ;*   Cyclic Redundancy Code for a message of arbitrary length.    *
  3457. ;*                                *
  3458. ;*     The use of this scheme will guarantee detection of all    *
  3459. ;*   single and double bit errors, all  errors  with  an  odd    *
  3460. ;*   number  of  error bits, all burst errors of length 16 or    *
  3461. ;*   less, 99.9969% of all 17-bit error bursts, and  99.9984%    *
  3462. ;*   of  all  possible  longer  error bursts.  (Ref: Computer    *
  3463. ;*   Networks, Andrew S.  Tanenbaum, Prentiss-Hall, 1981)    *
  3464. ;*                                *
  3465. ;*   Designed & coded by Paul Hansknecht, June 13, 1981        *
  3466. ;*                                *
  3467. ;*   Copyright (c) 1981, Carpenter Associates            *
  3468. ;*            Box 451                    *
  3469. ;*            Bloomfield Hills, MI 48013            *
  3470. ;*            313/855-3074                *
  3471. ;*                                *
  3472. ;*   This program may be freely reproduced for non-profit use.    *
  3473. ;*                                *
  3474. ;****************************************************************
  3475. ;
  3476. ;    ENTRY    CLRCRC,UPDCRC,FINCRC,CHKCRC
  3477. ;
  3478. CLRCRC:    EQU    $    ;RESET CRC ACCUMULATOR FOR A NEW MESSAGE.
  3479.     PUSH    H
  3480.     LXI    H,0
  3481.     SHLD    CRCVAL
  3482.     POP    H
  3483.     RET
  3484. ;
  3485. UPDCRC:    EQU    $    ;UPDATE CRC ACCUMULATOR USING BYTE IN (A).
  3486.     PUSH    PSW
  3487.     PUSH    B
  3488.     PUSH    H
  3489.     MVI    B,8
  3490.     MOV    C,A
  3491.     LHLD    CRCVAL
  3492. UPDLOOP:
  3493.     MOV    A,C
  3494.     RLC
  3495.     MOV    C,A
  3496.     MOV    A,L
  3497.     RAL
  3498.     MOV    L,A
  3499.     MOV    A,H
  3500.     RAL
  3501.     MOV    H,A
  3502.     JNC    SKIPIT
  3503.     MOV    A,H    ;THE GENERATOR IS X^16 + X^12 + X^5 + 1
  3504.     XRI    10H    ;AS RECOMMENDED BY CCITT.
  3505.     MOV    H,A    ;AN ALTERNATE GENERATOR WHICH IS OFTEN
  3506.     MOV    A,L    ;USED IN SYNCHRONOUS TRANSMISSION PROTOCOLS
  3507.     XRI    21H    ;IS X^16 + X^15 + X^2 + 1. THIS MAY BE
  3508.     MOV    L,A    ;USED BY SUBSTITUTING XOR 80H FOR XOR 10H
  3509. SKIPIT:    DCR    B    ;AND XOR 05H FOR XOR 21H IN THE ADJACENT CODE
  3510.     JNZ    UPDLOOP
  3511.     SHLD    CRCVAL
  3512.     POP    H
  3513.     POP    B
  3514.     POP    PSW
  3515.     RET
  3516. ;
  3517. FINCRC:    EQU    $    ;FINISH CRC CALCULATION FOR OUTPUT MESSAGE
  3518.     PUSH    PSW
  3519.     XRA    A
  3520.     CALL    UPDCRC
  3521.     CALL    UPDCRC
  3522.     PUSH    H
  3523.     LHLD    CRCVAL
  3524.     MOV    D,H
  3525.     MOV    E,L
  3526.     POP    H
  3527.     POP    PSW
  3528.     RET
  3529. ;
  3530. CHKCRC:    EQU    $    ;CHECK CRC BYTES OF RECEIVED MESSAGE
  3531.     PUSH    H
  3532.     LHLD    CRCVAL
  3533.     MOV    A,H
  3534.     ORA    L
  3535.     POP    H
  3536.     RZ
  3537.     MVI    A,0FFH
  3538.     RET
  3539. ;
  3540. CRCVAL:
  3541.     DW    0
  3542. ;
  3543. MENU0:
  3544.     LDA    NFILFLG
  3545.     ORA    A
  3546.     JNZ    MENU    ;GO IF NO FILE ACTIVE
  3547.     CALL    ILPRT    ;ELSE PRINT MESSAGE
  3548.     DB    CR,LF,LF
  3549.     DB    '** There may be text in the memory buffer **',CR,LF
  3550.     DB    '** It will be lost unless NOL or WRT commands are used **'
  3551.     DB    CR,LF,BELL,0
  3552.     MVI    B,2    ;2 MORE BELLS
  3553. BLOOP:    LDA    BELRPT    ;GET TIME
  3554.     MOV    C,A
  3555. BCLOOP:    LXI    H,1000    ;ABOUT 0.03 SECONDS
  3556.     CALL    FIXCNT
  3557. BILOOP:    MOV    A,L
  3558.     ORA    H
  3559.     DCX    H
  3560.     JNZ    BILOOP
  3561.     DCR    C
  3562.     JNZ    BCLOOP
  3563.     MVI    A,BELL
  3564.     CALL    TYPE
  3565.     DCR    B
  3566.     JNZ    BLOOP
  3567.     JMP    MENU1
  3568. ;
  3569. MENU:
  3570.     LDA    EXITFLG
  3571.     ORA    A
  3572.     JNZ    EXIT
  3573. MENU1:
  3574.     LXI    H,RESTSN  ;RESTORE SECTOR NUMBERS..
  3575.     LXI    D,SECTNOB ;..FOR NEW FILE TRANSFER.
  3576.     MVI    B,SECTNOE-SECTNOB
  3577.     CALL    MOVE
  3578.     LXI    H,RESTROPT ;RESTORE OPTION TABLE
  3579.     LXI    D,OPTBL
  3580.     MVI    B,OPTBE-OPTBL
  3581.     CALL    MOVE
  3582.     MVI    A,0
  3583.     STA    MFFLG1    ;RESET MFACCESS ROUTINE..
  3584.     CMA        ;..AND MULTI TRANS IN CASE..
  3585.     STA    FSTFLG    ;..OF ABORT.
  3586.     JMP    XPRT
  3587. ;
  3588. MENU2:
  3589.     CALL    CLRTST
  3590.     CALL    ILPRT
  3591.     DB    '               Single Letter Commands',CR,LF,LF
  3592.     DB    ' H  - Display this information',CR,LF
  3593.     DB    ' ?  - Display current settings',CR,LF,LF
  3594.     DB      ' T  - Terminal mode',CR,LF
  3595.     DB      ' E  - Terminal mode with echo',CR,LF
  3596.     DB    ' L  - Terminal mode with local echo',CR,LF
  3597.     DB    '     For capturing text use T(or E or L) FILENAME.TYP and'
  3598.     DB    CR,LF
  3599.     DB    '     Start & Stop toggles described on subsequent screen.'
  3600.     DB    CR,LF,LF
  3601.     DB      ' R  - Receive file using Christensen Protocol',CR,LF
  3602.     DB      ' S  - Send file using Christensen Protocol',CR,LF
  3603.     DB    '     Command is: R(or S) FILENAME.TYP',CR,LF
  3604.     DB    '     R and S can use the following subcommands:',CR,LF
  3605.     DB    '          B  - Bulk transfer using wildcards (e.g. *.*)',CR,LF
  3606.     DB    '          Q  - Quiet mode (no messages to console)',CR,LF
  3607.     DB    '          T  - Return to terminal mode after transfer',CR,LF
  3608.     DB    '          V  - View bytes transferred on console',CR,LF,LF
  3609.     DB    'The single letter commands may also be used on the',CR,LF
  3610.     DB    'command line when the program is initially executed.'
  3611.     DB    CR,LF,LF,0
  3612. ;
  3613.     CALL    NXTSCRN
  3614. ;
  3615.     LDA    PMMIBYTE
  3616.     ORA    A
  3617.     JZ    THREELTR
  3618.     CALL    ILPRT
  3619.     DB    '       Additional Subcommands for PMMI Modem',CR,LF,LF
  3620.     DB    '  Modem control:',CR,LF
  3621.     DB    '      O - Send or receive on Originate tone',CR,LF
  3622.     DB    '      A - Send or receive on Answer tone',CR,LF
  3623.     DB    '      D - Disconnect option',CR,LF,LF
  3624.     DB    '  Parity options:',CR,LF
  3625.     DB    '      1 - Set and check for odd parity',CR,LF
  3626.     DB    '      0 - Set and check for even parity',CR,LF
  3627.     DB    '          Both ends must be capable of these options',CR,LF
  3628.     DB    '          which are available only in S and R modes.',CR,LF
  3629.     DB    '          The parity checking will be part of the',CR,LF
  3630.     DB    '          file transfer protocol.',CR,LF,LF
  3631.     DB    '  Speed Options:',CR,LF
  3632.     DB    '      After entering your primary and secondary options,'
  3633.     DB    CR,LF
  3634.     DB    '      you can set the modem speed by placing a "." after'
  3635.     DB    CR,LF
  3636.     DB    '      the options followed by the speed e.g. 110, 300.',CR,LF
  3637.     DB    '      For example:  SBO1T.600 will set the modem to run',CR,LF
  3638.     DB    '      at 600 baud.',CR,LF,LF,0
  3639. ;
  3640.     CALL    NXTSCRN
  3641. ;
  3642. THREELTR:
  3643.     CALL    ILPRT
  3644.     DB    '               Three Letter Commands',CR,LF,LF
  3645.     DB      'DIR - List directory and space free (may specify drive)'
  3646.     DB    CR,LF
  3647.     DB    'END - Exit from this program',CR,LF
  3648.     DB    'ERA - Erase file (may specify drive)',CR,LF
  3649.     DB    'LOG - Change default drive/user (specify drive/user)'
  3650.     DB    CR,LF
  3651.     DB    '      and reset disks.  e.g. LOG A0, LOG B (user unchanged)'
  3652.     DB    CR,LF
  3653.     DB    'SPD - Set speed of file output in terminal mode',CR,LF,0
  3654. ;
  3655.     CALL    SORPTST
  3656.     JNZ    NOTIME
  3657.     CALL    ILPRT
  3658.     DB    'TIM - Set S mode time-to-send message',CR,LF,0
  3659. ;
  3660. NOTIME:
  3661.     LDA    TOGGLECRC
  3662.     ORA    A
  3663.     JZ    NOTOGCRC
  3664.     CALL    ILPRT
  3665.     DB    'TCC - Toggle Checksum/CRC mode on receive',CR,LF,0
  3666. ;
  3667. NOTOGCRC:
  3668.     LDA    TOGGLEBK
  3669.     ORA    A
  3670.     JZ    NOTOGBK
  3671.     CALL    ILPRT
  3672.     DB    'TBR - Toggle backspace to rub conversion',CR,LF,0
  3673. ;
  3674. NOTOGBK:
  3675.     LDA    TOGGLELOC
  3676.     ORA    A
  3677.     JZ    NOTOGLOC
  3678.     CALL    ILPRT
  3679.     DB    'TLC - Toggle  1) local command immediate',CR,LF
  3680.     DB    '              2) local command after ',0
  3681.     LDA    EXTCHR
  3682.     CALL    SHFTYPE
  3683.     DB    CR,LF,0
  3684. ;
  3685. NOTOGLOC:
  3686.     LDA    TOGGLELF
  3687.     ORA    A
  3688.     JZ    NOTOGLF
  3689.     CALL    ILPRT
  3690.     DB    'TLF - Toggle send linefeed after carriage return',CR,LF,0
  3691. ;
  3692. NOTOGLF:
  3693.     LDA    TOGXOFF
  3694.     ORA    A
  3695.     JZ    NOTOGXOFF
  3696.     CALL    ILPRT
  3697.     DB    'TXO - Toggle XOFF/XON testing in terminal mode file output'
  3698.     DB    CR,LF,0
  3699. ;
  3700. NOTOGXOFF:
  3701.     LDA    PMMIBYTE
  3702.     ORA    A
  3703.     JNZ    NONUM
  3704.     CALL    ILPRT
  3705.     DB    'NUM - List remote systems',CR,LF,0
  3706.     LDA    SETUPTST
  3707.     ORA    A
  3708.     JZ    NOSETUP
  3709.     CALL    ILPRT
  3710.     DB    'SET - Set communication ports',CR,LF,0
  3711. ;
  3712. NOSETUP:
  3713.     MVI    A,LF
  3714.     CALL    TYPE
  3715.     JMP    NOPMMI
  3716. ;
  3717. NONUM:
  3718.     CALL    ILPRT
  3719.     DB      'CAL - Dial number',CR,LF
  3720.     DB      'DSC - Disconnect',CR,LF
  3721.     DB    'BYE - Disconnect and reboot',CR,LF,LF,0
  3722. ;
  3723. NOPMMI:
  3724.     CALL    ILPRT
  3725.     DB    '    The following are terminal text buffer commands:'
  3726.     DB    CR,LF,0
  3727.     LDA    PMMIBYTE
  3728.     ORA    A
  3729.     JNZ    SKIPLF
  3730.     MVI    A,LF
  3731.     CALL    TYPE
  3732. SKIPLF:
  3733.     CALL    ILPRT
  3734.     DB      'DEL - Delete memory buffer and file',CR,LF
  3735.     DB      'NOL - Return to terminal mode - no loss of data in buffer'
  3736.     DB    CR,LF
  3737.     DB      'WRT - Write memory buffer to disk file',CR,LF,LF,0
  3738.     CALL    NXTSCRN
  3739. ;
  3740.     CALL    ILPRT
  3741.     DB    '      Local Commands while in Terminal Mode',CR,LF,LF,0
  3742.     LDA    EXITCHR
  3743.     CALL    SHFTYPE
  3744.     DB    '  - Exit to command mode',CR,LF,LF,0
  3745. ;
  3746.     LDA     PMMIBYTE
  3747.     ORA     A
  3748.     JZ      S5A
  3749. ;
  3750.     LDA    DISCCHR
  3751.     CALL    SHFTYPE
  3752.     DB    '  - Disconnect',CR,LF,0
  3753.     LDA    BRKCHR
  3754.     CALL    SHFTYPE
  3755.     DB    '  - Send break',CR,LF,0
  3756.     LDA    CHGBAUD
  3757.     CALL    SHFTYPE
  3758.     DB    '  - Change baud rate',CR,LF,0
  3759. ;
  3760. S5A:
  3761.     LDA    TRANLOGON
  3762.     ORA    A
  3763.     JZ    NOTRANLOG
  3764.     LDA    LOGCHR
  3765.     CALL    SHFTYPE
  3766.     DB    '  - Transmit logon',CR,LF,0
  3767. ;
  3768. NOTRANLOG:
  3769.     LDA    LSTTST
  3770.     ORA    A
  3771.     JZ    NOLST2
  3772.     LDA    LSTCHR
  3773.     CALL    SHFTYPE
  3774.     DB    '  - Toggle printer',CR,LF,0
  3775. ;
  3776. NOLST2:
  3777.     MVI    A,LF
  3778.     CALL    TYPE
  3779.     LDA    SAVECHR
  3780.     CALL    SHFTYPE
  3781.     DB    '  - Start copy into buffer',CR,LF,0
  3782.     LDA    UNSAVECHR
  3783.     CALL    SHFTYPE
  3784.     DB      '  - Stop copy into buffer',CR,LF
  3785.     DB    '     Start & Stop may be toggled as often as desired.',CR,LF
  3786.     DB    '     A ":" at start of line indicates buffer is open.',CR,LF
  3787.     DB    '     XOFF automatically used to stop input when writing',CR,LF
  3788.     DB    '     full buffer to disk, XON sent to resume.',CR,LF,LF,0
  3789.     LDA    TRANCHR
  3790.     CALL    SHFTYPE
  3791.     DB    '  - Transfer ASCII file to remote',CR,LF,LF,0
  3792.     LDA    LOCONEXTCHR
  3793.     ORA    A
  3794.     LDA    EXTCHR
  3795.     JNZ    REMDFLT
  3796.     CALL    SHFTYPE
  3797.     DB    '  - Send local control character to remote',CR,LF,0
  3798.     JMP    XPRT
  3799. REMDFLT:
  3800.     CALL    SHFTYPE
  3801.     DB    '  - Next character will be used for local control',CR,LF,0
  3802. ;
  3803. XPRT:
  3804.     CALL    ILPRT
  3805.     DB    CR,LF,'Drive ',0
  3806.     MVI    C,CURDSK    ;CURRENT DISK FUNCTION
  3807.     CALL    BDOS
  3808.     ADI    'A'        ;MAKE ASCII
  3809.     CALL    TYPE
  3810. ;
  3811.     IF  CPM2X    ;IF CPM VER 2.X
  3812. ;
  3813.     CALL    GETUSR    ;GET CURRENT USER NUMBER
  3814.     CPI    0
  3815.     JZ    SR3B    ;SKIP IF USER 0
  3816.     PUSH    PSW
  3817.     CALL    ILPRT
  3818.     DB    ', User ',0
  3819.     POP    PSW
  3820.     MVI    H,0
  3821.     MOV    L,A
  3822.     CALL    DECOUT    ;REPORT USER
  3823. ;
  3824.     ENDIF    ;CPM2X
  3825. ;
  3826. SR3B:    CALL    CRLF
  3827.     LDA    NFILFLG
  3828.     ORA    A
  3829.     JNZ    NOBUFMSG
  3830.     CALL    GETSPC
  3831.     CALL    ILPRT
  3832.     DB    ' bytes of buffer free',CR,LF,0
  3833. NOBUFMSG:    
  3834.     CALL    ILPRT
  3835.     DB    'COMMAND (H for Help): ',0
  3836. GETCMD:
  3837.     LXI    D,CMDBUF    ;ENTER COMMAND
  3838.     CALL    INBUFF
  3839.     CALL    CRLF
  3840.     LXI    D,CMDBUF+2 ;POINT TO COMMAND
  3841.     CALL    ILCOMP
  3842.     DB    'END',0
  3843.     JNC    EXIT
  3844.     CALL    ILCOMP
  3845.     DB    'LOG',0
  3846.     JNC    LOGNEW
  3847.     CALL    ILCOMP
  3848.     DB    'DIR',0
  3849.     JNC    DIR
  3850.     CALL    ILCOMP
  3851.     DB    'ERA',0
  3852.     JNC    ERASEF
  3853.     CALL    ILCOMP
  3854.     DB    '?',0
  3855.     JNC    CURPAR
  3856.     CALL    ILCOMP
  3857.     DB    'SPD',0
  3858.     JNC    SETSPD
  3859.     CALL    ILCOMP
  3860.     DB    'TIM',0
  3861.     JNC    SETTIM
  3862.     CALL    ILCOMP
  3863.     DB    'TCC',0
  3864.     JNC    TOGCRC
  3865.     CALL    ILCOMP
  3866.     DB    'TBR',0
  3867.     JNC    TOGBKSP
  3868.     CALL    ILCOMP
  3869.     DB    'TLC',0
  3870.     JNC    TOGLOC
  3871.     CALL    ILCOMP
  3872.     DB    'TLF',0
  3873.     JNC    TOGLF
  3874.     CALL    ILCOMP
  3875.     DB    'TXO',0
  3876.     JNC    TOGTXOFF
  3877.     LDA    PMMIBYTE
  3878.     ORA    A
  3879.     JNZ    NONUM2
  3880.     CALL    ILCOMP
  3881.     DB    'NUM',0
  3882.     JNC    NUMPRN
  3883. NONUM2:    LDA    SETUPTST
  3884.     ORA    A
  3885.     JZ    NOSETUP2
  3886.     CALL    ILCOMP
  3887.     DB    'SET',0
  3888.     JNC    SETUPENT
  3889. NOSETUP2:
  3890.     CALL    ILCOMP
  3891.     DB    'NOL',0
  3892.     JC    NXTOPT1        ;CARRY SET = NO MATCH
  3893.     LDA    NFILFLG
  3894.     ORA    A
  3895.     JNZ    NOFILOPN    ;GO TELL OPERATOR IF NO FILE OPEN
  3896.     LDA    ORIGSAV
  3897.     STA    ORIGFLG
  3898.     CALL    BUFMSG
  3899.     LHLD    HLSAVE    ;RETURN TO TERMINAL..
  3900.     JMP    TERM    ;..MODE WITH SAVE OPTION..
  3901.             ;..IF PREVIOUSLY ENABLED.
  3902. ;
  3903. NXTOPT1:
  3904.     CALL    ILCOMP
  3905.     DB    'WRT',0
  3906.     JNC    WRTFIL
  3907.     CALL    ILCOMP
  3908.     DB    'DEL',0
  3909.     JNC    NEWFILE
  3910.     LDA    PMMIBYTE
  3911.     ORA    A
  3912.     JZ    S6
  3913.     CALL    ILCOMP    ;DE SET FROM 1ST ILCOMP CALL
  3914.     DB    'DSC',0
  3915.     JNC    DISCON1
  3916.     CALL    ILCOMP
  3917.     DB    'BYE',0
  3918.     JNC    BYEBYE
  3919.     CALL    ILCOMP
  3920.     DB    'CAL',0
  3921.     JC    S6
  3922.     MVI    A,20H        ;FOOL THE SYSTEM
  3923.     STA    CMDBUF+4    ;..CMDBUF SO THAT IT..
  3924.     JMP    DOOPT        ;..LOOKS AT OPTION FOR DIAL
  3925. S6:    PUSH    H
  3926.     LDA    CMDBUF+2
  3927.     LXI    H,COMPLIST
  3928.     CALL    COMPARE    ;COMPARES LIST POINTED TO BY HL..
  3929.     POP    H    ;..TO CHAR IN A-REG.
  3930.     JC    NOTVLD    ;CARRY SET = NO MATCH
  3931. DOOPT:    PUSH    H    ;LOAD ORIGINAL FCB WITH TRANSFER..
  3932.     CALL    SETFCB    ;..CMDS AND GO TO BEGINNING OF..
  3933.     POP    H    ;..PROGRAM. WILL FOLLOW SAME LOGIC..
  3934.     JMP    RESTART    ;..AS IF PROGRAM WERE CALLED WITH..
  3935.             ;..CP/M COMMAND LINE.
  3936. ;
  3937. NOTVLD:
  3938.     CALL    NOTVLDMSG
  3939.     JMP    XPRT
  3940. ;
  3941. NOTVLDMSG:
  3942.     CALL    ILPRT
  3943.     DB    '++ Invalid Command ++',CR,LF,BELL,0
  3944.     RET
  3945. ;
  3946. DISCON1:
  3947.     CALL    JMP$DISCONNT
  3948.     CALL    ILPRT
  3949.     DB    CR,LF,'<< Disconnected >>',CR,LF,BELL,0
  3950.     JMP    EXITMEN
  3951. ;
  3952. BYEBYE:
  3953.     CALL    ILPRT
  3954.     DB    CR,LF,'Goodbye...',CR,LF,0
  3955.     XRA    A
  3956.     CALL    OUT$MODCTLP
  3957.     CALL    OUT$MODCTL2
  3958.     LDA    SAVUSR
  3959.     MOV    E,A
  3960.     CALL    SETUSR
  3961.     LHLD    CLDBOOT    ;GET COLD BOOT PROM ADDRESS OR WARM BOOT
  3962.     PCHL        ;JUMP TO IT
  3963. ;
  3964. DIR:
  3965.     MVI    C,CURDSK
  3966.     CALL    BDOS
  3967.     STA    DISKSAV
  3968.     CALL    DIRLST
  3969.     LDA    DISKSAV
  3970.     MOV    E,A
  3971.     MVI    C,SELDSK
  3972.     CALL    BDOS
  3973.     JMP    XPRT
  3974. ;
  3975. LOGNEW:    LDA    NFILFLG
  3976.     ORA    A
  3977.     JZ    NORESET
  3978.     LDA    CMDBUF+6
  3979.     CPI    ' '
  3980.     JNZ    SPECIFD
  3981.     MVI    C,CURDSK
  3982.     CALL    BDOS
  3983.     ADI    'A'
  3984. SPECIFD:
  3985.     SUI    'A'
  3986.     STA    DISKSAV
  3987.     CPI    16
  3988.     JNC    NOTVLD
  3989. ;
  3990.     IF    CPM2X        ;IF CPM VER. 2.X
  3991. ;
  3992.     CALL    GETUSR        ;PICK UP CURRENT USER NUMBER
  3993.     MOV    B,A        ;SAVE IT
  3994.     LDA    CMDBUF+7    ;GET NEW USER NUMBER
  3995.     CPI    ' '        ;CHECK FOR SPACE
  3996.     JZ    SR7B        ;EXIT IF NO NEW USER NUMBER SPECIFIED
  3997.     CALL    NUMCHK        ;CHECK TO SEE IF IT IS A NUMBER
  3998.     MOV    B,A        ;SAVE
  3999.     LDA    CMDBUF+8    ;GET SECOND DIGIT
  4000.     CPI    ' '
  4001.     JZ    SR7B        ;GO IF SPACE
  4002.     CALL    NUMCHK
  4003.     MOV    C,A        ;SAVE
  4004.     MOV    A,B        ;GET SAVED FIRST DIGIT
  4005.     ADD    A        ; X2
  4006.     ADD    A        ; X4
  4007.     ADD    A        ; X8
  4008.     ADD    B        ; X9
  4009.     ADD    B        ; X10
  4010.     ADD    C
  4011.     MOV    B,A        ;SAVE
  4012.     LDA    CMDBUF+9    ;GET THIRD DIGIT
  4013.     CPI    ' '
  4014.     JZ    SR7B        ;GO IF SPACE
  4015.     CALL    NUMCHK
  4016.     MOV    C,A        ;SAVE
  4017.     MOV    A,B        ;GET SAVED FIRST & SECOND DIGIT
  4018.     ADD    A        ; X2
  4019.     ADD    A        ; X4
  4020.     ADD    A        ; X8
  4021.     ADD    B        ; X9
  4022.     ADD    B        ; X10
  4023.     ADD    C
  4024. ;    CPI    16        ;CHECK FOR < 16
  4025. ;    JNC    NOTVLD        ;GO IF NOT
  4026.     MOV    B,A
  4027. SR7B:    MOV    A,B
  4028.     STA    SAVUSR
  4029. ;
  4030.     ENDIF    ;CPM2X
  4031. ;
  4032.     CALL    ILPRT
  4033.     DB    'Insert disk for drive ',0
  4034.     LDA    DISKSAV
  4035.     ADI    'A'
  4036.     CALL    TYPE
  4037. NOTCR:    CALL    ILPRT
  4038.     DB    CR,LF,'Hit return when ready',0
  4039.     CALL    KEYIN
  4040.     CPI    3    ;CTL-C ABORTS LOGIN
  4041.     JZ    XPRT
  4042.     CPI    CR
  4043.     JNZ    NOTCR
  4044.     CALL    CRLF
  4045.     MVI    C,RESET
  4046.     CALL    BDOS    
  4047.     LDA    DISKSAV
  4048.     MOV    E,A
  4049.     MVI    C,SELDSK
  4050.     CALL    BDOS
  4051. ;
  4052.     IF    CPM2X
  4053.     LDA    SAVUSR
  4054.     MOV    E,A
  4055.     CALL    SETUSR
  4056.     ENDIF
  4057. ;
  4058.     JMP    XPRT
  4059. ;
  4060.     IF    CPM2X
  4061. ;
  4062. GETUSR:    MVI    E,0FFH        ;GET CURRENT USER
  4063. SETUSR:    MVI    C,USER        ;SET-UP FUNCTION CALL
  4064.     JMP    BDOS        ;NUMBER IN RETURNED IN A
  4065. ;
  4066.     ENDIF    ;CPM2X
  4067. ;
  4068. NORESET:
  4069.     CALL    ILPRT
  4070.     DB    '++      Terminal mode file open      ++',CR,LF
  4071.     DB    '++ Use WRT or DEL before LOG command ++',CR,LF
  4072.     DB    CR,LF,LF,BELL,0
  4073.     XRA    A
  4074.     JMP    XPRT
  4075. ;
  4076. ERASEF:    LXI    D,CMDBUF ;PUT CMD LINE INTO FCB AT HL
  4077.     LXI    H,FCB
  4078.     CALL    CPMLINE
  4079.     CALL    MOVEFCB    ;MOVE FCB+16 TO FCB
  4080.     LDA    FCB+1
  4081.     CPI    ' '
  4082.     JZ    NOTVLD    ;GO IF NO FILE SPECIFIED
  4083.     LXI    D,FCB
  4084.     MVI    C,SRCHF
  4085.     CALL    BDOS
  4086.     INR    A    ;0 IF FILE NOT FOUND
  4087.     JNZ    ERAFILE ;OK, GO ERASE
  4088.     CALL    ILPRT
  4089.     DB    '++ File not found ++',CR,LF,BELL,0
  4090.     JMP    XPRT
  4091. ;
  4092. ERAFILE:
  4093.     LXI    D,FCB
  4094.     MVI    C,ERASE
  4095.     CALL    BDOS
  4096.     CALL    ILPRT
  4097.     DB    'File erased',CR,LF,0
  4098.     JMP    XPRT
  4099. ;
  4100. SETSPD:
  4101.     CALL    ILPRT
  4102.     DB    'Enter character output delay [0(none) - 9(longest delay)]: ',0
  4103.     CALL    NUMGET
  4104.     JNC    NOCHG1
  4105.     STA    BYTDLY
  4106. NOCHG1:    CALL    SPDMSG
  4107.     CALL    ILPRT
  4108.     DB    CR,LF,'Enter additional delay after <CR> [0-9]: ',0
  4109.     CALL    NUMGET
  4110.     JNC    NOCHG2
  4111.     RLC        ;X2
  4112.     RLC        ;X4
  4113.     STA    CRDLY
  4114. NOCHG2:    CALL    CRDLYMSG
  4115.     JMP    XPRT
  4116. ;
  4117. NUMGET:    LXI    D,CMDBUF
  4118.     CALL    INBUFF
  4119.     LDA    CMDBUF+2     ;GET NUMBER
  4120.     CPI    ' '
  4121.     RZ
  4122. NUMCHK:    SUI    '0'
  4123.     CPI    10
  4124.     RC
  4125.     POP    PSW        ;PRESERVE STACK
  4126.     JMP    NOTVLD
  4127. ;
  4128. SPDMSG:    CALL    ILPRT
  4129.     DB    'Terminal mode file output delay is 0.',0
  4130.     LDA    BYTDLY
  4131.     CALL    GIVNUM
  4132.     CALL    ILPRT
  4133.     DB    ' seconds per character',CR,LF,0
  4134.     RET
  4135. ;
  4136. CRDLYMSG:
  4137.     CALL    ILPRT
  4138.     DB    'Additional delay after <CR> is 0.',0
  4139.     LDA    CRDLY
  4140.     CALL    GIVNUM
  4141.     CALL    ILPRT
  4142.     DB    ' seconds',CR,LF,0
  4143.     RET
  4144. ;
  4145. GIVNUM:    ADD    A    ;2X
  4146.     CPI    10
  4147.     MOV    B,A
  4148.     JNC    NOZERO
  4149.     MVI    A,'0'
  4150.     CALL    TYPE
  4151.     MOV    A,B
  4152. NOZERO:    PUSH    H
  4153.     MOV    L,A
  4154.     MVI    H,0
  4155.     CALL    DECOUT
  4156.     POP    H
  4157.     RET
  4158. ;
  4159. SETTIM:
  4160.     CALL    SORPTST
  4161.     JNZ    NOTVLD
  4162.     CALL    ILPRT
  4163.     DB    'Use 0-8 to give baud rate for S mode time-to-send message,'
  4164.     DB    CR,LF
  4165.     DB    'where 0=110, 1=300, 2=450, 3=600, 4=710, 5=1200, 6=2400,'
  4166.     DB    CR,LF
  4167.     DB    '      7=4800, and 8=9600 Baud.'
  4168.     DB    CR,LF,LF,'Enter value: ',0
  4169.     CALL    NUMGET
  4170.     CPI    9
  4171.     JNC    NOTVLD
  4172.     STA    MSPEED
  4173.     CALL    SETTIM2
  4174.     JMP    XPRT
  4175. ;
  4176. SETTIM2:
  4177.     CALL    SORPTST
  4178.     JNZ    SETTIM3
  4179.     CALL    ILPRT
  4180.     DB    'Rate for the S mode time-to-send message is set to ',0
  4181.     JMP    SETTIM4
  4182. SETTIM3:
  4183.     CALL    ILPRT
  4184.     DB    'Modem speed is ',0
  4185. SETTIM4:
  4186.     JMP    BAUDPRT
  4187. ;
  4188. SORPTST:
  4189.     LDA    SETUPTST
  4190.     MOV    B,A
  4191.     LDA    PMMIBYTE
  4192.     ORA    B
  4193.     RET
  4194. ;
  4195. TOGCRC:
  4196.     LDA    TOGGLECRC
  4197.     ORA    A
  4198.     JZ    NOTVLD
  4199.     LDA    CKSUMDFLT
  4200.     CMA
  4201.     STA    CKSUMDFLT
  4202.     CALL    TOGCRC2
  4203.     JMP    XPRT
  4204. ;
  4205. TOGCRC2:
  4206.     ORA    A
  4207.     JNZ    CHEKMSG
  4208.     CALL    ILPRT
  4209.     DB    'CRC mode set',CR,LF,0
  4210.     RET
  4211. ;
  4212. CHEKMSG:
  4213.     CALL    ILPRT
  4214.     DB    'Checksum mode set',CR,LF,0
  4215.     RET
  4216. ;
  4217. TOGBKSP:
  4218.     LDA    TOGGLEBK
  4219.     ORA    A
  4220.     JZ    NOTVLD
  4221.     LDA    CONVBKSP
  4222.     CMA
  4223.     STA    CONVBKSP
  4224.     CALL    TOGBKSP2
  4225.     JMP    XPRT
  4226. ;
  4227. TOGBKSP2:
  4228.     LDA    CONVBKSP
  4229.     ORA    A
  4230.     JZ    NORUBMSG
  4231.     CALL    ILPRT
  4232.     DB    'Backspace is rub',CR,LF,0
  4233.     RET
  4234. ;
  4235. NORUBMSG:
  4236.     CALL    ILPRT
  4237.     DB    'Backspace is backspace',CR,LF,0
  4238.     RET
  4239. ;
  4240. TOGLOC:    LDA    TOGGLELOC
  4241.     ORA    A
  4242.     JZ    NOTVLD
  4243.     LDA    LOCONEXTCHR
  4244.     CMA
  4245.     STA    LOCONEXTCHR
  4246.     CALL    TOGLOC2
  4247.     JMP    XPRT
  4248. ;
  4249. TOGLOC2:
  4250.     CALL    ILPRT
  4251.     DB    'Use ',0
  4252.     LDA    LOCONEXTCHR
  4253.     ORA    A
  4254.     LDA    EXTCHR
  4255.     JZ    LOCMSG
  4256.     CALL    SHFTYPE
  4257.     DB    ' before local command',CR,LF,0
  4258.     RET
  4259. ;
  4260. LOCMSG: CALL    SHFTYPE
  4261.     DB    ' to send local command to remote',CR,LF,0
  4262.     RET
  4263. ;
  4264. TOGLF:    LDA    TOGGLELF
  4265.     ORA    A
  4266.     JZ    NOTVLD
  4267.     LDA    ADDLF
  4268.     CMA
  4269.     STA    ADDLF
  4270.     CALL    TOGLF2
  4271.     JMP    XPRT
  4272. ;
  4273. TOGLF2:
  4274.     CALL    ILPRT
  4275.     DB    'Linefeed ',0
  4276.     LDA    ADDLF
  4277.     ORA    A
  4278.     JNZ    LFMSG
  4279.     CALL    ILPRT
  4280.     DB    'NOT ',0
  4281. LFMSG:    CALL    ILPRT
  4282.     DB    'sent after <CR>',CR,LF,0
  4283.     RET
  4284. ;
  4285. TOGTXOFF:
  4286.     LDA    TOGXOFF
  4287.     ORA    A
  4288.     JZ    NOTVLD
  4289.     CALL    ILPRT
  4290.     DB    'Use XOFF testing? (Y/N): ',0
  4291.     CALL    GETANS
  4292.     JC    NOCHG3
  4293.     STA    XOFFTST
  4294. NOCHG3:    CALL    XOFFMSG
  4295.     CALL    ILPRT
  4296.     DB    CR,LF,'Use XON waiting after <CR> (Y/N): ',0
  4297.     CALL    GETANS
  4298.     JC    NOCHG4
  4299.     STA    XONWAIT
  4300. NOCHG4:    CALL    XONMSG
  4301.     LDA    XONWAIT
  4302.     ORA    A
  4303.     JZ    XPRT
  4304.     CMA
  4305.     STA    XOFFTST        ;DON'T ALLOW BOTH
  4306.     CALL    ILPRT
  4307.     DB    'Therefore ',0
  4308.     CALL    XOFFMSG
  4309.     JMP    XPRT
  4310. ;
  4311. GETANS:
  4312.     LXI    D,CMDBUF
  4313.     CALL    INBUFF
  4314.     LDA    CMDBUF+2     ;GET ANSWER
  4315.     CPI    ' '
  4316.     CMC
  4317.     RZ
  4318.     MOV    B,A
  4319.     CPI    'N'
  4320.     MVI    A,FALSE
  4321.     RZ
  4322.     MOV    A,B
  4323.     CPI    'Y'
  4324.     MVI    A,TRUE
  4325.     RZ
  4326.     POP    PSW        ;PRESERVE STACK
  4327.     JMP    NOTVLD
  4328. ;
  4329. XOFFMSG:
  4330.     CALL    ILPRT
  4331.     DB    'XOFF testing ',0
  4332.     LDA    XOFFTST
  4333.     ORA    A
  4334.     JNZ    XOTSTON
  4335.     CALL    ILPRT
  4336.     DB    'NOT ',0
  4337. XOTSTON:
  4338.     CALL    ILPRT
  4339.     DB    'used',0
  4340. XONMSG3:
  4341.     CALL    ILPRT
  4342.     DB    ' in terminal mode file output',CR,LF,0
  4343.     RET
  4344. ;
  4345. XONMSG:
  4346.     CALL    ILPRT
  4347.     DB    'XON ',0
  4348.     LDA    XONWAIT
  4349.     ORA    A
  4350.     JNZ    XONMSG2
  4351.     CALL    ILPRT
  4352.     DB    'NOT ',0
  4353. XONMSG2:
  4354.     CALL    ILPRT
  4355.     DB    'automatically tested after <CR>',0
  4356.     JMP    XONMSG3
  4357. ;
  4358. SETUPENT:
  4359.     LDA    SETUPTST
  4360.     ORA    A
  4361.     JZ    NOTVLD
  4362.     LXI    D,CMDBUF+1
  4363.     CALL    JMP$SETUPR
  4364.     JMP    XPRT
  4365. ;
  4366. NEWFILE:
  4367.     LDA    NFILFLG
  4368.     ORA    A
  4369.     JNZ    NOFILOPN    
  4370.     LDA    FCB3+1        ;CHECK THAT FILE WAS REQUESTED
  4371.     CPI    ' '
  4372.     JZ    NOFILOPN    ;IF NO FILE, DON'T ERASE
  4373.     LXI    D,FCB3
  4374.     MVI    C,ERASE
  4375.     CALL    BDOSRT
  4376.     MVI    A,TRUE    ;DO NOT ALLOW TERMINAL..
  4377.     STA    NFILFLG    ;..SAVE SINCE NO FILE..
  4378.     CMA        ;..SPECIFIED.
  4379.     STA    SAVEFLG
  4380.     LXI    H,FCB3
  4381.     CALL    INITFCBS
  4382.     LXI    H,BOTTRAM
  4383.     SHLD    HLSAVE
  4384.     JMP    XPRT
  4385. ;
  4386. WRTFIL:
  4387.     LDA    NFILFLG
  4388.     CPI    TRUE
  4389.     JZ    NOFILOPN
  4390.     LDA    FCB3+1    ;CHECK THAT FILE WAS REQUESTED
  4391.     CPI    ' '
  4392.     JZ    NOFILOPN
  4393.     LHLD    HLSAVE
  4394.     CALL    NUMRECS    ;DISK WRITE ROUTINE AS USED IN..
  4395.     CALL    WRTDSK    ;..IN THE INTDSKSV ROUTINE.
  4396.     CALL    CLOSE3
  4397.     MVI    A,TRUE
  4398.     STA    NFILFLG
  4399.     CMA
  4400.     STA    SAVEFLG
  4401.     LXI    H,FCB3
  4402.     CALL    INITFCBS ;BLANK OUT FCB SO WRITTEN FILE CAN'T BE ERASED.
  4403.     LXI    H,BOTTRAM
  4404.     SHLD    HLSAVE
  4405.     JMP    XPRT
  4406. ;
  4407. NOFILOPN:
  4408.     CALL    ILPRT
  4409.     DB    '++ No File Open ++',CR,LF,BELL,0
  4410.     JMP    XPRT
  4411. ;
  4412. ;THIS ROUTINE DISPLAYS THE PHONE NUMBERS IN THE LIBRARY
  4413. ;
  4414. NUMPRN:
  4415.     PUSH    H
  4416.     CALL    CLRTST
  4417.     CALL    ILPRT
  4418.     DB    '           Library of Phone Numbers of Remote Systems',0
  4419.     MVI    C,13       ;NUMBER OF LINES TO MOVE
  4420.     LXI    H,NUMBLIB  ;ADDRESS OF SOURCE MEMORY
  4421.     LXI    D,DBUF     ;ADDRESS OF TARGET MEMORY
  4422.     CALL    NEWLINE    ;START WITH CRLF
  4423.     STAX    D          ;+LF
  4424.     INX    D          ;AND BUMP IT
  4425. NUMPRN1:
  4426.     INX    H    ;SKIP PMMI DIALING LETTER
  4427.     INX    H    ;AND EQUAL SIGN
  4428.     MVI    B,30    ;NUMBER OF BYTES TO MOVE
  4429.     CALL    MOVE    ;MOVE TO BUFFER
  4430.     CALL    SPACES    ;2 ENTRIES + 3 SPACES = 63 CHARACTERS
  4431.     INX    H
  4432.     INX    H
  4433.     MVI    B,30
  4434.     CALL    MOVE
  4435.     CALL    NEWLINE
  4436.     DCR    C    ;NUMBER OF LINES TO PRINT
  4437.     JZ    NUMPRN2
  4438.     JMP    NUMPRN1
  4439. ;
  4440. NEWLINE:        ;PUTS CR-LF AT MEMORY POINTED BY 'DE'
  4441.     MVI    A,CR    ;CR
  4442.     STAX    D    ;STORE IT
  4443.     MVI    A,LF    ;LF
  4444.     INX    D    ;BUMP POINTER
  4445.     STAX    D    ;STORE LF
  4446.     INX    D    ;BUMP POINTER
  4447.     RET
  4448. ;
  4449. SPACES:
  4450.     MVI    A,20H    ;SPACE
  4451.     STAX    D
  4452.     INX    D    ;1
  4453.     STAX    D
  4454.     INX    D    ;2
  4455.     STAX    D
  4456.     INX    D    ;3
  4457.     RET
  4458. ;
  4459. NUMPRN2:
  4460.     MVI    A,'$'
  4461.     STAX    D
  4462.     MVI    C,PRINT
  4463.     LXI    D,DBUF    ;POINT TO TABLE OF NUMBERS TO PRINT
  4464.     CALL    BDOS
  4465.     CALL    CRLF
  4466.     CALL    CRLF
  4467.     POP    H
  4468.     JMP    XPRT
  4469. ;
  4470. COMPARE:
  4471.     MOV    B,M    ;COMPARES A-REG WITH LIST..
  4472. COMPLP:
  4473.     INX    H    ;..ADDRESSED BY HL. FIRST ELEMENT..
  4474.     CMP    M    ;..OF LIST MUST BE NUMBER OF ELEMENTS..
  4475.     JZ    VALID    ;..BEING COMPARED. RETURNS WITH..
  4476.     DCR    B    ;..CARRY SET IF A-REG DOES NOT..
  4477.     JNZ    COMPLP    ;.. CONTAIN AN ELEMENT IN LIST.
  4478.     STC
  4479. VALID:
  4480.     RET
  4481. ;
  4482. NXTSCRN:
  4483.     CALL    ILPRT
  4484.     DB    'HIT any KEY to CONTINUE',0
  4485. NOKEY1:    CALL    STAT    ;GET KEYBOARD STATUS
  4486.     JZ    NOKEY1    ;KEEP LOOPING UNTIL KEYPRESS
  4487.     CALL    KEYIN    ;GOBBLE UP KEYPRESS
  4488.     CPI    3    ;QUIT?
  4489.     JNZ    CLRTST
  4490.     POP    PSW    ;CLEAN RETURN ADR OFF OF STACK
  4491.     JMP    XPRT
  4492. ;
  4493. CLRTST:    LDA    SCRNTEST
  4494.     ORA    A
  4495.     JNZ    CLRSCRN
  4496. ;
  4497. LOTSALF:
  4498.     MVI    A,CR
  4499.     CALL    TYPE
  4500.     MVI    B,12
  4501.     MVI    A,LF
  4502. LFLOOP:    CALL    TYPE
  4503.     DCR    B
  4504.     JNZ    LFLOOP
  4505.     RET    
  4506. ;
  4507. CURPAR:
  4508.     CALL    CLRTST
  4509.     CALL    ILPRT
  4510.     DB    '                Current Settings',CR,LF,LF,LF,0
  4511.     LDA    CKSUMDFLT
  4512.     CALL    TOGCRC2
  4513.     LDA    LSTTST
  4514.     ORA    A
  4515.     JZ    NOLST3
  4516.     CALL    LSTMSG
  4517. NOLST3:
  4518.     CALL    SETTIM2
  4519.     CALL    TOGBKSP2
  4520.     CALL    TOGLF2
  4521.     CALL    TOGLOC2
  4522.     CALL    ILPRT
  4523.     DB    'Terminal mode file buffer is ',0
  4524.     LDA    NFILFLG
  4525.     ORA    A
  4526.     JZ    ACTIVE
  4527.     CALL    ILPRT
  4528.     DB    'in',0
  4529. ACTIVE:
  4530.     CALL    ILPRT
  4531.     DB    'active',CR,LF,'Unused portion of buffer is ',0
  4532.     CALL    GETSPC
  4533.     CALL    ILPRT
  4534.     DB    ' bytes',CR,LF,0
  4535.     CALL    XOFFMSG
  4536.     CALL    XONMSG
  4537.     CALL    SPDMSG
  4538.     CALL    CRDLYMSG
  4539.     CALL    CRLF
  4540.     JMP    XPRT
  4541. ;
  4542. GETSPC:    CALL    GETMAX
  4543.     MOV    B,A
  4544.     LHLD    HLSAVE
  4545.     STC
  4546.     CMC
  4547.     MVI    A,0
  4548.     SBB    L
  4549.     MOV    L,A
  4550.     MOV    A,B
  4551.     SBB    H
  4552.     MOV    H,A
  4553.     JMP    DECOUT
  4554. ;
  4555. ;ADJUSTS LOOP COUNTERS FOR VARIOUS CLOCK SPEEDS
  4556. ;
  4557. FIXCNT:    LDA    CLOCK
  4558.     CPI    1
  4559.     RZ
  4560.     PUSH    D
  4561.     PUSH    H
  4562.     POP    D
  4563. CNTMUL:    DAD    D
  4564.     DCR    A
  4565.     JNZ    CNTMUL
  4566.     POP    D
  4567.     RET
  4568. ;
  4569. COMPLIST:
  4570.     DB     6, 'S', 'R', 'T', 'E', 'H', 'L'
  4571. ILCOMP:
  4572.     INLNCOMP    ;A LIB MACRO
  4573. INBUFF:
  4574.     INBUF        ;A LIB MACRO
  4575. ;
  4576. ;IF ABOVE ROUTINE DOES NOT LET YOU EDIT IN A PROPER MANNER,
  4577. ;THEN THE MACRO MAY BE SUBSTITUTED FOR THE FOLLOWING ROUTINE:
  4578. ;
  4579. ;INBUFF:
  4580. ;    MVI    C,RDBUF
  4581. ;    JMP    BDOSRT    ;BUT BE CAREFUL OF CONTROL-C
  4582. ;
  4583. CPMLINE:
  4584.     CMDLINE        ;A LIB MACRO
  4585. DIRLST:
  4586.     DIRLIST        ;A LIB MACRO
  4587. SENDTIM:
  4588.     SENDTIME    ;A LIB MACRO
  4589. BAUDPRT:
  4590.     PRTBAUD        ;A LIB MACRO
  4591. NFILFLG:
  4592.     DB    FALSE    ;NORMALLY SET TO FALSE. ALLOWS WRITE TO..
  4593. ;            ;..MEMORY IN TERMINAL MODE.
  4594. OPTION:
  4595.     DB    0
  4596. ;
  4597. OPTBL    EQU    $
  4598. ;
  4599. ANSWFLG:
  4600.     DB    'A'
  4601. DISCFLG:
  4602.     DB    'D'
  4603. ORIGFLG:
  4604.     DB    'O'
  4605. QFLG:
  4606.     DB    'Q'
  4607. RSEEFLG:
  4608.     DB    'R'
  4609. SSEEFLG:
  4610.     DB    'S'
  4611. VSEEFLG:
  4612.     DB    'V'
  4613. TERMFLG:
  4614.     DB    'T'
  4615. LOCCHFLG:
  4616.     DB    'L'
  4617. EPARITY:
  4618.     DB    '0'    ;EVEN PARITY SUB-OPTION
  4619.             ;ONLY AVAILABLE IN 'S' AND 'R' MODES
  4620. OPARITY:
  4621.     DB    '1'    ;ODD PARITY SUB-OPTION
  4622.             ;ONLY AVAILABLE IN 'S' AND 'R' MODES
  4623. BATCHFLG:
  4624.     DB    'B'    ;BATCH FLAG (WHY WAS THIS DISABLED IN EARLIER VERS?)
  4625. OPTBE    EQU    $
  4626.  
  4627. RESTROPT:        ;MUST BE IN SAME ORDER AS TABLE ABOVE
  4628.     DB    'A','D','O','Q','R','S','V','T','L'
  4629.     DB    '0','1','B'
  4630. ;
  4631. ;THE NEXT 13 BYTES EQUAL THE NUMBER OF BYTES BETWEEN SECTNOB AND SECTNOE
  4632. RESTSN:
  4633.     DB    0,0,0,0,0,0
  4634.     DW    DBUF
  4635.     DB    0,0,0,0,0
  4636. ;
  4637. SECTNOB   EQU    $    ;START OF TABLE MARKER
  4638. RCVSNO:   DB    0    ;\
  4639. SECTNO:   DW    0    ; \
  4640. ERRCT:    DB    0    ;  \
  4641. ERRCDE:   DB    0    ;   \
  4642. EOFLG:    DB    0    ;    \    13 BYTES BETWEEN TABLE MARKERS
  4643. SECPTR:   DW    DBUF    ;    /
  4644. SECINBF:  DB    0    ;   /
  4645. MAXEXT:   DB    0    ;  /
  4646. RCNT:     DW    0     ; /
  4647. DATAFLG:  DB    0    ;/
  4648. SECTNOE   EQU    $    ;END OF TABLE MARKER
  4649. ;
  4650. MODCTLB:  DB    07FH
  4651. UARTFLG:  DB    TRUE
  4652. UARTCTLB: DB    ANSWMOD    ;(WAS PREVIOUSLY ORIGMOD)
  4653. SAVEFLG:  DB    FALSE
  4654. LASTBYT1: DB    0
  4655. LASTBYT2: DB    0
  4656. EXACFLG:  DB    0
  4657. ECHOFLG:  DB    FALSE
  4658. LOCFLG:      DB    FALSE
  4659. CKSUMFLG: DB    TRUE
  4660. LISTFLG:  DB    FALSE
  4661. LISTMOR:  DB    FALSE
  4662. FSTFLG:      DB    TRUE
  4663. FIRSTME:  DB    TRUE    ;FIRST SOH RECEIVED SWITCH (ZERO AFTER 1ST SOH)
  4664. EXITFLG:  DB    TRUE
  4665. HLSAVE:      DW    BOTTRAM
  4666. HLSAVE1:  DW    BOTTRAM
  4667. HLSAVE2:  DW    BOTTRAM
  4668. CMDBUF:      DB    80H,0
  4669.       DS    80H
  4670. DISKNO:      DS    1
  4671. DISKSAV:  DS    1
  4672. SAVUSR:  DS    1
  4673. SENDFLG:  DS    1
  4674. NBSAVE:      DS    2
  4675. BGNMS:      DS    2
  4676. FILECT:      DS    1
  4677. NAMECT:      DS    1
  4678. ORIGSAV:  DS    1
  4679. FTYCNT:      DS    1
  4680.           DS    100
  4681. STACK:      DS    2
  4682. FCB3:      DS    33
  4683. FCB4:      DS    33
  4684. FCBBUF:      DS    15
  4685. DBUF      EQU    $    
  4686. NAMEBUF      EQU    DBUF+(DBUFSIZ*1024)    ;BUFFER FOR NAMES IN BATCH MODE.
  4687. ;                    ;OVERFLOWS ABOVE PROGRAM CODE.
  4688. ;
  4689. ;    BDOS EQUATES
  4690. ;
  4691. RDCON    EQU    1
  4692. WRCON    EQU    2
  4693. LSTOUT    EQU    5
  4694. PRINT    EQU    9
  4695. RDBUF    EQU    10
  4696. CONST    EQU    11
  4697. RESET    EQU    13
  4698. SELDSK    EQU    14
  4699. OPEN    EQU    15
  4700. CLOSE    EQU    16
  4701. SRCHF    EQU    17
  4702. SRCHN    EQU    18
  4703. ERASE    EQU    19
  4704. READ    EQU    20
  4705. WRITE    EQU    21
  4706. MAKE    EQU    22
  4707. REN    EQU    23
  4708. CURDSK    EQU    25
  4709. STDMA    EQU    26
  4710. USER    EQU    32
  4711. FILSIZ    EQU    35
  4712. BDOS    EQU    5
  4713. REIPL    EQU    0
  4714. FCB    EQU    5CH
  4715. FCBEXT    EQU    FCB+12
  4716. FCBSNO    EQU    FCB+32
  4717. FCBRNO    EQU    FCB+32
  4718. FCB2    EQU    6CH
  4719. ;
  4720. LAST    END    100H
  4721.