home *** CD-ROM | disk | FTP | other *** search
/ CP/M / CPM_CDROM.iso / simtel / sigm / vols000 / vol007 / dchbye55.asm < prev    next >
Assembly Source File  |  1984-04-29  |  23KB  |  988 lines

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