home *** CD-ROM | disk | FTP | other *** search
/ CP/M / CPM_CDROM.iso / simtel / sigm / vols000 / vol042 / bye.z80 < prev    next >
Encoding:
Text File  |  1984-04-29  |  36.8 KB  |  1,659 lines

  1. ;    BYE V6.9
  2. ;    REMOTE CONSOLE PROGRAM FOR CP/M AND MODEM
  3. ;
  4. ;---------------------------------------------------------------
  5. ; This version of BYE is contributed to CP/M-Net 'as-is'.
  6. ; It has been hacked for Australian conditions, where 
  7. ;  autodial and auto answer are illegal. The Bell-103
  8. ;  modem equates have also been removed.
  9. ; Nevertheless It shows how CDOS can be configured by BYE
  10. ;  as an RCPM host DOS.
  11. ; The table patching routines shown here effectively enable/disable
  12. ;  the printer and allow remote access to the DOS
  13. ;
  14. ; Sorry about the hacking folks..
  15. ; If you need any help contact    Trevor Marshall,
  16. ;                26 Mirrelia Way,
  17. ;                Ferndale, West Australia 6155.
  18. ;
  19. ; ps. If anyone manages to get INFOSOFT IOS to work with this pgm
  20. ;     please let me know. I have ascertained that although IOS
  21. ;    is table driven identiaccly to CDOS (the table information
  22. ;    came from INFOSOFT) it pulls the vector addresses in during
  23. ;    initialization rather than every time a call is made and
  24. ;    although this makes it faster it will not operate with this BYE.
  25. ;    Maybe there is an undocumented system call or something???
  26. ; 14 July 1981
  27. ;-----------------------------------------------------------------
  28. ;This program allows modem callers to use your CP/M system
  29. ;just as if they were seated at the system console.  Special
  30. ;assembly-time options allow limiting the caller's access by
  31. ;password and/or access to only a message-service program.
  32. ;
  33. ;Based on an original program written by Dave Jaffe, January 1979
  34. ;Rewritten for PMMI modem by Ward Christensen, February 1979.
  35. ;The following had a hand in its development:
  36. ; Bill Precht, Hank Syzszka, P.L.Kelley, Bruce Ratoff,David Kozinn
  37. ;  ,Ron Fowler, Dave Hardy, Bruce Levison, Keith Petersen and Robbin Hough.
  38. ; before Trevor Marshall reworked it for CDOS and IOS.
  39. ;For further background information see the file 'BYE69.ASM'.
  40. ;
  41. ;------------------------------------------------
  42. ;
  43. ;This program runs up in high RAM.  It gets there
  44. ;by being moved there when 'BYE' is typed.
  45. ;
  46. ;The program in high RAM does the following:
  47. ;
  48. ;    1.    Hangs up the phone
  49. ;    2.    Awaits ring detect, allows exit
  50. ;        to CP/M if local KBD types CTL-C
  51. ;    3.    Outputs carrier (see callback routines)
  52. ;    4.    Awaits incoming carrier going to step 1
  53. ;        if none found in 15 seconds
  54. ;    5.    Asks number of nulls (0-9)
  55. ;    6.    Types the file "WELCOME" from
  56. ;        disk, allowing CTL-C to skip it
  57. ;    7.    Asks for a password, allowing
  58. ;        5 tried to get it right.
  59. ;    8.    When password entered, if used,
  60. ;        drops into CP/M.
  61. ;    9.    Caller can leave by hanging up,
  62. ;        (any time carrier is lost, it
  63. ;        waits 15 seconds, then goes
  64. ;        back to step 1), or the caller
  65. ;        may type the program name (BYE)
  66. ;
  67. ;------------------------------------------------
  68. ; The original BYE programs will not work with CDOS (IOS) because
  69. ;  they do not use the bios jump table for internal calls to I/O.
  70. ; Instead they are table driven, by an SDVT whick looks like:
  71. ; SDVT    DW    CON,TERM,RDR,PUN,LIST,CLOCK
  72. ; which in turn vectors to tables such as the console I/O
  73. ; CON    DW    CINIT,CSTAT,CINDATA,CRDY,COUTDATA
  74. ; and list
  75. ; LIST    DW    LINIT,LRDY,LOUT
  76. ;
  77. ; These tables are patched to vector to our modem BIOS.
  78. ; We can locate them by using the 81H system BDOS call
  79. ;  which returns a user register pointer in BC
  80. ; (BC) -> URREG (2)
  81. ;      SCHSW (1)
  82. ;      SDVT  (2)
  83. ;      SDT    (2)
  84. ;      SYSBOT(2)
  85. ;      OPILINK (2)
  86. ; and so we can calculate the SDVT address.
  87. ;
  88. ; For further information (or bug info) contact
  89. ;        Trevor Marshall
  90. ;        Wait-Aid,West Aust Inst Tech,
  91. ;        Hayman Rd, Bentley, Western Australia 6102
  92. ; or ring (09) 457 6059 any time.
  93. ;
  94. ;-------------------------------------------------------
  95. ;
  96. ;
  97. ;System equates
  98. ;
  99. FALSE    EQU    0
  100. TRUE    EQU    NOT FALSE
  101. ;
  102. CR    EQU    0DH
  103. LF    EQU    0AH
  104. MINUTES EQU    20*60        ;CONSTANT FOR 1 MIN TIME DELAY
  105. ;
  106. ;Change the following equate to an area in your
  107. ;high memory where this program may patch itself in.
  108. ;Approximate memory requirements: 2k bytes or more,
  109. ;depending upon the options selected.  A marker has
  110. ;been placed at the end to deliberately print an error
  111. ;message during assembly in order to determine the actual
  112. ;ending address of the program.  The error message will
  113. ;not affect the assembly.  Make sure you have memory
  114. ;available up to the address shown.
  115. ;
  116. DEST    EQU    0EA00H        ;RUNNING LOCATION OF CODE
  117. ;
  118. CDOS    EQU    TRUE        ;If running CDOS or IOS
  119. ;
  120. TREVORS EQU    TRUE        ;True for my design
  121. ;
  122. ;
  123. ;You will likely also want to change the password,
  124. ;located below at label 'PASSWD', and the messages
  125. ;printed at label 'WELCOME' and just above label
  126. ;'HANGUP'.
  127. ;
  128. ;****************************************************
  129. ;*        Option configuration section        *
  130. ;****************************************************
  131. ;
  132. PRINTER EQU    FALSE        ;WANT TO RETAIN LIST DEVICE?
  133. DUAL$IO EQU    TRUE        ;WANT CONSOLE & MODEM?
  134. CALLBAK EQU    FALSE        ;WANT CALLBACK FEATURE?
  135. PWRQD    EQU    FALSE        ;WANT TO USE PASSWORD?
  136. USRLOG    EQU    FALSE        ;WANT TO COUNT NUMBER OF USERS?
  137. HARDLOG EQU    FALSE        ;WANT TO ECHO REMOTE KBD TO PRINTER?
  138. MAXDRV    EQU    1        ;HIGHEST DRIVE SUPPORTED
  139. FASTCLK EQU    TRUE        ;SET TRUE FOR 4 MHZ CLOCK
  140. TIMEOUT EQU    FALSE        ;WANT AUTO LOG-OFF FOR SLEEPY CALLERS?
  141. TOVALUE EQU    7        ;THIS IS 7 MINUTES TO AUTO LOGOUT
  142. WELUSR    EQU    0        ;USER # THAT WELCOME FILE IS KEPT IN
  143. COMFILE EQU    TRUE        ;WANT TO AUTOBOOT A COM FILE?
  144. COMUSR    EQU    0        ;USER # THAT COMFILE IS KEPT IN
  145. DECIMAL EQU    TRUE        ;WANT DECIMAL VALUES FOR LOGS?
  146. TRAPLC    EQU    TRUE        ;WANT TO TRAP LOWER CASE?
  147. ;
  148. ;Special keys for special functions
  149. ;
  150. FKEYS    EQU    TRUE        ;WANT SPECIAL FUNCTION KEYS?
  151. ;
  152. ;Assign function keys to the following control codes (if used):
  153. ;
  154. TWITKEY EQU    'N'-40H        ;KEYCODE TO LOG-OUT A CREEP
  155. ;;MSGKEY    EQU    'Q'-40H ;KEYCODE TO PRINT 'MESG FROM OPER:'
  156. SYSDKEY EQU    'O'-40H        ;KEYCODE TO PRINT SYS DOWN MSG
  157. ;
  158. ;
  159. ;****************************************************
  160. ;*     End of option configuration section        *
  161. ;****************************************************
  162. ;
  163. ;All modem I/O and control are here
  164. ;
  165. ;************ Trevor's modem I/O area ************
  166. ;
  167.     IF    TREVORS
  168. ;
  169. ; USART is Intel 8251 or equivalent
  170. ;
  171. DPORT    EQU    0F0H        ;DATA PORT
  172. CPORT    EQU    0F1H        ;CONTROL PORT
  173. SPORT    EQU    CPORT        ;STATUS PORT
  174. BPORT    EQU    0F2H        ;BAUD RATE PORT
  175. ;RPORT    EQU    69H    ;RING INDICATOR PORT
  176. ;
  177. ;The following are CPORT commands
  178. ;
  179. RSTINS    EQU    42H        ;RESET USART AND SEND DTR
  180. MODINS1 EQU    4EH        ;8 BITS, NO PARITY, 1 STOP BIT, 16X BAUD RATE
  181. MODINS2 EQU    0CEH        ;8 BITS, NO PARITY, 2 STOP BITS, 16X BAUD RATE
  182. ONINS    EQU    17H        ;RESET ERROR FLAGS, SEND DTR, ENABLE RECEIVE
  183.     ;AND TRANSMIT
  184. OFFINS    EQU    10H        ;DROP DTR, DISABLE RECEIVE AND TRANSMIT
  185. ;
  186. ;The following are SPORT status masks
  187. ;
  188. TRNRDY    EQU    01H        ;TRANSMITER EMPTY
  189. RCVRDY    EQU    02H        ;DATA AVAILABLE
  190. PERR    EQU    08H        ;PARITY ERROR
  191. ORERR    EQU    10H        ;OVERRUN ERROR
  192. FRERR    EQU    20H        ;FRAMING ERROR
  193. TOERR    EQU    ORERR + FRERR    ;OVERRUN PLUS FRAMING ERROR
  194. DSR    EQU    80H        ;DATA SET READY
  195. ;
  196. ;The following are baud rates for BPORT. The lower 4 bits are used
  197. ;
  198. BD110    EQU    22H        ;110 BAUD
  199. BD300    EQU    55H        ;300 BAUD
  200. BD1200    EQU    77H        ;1200 BAUD
  201. BD2400    EQU    0AAH        ;2400 BAUD
  202. BD4800    EQU    0CCH        ;4800 BAUD
  203. BD9600    EQU    0EEH        ;9600 BAUD
  204. ;
  205. ;Ring indicator port mask
  206. ;
  207. RI    EQU    40H        ;NOT RING INDICATOR (LOW TRUE)
  208. P2RDET    EQU    RI
  209. ;
  210. ;
  211.     ENDIF            ;TREVORS
  212. ;
  213. ;---------------------------------------------------------
  214. ;
  215.     ORG    100H
  216. ;
  217. ;Move modem interface program up to high RAM and jump to it
  218. ;but first..
  219. ; Ensure that the user is logged off if BYE is entered
  220. ;    whilst the vectors have been PATCHED
  221.     LD    HL,(1)        ;Get addr of jmp table in BIOS
  222.     INC    HL        ;see if it points beyond this addr
  223.     LD    E,(HL)        ; i.e., if it points above the BIOS
  224.     INC    HL        ; it must have been patched
  225.     LD    D,(HL)        ;addr now in DE
  226.     LD    HL,DEST        ;get address of BYE code into HL
  227.     LD    A,L        ; SUB HL,DE
  228.     SUB    E        ; HL should be > DE
  229.     LD    L,A        ; i.e., result should be >0  & <8
  230.     LD    A,H
  231.     SBC    D
  232. ;    MOV    H,A
  233.     AND    80H        ;if result is negative (or >32k )
  234.     JP    NZ,GOODBY    ; CDOS  is patched already
  235. ;
  236. MOVEUP    LD    BC,PEND-START+1    ;NUMBER OF BYTES TO MOVE
  237.     LD    HL,DEST+PEND-START+1;END OF MOVED CODE
  238.     LD    DE,SOURCE+PEND-START;END OF SOURCE CODE
  239. ;
  240. MVLP    LD    A,(DE)        ;GET BYTE
  241.     DEC    HL        ;BUMP POINTERS
  242.     LD    (HL),A        ;NEW HOME
  243.     DEC    DE
  244.     DEC    BC        ;BUMP BYTE COUNT
  245.     LD    A,B        ;CHECK IF ZERO
  246.     OR    C
  247.     JP    NZ,MVLP        ;IF NOT, DO SOME MORE
  248. ;
  249.     PUSH    HL        ;SAVE FOR LATER JUMP
  250.     LD    A,0C3H        ;CLEAR ANY TRAPS SO SYSOP..
  251.     LD    (0),A        ;CAN USER "BYE -A"
  252.     XOR    A        ;NEXT WARMBOOT TO USR0/DRV A
  253.     LD    (4),A
  254.     LD    C,14        ;MAKE DRIVE A DEFAULT
  255.     LD    E,A        ;LOG-IN DRIVE CP/M FUNCTION
  256.     CALL    BDOS
  257. ;
  258.     RET            ;TO ADRS PUSHED ABOVE
  259. ;
  260. ;
  261. SOURCE    EQU    $        ;BOUNDARY MEMORY MARKER
  262. ;
  263. OFFSET    EQU    DEST-SOURCE    ;RELOC AMOUNT
  264. ;
  265. ;-----------------------------------------------;
  266. ;    The following code gets moved        ;
  267. ;    to high RAM located at "DEST",        ;
  268. ;        where it is executed.        ;
  269. ;-----------------------------------------------;
  270. ;XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
  271. ;XX   C A U T I O N :  If modifying anything    XX
  272. ;XX    in this program from here on:        XX
  273. ;XX    A-L-L  labels must be of the form:    XX
  274. ;XX    LABEL    EQU    $+OFFSET        XX
  275. ;XX    in order that the relocation to high      XX
  276. ;XX    RAM work successfully.  Forgetting to    XX
  277. ;XX    specify '$+OFFSET' will cause the pro-    XX
  278. ;XX    gram to JMP into whatever is currently    XX
  279. ;XX    in low memory, with unpredictable    XX
  280. ;XX    results.  Be careful....        XX
  281. ;XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
  282. ;
  283. ;If carrier lost, hang up, await ring.
  284. ;Otherwise, say goodbye, and hang up
  285. ;
  286. START    EQU    $+OFFSET
  287. ;
  288.     XOR    A        ;GET 0
  289.     LD    (LOSTFLG),A    ;SHOW NO CARR. LOST
  290. ;
  291. ;Don't allow a remote user to do 'BYE -A'
  292. ;
  293. ;Check for -A option on command - request to
  294. ;go immediately into answer mode
  295.     LD    HL,FCB+1    ;TO OPTION
  296.     LD    A,(HL)
  297.     CP    '-'        ;OPTION?
  298.     JP    NZ,HANGUP
  299. ;Should be JMP NOSLASH??
  300. ;Got an option - validate it
  301.     INC    HL        ;TO OPTION BYTE
  302.     LD    A,(HL)        ;GET IT
  303.     LD    (OPTION),A    ;MIGHT NEED LATER
  304.     CP    'A'        ;ANSWER?
  305.     JP    Z,ANSWER
  306. ;
  307. ;;    IF    COMFILE
  308. ;;    CPI    'C'
  309. ;;    JZ    ANSWER
  310. ;;    ENDIF        ;COMFILE
  311. ;
  312.     IF    USRLOG        ;CHECK FOR RESET OF COUNTERS
  313.     CP    'R'
  314.     CALL    Z,RESET
  315.     ENDIF            ;USRLOG
  316. ;
  317.     JP    HANGUP        ;WE KNOW IT'S LOCAL, SO SKIP CALL TO CARCK
  318. ;
  319. ;No option, or invalid one
  320. ;
  321. NOSLASH EQU    $+OFFSET
  322.     CALL    CARCK        ;SIGNED OFF W/THIS PROG?
  323.     JP    C,HANGUP    ;NOBODY THERE
  324. ;
  325. GOODBY    EQU    $+OFFSET
  326.     CALL    ILPRT        ;PRINT THIS MSG:
  327.     DEFB    CR,LF,'Cheerio, please call again'
  328.     DEFB    CR,LF,0
  329.     CALL    UNPATCH        ;UNDO BIOS PATCHES
  330. ;
  331. ;Nobody there, or we are done, so hang up
  332. ;
  333. HANGUP    EQU    $+OFFSET
  334.     LD    SP,STACK    ;SET UP LOCAL STACK
  335.     XOR    A        ;FORCE NEXT WARMBOOT TO USER 0
  336.     LD    (4),A        ;AND DRIVE A
  337.     LD    C,14        ;MAKE DRIVE A DEFAULT
  338.     LD    E,A
  339.     CALL    BDOS
  340.     LD    A,' '        ;DON'T ALLOW OPTIONS..
  341.     LD    (OPTION),A    ;..AFTER 1 "BYE / <ANYTHING>"
  342. ;
  343.     IF    COMFILE
  344.     CALL    LODCOM        ;LOAD THE COM FILE
  345.     ENDIF            ;COMFILE
  346. ;
  347. ;
  348. HANGUP2 EQU    $+OFFSET
  349. ;
  350. ;Clear DTR causing phone to hang up
  351. ;Was some code in here I deleted by accident;;;;;;;;;;;;;;;;
  352. ;;OFFTI    EQU    $+OFFSET
  353. ;;    CALL    DELAY    ;0.1 SECOND DELAY
  354. ;;    DCR    B
  355. ;;    JNZ    OFFTI    ;KEEP LOOPING UNTIL FINISHED
  356. ;;    POP    B    ;RESTORE B
  357. ;;    MVI    A,ONINS    ;TURN DTR ON ALLOWING MODEM TO ANSWER PHONE
  358. ;;    OUT    CPORT
  359. ;;    ENDIF        ;SUPERB
  360. ;
  361. ;    IF    TREVORS    ;code required
  362. ;    ENDIF    ;TREVORS
  363. ;
  364.     LD    A,0C3H        ;CLEAR ANY TRAPS..
  365.     LD    (0),A        ;..LEFT FROM COM FILE
  366. ;
  367. ;Await ringing
  368. ;
  369. RINGWT    EQU    $+OFFSET
  370. ;
  371. ;Check local keyboard for CTL-C exit request.
  372. ;NOTE: Must do input via BDOS because CBIOS patches
  373. ;are not done until call comes in.
  374. ;;    CALL    UCSTS
  375. ;;    ANI    7FH    ;STRIP PARITY BIT
  376. ;;    CPI    'C'-40H ;CONTROL C?
  377. ;
  378. ;;    IF    NOT USRLOG
  379. ;;    JZ    0    ;YES, --EXIT-- TO CP/M
  380. ;;    ENDIF        ;NOT USRLOG
  381. ;
  382. ;;    IF    USRLOG    ;PRINT OUT USER INFO
  383. ;;    JZ    PRNLOG
  384. ;;    ENDIF        ;USRLOG
  385. ;
  386. RINGW2    EQU    $+OFFSET
  387. ;;    IN    RPORT    ;GET THE STATUS
  388. ;;    ANI    P2RDET    ;RINGING?
  389. ;;    JNZ    RINGWT    ;NO, WAIT
  390. ;
  391. ;The phone may be ringing.  Wait .1 sec and look
  392. ;again to make sure it isn't just relay bounce
  393. ;;    CALL    DELAY    ;.1 SEC DELAY FOR DEBOUNCE
  394. ;;    IN    RPORT    ;GET STATUS
  395. ;;    ANI    P2RDET    ;STILL RINGING?
  396. ;;    JNZ    RINGWT    ;NO, IT WAS RELAY BOUNCE
  397. ;
  398. ;The phone is definitely ringing, now wait until ring is finished
  399. ;
  400. ENDRING EQU    $+OFFSET
  401. ;;    CALL    DELAY    ;.1 SEC DELAY FOR DEBOUNCE
  402. ;;    IN    RPORT    ;GET STATUS
  403. ;;    ANI    P2RDET    ;STILL RINGING?
  404. ;;    JZ    ENDRING ;WAIT UNTIL RING FINISHED
  405. ;
  406.     IF    CALLBAK        ;NEXT ROUTINES IMPLEMENT CALLBACK
  407. ;
  408. ;This routine minimizes the computer's interference
  409. ;with normal household phone use by having computer
  410. ;folk dial, let the phone ring once, hang up and 
  411. ;then dial again.  When the phone rings only once it
  412. ;alerts the computer which then waits for and answers
  413. ;any ring which occurs within the next 40 seconds.
  414. ;
  415.     LD    L,45        ;DELAY 4.5 SECONDS FOR NEXT RING
  416. ;
  417. WAITNX    EQU    $+OFFSET
  418.     CALL    DELAY        ;WAIT .1 SECONDS
  419.     DEC    L        ;MORE TO GO?
  420.     JP    NZ,WAITNX    ;YES, LOOP
  421.     IN    A,RPORT        ;GET THE STATUS
  422.     AND    P2RDET        ;RINGING AGAIN?
  423.     JP    NZ,EXPECT    ;NO?...ITS FOR ME!
  424. ;
  425. ;If second ring, then check for third ring, in case
  426. ;caller's phone exchange not synch'ed with computer's
  427. ;
  428. ENDRNG2 EQU    $+OFFSET
  429.     IN    A,RPORT        ;GET THE STATUS
  430.     AND    P2RDET        ;STILL RINGING?
  431.     JP    Z,ENDRNG2    ;WAIT UNTIL RING FINISHED
  432.     LD    L,45        ;DELAY 4.5 SECONDS FOR NEXT RING
  433. ;
  434. WAITNX2 EQU    $+OFFSET
  435.     CALL    DELAY        ;WAIT .1 SECONDS
  436.     DEC    L        ;MOE TO GO?
  437.     JP    NZ,WAITNX2    ;YES, LOOP
  438.     IN    A,RPORT        ;GET THE STATUS
  439.     AND    P2RDET        ;RINGING AGAIN?
  440.     JP    NZ,EXPECT    ;NO?...ITS FOR ME!
  441. ;
  442. ;Call not for computer - wait until ringing done, then reset
  443. ;
  444. WAITNR    EQU    $+OFFSET
  445.     LD    L,100        ;WAIT FOR 10 SECS NO RINGING
  446. ;
  447. WAITNRL EQU    $+OFFSET
  448.     CALL    DELAY        ;DELAY .1 SECONDS
  449.     IN    A,RPORT        ;GET THE STATUS
  450.     AND    P2RDET        ;STILL RINGING?
  451.     JP    Z,WAITNR    ;YES, WAIT 10 MORE SECONDS
  452.     DEC    L        ;NO RING, MAYBE WE'RE DONE
  453.     JP    NZ,WAITNRL    ;NO, LOOP SOME MORE
  454.     ENDIF            ;CALLBACK
  455. ;
  456.     IF    CALLBAK AND USRLOG
  457.     LD    A,(NONUSR)    ;RECORD AS VOICE CALL
  458.     INC    A        ;ADD ONE TO COUNT
  459.     ENDIF            ;CALLBAK AND USRLOG
  460. ;
  461.     IF    CALLBAK AND USRLOG AND DECIMAL
  462.     DAA            ;MAKE DECIMAL
  463.     ENDIF            ;CALLBK AND USRLOG AND DECIMAL
  464. ;
  465.     IF    CALLBAK AND USRLOG
  466.     LD    (NONUSR),A    ;SAVE NEW COUNT
  467.     ENDIF            ;CALLBK AND USRLOG
  468. ;
  469.     IF    CALLBAK        ;CONTINUE WITH CALLBAK ROUTINES
  470.     JP    HANGUP2        ;GO WAIT FOR NEXT CALL
  471. ;
  472. EXPECT    EQU    $+OFFSET
  473.     LD    HL,400        ;40 SECONDS TO WAIT FOR SECOND CALL
  474. ;
  475. RELOOK    EQU    $+OFFSET
  476.     IN    A,RPORT        ;GET THE STATUS
  477.     AND    P2RDET        ;RINGING AGAIN?
  478.     JP    Z,ANSWER    ;YES, GO ANSWER IT
  479.     CALL    DELAY        ;WAIT .1 SECOND
  480.     DEC    HL        ;ONE LESS COUNT
  481.     LD    A,H
  482.     OR    L        ;IS COUNT ZERO?
  483.     JP    NZ,RELOOK    ;NO, LOOK SOME MORE
  484.     JP    HANGUP2        ;COUNT DONE, WAIT FOR NEW CALL
  485. ;
  486.     ENDIF            ;END OF CALLBACK ROUTINES
  487. ;
  488. ;Setup modem
  489. ;
  490. ANSWER    EQU    $+OFFSET
  491. ;
  492.     IF    USRLOG        ;COUNT # OF LOGON ATTEMPTS
  493.     LD    A,(OLDUSR)    ;GET # OF ATTEPMTS
  494.     INC    A        ;ADD THIS CALL
  495.     ENDIF            ;USRLOG
  496. ;
  497.     IF    USRLOG AND DECIMAL
  498.     DAA            ;MAKE IT DECIMAL
  499.     ENDIF            ;USRLOG AND DECIMAL
  500. ;
  501.     IF    USRLOG
  502.     LD    (OLDUSR),A    ;SAVE NEW COUNT
  503.     ENDIF            ;USRLOG
  504. ;-----------------------------------------------------
  505.     IF    TREVORS
  506.     LD    A,BD300        ;LOAD 300 BAUD
  507.     OUT    BPORT,A
  508.     LD    A,2        ;ensure UART points at cmd register
  509.     OUT    CPORT,A
  510.     CALL    UDELAY
  511.     OUT    CPORT,A
  512.     CALL    UDELAY
  513.     OUT    CPORT,A
  514.     CALL    UDELAY
  515.     LD    A,RSTINS    ;RESET USART
  516.     OUT    CPORT,A
  517.     CALL    UDELAY        ;USART DELAY
  518.     LD    A,MODINS2    ;2 STOP BITS, ETC.
  519.     OUT    CPORT,A
  520.     CALL    UDELAY        ;USART DELAY
  521.     LD    A,ONINS        ;DSR, ETC.
  522.     OUT    CPORT,A
  523.     CALL    CARCK        ;SEE IF CARRIER IS PRESENT
  524.     JP    C,HANGUP2
  525. ;Test input for baud rate
  526.     IN    A,DPORT        ;Clear any rubbish
  527.     IN    A,DPORT
  528.     CALL    PATCH        ;PATCH JUMP TABLE
  529.     CALL    TSTBAUD        ;SEE IF 300 BAUD
  530.     JP    Z,WELCOME    ;YES, EXIT
  531. ;
  532.     LD    A,BD1200    ;LOAD 1200 BAUD
  533.     OUT    BPORT,A
  534.     CALL    TSTBAUD        ;SEE IF 1200 BAUD
  535.     JP    Z,WELCOME    ;YES,EXIT
  536. ;
  537.     LD    A,BD110        ;LOAD 110 BAUD
  538.     OUT    BPORT,A
  539.     CALL    TSTBAUD        ;TEST FOR 110 BAUD
  540.     JP    Z,WELCOME
  541.     ENDIF            ;TREVORS
  542. ;
  543. ;;;    CALL    UNPATCH    
  544.     JP    ANSWER        ;TEST MORE - INVALID BAUD RATE
  545. ;
  546.     IF    TREVORS
  547. UDELAY    EQU    $+OFFSET
  548.     NOP    
  549.     NOP
  550.     NOP
  551.     NOP
  552.     NOP
  553.     NOP
  554.     RET    
  555.     ENDIF            ;TREVORS
  556. ;
  557. ;Get the console status when unpatched
  558. ;
  559. UCSTS    EQU    $+OFFSET
  560. ;
  561.     LD    C,CSTS        ;IN CPM 1.4, WE HAVE TO GET..
  562.     CALL    BDOS        ;..THE STATUS FIRST
  563.     OR    A
  564.     RET    Z
  565.     LD    C,CI        ;AND THEN THE CHARACTER
  566.     CALL    BDOS
  567.     RET    
  568. ;
  569. ;Following are the USRLOG routines
  570. ;
  571.     IF    USRLOG        ;INCLUDE RESET FUNCTIONS
  572. RESET    EQU    $+OFFSET    ;RESET ALL LOGON COUNTERS
  573.     XOR    A
  574.     ENDIF            ;USRLOG
  575. ;
  576.     IF    USRLOG AND PWRQD
  577.     LD    (OLDUSR),A    ;RESET ATTEMPT COUNTER
  578.     ENDIF            ;USRLOG AND PWRQD
  579. ;
  580.     IF    USRLOG
  581.     LD    (NEWUSR),A    ;RESET LOGON COUNTER
  582.     ENDIF            ;USRLOG
  583. ;
  584.     IF    USRLOG AND CALLBAK
  585.     LD    (NONUSR),A    ;RESET VOICE COUNTER
  586.     ENDIF            ;USRLOG AND CALLBAK
  587. ;
  588.     IF    USRLOG
  589.     RET    
  590.     ENDIF            ;USRLOG
  591. ;
  592. PRNLOG    EQU    $+OFFSET
  593. ;
  594.     IF    USRLOG AND PWRQD;PRINT # OF LOGON ATTEMPTS
  595.     LD    C,PRINTF
  596.     LD    DE,ATMSG
  597.     CALL    BDOS
  598.     LD    A,(OLDUSR)
  599.     CALL    HXOUT
  600.     ENDIF            ;USRLOG AND PWRQD
  601. ;
  602.     IF    USRLOG        ;PRINT # OF LOGONS
  603.     LD    C,PRINTF
  604.     LD    DE,SUMSG
  605.     CALL    BDOS
  606.     LD    A,(NEWUSR)
  607.     CALL    HXOUT
  608.     ENDIF            ;USRLOG
  609. ;
  610.     IF    USRLOG AND CALLBAK;# OF VOICE CALLS
  611.     LD    C,PRINTF
  612.     LD    DE,VCMSG
  613.     CALL    BDOS
  614.     LD    A,(NONUSR)
  615.     CALL    HXOUT
  616.     ENDIF            ;USRLOG AND CALLBAK
  617. ;
  618.     IF    USRLOG
  619.     JP    0        ;WARM-BOOT BACK TO CP/M
  620.     ENDIF            ;USRLOG
  621. ;
  622.     IF    USRLOG AND PWRQD
  623. ATMSG    EQU    $+OFFSET
  624.     DEFB    LF,CR,'NUMBER OF LOGON ATTEMPTS: $'
  625.     ENDIF            ;USRLOG AND PWRQD
  626. ;
  627.     IF    USRLOG
  628. SUMSG    EQU    $+OFFSET
  629.     DEFB    LF,CR,'NUMBER OF LOGONS: $'
  630.     ENDIF            ;USRLOG
  631. ;
  632.     IF    USRLOG AND CALLBAK
  633. VCMSG    EQU    $+OFFSET
  634.     DEFB    LF,CR,'NUMBER OF VOICE CALLS: $'
  635.     ENDIF            ;USRLOG AND CALLBAK
  636. ;
  637.     IF    USRLOG
  638. HXOUT    EQU    $+OFFSET
  639.     LD    B,A        ;SAVE NUMBER
  640.     RRA            ;ROTATE RIGHT 4 BITS
  641.     RRA            ;TO MAKE AN ASCII DIGIT
  642.     RRA    
  643.     RRA    
  644.     CALL    ONEOUT        ;OUTPUT MSH TO CONSOLE
  645.     LD    A,B        ;GET NUMBER BACK
  646. ;
  647. ONEOUT    EQU    $+OFFSET
  648.     AND    0FH        ;GET LSH FOR OUTPUT
  649.     CP    0AH        ;CHECK IF ALPHA
  650.     JP    C,NOTAL2
  651.     ADD    07H
  652. ;
  653. NOTAL2    EQU    $+OFFSET
  654.     ADD    30H
  655.     PUSH    BC
  656.     LD    C,02H
  657.     LD    E,A        ;OUTPUT THE NUMBER
  658.     CALL    BDOS
  659.     POP    BC
  660.     RET    
  661.     ENDIF            ;USRLOG
  662. ;
  663. ;Welcome to the system
  664. ;
  665. WELCOME EQU    $+OFFSET
  666. ;
  667. GETNULL EQU    $+OFFSET
  668.     CALL    ILPRT        ;PRINT THIS MSG:
  669.     DEFB    CR,LF
  670.     DEFB    'HOW MANY NULLS (0-9) DO YOU NEED? ',0
  671.     CALL    MINPUT        ;GET VALUE
  672. ;;;    MOV    C,A    ;TO C FOR MOUTPUT
  673.     CALL    MOUTPUT        ;ECHO CHAR
  674. ;;;    MOV    A,C    ;RESTORE VALUE
  675.     CP    '0'
  676.     JP    C,GETNULL    ;BAD, RETRY
  677.     CP    '9'+1
  678.     JP    NC,GETNULL    ;BAD
  679.     SUB    '0'        ;MAKE BINARY
  680.     LD    (NULLS),A    ;SAVE COUNT
  681. ;
  682.     IF    TRAPLC
  683. GETULC    EQU    $+OFFSET
  684.     CALL    ILPRT        ;PRINT THIS MSG:
  685.     DEFB    CR,LF
  686.     DEFB    'CAN YOUR TERMINAL DISPLAY LOWER CASE? ',0
  687.     LD    A,20H        ;FORCE CASE CONVERSION FOR NOW
  688.     LD    (ULCSW),A
  689.     CALL    MINPUT        ;GET Y OR NO
  690. ;;;    MOV    C,A
  691.     CALL    MOUTPUT        ;ECHO
  692. ;;;    MOV    A,C
  693.     CP    'N'
  694.     JP    Z,DONEOPT    ;WE'RE ALREADY SET UP FOR NO LWR CASE
  695.     CP    'Y'
  696.     JP    NZ,GETULC    ;WASN'T Y OR N...GO ASK AGAIN
  697.     XOR    A
  698.     LD    (ULCSW),A    ;SET FLAG FOR NO CONVERSION
  699. ;
  700. DONEOPT EQU    $+OFFSET
  701.     ENDIF            ;TRAPLC
  702. ;
  703.     CALL    ILPRT
  704.     DEFB    CR,LF,0
  705. ;Print the welcome file
  706.     LD    HL,WELFILN    ;SOURCE
  707.     LD    DE,FCB        ;DESTINATION
  708.     LD    B,13        ;LENGTH
  709.     CALL    MOVE        ;MOVE THE NAME
  710. ;Set DMA address to 80h
  711.     LD    DE,80H
  712.     LD    C,STDMA
  713.     CALL    BDOS
  714. ;
  715. ;Open the welcome file
  716.     LD    DE,FCB
  717.     LD    C,OPEN
  718.     CALL    BDOS
  719. ;Did it exist?
  720.     INC    A        ;A=> 0 MEANS "NO"
  721.     JP    Z,PASSINT    ;NO WELCOME FILE
  722. ;Got a file, type it
  723.     XOR    A        ;GET 0
  724.     LD    (FCBRNO),A    ;ZERO RECORD #
  725.     LD    HL,100H        ;GET INITIAL BUFF POINTER
  726. ;
  727. ;Type the welcome file
  728. WELTYLP EQU    $+OFFSET
  729.     CALL    RDBYTE        ;GET A BYTE
  730.     CP    1AH        ;EOF?
  731.     JP    Z,PASSINT    ;YES, DONE
  732. ;;;    MOV    C,A    ;SETUP FOR TYPE
  733.     CALL    MOUTPUT        ;TYPE THE CHAR
  734.     CALL    MSTAT        ;CHECK FOR..
  735.     OR    A        ;CHAR TYPED?
  736.     JP    Z,WELTYLP    ;..NO, LOOP
  737.     CALL    MINPUT        ;..YES, GET CHAR
  738.     CP    'C'-40H        ;CTL-C?
  739.     JP    NZ,WELTYLP    ;..NO, LOOP UNTIL EOF
  740. ;
  741. ;Get the password
  742. ;
  743. PASSINT EQU    $+OFFSET
  744. ;
  745.     IF    PWRQD
  746.     LD    D,5        ;5 TRIES AT PASSWORD
  747. ;
  748. PASSINP EQU    $+OFFSET
  749.     CALL    ILPRT
  750.     DEFB    CR,LF,'ENTER PASSWORD: ',0
  751.     LD    HL,PASSWD    ;POINT TO PASSWORD
  752.     LD    E,0        ;NO MISSED LETTERS
  753.     IN    A,DPORT        ;CLEAR OUT GARBAGE
  754. ;
  755. PWMLP    EQU    $+OFFSET
  756.     CALL    MINPUT        ;GET A CHAR
  757.     CP    'U'-40H        ;CTL-U?
  758.     JP    Z,PASSINP    ;YES, RE-GET IT
  759.     CP    60H        ;LOWER CASE?
  760.     JP    C,NOTLC        ;NO,
  761.     AND    5FH        ;MAKE UPPER CASE ALPHA
  762. ;
  763. NOTLC    EQU    $+OFFSET
  764.     CP    (HL)        ;MATCH PASSWORD?
  765.     JP    Z,PWMAT        ;..YES
  766.     LD    E,1        ;..NO, SHOW MISS
  767.     CP    CR        ;C/R?
  768.     JP    NZ,PWMLP    ;..NO, WAIT FOR C/R
  769. ;
  770. ;Password didn't match
  771. ;
  772. PWNMAT    EQU    $+OFFSET
  773.     CALL    ILPRT
  774.     DEFB    '++INCORRECT++',CR,LF,0
  775.     DEC    D        ;MORE TRIES?
  776.     JP    NZ,PASSINP    ;YES
  777.     JP    BADPASS        ;NO, GO HANG UP
  778. ;
  779. ;Character matched in password
  780. ;
  781. PWMAT    EQU    $+OFFSET
  782.     INC    HL        ;TO NEXT CHAR
  783.     CP    CR        ;END?
  784.     JP    NZ,PWMLP    ;..NO, LOOP
  785. ;End of password.  Any missed chars?
  786.     LD    A,E        ;GET FLAG
  787.     OR    A
  788.     JP    NZ,PWNMAT    ;NOT RIGHT
  789. ;Password correct
  790.     ENDIF            ;PWRQD
  791. ;
  792. NOPASS    EQU    $+OFFSET
  793. ;
  794.     IF    USRLOG        ;COUNT # OF SUCCESSFUL LOGONS
  795.     LD    A,(NEWUSR)    ;GET LAST VALUE
  796.     INC    A        ;INCREMENT IT
  797.     ENDIF            ;USRLOG
  798. ;
  799.     IF    USRLOG AND DECIMAL
  800.     DAA            ;MAKE IT DECIMAL
  801.     ENDIF            ;USRLOG AND DECIMAL
  802. ;
  803.     IF    USRLOG
  804.     LD    (NEWUSR),A    ;SAVE NEW VALUE
  805.     ENDIF            ;USRLOG
  806. ;
  807. ;;    CALL    ILPRT
  808. ;;    DB    CR,LF,'Booting CDOS.. ',0DH,0AH,0    ;PUT BOOT-UP MSG HERE
  809. ;
  810.     IF    COMFILE
  811.     LD    A,(OPTION)
  812.     CP    'A'        ;SYSOP CAN BYPASS COM FILE BY..
  813.     JP    Z,0        ;..TYPING "BYE /A"
  814. ;;    CPI    'C'    ;OPER CAN ALSO GO TO COM..
  815. ;;    JNZ    100H    ;..FILE LOAD WITH "BYE /C"
  816. ;;    CALL    ILPRT    ;PRINT THIS MESSAGE:'
  817. ;;    DB    'Loading system...',CR,LF,0
  818. ;;    CALL    LODCOM
  819.     LD    A,'@'        ;Tell RBBS that this is a
  820.     LD    (5DH),A        ; new caller
  821.     JP    100H        ;EVERYONE ELSE GETS COM FILE
  822.     ENDIF            ;COMFILE
  823. ;
  824.     IF    NOT COMFILE
  825.     JP    0
  826.     ENDIF            ;NOT COMFILE
  827. ;
  828. ;TSTBAUD attempts to read a LF or CR, returns with
  829. ;zero flag if the character read is one of these two.
  830. ;
  831. TSTBAUD EQU    $+OFFSET
  832.     CALL    MINPUT        ;GET CHARACTER FROM MODEM
  833.     CP    CR        ;IF A CARRIAGE RETURN...
  834.     RET    Z        ;.. RETURN
  835.     CP    LF        ;IF A LINEFEED...
  836.     RET            ;RET ZERO FLAG, ELSE NOT ZERO
  837. ;
  838. ;Loss of connection test
  839. ;
  840. CARCK    EQU    $+OFFSET
  841. ;
  842. ;;;    IF    SUPERB
  843. ;
  844. ;Racal-Vadic modem automatically hangs up phone 1 second
  845. ;after carrier loss.
  846. ;
  847. ;;;    IN    SPORT    ;GET STATUS
  848. ;;;    ANI    DSR    ;CHECK IF CARRIER ON
  849. ;;;    JNZ    CARCK2    ;YES, CONTINUE ON
  850. ;;;    STC        ;SET CARRY BIT FOR NO CARRIER
  851. ;;;    RET
  852. ;;;    ENDIF        ;SUPERB
  853. ;
  854.     IF    TREVORS
  855. ;
  856. ;;    IN    SPORT    ;GET STATUS
  857. ;;    ANI    DSR    ;CHECK IF CARRIER ON
  858. ;;    JNZ    CARCK2    ;YES, CONTINUE ON
  859. ;******************always have carrier
  860. ;;    STC        ;SET CARRY BIT FOR NO CARRIER
  861. ;;    RET
  862.     ENDIF            ;TREVORS
  863. ;
  864. ;Now test drive #'s and (if CP/M 2.x) user #'s to
  865. ;insure that maximums are not exceeded.
  866. ;
  867. CARCK2    EQU    $+OFFSET
  868.     LD    A,(4)        ;CHECK DISK/USER #
  869.     AND    0FH        ;ISOLATE DRIVE
  870.     CP    MAXDRV        ;VALID DRIVE?
  871.     JP    C,CARCK3    ;YES, SKIP THIS JUNK
  872.     LD    A,(4)        ;GET WHOLE LOGIN BYTE
  873.     AND    0F0H        ;RETAIN USER # & FORCE DRIVE TO A
  874.     LD    (4),A        ;UPDATE LOGIN BYTE
  875.     CALL    ILPRT        ;TELL USER WHAT HE DID
  876.     DEFB    'Invalid drive - returning to A:',0
  877.     JP    0        ;WARM BOOT
  878. ;
  879. CARCK3    EQU    $+OFFSET
  880. ;
  881. CARCK4    EQU    $+OFFSET
  882.     OR    A
  883.     RET    
  884. ;
  885. ;.1 sec delay routine
  886. ;
  887. DELAY    EQU    $+OFFSET
  888. ;;    PUSH    B
  889. ;
  890. ;;    IF    FASTCLK
  891. ;;    LXI    B,16667 ;4 MHZ TIMING CONSTANT
  892. ;;    ENDIF
  893. ;
  894. ;;    IF    NOT FASTCLK
  895. ;;    LXI    B,8334    ;2 MHZ TIMING CONSTANT
  896. ;;    ENDIF
  897. ;
  898. ;;DELAY1    EQU    $+OFFSET
  899. ;;    DCX    B
  900. ;;    MOV    A,B
  901. ;;    ORA    C
  902. ;;    JNZ    DELAY1
  903. ;;    POP    B
  904. ;;    RET
  905. ;
  906. ;50 ms delay routine
  907. ;
  908. ;;KDELAY    EQU    $+OFFSET
  909. ;;    PUSH    B
  910. ;
  911. ;;    IF    FASTCLK
  912. ;;    LXI    B,8334
  913. ;;    ENDIF
  914. ;
  915. ;;    IF    NOT FASTCLK
  916. ;;    LXI    B,4167
  917. ;;    ENDIF
  918. ;
  919. ;;    JMP    DELAY1
  920. ;
  921. ;Patch in the new JMP table (saving the old)
  922. ;
  923. PATCH    EQU    $+OFFSET
  924.     CALL    TBLADDR        ;CALC HL= CP/M JMP TABLE
  925.     LD    DE,VCOLDBT    ;POINT TO SAVE LOCATION
  926.     LD    B,18        ;ALWAYS SAVE PRINTER VECTOR
  927.     CALL    MOVE        ;MOVE IT
  928. ;Now move new JMP table to CP/M
  929.     CALL    TBLADDR        ;CALC HL=CP/M'S JMP TABLE
  930.     EX    DE,HL        ;MOVE TO DE
  931.     LD    HL,NEWJTBL    ;POINT TO NEW
  932.     CALL    MOVE        ;MOVE IT
  933. ;
  934.     IF    CDOS        ;we must copy and replace SDVT console entries
  935. ;
  936.     LD    C,81H
  937.     CALL    BDOS        ;Get user register pointer
  938.     LD    HL,3
  939.     ADD    HL,BC        ;HL now pointing to SDVT entry
  940.     LD    E,(HL)
  941.     INC    HL
  942.     LD    D,(HL)        ;Have SDVT vector in DE
  943.     EX    DE,HL        ;in HL
  944.     LD    E,(HL)
  945.     INC    HL
  946.     LD    D,(HL)        ;Have CON$TABLE in DE
  947.     EX    DE,HL        ;in HL
  948.     LD    (CON$TABLE),HL    ;save it in RAM
  949.     LD    DE,DOSSDVT    ;where we will save it
  950.     LD    B,10        ;10 bytes to move
  951.     CALL    MOVE        ;(hl) to (de)
  952. ;
  953.     LD    HL,(CON$TABLE)    ;Now overlay with our SDVT
  954.     EX    DE,HL
  955.     LD    HL,SDVT        ;our SDVT points to modem routines
  956.     LD    B,10
  957.     CALL    MOVE
  958. ;
  959. ; Now patch the vectors into our CONIN etc
  960.     LD    HL,(DOSCSTAT)
  961.     LD    (CSTAT),HL
  962.     LD    HL,(DOSCIND)
  963.     LD    (CIND),HL
  964.     LD    HL,(DOSCOUTD)
  965.     LD    (COUTD),HL
  966.     IF    NOT PRINTER
  967. ; Now replace printer table LINIT and LOUT entry
  968.     LD    C,81H
  969.     CALL    BDOS        ;Get user register pointer
  970.     LD    HL,3        ;calculate the  SDVT entry
  971.     ADD    HL,BC
  972.     LD    E,(HL)
  973.     INC    HL
  974.     LD    D,(HL)        ;Have SDVT table addr in DE
  975.     LD    HL,8        ;get LIST table  addr
  976.     ADD    HL,DE
  977.     LD    E,(HL)
  978.     INC    HL
  979.     LD    D,(HL)        ;DE points at LIST table
  980.     INC    DE
  981.     INC    DE
  982.     EX    DE,HL
  983.     LD    (LRDY$ADDR),HL    ;where we will save it
  984.     LD    E,(HL)
  985.     INC    HL
  986.     LD    D,(HL)        ;Have original LRDY vector in DE
  987.     EX    DE,HL        ;inHL
  988.     LD    (SAVE$LRDY),HL
  989.     EX    DE,HL        ;get back table ptr
  990.     INC    HL
  991.     LD    E,(HL)
  992.     INC    HL
  993.     LD    D,(HL)        ;have LOUT vec in DE
  994.     EX    DE,HL
  995.     LD    (SAVE$LOUT),HL
  996.     CALL    DISABLE$PRINTER
  997.     ENDIF            ;NOT PRINTER
  998.     ENDIF            ;CDOS
  999.     RET    
  1000. ;
  1001. ;Now replace the vectors if required
  1002.     IF    NOT PRINTER    ;we will patch out table entries
  1003. DISABLE$PRINTER EQU    $+OFFSET
  1004.     LD    HL,(LRDY$ADDR)
  1005.     LD    DE,MSTAT1    ;Replace vector
  1006.     LD    (HL),E
  1007.     INC    HL
  1008.     LD    (HL),D
  1009. ;
  1010.     INC    HL        ;now replace LOUT
  1011.     LD    DE,DUMMY    ;merely RETurn
  1012.     LD    (HL),E
  1013.     INC    HL
  1014.     LD    (HL),D
  1015.     RET    
  1016. ;
  1017. ENABLE$PRINTER EQU    $+OFFSET
  1018. ;Now return the vectors if required
  1019.     LD    HL,(SAVE$LRDY)    ;get original vector
  1020.     EX    DE,HL        ;into DE
  1021.     LD    HL,(LRDY$ADDR)
  1022.     LD    (HL),E
  1023.     INC    HL
  1024.     LD    (HL),D
  1025. ;
  1026.     INC    HL        ;now replace LOUT
  1027.     PUSH    HL
  1028.     LD    HL,(SAVE$LOUT)
  1029.     EX    DE,HL
  1030.     POP    HL
  1031.     LD    (HL),E
  1032.     INC    HL
  1033.     LD    (HL),D
  1034.     RET    
  1035.     ENDIF            ;NOT PRINTER
  1036. UNPATCH EQU    $+OFFSET
  1037.     CALL    TBLADDR        ;HL=CP/M'S JMP TABLE
  1038.     EX    DE,HL        ;MOVE TO DE
  1039.     LD    HL,VCOLDBT    ;GET SAVED TABLE
  1040.     CALL    MOVE        ;MOVE ORIG BACK
  1041. ;
  1042.     IF    CDOS        ;must also move SDVT back
  1043.     LD    HL,(CON$TABLE)
  1044.     EX    DE,HL        ;DE now holds addr of CDOS's SDVT
  1045.     LD    HL,DOSSDVT    ;HL has the saved SDVT addr
  1046.     LD    B,10        ;length of SDVT
  1047.     CALL    MOVE        ;restore old SDVT
  1048.     IF    NOT PRINTER
  1049.     CALL    ENABLE$PRINTER
  1050.     ENDIF            ;NOT PRINTER
  1051.     ENDIF            ;CDOS
  1052.     RET    
  1053. ;
  1054. ;Calculate HL=CP/M's jump table, B=length
  1055. ;
  1056. TBLADDR EQU    $+OFFSET
  1057.     LD    HL,(1)        ;GET BIOS POINTER
  1058.     DEC    HL        ;..SKIP
  1059.     DEC    HL        ;..TO
  1060.     DEC    HL        ;..COLD BOOT
  1061. ;
  1062.     IF    NOT CDOS
  1063.     IF    NOT PRINTER
  1064.     LD    B,18        ;BYTES TO MOVE
  1065.     ENDIF    
  1066. ;
  1067.     IF    PRINTER        ;RETAIN LIST DEVICE?
  1068.     LD    B,15        ;DON'T MOVE LISTER JUMP
  1069.     ENDIF    
  1070. ;
  1071.     ENDIF            ;NOT CDOS
  1072.     IF    CDOS
  1073.     LD    B,6        ;only copy the two boot vectors
  1074.     ENDIF            ;CDOS
  1075.     RET    
  1076. ;
  1077. ;Move (HL) to (DE), length in (B)
  1078. ;
  1079. MOVE    EQU    $+OFFSET
  1080.     LD    A,(HL)        ;GET A BYTE
  1081.     LD    (DE),A        ;PUT AT NEW HOME
  1082.     INC    DE        ;BUMP POINTERS
  1083.     INC    HL
  1084.     DEC    B        ;DEC BYTE COUNT
  1085.     JP    NZ,MOVE        ;IF MORE, DO IT
  1086.     RET            ;IF NOT,RETURN
  1087. ;
  1088. ;Common routine to check for carrier lost, called from console out
  1089. ;
  1090. CHECK    EQU    $+OFFSET
  1091.     CALL    CARCK        ;SEE IF CARRIER STILL ON
  1092.     RET    NC        ;ALL OK
  1093. ;
  1094. ;Carrier is lost.  Type message so local console shows the reason
  1095. ;
  1096. BADPASS EQU    $+OFFSET    ;COME HERE ON BAD PASSWORD
  1097.     LD    A,1        ;SHOW CARRIER LOST SO
  1098.     LD    (LOSTFLG),A    ;..WE WON'T CK AGAIN
  1099.     LD    SP,STACK    ;ENSURE VALID STACK
  1100.     CALL    ILPRT
  1101.     DEFB    CR,LF
  1102.     DEFB    '++CARRIER LOST++'
  1103.     DEFB    CR,LF,'   ',0
  1104.     CALL    UNPATCH        ;RESTORE ORIG BIOS JMP TBL
  1105.     XOR    A        ;CLEAR OUT CARRIER..
  1106.     LD    (LOSTFLG),A    ;..LOST FLAG
  1107.     JP    HANGUP
  1108. ;
  1109. ;Readbyte routine - used to read the welcome file
  1110. ;
  1111. RDBYTE    EQU    $+OFFSET
  1112.     LD    A,H        ;TIME TO READ?
  1113.     OR    A        ;..IF AT 100H
  1114.     JP    Z,NORD        ;NO READ REQ'D
  1115. ;Have to read a sector
  1116.     LD    DE,FCB
  1117.     LD    C,READ
  1118.     CALL    BDOS
  1119.     OR    A        ;OK?
  1120.     LD    A,1AH        ;FAKE UP EOF
  1121.     RET    NZ        ;RET EOF IF BAD
  1122.     LD    HL,80H
  1123. ;
  1124. NORD    EQU    $+OFFSET
  1125.     LD    A,(HL)        ;GET CHAR
  1126.     INC    HL        ;TO NEXT
  1127.     RET    
  1128. ;
  1129. ;Keyboard/modem status test routine
  1130. ;
  1131. MSTAT    EQU    $+OFFSET
  1132. ;
  1133.     IF    DUAL$IO        ;WANT LOCAL CONSOLE?
  1134.     CALL    CONSTAT        ;GET LOCAL STATUS
  1135.     OR    A
  1136.     RET    NZ        ;RET IF LOCAL CHAR
  1137.     ENDIF            ;DUAL$IO
  1138. ;
  1139.     IF    TREVORS
  1140.     IN    A,SPORT        ;GET STATUS
  1141.     AND    RCVRDY        ;GOT A CHARACTER
  1142.     RET    Z        ;RETURN IF NOT
  1143. ;;    IN    SPORT    ;GET STATUS
  1144. ;;    ANI    TOERR    ;CHECK FOR FRAMING AND OVERRUN ERRORS
  1145. ;;    JZ    MSTAT1    ;NO ERRORS
  1146. ;;    MVI    A,ONINS    ;RESET ERROR FLAGS
  1147. ;;    OUT    CPORT
  1148. ;;    XRA    A    ;RETURN    FALSE
  1149. ;;    RET
  1150.     ENDIF            ;TREVORS
  1151. ;
  1152. MSTAT1    EQU    $+OFFSET
  1153.     LD    A,0FFH        ;SHOW READY
  1154.     OR    A
  1155.     RET    
  1156. ;
  1157. ;Modem input function, checks local console first
  1158. ;
  1159. MINPUT    EQU    $+OFFSET
  1160. ;
  1161.     IF    TIMEOUT
  1162.     PUSH    HL
  1163.     LD    HL,TOVALUE*MINUTES;INITIALIZE TIMEOUT COUNTER
  1164.     LD    (TOCNT),HL
  1165.     POP    HL
  1166.     ENDIF            ;TIMEOUT
  1167. ;
  1168. MINPUT1 EQU    $+OFFSET
  1169.     LD    A,(LOSTFLG)    ;KNOWN LOSS..
  1170.     OR    A        ;..OF CARRIER?
  1171.     CALL    Z,CHECK        ;CARRIER STILL ON?
  1172.     CALL    MSTAT        ;ANYTHING?
  1173.     OR    A
  1174. ;
  1175.     IF    NOT TIMEOUT
  1176.     JP    Z,MINPUT    ;LOOP TILL CHAR RCD
  1177.     ENDIF            ;NOT TIMEOUT
  1178. ;
  1179.     IF    TIMEOUT
  1180.     JP    NZ,MINPUT2
  1181.     CALL    KDELAY        ;KILL 50 MS
  1182.     PUSH    HL
  1183.     LD    HL,(TOCNT)    ;KNOCK DOWN TIMEOUT COUNTER
  1184.     DEC    HL
  1185.     LD    (TOCNT),HL
  1186.     LD    A,H
  1187.     OR    L
  1188.     POP    HL
  1189.     JP    NZ,MINPUT1    ;STILL TIME LEFT..KEEP TRYING
  1190.     CALL    ILPRT
  1191.     DEFB    '++INPUT TIMED OUT++',7,7,0
  1192.     JP    NOSLASH
  1193.     ENDIF            ;TIMEOUT
  1194. ;
  1195. MINPUT2 EQU    $+OFFSET
  1196. ;
  1197.     IF    DUAL$IO        ;BOTH LOCAL AND REMOTE
  1198.     CALL    CONSTAT        ;CHECK LOCAL CONSOLE
  1199.     OR    A        ;CHAR?
  1200.     JP    NZ,CONIN    ;..YES, READ IT, RET.
  1201.     ENDIF    
  1202. ;
  1203. ;Local console wasn't ready, so read modem
  1204. ;
  1205.     IN    A,DPORT        ;GET DATA BYTE
  1206.     AND    7FH        ;DELETE PARITY
  1207.     JP    Z,MINPUT    ;IGNORE NULLS
  1208. ;
  1209.     IF    HARDLOG
  1210.     CP    20H
  1211.     JP    NC,MINPUT3
  1212.     CP    CR
  1213.     JP    NZ,NOLOG
  1214. ;
  1215. MINPUT3 EQU    $+OFFSET
  1216.     CALL    LISTOUT        ;ECHO ON PRINTER
  1217.     CP    CR
  1218.     JP    NZ,NOLOG    ;CR NEEDS LINEFEED
  1219.     LD    A,LF
  1220.     CALL    LISTOUT        ;SO SEND IT
  1221.     LD    A,CR        ;GET BACK CR
  1222.     ENDIF            ;END OF HARDLOG
  1223. ;
  1224. NOLOG    EQU    $+OFFSET
  1225. ;
  1226.     CP    3        ;IS IT CONTROL-C?
  1227.     RET    NZ        ;NO, PASS IT THRU
  1228.     LD    A,(0)        ;SEE IF WARM BOOT DISABLED
  1229.     CP    0C3H        ;JMP MEANS WARM BOOT OK
  1230.     LD    A,3        ;SO RETURN CONTROL-C
  1231.     RET    Z
  1232.     XOR    A        ;ELSE CONVERT TO NULL
  1233.     RET    
  1234. ;
  1235. ;Modem output function
  1236. ;
  1237. MOUTPUT EQU    $+OFFSET
  1238.     LD    C,A        ;char is passed in A for CDOS
  1239. CMOUTPUT EQU    $+OFFSET    ;CP/M passes it in C
  1240. ;
  1241. ;If we already know carrier is lost, don't check
  1242. ;for it again or loop trying to output.
  1243.     LD    A,(LOSTFLG)    ;KNOWN LOSS OF CARRIER?
  1244.     OR    A
  1245.     JP    NZ,SILENT    ;AVOID LOOP IN CASE CARRIER LOST
  1246.     CALL    CHECK        ;CARRIER STILL ON?
  1247. ;
  1248.     IF    TREVORS
  1249.     IN    A,SPORT        ;GET MODEM STATUS
  1250.     AND    TRNRDY        ;TRANSMIT BUFFER EMPTY?
  1251.     ENDIF            ;TREVORS
  1252. ;
  1253.     JP    Z,CMOUTPUT    ;LOOP IF NOT READY
  1254. ;
  1255.     LD    A,C        ;GET CHAR
  1256.     AND    7FH        ;STRIP PARITY BIT
  1257. ;
  1258.     IF    TRAPLC
  1259.     CP    60H        ;CHECK FOR LOWER CASE
  1260.     JP    C,MOUTP2    ;SKIP IF NOT LC
  1261.     CP    7FH        ;CHECK FOR RUBOUT
  1262.     JP    Z,MOUTP2
  1263.     PUSH    HL
  1264.     LD    HL,ULCSW    ;SUBTRACT EITHER 20H OR 0
  1265.     SUB    (HL)
  1266.     POP    HL
  1267.     LD    C,A        ;FORCE ON LOCAL AS WELL AS REMOTE
  1268. ;
  1269. MOUTP2    EQU    $+OFFSET
  1270.     ENDIF            ;TRAPLC
  1271. ;
  1272.     OUT    DPORT,A        ;OUTPUT TO MODEM
  1273. ;
  1274. SILENT    EQU    $+OFFSET
  1275. ;
  1276.     IF    DUAL$IO        ;TO LOCAL ALSO?
  1277.     LD    A,C        ;for CDOS
  1278.     PUSH    AF        ;SAVE CHAR
  1279.     CALL    CONOUT        ;SEND TO REGULAR BIOS char in A or C
  1280.     POP    AF        ;GET CHAR AGAIN
  1281.     ENDIF            ;DUAL$IO
  1282. ;
  1283. ;Check for nulls
  1284.     CP    LF        ;TIME FOR NULLS?
  1285.     RET    NZ        ;NO, RETURN
  1286. ;Send nulls if required
  1287.     LD    A,(NULLS)    ;GET COUNT
  1288.     OR    A        ;ANY?
  1289.     RET    Z        ;..NO
  1290.     PUSH    BC
  1291.     LD    B,A        ;SAVE COUNT
  1292.     LD    A,0        ;0 IS A NULL
  1293. ;
  1294. NULLP    EQU    $+OFFSET
  1295.     CALL    MOUTPUT        ;TYPE A NULL
  1296.     DEC    B        ;MORE?
  1297.     JP    NZ,NULLP    ;..YES, LOOP
  1298.     POP    BC
  1299.     LD    C,LF        ;RESTORE LF
  1300.     RET    
  1301. ;
  1302. ;Boot trap - becomes disconnect if JMP at 0 has been altered
  1303. ;
  1304. MBOOT    EQU    $+OFFSET
  1305. ;;    LDA    0    ;LOOK AT OPCODE
  1306. ;;    CPI    0C3H    ;IS IT STILL JMP?
  1307. ;;    JZ    VWARMBT ;YES, ALLOW IT
  1308. ;;    JMP    NOSLASH ;NO, DISCONNECT
  1309.     JP    VWARMBT        ;++++++++++++++;;;;;;;;;;;;;;;;;;;;;;;;
  1310. ;
  1311. ;Inline print routine
  1312. ;
  1313. ILPRT    EQU    $+OFFSET
  1314.     EX    (SP),HL        ;SAVE HL, GET MSG
  1315.     PUSH    BC        ;SAVE BC REGS
  1316. ;
  1317. ILPLP    EQU    $+OFFSET
  1318.     LD    C,(HL)        ;GET CHAR
  1319.     CALL    CMOUTPUT    ;OUTPUT IT
  1320.     INC    HL        ;POINT TO NEXT
  1321.     LD    A,(HL)        ;TEST
  1322.     OR    A        ;..FOR END
  1323.     JP    NZ,ILPLP
  1324.     POP    BC        ;RESTORE BC REGS
  1325.     EX    (SP),HL        ;RESTORE HL, RET ADDR
  1326.     RET            ;RET PAST MSG
  1327. ;
  1328.     IF    PWRQD        ;KEEP PASSWORD HERE
  1329. ;Access password (ends in carriage return)
  1330. ;
  1331. PASSWD    EQU    $+OFFSET
  1332.     DEFB    'HELLO'        ;THE PASSWORD ITSELF
  1333.     DEFB    CR        ;END OF PASSWORD
  1334. ;Allow room for bigger password to be patched in
  1335.     DEFB    0,0,0,0,0,0,0,0,0,0,0,0,0
  1336.     ENDIF            ;PWRQD
  1337. ;
  1338. ;Routine to load the COM file
  1339. ;
  1340.     IF    COMFILE
  1341. LODCOM    EQU    $+OFFSET
  1342.     XOR    A        ;INITIALIZE FCB
  1343.     LD    (COMFCB),A
  1344.     LD    HL,COMFCB+12
  1345.     LD    B,21
  1346. ;
  1347. ZLOOP    EQU    $+OFFSET
  1348.     LD    (HL),0
  1349.     INC    HL
  1350.     DEC    B
  1351.     JP    NZ,ZLOOP
  1352. ;
  1353.     LD    C,OPEN        ;NOW OPEN THE FILE
  1354.     LD    DE,COMFCB
  1355.     CALL    BDOS
  1356.     INC    A        ;SHOULD BE NON-ZERO
  1357.     JP    Z,ABORT        ;NO FILE, ABORT
  1358. ;
  1359. ;Now load the file
  1360.     LD    HL,(6)        ;GET TOP OF MEMORY
  1361.     LD    DE,-80H        ;RECORD LOADS CAN'T START..
  1362.     ADD    HL,DE        ;..ABOVE (BDOS) - 80H
  1363.     PUSH    HL        ;SAVE ON STACK
  1364. ;
  1365.     LD    DE,80H        ;TPA-80H
  1366.     LD    BC,0        ;KEEP A RECORD COUNTER
  1367.     PUSH    BC        ;SAVE COUNTER
  1368.     PUSH    DE        ;AND LOAD ADDRESS
  1369. ;
  1370. GLOOP    EQU    $+OFFSET
  1371.     POP    DE        ;GET TPA ADRS
  1372.     LD    HL,80H        ;POINT TO NXT ADRS TO READ TO
  1373.     ADD    HL,DE        ;HL HAS THE ADDRESS
  1374.     POP    BC        ;INCREMENT THE COUNTER
  1375. ;Check for load past top-of-memory
  1376.     POP    DE        ;GET (TOP-OF-MEMORY)
  1377.     PUSH    DE        ;RE-SAVE FOR NEXT TIME
  1378.     LD    A,E        ;SUBTRACT: (TOP) - (ADRS)
  1379.     SUB    L
  1380.     LD    A,D        ;ONLY THE CARRY NEEDED
  1381.     SBC    H
  1382.     JP    NC,SIZEOK    ;CY= BETTER MOVCPM
  1383.     CALL    ERRXIT        ;SO TELL THE STORY
  1384.     DEFB    'Out of memory','$'
  1385. ;
  1386. SIZEOK    EQU    $+OFFSET
  1387.     INC    BC
  1388.     PUSH    BC
  1389.     PUSH    HL        ;SAVE TPA ADRS
  1390.     EX    DE,HL        ;ALIGN REGISTERS
  1391.     LD    C,STDMA        ;TELL BDOS WHERE TO PUT RECORD
  1392.     CALL    BDOS
  1393.     LD    DE,COMFCB    ;NOW READ THE RECORD
  1394.     LD    C,READ
  1395.     CALL    BDOS
  1396.     OR    A
  1397.     JP    Z,GLOOP        ;A=0 IF MORE TO READ
  1398.     POP    BC        ;UNJUNK STACK
  1399.     POP    BC        ;THIS IS OUR COUNTER
  1400.     POP    HL        ;MORE JUNK ON STACK
  1401.     LD    A,B        ;CHECK FOR ZERO
  1402.     OR    C
  1403.     JP    Z,ABORT        ;WE SHOULD HAVE READ SOMETHING
  1404.     LD    DE,80H        ;WE DID, RESET DMA TO 80H
  1405.     LD    C,STDMA
  1406.     CALL    BDOS
  1407.     CALL    LOADOK        ;PRINT THIS MSG TO CONSOLE:
  1408.     DEFB    'RBBS loaded',CR,LF,'$'
  1409. ;
  1410. LOADOK    EQU    $+OFFSET
  1411.     POP    DE
  1412.     LD    A,(OPTION)    ;SEE IF THIS WAS "BYE /C"
  1413.     CP    'C'        ;IF IT WAS THEN..
  1414.     RET    Z        ;..DON'T PRINT MESSAGE
  1415.     LD    C,PRINTF
  1416.     CALL    BDOS
  1417.     RET    
  1418. ;
  1419. ABORT    EQU    $+OFFSET
  1420.     CALL    ERRXIT
  1421.     DEFB    CR,LF
  1422.     DEFB    'Open err','$'
  1423. ;
  1424. ERRXIT    EQU    $+OFFSET
  1425.     POP    DE
  1426.     LD    C,PRINTF
  1427.     CALL    BDOS        ;PRINT THE ABORT MSG
  1428.     JP    0        ;WARM BOOT
  1429.     ENDIF            ;COMFILE
  1430. ;
  1431. ;This area is used for vectoring calls to the
  1432. ;user's CBIOS, but saving the registers first
  1433. ;in case they are destroyed.
  1434. ;
  1435. CONSTAT EQU    $+OFFSET
  1436.     PUSH    BC
  1437.     PUSH    DE
  1438.     PUSH    HL
  1439. CSTAT    EQU    $+1+OFFSET
  1440.     CALL    VCONSTAT
  1441.     POP    HL
  1442.     POP    DE
  1443.     POP    BC
  1444.     RET    
  1445. ;
  1446. CONIN    EQU    $+OFFSET
  1447.     PUSH    BC
  1448.     PUSH    DE
  1449.     PUSH    HL
  1450. CIND    EQU    $+1+OFFSET
  1451.     CALL    VCONIN
  1452. ;
  1453.     IF    FKEYS
  1454.     CALL    CKFUNC
  1455.     ENDIF            ;FKEYS
  1456. ;
  1457.     POP    HL
  1458.     POP    DE
  1459.     POP    BC
  1460.     RET    
  1461. ;
  1462. CKFUNC    EQU    $+OFFSET
  1463. ;
  1464.     IF    FKEYS
  1465.     CP    SYSDKEY
  1466.     JP    Z,SYSDOWN    ;TELL CALLER TO LEAVE
  1467.     CP    TWITKEY
  1468.     JP    Z,GOODBY    ;MAKE CALLER LEAVE
  1469. ;;    CP    MSGKEY
  1470. ;;    RET    NZ
  1471. ;;    CALL    ILPRT        ;SEND CALLER A MESSAGE
  1472. ;;    DEFB    'MESSAGE FROM OPERATOR:',0
  1473. ;;    LD    A,' '        ;SOMETHING TO RETURN WITH
  1474.     RET    
  1475. ;
  1476. SYSDOWN EQU    $+OFFSET
  1477.     CALL    ILPRT
  1478.     DEFB    'SYSTEM DOWN IN'
  1479.     DEFB    ' 5 MINUTES....',0
  1480.     LD    A,' '
  1481.     RET    
  1482.     ENDIF            ;FKEYS
  1483. ;
  1484. CONOUT    EQU    $+OFFSET
  1485.     PUSH    BC
  1486.     PUSH    DE
  1487.     PUSH    HL
  1488. ;    MOV    A,C    ;Get char in A for CDOS
  1489.     PUSH    AF
  1490. COUTD    EQU    $+1+OFFSET
  1491.     CALL    VCONOUT
  1492.     POP    AF
  1493.     POP    HL
  1494.     POP    DE
  1495.     POP    BC
  1496.     RET    
  1497. ;
  1498. LISTOUT EQU    $+OFFSET
  1499.     PUSH    BC
  1500.     PUSH    DE
  1501.     PUSH    HL
  1502.     PUSH    AF
  1503.     IF    NOT PRINTER
  1504.     CALL    ENABLE$PRINTER
  1505.     ENDIF            ;NOT PRINTER
  1506.     POP    AF
  1507.     PUSH    AF
  1508.     LD    A,C        ;char needed in A
  1509. LOUT    EQU    $+1+OFFSET
  1510.     CALL    VLISTOUT
  1511.     IF    NOT PRINTER
  1512.     CALL    DISABLE$PRINTER
  1513.     ENDIF            ;NOT PRINTER
  1514.     POP    AF
  1515.     POP    HL
  1516.     POP    DE
  1517.     POP    BC
  1518. MINIT    EQU    $+OFFSET    ;merely a return opcode
  1519.     RET    
  1520. ;
  1521. ;This is the JMP table which is copied on top
  1522. ;of the one pointed to by location 1 in CP/M
  1523. ;If CDOS is in use only the first 2 vectors are replaced
  1524. NEWJTBL EQU    $+OFFSET
  1525.     JP    MBOOT        ;COLD BOOT
  1526.     JP    MBOOT        ;WARM BOOT
  1527.     JP    MSTAT        ;MODEM STATUS TEST
  1528.     JP    MINPUT        ;MODEM INPUT ROUTINE
  1529.     JP    CMOUTPUT    ;MODEM OUTPUT ROUTINE
  1530. DUMMY    EQU    $+OFFSET
  1531.     RET            ;DUMMY LIST DEVICE
  1532.     NOP    
  1533.     NOP    
  1534. ;
  1535. WELFILN EQU    $+OFFSET
  1536.     DEFB    0,'WELCOME    ',0
  1537. ;Welcome file name ^^^^^^^^^^^ (must be 11 characters)
  1538. ;
  1539. NULLS    EQU    $+OFFSET
  1540.     DEFB    5
  1541. ;
  1542. COMFCB    EQU    $+OFFSET
  1543.     DEFB    0,'RBBS    COM'
  1544. ;COM file name       ^^^^^^^^^^^ (must be 11 characters)
  1545. ;
  1546.     IF    NOT CDOS
  1547. PEND    EQU    $+OFFSET    ;END OF RELOCATED CODE
  1548.     ENDIF            ;NOT CDOS
  1549. ;
  1550. ;These areas are not initialized for CP/M only
  1551. ;
  1552.     DEFS    21        ;REST OF COM FCB
  1553. ;
  1554.     IF    CDOS
  1555. ; This is the SDVT table which is copied on top
  1556. ;  of the one in CDOS or IOS
  1557. SDVT    EQU    $+OFFSET    ;10 BYTES LONG
  1558.     DEFW    MINIT        ;returns OK immediately
  1559.     DEFW    MSTAT
  1560.     DEFW    MINPUT
  1561.     DEFW    MSTAT1        ;wants status,gets READY
  1562.     DEFW    MOUTPUT
  1563. ;
  1564. PEND    EQU    $+OFFSET    ;END OF RELOCATED CODE
  1565. ;
  1566.     DEFS    2        ;to allow for movement errors
  1567. CON$TABLE EQU    $+OFFSET
  1568.     DEFS    2        ;Store DOSSDVT addr here
  1569. LRDY$ADDR EQU    $+OFFSET
  1570.     DEFS    2
  1571. SAVE$LRDY EQU    $+OFFSET
  1572.     DEFS    2
  1573. SAVE$LOUT EQU    $+OFFSET
  1574.     DEFS    2
  1575. ;
  1576. ;Save the original SDVT here
  1577. DOSSDVT EQU    $+OFFSET
  1578.     DEFS    2
  1579. DOSCSTAT EQU    $+OFFSET
  1580.     DEFS    2
  1581. DOSCIND EQU    $+OFFSET
  1582.     DEFS    2
  1583.     DEFS    2
  1584. DOSCOUTD EQU    $+OFFSET
  1585.     DEFS    2
  1586. ;
  1587.     ENDIF            ;CDOS
  1588. ULCSW    EQU    $+OFFSET
  1589.     DEFS    1
  1590. ;
  1591. OPTION    EQU    $+OFFSET
  1592.     DEFS    1
  1593. ;
  1594. TOCNT    EQU    $+OFFSET
  1595.     DEFS    2
  1596. ;
  1597. ;Byte to keep track of lost carrier when
  1598. ;typing "++CARRIER LOST++" so we don't loop
  1599. ;
  1600. LOSTFLG EQU    $+OFFSET
  1601.     DEFS    1
  1602. ;
  1603. ;Save the CP/M jump table here
  1604. ;
  1605. VCOLDBT EQU    $+OFFSET
  1606.     DEFS    3
  1607. ;
  1608. VWARMBT EQU    $+OFFSET
  1609.     DEFS    3
  1610. ;
  1611. VCONSTAT EQU    $+OFFSET
  1612.     DEFS    3
  1613. ;
  1614. VCONIN    EQU    $+OFFSET
  1615.     DEFS    3
  1616. ;
  1617. VCONOUT EQU    $+OFFSET
  1618.     DEFS    3
  1619. ;
  1620. VLISTOUT EQU    $+OFFSET
  1621.     DEFS    3
  1622. ;
  1623. ;Since these areas are not initialized,
  1624. ;the following counters will not be changed
  1625. ;by subsequent loads of this program
  1626. ;
  1627.     IF    USRLOG
  1628. OLDUSR    EQU    $+OFFSET
  1629.     DEFS    1
  1630. ;
  1631. NEWUSR    EQU    $+OFFSET
  1632.     DEFS    1
  1633. ;
  1634. NONUSR    EQU    $+OFFSET
  1635.     DEFS    1
  1636.     ENDIF            ;USRLOG
  1637. ;
  1638. ;
  1639.     DEFS    60
  1640. STACK    EQU    $+OFFSET    ;LOCAL STACK
  1641. ;
  1642. ENDMARK EQU    $+OFFSET    IGNORE ERROR. THIS MARKS END OF PGM
  1643. ;
  1644. ;BDOS equates
  1645. ;
  1646. CI    EQU    1
  1647. WRCON    EQU    2
  1648. DRECTIO EQU    6
  1649. PRINTF    EQU    9
  1650. CSTS    EQU    11
  1651. OPEN    EQU    15
  1652. READ    EQU    20
  1653. STDMA    EQU    26
  1654. BDOS    EQU    5
  1655. FCB    EQU    5CH 
  1656. FCBRNO    EQU    FCB+32
  1657. ;
  1658.     END    
  1659.