home *** CD-ROM | disk | FTP | other *** search
/ CP/M / CPM_CDROM.iso / simtel / sigm / vols000 / vol016 / bye67.asm < prev    next >
Assembly Source File  |  1984-04-29  |  39KB  |  1,734 lines

  1. ;V6.7    (Revised 2/17/81)
  2. ;
  3. ;REMOTE CONSOLE PROGRAM FOR CP/M
  4. ;BASED ON AN ORIGINAL PROGRAM WRITTEN
  5. ;BY DAVE JAFFE, JANUARY 1979
  6. ;
  7. ;Rewritten for PMMI modem
  8. ;by Ward Christensen, February 1979
  9. ;
  10. ;I'd also like to give credit to Bill Precht
  11. ;    for the "label + offset" idea allowing
  12. ;    this program to relocate itself
  13. ;    without using DDT to initially set it up
  14. ;
  15. ;2/17/81   Added check for extraneous control characters in
  16. ;       hardcopy log.  (Formfeed seems to be a common "hit").
  17. ;       Changed local startup test to directly test for carrier
  18. ;       instead of calling CARCK, to avoid 15 second delay.
  19. ;       <BRR>
  20. ;
  21. ;2/15/81   Removed dependance on DC Hayes hardware timer so that
  22. ;          DCHAYES conditional assembly is compatible with both
  23. ;          old-style 80-103A and new-style MM100 boards.
  24. ;          Rearranged patch list to "most recent first" order.
  25. ;       Added message for invalid-drive test.
  26. ;          Added ANI 7Fh to upper case conversion test so that
  27. ;          it's not fooled by bit 7 being set.
  28. ;          Added WELUSR equate for user # containing WELCOME file.
  29. ;          Removed PTRPORT equate and changed hardcopy logic to
  30. ;          work through the BIOS printer driver. <BRR>
  31. ;
  32. ;1/22/81   CHANGED CARRIER DETECT ROUTINE FOR DC HAYES TO WAIT FOR
  33. ;       15 SECONDS AFTER LOSS OF CARRIER TO RETURN.  <DAVID KOZINN>
  34. ;
  35. ;1/17/81   CHANGED TIMING LOOPS TO USE DC HAYES HARDWARE TIMER
  36. ;       IF PRESENT.   <DAVID KOZINN>
  37. ;
  38. ;1/16/81   ADDED EQUATES AND CODE FOR THE DC-HAYES 
  39. ;       MICROMODEM 100.  <DAVID KOZINN>
  40. ;
  41. ;9/23/80  Fixed bugs that prevented "bye /a" and "bye /c" from
  42. ;      working properly.  Also repaired several errors in
  43. ;      conditional assembly nesting. -->Ron Fowler
  44. ;
  45. ;9/20/80  Modified status checking during ring-wait routine to
  46. ;      use cp/m BDOS call, as suggested by Keith Petersen.
  47. ;      This should make the program more portable.  Also
  48. ;      added Bruce Ratoff's update to DCHBYE program (5.5),
  49. ;      that allows the use of bye from non-zero user areas.
  50. ;      By Ron Fowler
  51. ;
  52. ;9/19/80  Modified COM file load routine to prevent BDOS
  53. ;      overwrite if the COM file won't fit in the TPA
  54. ;      By Ron Fowler
  55. ;
  56. ;9/19/80  Added new '/' option C, which has the same affect as
  57. ;      /A, except that /C loads the com file after answering
  58. ;      the phone, while /A boots cp/m.
  59. ;      By Ron Fowler
  60. ;
  61. ;9/19/80  Added conditional assembly to give the operator a
  62. ;      'twit' logout key. Added conditionals for 'message
  63. ;      from operator' and 'system down in 5 minutes' keys.
  64. ;      Added front-panel selection of hard-copy log, remote
  65. ;      'black-out', and password option.  Also, if cpm/2 is
  66. ;      used, a message is printed when an unsupported user
  67. ;      area is entered.
  68. ;      By Ron Fowler and Dave Hardy
  69. ;
  70. ;9/19/80  Modified to prevent re-load of the com file when
  71. ;      a voice call comes in.  Reset the DMA address back
  72. ;      to 80h after the com file is loaded.
  73. ;      By Ron Fowler
  74. ;
  75. ;09/16/80 Added conditional assembly to allow automatic
  76. ;      loading of a com file instead of cp/m boot. Also
  77. ;      added decimal usrlog counters as conditional as-
  78. ;      sembly.
  79. ;      By Ron Fowler
  80. ;
  81. ;09/15/80 Added conditional assembly for automatic timed
  82. ;      log-out, drive and user number masking, lower
  83. ;      case query at login, and cp/m 2.x.  Thanks to
  84. ;      Bruce Ratoff for the routines (lifted from his
  85. ;      'DCHBYE54.ASM') used to implement these functions
  86. ;      NOTE: in order to implement the timed log-out, it
  87. ;      was necessary to do timing in software loops.
  88. ;      Therefore, a new equate, FASTCLK, has been added
  89. ;      to allow for 4mhz clock speeds. Also added Bruce
  90. ;      Ratoff's overrun/framing error checking when read-
  91. ;      ing the modem port.
  92. ;      By Ron Fowler
  93. ;
  94. ;07/16/80 Added "/R" command option to allow USRLOG
  95. ;      counters to be reset upon entry.
  96. ;      By Dave Hardy
  97. ;
  98. ;07/11/80 Added conditional assembly for password and
  99. ;      user log routines, and routines to print USRLOG
  100. ;      information on console after program exit.
  101. ;      By Dave Hardy
  102. ;
  103. ;07/10/80 Added code to allow auto-answer after first
  104. ;      or second ring for more reliable auto-answer
  105. ;      when using "ringback" option.
  106. ;      By Dave Hardy
  107. ;
  108. ;06/29/80 Added USRLOG routines to keep track of number
  109. ;      of callers, and display on front panel
  110. ;      of IMSAI (i.e. output number to port FFH).
  111. ;      By Dave Hardy
  112. ;
  113. ;06/11/80 Added 710 Baud rate selection option at sign-on.
  114. ;      By Dave Hardy and Bruce Levison.
  115. ;
  116. ;06/11/80 Added routines to allow conditional assembly for
  117. ;      Morrow's Discus 2D board (all Rev's) with memory
  118. ;      mapped I/O.
  119. ;      By Dave Hardy
  120. ;
  121. ;01/24/80 Added routines to preserve registers when calling
  122. ;      the user's CBIOS.  Added conditional assembly for
  123. ;      callback feature.  Increased stack space to 60.
  124. ;      By Keith Petersen.
  125. ;
  126. ;09/24/79 Added routines to allow automatic multiple baud
  127. ;      rate selection, exit to CP/M from local console,
  128. ;      echo nr. of nulls selected. By Keith Petersen,
  129. ;      with thanks to Bob Mathias for suggestions.
  130. ;
  131. ;05/06/79 Added routine to allow "callback" operation so modem
  132. ;      does not answer normal voice calls.  By Robbin Hough
  133. ;      and Keith Petersen, W8SDZ.
  134. ;
  135. ;
  136. ;------------------------------------------------
  137. ;    SYSTEM EQUATES
  138. FALSE    EQU    0
  139. TRUE    EQU    NOT FALSE
  140. BDOS    EQU    5
  141. CR    EQU    0DH
  142. LF    EQU    0AH
  143. MINUTES    EQU    20*60    ;CONSTANT FOR 1 MIN TIM DLY
  144. ;
  145. ;CHANGE THE FOLLOWING EQUATE TO AN AREA IN YOUR
  146. ;HI MEMORY WHERE THIS PROGRAM MAY PATCH ITSELF IN.
  147. ;APPROX MEMORY REQUIREMENTS: UP TO xxxx BYTES.
  148. ;
  149. DEST    EQU    0F800H    ;RUNNING LOCATION OF CODE
  150. ;
  151. ;
  152. ;CHANGE THE FOLLOWING TO SPECIFY EITHER DCHAYES OR PMMI
  153. ;MODEMS. BE SURE TO CHANGE EITHER TPORT FOR PMMI OR DATA
  154. ;FOR DCHAYES IF THEY ARE NOT AT THE STANDARD LOCATIONS.
  155. ;
  156. DCHAYES    EQU    TRUE    ;TRUE FOR D.C. HAYES MODEM
  157. PMMI    EQU    FALSE    ;TRUE FOR PMMI MODEM
  158. ;
  159.     IF    DCHAYES
  160. ;CHANGE THE FOLLOWING IF YOU HAVE A DC HAYES MODEM THAT IS
  161. ;NOT BASED AT 80H. ALL OTHER PORT EQUATES ARE BASED ON THIS.
  162. ;
  163. DATA    EQU    80H    ;D.C. HAYES DATA PORT
  164.     ENDIF
  165.     IF    PMMI
  166. ;CHANGE THE FOLLOWING IF YOUR PMMI IS NOT AT 0C0H
  167. ;(THE OTHER PORT EQUATES ARE BASED ON THIS VALUE)
  168. ;
  169. TPORT    EQU    0C0H    ;UART CONTROL/STATUS PORT
  170.     ENDIF
  171. ;
  172. ;
  173. ;YOU WILL LIKELY ALSO WANT TO CHANGE THE PASSWORD,
  174. ;LOCATED BELOW AT LABEL "PASSWD", AND THE MESSAGES
  175. ;PRINTED AT LABEL "WELCOME" AND JUST ABOVE LABEL
  176. ;"HANGUP"
  177. ;
  178. ;------------------------------------------------
  179. ;
  180. ;THIS PROGRAM RUNS UP IN HIGH RAM.  IT GETS THERE
  181. ;BY BEING MOVED THERE WHEN 'BYE' IS TYPED.
  182. ;
  183. ;THE PROGRAM IN HI RAM DOES THE FOLLOWING:
  184. ;
  185. ;    1.    HANGS UP THE PHONE
  186. ;    2.    AWAITS RING DETECT, ALLOWS EXIT
  187. ;        TO CP/M IF LOCAL KBD TYPES CTL-C
  188. ;    3.    OUTPUTS CARRIER (SEE CALLBACK ROUTINES)
  189. ;    4.    AWAITS INCOMING CARRIER
  190. ;        GOING TO STEP 1 IF NONE
  191. ;        FOUND IN 15 SECONDS
  192. ;    5.    ASKS NUMBER OF NULLS (0-9)
  193. ;    6.    TYPES THE FILE "WELCOME" FROM
  194. ;        DISK, ALLOWING CTL-C TO SKIP IT
  195. ;    7.    ASKS FOR A PASSWORD, ALLOWING
  196. ;        5 TRIES TO GET IT RIGHT.
  197. ;    8.    WHEN PASSWORD ENTERED, IF USED, DROPS
  198. ;        INTO CP/M.
  199. ;    9.    CALLER CAN LEAVE BY HANGING UP,
  200. ;        (ANY TIME CARRIER IS LOST, IT
  201. ;        WAITS 15 SECONDS, THEN GOES
  202. ;        BACK TO STEP 1), OR THE CALLER
  203. ;        MAY TYPE THE PROGRAM NAME (BYE)
  204. ;
  205. ;
  206. ;****************************************************
  207. ;*        OPTION CONFIGURATION SECTION        *
  208. ;****************************************************
  209. ;
  210. PRINTER EQU    FALSE    ;WANT TO RETAIN LIST DEVICE?
  211. DUAL$IO EQU    TRUE    ;WANT CONSOLE & MODEM?
  212. CALLBAK EQU    FALSE    ;WANT CALLBACK FEATURE?
  213. PWRQD    EQU    FALSE    ;WANT TO USE PASSWORD?
  214. USRLOG    EQU    TRUE    ;WANT TO COUNT NUMBER OF USERS?
  215. IMSAI    EQU    TRUE     ;ADDS VARIOUS OPIONS W/SENSE SW'S
  216. CPM2    EQU    TRUE    ;USING CP/M 2.X?
  217. MAX$USER EQU    3    ;SET TO 0 FOR CP/M 1.X
  218. MAX$DRIVE EQU    3    ;HIGHEST DRIVE SUPPORTED
  219. FASTCLK EQU    TRUE    ;SET TRUE FOR 4 MHZ CLOCK
  220. TIMEOUT EQU    TRUE    ;WANT AUTO LOG-OFF FOR SLEEPY CALLERS?
  221. TOVALUE EQU    7    ;THIS IS 7 MINUTES TO AUTO LOGOUT
  222. WELUSR    EQU    0    ;USER # THAT WELCOME FILE IS KEPT IN
  223. COMFILE EQU    TRUE    ;WANT TO AUTOBOOT A COM FILE?
  224. COMUSR    EQU    3    ;USER # THAT COMFILE IS KEPT IN
  225. DECIMAL EQU    TRUE    ;WANT DECIMAL VALUES FOR LOGS?
  226. CK$LWC    EQU    TRUE    ;WANT TO TRAP LOWER CASE?
  227. ;
  228. ; SPECIAL KEYS FOR SPECIAL FUNCTIONS
  229. ;
  230. FKEYS    EQU    TRUE    ;WANT SPECIAL FUNCTION KEYS?
  231. ;
  232. ;ASSIGN FUNCTION KEYS TO THE FOLLOWING CONTROL CODES (IF USED):
  233. ;
  234. TWITKEY EQU    'N'-40H ;KEYCODE TO LOG-OUT A CREEP
  235. MSGKEY    EQU    'Q'-40H ;KEYCODE TO PRINT 'MESG FROM OPER:'
  236. SYSDKEY EQU    'O'-40H ;KEYCODE TO PRINT SYS DOWN MSG
  237. ;
  238. ;    FRONT-PANEL SELECTION OPTIONS
  239. ;
  240. SENSE    EQU    0FFH    ;SENSE SWITCH PORT NUMBER
  241. ;
  242. BLACKOUT EQU    TRUE    ;SWITCH TO TURN OFF REMOTE SEND
  243. HARDLOG EQU    TRUE    ;SWITCH TO ECHO REMOTE KBD TO PRINTER
  244. SELPASS EQU    TRUE     ;SWITCH TO REQUIRE A PASSWORD
  245. ;
  246. ;    ASSIGNMENT OF FRONT-PANEL OPTIONS TO SWITCHES:
  247. ;
  248. LOGSW    EQU    01H    ;TURN ON FOR HARDCOPY
  249. PWDSW    EQU    02H    ;TURN ON FOR 'PASSWORD' MODE
  250. BLACKSW EQU    04H    ;TURN ON TO BLACK OUT REMOTE END
  251. ENABLF    EQU    08H    ;TURN ON TO ENABLE SPL FUNC KEYS
  252. ;
  253. ;****************************************************
  254. ;*     END OF OPTION CONFIGURATION SECTION        *
  255. ;****************************************************
  256.     IF    DCHAYES
  257. ;************ D.C. HAYES MODEM I/O AREA ************
  258.  
  259. ;ALL MODEM I/O AND CONTROL ARE HERE.
  260.  
  261.  
  262. ;    PORT EQUATES
  263.  
  264. DPORT    EQU    DATA    ;DATA PORT
  265. STATUS    EQU    DATA+1
  266. RPORT    EQU    STATUS    ;MODEM STATUS PORT
  267. CR1    EQU    DATA+1
  268. CR2    EQU    DATA+2
  269. CR3    EQU    DATA+3
  270.  
  271. ;    BIT FUNCTIONS
  272. ;STATUS REGISTER
  273.  
  274. RRF    EQU    1    ;RECIEVE REGISTER FULL
  275. TRE    EQU    2    ;TRANSMITTER HOLDING REGISTER EMPTY
  276. PE    EQU    4    ;PARITY ERROR
  277. FE    EQU    8    ;FRAMING ERROR
  278. OE    EQU    10H    ;OVERRUN ERROR
  279. TMR    EQU    20H    ;TIMER STATUS (MM100 ONLY)
  280. CD    EQU    40H    ;CARRIER PRESENT
  281. RI    EQU    80H    ;NOT RING INDICATOR (LOW TRUE)
  282. P2RDET    EQU    RI    ;SAME AS ABOVE
  283.  
  284. ;CONTROL REGISTER 1  (CR1)
  285.  
  286. EPE    EQU    1    ;EVEN PARITY ENABLE
  287. LS1    EQU    2    ;WORD LENGTH SELECT BIT 1
  288. LS2    EQU    4    ;WORD LENGTH SELECT BIT 2
  289. SBS    EQU    8    ;STOP BITS
  290. PI    EQU    10H    ;PARITY INHIBIT
  291. TMIE    EQU    20H    ;TIMER INTERRUPTS ENABLE (MM100 ONLY)
  292.  
  293.  
  294. ;CONTROL REGISTER 2  (CR2)
  295.  
  296. BRS    EQU    1    ;BAUD RATE CONTROL
  297. TXE    EQU    2    ;TRANSMIT CARRIER ENABLE
  298. MS    EQU    4    ;MODE (0=ANSWER 1=ORIGINATE)
  299. BRK    EQU    8    ;SEND BREAK
  300. ST    EQU    10H    ;SELF TEST
  301. TIE    EQU    20H    ;TRANSMITTER INTERRUPT ENABLE
  302. RIE    EQU    40H    ;RECIEVER INTERRUPT ENABLE (MM100 ONLY)
  303. OH    EQU    80H    ;OFF-HOOK
  304. ;
  305.     ENDIF
  306. ;
  307. ;
  308.     IF    PMMI
  309. ;    PMMI MODEM PORT ASSIGNMENTS:
  310. ;
  311. ;PMMI MODEM PORT EQUATES (TPORT PREVIOUSLY DONE)
  312. ;
  313. DPORT    EQU    TPORT+1 ;DATA PORT
  314. RPORT    EQU    TPORT+2 ;RATE GEN/MODEM STATUS
  315. CPORT    EQU    TPORT+3 ;MODEM CONTROL
  316. ;
  317. ;MODEM CONTROL COMMAND WORDS
  318. ;
  319. P3CLEAR EQU    3FH    ;IDLE MODE
  320. ;
  321. ;SET FOLLOWING TO 5FH FOR >300 BAUD
  322. ;
  323. P3TODTR EQU    5FH    ;Turn On DTR
  324. ;
  325. ;SWITCH HOOK AND MODEM COMMANDS,
  326. ;    OUTPUT TO TPORT (PORT 0)
  327. ;
  328. P0BYE    EQU    0    ;ON HOOK, OR DIALING BREAK
  329. P0ORIG    EQU    1    ;OFF HOOK, ORIG.
  330. P0ANSW    EQU    2    ;ANSWER PHONE
  331. P08BIT    EQU    0CH    ;8 DATA BITS
  332. P0NOPY    EQU    10H    ;NO PARITY
  333. P0EPS    EQU    20H    ;EVEN PARITY SELECT
  334. P0TSB    EQU    40H    ;2 STOP BITS
  335. P0EI    EQU    80H    ;ENABLE INTERRUPTS
  336. P0NORM    EQU    P08BIT+P0NOPY ;I USE 8 BITS, NO PARITY
  337. P0110    EQU    P08BIT+P0NOPY+P0TSB ;SAME W/2 STOP BITS
  338. ;
  339. ;MODEM STATUS, INPUT ON RPORT (PORT 3)
  340. ;
  341. P2DTD    EQU    1    ;DIAL TONE DETECT
  342. P2RDET    EQU    2    ;RING DETECT
  343. P2CTS    EQU    4    ;CTS (CARRIER DETECT)
  344. P2RXBRK EQU    8    ;RECEIVE BREAK
  345. P2CONN    EQU    10H    ;CONNECTED? (0=YES,
  346. ;             1=MODEM CHIP HUNG UP)
  347. P2TMPUL EQU    80H    ;TIMER PULSES (40% UP CYCLE)
  348. ;
  349. ;TIMER RATE SELECTION
  350. ;
  351. TRATE    EQU    250    ;VALUE FOR .1 SEC
  352. ;
  353. ;PMMI MODEM STATUS MASKS
  354. ;
  355. P0TBMT    EQU    1    ;XMIT BUFF EMPTY
  356. P0DAV    EQU    2    ;DATA AVAILABLE
  357. P0TEOC    EQU    4    ;TEST END OF CHAR
  358. P0RPE    EQU    8    ;REC'D PARITY ERR
  359. P0ORUN    EQU    10H    ;OVERRUN
  360. P0FERR    EQU    20H    ;FRAMING ERROR
  361. ;
  362. ;BAUD RATE DIVISORS
  363. ;
  364. B110    EQU    142    ;110 BAUD
  365. B300    EQU    52    ;300 BAUD
  366. B450    EQU    35    ;450 BAUD
  367. B600    EQU    26    ;600 BAUD
  368. B710    EQU    22    ;710 BAUD
  369.     ENDIF
  370. ;
  371.     ORG    100H
  372. ;
  373. ;MOVE THE MODEM INTERFACE PROGRAM UP TO HI RAM
  374. ;AND JUMP TO IT.
  375. ;
  376. MOVEUP    LXI    B,PEND-START+1    ;NUMBER OF BYTES TO MOVE
  377.     LXI    H,DEST+PEND-START+1 ;END OF MOVED CODE
  378.     LXI    D,SOURCE+PEND-START    ;END OF SOURCE CODE
  379. MVLP    LDAX    D    ;GET BYTE
  380.     DCX    H    ;BUMP POINTERS
  381.     MOV    M,A    ;NEW HOME
  382.     DCX    D
  383.     DCX    B    ;BUMP BYTE COUNT
  384.     MOV    A,B    ;CHECK IF ZERO
  385.     ORA    C
  386.     JNZ    MVLP    ;IF NOT, DO SOME MORE
  387.     PUSH    H    ;SAVE FOR LATER JUMP
  388.     MVI    A,0C3H    ;CLEAR ANY TRAPS SO SYSOP..
  389.     STA    0    ;CAN USER "BYE /A"
  390.     XRA    A    ;NEXT WARMBOOT TO USR0/DRV A
  391.     STA    4
  392.     MVI    C,14    ;MAKE DRIVE A DEFAULT
  393.     MOV    E,A    ;LOG-IN DRIVE CP/M FUNCTION
  394.     CALL    BDOS
  395. ;
  396.     IF    CPM2    ;SET USER 0
  397.     MVI    C,32    ;GET/SET USR CP/M FUNCTION
  398.     MVI    E,WELUSR
  399.     CALL    BDOS
  400.     ENDIF
  401. ;
  402.     RET        ;TO ADRS PUSHED ABOVE
  403. ;
  404. ;
  405. SOURCE    EQU    $    ;BOUNDARY MEMORY MARKER
  406. ;
  407. OFFSET    EQU    DEST-SOURCE ;RELOC AMOUNT
  408. ;-----------------------------------------------;
  409. ;    THE FOLLOWING CODE GETS MOVED        ;
  410. ;     TO HI RAM LOCATED AT "DEST",        ;
  411. ;        WHERE IT IS EXECUTED.        ;
  412. ;-----------------------------------------------;
  413. ;XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
  414. ;XX   C A U T I O N :  IF MODIFYING ANYTHING    XX
  415. ;XX    IN THIS PROGRAM FROM HERE ON:        XX
  416. ;XX    A-L-L  LABELS MUST BE OF THE FORM:    XX
  417. ;XX    label    EQU    $+OFFSET        XX
  418. ;XX    IN ORDER THAT THE RELOCATION TO HI RAM    XX
  419. ;XX    WORK SUCCESSFULLY.  FORGETTING TO    XX
  420. ;XX    SPECIFY '$+OFFSET' WILL CAUSE THE PRO-    XX
  421. ;XX    GRAM TO JMP INTO WHATEVER IS CURRENTLY    XX
  422. ;XX    IN LOW MEMORY, WITH UNPREDICTABLE    XX
  423. ;XX    RESULTS.  BE CAREFUL....        XX
  424. ;XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
  425. ;
  426. ;    IF CARRIER LOST, HANG UP, AWAIT RING.
  427. ;    OTHERWISE, SAY GOODBYE, AND HANG UP
  428. ;
  429. START    EQU    $+OFFSET
  430. ;
  431.     XRA    A    ;GET 0
  432.     STA    LOSTFLG ;SHOW NO CARR. LOST
  433. ;
  434. ;    DON'T ALLOW A REMOTE USER TO DO 'BYE /A'
  435. ;
  436.     IF    DCHAYES
  437.     IN    STATUS
  438.     ANI    CD    ;CHECK CARRIER DETECT
  439.     JNZ    GOODBY    ;SAY GOODBYE IF REMOTE
  440.     ENDIF
  441. ;
  442.     IF    PMMI
  443.     IN    RPORT    ;AS ABOVE, FOR PMMI MODEM
  444.     ANI    P2CTS    ;CD DEDUCED FROM CTS
  445.     JZ    GOODBY
  446.     ENDIF
  447. ;
  448. ;CHECK FOR /A OPTION ON COMMAND - REQUEST TO
  449. ;GO IMMEDIATELY INTO ANSWER MODE
  450. ;
  451.     LXI    H,FCB+1 ;TO OPTION
  452.     MOV    A,M
  453.     CPI    '/'    ;OPTION?
  454.     JNZ    HANGUP
  455. ;GOT AN OPTION - VALIDATE IT
  456.     INX    H    ;TO OPTION BYTE
  457.     MOV    A,M    ;GET IT
  458.     STA    OPTION    ;MIGHT NEED LATER
  459.     CPI    'A'    ;ANSWER?
  460.     JZ    ANSWER
  461. ;
  462.     IF    COMFILE
  463.     CPI    'C'
  464.     JZ    ANSWER
  465.     ENDIF
  466. ;
  467.     IF    USRLOG    ;CHECK FOR RESET OF COUNTERS
  468.     CPI    'R'
  469.     CZ    RESET
  470.     ENDIF
  471. ;
  472.     JMP    HANGUP    ;WE KNOW IT'S LOCAL, SO SKIP CALL TO CARCK
  473.  
  474. ;NO OPTION, OR INVALID ONE
  475. NOSLASH EQU    $+OFFSET
  476.     CALL    CARCK    ;SIGNED OFF W/THIS PROG?
  477.     JC    HANGUP    ;NOBODY THERE
  478. ;
  479. GOODBY    EQU    $+OFFSET
  480.     CALL    ILPRT    ;PRINT THIS MSG:
  481.     DB    CR,LF,'GOOD BYE, CALL AGAIN'
  482.     DB    CR,LF,CR,LF,0
  483.     CALL    UNPATCH ;UNDO BIOS PATCHES
  484. ;
  485. ;    NOBODY THERE, OR WE ARE DONE, SO HANG UP
  486. ;
  487. HANGUP    EQU    $+OFFSET
  488.     LXI    SP,STACK ;SET UP LOCAL STACK
  489.     XRA    A     ;FORCE NEXT WARMBOOT TO USER 0
  490.     STA    4     ;AND DRIVE A
  491.     MVI    C,14     ;MAKE DRIVE A DEFAULT
  492.     MOV    E,A
  493.     CALL    BDOS
  494.     MVI    A,' '     ;DON'T ALLOW OPTIONS..
  495.     STA    OPTION     ;..AFTER 1 "BYE / <ANYTHING>"
  496. ;
  497.     IF    CPM2 AND COMFILE
  498.     MVI    C,32     ;GET/SET USER CODE
  499.     MVI    E,COMUSR ;LOCATION OF OUR COMFILE
  500.     CALL    BDOS
  501.     ENDIF
  502. ;
  503.     IF    COMFILE
  504.     CALL    LODCOM    ;LOAD THE COM FILE
  505.     ENDIF
  506. ;
  507. ;
  508. HANGUP2 EQU    $+OFFSET
  509. ;
  510. ;CLEAR DTR CAUSING PHONE TO HANG UP
  511.     IF    DCHAYES
  512.     XRA    A    ;GET A ZERO
  513.     OUT    CR2    ;WRITE TO CR2, CAUSING HANGUP
  514.     ENDIF
  515.     IF    PMMI
  516.     MVI    A,P3CLEAR ;CLEAR..
  517.     OUT    CPORT    ;..DTR
  518.     ENDIF
  519.     MVI    A,0C3H    ;CLEAR ANY TRAPS..
  520.     STA    0    ;..LEFT FROM COM FILE
  521. ;
  522. ;    AWAIT RINGING
  523. ;
  524. RINGWT    EQU    $+OFFSET
  525. ;CHECK LOCAL KEYBOARD FOR CTL-C EXIT REQUEST.
  526. ;NOTE: MUST DO DIRECT INPUT BECAUSE CBIOS PATCHES
  527. ;ARE NOT DONE UNTIL CALL COMES IN.
  528. ;
  529.     CALL    UCSTS
  530. ;
  531.     ANI    7FH    ;STRIP PARITY BIT
  532.     CPI    'C'-40H ;CONTROL C?
  533. ;
  534.     IF    NOT USRLOG
  535.     JZ    0    ;YES, --EXIT-- TO CP/M
  536.     ENDIF
  537. ;
  538.     IF    USRLOG    ;PRINT OUT USER INFO
  539.     JZ    PRNLOG
  540.     ENDIF
  541. ;
  542. RINGW2    EQU    $+OFFSET
  543.     IN    RPORT    ;GET THE STATUS
  544.     ANI    P2RDET    ;RINGING?
  545.     JNZ    RINGWT    ;NO, WAIT
  546. ;
  547. ;THE PHONE IS RINGING, NOW WAIT UNTIL RING IS FINISHED
  548. ENDRING EQU    $+OFFSET
  549.     CALL    DELAY    ;.1 SEC DELAY FOR DEBOUNCE
  550.     IN    RPORT    ;GET STATUS
  551.     ANI    P2RDET    ;STILL RINGING?
  552.     JZ    ENDRING ;WAIT UNTIL RING FINISHED
  553. ;
  554.     IF    CALLBAK ;NEXT ROUTINES IMPLEMENT CALLBACK
  555. ;
  556. ;      THIS ROUTINE MINIMIZES THE COMPUTER'S INTERFERENCE
  557. ;      WITH NORMAL HOUSEHOLD PHONE USE BY HAVING COMPUTER
  558. ;      FOLK DIAL, LET THE PHONE RING ONCE, HANG UP AND 
  559. ;      THEN DIAL AGAIN.  WHEN THE PHONE RINGS ONLY ONCE IT
  560. ;      ALERTS THE COMPUTER WHICH THEN WAITS FOR AND ANSWERS
  561. ;      ANY RING WHICH OCCURS WITHIN THE NEXT 40 SECONDS.
  562. ;
  563.     MVI    L,45    ;DELAY 4.5 SECONDS FOR NEXT RING
  564. WAITNX    EQU    $+OFFSET
  565.     CALL    DELAY    ;WAIT .1 SECONDS
  566.     DCR    L    ;MORE TO GO?
  567.     JNZ    WAITNX    ;YES?...LOOP
  568.     IN    RPORT    ;GET THE STATUS
  569.     ANI    P2RDET    ;RINGING AGAIN?
  570.     JNZ    EXPECT    ;NO?...ITS FOR ME!
  571. ENDRNG2 EQU    $+OFFSET    ;IF SECOND RING THEN CHECK
  572.     IN    RPORT    ;FOR THIRD RING, IN CASE CALLER'S
  573.     ANI    P2RDET    ;PHONE EXCHANGE IS NOT SYNC'ED
  574.     JZ    ENDRNG2 ;WITH COMPUTER'S.
  575.     MVI    L,45
  576. WAITNX2 EQU    $+OFFSET
  577.     CALL    DELAY
  578.     DCR    L
  579.     JNZ    WAITNX2
  580.     IN    RPORT
  581.     ANI    P2RDET
  582.     JNZ    EXPECT    ;ANSWER IF NO THIRD RING
  583. ;CALL NOT FOR COMPUTER - WAIT UNTIL RINGING DONE, THEN RESET
  584. WAITNR    EQU    $+OFFSET
  585.     MVI    L,100    ;WAIT FOR 10 SECS NO RINGING
  586. WAITNRL EQU    $+OFFSET
  587.     CALL    DELAY    ;DELAY .1 SECONDS
  588.     IN    RPORT    ;GET THE STATUS
  589.     ANI    P2RDET    ;STILL RINGING?
  590.     JZ    WAITNR    ;YES, WAIT 10 MORE SECONDS
  591.     DCR    L    ;NO RING, MAYBE WE'RE DONE
  592.     JNZ    WAITNRL ;NO, LOOP SOME MORE
  593.     ENDIF
  594.  
  595. ;
  596.     IF    CALLBAK AND USRLOG
  597.     LDA    NONUSR    ;RECORD AS VOICE CALL
  598.     INR    A
  599.     ENDIF
  600. ;
  601.     IF    CALLBAK AND USRLOG AND DECIMAL
  602.     DAA
  603.     ENDIF
  604. ;
  605.     IF    CALLBAK AND USRLOG
  606.     STA    NONUSR
  607.     ENDIF
  608. ;
  609.     IF    CALLBAK ;CONTINUE WITH CALLBAK ROUTINES
  610.     JMP    HANGUP2
  611. ;
  612. EXPECT    EQU    $+OFFSET
  613.     LXI    H,400    ;40 SECONDS TO REDIAL
  614. RELOOK    EQU    $+OFFSET
  615.     IN    RPORT
  616.     ANI    P2RDET    ;RINGING AGAIN?
  617.     JZ    ANSWER
  618.     CALL    DELAY
  619.     DCX    H
  620.     MOV    A,H
  621.     ORA    L
  622.     JNZ    RELOOK
  623.     JMP    HANGUP2
  624. ;
  625.     ENDIF        ;END OF CALLBACK ROUTINES
  626. ;
  627. ;SETUP MODEM
  628. ANSWER    EQU    $+OFFSET
  629.     IF    USRLOG    ;COUNT # OF LOGON ATTEMPTS
  630.     LDA    OLDUSR    ;GET # OF ATTEPMTS
  631.     INR    A    ;ADD THIS CALL
  632.     ENDIF
  633. ;
  634.     IF    USRLOG AND DECIMAL
  635.     DAA
  636.     ENDIF
  637. ;
  638.     IF    USRLOG
  639.     STA    OLDUSR    ;SAVE # OF ATTEMPTS
  640.     ENDIF
  641. ;
  642.     IF    DCHAYES
  643.     MVI    A,LS1+LS2+PI+SBS    ;8 DATA BITS, NO PARITY, 2 STOP BITS
  644.     OUT    CR1
  645.     MVI    A,TXE+OH    ;TURN ON CARRIER AND ANSWER PHONE
  646.     OUT    CR2
  647.     IN    DATA    ;CLEAR DATA INPUT PORT
  648.     IN    DATA    ;MAKE SURE IT'S CLEAR
  649.     CALL    CARCK    ;SEE IF THERE IS A CARRIER PRESENT
  650.     JC    HANGUP2    ;YES, HANGUP AND WAIT FOR NEXT CALL
  651. ;NOW TEST INPUT FOR BAUD RATE
  652.     CALL    PATCH    ;PATCH JUMP TABLE
  653.     CALL    TSTBAUD    ;SEE IF BAUD = 110
  654.     JZ    WELCOME    ;YES, EXIT
  655.     MVI    A,LS1+LS2+PI    ;SET FOR 1 STOP BIT, 8 DATA, NO PARITY
  656.     OUT    CR1
  657.     MVI    A,TXE+OH+BRS    ;SET FOR 300 BAUD
  658.     OUT    CR2
  659.     CALL    TSTBAUD    ;SEE IF BAUD = 300
  660.     JZ    WELCOME        ;YES,EXIT
  661.     ENDIF
  662.     IF    PMMI
  663.     MVI    A,P3TODTR ;TURN ON
  664.     OUT    CPORT    ;..DTR
  665.     CALL    DELAY    ;GIVE TIME TO TURN ON
  666.     MVI    A,P0110+P0ANSW
  667.     OUT    TPORT    ;ANSWER PHONE
  668.     CALL    DELAY    ;GIVE TIME FOR ANSWER
  669.     CALL    UCSTS
  670.     IN    DPORT    ;CLEAR MODEM PORT
  671.     IN    DPORT    ;MAKE SURE ITS CLEAR
  672.     MVI    A,B110    ;SELECT 110 BAUD
  673.     OUT    RPORT    ;SET BAUD RATE
  674. ;OUTPUT VALUE ALLOWING MODEM TO HANG UP ON
  675. ;LOSS OF CARRIER
  676.     MVI    A,P0110 ;NORMAL MODE FOR 110 BAUD
  677.     OUT    TPORT
  678.     CALL    CARCK    ;LOOK FOR CARRIER
  679.     JC    HANGUP2 ;AWAIT ANOTHER CALLER
  680. ;NOW TEST INPUT FOR BAUD RATE
  681.     CALL    PATCH     ;PATCH JMP TABLE
  682.     CALL    TSTBAUD  ;SEE IF BAUD = 110
  683.     JZ    WELCOME  ;YES, EXIT
  684.     MVI    A,P0NORM ;SET FOR 1 STOP BIT, ETC.
  685.     OUT    TPORT
  686.     MVI    A,B300     ;SET DIVISOR
  687.     OUT    RPORT     ;.. TO 300 RATE
  688.     CALL    TSTBAUD  ;SEE IF BAUD = 300
  689.     JZ    WELCOME  ;YES, EXIT
  690.     MVI    A,B450     ;SET DIVISOR
  691.     OUT    RPORT     ;.. TO 450 RATE
  692.     MVI    A,5FH
  693.     OUT    CPORT     ;SET FILTER VALUE FOR > 300
  694.     CALL    TSTBAUD  ;SEE IF BAUD = 450
  695.     JZ    WELCOME  ;YES, EXIT
  696.     MVI    A,B600     ;SET DIVISOR
  697.     OUT    RPORT     ;.. TO 600 RATE
  698.     CALL    TSTBAUD  ;SEE IF BAUD = 600
  699.     JZ    WELCOME  ;YES, EXIT
  700.     MVI    A,B710    ;SET DIVISOR
  701.     OUT    RPORT    ;.. TO 781 RATE
  702.     CALL    TSTBAUD ;SEE IF BAUD = 710
  703.     JZ    WELCOME ;YES, EXIT
  704.     ENDIF
  705. ;
  706.     CALL    UNPATCH  ;RESTORE ORIG BIOS JMP TBL
  707.     JMP    ANSWER     ;TEST MORE - INVALID BAUD RATE
  708. ;
  709. ;    Get the console status when unpatched
  710. ;
  711. UCSTS    EQU    $+OFFSET
  712.     IF    CPM2
  713.     MVI    C,DIRECTIO ;DIRECT I/O CALL WILL RETURN
  714.     MVI    E,0FFH       ;ASK FOR INPUT
  715.     CALL    BDOS       ;A=0 IF NO CHAR WAITING
  716.     RET
  717.     ENDIF
  718. ;
  719.     IF    NOT CPM2
  720.     MVI    C,CSTS      ;IN CPM 1.X, WE HAVE TO GET..
  721.     CALL    BDOS      ;..THE STATUS FIRST
  722.     ORA    A
  723.     RZ
  724.     MVI    C,CI      ;AND THEN THE CHARACTER
  725.     CALL    BDOS
  726.     RET
  727.     ENDIF
  728.  
  729. ;
  730. ;FOLLOWING ARE THE USRLOG ROUTINES
  731. ;
  732.     IF    USRLOG    ;INCLUDE RESET FUNCTIONS
  733. RESET    EQU    $+OFFSET    ;RESET ALL LOGON COUNTERS
  734.     XRA    A
  735.     ENDIF
  736. ;
  737.     IF    USRLOG AND PWRQD
  738.     STA    OLDUSR    ;RESET ATTEMPT COUNTER
  739.     ENDIF
  740. ;
  741.     IF    USRLOG
  742.     STA    NEWUSR    ;RESET LOGON COUNTER
  743.     ENDIF
  744. ;
  745.     IF    USRLOG AND CALLBAK
  746.     STA    NONUSR    ;RESET VOICE COUNTER
  747.     ENDIF
  748. ;
  749.     IF    USRLOG AND IMSAI
  750.     CMA
  751.     OUT    SENSE    ;RESET IMSAI PANEL DISPLAY
  752.     ENDIF
  753. ;
  754.     IF    USRLOG
  755.     RET
  756.     ENDIF
  757. ;
  758. PRNLOG    EQU    $+OFFSET
  759. ;
  760.     IF    USRLOG AND PWRQD ;PRINT # OF LOGON ATTEMPTS
  761.     MVI    C,09H
  762.     LXI    D,ATMSG
  763.     CALL    BDOS
  764.     LDA    OLDUSR
  765.     CALL    HXOUT
  766.     ENDIF
  767. ;
  768.     IF    USRLOG    ;PRINT # OF LOGONS
  769.     MVI    C,09H
  770.     LXI    D,SUMSG
  771.     CALL    BDOS
  772.     LDA    NEWUSR
  773.     CALL    HXOUT
  774.     ENDIF
  775. ;
  776.     IF    USRLOG AND CALLBAK    ;# OF VOICE CALLS
  777.     MVI    C,09H
  778.     LXI    D,VCMSG
  779.     CALL    BDOS
  780.     LDA    NONUSR
  781.     CALL    HXOUT
  782.     ENDIF
  783. ;
  784.     IF    USRLOG
  785.     JMP    0    ;WARM-BOOT BACK TO CP/M
  786.     ENDIF
  787. ;
  788.     IF    USRLOG AND PWRQD
  789. ATMSG    EQU    $+OFFSET
  790.     DB    LF,CR,'NUMBER OF LOGON ATTEMPTS: $'
  791.     ENDIF
  792. ;
  793.     IF    USRLOG
  794. SUMSG    EQU    $+OFFSET
  795.     DB    LF,CR,'NUMBER OF LOGONS: $'
  796.     ENDIF
  797. ;
  798.     IF    USRLOG AND CALLBAK
  799. VCMSG    EQU    $+OFFSET
  800.     DB    LF,CR,'NUMBER OF VOICE CALLS: $'
  801.     ENDIF
  802. ;
  803.     IF    USRLOG
  804. HXOUT    EQU    $+OFFSET
  805.     MOV    B,A    ;SAVE NUMBER
  806.     RAR        ;ROTATE RIGHT 4 BITS
  807.     RAR        ;TO MAKE AN ASCII DIGIT
  808.     RAR
  809.     RAR
  810.     CALL    ONEOUT    ;OUTPUT MSH TO CONSOLE
  811.     MOV    A,B    ;GET NUMBER BACK
  812. ONEOUT    EQU    $+OFFSET
  813.     ANI    0FH    ;GET LSH FOR OUTPUT
  814.     CPI    0AH    ;CHECK IF ALPHA
  815.     JC    NOTAL2
  816.     ADI    07H
  817. NOTAL2    EQU    $+OFFSET
  818.     ADI    30H
  819.     PUSH    B
  820.     MVI    C,02H
  821.     MOV    E,A    ;OUTPUT THE NUMBER
  822.     CALL    BDOS
  823.     POP    B
  824.     RET
  825.     ENDIF
  826. ;
  827. ;WELCOME TO THE SYSTEM
  828. ;
  829. WELCOME EQU    $+OFFSET
  830. ;
  831. GETNULL EQU    $+OFFSET
  832.     CALL    ILPRT    ;PRINT THIS MSG:
  833.     DB    CR,LF
  834.     DB    'HOW MANY NULLS (0-9) DO YOU NEED? ',0
  835.     CALL    MINPUT    ;GET VALUE
  836.     MOV    C,A
  837.     CALL    MOUTPUT ;ECHO CHAR
  838.     MOV    A,C
  839.     CPI    '0'
  840.     JC    GETNULL ;BAD, RETRY
  841.     CPI    '9'+1
  842.     JNC    GETNULL ;BAD
  843.     SUI    '0'    ;MAKE BINARY
  844.     STA    NULLS    ;SAVE COUNT
  845. ;
  846.     IF    CK$LWC
  847. GETULC    EQU    $+OFFSET
  848.     CALL    ILPRT    ;NOWPRINT THIS MSG:
  849.     DB    CR,LF
  850.     DB    'CAN YOUR TERMINAL DISPLAY LOWER CASE? ',0
  851.     MVI    A,20H    ;FORCE CASE CONVERSION FOR NOW
  852.     STA    ULCSW
  853.     CALL    MINPUT    ;GET Y OR NO
  854.     MOV    C,A
  855.     CALL    MOUTPUT ;ECHO
  856.     MOV    A,C
  857.     CPI    'N'
  858.     JZ    DONEOPT ;WE'RE ALREADY SET UP FOR NO LWR CASE
  859.     CPI    'Y'
  860.     JNZ    GETULC    ;WASN'T Y OR N...ASK HIM AGAIN
  861.     XRA    A
  862.     STA    ULCSW    ;SET FLAG FOR NO CONVERSION
  863. DONEOPT EQU    $+OFFSET
  864.     ENDIF
  865. ;
  866.     CALL    ILPRT
  867.     DB    CR,LF,0
  868. ;PRINT THE WELCOME FILE
  869.     LXI    H,WELFILN ;SOURCE
  870.     LXI    D,FCB    ;DESTINATION
  871.     MVI    B,13    ;LENGTH
  872.     CALL    MOVE    ;MOVE THE NAME
  873. ;SET DMA ADDR TO 80H
  874.     LXI    D,80H
  875.     MVI    C,STDMA
  876.     CALL    BDOS
  877. ;
  878.     IF    CPM2
  879. ;SET USER FOR WELCOME FILE
  880.     MVI    C,32
  881.     MVI    E,WELUSR
  882.     CALL    BDOS
  883.     ENDIF
  884. ;
  885. ;OPEN THE WELCOME FILE
  886.     LXI    D,FCB
  887.     MVI    C,OPEN
  888.     CALL    BDOS
  889. ;DID IT EXIST?
  890.     INR    A    ;A=> 0 MEANS "NO"
  891.     JZ    PASSINT ;NO WELCOME FILE
  892. ;GOT A FILE, TYPE IT
  893.     XRA    A    ;GET 0
  894.     STA    FCBRNO    ;ZERO RECORD #
  895.     LXI    H,100H    ;GET INITIAL BUFF POINTER
  896. ;TYPE THE WELCOME FILE
  897. WELTYLP EQU    $+OFFSET
  898.     CALL    RDBYTE    ;GET A BYTE
  899.     CPI    1AH    ;EOF?
  900.     JZ    PASSINT ;YES, DONE
  901.     MOV    C,A    ;SETUP FOR TYPE
  902.     CALL    MOUTPUT ;TYPE THE CHAR
  903.     CALL    MSTAT    ;CHECK FOR..
  904.     ORA    A    ;CHAR TYPED?
  905.     JZ    WELTYLP ;..NO, LOOP
  906.     CALL    MINPUT    ;..YES, GET CHAR
  907.     CPI    'C'-40H ;CTL-C?
  908.     JNZ    WELTYLP ;..NO, LOOP UNTIL EOF
  909. ;
  910. ;GET THE PASSWORD
  911. ;
  912. PASSINT EQU    $+OFFSET
  913. ;
  914. ;
  915.     IF    PWRQD AND IMSAI AND SELPASS 
  916.     IN    SENSE    ;TURN THE SWITCH UP..
  917.     ANI    PWDSW    ;..TO REQUIRE THE PASSWORD
  918.     JZ    NOPASS
  919.     ENDIF
  920. ;
  921.     IF    PWRQD
  922.     MVI    D,5    ;5 TRIES AT PASSWORD
  923. PASSINP EQU    $+OFFSET
  924.     CALL    ILPRT
  925.     DB    CR,LF,'ENTER PASSWORD: ',0
  926.     LXI    H,PASSWD ;POINT TO PASSWORD
  927.     MVI    E,0    ;NO MISSED LETTERS
  928.     IN    DPORT    ;CLEAR OUT GARBAGE
  929. PWMLP    EQU    $+OFFSET
  930.     CALL    MINPUT    ;GET A CHAR
  931.     CPI    'U'-40H ;CTL-U?
  932.     JZ    PASSINP ;YES, RE-GET IT
  933.     CPI    60H    ;LOWER CASE?
  934.     JC    NOTLC    ;NO,
  935.     ANI    5FH    ;MAKE UPPER CASE ALPHA
  936. NOTLC    EQU    $+OFFSET
  937.     CMP    M    ;MATCH PASSWORD?
  938.     JZ    PWMAT    ;..YES
  939.     MVI    E,1    ;..NO, SHOW MISS
  940.     CPI    CR    ;C/R?
  941.     JNZ    PWMLP    ;..NO, WAIT FOR C/R
  942. ;PASSWORD DIDN'T MATCH
  943. PWNMAT    EQU    $+OFFSET
  944.     CALL    ILPRT
  945.     DB    '++INCORRECT++',CR,LF,0
  946.     DCR    D    ;MORE TRIES?
  947.     JNZ    PASSINP ;YES
  948.     JMP    BADPASS ;NO, GO HANG UP
  949. ;CHARACTER MATCHED IN PASSWORD
  950. PWMAT    EQU    $+OFFSET
  951.     INX    H    ;TO NEXT CHAR
  952.     CPI    CR    ;END?
  953.     JNZ    PWMLP    ;..NO, LOOP
  954. ;END OF PASSWORD.  ANY MISSED CHARS?
  955.     MOV    A,E    ;GET FLAG
  956.     ORA    A
  957.     JNZ    PWNMAT    ;NOT RIGHT
  958. ;PASSWORD CORRECT
  959.     ENDIF
  960. ;
  961. NOPASS    EQU    $+OFFSET
  962. ;
  963.     IF    USRLOG    ;COUNT # OF SUCCESSFUL LOGONS
  964.     LDA    NEWUSR    ;GET LAST VALUE
  965.     INR    A    ;INCREMENT IT
  966.     ENDIF
  967. ;
  968.     IF    USRLOG AND DECIMAL
  969.     DAA
  970.     ENDIF        ;DECIMAL
  971. ;
  972.     IF    USRLOG
  973.     STA    NEWUSR    ;SAVE NEW VALUE
  974.     ENDIF        ;USRLOG
  975. ;
  976.     IF    IMSAI AND USRLOG    ;DISPLAY ON IMSAI
  977.     CMA
  978.     OUT    SENSE    ;DISPLAY ON IMSAI FRONT PANEL
  979.     ENDIF
  980. ;
  981.     CALL    ILPRT
  982.     DB    CR,LF,'',0    ;PUT BOOT-UP MSG HERE
  983. ;
  984.     IF    COMFILE AND CPM2
  985.     MVI    C,32
  986.     MVI    E,COMUSR    ;SWITCH TO COM FILE USER #
  987.     CALL    BDOS
  988.     ENDIF
  989. ;
  990.     IF    COMFILE
  991.     LDA    OPTION
  992.     CPI    'A'    ;SYSOP CAN BYPASS COM FILE BY..
  993.     JZ    0    ;..TYPING "BYE /A"
  994.     CPI    'C'    ;OPER CAN ALSO GO TO COM..
  995.     JNZ    100H    ;..FILE LOAD WITH "BYE /C"
  996.     CALL    ILPRT    ;PRINT THIS MESSAGE:'
  997.     DB    'Loading system...',CR,LF,0
  998.     CALL    LODCOM
  999.     JMP    100H    ;EVERYONE ELSE GETS COM FILE
  1000.     ENDIF
  1001. ;
  1002.     IF    NOT COMFILE
  1003.     JMP    0
  1004.     ENDIF
  1005. ;
  1006. ;TSTBAUD ATTEMPTS TO READ A LF OR CR, RETURNS WITH
  1007. ;ZERO FLAG IF THE CHARACTER READ IS ONE OF THESE TWO.
  1008. ;
  1009. TSTBAUD EQU    $+OFFSET
  1010.     CALL    MINPUT    ;GET CHARACTER FROM MODEM
  1011.     CPI    CR    ;IF A CARRIAGE RETURN...
  1012.     RZ        ;.. RETURN
  1013.     CPI    LF    ;IF A LINEFEED...
  1014.     RET        ;RET ZERO FLAG, ELSE NOT ZERO
  1015. ;
  1016. CARCK    EQU    $+OFFSET
  1017. ;    LOSS OF CONNECTION TEST
  1018.     IF    DCHAYES
  1019. ;
  1020. ;THE DC HAYES HAS A HARDWARE HANGUP FEATURE, BUT WE WON'T USE IT.
  1021. ;INSTEAD, IF WE DETECT THAT THERE IS NO CARRIER UPON ENTRY TO
  1022. ;THIS ROUTINE, WE'LL KEEP CHECKING FOR 15 SECONDS TO SEE IF THE
  1023. ;CARRIER RETURNS. IF SO, WE'LL JUST CONTINUE ON. IF NOT, WE'LL
  1024. ;SIGNAL THIS BY SETTING THE CARRY FLAG.
  1025. ;
  1026.     IN    STATUS    ;GET MODEM STATUS
  1027.     ANI    CD    ;GOT A CARRIER?
  1028.     JNZ    CARCK2    ;YES, GO ON WITH TESTS
  1029.     PUSH    B    ;PRESERVE SO WE CAN USE IT
  1030.     MVI    B,150    ;SET FOR 15 SECONDS
  1031. CARLP    EQU    $+OFFSET
  1032.     CALL    DELAY    ;WAIT .1 SECONDS
  1033.     IN    STATUS    ;GET MODEM STATUS
  1034.     ANI    CD    ;HAS CARRIER RETURNED?
  1035.     MOV    A,B    ;PRESERVE COUNTDOWN VALUE
  1036.     POP    B    ;FIX STACK IN CASE ALL IS OK
  1037.     JNZ    CARCK2    ;GOT CARRIER, CONTINUE ON
  1038.     DCR    A    ;COUNT TIME DOWN
  1039.     STC        ;IN CASE THIS IS THE END OF TIME
  1040.     RZ        ;RETURN IF TIMED OUT
  1041.     PUSH    B    ;PRESERVE B
  1042.     MOV    B,A    ;GET COUNTER VALUE IN B
  1043.     JMP    CARLP    ;KEEP CHECKING
  1044.     ENDIF
  1045. ;
  1046.     IF    PMMI
  1047. ;
  1048. ;THE PMMI MODEM AUTOMATICALLY HANGS UP THE
  1049. ;PHONE AFTER 15 SECONDS OF LOSS OF CARRIER,
  1050. ;PROVIDING YOU OUTPUT TO PORT 0 TO ALLOW IT.
  1051. ;(WHICH THIS PROGRAM DOES)
  1052. ;
  1053. ;..SO, THIS ROUTINE FIRST CHECKS IF THE MODEM
  1054. ;HAS HUNG UP, AND IF SO, RETURNS WITH CARRY SET.
  1055. ;IF NOT, IT CHECKS FOR CARRIER, AND RETURNS
  1056. ;IF CARRIER IS ON, OTHERWISE WAITS FOR CARRIER
  1057. ;WHILE STILL TESTING FOR DISCONNECT
  1058. ;
  1059. ;IT TESTS THE PMMI "CTS" (CLEAR TO SEND) BIT
  1060. ;WHICH IS 0 WHEN THERE IS CARRIER
  1061. ;
  1062.     IN    RPORT    ;GET STATUS
  1063.     ANI    P2CONN    ;CONNECTED?
  1064.     STC        ;(IN CASE NOT)
  1065.     RNZ        ;HUNG UP.
  1066. ;STILL CONNECTED, CHECK FOR CARRIER
  1067.     IN    RPORT    ;LOOK AT STATUS
  1068.     ANI    P2CTS    ;GET CARRIER DETECT BIT
  1069.     JZ    CARCK2    ;CONTINUE W/TESTS
  1070. ;
  1071. ;LOOP UNTIL EITHER CONNECTION LOST, OR
  1072. ;CARRIER RETURNS
  1073. ;
  1074.     JMP    CARCK
  1075.     ENDIF
  1076. ;
  1077. ;    NOW TEST DRIVE #'S AND (IF CPM 2.X)
  1078. ;    USER #'S TO INSURE THAT MAXIMUMS
  1079. ;    ARE NOT EXCEEDED
  1080. ;
  1081. CARCK2    EQU    $+OFFSET
  1082.     LDA    4        ;CHECK DISK/USER #
  1083.     ANI    0FH        ;ISOLATE DRIVE
  1084.     CPI    MAX$DRIVE    ;VALID DRIVE?
  1085.     JC    CARCK3        ;YES, SKIP THIS JUNK
  1086.     LDA    4        ;RESTORE WHOLE LOGIN BYTE
  1087.     ANI    0F0H        ;RETAIN USER #
  1088.     STA    4        ;FORCE DRIVE TO A
  1089.     CALL    ILPRT        ;TELL USER WHAT HE DID
  1090.     DB    'INVALID DRIVE - RETURNING TO A:',0
  1091.     JMP    0        ;FORCE WARM BOOT
  1092. CARCK3    EQU    $+OFFSET
  1093. ;
  1094.     IF    CPM2
  1095.     LDA    4        ;REFRESH LOGIN BYTE AGAIN
  1096.     ANI    0F0H        ;ISOLATE USER #
  1097.     CPI    MAX$USER*16+1    ;VALID USER #?
  1098.     JC    CARCK4        ;YES, DON'T CHANGE
  1099.     LDA    4        ;GET BACK LOGIN BYTE
  1100.     ANI    0FH        ;KEEP DRIVE, ZERO USER
  1101.     STA    4
  1102.     CALL    ILPRT        ;TELL HIM WHAT HAPPENED
  1103.     DB    'INVALID USER NUMBER - RETURNING TO 0',0
  1104.     JMP    0        ;FORCE WARM BOOT
  1105.     ENDIF
  1106. ;
  1107. CARCK4    EQU    $+OFFSET
  1108.     ORA    A
  1109.     RET
  1110. ;
  1111. ;    .1 SEC DELAY ROUTINE
  1112. ;
  1113. DELAY    EQU    $+OFFSET
  1114.     PUSH    B
  1115. ;
  1116.     IF    FASTCLK
  1117.     LXI    B,16667     ;4 MHZ TIMING CONSTANT
  1118.     ENDIF
  1119. ;
  1120.     IF    NOT FASTCLK
  1121.     LXI    B,8334        ;2 MHZ TIMING CONSTANT
  1122.     ENDIF
  1123. ;
  1124. DELAY1    EQU    $+OFFSET
  1125.     DCX    B
  1126.     MOV    A,B
  1127.     ORA    C
  1128.     JNZ    DELAY1
  1129.     POP    B
  1130.     RET
  1131. ;
  1132. ;    50 MS DELAY ROUTINE
  1133. ;
  1134. KDELAY    EQU    $+OFFSET
  1135.     PUSH    B
  1136. ;
  1137.     IF    FASTCLK
  1138.     LXI    B,8334
  1139.     ENDIF
  1140. ;
  1141.     IF    NOT FASTCLK
  1142.     LXI    B,4167
  1143.     ENDIF
  1144. ;
  1145.     JMP    DELAY1
  1146. ;
  1147. ;PATCH IN THE NEW JMP TABLE (SAVING THE OLD)
  1148. ;
  1149. PATCH    EQU    $+OFFSET
  1150.     CALL    TBLADDR ;CALC HL= CP/M JMP TABLE
  1151.     LXI    D,VCOLDBT ;POINT TO SAVE LOCATION
  1152.     MVI    B,18    ;ALWAYS SAVE PRINTER VECTOR
  1153.     CALL    MOVE    ;MOVE IT
  1154. ;NOW MOVE NEW JMP TABLE TO CP/M
  1155.     CALL    TBLADDR ;CALC HL=CP/M'S JMP TABLE
  1156.     XCHG        ;MOVE TO DE
  1157.     LXI    H,NEWJTBL ;POINT TO NEW
  1158.     CALL    MOVE    ;MOVE IT
  1159.     RET
  1160. ;
  1161. UNPATCH EQU    $+OFFSET
  1162.     CALL    TBLADDR ;HL=CP/M'S JMP TABLE
  1163.     XCHG        ;MOVE TO DE
  1164.     LXI    H,VCOLDBT  ;GET SAVED TABLE
  1165.     CALL    MOVE    ;MOVE ORIG BACK
  1166.     RET            
  1167. ;
  1168. ;CALCULATE HL=CP/M'S JUMP TABLE, B=LENGTH
  1169. ;
  1170. TBLADDR EQU    $+OFFSET
  1171.     LHLD    1    ;GET BIOS POINTER
  1172.     DCX    H    ;..SKIP
  1173.     DCX    H    ;..TO
  1174.     DCX    H    ;..COLD BOOT
  1175. ;
  1176.     IF    NOT PRINTER
  1177.     MVI    B,18    ;BYTES TO MOVE
  1178.     ENDIF
  1179. ;
  1180.     IF    PRINTER ;RETAIN LIST DEVICE?
  1181.     MVI    B,15    ;DON'T MOVE LISTER JUMP
  1182.     ENDIF
  1183. ;
  1184.     RET
  1185. ;
  1186. ;MOVE (HL) TO (DE), LENGTH IN (B)
  1187. ;
  1188. MOVE    EQU    $+OFFSET
  1189.     MOV    A,M    ;GET A BYTE
  1190.     STAX    D    ;PUT AT NEW HOME
  1191.     INX    D    ;BUMP POINTERS
  1192.     INX    H
  1193.     DCR    B    ;DEC BYTE COUNT
  1194.     JNZ    MOVE    ;IF MORE, DO IT
  1195.     RET        ;IF NOT,RETURN
  1196. ;
  1197. ;COMMON ROUTINE TO CHECK FOR CARRIER LOST,
  1198. ;CALLED FROM  CONSOLE OUT
  1199. ;
  1200. CHECK    EQU    $+OFFSET
  1201.     CALL    CARCK    ;SEE IF CARRIER STILL ON
  1202.     RNC        ;ALL OK
  1203. ;CARRIER IS LOST.  TYPE MESSAGE SO LOCAL CONSOLE
  1204. ;    SHOWS THE REASON
  1205. BADPASS EQU    $+OFFSET ;COME HERE ON BAD PASSWORD
  1206.     MVI    A,1    ;SHOW CARRIER LOST SO
  1207.     STA    LOSTFLG ;..WE WON'T CK AGAIN
  1208.     LXI    SP,STACK ;ENSURE VALID STACK
  1209.     CALL    ILPRT
  1210.     DB    CR,LF
  1211.     DB    '++CARRIER LOST++'
  1212.     DB    CR,LF,'   ',0
  1213.     CALL    UNPATCH ;RESTORE ORIG BIOS JMP TBL
  1214.     XRA    A    ;CLEAR OUT CARRIER..
  1215.     STA    LOSTFLG ;..LOST FLAG
  1216.     JMP    HANGUP
  1217. ;
  1218. ;READBYTE ROUTINE - USED TO READ THE
  1219. ;    WELCOME FILE
  1220. ;
  1221. RDBYTE    EQU    $+OFFSET
  1222.     MOV    A,H    ;TIME TO READ?
  1223.     ORA    A    ;..IF AT 100H
  1224.     JZ    NORD    ;NO READ REQ'D
  1225. ;HAVE TO READ A SECTOR
  1226.     LXI    D,FCB
  1227.     MVI    C,READ
  1228.     CALL    BDOS
  1229.     ORA    A    ;OK?
  1230.     MVI    A,1AH    ;FAKE UP EOF
  1231.     RNZ        ;RET EOF IF BAD
  1232.     LXI    H,80H
  1233. NORD    EQU    $+OFFSET
  1234.     MOV    A,M    ;GET CHAR
  1235.     INX    H    ;TO NEXT
  1236.     RET
  1237. ;
  1238. ;KEYBOARD/MODEM STATUS TEST ROUTINE
  1239. ;
  1240. MSTAT    EQU    $+OFFSET
  1241. ;
  1242.     IF    DUAL$IO ;WANT LOCAL CONSOLE?
  1243.     CALL    CONSTAT ;GET LOCAL STATUS
  1244.     ORA    A
  1245.     RNZ        ;RET IF LOCAL CHAR
  1246.     ENDIF
  1247. ;
  1248.     IF    DCHAYES
  1249.     IN    STATUS    ;GET MODEM STATUS
  1250.     ANI    RRF    ;GOT A CHARACTER?
  1251.     RZ        ;RETURN IF NOT
  1252.     IN    STATUS    ;GET MODEM STATUS
  1253.     ANI    FE+OE    ;CHECK FOR FRAMING AND OVERRUN ERROR
  1254.     JZ    MSTAT1    ;NO ERROR, CHARACTER IS VALID
  1255.     IN    DATA    ;SWALLOW CHARACTER (ALSO CLEAR OE & FE)
  1256.     XRA    A    ;RETURN FALSE
  1257.     RET
  1258.     ENDIF
  1259. ;
  1260.     IF    PMMI
  1261.     IN    TPORT    ;GET STATUS
  1262.     ANI    P0DAV    ;DATA AVAILABLE?
  1263.     RZ        ;RETURN IF NOT READY
  1264.     IN    TPORT    ;GET STATUS
  1265.     ANI    30H    ;CHECK FRAMING AND OVERRUN BITS
  1266.     JZ    MSTAT1    ;NO ERRORS...LEGIT CHARACTER
  1267.     IN    DPORT    ;SWALLOW CHARACTER (CLEARS PODAV)
  1268.     XRA    A    ;RETURN FALSE
  1269.     RET
  1270.     ENDIF
  1271. ;
  1272. MSTAT1    EQU    $+OFFSET
  1273.     MVI    A,0FFH    ;SHOW READY
  1274.     ORA    A
  1275.     RET
  1276. ;
  1277. ;MODEM INPUT FUNCTION, CHECKS LOCAL CONSOLE FIRST
  1278. ;
  1279. MINPUT    EQU    $+OFFSET
  1280. ;
  1281.     IF    TIMEOUT
  1282.     PUSH    H
  1283.     LXI    H,TOVALUE*MINUTES ;INITIALIZE TIMEOUT COUNTER
  1284.     SHLD    TOCNT
  1285.     POP    H
  1286.     ENDIF
  1287. ;
  1288. MINPUT1 EQU    $+OFFSET
  1289.     LDA    LOSTFLG ;KNOWN LOSS..
  1290.     ORA    A    ;..OF CARRIER?
  1291.     CZ    CHECK    ;CARRIER STILL ON?
  1292.     CALL    MSTAT    ;ANYTHING?
  1293.     ORA    A
  1294. ;
  1295.     IF    NOT TIMEOUT
  1296.     JZ    MINPUT    ;LOOP TILL CHAR RCD
  1297.     ENDIF
  1298. ;
  1299.     IF    TIMEOUT
  1300.     JNZ    MINPUT2
  1301.     CALL    KDELAY    ;KILL 50 MS
  1302.     PUSH    H
  1303.     LHLD    TOCNT    ;KNOCK DOWN TIMEOUT COUNTER
  1304.     DCX    H
  1305.     SHLD    TOCNT
  1306.     MOV    A,H
  1307.     ORA    L
  1308.     POP    H
  1309.     JNZ    MINPUT1 ;STILL TIME LEFT..KEEP TRYING
  1310.     CALL    ILPRT
  1311.     DB    '+++INPUT TIMED OUT+++',7,7,0
  1312.     JMP    NOSLASH
  1313.     ENDIF
  1314. ;
  1315. MINPUT2 EQU    $+OFFSET
  1316. ;
  1317.     IF    DUAL$IO ;BOTH LOCAL AND REMOTE
  1318.     CALL    CONSTAT ;CHECK LOCAL CONSOLE
  1319.     ORA    A    ;CHAR?
  1320.     JNZ    CONIN    ;..YES, READ IT, RET.
  1321.     ENDIF
  1322. ;
  1323. ;    LOCAL CONSOLE WASN'T READY, SO READ MODEM
  1324. ;
  1325.     IN    DPORT    ;GET DATA BYTE
  1326.     ANI    7FH    ;DELETE PARITY
  1327.     JZ    MINPUT    ;IGNORE NULLS
  1328. ;
  1329.     IF    IMSAI AND HARDLOG
  1330.     PUSH    B
  1331.     MOV    B,A
  1332.     IN    SENSE
  1333.     ANI    LOGSW
  1334.     MOV    A,B
  1335.     POP    B
  1336.     JZ    NOLOG
  1337.     ENDIF        ;END OF IMSAI CONDITIONAL
  1338. ;
  1339.     IF    HARDLOG
  1340.     CPI    20H
  1341.     JNC    MINPUT3
  1342.     CPI    CR
  1343.     JNZ    NOLOG
  1344. MINPUT3    EQU    $+OFFSET
  1345.     CALL    LISTOUT ;ECHO ON PRINTER
  1346.     CPI    CR
  1347.     JNZ    NOLOG    ;CR NEEDS LINEFEED
  1348.     MVI    A,LF
  1349.     CALL    LISTOUT ;SO SEND IT
  1350.     MVI    A,CR    ;GET BACK CR
  1351.     ENDIF        ;END OF HARDLOG
  1352. ;
  1353. NOLOG    EQU    $+OFFSET
  1354. ;
  1355.     CPI    3    ;IS IT CONTROL-C?
  1356.     RNZ        ;NO, PASS IT THRU
  1357.     LDA    0    ;SEE IF WARM BOOT DISABLED
  1358.     CPI    0C3H    ;JMP MEANS WARM BOOT OK
  1359.     MVI    A,3    ;SO RETURN CONTROL-C
  1360.     RZ
  1361.     XRA    A    ;ELSE CONVERT TO NULL
  1362.     RET
  1363. ;
  1364. MOUTPUT EQU    $+OFFSET
  1365. ;IF WE ALREADY KNOW CARRIER IS LOST,
  1366. ;DON'T CHECK FOR IT AGAIN
  1367.     LDA    LOSTFLG ;KNOWN LOSS OF CARRIER?
  1368.     ORA    A
  1369.     CZ    CHECK    ;CARRIER STILL ON?
  1370. ;
  1371.     IF    DCHAYES
  1372.     IN    STATUS    ;GET MODEM STATUS
  1373.     ANI    TRE    ;TRANSMIT REGISTER EMPTY?
  1374.     ENDIF
  1375. ;
  1376.     IF    PMMI
  1377.     IN    TPORT    ;READ MODEM STATUS
  1378.     ANI    P0TBMT    ;XMIT BUFF EMPTY?
  1379.     ENDIF
  1380. ;
  1381.     JZ    MOUTPUT ;LOOP IF NOT READY
  1382. ;
  1383.     IF    IMSAI AND BLACKOUT AND DUAL$IO
  1384.     IN    SENSE    ;FLIP SWITCH UP...
  1385.     ANI    BLACKSW ;..TO BLIND REMOTE USER
  1386.     JNZ    SILENT
  1387.     ENDIF
  1388. ;
  1389.     MOV    A,C    ;GET CHAR
  1390. ;
  1391.     IF    CK$LWC
  1392.     ANI    7FH
  1393.     CPI    60H    ;CHECK FOR LOWER CASE
  1394.     JC    MOUTP2    ;SKIP IF NOT LC
  1395.     CPI    7FH    ;CHECK FOR RUBOUT
  1396.     JZ    MOUTP2
  1397.     PUSH    H
  1398.     LXI    H,ULCSW ;SUBTRACE EITHER 20H OR 0
  1399.     SUB    M
  1400.     POP    H
  1401.     MOV    C,A    ;FORCE ON LOCAL AS WELL AS REMOTE
  1402. MOUTP2    EQU    $+OFFSET
  1403.     ENDIF
  1404. ;
  1405.     OUT    DPORT    ;OUTPUT TO MODEM
  1406. SILENT    EQU    $+OFFSET
  1407. ;
  1408.     IF    DUAL$IO ;TO LOCAL ALSO?
  1409.     CALL    CONOUT    ;SEND TO REGULAR BIOS
  1410.     ENDIF
  1411. ;
  1412. ;CHECK FOR NULLS
  1413. ;
  1414.     CPI    LF    ;TIME FOR NULLS?
  1415.     RNZ        ;NO, RETURN
  1416. ;SEND NULLS IF REQUIRED
  1417.     LDA    NULLS    ;GET COUNT
  1418.     ORA    A    ;ANY?
  1419.     RZ        ;..NO
  1420.     PUSH    B
  1421.     MOV    B,A    ;SAVE COUNT
  1422.     MVI    C,0    ;0 IS A NULL
  1423. NULLP    EQU    $+OFFSET
  1424.     CALL    MOUTPUT ;TYPE A NULL
  1425.     DCR    B    ;MORE?
  1426.     JNZ    NULLP    ;..YES, LOOP
  1427.     POP    B
  1428.     RET
  1429. ;
  1430. ;    BOOT TRAP-BECOMES DISCONNECT IF
  1431. ;    JMP AT 0 HAS BEEN ALTERED
  1432. ;
  1433. MBOOT    EQU    $+OFFSET
  1434.     LDA    0    ;LOOK AT OPCODE
  1435.     CPI    0C3H    ;IS IT STILL JMP?
  1436.     JZ    VWARMBT ;YES, ALLOW IT
  1437.     JMP    NOSLASH ;NO, DISCONNECT
  1438. ;
  1439. ;    INLINE PRINT ROUTINE
  1440. ;    CALL ILPRT
  1441. ;    DB    'MSG',0
  1442. ;
  1443. ILPRT    EQU    $+OFFSET
  1444.     XTHL        ;SAVE HL, GET MSG
  1445.     PUSH    B    ;SAVE
  1446. ILPLP    EQU    $+OFFSET
  1447.     MOV    C,M    ;GET CHAR
  1448.     CALL    MOUTPUT ;OUTPUT IT
  1449.     INX    H    ;POINT TO NEXT
  1450.     MOV    A,M    ;TEST
  1451.     ORA    A    ;..FOR END
  1452.     JNZ    ILPLP
  1453.     POP    B    ;RESTORE
  1454.     XTHL        ;RESTORE HL, RET ADDR
  1455.     RET        ;RET PAST MSG
  1456. ;
  1457.     IF    PWRQD    ;KEEP PASSWORD HERE
  1458. ;ACCESS PASSWORD (ENDS IN C/R)
  1459. ;
  1460. PASSWD    EQU    $+OFFSET
  1461.     DB    'RANDY' ;THE PASSWORD ITSELF
  1462.     DB    CR    ;END OF PASSWORD
  1463. ;ALLOW ROOM FOR BIGGER PASSWORD TO BE
  1464. ;    PATCHED IN
  1465.     DB    0,0,0,0,0,0,0,0,0,0,0,0,0
  1466.     ENDIF
  1467. ;
  1468. ;    ROUTINE TO LOAD THE COM FILE
  1469. ;
  1470.     IF    COMFILE
  1471. LODCOM    EQU    $+OFFSET
  1472.     XRA    A    ;INITIALIZE FCB
  1473.     STA    COMFCB
  1474.     LXI    H,COMFCB+12
  1475.     MVI    B,21
  1476. ZLOOP    EQU    $+OFFSET
  1477.     MVI    M,0
  1478.     INX    H
  1479.     DCR    B
  1480.     JNZ    ZLOOP
  1481.     MVI    C,OPEN    ;NOW OPEN THE FILE
  1482.     LXI    D,COMFCB
  1483.     CALL    BDOS
  1484.     INR    A    ;SHOULD BE NON-ZERO
  1485.     JZ    ABORT    ;NO FILE, ABORT
  1486. ;
  1487. ;    NOW LOAD THE FILE
  1488. ;
  1489.     LHLD    6    ;GET TOP OF MEMORY
  1490.     LXI    D,-80H    ;RECORD LOADS CAN'T START..
  1491.     DAD    D    ;..ABOVE (BDOS) - 80H
  1492.     PUSH    H    ;SAVE ON STACK
  1493. ;
  1494.     LXI    D,80H    ;TPA-80H
  1495.     LXI    B,0    ;KEEP A RECORD COUNTER
  1496.     PUSH    B    ;SAVE COUNTER
  1497.     PUSH    D    ;AND LOAD ADDRESS
  1498. GLOOP    EQU    $+OFFSET
  1499.     POP    D    ;GET TPA ADRS
  1500.     LXI    H,80H    ;POINT TO NXT ADRS TO READ TO
  1501.     DAD    D    ;HL HAS THE ADDRESS
  1502.     POP    B    ;INCREMENT THE COUNTER
  1503. ;
  1504. ;    CHECK FOR LOAD PAST TOP-OF-MEMORY
  1505. ;
  1506.     POP    D    ;GET -(TOP-OF-MEMORY)
  1507.     PUSH    D    ;RE-SAVE FOR NEXT TIME
  1508. ;
  1509.     MOV    A,E    ;SUBTRACT: (TOP) - (ADRS)
  1510.     SUB    L
  1511.     MOV    A,D    ;ONLY THE CARRY NEEDED
  1512.     SBB    H
  1513. ;
  1514.     JNC    SIZEOK    ;CY= BETTER MOVCPM
  1515.     CALL    ERRXIT    ;SO TELL THE STORY
  1516.     DB    '++ PROGRAM AREA TOO SMALL ++','$'
  1517. ;
  1518. SIZEOK    EQU    $+OFFSET
  1519.     INX    B
  1520.     PUSH    B
  1521.     PUSH    H    ;SAVE TPA ADRS
  1522.     XCHG        ;ALIGN REGISTERS
  1523.     MVI    C,STDMA ;TELL BDOS WHERE TO PUT RECORD
  1524.     CALL    BDOS
  1525.     LXI    D,COMFCB ;NOW READ THE RECORD
  1526.     MVI    C,READ
  1527.     CALL    BDOS
  1528.     ORA    A
  1529.     JZ    GLOOP    ;A=0 IF MORE TO READ
  1530.     POP    B    ;UNJUNK STACK
  1531.     POP    B    ;THIS IS OUR COUNTER
  1532.     POP    H    ;MORE JUNK ON STACK
  1533.     MOV    A,B    ;CHECK FOR ZERO
  1534.     ORA    C
  1535.     JZ    ABORT    ;WE SHOULD HAVE READ SOMETHING
  1536.     LXI    D,80H    ;WE DID, RESET DMA TO 80H
  1537.     MVI    C,STDMA
  1538.     CALL    BDOS
  1539.     CALL    LOADOK    ;PRINT THIS MSG TO CONSOLE:
  1540.     DB    '++ COM FILE LOADED ++',CR,LF,'$'
  1541. LOADOK    EQU    $+OFFSET
  1542.     POP    D
  1543.     LDA    OPTION    ;SEE IF THIS WAS "BYE /C"
  1544.     CPI    'C'    ;IF IT WAS THEN..
  1545.     RZ        ;..DON'T PRINT MESSAGE
  1546.     MVI    C,PRINTF
  1547.     CALL    BDOS
  1548.     RET
  1549. ABORT    EQU    $+OFFSET
  1550.     CALL    ERRXIT
  1551.     DB    CR,LF
  1552.     DB    '+++CANNOT FIND COM FILE.+++','$'
  1553. ERRXIT    EQU    $+OFFSET
  1554.     POP    D
  1555.     MVI    C,PRINTF
  1556.     CALL    BDOS    ;PRINT THE ABORT MSG
  1557.     JMP    0    ;GIVE UP
  1558.     ENDIF
  1559.  
  1560. ;
  1561. ;THIS AREA IS USED FOR VECTORING CALLS TO THE
  1562. ;USER'S CBIOS, BUT SAVING THE REGISTERS FIRST
  1563. ;IN CASE THEY ARE DESTROYED.
  1564. ;
  1565. CONSTAT EQU    $+OFFSET
  1566.     PUSH    B
  1567.     PUSH    D
  1568.     PUSH    H
  1569.     CALL    VCONSTAT
  1570.     POP    H
  1571.     POP    D
  1572.     POP    B
  1573.     RET
  1574. ;
  1575. CONIN    EQU    $+OFFSET
  1576.     PUSH    B
  1577.     PUSH    D
  1578.     PUSH    H
  1579.     CALL    VCONIN
  1580. ;
  1581.     IF    FKEYS
  1582.     CALL    CKFUNC
  1583.     ENDIF
  1584. ;
  1585.     POP    H
  1586.     POP    D
  1587.     POP    B
  1588. ;
  1589. ;
  1590. CKFUNC    EQU    $+OFFSET
  1591. ;
  1592.     IF    FKEYS AND IMSAI
  1593.     PUSH    B
  1594.     MOV    B,A    ;SAVE CHAR
  1595.     IN    SENSE    ;READ THE SWITCHES
  1596.     ANI    ENABLF    ;CHECK FKEY ENAB SW
  1597.     MOV    A,B
  1598.     POP    B
  1599.     RZ        ;NO FUNCT IF SW OFF
  1600.     ENDIF
  1601. ;
  1602.     IF    FKEYS
  1603.     CPI    SYSDKEY
  1604.     JZ    SYSDOWN ;TELL CALLER TO LEAVE
  1605.     CPI    TWITKEY
  1606.     JZ    GOODBY    ;MAKE CALLER LEAVE
  1607.     CPI    MSGKEY
  1608.     RNZ
  1609.     CALL    ILPRT    ;SEND CALLER A MESSAGE
  1610.     DB    'MESSAGE FROM OPERATOR:',0
  1611.     MVI    A,' '    ;SOMETHING TO RETURN WITH
  1612.     RET
  1613. ;
  1614. SYSDOWN EQU    $+OFFSET
  1615.     CALL    ILPRT
  1616.     DB    'SYSTEM DOWN IN'
  1617.     DB    ' 5 MINUTES....',0
  1618.     MVI    A,' '
  1619.     RET
  1620.     ENDIF
  1621. ;
  1622. CONOUT    EQU    $+OFFSET
  1623.     PUSH    B
  1624.     PUSH    D
  1625.     PUSH    H
  1626.     CALL    VCONOUT
  1627.     POP    H
  1628.     POP    D
  1629.     POP    B
  1630.     RET
  1631. ;
  1632. LISTOUT    EQU    $+OFFSET
  1633.     PUSH    B
  1634.     PUSH    D
  1635.     PUSH    H
  1636.     PUSH    PSW
  1637.     MOV    C,A
  1638.     CALL    VLISTOUT
  1639.     POP    PSW
  1640.     POP    H
  1641.     POP    D
  1642.     POP    B
  1643.     RET
  1644. ;
  1645. ;
  1646. ;
  1647. ;    THIS IS THE JMP TABLE WHICH IS COPIED
  1648. ;    ON TOP OF THE ONE POINTED TO BY
  1649. ;    LOCATION 1 IN CP/M
  1650. ;
  1651. NEWJTBL EQU    $+OFFSET
  1652.     JMP    MBOOT    ;COLD BOOT
  1653.     JMP    MBOOT    ;WARM BOOT
  1654.     JMP    MSTAT    ;MODEM STATUS TEST
  1655.     JMP    MINPUT    ;MODEM INPUT ROUTINE
  1656.     JMP    MOUTPUT ;MODEM OUTPUT ROUTINE
  1657.     RET        ;DUMMY LIST DEVICE
  1658.     NOP
  1659.     NOP
  1660. ;
  1661. WELFILN EQU    $+OFFSET
  1662.     DB    0,'WELCOME    ',0
  1663. ;WELCOME FILE NAME ^^^^^^^^^^^
  1664. ;
  1665. NULLS    EQU    $+OFFSET
  1666.     DB    5
  1667. ;
  1668. COMFCB    EQU    $+OFFSET
  1669.     DB    0,'RIBBS   COM'
  1670. PEND    EQU    $+OFFSET ;END OF RELOCATED CODE
  1671. ;
  1672. ;    THESE AREAS ARE NOT INITIALIZED
  1673. ;
  1674.     DS    21    ;REST OF COM FCB
  1675. ULCSW    EQU    $+OFFSET
  1676.     DS    1
  1677. OPTION    EQU    $+OFFSET
  1678.     DS    1
  1679. TOCNT    EQU    $+OFFSET
  1680.     DS    2
  1681. ;
  1682. ;
  1683. ;KEEP TRACK OF LOST CARRIER WHEN TYPING
  1684. ;"++CARRIER LOST++" SO WE DON'T LOOP
  1685. ;
  1686. LOSTFLG EQU    $+OFFSET
  1687.     DS    1
  1688. ;
  1689. ;SAVE THE CP/M JUMP TABLE HERE
  1690. ;
  1691. VCOLDBT EQU    $+OFFSET
  1692.     DS    3
  1693. VWARMBT EQU    $+OFFSET
  1694.     DS    3
  1695. VCONSTAT EQU    $+OFFSET
  1696.      DS    3
  1697. VCONIN     EQU    $+OFFSET
  1698.      DS    3
  1699. VCONOUT  EQU    $+OFFSET
  1700.      DS    3
  1701. VLISTOUT EQU    $+OFFSET
  1702.      DS    3
  1703. ;
  1704. ;    SINCE THESE AREAS ARE NOT INITIALIZED,
  1705. ;    THE FOLLOWING COUNTERS WILL NOT BE CHANGED
  1706. ;    BY SUBSEQUENT LOADS OF THIS PROGRAM
  1707. ;
  1708.     IF    USRLOG
  1709. OLDUSR    EQU    $+OFFSET
  1710.     DS    1
  1711. NEWUSR    EQU    $+OFFSET
  1712.     DS    1
  1713. NONUSR    EQU    $+OFFSET
  1714.     DS    1
  1715.     ENDIF
  1716. ;
  1717. ;
  1718.     DS    60
  1719. STACK    EQU    $+OFFSET    ;LOCAL STACK
  1720. ;
  1721. WRCON    EQU    2
  1722. OPEN    EQU    15
  1723. READ    EQU    20
  1724. STDMA    EQU    26
  1725. PRINTF    EQU    9
  1726. DIRECTIO EQU    6
  1727. CSTS    EQU    11
  1728. CI    EQU    1
  1729. FCB    EQU    5CH 
  1730. FCBRNO    EQU    FCB+32
  1731. ;
  1732.     END
  1733.  
  1734.