home *** CD-ROM | disk | FTP | other *** search
/ CP/M / CPM_CDROM.iso / simtel / sigm / vols000 / vol008 / dchbye57.asm < prev    next >
Encoding:
Assembly Source File  |  1984-04-29  |  23.1 KB  |  997 lines

  1. ;V5.7    (Revised 10/17/80)
  2. ;  
  3. ;
  4. ;REMOTE CONSOLE PROGRAM FOR CP/M
  5. ;BASED ON AN ORIGINAL PROGRAM WRITTEN
  6. ;BY DAVE JAFFE, JANUARY 1979
  7. ;
  8. ;Rewritten for PMMI modem
  9. ;by Ward Christensen, February 1979
  10. ;
  11. ;Lobotomized for D C Hayes 80-103
  12. ;by Bruce Ratoff, May 1980
  13. ;
  14. ;
  15. ;I'd also like to give credit to Bill Precht
  16. ;    for the "label + offset" idea allowing
  17. ;    this program to relocate itself
  18. ;    without using DDT to initially set it up
  19. ;
  20. ;
  21. ;10/17/80 Add "ani 7f" to console output so lower-to-upper case
  22. ;      conversion doesn't get fooled.  (BRR)
  23. ;
  24. ;10/09/80 Correct 2.X incompatibility in FCB setup for welcome file.
  25. ;      Also fixed bug that caused loss of welcome file when /A used.
  26. ;      (BRR)
  27. ;
  28. ;09/12/80 Reset user 0/drive A in move-up logic so BYE /A works
  29. ;      from other drives/users.
  30. ;      by Bruce Ratoff
  31. ;
  32. ;06/11/80 Ignore modem characters received with framing or overrun
  33. ;      errors.  This should help eliminate some of the noise
  34. ;      sensitivities.
  35. ;      by Bruce Ratoff
  36. ;
  37. ;06/08/80 Added (optional) lower-to-upper case conversion on output
  38. ;      by asking extra question at signon.
  39. ;      by Bruce Ratoff
  40. ;
  41. ;06/04/80 Added keyboard input timeout to eliminate the "asleep
  42. ;      at the switch" phenomenon and telco noises that sound
  43. ;      like a carrier.
  44. ;      by Bruce Ratoff
  45. ;
  46. ;05/26/80 Put in "warm boot command" logic to force user into
  47. ;      a chosen CCP command and disable warm boot on entry.
  48. ;      The JMP at location 0 is replaced by a CALL, which
  49. ;      is used to tell BYE to disconnect instead of doing
  50. ;      warm boot.  Program may re-enable warm boot by storing
  51. ;      JMP opcode back into location 0.  Also, whenever
  52. ;      warm boot is disabled, control-c is converted to null.
  53. ;      by Bruce Ratoff
  54. ;
  55. ;05/20/80 Put test at CARCK to force valid user/drive, as
  56. ;      suggested by Keith Petersen.
  57. ;      by Bruce Ratoff
  58. ;
  59. ;05/12/80 Changed modem I/O equates, ports and flags for the
  60. ;      D C Hayes 80-103A.
  61. ;      By Bruce Ratoff
  62. ;
  63. ;01/24/80 Added routines to preserve registers when calling
  64. ;      the user's CBIOS.  Added conditional assembly for
  65. ;      callback feature.  Increased stack space to 60.
  66. ;      By Keith Petersen.
  67. ;
  68. ;09/24/79 Added routines to allow automatic multiple baud
  69. ;      rate selection, exit to CP/M from local console,
  70. ;      echo nr. of nulls selected. By Keith Petersen,
  71. ;      with thanks to Bob Mathias for suggestions.
  72. ;
  73. ;05/06/79 Added routine to allow "callback" operation so modem
  74. ;      does not answer normal voice calls.  By Robbin Hough
  75. ;      and Keith Petersen, W8SDZ.
  76. ;
  77. ;------------------------------------------------
  78. ;CHANGE THE FOLLOWING EQUATE TO AN AREA IN YOUR
  79. ;HI MEMORY WHERE THIS PROGRAM MAY PATCH ITSELF IN.
  80. ;APPROX MEMORY REQUIREMENTS: 900 BYTES.
  81. ;
  82. DEST    EQU    0F800H    ;RUNNING LOCATION OF CODE
  83. ;
  84. ;CHANGE THE FOLLOWING TO YOUR LOCAL CONSOLE KEYBOARD
  85. ;DATA PORT NUMBER.
  86. ;
  87. CONDATA    EQU    05H    ;LOCAL CONSOLE INPUT DATA PORT
  88. ;
  89. ;CHANGE THE FOLLOWING IF YOUR HAYES IS NOT AT 090H
  90. ;(THE OTHER PORT EQUATES ARE BASED ON THIS VALUE)
  91. ;
  92. DPORT    EQU    090H    ;UART DATA PORT
  93. ;
  94. ;YOU WILL LIKELY ALSO WANT TO CHANGE THE PASSWORD,
  95. ;LOCATED BELOW AT LABEL "PASSWD", AND THE MESSAGES
  96. ;PRINTED AT LABEL "WELCOME" AND JUST ABOVE LABEL
  97. ;"HANGUP"
  98. ;
  99. ;------------------------------------------------
  100. ;
  101. ;THIS PROGRAM RUNS UP IN HIGH RAM.  IT GETS THERE
  102. ;BY BEING MOVED THERE WHEN 'BYE' IS TYPED.
  103. ;
  104. ;THE PROGRAM IN HI RAM DOES THE FOLLOWING:
  105. ;
  106. ;    1.    HANGS UP THE PHONE
  107. ;    2.    AWAITS RING DETECT, ALLOWS EXIT
  108. ;        TO CP/M IF LOCAL KBD TYPES CTL-C
  109. ;    3.    OUTPUTS CARRIER
  110. ;    4.    AWAITS INCOMING CARRIER
  111. ;        GOING TO STEP 1 IF NONE
  112. ;        FOUND IN 15 SECONDS
  113. ;    5.    ASKS NUMBER OF NULLS (0-9)
  114. ;    6.    TYPES THE FILE "WELCOME" FROM
  115. ;        DISK, ALLOWING CTL-C TO SKIP IT
  116. ;    7.    ASKS FOR A PASSWORD, ALLOWING
  117. ;        5 TRIES TO GET IT RIGHT.
  118. ;    8.    WHEN PASSWORD ENTERED, DROPS
  119. ;        INTO CP/M.
  120. ;    9.    CALLER CAN LEAVE BY HANGING UP,
  121. ;        (ANY TIME CARRIER IS LOST, IT
  122. ;        WAITS 15 SECONDS, THEN GOES
  123. ;        BACK TO STEP 1), OR THE CALLER
  124. ;        MAY TYPE THE PROGRAM NAME (BYE)
  125. ;
  126. ;    SYSTEM EQUATES:
  127. FALSE    EQU    0
  128. TRUE    EQU    NOT FALSE
  129. BDOS    EQU    5
  130. CR    EQU    0DH
  131. LF    EQU    0AH
  132. ;
  133. MAX$DRIVE    EQU    2    ;HIGHEST SUPPORTED DRIVE (0=A, 1=B, etc)
  134. MAX$USER    EQU    3    ;HIGHEST SUPPORTED USER
  135. PRINTER    EQU    FALSE    ;WANT TO RETAIN LIST DEVICE?
  136. DUAL$IO    EQU    TRUE    ;WANT CONSOLE & MODEM?
  137. CALLBAK    EQU    TRUE    ;WANT CALLBACK FEATURE?
  138. PSWDREQ    EQU    FALSE    ;PASSWORD REQUIRED?
  139. FASTCLK    EQU    TRUE    ;TRUE IF 4MHZ SYSTEM CLOCK
  140. CPM2    EQU    TRUE    ;TRUE FOR CP/M VERSION 2.x
  141. WBCMND    EQU    TRUE    ;TRUE TO USE WARM BOOT COMMAND
  142. WBUSER    EQU    3    ;USER # FOR WARM BOOT COMMAND (MUST BE 0 IN 1.4 CP/M)
  143. WBDRV    EQU    0    ;DRIVE # FOR WARM BOOT COMMAND (0=A, 1=B, ETC.)
  144. ;             (COMMAND STRING GOES AT LABEL 'WBCSTR' NEAR
  145. ;                END OF PROGRAM)
  146. TIMEOUT    EQU    TRUE    ;TRUE IF TIMING OUT ON CONSOLE INPUT
  147. TOVALUE    EQU    20*5*60    ;TIMEOUT TIME IN 20THS OF A SECOND
  148. ;
  149. ;    HAYES MODEM PORT ASSIGNMENTS:
  150. ;
  151. ;HAYES MODEM PORT EQUATES (DPORT PREVIOUSLY DONE)
  152. ;
  153. TPORT    EQU    DPORT+1    ;CONTROL/STATUS PORT
  154. RPORT    EQU    DPORT+1    ;RATE GEN/MODEM STATUS
  155. CPORT    EQU    DPORT+2    ;MODEM CONTROL
  156. ;
  157. ;MODEM CONTROL COMMAND WORDS
  158. ;
  159. P3CLEAR    EQU    00H    ;IDLE MODE
  160. ;
  161. ;
  162. ;
  163. ;SWITCH HOOK AND MODEM COMMANDS,
  164. ;    OUTPUT TO TPORT (PORT 0)
  165. ;
  166. P0BYE    EQU    0    ;ON HOOK, OR DIALING BREAK
  167. P0ORIG    EQU    84H    ;OFF HOOK, ORIG.
  168. P0ANSW    EQU    82H    ;ANSWER PHONE
  169. P08BIT    EQU    06H    ;8 DATA BITS
  170. P0NOPY    EQU    10H    ;NO PARITY
  171. P0EPS    EQU    01H    ;EVEN PARITY SELECT
  172. P0TSB    EQU    08H    ;2 STOP BITS
  173. P0EI    EQU    20H    ;ENABLE INTERRUPTS
  174. P0NORM    EQU    P08BIT+P0NOPY ;I USE 8 BITS, NO PARITY
  175. P0110    EQU    P08BIT+P0NOPY+P0TSB ;SAME W/2 STOP BITS
  176. ;
  177. ;MODEM STATUS, INPUT ON TPORT (PORT 1)
  178. ;
  179. P2RDET    EQU    80H    ;RING DETECT
  180. P2CTS    EQU    40H    ;CTS (CARRIER DETECT)
  181. ;
  182. ;HAYES MODEM STATUS MASKS
  183. ;
  184. P0TBMT    EQU    2    ;XMIT BUFF EMPTY
  185. P0DAV    EQU    1    ;DATA AVAILABLE
  186. P0RPE    EQU    4    ;REC'D PARITY ERR
  187. P0ORUN    EQU    10H    ;OVERRUN
  188. P0FERR    EQU    08H    ;FRAMING ERROR
  189. ;
  190. ;BAUD RATE DIVISORS
  191. ;
  192. B110    EQU    0    ;110 BAUD
  193. B300    EQU    1    ;300 BAUD
  194. ;
  195.     ORG    100H
  196. ;
  197. ;MOVE THE MODEM INTERFACE PROGRAM UP TO HI RAM
  198. ;AND JUMP TO IT.
  199. ;
  200. MOVEUP    lxi    sp,80h    ;set a temporary stack
  201.     LXI    B,PEND-START+1    ;NUMBER OF BYTES TO MOVE
  202.     LXI    H,DEST+PEND-START+1 ;END OF MOVED CODE
  203.     LXI    D,SOURCE+PEND-START    ;END OF SOURCE CODE
  204. MVLP    LDAX    D    ;GET BYTE
  205.     DCX    H    ;BUMP POINTERS
  206.     MOV    M,A    ;NEW HOME
  207.     DCX    D
  208.     DCX    B    ;BUMP BYTE COUNT
  209.     MOV    A,B    ;CHECK IF ZERO
  210.     ORA    C
  211.     JNZ    MVLP    ;IF NOT, DO SOME MORE
  212.     push    h    ;save jump address
  213.     sub    a    ;force user 0, disk A
  214.     sta    4    ;at next sign-in
  215.     IF    CPM2
  216.     mvi    e,0    ;need to set user 0 in bdos
  217.     mvi    c,32    ;so that open succeeds on welcome file
  218.     call    bdos
  219.     ENDIF
  220.     mvi    e,0
  221.     mvi    c,14    ;also need drive A default
  222.     call    bdos
  223.     mvi    a,0C3H    ;reset boot trap/control-c trap
  224.     sta    0
  225.     ret        ;JUMP TO "START" (was PUSHed above)
  226. ;
  227. SOURCE    EQU    $    ;BOUNDARY MEMORY MARKER
  228. ;
  229. OFFSET    EQU    DEST-SOURCE ;RELOC AMOUNT
  230. ;-----------------------------------------------;
  231. ;    THE FOLLOWING CODE GETS MOVED        ;
  232. ;     TO HI RAM LOCATED AT "DEST",        ;
  233. ;        WHERE IT IS EXECUTED.        ;
  234. ;-----------------------------------------------;
  235. ;XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
  236. ;XX   C A U T I O N :  IF MODIFYING ANYTHING     XX
  237. ;XX     IN THIS PROGRAM FROM HERE ON:         XX
  238. ;XX      A-L-L  LABELS MUST BE OF THE FORM:    XX
  239. ;XX    label    EQU    $+OFFSET        XX
  240. ;XX    IN ORDER THAT THE RELOCATION TO HI RAM     XX
  241. ;XX    WORK SUCCESSFULLY.  FORGETTING TO    XX
  242. ;XX    SPECIFY '$+OFFSET' WILL CAUSE THE PRO-    XX
  243. ;XX    GRAM TO JMP INTO WHATEVER IS CURRENTLY    XX
  244. ;XX    IN LOW MEMORY, WITH UNPREDICTABLE    XX
  245. ;XX    RESULTS.  BE CAREFUL....        XX
  246. ;XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
  247. ;
  248. ;    IF CARRIER LOST, HANG UP, AWAIT RING.
  249. ;    OTHERWISE, SAY GOODBYE, AND HANG UP
  250. ;
  251. START    EQU    $+OFFSET
  252.     LXI    SP,STACK
  253.     XRA    A    ;GET 0
  254.     STA    LOSTFLG    ;SHOW NO CARR. LOST
  255. ;CHECK FOR /A OPTION ON COMMAND - REQUEST TO
  256. ;GO IMMEDIATELY INTO ANSWER MODE
  257.     LXI    H,FCB+1    ;TO OPTION
  258.     MOV    A,M
  259.     CPI    '/'    ;OPTION?
  260.     JNZ    NOSLASH
  261. ;GOT AN OPTION - VALIDATE IT
  262.     INX    H    ;TO OPTION BYTE
  263.     MOV    A,M    ;GET IT
  264.     CPI    'A'    ;ANSWER?
  265.     JZ    ANSWER
  266. ;NO OPTION, OR INVALID ONE
  267. NOSLASH    EQU    $+OFFSET
  268.     CALL    CARCK    ;SIGNED OFF W/THIS PROG?
  269.     JC    HANGUP    ;NOBODY THERE
  270.     CALL    ILPRT    ;PRINT THIS MSG:
  271.     DB    CR,LF,'GOOD BYE, CALL AGAIN'
  272.     DB    CR,LF,CR,LF,0
  273.     CALL    UNPATCH    ;UNDO BIOS PATCHES
  274. ;
  275. ;
  276. ;    NOBODY THERE, OR WE ARE DONE, SO HANG UP
  277. ;
  278. HANGUP    EQU    $+OFFSET
  279.     LXI    SP,STACK ;SET UP LOCAL STACK
  280.     sub    a    ;force user 0, disk A
  281.     sta    4    ;at next sign-in
  282.     IF    CPM2
  283.     mvi    e,0    ;need to set user 0 in bdos
  284.     mvi    c,32    ;so that open succeeds on welcome file
  285.     call    bdos
  286.     ENDIF
  287.     mvi    e,0
  288.     mvi    c,14    ;also need drive A default
  289.     call    bdos
  290.     mvi    a,0C3H    ;reset boot trap/control-c trap
  291.     sta    0
  292. ;
  293. ;CLEAR DTR CAUSING PHONE TO HANG UP
  294.     MVI    A,P3CLEAR ;CLEAR..
  295.     OUT    CPORT    ;..DTR
  296. ;
  297. ;    AWAIT RINGING
  298. ;
  299. RINGWT    EQU    $+OFFSET
  300. ;CHECK LOCAL KEYBOARD FOR CTL-C EXIT REQUEST.
  301. ;NOTE: MUST DO DIRECT INPUT BECAUSE CBIOS PATCHES
  302. ;ARE NOT DONE UNTIL CALL COMES IN.
  303.     IN    CONDATA    ;CHECK LOCAL KBD
  304.     ANI    7FH    ;STRIP PARITY BIT
  305.     CPI    'C'-40H    ;CONTROL C?
  306.     JZ    0    ;YES, --EXIT-- TO CP/M
  307. ;
  308. RINGW2    EQU    $+OFFSET
  309.     IN    RPORT    ;GET THE STATUS
  310.     ANI    P2RDET    ;RINGING?
  311.     JNZ    RINGWT    ;NO, WAIT
  312. ;
  313. ;THE PHONE IS RINGING, NOW WAIT UNTIL RING IS FINISHED
  314. ENDRING    EQU    $+OFFSET
  315.     CALL    DELAY    ;.1 SEC DELAY FOR DEBOUNCE
  316.     IN    RPORT    ;GET STATUS
  317.     ANI    P2RDET    ;STILL RINGING?
  318.     JZ    ENDRING    ;WAIT UNTIL RING FINISHED
  319. ;
  320.     IF    CALLBAK    ;NEXT ROUTINES IMPLEMENT CALLBACK
  321. ;
  322. ;      THIS ROUTINE MINIMIZES THE COMPUTER'S INTERFERENCE
  323. ;      WITH NORMAL HOUSEHOLD PHONE USE BY HAVING COMPUTER
  324. ;      FOLK DIAL, LET THE PHONE RING ONCE, HANG UP AND 
  325. ;      THEN DIAL AGAIN.  WHEN THE PHONE RINGS ONLY ONCE IT
  326. ;      ALERTS THE COMPUTER WHICH THEN WAITS FOR AND ANSWERS
  327. ;      ANY RING WHICH OCCURS WITHIN THE NEXT 40 SECONDS.
  328. ;
  329.     MVI    L,45    ;DELAY 4.5 SECONDS FOR NEXT RING
  330. WAITNX    EQU    $+OFFSET
  331.     CALL    DELAY    ;WAIT .1 SECONDS
  332.     DCR    L    ;MORE TO GO?
  333.     JNZ    WAITNX    ;YES?...LOOP
  334.     IN    RPORT    ;GET THE STATUS
  335.     ANI    P2RDET    ;RINGING AGAIN?
  336.     JNZ    EXPECT    ;NO?...ITS FOR ME!
  337. ;CALL NOT FOR COMPUTER - WAIT UNTIL RINGING DONE, THEN RESET
  338. WAITNR    EQU    $+OFFSET
  339.     MVI    L,100    ;WAIT FOR 10 SECS NO RINGING
  340. WAITNRL    EQU    $+OFFSET
  341.     CALL    DELAY     ;DELAY .1 SECONDS
  342.     IN    RPORT    ;GET THE STATUS
  343.     ANI    P2RDET    ;STILL RINGING?
  344.     JZ    WAITNR    ;YES, WAIT 10 MORE SECONDS
  345.     DCR    L    ;NO RING, MAYBE WE'RE DONE
  346.     JNZ    WAITNRL    ;NO, LOOP SOME MORE
  347.     JMP    HANGUP
  348. ;
  349. EXPECT    EQU    $+OFFSET
  350.     LXI    H,400    ;40 SECONDS TO REDIAL
  351. RELOOK    EQU    $+OFFSET
  352.     IN    RPORT
  353.     ANI    P2RDET    ;RINGING AGAIN?
  354.     JZ    ANSWER
  355.     CALL      DELAY
  356.     DCX    H
  357.     MOV    A,H
  358.     ORA    L
  359.     JNZ    RELOOK
  360.     JMP    HANGUP
  361. ;
  362.     ENDIF        ;END OF CALLBACK ROUTINES
  363. ;
  364. ;SETUP MODEM
  365. ANSWER    EQU    $+OFFSET
  366.      MVI    A,P0ANSW ;TURN ON
  367.     OUT    CPORT    ;..DTR
  368.     MVI    E,20
  369. ANSWR1    EQU    $+OFFSET
  370.     CALL    DELAY    ;GIVE TIME TO TURN ON
  371.     DCR    E
  372.     JNZ    ANSWR1
  373.     MVI    A,P0110
  374.     OUT    TPORT    ;ANSWER PHONE
  375.     CALL    DELAY    ;GIVE TIME FOR ANSWER
  376.     IN    CONDATA    ;CLEAR LOCAL KBD PORT
  377.     IN    DPORT    ;CLEAR MODEM PORT
  378.     IN    DPORT    ;MAKE SURE ITS CLEAR
  379. ;OUTPUT VALUE ALLOWING MODEM TO HANG UP ON
  380. ;LOSS OF CARRIER
  381.     CALL    CARCK    ;LOOK FOR CARRIER
  382.     JC    HANGUP    ;AWAIT ANOTHER CALLER
  383. ;NOW TEST INPUT FOR BAUD RATE
  384.     CALL    PATCH     ;PATCH JMP TABLE
  385.     CALL    TSTBAUD  ;SEE IF BAUD = 110
  386.     JZ    WELCOME     ;YES, EXIT
  387.     MVI    A,P0NORM ;SET FOR 1 STOP BIT, ETC.
  388.     OUT    TPORT
  389.     MVI    A,B300+P0ANSW ;SET DIVISOR
  390.     OUT    CPORT     ;.. TO 300 RATE
  391.     CALL     TSTBAUD  ;SEE IF BAUD = 300
  392.     JZ    WELCOME  ;YES, EXIT
  393.     CALL    UNPATCH     ;RESTORE ORIG BIOS JMP TBL
  394.     JMP    ANSWER     ;TEST MORE - INVALID BAUD RATE
  395. ;
  396. ;WELCOME TO THE SYSTEM
  397. ;
  398. WELCOME    EQU    $+OFFSET
  399. ;
  400. GETNULL    EQU    $+OFFSET
  401.     CALL    ILPRT    ;PRINT THIS MSG:
  402.     DB    CR,LF
  403.     DB    'HOW MANY NULLS DO YOU NEED? ',0
  404.     CALL    MINPUT    ;GET VALUE
  405.     MOV    C,A
  406.     CALL    MOUTPUT    ;ECHO CHAR
  407.     MOV    A,C
  408.     CPI    '0'
  409.     JC    GETNULL    ;BAD, RETRY
  410.     CPI    '9'+1
  411.     JNC    GETNULL    ;BAD
  412.     SUI    '0'    ;MAKE BINARY
  413.     STA    NULLS    ;SAVE COUNT
  414. GETULC    EQU    $+OFFSET
  415.     CALL    ILPRT
  416.     DB    CR,LF,'CAN YOUR TERMINAL DISPLAY LOWER CASE? ',0
  417.     MVI    A,20H
  418.     STA    ULCSW    ;FORCE CASE CONVERSION FOR NOW
  419.     CALL    MINPUT    ;GET Y OR N
  420.     MOV    C,A
  421.     CALL    MOUTPUT    ;ECHO
  422.     CPI    'N'
  423.     JZ    DONEOPT    ;WE'RE ALREADY SET UP FOR NO LOWER CASE
  424.     CPI    'Y'
  425.     JNZ    GETULC    ;WASN'T Y OR N...RE-ASK
  426.     SUB    A
  427.     STA    ULCSW    ;SET FLAG FOR NO CONVERSION
  428. DONEOPT    EQU    $+OFFSET
  429.     CALL    ILPRT
  430.     DB    CR,LF,0
  431. ;PRINT THE WELCOME FILE
  432.     LXI    H,WELFILN ;SOURCE
  433.     LXI    D,FCB    ;DESTINATION
  434.     MVI    B,16    ;LENGTH
  435.     CALL    MOVE    ;MOVE THE NAME
  436. ;SET DMA ADDR TO 80H
  437.     LXI    D,80H
  438.     MVI    C,STDMA
  439.     CALL    BDOS
  440. ;OPEN THE WELCOME FILE
  441.     LXI    D,FCB
  442.     MVI    C,OPEN
  443.     CALL    BDOS
  444. ;DID IT EXIST?
  445.     INR    A    ;A=> 0 MEANS "NO"
  446.     JZ    PASSINT    ;NO WELCOME FILE
  447. ;GOT A FILE, TYPE IT
  448.     XRA    A    ;GET 0
  449.     STA    FCBRNO    ;ZERO RECORD #
  450.     LXI    H,100H    ;GET INITIAL BUFF POINTER
  451. ;TYPE THE WELCOME FILE
  452. WELTYLP    EQU    $+OFFSET
  453.     CALL    RDBYTE    ;GET A BYTE
  454.     CPI    1AH    ;EOF?
  455.     JZ    PASSINT    ;YES, DONE
  456.     MOV    C,A    ;SETUP FOR TYPE
  457.     CALL    MOUTPUT    ;TYPE THE CHAR
  458.     CALL    MSTAT    ;CHECK FOR..
  459.     ORA    A    ;CHAR TYPED?
  460.     JZ    WELTYLP    ;..NO, LOOP
  461.     CALL    MINPUT    ;..YES, GET CHAR
  462.     CPI    'C'-40H    ;CTL-C?
  463.     JNZ    WELTYLP    ;..NO, LOOP UNTIL EOF
  464. ;
  465. ;GET THE PASSWORD
  466. ;
  467. PASSINT    EQU    $+OFFSET
  468.     IF    PSWDREQ
  469.     MVI    D,5    ;5 TRIES AT PASSWORD
  470. PASSINP    EQU    $+OFFSET
  471.     CALL    ILPRT
  472.     DB    CR,LF,'ENTER PASSWORD: ',0
  473.     LXI    H,PASSWD ;POINT TO PASSWORD
  474.     MVI    E,0    ;NO MISSED LETTERS
  475.     IN    DPORT    ;CLEAR OUT GARBAGE
  476. PWMLP    EQU    $+OFFSET
  477.     CALL    MINPUT    ;GET A CHAR
  478.     CPI    'U'-40H    ;CTL-U?
  479.     JZ    PASSINP    ;YES, RE-GET IT
  480.     CPI    60H    ;LOWER CASE?
  481.     JC    NOTLC    ;NO,
  482.     ANI    5FH    ;MAKE UPPER CASE ALPHA
  483. NOTLC    EQU    $+OFFSET
  484.     CMP    M    ;MATCH PASSWORD?
  485.     JZ    PWMAT    ;..YES
  486.     MVI    E,1    ;..NO, SHOW MISS
  487.     CPI    CR    ;C/R?
  488.     JNZ    PWMLP    ;..NO, WAIT FOR C/R
  489. ;PASSWORD DIDN'T MATCH
  490. PWNMAT    EQU    $+OFFSET
  491.     CALL    ILPRT
  492.     DB    '++INCORRECT++',CR,LF,0
  493.     DCR    D    ;MORE TRIES?
  494.     JNZ    PASSINP    ;YES
  495.     JMP    BADPASS    ;NO, GO HANG UP
  496. ;CHARACTER MATCHED IN PASSWORD
  497. PWMAT    EQU    $+OFFSET
  498.     INX    H    ;TO NEXT CHAR
  499.     CPI    CR    ;END?
  500.     JNZ    PWMLP    ;..NO, LOOP
  501. ;END OF PASSWORD.  ANY MISSED CHARS?
  502.     MOV    A,E    ;GET FLAG
  503.     ORA    A
  504.     JNZ    PWNMAT    ;NOT RIGHT
  505.     ENDIF
  506. ;PASSWORD CORRECT
  507.     CALL    ILPRT
  508.     DB    CR,LF,'BOOTING SYSTEM...',0
  509.     IF    WBCMND
  510.     MVI    A,0FFH    ;SET WARM BOOT FLAG (TESTED AT MOUTPUT)
  511.     STA    WBFLAG
  512.     ENDIF
  513.     JMP    VWARMBT    ;GO LOAD CP/M
  514. ;
  515. ;TSTBAUD ATTEMPTS TO READ A LF OR CR, RETURNS WITH
  516. ;ZERO FLAG IF THE CHARACTER READ IS ONE OF THESE TWO.
  517. ;
  518. TSTBAUD    EQU    $+OFFSET
  519.     CALL    MINPUT    ;GET CHARACTER FROM MODEM
  520.     CPI    CR    ;IF A CARRIAGE RETURN...
  521.     RZ        ;.. RETURN
  522.     CPI    LF    ;IF A LINEFEED...
  523.     RET        ;RET ZERO FLAG, ELSE NOT ZERO
  524. ;
  525. ;    LOSS OF CONNECTION TEST
  526. ;
  527. ;THIS ROUTINE AUTOMATICALLY HANGS UP THE
  528. ;PHONE AFTER LOSS OF CARRIER
  529. ;
  530. ;THIS ROUTINE CHECKS IF CARRIER IS STILL
  531. ;PRESENT, AND IF SO, RETURNS WITH CARRY CLEAR.
  532. ;IF NOT, IT WAITS FOR CARRIER FOR 15 SECS.
  533. ;IF THIS TIME RUNS OUT, IT RETURNS WITH CARRY SET.
  534. ;
  535. ;
  536. CARCK    EQU    $+OFFSET
  537.     PUSH    D
  538.     MVI    E,150
  539. CARCK1    EQU    $+OFFSET
  540.     IN    RPORT    ;LOOK AT STATUS
  541.     ANI    P2CTS    ;GET CARRIER DETECT BIT
  542.     JNZ    CARCK2    ;IF CARRIER ON, continue with checks
  543. ;LOOP UNTIL EITHER TIME EXHAUSTED, OR
  544. ;CARRIER RETURNS
  545.     CALL    DELAY    ;KILL .1 SEC
  546.     DCR    E    ;COUNT DOWN TIME
  547.     JNZ    CARCK1
  548.     STC
  549.     pop    d
  550.     ret
  551. CARCK2    EQU    $+OFFSET
  552.     lda    4        ;check disc/user #
  553.     ani    0fh        ;isolate drive
  554.     cpi    max$drive+1    ;valid drive?
  555.     jc    carck3        ;yes, skip this junk
  556.     lda    4        ;restore whole login byte
  557.     ani    0f0h        ;retain user #
  558.     sta    4        ;force drive to A
  559.     jmp    0        ;force warm boot (punishment?)
  560. carck3    equ    $+offset
  561.     if    cpm2        ;skip this junk if cp/m 1.x
  562.     lda    4        ;re-fetch login byte
  563.     ani    0f0h        ;isolate user #
  564.     cpi    max$user*16+1    ;valid user ?
  565.     jc    carck4        ;yes, don't change
  566.     lda    4        ;refresh login byte again
  567.     ani    0fh        ;keep drive, zero user
  568.     sta    4
  569.     jmp    0        ;force warm boot
  570.     endif            ;end of cp/m 2.x dependant stuff
  571. CARCK4    EQU    $+OFFSET
  572.     ora    a        ;clear carry
  573.     POP    D
  574.     RET
  575. ;
  576. ;    .1 SEC DELAY ROUTINE
  577. ;
  578. DELAY    EQU    $+OFFSET
  579.     PUSH    B
  580.     IF    FASTCLK
  581.     LXI    B,16667    ;.1 SEC COUNT FOR 4MHZ SYS CLOCK
  582.     ENDIF
  583.     IF    NOT FASTCLK
  584.     LXI    B,8334    ;.1 SEC COUNT FOR 2MHZ SYS CLOCK
  585.     ENDIF
  586. DELAY1    EQU    $+OFFSET
  587.     DCX    B    ;COUNT DOWN DELAY TIME
  588.     MOV    A,B
  589.     ORA    C
  590.     JNZ    DELAY1    ;CONTINUE COUNTING TILL DONE
  591.     POP    B
  592.     RET
  593. ;
  594. ;
  595. KDELAY    EQU    $+OFFSET
  596.     PUSH    B
  597.     IF    FASTCLK
  598.     LXI    B,8334    ;.05 SEC COUNT FOR 4MHZ
  599.     ENDIF
  600.     IF    NOT FASTCLK
  601.     LXI    B,4167    ;.05 SEC COUNT FOR 2MHZ
  602.     ENDIF
  603.     JMP    DELAY1
  604. ;
  605. ;
  606. ;PATCH IN THE NEW JMP TABLE (SAVING THE OLD)
  607. ;
  608. PATCH    EQU    $+OFFSET
  609.     CALL    TBLADDR    ;CALC HL= CP/M JMP TABLE
  610.     LXI    D,VCOLDBT ;POINT TO SAVE LOCATION
  611.     CALL    MOVE    ;MOVE IT
  612. ;NOW MOVE NEW JMP TABLE TO CP/M
  613.     CALL    TBLADDR    ;CALC HL=CP/M'S JMP TABLE
  614.     XCHG        ;MOVE TO DE
  615.     LXI    H,NEWJTBL ;POINT TO NEW
  616.     CALL    MOVE    ;MOVE IT
  617.     RET
  618. ;
  619. UNPATCH    EQU    $+OFFSET
  620.     CALL    TBLADDR    ;HL=CP/M'S JMP TABLE
  621.     XCHG        ;MOVE TO DE
  622.     LXI    H,VCOLDBT ;GET SAVED TABLE
  623.     CALL    MOVE    ;MOVE ORIG BACK
  624.     RET            
  625. ;
  626. ;CALCULATE HL=CP/M'S JUMP TABLE, B=LENGTH
  627. ;
  628. TBLADDR    EQU    $+OFFSET
  629.     LHLD    1    ;GET BIOS POINTER
  630.     DCX    H    ;..SKIP
  631.     DCX    H    ;..TO
  632.     DCX    H    ;..COLD BOOT
  633. ;
  634.     IF    NOT PRINTER
  635.     MVI    B,18    ;BYTES TO MOVE
  636.     ENDIF
  637. ;
  638.     IF    PRINTER    ;RETAIN LIST DEVICE?
  639.     MVI    B,15    ;DON'T MOVE LISTER JUMP
  640.     ENDIF
  641. ;
  642.     RET
  643. ;
  644. ;MOVE (HL) TO (DE), LENGTH IN (B)
  645. ;
  646. MOVE    EQU    $+OFFSET
  647.     MOV    A,M    ;GET A BYTE
  648.     STAX    D    ;PUT AT NEW HOME
  649.     INX    D    ;BUMP POINTERS
  650.     INX    H
  651.     DCR    B    ;DEC BYTE COUNT
  652.     JNZ    MOVE    ;IF MORE, DO IT
  653.     RET        ;IF NOT,RETURN
  654. ;
  655. ;COMMON ROUTINE TO CHECK FOR CARRIER LOST,
  656. ;CALLED FROM CONSOLE STATUS, AND CONSOLE OUT
  657. ;
  658. CHECK    EQU    $+OFFSET
  659.     CALL    CARCK    ;SEE IF CARRIER STILL ON
  660.     RNC        ;ALL OK
  661. ;CARRIER IS LOST.  TYPE MESSAGE SO LOCAL CONSOLE
  662. ;    SHOWS THE REASON
  663. BADPASS    EQU    $+OFFSET ;COME HERE ON BAD PASSWORD
  664.     MVI    A,1    ;SHOW CARRIER LOST SO
  665.     STA    LOSTFLG    ;..WE WON'T CK AGAIN
  666.     LXI    SP,STACK ;ENSURE VALID STACK
  667.     CALL    ILPRT
  668.     DB    CR,LF
  669.     DB    '++CARRIER LOST++'
  670.     DB    CR,LF,'   ',0
  671.     CALL    UNPATCH    ;RESTORE ORIG BIOS JMP TBL
  672.     XRA    A    ;CLEAR OUT CARRIER..
  673.     STA    LOSTFLG    ;..LOST FLAG
  674.     JMP    HANGUP
  675. ;
  676. ;READBYTE ROUTINE - USED TO READ THE
  677. ;    WELCOME FILE
  678. ;
  679. RDBYTE    EQU    $+OFFSET
  680.     MOV    A,H    ;TIME TO READ?
  681.     ORA    A    ;..IF AT 100H
  682.     JZ    NORD    ;NO READ REQ'D
  683. ;HAVE TO READ A SECTOR
  684.     LXI    D,FCB
  685.     MVI    C,READ
  686.     CALL    BDOS
  687.     ORA    A    ;OK?
  688.     MVI    A,1AH    ;FAKE UP EOF
  689.     RNZ        ;RET EOF IF BAD
  690.     LXI    H,80H
  691. NORD    EQU    $+OFFSET
  692.     MOV    A,M    ;GET CHAR
  693.     INX    H    ;TO NEXT
  694.     RET
  695. ;
  696. ;KEYBOARD/MODEM STATUS TEST ROUTINE
  697. ;
  698. MSTAT    EQU    $+OFFSET
  699. ;
  700.     IF    DUAL$IO    ;WANT LOCAL CONSOLE?
  701.     CALL    CONSTAT    ;GET LOCAL STATUS
  702.     ORA    A
  703.     RNZ        ;RET IF LOCAL CHAR
  704.     ENDIF
  705. ;
  706.     IN    TPORT    ;GET STATUS
  707.     ANI    P0DAV    ;DATA AVAILABLE?
  708.     RZ        ;RETURN IF NOT READY
  709.     IN    TPORT    ;GET STATUS AGAIN
  710.     ANI    18H    ;CHECK FRAMING AND OVERRUN BITS
  711.     JZ    MSTAT1    ;NO ERRORS...LEGIT CHARACTER
  712.     IN    DPORT    ;SWALLOW CHARACTER (CLEARS P0DAV)
  713.     SUB    A    ;RETURN FALSE (0)
  714.     RET
  715. MSTAT1    EQU    $+OFFSET
  716.     MVI    A,0FFH    ;SHOW READY
  717.     ORA    A
  718.     RET
  719. ;
  720. ;MODEM INPUT FUNCTION, CHECKS LOCAL CONSOLE FIRST
  721. ;
  722. MINPUT    EQU    $+OFFSET
  723.     IF    TIMEOUT
  724.     PUSH    H        ;INITIALIZE TIMEOUT COUNTER
  725.     LXI    H,TOVALUE
  726.     SHLD    TOCNT
  727.     POP    H
  728.     ENDIF
  729. MINPUT1    EQU    $+OFFSET
  730.     LDA    LOSTFLG    ;KNOWN LOSS..
  731.     ORA    A    ;..OF CARRIER?
  732.     CZ    CHECK    ;CARRIER STILL ON?
  733. ;
  734.     CALL    MSTAT    ;ANYTHING?
  735.     ORA    A
  736. ;
  737.     IF    NOT TIMEOUT
  738.     JZ    MINPUT    ;LOOP TILL CHAR RCD
  739.     ENDIF
  740. ;
  741.     IF    TIMEOUT
  742.     JNZ    MINPUT2
  743.     CALL    KDELAY        ;KILL .05 SEC
  744.     PUSH    H
  745.     LHLD    TOCNT        ;KNOCK DOWN TIMEOUT COUNTER
  746.     DCX    H
  747.     SHLD    TOCNT
  748.     MOV    A,H
  749.     ORA    L
  750.     POP    H
  751.     JNZ    MINPUT1        ;STILL MORE TIME...KEEP TRYING
  752.     CALL    ILPRT
  753.     DB    '+++INPUT TIMED OUT',7,7,0
  754.     JMP    NOSLASH
  755.     ENDIF
  756. ;
  757. ;GOT CHAR - SEE WHICH PORT
  758. ;
  759. MINPUT2    EQU    $+OFFSET
  760.     IF    DUAL$IO    ;BOTH LOCAL AND REMOTE?
  761.     CALL    CONSTAT    ;CHECK LOCAL CONSOLE
  762.     ORA    A    ;CHAR?
  763.     JNZ    CONIN    ;..YES, READ IT, RET.
  764.     ENDIF
  765. ;
  766. ;LOCAL CONSOLE WASN'T READY, SO READ MODEM
  767.     IN    DPORT    ;GET DATA BYTE
  768.     ANI    7FH    ;DELETE PARITY
  769.     JZ    MINPUT    ;IGNORE NULLS
  770.     IF    WBCMND
  771.     CPI    3    ;CONTROL-C?
  772.     RNZ        ;NO, PASS IT THRU
  773.     LDA    0    ;SEE IF WARM BOOT DISABLED
  774.     CPI    0C3H    ;JMP MEANS WARM BOOT OK
  775.     MVI    A,3    ;SO RETURN CONTROL-C AS TYPED
  776.     RZ
  777.     SUB    A    ;ELSE CONVERT IT TO A NULL
  778.     ENDIF
  779.     RET
  780. ;
  781. ;MODEM OUTPUT ROUTINE.  OUTPUTS TO MODEM,
  782. ;THEN TO LOCAL CONSOLE
  783. ;
  784. MOUTPUT    EQU    $+OFFSET
  785. ;IF WE ALREADY KNOW CARRIER IS LOST,
  786. ;DON'T CHECK FOR IT AGAIN
  787.     LDA    LOSTFLG    ;KNOWN LOSS OF CARRIER?
  788.     ORA    A
  789.     CZ    CHECK    ;CARRIER STILL ON?
  790.     IF    WBCMND
  791.     LDA    WBFLAG    ;IS THIS FIRST WARM BOOT SINCE SIGNON?
  792.     ORA    A    ;IF NOT, SKIP THIS STUFF
  793.     JZ    MOUTP1
  794.     SUB    A    ;TURN OFF FLAG FOR NEXT TIME
  795.     STA    WBFLAG
  796.     MVI    A,0CDH    ;DISABLE WARM BOOT
  797.     STA    0
  798.     LDA    7    ;GET BDOS ADDRESS
  799.     SUI    8    ;CCP IS 2K DOWN FROM BDOS
  800.     MOV    H,A
  801.     MVI    L,0    ;HL NOW CONTAINS CCP ENTRY ADDRESS
  802.     PUSH    H    ;SAVE FOR LATER
  803.     MVI    L,7    ;POINT TO BYTE COUNT IN CCP COMMAND BUFFER
  804.     XCHG        ;MAKE IT DEST POINTER (DE)
  805.     LXI    H,WBCSTR    ;POINT TO COMMAND STRING TO DROP IN
  806.     MOV    B,M    ;GET BYTE COUNT
  807.     INR    B    ;UP BY 2 TO INCLUDE COUNT AND TRAILING NULL
  808.     INR    B
  809.     CALL    MOVE    ;DROP IT IN TO CCP
  810.     MVI    A,WBUSER*16+WBDRV    ;SET LOCATION 4 (USER/DRIVE)
  811.     STA    4
  812.     MOV    C,A    ;ALSO PASS IT TO CCP
  813.     POP    H    ;GET BACK CCP ENTRY ADDRESS
  814.     PCHL        ;GO THERE
  815. MOUTP1    EQU    $+OFFSET
  816.     ENDIF
  817.     IN    TPORT    ;READ MODEM STATUS
  818.     ANI    P0TBMT    ;XMIT BUFF EMPTY?
  819.     JZ    MOUTPUT    ;LOOP IF NOT READY
  820.     MOV    A,C    ;GET CHAR
  821.     ANI    7FH    ;STRIP HIGH BIT
  822.     CPI    60H    ;CHECK FOR LOWER CASE
  823.     JC    MOUTP2    ;SKIP IF NOT LC
  824.     CPI    7FH    ;CHECK FOR RUBOUT
  825.     JZ    MOUTP2
  826.     PUSH    H
  827.     LXI    H,ULCSW    ;SUBTRACT EITHER 20H OR 0
  828.     SUB    M
  829.     POP    H
  830.     MOV    C,A    ;FORCE ON LOCAL AS WELL AS REMOTE
  831. MOUTP2    EQU    $+OFFSET
  832.     OUT    DPORT    ;OUTPUT TO MODEM
  833. ;
  834.     IF    DUAL$IO    ;TO LOCAL ALSO?
  835.     CALL    CONOUT    ;SEND TO REGULAR BIOS
  836.     ENDIF
  837. ;
  838. ;CHECK FOR NULLS
  839. ;
  840.     CPI    LF    ;TIME FOR NULLS?
  841.     RNZ        ;NO, RETURN
  842. ;SEND NULLS IF REQUIRED
  843.     LDA    NULLS    ;GET COUNT
  844.     ORA    A    ;ANY?
  845.     RZ        ;..NO
  846.     PUSH    B
  847.     MOV    B,A    ;SAVE COUNT
  848.     MVI    C,0    ;0 IS A NULL
  849. NULLP    EQU    $+OFFSET
  850.     CALL    MOUTPUT    ;TYPE A NULL
  851.     DCR    B    ;MORE?
  852.     JNZ    NULLP    ;..YES, LOOP
  853.     POP    B
  854.     RET
  855. ;
  856. ;BOOT TRAP - BECOMES DISCONNECT IF JMP AT 0 HAS BEEN ALTERED
  857. ;
  858. MBOOT    EQU    $+OFFSET
  859.     LDA    0    ;LOOK AT OPCODE
  860.     CPI    0C3H    ;IS IT STILL JMP?
  861.     JZ    VWARMBT    ;YES, ALLOW IT
  862.     JMP    NOSLASH    ;NO, DISCONNECT
  863. ;
  864. ;    INLINE PRINT ROUTINE
  865. ;    CALL ILPRT
  866. ;    DB    'MSG',0
  867. ;
  868. ILPRT    EQU    $+OFFSET
  869.     XTHL        ;SAVE HL, GET MSG
  870.     PUSH    B    ;SAVE
  871. ILPLP    EQU    $+OFFSET
  872.     MOV    C,M    ;GET CHAR
  873.     CALL    MOUTPUT    ;OUTPUT IT
  874.     INX    H    ;POINT TO NEXT
  875.     MOV    A,M    ;TEST
  876.     ORA    A    ;..FOR END
  877.     JNZ    ILPLP
  878.     POP    B    ;RESTORE
  879.     XTHL        ;RESTORE HL, RET ADDR
  880.     RET        ;RET PAST MSG
  881. ;
  882. ;ACCESS PASSWORD (ENDS IN C/R)
  883. ;
  884. PASSWD    EQU    $+OFFSET
  885.     DB    '******' ;THE PASSWORD ITSELF
  886.     DB    CR    ;END OF PASSWORD
  887. ;ALLOW ROOM FOR BIGGER PASSWORD TO BE
  888. ;    PATCHED IN
  889.     DB    0,0,0,0,0,0,0,0,0,0,0,0,0
  890. ;
  891. ;WARM BOOT COMMAND STRING
  892. ;
  893.     IF    WBCMND
  894. WBCSTR    EQU    $+OFFSET
  895.     DB    WBCEND-WBCSTR-2
  896.     DB    'RIBBS'
  897.     DB    0
  898. WBCEND    EQU    $+OFFSET
  899.     ENDIF
  900. ;
  901. ;THIS AREA IS USED FOR VECTORING CALLS TO THE
  902. ;USER'S CBIOS, BUT SAVING THE REGISTERS FIRST
  903. ;IN CASE THEY ARE DESTROYED.
  904. ;
  905. CONSTAT    EQU    $+OFFSET
  906.     PUSH    B
  907.     PUSH    D
  908.     PUSH    H
  909.     CALL    VCONSTAT
  910.     POP    H
  911.     POP    D
  912.     POP    B
  913.     RET
  914. ;
  915. CONIN    EQU    $+OFFSET
  916.     PUSH    B
  917.     PUSH    D
  918.     PUSH    H
  919.     CALL    VCONIN
  920.     POP    H
  921.     POP    D
  922.     POP    B
  923.     RET
  924. ;
  925. CONOUT    EQU    $+OFFSET
  926.     PUSH    B
  927.     PUSH    D
  928.     PUSH    H
  929.     CALL    VCONOUT
  930.     POP    H
  931.     POP    D
  932.     POP    B
  933.     RET
  934. ;
  935. ;    THIS IS THE JMP TABLE WHICH IS COPIED
  936. ;    ON TOP OF THE ONE POINTED TO BY
  937. ;    LOCATION 1 IN CP/M
  938. ;
  939. NEWJTBL    EQU    $+OFFSET
  940.     JMP    MBOOT    ;BOOT TRAP
  941.     JMP    MBOOT    ;BOOT TRAP
  942.     JMP    MSTAT    ;MODEM STATUS TEST
  943.     JMP    MINPUT    ;MODEM INPUT ROUTINE
  944.     JMP    MOUTPUT    ;MODEM OUTPUT ROUTINE
  945.     RET        ;DUMMY LIST DEVICE
  946.     NOP
  947.     NOP
  948. ;
  949. WELFILN    EQU    $+OFFSET
  950.     DB    0,'WELCOME    ',0,0,0,0
  951. ;WELCOME FILE NAME ^^^^^^^^^^^
  952. ;
  953. NULLS    EQU    $+OFFSET
  954.     DB    5
  955. WBFLAG    EQU    $+OFFSET
  956.     DB    0
  957. TOCNT    EQU    $+OFFSET
  958.     DW    0
  959. ULCSW    EQU    $+OFFSET
  960.     DB    0
  961. ;
  962. PEND    EQU    $+OFFSET ;END OF RELOCATED CODE
  963. ;
  964. ;KEEP TRACK OF LOST CARRIER WHEN TYPING
  965. ;"++CARRIER LOST++" SO WE DON'T LOOP
  966. ;
  967. LOSTFLG    EQU    $+OFFSET
  968.     DS    1
  969. ;
  970. ;SAVE THE CP/M JUMP TABLE HERE
  971. ;
  972. VCOLDBT    EQU    $+OFFSET
  973.     DS    3
  974. VWARMBT    EQU    $+OFFSET
  975.     DS    3
  976. VCONSTAT EQU    $+OFFSET
  977.      DS    3
  978. VCONIN     EQU    $+OFFSET
  979.      DS    3
  980. VCONOUT     EQU    $+OFFSET
  981.      DS    3
  982. VLISTOUT EQU    $+OFFSET
  983.      DS    3
  984. ;
  985.     DS    60
  986. STACK    EQU    $+OFFSET    ;LOCAL STACK
  987. ;
  988. WRCON    EQU    2
  989. OPEN    EQU    15
  990. READ    EQU    20
  991. STDMA    EQU    26
  992. FCB    EQU    5CH 
  993. FCBRNO    EQU    FCB+32
  994. ;
  995.     END
  996.  
  997.