home *** CD-ROM | disk | FTP | other *** search
/ CP/M / CPM_CDROM.iso / simtel / sigm / vols000 / vol084 / bye72g.asm < prev    next >
Assembly Source File  |  1984-04-29  |  49KB  |  2,108 lines

  1.     TITLE    'BYE Vers 7.2G of August 8, 1982'
  2. ;
  3. VER    EQU    72    ;Current version number
  4. REV    EQU    'G'    ;Current sub revsion
  5. DAY    EQU    8    ;Day of the month in range 1 to 31
  6. MONTH    EQU    8    ;Month of the year in range 1 to 12
  7. YEARS    EQU    82    ;Year in range 00 to 99
  8. ;
  9. ;    Last minor change August 8, 1982
  10. ;
  11. ;        BYE V7.2G (revised 08/8/82)
  12. ;    REMOTE CONSOLE PROGRAM FOR CP/M AND MODEM
  13. ;
  14. ;This program allows modem callers to use your CP/M system
  15. ;just as if they were seated at the system console.  Special
  16. ;assembly-time options allow limiting the caller's access by
  17. ;password and/or access to only a message-service program.
  18. ;
  19. ;Based on an original program written by Dave Jaffe, January 1979
  20. ;Rewritten for PMMI modem by Ward Christensen, February 1979.
  21. ;Be sure to set the equates for the modem
  22. ;you are using.
  23. ;
  24. ;Thanks to Bill Precht for the "label + offset" idea allowing
  25. ;this program to relocate itself without using DDT to initially
  26. ;set it up.
  27. ;
  28. ;Adapted for Telecom Australia Auto answer modem
  29. ;operation with 2651 based UART interface. April, 1982
  30. ;
  31. ;Bill Bolton,
  32. ;Software Tools,
  33. ;P.O. Box 80,
  34. ;Newport Beach,
  35. ;NSW, 2106,
  36. ;Australia.
  37. ;
  38. ;Modifications/fixes: (in reverse order to minimize reading time)
  39. ;
  40. ;08/Aug/82 Added code to reset mode of 2651 UART before each new call.
  41. ;       This will force a reseting of the baud rate etc., in case
  42. ;       it got glitched. Also added date and version equates for
  43. ;       signon message to make maintenance easier. Ver 7.2G <WFB>
  44. ;
  45. ;25/Jun/82 Added conditional code to trap RST 7 and jump to a
  46. ;       Warm Boot. Ver 7.2F <WFB>
  47. ;
  48. ;18/Jun/82 Added code to clear tx register of the UART after
  49. ;       each carrier loss. With CCITT direct connect modems
  50. ;       CTS goes inactive simultaneously with Carrier detect.
  51. ;       On the 2651 UART, CTS inactive clamps the transmitter
  52. ;       even if its in the middle of a character.
  53. ;       If carrier was permanently lost in the middle of a
  54. ;       character, this would sometimes clamp the 2651
  55. ;          transmitter in a "space" condition. The next caller would
  56. ;       get "ANSWER" carrier offset to the "space" and some modems
  57. ;       don't carrier detect on that, therefore CD and CTS never went
  58. ;       active and never unclamped the transmitter (round and round
  59. ;       in ever decreasing circles until it....). Ver 7.2E <WFB>
  60. ;       
  61. ;16/Jun/82 Added conditional code for "flip" to answer mode after
  62. ;       upper case question. Ver 7.2D <WFB>
  63. ;
  64. ;11/Jun/82 Added code to protect current state of frequency mode
  65. ;       bit in command byte of UART during error reset and also
  66. ;       added a few more UART equates. Ver 7.2C <WFB>
  67. ;
  68. ;25/May/82 Added ring detect to carrier timeout loop enable full
  69. ;       carrier detect period after answering a new call and to
  70. ;       prevent hanging up on new call as soon as it is answered
  71. ;       if it arrived at the end of a timeout period. Added
  72. ;       CTIME equate for carrier timeout period. Ver 7.2B <WFB>
  73. ;
  74. ;24/May/82 Added correct error reset code for 2651 to overcome
  75. ;       the system sending data but refusing to accept data from
  76. ;       modem. Many comments tabbed over to constant column
  77. ;       position. Carrier dropout counter added to detect
  78. ;       Telecom "open line" beep which occurs if remote user
  79. ;       hangs up or line drops out. Telecom modems detect this
  80. ;       as intermitant carrier and otherwise BYE will never
  81. ;       time out. Ver 7.2A <WFB>
  82. ;    
  83. ; 6/Apr/82 Deleted DC Hayes and PMMI routines and replaced
  84. ;       with general purpose UART interface to control Telecom
  85. ;       auto answer modem. Deleted CPM2 switch, now permanently
  86. ;       set for CPM2. UART may be banked type. Deleted ringback
  87. ;       code. <WFB>
  88. ;
  89. ;11/Oct/81 Print password on local console with DUAL$IO. Allow
  90. ;      return from PRNLOG with USRLOG. Make <CR><LF> instead
  91. ;      of <LF><CR> in USRLOG reports. Print out BYE version
  92. ;      number for easy identification. Position PRNLOG after
  93. ;      cold boot routine, and change cold boot routine to
  94. ;      jump to MBOOT, thereby defining path to PRNLOG for
  95. ;      all BYE programs and allowing one trivial program
  96. ;      that can be run to get the BYE log. Make counters
  97. ;      16 bits for greater range. By Steve Bogolub
  98. ;
  99. ;1/Oct/81 Added CALL CHECK to MSTAT routine to eliminate
  100. ;      possibility of system crash when carrier lost while
  101. ;      performing repeated console status checks without
  102. ;      any console output.  This problem occurs during the
  103. ;      password input of USERPW.ASM, and potentially any other
  104. ;      program that does repeated direct console input, such
  105. ;      as MBASIC, etc.  
  106. ;      By Ron Fowler and Dave Hardy
  107. ;
  108. ;14/May/81 Added CCS disk support (to turn off disks when idle)
  109. ;      Added support for Godbout SS1 Real time clock.
  110. ;      Added Phone to Lister, Punch & Reader patch. (AAJ)
  111. ;
  112. ;20/Mar/81 Fixed MOUTPUT so parity bit is stripped before outputting
  113. ;      character to modem.  Corrected 3/18/81 null fix.  Added
  114. ;      additional description to heading of this file.  (KBP)
  115. ;
  116. ;18/Mar/81 Add first-ring debounce routine, change PMMI HANGUP
  117. ;      to do break for faster disconnect, fix error in P3TODTR
  118. ;      equate for PMMI, added end-of-program error message to
  119. ;      mark ending address (see note at label DEST). By KBP.
  120. ;      Fix bug that prevented nulls at end of line if DUAL$IO
  121. ;      was true.  By Hank Szyszka.
  122. ;
  123. ;23/Feb/81 Conditional assembly added for Intertec SuperBrain
  124. ;      with Racal-Vadic 3451 modem. Corrected lack of RET in
  125. ;      CONIN. In MOUTPUT, replaced CZ CHECK with JNZ SILENT,
  126. ;      CALL CHECK; this eliminates chance of looping in MOUTPUT
  127. ;      if modem doesn't empty USART after carrier lost.
  128. ;      Also had to write a routine to patch BIOS so that after
  129. ;      the warm boot disk read this program repatches the BIOS.
  130. ;      Apparently the SuperBrain warm boot overwrites a portion
  131. ;      of the BIOS. By P.L. Kelley
  132. ;
  133. ;17/Feb/81 Added check for extraneous control characters in
  134. ;       hardcopy log.  (Formfeed seems to be a common "hit").
  135. ;       Changed local startup test to directly test for carrier
  136. ;       instead of calling CARCK, to avoid 15 second delay.
  137. ;       <BRR>
  138. ;
  139. ;15/Feb/81 Removed dependance on DC Hayes hardware timer so that
  140. ;          DCHAYES conditional assembly is compatible with both
  141. ;          old-style 80-103A and new-style MM100 boards.
  142. ;          Rearranged patch list to "most recent first" order.
  143. ;       Added message for invalid-drive test.
  144. ;          Added ANI 7Fh to upper case conversion test so that
  145. ;          it's not fooled by bit 7 being set.
  146. ;          Added WELUSR equate for user # containing WELCOME file.
  147. ;          Removed PTRPORT equate and changed hardcopy logic to
  148. ;          work through the BIOS printer driver. <BRR>
  149. ;
  150. ;22/Jan/81 CHANGED CARRIER DETECT ROUTINE FOR DC HAYES TO WAIT FOR
  151. ;       15 SECONDS AFTER LOSS OF CARRIER TO RETURN.  <DAVID KOZINN>
  152. ;
  153. ;17/Jan/81 CHANGED TIMING LOOPS TO USE DC HAYES HARDWARE TIMER
  154. ;       IF PRESENT.   <DAVID KOZINN>
  155. ;
  156. ;16/Jan/81 ADDED EQUATES AND CODE FOR THE DC-HAYES 
  157. ;       MICROMODEM 100.  <DAVID KOZINN>
  158. ;
  159. ;23/Sep/80 Fixed bugs that prevented "bye /a" and "bye /c" from
  160. ;      working properly.  Also repaired several errors in
  161. ;      conditional assembly nesting. -->Ron Fowler
  162. ;
  163. ;20/Sep/80 Modified status checking during ring-wait routine to
  164. ;      use cp/m BDOS call, as suggested by Keith Petersen.
  165. ;      This should make the program more portable.  Also
  166. ;      added Bruce Ratoff's update to DCHBYE program (5.5),
  167. ;      that allows the use of bye from non-zero user areas.
  168. ;      By Ron Fowler
  169. ;
  170. ;19/Sep/80 Modified COM file load routine to prevent BDOS
  171. ;      overwrite if the COM file won't fit in the TPA
  172. ;      By Ron Fowler
  173. ;
  174. ;19/Sep/80 Added new '/' option C, which has the same affect as
  175. ;      /A, except that /C loads the com file after answering
  176. ;      the phone, while /A boots cp/m.
  177. ;      By Ron Fowler
  178. ;
  179. ;19/Sep/80 Added conditional assembly to give the operator a
  180. ;      'twit' logout key. Added conditionals for 'message
  181. ;      from operator' and 'system down in 5 minutes' keys.
  182. ;      Added front-panel selection of hard-copy log, remote
  183. ;      'black-out', and password option.  Also, if cpm/2 is
  184. ;      used, a message is printed when an unsupported user
  185. ;      area is entered.
  186. ;      By Ron Fowler and Dave Hardy
  187. ;
  188. ;19/Sep/80 Modified to prevent re-load of the com file when
  189. ;      a voice call comes in.  Reset the DMA address back
  190. ;      to 80h after the com file is loaded.
  191. ;      By Ron Fowler
  192. ;
  193. ;16/Sep/80 Added conditional assembly to allow automatic
  194. ;      loading of a com file instead of cp/m boot. Also
  195. ;      added decimal usrlog counters as conditional as-
  196. ;      sembly.
  197. ;      By Ron Fowler
  198. ;
  199. ;15/Sep/80 Added conditional assembly for automatic timed
  200. ;      log-out, drive and user number masking, lower
  201. ;      case query at login, and cp/m 2.x.  Thanks to
  202. ;      Bruce Ratoff for the routines (lifted from his
  203. ;      'DCHBYE54.ASM') used to implement these functions
  204. ;      NOTE: in order to implement the timed log-out, it
  205. ;      was necessary to do timing in software loops.
  206. ;      Therefore, a new equate, FASTCLK, has been added
  207. ;      to allow for 4mhz clock speeds. Also added Bruce
  208. ;      Ratoff's overrun/framing error checking when read-
  209. ;      ing the modem port.
  210. ;      By Ron Fowler
  211. ;
  212. ;16/Jul/80 Added "/R" command option to allow USRLOG
  213. ;      counters to be reset upon entry.
  214. ;      By Dave Hardy
  215. ;
  216. ;11/Jul/80 Added conditional assembly for password and
  217. ;      user log routines, and routines to print USRLOG
  218. ;      information on console after program exit.
  219. ;      By Dave Hardy
  220. ;
  221. ;10/Jul/80 Added code to allow auto-answer after first
  222. ;      or second ring for more reliable auto-answer
  223. ;      when using "ringback" option.
  224. ;      By Dave Hardy
  225. ;
  226. ;29/Jun/80 Added USRLOG routines to keep track of number
  227. ;      of callers, and display on front panel
  228. ;      of IMSAI (i.e. output number to port FFH).
  229. ;      By Dave Hardy
  230. ;
  231. ;11/Jun/80 Added 710 Baud rate selection option at sign-on.
  232. ;      By Dave Hardy and Bruce Levison.
  233. ;
  234. ;11/Jun/80 Added routines to allow conditional assembly for
  235. ;      Morrow's Discus 2D board (all Rev's) with memory
  236. ;      mapped I/O.
  237. ;      By Dave Hardy
  238. ;
  239. ;24/Jan/80 Added routines to preserve registers when calling
  240. ;      the user's CBIOS.  Added conditional assembly for
  241. ;      callback feature.  Increased stack space to 60.
  242. ;      By Keith Petersen.
  243. ;
  244. ;24/Sep/79 Added routines to allow automatic multiple baud
  245. ;      rate selection, exit to CP/M from local console,
  246. ;      echo nr. of nulls selected. By Keith Petersen,
  247. ;      with thanks to Bob Mathias for suggestions.
  248. ;
  249. ;6/Jul/79 Added routine to allow "callback" operation so modem
  250. ;      does not answer normal voice calls.  By Robbin Hough
  251. ;      and Keith Petersen, W8SDZ.
  252. ;
  253. ;
  254. ;------------------------------------------------
  255. ;    SYSTEM EQUATES
  256. FALSE    EQU    0
  257. TRUE    EQU    NOT FALSE
  258. BDOS    EQU    5
  259. CR    EQU    0DH
  260. LF    EQU    0AH
  261. MINUTES    EQU    20*60    ;CONSTANT FOR 1 MIN TIM DLY
  262. ;
  263. ;CHANGE THE FOLLOWING EQUATE TO AN AREA IN YOUR
  264. ;HI MEMORY WHERE THIS PROGRAM MAY PATCH ITSELF IN.
  265. ;APPROX MEMORY REQUIREMENTS: UP TO xxxx BYTES.
  266. ;
  267. DEST    EQU    0F400H    ;RUNNING LOCATION OF CODE
  268. ;
  269. ;YOU WILL LIKELY ALSO WANT TO CHANGE THE PASSWORD,
  270. ;LOCATED BELOW AT LABEL "PASSWD", AND THE MESSAGES
  271. ;PRINTED AT LABEL "WELCOME" AND JUST ABOVE LABEL
  272. ;"HANGUP"
  273. ;
  274. ;------------------------------------------------
  275. ;
  276. ;THIS PROGRAM RUNS UP IN HIGH RAM.  IT GETS THERE
  277. ;BY BEING MOVED THERE WHEN 'BYE' IS TYPED.
  278. ;
  279. ;THE PROGRAM IN HI RAM DOES THE FOLLOWING:
  280. ;
  281. ;    1.    HANGS UP THE PHONE
  282. ;    2.    AWAITS RING DETECT, ALLOWS EXIT
  283. ;        TO CP/M IF LOCAL KBD TYPES CTL-C
  284. ;    3.    OUTPUTS CARRIER
  285. ;    4.    AWAITS INCOMING CARRIER
  286. ;        GOING TO STEP 1 IF NONE
  287. ;        FOUND IN 25 SECONDS
  288. ;    5.    ASKS NUMBER OF NULLS (0-9)
  289. ;    6.    TYPES THE FILE "STARTUP" FROM
  290. ;        DISK, ALLOWING CTL-C TO SKIP IT
  291. ;    7.    OPTIONALLY ASKS FOR A PASSWORD, ALLOWING
  292. ;        5 TRIES TO GET IT RIGHT.
  293. ;    8.    WHEN PASSWORD ENTERED, IF USED, DROPS
  294. ;        INTO CP/M.
  295. ;    9.    CALLER CAN LEAVE BY HANGING UP,
  296. ;        (ANY TIME CARRIER IS LOST, IT
  297. ;        WAITS 25 SECONDS, THEN GOES
  298. ;        BACK TO STEP 1), OR THE CALLER
  299. ;        MAY TYPE THE PROGRAM NAME (BYE)
  300. ;
  301. ;
  302. ;****************************************************
  303. ;*        OPTION CONFIGURATION SECTION        *
  304. ;****************************************************
  305. ;
  306. PRINTER EQU    FALSE    ;WANT TO RETAIN LIST DEVICE?
  307. DUAL$IO EQU    TRUE    ;WANT CONSOLE & MODEM?
  308. CALLBAK EQU    FALSE    ;WANT CALLBACK FEATURE?
  309. PWRQD    EQU    FALSE    ;WANT TO USE PASSWORD?
  310. USRLOG    EQU    TRUE    ;WANT TO COUNT NUMBER OF USERS?
  311. IMSAI    EQU    FALSE     ;ADDS VARIOUS OPIONS W/SENSE SW'S
  312. MAX$USER EQU    0    ;SET TO 0 FOR CP/M 1.X
  313. MAX$DRIVE EQU    3    ;HIGHEST DRIVE SUPPORTED
  314. SPEED    EQU    4    ;Speed in Mhz of CPU (for timing loops)
  315. TIMEOUT EQU    TRUE    ;WANT AUTO LOG-OFF FOR SLEEPY CALLERS?
  316. TOVALUE EQU    5    ;THIS IS 7 MINUTES TO AUTO LOGOUT
  317. CTIME    EQU    25    ;Number of seconds for carrier timeout (25 max)
  318. MAXDROP    EQU    50    ;Maximum number of allowable carrier losses
  319. WELUSR    EQU    0    ;USER # THAT WELCOME FILE IS KEPT IN
  320. COMFILE EQU    TRUE    ;WANT TO AUTOBOOT A COM FILE?
  321. COMUSR    EQU    0    ;USER # THAT COMFILE IS KEPT IN
  322. DECIMAL EQU    TRUE    ;WANT DECIMAL VALUES FOR LOGS?
  323. CK$LWC    EQU    TRUE    ;WANT TO TRAP LOWER CASE?
  324. RTC    EQU    TRUE    ;True if Godbout System Support 1
  325. MOTOR    EQU    TRUE    ;True for motor control of drives
  326. INTER3    EQU    FALSE    ;True for Gobout Interfacer 3/4 I/O board
  327. FLIP    EQU    TRUE    ;Want to swap modem mode?
  328. RETIME    EQU    6    ;Time for remote modem to detect new carrier 
  329. RESTART    EQU    TRUE    ;True for trapping one RST vector
  330. RSVECT    EQU    038H    ;Address of restart vector to patch
  331. ;
  332. ;
  333.     if    motor
  334. DISKON    EQU    0H    ;Turn drive motor on for YE-180
  335. DISKOFF    EQU    80H    ;Turn drive motor off for YE-180
  336. DISK    EQU    0C3H    ;For Godbout Disk 1
  337.     endif    ;motor
  338. ;
  339. ; SPECIAL KEYS FOR SPECIAL FUNCTIONS
  340. ;
  341. FKEYS    EQU    TRUE    ;WANT SPECIAL FUNCTION KEYS?
  342. ;
  343. ;ASSIGN FUNCTION KEYS TO THE FOLLOWING CONTROL CODES (IF USED):
  344. ;
  345. TWITKEY EQU    'N'-40H ;KEYCODE TO LOG-OUT A CREEP
  346. MSGKEY    EQU    'Q'-40H ;KEYCODE TO PRINT 'MESG FROM OPER:'
  347. SYSDKEY EQU    'O'-40H ;KEYCODE TO PRINT SYS DOWN MSG
  348. ;
  349. ;    FRONT-PANEL SELECTION OPTIONS
  350. ;
  351. SENSE    EQU    0FFH    ;SENSE SWITCH PORT NUMBER
  352. ;
  353. BLACKOUT EQU    TRUE    ;SWITCH TO TURN OFF REMOTE SEND
  354. HARDLOG EQU    TRUE    ;SWITCH TO ECHO REMOTE KBD TO PRINTER
  355. SELPASS EQU    TRUE     ;SWITCH TO REQUIRE A PASSWORD
  356. ;
  357. ;    ASSIGNMENT OF FRONT-PANEL OPTIONS TO SWITCHES:
  358. ;
  359. LOGSW    EQU    01H    ;TURN ON FOR HARDCOPY
  360. PWDSW    EQU    02H    ;TURN ON FOR 'PASSWORD' MODE
  361. BLACKSW EQU    04H    ;TURN ON TO BLACK OUT REMOTE END
  362. ENABLF    EQU    08H    ;TURN ON TO ENABLE SPL FUNC KEYS
  363. ;
  364. ;****************************************************
  365. ;*     END OF OPTION CONFIGURATION SECTION        *
  366. ;****************************************************
  367. ;
  368. ;ALL MODEM I/O AND CONTROL ARE HERE.
  369. ;
  370. ;************************************************
  371. ;*                        *
  372. ;*         2651 Baud Rate Table        *
  373. ;*                        *
  374. ;************************************************
  375. ;
  376. B50    EQU    0000B            ;50 bps
  377. B75    EQU    0001B            ;75 bps
  378. B110    EQU    0010B            ;110 bps
  379. B134    EQU    0011B            ;134.5 bps
  380. B150    EQU    0100B            ;150 bps
  381. B300    EQU    0101B            ;300 bps
  382. B600    EQU    0110B            ;600 bps
  383. B1200    EQU    0111B            ;1200 bps
  384. B1800    EQU    1000B            ;1800 bps
  385. B2000    EQU    1001B            ;2000 bps
  386. B2400    EQU    1010B            ;2400 bps
  387. B3600    EQU    1011B            ;3600 bps
  388. B4800    EQU    1100B            ;4800 bps
  389. B7200    EQU    1101B            ;7200 bps
  390. B9600    EQU    1110B            ;9600 bps
  391. B19200    EQU    1111B            ;19200 bps
  392.  
  393. ;************************************************
  394. ;*                        *
  395. ;*        2651 Equates            *
  396. ;*                        *
  397. ;************************************************
  398. ;
  399. BASE    EQU    5CH    ;Interfacer 3 base port
  400. DATA    EQU    BASE    ;2651 data port
  401. STATUS    EQU    BASE+1    ;2651 status port
  402. MODE    EQU    BASE+2    ;2651 mode port
  403. CMMD    EQU    BASE+3    ;2651 command port
  404.  
  405.     if    inter3
  406. USER    EQU    BASE+7H    ;UART select port
  407. CONS    EQU    0    ;Console relative UART
  408. MODEM    EQU    6    ;Modem relative UART
  409.     endif    ;inter3
  410.  
  411. ;
  412. MODE1    EQU    01101110B        ;Asynch,16x,8 data bits,
  413.                     ; no parity, even, 1 stop bit
  414. MODE2    EQU    01110000B + B300    ;Baud rate
  415. CMMDB    EQU    00100111B        ;Tx enabled, RX enabled, no break
  416.                     ; DTR high, RTS high
  417. ;
  418. ; Status bits
  419. ;
  420. GBTBMT    equ    00000001b    ;Transmit buffer empty
  421. GBDAV    equ    00000010b    ;Data available
  422. GBTXE    equ    00000100b    ;Transmit shift reg empty
  423. GBPE    equ    00001000b    ;Parity error
  424. GBOE    equ    00010000b    ;Overrun error
  425. GBFE    equ    00100000b    ;Framing error
  426. GBCD    equ    01000000b    ;RS 232 Carrier Detect input
  427. GBDSR    equ    10000000b    ;RS 232 Data Set Ready input
  428. RING    EQU    GBDSR        ;Ring detect input
  429. ;
  430. ; Control bits
  431. ;
  432. GBTXEN    equ    00000001b    ;Transmitter enable
  433. GBDTR    equ    00000010b    ;DTR (CCITT 108) control
  434. GBRXEN    equ    00000100b    ;Receiver enable
  435. GBREAK    equ    00001000b    ;Send break
  436. ERESET    equ    00010000b    ;Error reset
  437. GBRTS    equ    00100000b    ;RTS control (used as mode select)
  438. ;
  439. ;
  440.     ORG    100H
  441. ;
  442. ;MOVE THE MODEM INTERFACE PROGRAM UP TO HI RAM
  443. ;AND JUMP TO IT.
  444. ;
  445. MOVEUP    LXI    B,PEND-START+1    ;NUMBER OF BYTES TO MOVE
  446.     LXI    H,DEST+PEND-START+1 ;END OF MOVED CODE
  447.     LXI    D,SOURCE+PEND-START    ;END OF SOURCE CODE
  448. MVLP    LDAX    D        ;GET BYTE
  449.     DCX    H        ;BUMP POINTERS
  450.     MOV    M,A        ;NEW HOME
  451.     DCX    D
  452.     DCX    B        ;BUMP BYTE COUNT
  453.     MOV    A,B        ;CHECK IF ZERO
  454.     ORA    C
  455.     JNZ    MVLP        ;IF NOT, DO SOME MORE
  456.  
  457.     PUSH    H        ;SAVE FOR LATER JUMP
  458.     MVI    A,0C3H        ;CLEAR ANY TRAPS SO SYSOP..
  459.     STA    0        ;CAN USER "BYE /A"
  460.     XRA    A        ;NEXT WARMBOOT TO USR0/DRV A
  461.     STA    4
  462.     MVI    C,14        ;MAKE DRIVE A DEFAULT
  463.     MOV    E,A        ;LOG-IN DRIVE CP/M FUNCTION
  464.     CALL    BDOS
  465.     MVI    C,32        ;GET/SET USR CP/M FUNCTION
  466.     MVI    E,WELUSR
  467.     CALL    BDOS
  468.     RET            ;TO ADRS PUSHED ABOVE
  469. ;
  470. VMSG:    DB    'BYE version '
  471.     DB    VER/10 + '0','.',(VER MOD 10) + '0',REV
  472.     DB    ' of '
  473.     if    month = 1
  474.     DB    'January'
  475.     endif
  476.     if    month = 2
  477.     DB    'February'
  478.     endif
  479.     if    month = 3
  480.     DB    'March'
  481.     endif
  482.     if    month = 4
  483.     DB    'April'
  484.     endif
  485.     if    month = 5
  486.     DB    'May'
  487.     endif
  488.     if    month = 6
  489.     DB    'June'
  490.     endif
  491.     if    month = 7
  492.     DB    'July'
  493.     endif
  494.     if    month = 8
  495.     DB    'August'
  496.     endif
  497.     if    month = 9
  498.     DB    'September'
  499.     endif
  500.     if    month = 10
  501.     DB    'October'
  502.     endif
  503.     if    month = 11
  504.     DB    'November'
  505.     endif
  506.     if    month = 12
  507.     DB    'December'
  508.     endif
  509.  
  510.     DB    ' ',DAY/10 +'0',(DAY MOD 10) + '0'
  511.     DB    ', 19',YEARS/10 + '0', (YEARS MOD 10) + '0',CR,LF,'$'
  512. ;
  513. SOURCE    EQU    $    ;BOUNDARY MEMORY MARKER
  514. ;
  515. OFFSET    EQU    DEST-SOURCE ;RELOC AMOUNT
  516. ;-----------------------------------------------;
  517. ;    THE FOLLOWING CODE GETS MOVED        ;
  518. ;     TO HI RAM LOCATED AT "DEST",        ;
  519. ;        WHERE IT IS EXECUTED.        ;
  520. ;-----------------------------------------------;
  521. ;XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
  522. ;XX   C A U T I O N :  IF MODIFYING ANYTHING    XX
  523. ;XX    IN THIS PROGRAM FROM HERE ON:        XX
  524. ;XX    A-L-L  LABELS MUST BE OF THE FORM:    XX
  525. ;XX    label    EQU    $+OFFSET        XX
  526. ;XX    IN ORDER THAT THE RELOCATION TO HI RAM    XX
  527. ;XX    WORK SUCCESSFULLY.  FORGETTING TO    XX
  528. ;XX    SPECIFY '$+OFFSET' WILL CAUSE THE PRO-    XX
  529. ;XX    GRAM TO JMP INTO WHATEVER IS CURRENTLY    XX
  530. ;XX    IN LOW MEMORY, WITH UNPREDICTABLE    XX
  531. ;XX    RESULTS.  BE CAREFUL....        XX
  532. ;XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
  533. ;
  534. ;    IF CARRIER LOST, HANG UP, AWAIT RING.
  535. ;    OTHERWISE, SAY GOODBYE, AND HANG UP
  536. ;
  537. START    EQU    $+OFFSET
  538. ;
  539.     XRA    A    ;GET 0
  540.     STA    LOSTFLG ;SHOW NO CARR. LOST
  541. ;
  542. ;    DON'T ALLOW A REMOTE USER TO DO 'BYE /A'
  543. ;
  544.     if    inter3
  545.     mvi    a,modem
  546.     out    user    ;Select modem UART
  547.     endif    ;inter3
  548.  
  549.     IN    STATUS
  550.     ANI    GBCD    ;Carrier?
  551.     JNZ    GOODBY    ;Yes, remote user so say goodbye
  552.  
  553. ;
  554. ;Indentify version of program
  555. ;
  556.     mvi    c,printf
  557.     lxi    d,vmsg
  558.     call    bdos
  559. ;
  560. ;CHECK FOR /A OPTION ON COMMAND - REQUEST TO
  561. ;GO IMMEDIATELY INTO ANSWER MODE
  562. ;
  563.     LXI    H,FCB+1        ;TO OPTION
  564.     MOV    A,M
  565.     CPI    '/'        ;OPTION?
  566.     JNZ    HANGUP
  567. ;GOT AN OPTION - VALIDATE IT
  568.     INX    H        ;TO OPTION BYTE
  569.     MOV    A,M        ;GET IT
  570.     STA    OPTION        ;MIGHT NEED LATER
  571.     CPI    'A'        ;ANSWER?
  572.     JZ    ANSWER
  573.  
  574.     if    comfile
  575.     CPI    'C'
  576.     JZ    ANSWER
  577.     endif    ;comfile
  578.  
  579.     if    usrlog        ;CHECK FOR RESET OF COUNTERS
  580.     CPI    'R'
  581.     CZ    RESET
  582.     endif    ;usrlog
  583.  
  584.     JMP    HANGUP        ;WE KNOW IT'S LOCAL, SO SKIP CALL TO CARCK
  585.  
  586. ;NO OPTION, OR INVALID ONE
  587. NOSLASH EQU    $+OFFSET
  588.     CALL    CARCK        ;SIGNED OFF W/THIS PROG?
  589.     JC    HANGUP        ;NOBODY THERE
  590. ;
  591. GOODBY    EQU    $+OFFSET
  592.     CALL    ILPRT        ;PRINT THIS MSG:
  593. ;
  594.     DB    CR,LF,'GOOD BYE, CALL AGAIN'
  595. ;
  596.     if    rtc
  597. ;
  598.     db    CR,LF,CR,LF,'Off at ',0
  599. ;
  600.     call    time
  601.     call    ilprt
  602.     endif    ;RTC
  603. ;
  604.     DB    CR,LF,0
  605. ;
  606.     CALL    UNPATCH ;UNDO BIOS PATCHES
  607. ;
  608. ;    NOBODY THERE, OR WE ARE DONE, SO HANG UP
  609. ;
  610. HANGUP    EQU    $+OFFSET
  611.     LXI    SP,STACK    ;SET UP LOCAL STACK
  612.     XRA    A         ;FORCE NEXT WARMBOOT TO USER 0
  613.     STA    4         ;AND DRIVE A
  614.     MVI    C,14         ;MAKE DRIVE A DEFAULT
  615.     MOV    E,A
  616.     CALL    BDOS
  617.     MVI    A,' '        ;DON'T ALLOW OPTIONS..
  618.     STA    OPTION        ;..AFTER 1 "BYE / <ANYTHING>"
  619.  
  620.     if    comfile
  621.     MVI    C,32        ;GET/SET USER CODE
  622.     MVI    E,COMUSR    ;LOCATION OF OUR COMFILE
  623.     CALL    BDOS
  624.     CALL    LODCOM        ;LOAD THE COM FILE
  625.     endif    ;comfile
  626.  
  627.     if    restart
  628.     MVI    A,0C3H        ;Set up restart 7 trap
  629.     STA    RSVECT        ; to do a warm boot
  630.     XRA    A
  631.     STA    RSVECT+1
  632.     STA    RSVECT+2
  633.     endif    ;restart
  634. ;
  635. ;
  636. HANGUP2    EQU    $+OFFSET
  637. ;
  638.  
  639.     if    motor
  640.     CALL    DSKOFF
  641.     endif    ;motor
  642.  
  643. ;CLEAR DTR CAUSING PHONE TO HANG UP AND RESET BAUD
  644. ;RATE ON USART IN CASE IT GOT CHANGED
  645.  
  646.     if    inter3
  647.     mvi    a,modem
  648.     out    user        ;Select modem UART
  649.     endif    ;inter3
  650.  
  651.     MVI    A,MODE1
  652.     OUT    MODE
  653.     MVI    A,MODE2
  654.     OUT    MODE
  655.     MVI    A,GBRTS        ;Turn off DTR, Tx and Rx enable, break,
  656.     OUT    CMMD        ; reset and test modes (but not RTS)
  657.     push    b
  658.     mvi    b,10        ;1 second delay
  659.  
  660. OFFTI    EQU    $+OFFSET
  661.     call    delay
  662.     dcr    b
  663.     jnz    offti
  664.     pop    b
  665.     mvi    a,cmmdb        ;Enable Tx, Rx, DTR, RTS
  666.     out    cmmd
  667.     MVI    A,0C3H        ;CLEAR ANY TRAPS..
  668.     STA    0        ;..LEFT FROM COM FILE
  669.     XRA    A
  670.     STA    DROPOUT        ;Initialise count of carrier losses
  671. ;
  672. ;    AWAIT RINGING
  673. ;
  674. ;CHECK LOCAL KEYBOARD FOR CTL-C EXIT REQUEST.
  675. ;NOTE: MUST DO DIRECT INPUT BECAUSE CBIOS PATCHES
  676. ;ARE NOT DONE UNTIL CALL COMES IN.
  677. ;
  678. RINGWT    EQU    $+OFFSET
  679.     CALL    UCSTS
  680.     ANI    7FH        ;STRIP PARITY BIT
  681.     CPI    'C'-40H        ;CONTROL C?
  682.  
  683.     if    motor
  684.     CZ    DSKON
  685.     endif    ;motor
  686.  
  687.     if    NOT USRLOG
  688.     JZ    0        ;YES, --EXIT-- TO CP/M
  689.     endif    ;NOT USRLOG
  690. ;
  691.     if    USRLOG        ;PRINT OUT USER INFO
  692.     cz    usrchk
  693.     endif    ;USRLOG
  694. ;
  695. ;SETUP MODEM
  696. ;
  697. ANSWER    EQU    $+OFFSET
  698.     if    usrlog        ;COUNT # OF LOGON ATTEMPTS
  699.     LXI    h,OLDUSR    ;GET # OF ATTEPMTS
  700.     call    boplog        ;ADD THIS CALL
  701.     endif    ;usrlog
  702.  
  703.     if    inter3
  704.     mvi    a,modem
  705.     out    user        ;Select modem UART
  706.     endif    ;inter3
  707.  
  708.     MVI    A,CMMDB        ;TURN ON
  709.     OUT    CMMD        ;..DTR
  710.     CALL    DELAY        ;GIVE TIME FOR ANSWER
  711.     CALL    UCSTS        ;CLEAR LOCAL CONSOLE
  712.     IN    DATA        ;CLEAR MODEM PORT
  713.     CALL    MRESET        ;Reset any modem UART errors
  714.     CALL    CARCK        ;LOOK FOR CARRIER
  715.     JC    HANGUP2        ;Not found
  716.     CALL    PATCH        ;PATCH JMP TABLE
  717.     JMP    WELCOME
  718. ;
  719. ;    Get the console status when unpatched
  720. ;
  721. UCSTS    EQU    $+OFFSET
  722.     MVI    C,DIRECTIO    ;DIRECT I/O CALL WILL RETURN
  723.     MVI    E,0FFH        ;ASK FOR INPUT
  724.     CALL    BDOS           ;A=0 IF NO CHAR WAITING
  725.     RET
  726. ;
  727. ;
  728. ;FOLLOWING ARE THE USRLOG ROUTINES
  729. ;
  730.     if    usrlog        ;INCLUDE RESET FUNCTIONS
  731. RESET    EQU    $+OFFSET    ;RESET ALL LOGON COUNTERS
  732.     lxi    h,0
  733.     endif    ;usrlog
  734.  
  735.     if    usrlog and pwrqd
  736.     shld    OLDUSR        ;RESET ATTEMPT COUNTER
  737.     endif    ;usrlog and pwrqd
  738.  
  739.     if    usrlog
  740.     shld    NEWUSR        ;RESET LOGON COUNTER
  741.     endif    ;usrlog
  742.  
  743.     if    usrlog and imsai
  744.     mvi    a,0ffh
  745.     OUT    SENSE        ;RESET IMSAI PANEL DISPLAY
  746.     endif    ;usrlog and imsai
  747.  
  748.     if    usrlog
  749.     RET
  750.     endif    ;usrlog
  751. ;
  752. MCBOOT    equ    $+offset
  753.     jmp    mboot
  754. ;
  755. ;See comments above, PRNLOG must begin here
  756. ;
  757. PRNLOG    EQU    $+OFFSET
  758. ;
  759.     if    usrlog and pwrqd ;PRINT # OF LOGON ATTEMPTS
  760.     MVI    C,printf
  761.     LXI    D,ATMSG
  762.     CALL    BDOS
  763.     lxi    OLDUSR+1    ;point to high byte
  764.     CALL    HXOUT
  765.     endif    ;usrlog and pwrqd
  766. ;
  767.     if    usrlog        ;PRINT # OF LOGONS
  768.     MVI    C,printf
  769.     LXI    D,SUMSG
  770.     CALL    BDOS
  771.     lxi    h,newusr+1
  772.     CALL    HXOUT
  773.     endif    ;usrlog
  774.  
  775.     RET
  776.  
  777.     if    usrlog
  778. USRCHK    equ    $+offset
  779.     call    prnlog        ;give info
  780.     mvi    c,printf
  781.     lxi    d,rs1msg
  782.     call    bdos        ;prompt for resume bye
  783. PRNREL    equ    $+offset
  784.     call    ucsts        ;get reply
  785.     ora    a
  786.     jz    prnrel
  787.     cpi    'R'        ;R for resume?
  788.     jz    prnres        ;yes
  789.     cpi    'R'+20H        ;lower case also
  790.     jnz    0        ;no, warm boot
  791. PRNRES    equ    $+offset
  792.     mvi    c,printf
  793.     lxi    d,rs2msg
  794.     jmp    bdos        ;resume via bdos after message
  795. ;
  796. ;BOPLOG increments the 16 bit counter pointed to by HL
  797. ;If decimal switch is active, number is kept as 4 BCD digits
  798. ;
  799. BOPLOG    equ    $+offset
  800.     mov    a,m        ;get low byte
  801.     inr    a
  802.     endif    ;usrlog
  803.  
  804.     if    usrlog and decimal
  805.     daa
  806.     endif    ;usrlog and decimal
  807.  
  808.     if    usrlog
  809.     mov    m,a        ;replace low order
  810.     rnc            ;if no carry, BOP done
  811.     inx    h        ; else carry to high byte
  812.     mov    a,m        ;get high byte
  813.     inr    a
  814.     endif    ;usrlog
  815.  
  816.     if    usrlog and decimal
  817.     daa
  818.     endif    ;usrlog and decimal
  819.  
  820.     if    usrlog
  821.     mov    m,a        ;replace high byte
  822.     ret
  823.     endif    ;usrlog
  824. ;
  825.  
  826.     if    usrlog and pwrqd
  827. ATMSG    EQU    $+OFFSET
  828.     DB    CR,LF,'NUMBER OF LOGON ATTEMPTS: $'
  829.     endif    ;usrlog and pwrqd
  830.  
  831.     if    usrlog
  832. SUMSG    EQU    $+OFFSET
  833.     DB    CR,LF,'NUMBER OF LOGONS: $'
  834. RS1MSG    equ    $+offset
  835.     DB    CR,LF,CR,LF,'Type R to Resume,'
  836.     DB    ' anything else to Warm Boot: $'
  837. RS2MSG    equ    $+offset
  838.     DB    'Resuming . . .',CR,LF,'$'
  839.     endif    ;usrlog
  840.     
  841.     if    usrlog
  842. HXOUT    EQU    $+OFFSET
  843.     push    h        ;save pointer
  844.     call    hxhaf        ;do high byte first
  845.     pop    h
  846.     dcx    h        ;point to low byte
  847.  
  848. HXHAF    equ    $+offset
  849.     mov    a,m
  850.     MOV    B,A        ;SAVE NUMBER
  851.     RAR            ;ROTATE RIGHT 4 BITS
  852.     RAR            ;TO MAKE AN ASCII DIGIT
  853.     RAR
  854.     RAR
  855.     CALL    ONEOUT        ;OUTPUT MSH TO CONSOLE
  856.     MOV    A,B        ;GET NUMBER BACK
  857.  
  858. ONEOUT    EQU    $+OFFSET
  859.     ANI    0FH        ;GET LSH FOR OUTPUT
  860.     adi    90h
  861.     daa
  862.     aci    40h
  863.     daa
  864.     PUSH    B
  865.     MVI    C,02H
  866.     MOV    E,A        ;OUTPUT THE NUMBER
  867.     CALL    BDOS
  868.     POP    B
  869.     RET
  870.     endif    ;usrlog
  871. ;
  872. ;WELCOME TO THE SYSTEM
  873. ;
  874. WELCOME    EQU    $+OFFSET
  875. ;
  876. GETNULL EQU    $+OFFSET
  877.  
  878.     if    motor
  879.     CALL    DSKON
  880.     endif    ;motor
  881.  
  882.     CALL    ILPRT        ;PRINT THIS MSG:
  883. ;
  884.     DB    CR,LF
  885.     DB    'HOW MANY NULLS (0-9) DO YOU NEED? ',0
  886. ;
  887.     CALL    MINPUT        ;GET VALUE
  888.     MOV    C,A
  889.     CALL    MOUTPUT     ;ECHO CHAR
  890.     MOV    A,C
  891.     CPI    '0'
  892.     JC    GETNULL        ;BAD, RETRY
  893.     CPI    '9'+1
  894.     JNC    GETNULL        ;BAD
  895.     SUI    '0'        ;MAKE BINARY
  896.     STA    NULLS        ;SAVE COUNT
  897. ;
  898.     if    ck$lwc
  899. GETULC    EQU    $+OFFSET
  900.     CALL    ILPRT        ;NOW, PRINT THIS MSG:
  901. ;
  902.     DB    CR,LF
  903.     DB    'CAN YOUR TERMINAL DISPLAY LOWER CASE? ',0
  904. ;
  905.     MVI    A,20H        ;FORCE CASE CONVERSION FOR NOW
  906.     STA    ULCSW
  907.     CALL    MINPUT        ;GET Y OR N
  908.     MOV    C,A
  909.     CALL    MOUTPUT     ;ECHO
  910.     MOV    A,C
  911.     CPI    'N'
  912.     JZ    DONEOPT     ;WE'RE ALREADY SET UP FOR NO LWR CASE
  913.     CPI    'Y'
  914.     JNZ    GETULC        ;WASN'T Y OR N...ASK HIM AGAIN
  915.     XRA    A
  916.     STA    ULCSW        ;SET FLAG FOR NO CONVERSION
  917. ;
  918. DONEOPT EQU    $+OFFSET
  919.     endif    ;ck$lwc
  920. ;
  921.     if    flip
  922. FLIPMD    EQU    $ + OFFSET
  923.     CALL    ILPRT
  924. ;
  925.     DB    CR,LF
  926.     DB    'DO YOU  WANT TO "FLIP" THE MODEM MODE ? ',0
  927. ;
  928.     CALL    MINPUT        ;GET Y OR N
  929.     ANI    05FH        ;Make upper case
  930.     MOV    C,A
  931.     CALL    MOUTPUT     ;ECHO
  932.     MOV    A,C
  933.     CPI    'N'        ;NO?
  934.     JZ    DONEFLP     ;OK, NO CHANGE
  935.     CPI    'Y'
  936.     JNZ    FLIPMD        ;WASN'T Y OR N...ASK HIM AGAIN
  937.     CALL    ILPRT
  938. ;
  939.     DB    CR,LF,CR,LF
  940.     DB    'If  you answer "Y" to the next question you have 20 seconds to',CR,LF
  941.     DB    'switch your  modem to the "ANSWER"  mode.  If you change  mode',CR,LF
  942.     DB    'now,  you  CAN''T  change  back until you get to  CP/M  command',CR,LF
  943.     DB    'level.'
  944.     DB    CR,LF,0
  945. ;
  946. FLIPLP    EQU    $ + OFFSET
  947.     CALL    ILPRT
  948. ;
  949.     DB    CR,LF
  950.     DB    'DO YOU WANT TO CHANGE TO "ANSWER" MODE ? ',0
  951. ;
  952.     CALL    MINPUT        ;GET Y OR N
  953.     ANI    05FH        ;Make upper case
  954.     MOV    C,A
  955.     CALL    MOUTPUT     ;ECHO
  956.     MOV    A,C
  957.     CPI    'N'        ;NO?
  958.     JZ    NOCHNG         ;OK, NO CHANGE
  959.     CPI    'Y'
  960.     JNZ    FLIPLP        ;WASN'T Y OR N...ASK HIM AGAIN
  961. ;
  962. ;SET MODEM FOR DTR ON & ORIGINATE
  963. ;
  964.     IN    CMMD        ;Get the current mode
  965.     XRI    GBRTS        ;Toggle the bit
  966.     OUT    CMMD        ;Flip the mode
  967.     CALL    CARCK        ;Wait for carrier
  968.     MVI    B,RETIME*10
  969. FLLOOP    EQU    $ + OFFSET
  970.     CALL    DELAY        ;Let remote modem detect carrier
  971.     DCR    B        ;Remote modem ready yet?
  972.     JNZ    FLLOOP        ;No
  973.     CALL    ILPRT        ;Yes
  974. ;
  975.     DB    CR,LF,CR,LF
  976.     DB    'If you see this, the mode change was successful.'
  977.     DB    CR,LF,0
  978. ;
  979.     JMP    DONEFLP
  980. ;
  981. NOCHNG    EQU    $ + OFFSET
  982.     CALL    ILPRT
  983. ;
  984.     DB    CR,LF,CR,LF
  985.     DB    'OK, NO CHANGE IN MODE',CR,LF,0
  986. ;
  987. DONEFLP    EQU    $ +OFFSET
  988.     endif    ;flip
  989. ;
  990.     CALL    ILPRT
  991. ;
  992.     DB    CR,LF,CR,LF,0
  993. ;
  994. ;PRINT THE WELCOME FILE
  995.     LXI    H,WELFILN     ;SOURCE
  996.     LXI    D,FCB        ;DESTINATION
  997.     MVI    B,13        ;LENGTH
  998.     CALL    MOVE        ;MOVE THE NAME
  999. ;SET DMA ADDR TO 80H
  1000.     LXI    D,80H
  1001.     MVI    C,STDMA
  1002.     CALL    BDOS
  1003. ;
  1004. ;SET USER FOR WELCOME FILE
  1005.     MVI    C,32
  1006.     MVI    E,WELUSR
  1007.     CALL    BDOS
  1008. ;
  1009. ;OPEN THE WELCOME FILE
  1010.     LXI    D,FCB
  1011.     MVI    C,OPEN
  1012.     CALL    BDOS
  1013. ;DID IT EXIST?
  1014.     INR    A        ;A=> 0 MEANS "NO"
  1015.     JZ    PASSINT     ;NO WELCOME FILE
  1016. ;GOT A FILE, TYPE IT
  1017.     XRA    A        ;GET 0
  1018.     STA    FCBRNO        ;ZERO RECORD #
  1019.     LXI    H,100H        ;GET INITIAL BUFF POINTER
  1020. ;TYPE THE WELCOME FILE
  1021. WELTYLP EQU    $+OFFSET
  1022.     CALL    RDBYTE        ;GET A BYTE
  1023.     CPI    1AH        ;EOF?
  1024.     JZ    PASSINT     ;YES, DONE
  1025.     MOV    C,A        ;SETUP FOR TYPE
  1026.     CALL    MOUTPUT     ;TYPE THE CHAR
  1027.     CALL    MSTAT        ;CHECK FOR..
  1028.     ORA    A        ;CHAR TYPED?
  1029.     JZ    WELTYLP     ;..NO, LOOP
  1030.     CALL    MINPUT        ;..YES, GET CHAR
  1031.     CPI    'C'-40H     ;CTL-C?
  1032.     JNZ    WELTYLP     ;..NO, LOOP UNTIL EOF
  1033. ;
  1034. ;GET THE PASSWORD
  1035. ;
  1036. PASSINT EQU    $+OFFSET
  1037. ;
  1038. ;
  1039.     if    pwrqd and imsai and selpass 
  1040.     IN    SENSE        ;TURN THE SWITCH UP..
  1041.     ANI    PWDSW        ;..TO REQUIRE THE PASSWORD
  1042.     JZ    NOPASS
  1043.     endif    ;pwrqd and imsai and selpass
  1044.  
  1045.     if    pwrqd
  1046.     MVI    D,5        ;5 TRIES AT PASSWORD
  1047. PASSINP EQU    $+OFFSET
  1048.     CALL    ILPRT
  1049. ;
  1050.     DB    CR,LF,'ENTER PASSWORD: ',0
  1051. ;
  1052.     LXI    H,PASSWD    ;POINT TO PASSWORD
  1053.     MVI    E,0        ;NO MISSED LETTERS
  1054.  
  1055.     if    inter3
  1056.     mvi    a,modem
  1057.     out    user        ;Select modem UART
  1058.     endif    ;inter3
  1059.  
  1060.     IN    DATA        ;CLEAR OUT GARBAGE
  1061. PWMLP    EQU    $+OFFSET
  1062.     CALL    MINPUT        ;GET A CHAR
  1063.     CPI    60H        ;LOWER CASE?
  1064.     JC    NOTLC        ;NO,
  1065.     ANI    5FH        ;MAKE UPPER CASE ALPHA
  1066.  
  1067.     if    dual$io
  1068.     push    psw        ;save chararcter
  1069.     cpi    ' '        ;control?
  1070.     jnc    pwdis        ;no, display it
  1071.     mvi    c,'^'        ;yes, prefix it
  1072.     call    conout
  1073.     pop    psw
  1074.     push    psw
  1075.     adi    40h
  1076. pwdis    equ    $+offset
  1077.     mov    c,a
  1078.     call    conout
  1079.     pop    psw
  1080.     endif    ;dual$io
  1081.     
  1082.     cpi    'U'-40h        ;Control-U?
  1083.     jz    passinp        ;Yes, another try
  1084.     CMP    M        ;MATCH PASSWORD?
  1085.     JZ    PWMAT        ;..YES
  1086.     MVI    E,1        ;..NO, SHOW MISS
  1087.     CPI    CR        ;C/R?
  1088.     JNZ    PWMLP        ;..NO, WAIT FOR C/R
  1089. ;
  1090. ;PASSWORD DIDN'T MATCH
  1091. ;
  1092. PWNMAT    EQU    $+OFFSET
  1093.     CALL    ILPRT
  1094. ;
  1095.     DB    '++INCORRECT++',CR,LF,0
  1096. ;
  1097.     DCR    D        ;MORE TRIES?
  1098.     JNZ    PASSINP     ;YES
  1099.     JMP    BADPASS     ;NO, GO HANG UP
  1100. ;
  1101. ;CHARACTER MATCHED IN PASSWORD
  1102. ;
  1103. PWMAT    EQU    $+OFFSET
  1104.     INX    H        ;TO NEXT CHAR
  1105.     CPI    CR        ;END?
  1106.     JNZ    PWMLP        ;..NO, LOOP
  1107. ;END OF PASSWORD.  ANY MISSED CHARS?
  1108.     MOV    A,E        ;GET FLAG
  1109.     ORA    A
  1110.     JNZ    PWNMAT        ;NOT RIGHT
  1111. ;PASSWORD CORRECT
  1112.     endif    ;pwrqd
  1113.  
  1114. NOPASS    EQU    $+OFFSET
  1115.  
  1116.     if    rtc
  1117.     call    ilprt
  1118. ;
  1119.     db    CR,LF,CR,LF,'On system at ',0
  1120. ;
  1121.     call    time
  1122.     call    ilprt
  1123. ;
  1124.     db    CR,LF,0
  1125. ;
  1126.     endif    ;rtc
  1127.  
  1128.     if    usrlog        ;COUNT # OF SUCCESSFUL LOGONS
  1129.     lxi    h,NEWUSR    ;GET LAST VALUE
  1130.     call    boplog        ;add one
  1131.     endif    ;usrlog
  1132.  
  1133.     if    usrlog and imsai    ;DISPLAY ON IMSAI
  1134.     lda    newusr        ;re-get low order value
  1135.     CMA            ;invert for lights
  1136.     OUT    SENSE        ;DISPLAY ON IMSAI FRONT PANEL
  1137.     endif    ;usrlog and imsai
  1138.  
  1139.     CALL    ILPRT
  1140. ;
  1141. ;
  1142.     DB    CR,LF,'Please wait a moment . . .',CR,LF,CR,LF,0
  1143. ;               ^^^^^^^^^^^^^^^^^^^^^^^^^^etc
  1144. ;            PUT BOOT-UP MSG HERE
  1145. ;
  1146.     if    comfile
  1147.     MVI    C,32
  1148.     MVI    E,COMUSR    ;SWITCH TO COM FILE USER #
  1149.     CALL    BDOS
  1150.     LDA    OPTION
  1151.     CPI    'A'        ;SYSOP CAN BYPASS COM FILE BY..
  1152.     JZ    0        ;..TYPING "BYE /A"
  1153.     CPI    'C'        ;OPER CAN ALSO GO TO COM..
  1154.     JNZ    100H        ;..FILE LOAD WITH "BYE /C"
  1155.     CALL    ILPRT        ;PRINT THIS MESSAGE
  1156. ;
  1157.     DB    'Loading system...',CR,LF,0
  1158. ;
  1159.     CALL    LODCOM
  1160.     JMP    100H        ;EVERYONE ELSE GETS COM FILE
  1161.     endif    ;comfile
  1162.  
  1163.     if    not comfile
  1164.     JMP    0
  1165.     endif    ;not comfile
  1166. ;
  1167. CARCK    EQU    $+OFFSET
  1168. ;    LOSS OF CONNECTION TEST
  1169. ;
  1170. ;IF WE DETECT THAT THERE IS NO CARRIER UPON ENTRY TO
  1171. ;THIS ROUTINE, WE'LL KEEP CHECKING FOR 25 SECONDS TO SEE IF THE
  1172. ;CARRIER RETURNS. IF SO, WE'LL JUST CONTINUE ON. IF NOT, WE'LL
  1173. ;SIGNAL THIS BY SETTING THE CARRY FLAG.
  1174. ;
  1175.     if    inter3
  1176.     mvi    a,modem
  1177.     out    user        ;Select modem UART
  1178.     endif    ;inter3
  1179.  
  1180.     IN    STATUS        ;GET MODEM STATUS
  1181.     ANI    GBCD        ;GOT A CARRIER?
  1182.     JNZ    CARCK2        ;YES, GO ON WITH TESTS
  1183.     LDA    DROPOUT        ;Get dropout count
  1184.     ADI    1        ;Increment it
  1185.     CPI    MAXDROP        ;Bad line?
  1186.     JZ    BADPASS        ;Yes, reset system
  1187.     STA    DROPOUT        ;Save for later
  1188.     PUSH    B        ;PRESERVE BC SO WE CAN USE IT
  1189.     MVI    B,CTIME*10    ;Initialise timeout value
  1190. CARLP    EQU    $+OFFSET
  1191.     CALL    DELAY        ;WAIT .1 SECONDS
  1192.     IN    STATUS
  1193.     ANI    RING        ;Phone ringing?
  1194.     JZ    NO$RING        ;No
  1195.     MVI    B,CTIME*10    ;Yes, reintialise count
  1196. NO$RING    EQU    $+OFFSET
  1197.     IN    STATUS        ;GET MODEM STATUS
  1198.     ANI    GBCD        ;HAS CARRIER RETURNED?
  1199.     MOV    A,B        ;PRESERVE COUNTDOWN VALUE
  1200.     POP    B        ;FIX STACK IN CASE ALL IS OK
  1201.     JNZ    CARCK2        ;GOT CARRIER, CONTINUE ON
  1202.     DCR    A        ;COUNT TIME DOWN
  1203.     STC            ;IN CASE THIS IS THE END OF TIME
  1204.     RZ            ;RETURN IF TIMED OUT
  1205.     PUSH    B        ;PRESERVE B
  1206.     MOV    B,A        ;GET COUNTER VALUE IN B
  1207.     JMP    CARLP        ;KEEP CHECKING
  1208. ;
  1209. ;    NOW TEST DRIVE #'S AND (IF CPM 2.X)
  1210. ;    USER #'S TO INSURE THAT MAXIMUMS
  1211. ;    ARE NOT EXCEEDED
  1212. ;
  1213. CARCK2    EQU    $+OFFSET
  1214.     LDA    4        ;CHECK DISK/USER #
  1215.     ANI    0FH        ;ISOLATE DRIVE
  1216.     CPI    MAX$DRIVE    ;VALID DRIVE?
  1217.     JC    CARCK3        ;YES, SKIP THIS JUNK
  1218.     LDA    4        ;RESTORE WHOLE LOGIN BYTE
  1219.     ANI    0F0H        ;RETAIN USER #
  1220.     STA    4        ;FORCE DRIVE TO A
  1221.     CALL    ILPRT        ;TELL USER WHAT HE DID
  1222. ;
  1223.     DB    'INVALID DRIVE - RETURNING TO A:',0
  1224. ;
  1225.     JMP    0        ;FORCE WARM BOOT
  1226.  
  1227. CARCK3    EQU    $+OFFSET
  1228. ;
  1229.     LDA    4        ;REFRESH LOGIN BYTE AGAIN
  1230.     ANI    0F0H        ;ISOLATE USER #
  1231.     CPI    MAX$USER*16+1    ;VALID USER #?
  1232.     JC    CARCK4        ;YES, DON'T CHANGE
  1233.     LDA    4        ;GET BACK LOGIN BYTE
  1234.     ANI    0FH        ;KEEP DRIVE, ZERO USER
  1235.     STA    4
  1236.     CALL    ILPRT        ;TELL HIM WHAT HAPPENED
  1237. ;
  1238.     DB    'INVALID USER NUMBER - RETURNING TO 0',0
  1239. ;
  1240.     JMP    0        ;FORCE WARM BOOT
  1241. ;
  1242. CARCK4    EQU    $+OFFSET
  1243.     ORA    A
  1244.     RET
  1245. ;
  1246. ;    .1 SEC DELAY ROUTINE
  1247. ;
  1248. DELAY    EQU    $+OFFSET
  1249.     PUSH    B
  1250.     LXI    B,SPEED*4167     ;TIMING CONSTANT
  1251. ;
  1252. DELAY1    EQU    $+OFFSET
  1253.     DCX    B
  1254.     MOV    A,B
  1255.     ORA    C
  1256.     JNZ    DELAY1
  1257.     POP    B
  1258.     RET
  1259. ;
  1260. ;    50 MS DELAY ROUTINE
  1261. ;
  1262. KDELAY    EQU    $+OFFSET
  1263.     PUSH    B
  1264.     LXI    B,SPEED*2084
  1265.     JMP    DELAY1
  1266. ;
  1267. ;PATCH IN THE NEW JMP TABLE (SAVING THE OLD)
  1268. ;
  1269. PATCH    EQU    $+OFFSET
  1270.     CALL    TBLADDR        ;CALC HL= CP/M JMP TABLE
  1271.     LXI    D,VCOLDBT    ;POINT TO SAVE LOCATION
  1272.     MVI    B,18        ;ALWAYS SAVE PRINTER VECTOR
  1273.     CALL    MOVE        ;MOVE IT
  1274. ;NOW MOVE NEW JMP TABLE TO CP/M
  1275.     CALL    TBLADDR        ;CALC HL=CP/M'S JMP TABLE
  1276.     XCHG            ;MOVE TO DE
  1277.     LXI    H,NEWJTBL     ;POINT TO NEW
  1278.     CALL    MOVE        ;MOVE IT
  1279.     RET
  1280. ;
  1281. UNPATCH EQU    $+OFFSET
  1282.     CALL    TBLADDR     ;HL=CP/M'S JMP TABLE
  1283.     XCHG            ;MOVE TO DE
  1284.     LXI    H,VCOLDBT     ;GET SAVED TABLE
  1285.     CALL    MOVE        ;MOVE ORIG BACK
  1286.     RET            
  1287. ;
  1288. ;CALCULATE HL=CP/M'S JUMP TABLE, B=LENGTH
  1289. ;
  1290. TBLADDR EQU    $+OFFSET
  1291.     LHLD    1        ;GET BIOS POINTER
  1292.     DCX    H        ;..SKIP
  1293.     DCX    H        ;..TO
  1294.     DCX    H        ;..COLD BOOT
  1295.  
  1296.     if    printer     ;RETAIN LIST DEVICE?
  1297.     MVI    B,15        ;DON'T MOVE LISTER JUMP
  1298.     else
  1299.     MVI    B,18        ;BYTES TO MOVE
  1300.     endif    ;printer
  1301.  
  1302.     RET
  1303. ;
  1304. ;MOVE (HL) TO (DE), LENGTH IN (B)
  1305. ;
  1306. MOVE    EQU    $+OFFSET
  1307.     MOV    A,M        ;GET A BYTE
  1308.     STAX    D        ;PUT AT NEW HOME
  1309.     INX    D        ;BUMP POINTERS
  1310.     INX    H
  1311.     DCR    B        ;DEC BYTE COUNT
  1312.     JNZ    MOVE        ;IF MORE, DO IT
  1313.     RET            ;IF NOT,RETURN
  1314. ;
  1315. ;COMMON ROUTINE TO CHECK FOR CARRIER LOST,
  1316. ;CALLED FROM  CONSOLE OUT
  1317. ;
  1318. CHECK    EQU    $+OFFSET
  1319.     CALL    CARCK        ;SEE IF CARRIER STILL ON
  1320.     RNC            ;ALL OK
  1321. ;CARRIER IS LOST.  TYPE MESSAGE SO LOCAL CONSOLE
  1322. ;    SHOWS THE REASON
  1323. BADPASS EQU    $+OFFSET    ;COME HERE ON BAD PASSWORD
  1324.     MVI    A,1        ;SHOW CARRIER LOST SO
  1325.     STA    LOSTFLG        ;..WE WON'T CK AGAIN
  1326.     LXI    SP,STACK    ;ENSURE VALID STACK
  1327.     CALL    ILPRT
  1328. ;
  1329.     DB    CR,LF,'++CARRIER LOST++',CR,LF,'   ',0
  1330. ;
  1331.     CALL    UNPATCH        ;RESTORE ORIG BIOS JMP TBL
  1332.     XRA    A        ;CLEAR OUT CARRIER..
  1333.     STA    LOSTFLG     ;..LOST FLAG
  1334.     JMP    HANGUP
  1335. ;
  1336. ;READBYTE ROUTINE - USED TO READ THE
  1337. ;    WELCOME FILE
  1338. ;
  1339. RDBYTE    EQU    $+OFFSET
  1340.     MOV    A,H        ;TIME TO READ?
  1341.     ORA    A        ;..IF AT 100H
  1342.     JZ    NORD        ;NO READ REQ'D
  1343. ;HAVE TO READ A SECTOR
  1344.     LXI    D,FCB
  1345.     MVI    C,READ
  1346.     CALL    BDOS
  1347.     ORA    A        ;OK?
  1348.     MVI    A,1AH        ;FAKE UP EOF
  1349.     RNZ            ;RET EOF IF BAD
  1350.     LXI    H,80H
  1351. NORD    EQU    $+OFFSET
  1352.     MOV    A,M        ;GET CHAR
  1353.     INX    H        ;TO NEXT
  1354.     RET
  1355. ;
  1356. ;KEYBOARD/MODEM STATUS TEST ROUTINE
  1357. ;
  1358. MSTAT    EQU    $+OFFSET
  1359.     call    check
  1360.  
  1361.     if    dual$io        ;WANT LOCAL CONSOLE?
  1362.     CALL    CONSTAT     ;GET LOCAL STATUS
  1363.     ORA    A
  1364.     RNZ            ;RET IF LOCAL CHAR
  1365.     endif    ;dual$io
  1366. ;
  1367.  
  1368.     if    inter3
  1369.     mvi    a,modem
  1370.     out    user        ;Select modem UART
  1371.     endif    ;inter3
  1372.  
  1373.     IN    STATUS        ;GET MODEM STATUS
  1374.     ANI    GBDAV        ;GOT A CHARACTER?
  1375.     RZ            ;RETURN IF NOT
  1376.     IN    STATUS        ;GET MODEM STATUS
  1377.     ANI    GBFE+GBOE    ;CHECK FOR FRAMING AND OVERRUN ERROR
  1378.     JZ    MSTAT1        ;NO ERROR, CHARACTER IS VALID
  1379.     CALL    MRESET        ;Reset modem UART errors
  1380.     XRA    A        ;RETURN FALSE
  1381.     RET
  1382. ;
  1383. MSTAT1    EQU    $+OFFSET
  1384.     MVI    A,0FFH        ;SHOW READY
  1385.     ORA    A
  1386.     RET
  1387. ;
  1388. MRESET    EQU    $+OFFSET
  1389.     IN    DATA        ;Swallow questionable character
  1390.     IN    CMMD        ;Get command byte
  1391.     ADI    ERESET        ;Clear Overrun & Framing errors
  1392.     OUT    CMMD        ;Reset UART ERROR
  1393.     SUI    ERESET
  1394.     OUT    CMMD        ;Clear UART reset
  1395.     RET
  1396. ;
  1397. ;MODEM INPUT FUNCTION, CHECKS LOCAL CONSOLE FIRST
  1398. ;
  1399. MINPUT    EQU    $+OFFSET
  1400. ;
  1401.     if    timeout
  1402.     PUSH    H
  1403.     LXI    H,TOVALUE*MINUTES ;INITIALIZE TIMEOUT COUNTER
  1404.     SHLD    TOCNT
  1405.     POP    H
  1406.     endif    ;timeout
  1407. ;
  1408. MINPUT1 EQU    $+OFFSET
  1409.     LDA    LOSTFLG        ;KNOWN LOSS..
  1410.     ORA    A        ;..OF CARRIER?
  1411.     CZ    CHECK        ;CARRIER STILL ON?
  1412.     CALL    MSTAT        ;ANYTHING?
  1413.     ORA    A
  1414.  
  1415.     if    timeout
  1416.     JNZ    MINPUT2
  1417.     CALL    KDELAY        ;KILL 50 MS
  1418.     PUSH    H
  1419.     LHLD    TOCNT        ;KNOCK DOWN TIMEOUT COUNTER
  1420.     DCX    H
  1421.     SHLD    TOCNT
  1422.     MOV    A,H
  1423.     ORA    L
  1424.     POP    H
  1425.     JNZ    MINPUT1     ;STILL TIME LEFT..KEEP TRYING
  1426.     CALL    ILPRT
  1427. ;
  1428.     DB    '+++INPUT TIMED OUT+++',7,7,0
  1429. ;
  1430.     JMP    NOSLASH
  1431.     else
  1432.     JZ    MINPUT        ;LOOP TILL CHAR RCD
  1433.     endif    ;timeout
  1434. ;
  1435. MINPUT2    EQU    $+OFFSET
  1436.  
  1437.     if    dual$io        ;BOTH LOCAL AND REMOTE
  1438.     CALL    CONSTAT     ;CHECK LOCAL CONSOLE
  1439.     ORA    A        ;CHAR?
  1440.     JNZ    CONIN        ;..YES, READ IT, RET.
  1441.     endif    ;dual$io
  1442. ;
  1443. ;    LOCAL CONSOLE WASN'T READY, SO READ MODEM
  1444. ;
  1445.     if    inter3
  1446.     mvi    a,modem
  1447.     out    user        ;Select modem UART
  1448.     endif    ;inter3
  1449.  
  1450.     IN    DATA        ;GET DATA BYTE
  1451.     ANI    7FH        ;DELETE PARITY
  1452.     JZ    MINPUT        ;IGNORE NULLS
  1453.  
  1454.     if    imsai and hardlog
  1455.     PUSH    B
  1456.     MOV    B,A
  1457.     IN    SENSE
  1458.     ANI    LOGSW
  1459.     MOV    A,B
  1460.     POP    B
  1461.     JZ    NOLOG
  1462.     endif    ;imsai and hardlog
  1463.  
  1464.     if    hardlog
  1465.     CPI    20H
  1466.     JNC    MINPUT3
  1467.     CPI    CR
  1468.     JNZ    NOLOG
  1469.  
  1470. MINPUT3    EQU    $+OFFSET
  1471.     CALL    LISTOUT        ;ECHO ON PRINTER
  1472.     CPI    CR
  1473.     JNZ    NOLOG        ;CR NEEDS LINEFEED
  1474.     MVI    A,LF
  1475.     CALL    LISTOUT        ;SO SEND IT
  1476.     MVI    A,CR        ;GET BACK CR
  1477.     endif    ;hardlog
  1478. ;
  1479. NOLOG    EQU    $+OFFSET
  1480. ;
  1481.     CPI    3        ;IS IT CONTROL-C?
  1482.     RNZ            ;NO, PASS IT THRU
  1483.     LDA    0        ;SEE IF WARM BOOT DISABLED
  1484.     CPI    0C3H        ;JMP MEANS WARM BOOT OK
  1485.     MVI    A,3        ;SO RETURN CONTROL-C
  1486.     RZ
  1487.     XRA    A        ;ELSE CONVERT TO NULL
  1488.     RET
  1489. ;
  1490. MOUTPUT EQU    $+OFFSET
  1491. ;IF WE ALREADY KNOW CARRIER IS LOST,
  1492. ;DON'T CHECK FOR IT AGAIN
  1493.     LDA    LOSTFLG        ;KNOWN LOSS OF CARRIER?
  1494.     ORA    A
  1495.     jnz    silent        ;avoid loop in case carrier lost
  1496.     call    CHECK        ;CARRIER STILL ON?
  1497.  
  1498.     if    inter3
  1499.     mvi    a,modem
  1500.     out    user        ;Select modem UART
  1501.     endif    ;inter3
  1502.  
  1503.     IN    STATUS        ;GET MODEM STATUS
  1504.     ANI    GBTBMT        ;TRANSMIT REGISTER EMPTY?
  1505.     JZ    MOUTPUT        ;LOOP IF NOT READY
  1506.  
  1507.     if    imsai and blackout and dual$io
  1508.     IN    SENSE        ;FLIP SWITCH UP...
  1509.     ANI    BLACKSW     ;..TO BLIND REMOTE USER
  1510.     JNZ    SILENT
  1511.     endif    ;imsai and blckout and dual$io
  1512.  
  1513.     MOV    A,C        ;GET CHAR
  1514.     ANI    7FH
  1515. ;
  1516.     if    ck$lwc
  1517.     CPI    60H        ;CHECK FOR LOWER CASE
  1518.     JC    MOUTP2        ;SKIP IF NOT LC
  1519.     CPI    7FH        ;CHECK FOR RUBOUT
  1520.     JZ    MOUTP2
  1521.     PUSH    H
  1522.     LXI    H,ULCSW        ;SUBTRACT EITHER 20H OR 0
  1523.     SUB    M
  1524.     POP    H
  1525.     MOV    C,A        ;FORCE ON LOCAL AS WELL AS REMOTE
  1526. MOUTP2    EQU    $+OFFSET
  1527.     endif    ;ck$lwc
  1528. ;
  1529.     OUT    DATA        ;OUTPUT TO MODEM
  1530.  
  1531. SILENT    EQU    $+OFFSET
  1532. ;
  1533.     if    dual$io        ;TO LOCAL ALSO?
  1534.     push    psw
  1535.     CALL    CONOUT        ;SEND TO REGULAR BIOS
  1536.     pop    psw
  1537.     endif    ;dual$io
  1538. ;
  1539. ;CHECK FOR NULLS
  1540. ;
  1541.     CPI    LF        ;TIME FOR NULLS?
  1542.     RNZ            ;NO, RETURN
  1543. ;SEND NULLS IF REQUIRED
  1544.     LDA    NULLS        ;GET COUNT
  1545.     ORA    A        ;ANY?
  1546.     RZ            ;..NO
  1547.     PUSH    B
  1548.     MOV    B,A        ;SAVE COUNT
  1549.     MVI    C,0        ;0 IS A NULL
  1550. NULLP    EQU    $+OFFSET
  1551.     CALL    MOUTPUT     ;TYPE A NULL
  1552.     DCR    B        ;MORE?
  1553.     JNZ    NULLP        ;..YES, LOOP
  1554.     POP    B
  1555.     RET
  1556. ;
  1557. ;    BOOT TRAP-BECOMES DISCONNECT IF
  1558. ;    JMP AT 0 HAS BEEN ALTERED
  1559. ;
  1560. MBOOT    EQU    $+OFFSET
  1561.     LDA    0        ;LOOK AT OPCODE
  1562.     CPI    0C3H        ;IS IT STILL JMP?
  1563.     JZ    VWARMBT        ;YES, ALLOW IT
  1564.     JMP    NOSLASH        ;NO, DISCONNECT
  1565. ;
  1566. ;    INLINE PRINT ROUTINE
  1567. ;    CALL ILPRT
  1568. ;    DB    'MSG',0
  1569. ;
  1570. ILPRT    EQU    $+OFFSET
  1571.     XTHL            ;SAVE HL, GET MSG
  1572.     PUSH    B        ;SAVE
  1573.  
  1574. ILPLP    EQU    $+OFFSET
  1575.     MOV    C,M        ;GET CHAR
  1576.     CALL    MOUTPUT        ;OUTPUT IT
  1577.     INX    H        ;POINT TO NEXT
  1578.     MOV    A,M        ;TEST
  1579.     ORA    A        ;..FOR END
  1580.     JNZ    ILPLP
  1581.     POP    B        ;RESTORE
  1582.     XTHL            ;RESTORE HL, RET ADDR
  1583.     RET            ;RET PAST MSG
  1584. ;
  1585.     IF    pwrqd        ;KEEP PASSWORD HERE
  1586. ;ACCESS PASSWORD (ENDS IN C/R)
  1587. ;
  1588. PASSWD    EQU    $+OFFSET
  1589.     DB    'PLAUGER'    ;THE PASSWORD ITSELF
  1590.     DB    CR        ;END OF PASSWORD
  1591. ;ALLOW ROOM FOR BIGGER PASSWORD TO BE
  1592. ;    PATCHED IN
  1593.     DB    0,0,0,0,0,0,0,0,0,0,0
  1594.     endif    ;pwrqd
  1595. ;
  1596. ;    ROUTINE TO LOAD THE COM FILE
  1597. ;
  1598.     if    comfile
  1599. LODCOM    EQU    $+OFFSET
  1600.     XRA    A        ;INITIALIZE FCB
  1601.     STA    COMFCB
  1602.     LXI    H,COMFCB+12
  1603.     MVI    B,21
  1604. ZLOOP    EQU    $+OFFSET
  1605.     MVI    M,0
  1606.     INX    H
  1607.     DCR    B
  1608.     JNZ    ZLOOP
  1609.  
  1610.     MVI    C,OPEN        ;NOW OPEN THE FILE
  1611.     LXI    D,COMFCB
  1612.     CALL    BDOS
  1613.     INR    A        ;SHOULD BE NON-ZERO
  1614.     JZ    ABORT        ;NO FILE, ABORT
  1615. ;
  1616. ;    NOW LOAD THE FILE
  1617. ;
  1618.     LHLD    6        ;GET TOP OF MEMORY
  1619.     LXI    D,-80H        ;RECORD LOADS CAN'T START..
  1620.     DAD    D        ;..ABOVE (BDOS) - 80H
  1621.     PUSH    H        ;SAVE ON STACK
  1622. ;
  1623.     LXI    D,80H        ;TPA-80H
  1624.     LXI    B,0        ;KEEP A RECORD COUNTER
  1625.     PUSH    B        ;SAVE COUNTER
  1626.     PUSH    D        ;AND LOAD ADDRESS
  1627. GLOOP    EQU    $+OFFSET
  1628.     POP    D        ;GET TPA ADRS
  1629.     LXI    H,80H        ;POINT TO NXT ADRS TO READ TO
  1630.     DAD    D        ;HL HAS THE ADDRESS
  1631.     POP    B        ;INCREMENT THE COUNTER
  1632. ;
  1633. ;    CHECK FOR LOAD PAST TOP-OF-MEMORY
  1634. ;
  1635.     POP    D        ;GET -(TOP-OF-MEMORY)
  1636.     PUSH    D        ;RE-SAVE FOR NEXT TIME
  1637. ;
  1638.     MOV    A,E        ;SUBTRACT: (TOP) - (ADRS)
  1639.     SUB    L
  1640.     MOV    A,D        ;ONLY THE CARRY NEEDED
  1641.     SBB    H
  1642. ;
  1643.     JNC    SIZEOK        ;CY= BETTER MOVCPM
  1644.     CALL    ERRXIT        ;SO TELL THE STORY
  1645. ;
  1646.     DB    '++ PROGRAM AREA TOO SMALL ++','$'
  1647. ;;
  1648. SIZEOK    EQU    $+OFFSET
  1649.     INX    B
  1650.     PUSH    B
  1651.     PUSH    H        ;SAVE TPA ADRS
  1652.     XCHG            ;ALIGN REGISTERS
  1653.     MVI    C,STDMA        ;TELL BDOS WHERE TO PUT RECORD
  1654.     CALL    BDOS
  1655.     LXI    D,COMFCB    ;NOW READ THE RECORD
  1656.     MVI    C,READ
  1657.     CALL    BDOS
  1658.     ORA    A
  1659.     JZ    GLOOP        ;A=0 IF MORE TO READ
  1660.     POP    B        ;UNJUNK STACK
  1661.     POP    B        ;THIS IS OUR COUNTER
  1662.     POP    H        ;MORE JUNK ON STACK
  1663.     MOV    A,B        ;CHECK FOR ZERO
  1664.     ORA    C
  1665.     JZ    ABORT        ;WE SHOULD HAVE READ SOMETHING
  1666.     LXI    D,80H        ;WE DID, RESET DMA TO 80H
  1667.     MVI    C,STDMA
  1668.     CALL    BDOS
  1669.     CALL    LOADOK        ;PRINT THIS MSG TO CONSOLE:
  1670. ;
  1671.     DB    '++ COM FILE LOADED ++',CR,LF,'$'
  1672. ;
  1673. LOADOK    EQU    $+OFFSET
  1674.     POP    D
  1675.     LDA    OPTION        ;SEE IF THIS WAS "BYE /C"
  1676.     CPI    'C'        ;IF IT WAS THEN..
  1677.     RZ            ;..DON'T PRINT MESSAGE
  1678.     MVI    C,PRINTF
  1679.     CALL    BDOS
  1680.     RET
  1681. ;
  1682. ABORT    EQU    $+OFFSET
  1683.     CALL    ERRXIT
  1684. ;
  1685.     DB    CR,LF,'+++CANNOT FIND COM FILE.+++','$'
  1686. ;
  1687. ERRXIT    EQU    $+OFFSET
  1688.     POP    D
  1689.     MVI    C,PRINTF
  1690.     CALL    BDOS        ;PRINT THE ABORT MSG
  1691.     JMP    0        ;GIVE UP
  1692.     endif    ;comfile
  1693.  
  1694. ;
  1695. ;THIS AREA IS USED FOR VECTORING CALLS TO THE
  1696. ;USER'S CBIOS, BUT SAVING THE REGISTERS FIRST
  1697. ;IN CASE THEY ARE DESTROYED.
  1698. ;
  1699. CONSTAT EQU    $+OFFSET
  1700.     PUSH    B
  1701.     PUSH    D
  1702.     PUSH    H
  1703.     CALL    VCONSTAT
  1704.     POP    H
  1705.     POP    D
  1706.     POP    B
  1707.     RET
  1708. ;
  1709. CONIN    EQU    $+OFFSET
  1710.     PUSH    B
  1711.     PUSH    D
  1712.     PUSH    H
  1713.     CALL    VCONIN
  1714.  
  1715.     if    fkeys
  1716.     CALL    CKFUNC
  1717.     endif    ;fkeys
  1718.  
  1719.     POP    H
  1720.     POP    D
  1721.     POP    B
  1722.     RET
  1723. ;
  1724. CKFUNC    EQU    $+OFFSET
  1725. ;
  1726.     if    fkeys and imsai
  1727.     PUSH    B
  1728.     MOV    B,A        ;SAVE CHAR
  1729.     IN    SENSE        ;READ THE SWITCHES
  1730.     ANI    ENABLF        ;CHECK FKEY ENAB SW
  1731.     MOV    A,B
  1732.     POP    B
  1733.     RZ            ;NO FUNCT IF SW OFF
  1734.     endif    ;fkeys and imsai
  1735. ;
  1736.     if    fkeys
  1737.     CPI    SYSDKEY
  1738.     JZ    SYSDOWN     ;TELL CALLER TO LEAVE
  1739.     CPI    TWITKEY
  1740.     JZ    GOODBY        ;MAKE CALLER LEAVE
  1741.     CPI    MSGKEY
  1742.     RNZ
  1743.     CALL    ILPRT        ;SEND CALLER A MESSAGE
  1744. ;
  1745.     DB    'MESSAGE FROM OPERATOR:',0
  1746. ;
  1747.     MVI    A,' '        ;SOMETHING TO RETURN WITH
  1748.     RET
  1749. ;
  1750. SYSDOWN EQU    $+OFFSET
  1751.     CALL    ILPRT
  1752. ;
  1753.     DB    'SYSTEM DOWN IN'
  1754.     DB    ' 5 MINUTES....',0
  1755. ;
  1756.     MVI    A,' '
  1757.     RET
  1758.     endif    ;fkeys
  1759. ;
  1760. CONOUT    EQU    $+OFFSET
  1761.     PUSH    B
  1762.     PUSH    D
  1763.     PUSH    H
  1764.     CALL    VCONOUT
  1765.     POP    H
  1766.     POP    D
  1767.     POP    B
  1768.     RET
  1769. ;
  1770. LISTOUT    EQU    $+OFFSET
  1771.     PUSH    B
  1772.     PUSH    D
  1773.     PUSH    H
  1774.     PUSH    PSW
  1775.     MOV    C,A
  1776.     CALL    VLISTOUT
  1777.     POP    PSW
  1778.     POP    H
  1779.     POP    D
  1780.     POP    B
  1781.     RET
  1782. ;
  1783. ;
  1784. ;
  1785. ;    THIS IS THE JMP TABLE WHICH IS COPIED
  1786. ;    ON TOP OF THE ONE POINTED TO BY
  1787. ;    LOCATION 1 IN CP/M
  1788. ;
  1789. NEWJTBL EQU    $+OFFSET
  1790.     JMP    MCBOOT        ;COLD BOOT
  1791.     JMP    MBOOT        ;WARM BOOT
  1792.     JMP    MSTAT        ;MODEM STATUS TEST
  1793.     JMP    MINPUT        ;MODEM INPUT ROUTINE
  1794.     JMP    MOUTPUT     ;MODEM OUTPUT ROUTINE
  1795.     RET            ;DUMMY LIST DEVICE
  1796.     NOP
  1797.     NOP
  1798. ;
  1799.     if    motor
  1800. ;
  1801. DSKON    EQU    $+OFFSET
  1802.     PUSH    PSW        ;SAVE THE A AND FLAGS
  1803.     MVI    A,DISKON    ;VALUE TO TURN ON MOTORS
  1804.     OUT    DISK        ;TO THE DISK CONTROLLER
  1805.     PUSH    H        ;THIS IS TIMER
  1806.     LXI    H,0        ;THIS LONG
  1807. DSKLP    EQU    $+OFFSET
  1808.     XTHL
  1809.     XTHL
  1810.     DCX    H        ;COUNT LOOP
  1811.     MOV    A,H        ;CHECK FOR DONE
  1812.     ORA    L
  1813.     JNZ    DSKLP
  1814.     POP    H        ;RESTORE HL
  1815.     POP    PSW        ;AND A & FLAGS
  1816.     RET
  1817. ;
  1818. DSKOFF    EQU    $+OFFSET
  1819.     PUSH    PSW        ;SAVE A & FLAG
  1820.     MVI    A,DISKOFF    ;VALUE TO TURN MOTORS OFF
  1821.     OUT    DISK
  1822.     POP    PSW
  1823.     RET
  1824. ;
  1825.     endif    ;motor
  1826. ;
  1827.     if    rtc
  1828. CLKBASE    EQU    50H        ;BASE OF SYSTEM SUPPORT 1 CARD
  1829. CLKCTL    EQU    CLKBASE+10    ;CLOCK CONTROL PORT
  1830. CLKDATA    EQU    CLKBASE+11    ;CLOCK DATA PORT
  1831. CREAD    EQU    10H+40H        ;READ COMMAND + HOLD COUNT COMMAND
  1832. ;
  1833. TIME    EQU    $+OFFSET
  1834.     PUSH    H
  1835.     PUSH    D
  1836.     PUSH    B
  1837.     PUSH    PSW
  1838.     MVI    D,CREAD+5    ;POINT TO 10s OF HOURS
  1839.     MVI    B,3        ;3 LOOPS
  1840.     JMP    TX        ;START W/ NO SEPARATOR
  1841. ;
  1842. T1    EQU    $+OFFSET
  1843.     MVI    C,':'        ;SEPARATOR
  1844.     CALL    MOUTPUT        ;TO THE PRINTER
  1845. TX    EQU    $+OFFSET
  1846.     MOV    A,D        ;GET THE DIGIT ADDRESS
  1847.     CALL    CLOCK        ;GET THE VALUE
  1848.     MOV    C,A        ;SAVE IT
  1849.     MVI    A,CREAD+5    ;TEST FOR FIRST LOOP
  1850.     CMP    D        ;1ST LOOP?
  1851.     MOV    A,C        ;RECOVER THE VALUE
  1852.     JNZ    T2        ;JUMP IF NOT 1ST LOOP
  1853.     ANI    3        ;DROP PM INDICATOR
  1854. T2    EQU    $+OFFSET
  1855.     ADI    '0'        ;ADD ASCII BIAS
  1856.     MOV    C,A
  1857.     CALL    MOUTPUT        ;AND PRINT IT
  1858.     DCR    D        ;POINT TO NEXT DIGIT
  1859.     MOV    A,D        ;GET THE DIGIT ADDRESS TO A
  1860.     CALL    PCLOCK        ;GET & PRINT ASCII
  1861.     DCR    D        ;BUMP DIGIT COUNTER
  1862.     DCR    B
  1863.     JNZ    T1        ;LOOP TILL ALL PRINTED
  1864. ;
  1865. ;
  1866.     CALL    ILPRT        ;PRINT THE TIME ZONE
  1867. ;
  1868.     DB    ' EST ',0     ;Australian EST
  1869. ;
  1870. ; WE WILL NOW PRINT THE DAY OF THE WEEK, FOLLOWED
  1871. ; BY THE MONTH, DATE AND YEAR
  1872. ;
  1873. ;
  1874.     MVI    A,CREAD+6        ;THIS IS DAY OF WEEK 
  1875.     CALL CLOCK        ;GET THE DAY NUMBER
  1876. ;
  1877. DAYDONE    EQU    $+OFFSET
  1878.     ADD    A        ;DOUBLE DAY COUNT
  1879.     LXI    H,DAYS        ;POINT TO TABLE
  1880.     MOV    E,A        ;ADD OFFSET TO DE
  1881.     MVI    D,0
  1882.     DAD    D        ;NEW POINTER IN HL
  1883.     MOV    A,M        ;GET LO BYTE OF WORD
  1884.     INX    H        ;POINT TO HI BYTE
  1885.     MOV    H,M        ;TO H
  1886.     MOV    L,A        ;PLUS LO BYTE POINTS TO STRING
  1887.     CALL    LINOUT        ;PRINT THE DAY
  1888. ;
  1889.     MVI    A,CREAD+10    ;10s OF MONTHS
  1890.     CALL    CLOCK
  1891.     ORA    A        ;WE GOT 10's OF MONTHS?
  1892.     JZ    NOTENS        ;JUMP IF NOT
  1893.     MVI    A,10        ;ADD 10s IF WE GOT EM
  1894. NOTENS    EQU    $+OFFSET
  1895.     MOV    B,A        ;SAVE 10s IN B
  1896.     MVI    A,CREAD+9    ;GET THE ONES
  1897.     CALL    CLOCK
  1898.     ADD    B        ;ADD TO THE 10s PLACE TO GET MONTH
  1899.     DCR    A        ;CORRECT FOR JAN=1
  1900.     ADD    A        ;DOUBLE MONTH NUMBER
  1901.     LXI    H,MONTHS    ;POINT TO DISPATCH TABLE
  1902.     MOV    E,A        ;OFF SET TO DE
  1903.     MVI    D,0
  1904.     DAD    D        ;POINTER TO STRING AT (HL)
  1905.     MOV    A,M        ;GET LO BYTE TO A
  1906.     INX    H        ;POINT TO NEXT
  1907.     MOV    H,M        ;HI BYTE TO H
  1908.     MOV    L,A        ;LO BYTE TO L POINTS TO STRING
  1909.     CALL    LINOUT        ;PRINT THE MONTH
  1910. ;
  1911.     MVI    A,CREAD+8    ;10s OF DAYS
  1912.     CALL    CLOCK
  1913.     ANI    3        ;DROP LEAP YEAR INDICATOR
  1914.     JZ    NTENS        ;JUMP IF NO TENS PLACE
  1915.     CALL    PASC        ;PRINT IT
  1916. NTENS    EQU    $+OFFSET
  1917.     MVI    A,CREAD+7    ;ONES OF DAYS
  1918.     CALL    PCLOCK        ;PRINT THEM
  1919.     LXI    H,YEAR        ;PLUS YEAR MESSAGE
  1920.     CALL    LINOUT        ;TO LISTER
  1921.     MVI    A,CREAD+12    ;TENS OF YEAR
  1922.     CALL    PCLOCK        ;PRINT THEM
  1923.     MVI    A,CREAD+11    ;ONES OF YEAR
  1924.     CALL    PCLOCK
  1925.     CALL    ILPRT        ;FINISH THE LINE
  1926. ;
  1927.     DB    CR,LF,0
  1928. ;
  1929.     POP    PSW
  1930.     POP    B
  1931.     POP    D
  1932.     POP    H
  1933.     RET
  1934. ;
  1935. PCLOCK    EQU    $+OFFSET
  1936.     CALL    CLOCK        ;GET THE DIGIT
  1937. PASC    EQU    $+OFFSET
  1938.     ADI    '0'        ;ADD ASCII BIAS
  1939.     MOV    C,A
  1940.     JMP    MOUTPUT        ;AND PRINT
  1941. ;
  1942. CLOCK    EQU    $+OFFSET
  1943.     OUT    CLKCTL        ;TELL IT ADDRESS
  1944.     IN    CLKDATA        ;GET THE DATA NYBBLE
  1945.     PUSH    PSW        ;SAVE THE DATA
  1946.     XRA    A        ;GET 0
  1947.     OUT    CLKCTL        ;RESET HOLD BIT
  1948.     POP    PSW        ;RESTORE DATA
  1949.     RET
  1950. ;
  1951. LINOUT    EQU    $+OFFSET
  1952.     MOV    A,M        ;GET THE CHARACTER
  1953.     CPI    '$'        ;DONE?
  1954.     RZ            ;RETURN IF DONE
  1955.     MOV    C,A        ;ELSE PRINT IT
  1956.     CALL    MOUTPUT
  1957.     INX    H        ;POINT TO NEXT CHARACTER
  1958.     JMP    LINOUT        ;THEN LOOP TILL DONE
  1959. ;
  1960. ;
  1961. SUN    EQU    $+OFFSET
  1962.     DB    'Sunday, $'
  1963. MON    EQU    $+OFFSET
  1964.     DB    'Monday, $'
  1965. TUE    EQU    $+OFFSET
  1966.     DB    'Tuesday, $'
  1967. WED    EQU    $+OFFSET
  1968.     DB    'Wednesday, $'
  1969. THU    EQU    $+OFFSET
  1970.     DB    'Thursday, $'
  1971. FRI    EQU    $+OFFSET
  1972.     DB    'Friday, $'
  1973. SAT    EQU    $+OFFSET
  1974.     DB    'Saturday, $'
  1975. ;
  1976. JAN    EQU    $+OFFSET
  1977.     DB    'January $'
  1978. FEB    EQU    $+OFFSET
  1979.     DB    'February $'
  1980. MAR    EQU    $+OFFSET
  1981.     DB    'March $'
  1982. APR    EQU    $+OFFSET
  1983.     DB    'April $'
  1984. MAY    EQU    $+OFFSET
  1985.     DB    'May $'
  1986. JUN    EQU    $+OFFSET
  1987.     DB    'June $'
  1988. JUL    EQU    $+OFFSET
  1989.     DB    'July $'
  1990. AUG    EQU    $+OFFSET
  1991.     DB    'August $'
  1992. SEP    EQU    $+OFFSET
  1993.     DB    'September $'
  1994. OCT    EQU    $+OFFSET
  1995.     DB    'October $'
  1996. NOV    EQU    $+OFFSET
  1997.     DB    'November $'
  1998. DEC    EQU    $+OFFSET
  1999.     DB    'December $'
  2000. ;
  2001. YEAR    EQU    $+OFFSET
  2002.     DB    ', 19$'
  2003. ;
  2004. ;#################################################
  2005. DAYS    EQU    $+OFFSET
  2006.     DW    SUN
  2007.     DW    MON
  2008.     DW    TUE
  2009.     DW    WED
  2010.     DW    THU
  2011.     DW    FRI
  2012.     DW    SAT
  2013.     DW    SUN
  2014. ;
  2015. MONTHS    EQU    $+OFFSET
  2016.     DW    JAN
  2017.     DW    FEB
  2018.     DW    MAR
  2019.     DW    APR
  2020.     DW    MAY
  2021.     DW    JUN
  2022.     DW    JUL
  2023.     DW    AUG
  2024.     DW    SEP
  2025.     DW    OCT
  2026.     DW    NOV
  2027.     DW    DEC
  2028. ;
  2029. ;
  2030.     endif    ;RTC
  2031. ;
  2032. WELFILN EQU    $+OFFSET
  2033.     DB    0,'STARTUP    ',0
  2034. ;WELCOME FILE NAME ^^^^^^^^^^^
  2035. ;
  2036. NULLS    EQU    $+OFFSET
  2037.     DB    5
  2038. ;
  2039. COMFCB    EQU    $+OFFSET
  2040.     DB    0,'ENTRBBS COM'
  2041. ;COM FILE NAME     ^^^^^^^^^^^
  2042. PEND    EQU    $+OFFSET     ;END OF RELOCATED CODE
  2043. ;
  2044. ;    THESE AREAS ARE NOT INITIALIZED
  2045. ;
  2046.     DS    21        ;REST OF COM FCB
  2047. ULCSW    EQU    $+OFFSET
  2048.     DS    1
  2049. OPTION    EQU    $+OFFSET
  2050.     DS    1
  2051. TOCNT    EQU    $+OFFSET
  2052.     DS    2
  2053. ;
  2054. ;
  2055. ;KEEP TRACK OF LOST CARRIER WHEN TYPING
  2056. ;"++CARRIER LOST++" SO WE DON'T LOOP
  2057. ;
  2058. LOSTFLG EQU    $+OFFSET
  2059.     DS    1
  2060. DROPOUT    EQU    $+OFFSET
  2061.     DS    1
  2062. ;
  2063. ;SAVE THE CP/M JUMP TABLE HERE
  2064. ;
  2065. VCOLDBT EQU    $+OFFSET
  2066.     DS    3
  2067. VWARMBT EQU    $+OFFSET
  2068.     DS    3
  2069. VCONSTAT EQU    $+OFFSET
  2070.      DS    3
  2071. VCONIN     EQU    $+OFFSET
  2072.      DS    3
  2073. VCONOUT  EQU    $+OFFSET
  2074.      DS    3
  2075. VLISTOUT EQU    $+OFFSET
  2076.      DS    3
  2077. ;
  2078. ;    SINCE THESE AREAS ARE NOT INITIALIZED,
  2079. ;    THE FOLLOWING COUNTERS WILL NOT BE CHANGED
  2080. ;    BY SUBSEQUENT LOADS OF THIS PROGRAM
  2081. ;
  2082.     if    usrlog
  2083. OLDUSR    EQU    $+OFFSET
  2084.     DS    2
  2085. NEWUSR    EQU    $+OFFSET
  2086.     DS    2
  2087. NONUSR    EQU    $+OFFSET
  2088.     DS    2
  2089.     endif
  2090. ;
  2091. ;
  2092.     DS    60
  2093. STACK    EQU    $+OFFSET    ;LOCAL STACK
  2094. ;
  2095. CI    EQU    1
  2096. WRCON    EQU    2
  2097. OPEN    EQU    15
  2098. READ    EQU    20
  2099. STDMA    EQU    26
  2100. PRINTF    EQU    9
  2101. DIRECTIO EQU    6
  2102. CSTS    EQU    11
  2103. CI    EQU    1
  2104. FCB    EQU    5CH 
  2105. FCBRNO    EQU    FCB+32
  2106. ;
  2107.     END
  2108.