home *** CD-ROM | disk | FTP | other *** search
/ ftp.barnyard.co.uk / 2015.02.ftp.barnyard.co.uk.tar / ftp.barnyard.co.uk / cpm / walnut-creek-CDROM / SIMTEL / CPMUG / CPMUG040.ARK / PMMIBYE3.ASM < prev    next >
Assembly Source File  |  1984-04-29  |  17KB  |  721 lines

  1. ;V3.0    (Revised 9/24/79)
  2. ;
  3. ;REMOTE CONSOLE PROGRAM FOR CP/M
  4. ;BASED ON AN ORIGINAL PROGRAM WRITTEN
  5. ;BY DAVE JAFFE, JANUARY 1979
  6. ;
  7. ;Rewritten for PMMI modem
  8. ;by Ward Christensen, February 1979
  9. ;
  10. ;I'd also like to give credit to Bill Precht
  11. ;    for the "label + offset" idea allowing
  12. ;    this program to relocate itself
  13. ;    without using DDT to initially set it up
  14. ;
  15. ;05/06/79 Added routine to allow "callback" operation so modem
  16. ;      does not answer normal voice calls.  By Robbin Hough
  17. ;      and Keith Petersen
  18. ;
  19. ;09/24/79 Added routines to allow automatic multiple baud
  20. ;      rate selection, exit to CP/M from local console,
  21. ;      echo nr. of nulls selected. By Keith Petersen,
  22. ;      with thanks to Bob Mathias for suggestions.
  23. ;
  24. ;------------------------------------------------
  25. ;CHANGE THE FOLLOWING EQUATE TO AN AREA IN YOUR
  26. ;HI MEMORY WHERE THIS PROGRAM MAY PATCH ITSELF IN.
  27. ;APPROX MEMORY REQUIREMENTS: 800 BYTES.
  28. ;
  29. DEST    EQU    0F000H    ;RUNNING LOCATION OF CODE
  30. ;
  31. ;CHANGE THE FOLLOWING TO YOUR LOCAL CONSOLE KEYBOARD
  32. ;DATA PORT NUMBER.
  33. ;
  34. CONDATA    EQU    02H    ;LOCAL CONSOLE INPUT DATA PORT
  35. ;
  36. ;CHANGE THE FOLLOWING IF YOUR PMMI IS NOT AT 0C0H
  37. ;(THE OTHER PORT EQUATES ARE BASED ON THIS VALUE)
  38. ;
  39. TPORT    EQU    0C0H    ;UART CONTROL/STATUS PORT
  40. ;
  41. ;YOU WILL LIKELY ALSO WANT TO CHANGE THE PASSWORD,
  42. ;LOCATED BELOW AT LABEL "PASSWD", AND THE MESSAGES
  43. ;PRINTED AT LABEL "WELCOME" AND JUST ABOVE LABEL
  44. ;"HANGUP"
  45. ;
  46. ;------------------------------------------------
  47. ;
  48. ;THIS PROGRAM RUNS UP IN HIGH RAM.  IT GETS THERE
  49. ;BY BEING MOVED THERE WHEN 'BYE' IS TYPED.
  50. ;
  51. ;THE PROGRAM IN HI RAM DOES THE FOLLOWING:
  52. ;
  53. ;    1.    HANGS UP THE PHONE
  54. ;    2.    AWAITS RING DETECT, ALLOWS EXIT
  55. ;        TO CP/M IF LOCAL KBD TYPES CTL-C
  56. ;    3.    OUTPUTS CARRIER
  57. ;    4.    AWAITS INCOMING CARRIER
  58. ;        GOING TO STEP 1 IF NONE
  59. ;        FOUND IN 15 SECONDS
  60. ;    5.    ASKS NUMBER OF NULLS (0-9)
  61. ;    6.    TYPES THE FILE "WELCOME" FROM
  62. ;        DISK, ALLOWING CTL-C TO SKIP IT
  63. ;    7.    ASKS FOR A PASSWORD, ALLOWING
  64. ;        5 TRIES TO GET IT RIGHT.
  65. ;    8.    WHEN PASSWORD ENTERED, DROPS
  66. ;        INTO CP/M.
  67. ;    9.    CALLER CAN LEAVE BY HANGING UP,
  68. ;        (ANY TIME CARRIER IS LOST, IT
  69. ;        WAITS 15 SECONDS, THEN GOES
  70. ;        BACK TO STEP 1), OR THE CALLER
  71. ;        MAY TYPE THE PROGRAM NAME (BYE)
  72. ;
  73. ;    SYSTEM EQUATES:
  74. FALSE    EQU    0
  75. TRUE    EQU    NOT FALSE
  76. BDOS    EQU    5
  77. CR    EQU    0DH
  78. LF    EQU    0AH
  79. ;
  80. PRINTER    EQU    FALSE    ;WANT TO RETAIN LIST DEVICE?
  81. DUAL$IO    EQU    TRUE    ;WANT CONSOLE & MODEM?
  82. ;
  83. ;    PMMI MODEM PORT ASSIGNMENTS:
  84. ;
  85. ;PMMI MODEM PORT EQUATES (TPORT PREVIOUSLY DONE)
  86. ;
  87. DPORT    EQU    TPORT+1    ;DATA PORT
  88. RPORT    EQU    TPORT+2    ;RATE GEN/MODEM STATUS
  89. CPORT    EQU    TPORT+3    ;MODEM CONTROL
  90. ;
  91. ;MODEM CONTROL COMMAND WORDS
  92. ;
  93. P3CLEAR    EQU    3FH    ;IDLE MODE
  94. ;
  95. ;SET FOLLOWING TO 5FH FOR >300 BAUD
  96. ;
  97. P3TODTR    EQU    7FH    ;Turn On DTR
  98. ;
  99. ;SWITCH HOOK AND MODEM COMMANDS,
  100. ;    OUTPUT TO TPORT (PORT 0)
  101. ;
  102. P0BYE    EQU    0    ;ON HOOK, OR DIALING BREAK
  103. P0ORIG    EQU    1    ;OFF HOOK, ORIG.
  104. P0ANSW    EQU    2    ;ANSWER PHONE
  105. P08BIT    EQU    0CH    ;8 DATA BITS
  106. P0NOPY    EQU    10H    ;NO PARITY
  107. P0EPS    EQU    20H    ;EVEN PARITY SELECT
  108. P0TSB    EQU    40H    ;2 STOP BITS
  109. P0EI    EQU    80H    ;ENABLE INTERRUPTS
  110. P0NORM    EQU    P08BIT+P0NOPY ;I USE 8 BITS, NO PARITY
  111. P0110    EQU    P08BIT+P0NOPY+P0TSB ;SAME W/2 STOP BITS
  112. ;
  113. ;MODEM STATUS, INPUT ON RPORT (PORT 3)
  114. ;
  115. P2DTD    EQU    1    ;DIAL TONE DETECT
  116. P2RDET    EQU    2    ;RING DETECT
  117. P2CTS    EQU    4    ;CTS (CARRIER DETECT)
  118. P2RXBRK    EQU    8    ;RECEIVE BREAK
  119. P2CONN    EQU    10H    ;CONNECTED? (0=YES,
  120. ;             1=MODEM CHIP HUNG UP)
  121. P2TMPUL    EQU    80H    ;TIMER PULSES (40% UP CYCLE)
  122. ;
  123. ;TIMER RATE SELECTION
  124. ;
  125. TRATE    EQU    250    ;VALUE FOR .1 SEC
  126. ;
  127. ;PMMI MODEM STATUS MASKS
  128. ;
  129. P0TBMT    EQU    1    ;XMIT BUFF EMPTY
  130. P0DAV    EQU    2    ;DATA AVAILABLE
  131. P0TEOC    EQU    4    ;TEST END OF CHAR
  132. P0RPE    EQU    8    ;REC'D PARITY ERR
  133. P0ORUN    EQU    10H    ;OVERRUN
  134. P0FERR    EQU    20H    ;FRAMING ERROR
  135. ;
  136. ;BAUD RATE DIVISORS
  137. ;
  138. B110    EQU    142    ;110 BAUD
  139. B300    EQU    52    ;300 BAUD
  140. B450    EQU    35    ;450 BAUD
  141. B600    EQU    26    ;600 BAUD
  142. ;
  143.     ORG    100H
  144. ;
  145. ;MOVE THE MODEM INTERFACE PROGRAM UP TO HI RAM
  146. ;AND JUMP TO IT.
  147. ;
  148. MOVEUP    LXI    B,PEND-START+1    ;NUMBER OF BYTES TO MOVE
  149.     LXI    H,DEST+PEND-START+1 ;END OF MOVED CODE
  150.     LXI    D,SOURCE+PEND-START    ;END OF SOURCE CODE
  151. MVLP    LDAX    D    ;GET BYTE
  152.     DCX    H    ;BUMP POINTERS
  153.     MOV    M,A    ;NEW HOME
  154.     DCX    D
  155.     DCX    B    ;BUMP BYTE COUNT
  156.     MOV    A,B    ;CHECK IF ZERO
  157.     ORA    C
  158.     JNZ    MVLP    ;IF NOT, DO SOME MORE
  159.     PCHL        ;JUMP TO "START"
  160. ;
  161. SOURCE    EQU    $    ;BOUNDARY MEMORY MARKER
  162. ;
  163. OFFSET    EQU    DEST-SOURCE ;RELOC AMOUNT
  164. ;-----------------------------------------------;
  165. ;    THE FOLLOWING CODE GETS MOVED        ;
  166. ;     TO HI RAM LOCATED AT "DEST",        ;
  167. ;        WHERE IT IS EXECUTED.        ;
  168. ;-----------------------------------------------;
  169. ;XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
  170. ;XX   C A U T I O N :  IF MODIFYING ANYTHING     XX
  171. ;XX     IN THIS PROGRAM FROM HERE ON:         XX
  172. ;XX      A-L-L  LABELS MUST BE OF THE FORM:    XX
  173. ;XX    label    EQU    $+OFFSET        XX
  174. ;XX    IN ORDER THAT THE RELOCATION TO HI RAM     XX
  175. ;XX    WORK SUCCESSFULLY.  FORGETTING TO    XX
  176. ;XX    SPECIFY '$+OFFSET' WILL CAUSE THE PRO-    XX
  177. ;XX    GRAM TO JMP INTO WHATEVER IS CURRENTLY    XX
  178. ;XX    IN LOW MEMORY, WITH UNPREDICTABLE    XX
  179. ;XX    RESULTS.  BE CAREFUL....        XX
  180. ;XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
  181. ;
  182. ;    IF CARRIER LOST, HANG UP, AWAIT RING.
  183. ;    OTHERWISE, SAY GOODBYE, AND HANG UP
  184. ;
  185. START    EQU    $+OFFSET
  186. ;
  187.     XRA    A    ;GET 0
  188.     STA    LOSTFLG    ;SHOW NO CARR. LOST
  189. ;CHECK FOR /A OPTION ON COMMAND - REQUEST TO
  190. ;GO IMMEDIATELY INTO ANSWER MODE
  191.     LXI    H,FCB+1    ;TO OPTION
  192.     MOV    A,M
  193.     CPI    '/'    ;OPTION?
  194.     JNZ    NOSLASH
  195. ;GOT AN OPTION - VALIDATE IT
  196.     INX    H    ;TO OPTION BYTE
  197.     MOV    A,M    ;GET IT
  198.     CPI    'A'    ;ANSWER?
  199.     JZ    ANSWER
  200. ;NO OPTION, OR INVALID ONE
  201. NOSLASH    EQU    $+OFFSET
  202.     CALL    CARCK    ;SIGNED OFF W/THIS PROG?
  203.     JC    HANGUP    ;NOBODY THERE
  204.     CALL    ILPRT    ;PRINT THIS MSG:
  205.     DB    CR,LF,'GOOD BYE, CALL AGAIN'
  206.     DB    CR,LF,CR,LF,0
  207.     CALL    UNPATCH    ;UNDO BIOS PATCHES
  208. ;
  209. ;    NOBODY THERE, OR WE ARE DONE, SO HANG UP
  210. ;
  211. HANGUP    EQU    $+OFFSET
  212.     LXI    SP,STACK ;SET UP LOCAL STACK
  213. ;
  214. ;CLEAR DTR CAUSING PHONE TO HANG UP
  215.     MVI    A,P3CLEAR ;CLEAR..
  216.     OUT    CPORT    ;..DTR
  217. ;
  218. ;    AWAIT RINGING
  219. ;
  220. RINGWT    EQU    $+OFFSET
  221. ;CHECK LOCAL KEYBOARD FOR CTL-C EXIT REQUEST.
  222. ;NOTE: MUST DO DIRECT INPUT BECAUSE CBIOS PATCHES
  223. ;ARE NOT DONE UNTIL CALL COMES IN.
  224.     IN    CONDATA    ;CHECK LOCAL KBD
  225.     ANI    7FH    ;STRIP PARITY BIT
  226.     CPI    'C'-40H    ;CONTROL C?
  227.     JZ    0    ;YES, --EXIT-- TO CP/M
  228. ;
  229. RINGW2    EQU    $+OFFSET
  230.     IN    RPORT    ;GET THE STATUS
  231.     ANI    P2RDET    ;RINGING?
  232.     JNZ    RINGWT    ;NO, WAIT
  233. ;NOW WAIT UNTIL RING IS FINISHED
  234. ENDRING    EQU    $+OFFSET
  235.     CALL    DELAY    ;.1 SEC DELAY FOR DEBOUNCE
  236.     IN    RPORT    ;GET STATUS
  237.     ANI    P2RDET    ;STILL RINGING?
  238.     JZ    ENDRING    ;WAIT UNTIL RING FINISHED
  239. ;
  240. ;PHONE IS RINGING
  241. ;
  242. ;      THIS ROUTINE MINIMIZES THE COMPUTER'S INTERFERENCE
  243. ;      WITH NORMAL HOUSEHOLD PHONE USE BY HAVING COMPUTER
  244. ;      FOLK DIAL, LET THE PHONE RING ONCE, HANG UP AND 
  245. ;      THEN DIAL AGAIN.  WHEN THE PHONE RINGS ONLY ONCE IT
  246. ;      ALERTS THE COMPUTER WHICH THEN WAITS FOR AND ANSWERS
  247. ;      ANY RING WHICH OCCURS WITHIN THE NEXT 40 SECONDS.
  248. ;
  249.     MVI    L,45    ;DELAY 4.5 SECONDS FOR NEXT RING
  250. WAITNX    EQU    $+OFFSET
  251.     CALL    DELAY    ;WAIT .1 SECONDS
  252.     DCR    L    ;MORE TO GO?
  253.     JNZ    WAITNX    ;YES?...LOOP
  254.     IN    RPORT    ;GET THE STATUS
  255.     ANI    P2RDET    ;RINGING AGAIN?
  256.     JNZ    EXPECT    ;NO?...ITS FOR ME!
  257. ;CALL NOT FOR COMPUTER - WAIT UNTIL RINGING DONE, THEN RESET
  258. WAITNR    EQU    $+OFFSET
  259.     MVI    L,100    ;WAIT FOR 10 SECS NO RINGING
  260. WAITNRL    EQU    $+OFFSET
  261.     CALL    DELAY     ;DELAY .1 SECONDS
  262.     IN    RPORT    ;GET THE STATUS
  263.     ANI    P2RDET    ;STILL RINGING?
  264.     JZ    WAITNR    ;YES, WAIT 10 MORE SECONDS
  265.     DCR    L    ;NO RING, MAYBE WE'RE DONE
  266.     JNZ    WAITNRL    ;NO, LOOP SOME MORE
  267.     JMP    HANGUP
  268. ;
  269. EXPECT    EQU    $+OFFSET
  270.     LXI    H,400    ;40 SECONDS TO REDIAL
  271. RELOOK    EQU    $+OFFSET
  272.     IN    RPORT
  273.     ANI    P2RDET    ;RINGING AGAIN?
  274.     JZ    ANSWER
  275.     CALL      DELAY
  276.     DCX    H
  277.     MOV    A,H
  278.     ORA    L
  279.     JNZ    RELOOK
  280.     JMP    HANGUP
  281. ;
  282. ;SETUP MODEM
  283. ANSWER    EQU    $+OFFSET
  284.      MVI    A,P3TODTR ;TURN ON
  285.     OUT    CPORT    ;..DTR
  286.     CALL    DELAY    ;GIVE TIME TO TURN ON
  287.     MVI    A,P0110+P0ANSW
  288.     OUT    TPORT    ;ANSWER PHONE
  289.     CALL    DELAY    ;GIVE TIME FOR ANSWER
  290.     IN    CONDATA    ;CLEAR LOCAL KBD PORT
  291.     IN    DPORT    ;CLEAR MODEM PORT
  292.     IN    DPORT    ;MAKE SURE ITS CLEAR
  293.     MVI    A,B110    ;SELECT 110 BAUD
  294.     OUT    RPORT    ;SET BAUD RATE
  295. ;OUTPUT VALUE ALLOWING MODEM TO HANG UP ON
  296. ;LOSS OF CARRIER
  297.     MVI    A,P0110 ;NORMAL MODE FOR 110 BAUD
  298.     OUT    TPORT
  299.     CALL    CARCK    ;LOOK FOR CARRIER
  300.     JC    HANGUP    ;AWAIT ANOTHER CALLER
  301. ;NOW TEST INPUT FOR BAUD RATE
  302.     CALL    PATCH     ;PATCH JMP TABLE
  303.     CALL    TSTBAUD  ;SEE IF BAUD = 110
  304.     JZ    WELCOME     ;YES, EXIT
  305.     MVI    A,P0NORM ;SET FOR 1 STOP BIT, ETC.
  306.     OUT    TPORT
  307.     MVI    A,B300     ;SET DIVISOR
  308.     OUT    RPORT     ;.. TO 300 RATE
  309.     CALL     TSTBAUD  ;SEE IF BAUD = 300
  310.     JZ    WELCOME  ;YES, EXIT
  311.     MVI    A,B450     ;SET DIVISOR
  312.     OUT    RPORT     ;.. TO 450 RATE
  313.     MVI    A,5FH
  314.     OUT    CPORT     ;SET FILTER VALUE FOR > 300
  315.     CALL    TSTBAUD  ;SEE IF BAUD = 450
  316.     JZ    WELCOME     ;YES, EXIT
  317.     MVI    A,B600     ;SET DIVISOR
  318.     OUT    RPORT     ;.. TO 600 RATE
  319.     CALL    TSTBAUD  ;SEE IF BAUD = 600
  320.     JZ    WELCOME     ;YES, EXIT
  321.     CALL    UNPATCH     ;RESTORE ORIG BIOS JMP TBL
  322.     JMP    ANSWER     ;TEST MORE - INVALID BAUD RATE
  323. ;
  324. ;WELCOME TO THE SYSTEM
  325. ;
  326. WELCOME    EQU    $+OFFSET
  327. ;
  328. GETNULL    EQU    $+OFFSET
  329.     CALL    ILPRT    ;PRINT THIS MSG:
  330.     DB    CR,LF
  331.     DB    'HOW MANY NULLS DO YOU NEED? ',0
  332.     CALL    MINPUT    ;GET VALUE
  333.     MOV    C,A
  334.     CALL    MOUTPUT    ;ECHO CHAR
  335.     MOV    A,C
  336.     CPI    '0'
  337.     JC    GETNULL    ;BAD, RETRY
  338.     CPI    '9'+1
  339.     JNC    GETNULL    ;BAD
  340.     SUI    '0'    ;MAKE BINARY
  341.     STA    NULLS    ;SAVE COUNT
  342.     CALL    ILPRT
  343.     DB    CR,LF,0
  344. ;PRINT THE WELCOME FILE
  345.     LXI    H,WELFILN ;SOURCE
  346.     LXI    D,FCB    ;DESTINATION
  347.     MVI    B,13    ;LENGTH
  348.     CALL    MOVE    ;MOVE THE NAME
  349. ;SET DMA ADDR TO 80H
  350.     LXI    D,80H
  351.     MVI    C,STDMA
  352.     CALL    BDOS
  353. ;OPEN THE WELCOME FILE
  354.     LXI    D,FCB
  355.     MVI    C,OPEN
  356.     CALL    BDOS
  357. ;DID IT EXIST?
  358.     INR    A    ;A=> 0 MEANS "NO"
  359.     JZ    PASSINT    ;NO WELCOME FILE
  360. ;GOT A FILE, TYPE IT
  361.     XRA    A    ;GET 0
  362.     STA    FCBRNO    ;ZERO RECORD #
  363.     LXI    H,100H    ;GET INITIAL BUFF POINTER
  364. ;TYPE THE WELCOME FILE
  365. WELTYLP    EQU    $+OFFSET
  366.     CALL    RDBYTE    ;GET A BYTE
  367.     CPI    1AH    ;EOF?
  368.     JZ    PASSINT    ;YES, DONE
  369.     MOV    C,A    ;SETUP FOR TYPE
  370.     CALL    MOUTPUT    ;TYPE THE CHAR
  371.     CALL    MSTAT    ;CHECK FOR..
  372.     ORA    A    ;CHAR TYPED?
  373.     JZ    WELTYLP    ;..NO, LOOP
  374.     CALL    MINPUT    ;..YES, GET CHAR
  375.     CPI    'C'-40H    ;CTL-C?
  376.     JNZ    WELTYLP    ;..NO, LOOP UNTIL EOF
  377. ;
  378. ;GET THE PASSWORD
  379. ;
  380. PASSINT    EQU    $+OFFSET
  381.     MVI    D,5    ;5 TRIES AT PASSWORD
  382. PASSINP    EQU    $+OFFSET
  383.     CALL    ILPRT
  384.     DB    CR,LF,'ENTER PASSWORD: ',0
  385.     LXI    H,PASSWD ;POINT TO PASSWORD
  386.     MVI    E,0    ;NO MISSED LETTERS
  387.     IN    DPORT    ;CLEAR OUT GARBAGE
  388. PWMLP    EQU    $+OFFSET
  389.     CALL    MINPUT    ;GET A CHAR
  390.     CPI    'U'-40H    ;CTL-U?
  391.     JZ    PASSINP    ;YES, RE-GET IT
  392.     CPI    60H    ;LOWER CASE?
  393.     JC    NOTLC    ;NO,
  394.     ANI    5FH    ;MAKE UPPER CASE ALPHA
  395. NOTLC    EQU    $+OFFSET
  396.     CMP    M    ;MATCH PASSWORD?
  397.     JZ    PWMAT    ;..YES
  398.     MVI    E,1    ;..NO, SHOW MISS
  399.     CPI    CR    ;C/R?
  400.     JNZ    PWMLP    ;..NO, WAIT FOR C/R
  401. ;PASSWORD DIDN'T MATCH
  402. PWNMAT    EQU    $+OFFSET
  403.     CALL    ILPRT
  404.     DB    '++INCORRECT++',CR,LF,0
  405.     DCR    D    ;MORE TRIES?
  406.     JNZ    PASSINP    ;YES
  407.     JMP    BADPASS    ;NO, GO HANG UP
  408. ;CHARACTER MATCHED IN PASSWORD
  409. PWMAT    EQU    $+OFFSET
  410.     INX    H    ;TO NEXT CHAR
  411.     CPI    CR    ;END?
  412.     JNZ    PWMLP    ;..NO, LOOP
  413. ;END OF PASSWORD.  ANY MISSED CHARS?
  414.     MOV    A,E    ;GET FLAG
  415.     ORA    A
  416.     JNZ    PWNMAT    ;NOT RIGHT
  417. ;PASSWORD CORRECT
  418.     CALL    ILPRT
  419.     DB    CR,LF,'BOOTING CP/M...',0
  420.     JMP    0    ;GO TO CP/M
  421. ;
  422. ;TSTBAUD ATTEMPTS TO READ A LF OR CR, RETURNS WITH
  423. ;ZERO FLAG IF THE CHARACTER READ IS ONE OF THESE TWO.
  424. ;
  425. TSTBAUD    EQU    $+OFFSET
  426.     CALL    MINPUT    ;GET CHARACTER FROM MODEM
  427.     CPI    CR    ;IF A CARRIAGE RETURN...
  428.     RZ        ;.. RETURN
  429.     CPI    LF    ;IF A LINEFEED...
  430.     RET        ;RET ZERO FLAG, ELSE NOT ZERO
  431. ;
  432. ;    LOSS OF CONNECTION TEST
  433. ;
  434. ;THE PMMI MODEM AUTOMATICALLY HANGS UP THE
  435. ;PHONE AFTER 15 SECONDS OF LOSS OF CARRIER,
  436. ;PROVIDING YOU OUTPUT TO PORT 0 TO ALLOW IT.
  437. ;(WHICH THIS PROGRAM DOES)
  438. ;
  439. ;..SO, THIS ROUTINE FIRST CHECKS IF THE MODEM
  440. ;HAS HUNG UP, AND IF SO, RETURNS WITH CARRY SET.
  441. ;IF NOT, IT CHECKS FOR CARRIER, AND RETURNS
  442. ;IF CARRIER IS ON, OTHERWISE WAITS FOR CARRIER
  443. ;WHILE STILL TESTING FOR DISCONNECT
  444. ;
  445. ;IT TESTS THE PMMI "CTS" (CLEAR TO SEND) BIT
  446. ;WHICH IS 0 WHEN THERE IS CARRIER
  447. ;
  448. CARCK    EQU    $+OFFSET
  449.     IN    RPORT    ;GET STATUS
  450.     ANI    P2CONN    ;CONNECTED?
  451.     STC        ;(IN CASE NOT)
  452.     RNZ        ;HUNG UP.
  453. ;STILL CONNECTED, CHECK FOR CARRIER
  454.     IN    RPORT    ;LOOK AT STATUS
  455.     ANI    P2CTS    ;GET CARRIER DETECT BIT
  456.     RZ        ;RET IF CARRIER ON
  457. ;LOOP UNTIL EITHER CONNECTION LOST, OR
  458. ;CARRIER RETURNS
  459.     JMP    CARCK
  460. ;
  461. ;    .1 SEC DELAY ROUTINE
  462. ;
  463. DELAY    EQU    $+OFFSET
  464.     MVI    A,TRATE    ;.1 SEC COUNT
  465.     OUT    RPORT    ;TO RATE PORT
  466. DLYHI    EQU    $+OFFSET
  467.     IN    RPORT    ;GET PORT W/TIMER BIT
  468.     ANI    P2TMPUL    ;HI?
  469.     JNZ    DLYHI    ;..LOOP UNTIL LOW
  470. ;END OF HI PULSE, WAIT FOR END OF LOW
  471. DLYLO    EQU    $+OFFSET
  472.     IN    RPORT    ;GET TIMER PULSE
  473.     ANI    P2TMPUL    ;LOW?
  474.     JZ    DLYLO    ;YES, LOOP
  475.     RET
  476. ;
  477. ;PATCH IN THE NEW JMP TABLE (SAVING THE OLD)
  478. ;
  479. PATCH    EQU    $+OFFSET
  480.     CALL    TBLADDR    ;CALC HL= CP/M JMP TABLE
  481.     LXI    D,CONSTAT ;POINT TO SAVE LOCATION
  482.     CALL    MOVE    ;MOVE IT
  483. ;NOW MOVE NEW JMP TABLE TO CP/M
  484.     CALL    TBLADDR    ;CALC HL=CP/M'S JMP TABLE
  485.     XCHG        ;MOVE TO DE
  486.     LXI    H,NEWJTBL ;POINT TO NEW
  487.     CALL    MOVE    ;MOVE IT
  488.     RET
  489. ;
  490. UNPATCH    EQU    $+OFFSET
  491.     CALL    TBLADDR    ;HL=CP/M'S JMP TABLE
  492.     XCHG        ;MOVE TO DE
  493.     LXI    H,CONSTAT ;GET SAVED TABLE
  494.     CALL    MOVE    ;MOVE ORIG BACK
  495.     RET            
  496. ;
  497. ;CALCULATE HL=CP/M'S JUMP TABLE, B=LENGTH
  498. ;
  499. TBLADDR    EQU    $+OFFSET
  500.     LHLD    1    ;GET BIOS POINTER
  501.     INX    H    ;..SKIP
  502.     INX    H    ;..TO
  503.     INX    H    ;..CONSOLE STAT
  504. ;
  505.     IF    NOT PRINTER
  506.     MVI    B,12    ;BYTES TO MOVE
  507.     ENDIF
  508. ;
  509.     IF    PRINTER    ;RETAIN LIST DEVICE?
  510.     MVI    B,9    ;DON'T MOVE LISTER JUMP
  511.     ENDIF
  512. ;
  513.     RET
  514. ;
  515. ;MOVE (HL) TO (DE), LENGTH IN (B)
  516. ;
  517. MOVE    EQU    $+OFFSET
  518.     MOV    A,M    ;GET A BYTE
  519.     STAX    D    ;PUT AT NEW HOME
  520.     INX    D    ;BUMP POINTERS
  521.     INX    H
  522.     DCR    B    ;DEC BYTE COUNT
  523.     JNZ    MOVE    ;IF MORE, DO IT
  524.     RET        ;IF NOT,RETURN
  525. ;
  526. ;COMMON ROUTINE TO CHECK FOR CARRIER LOST,
  527. ;CALLED FROM CONSOLE STATUS, AND CONSOLE OUT
  528. ;
  529. CHECK    EQU    $+OFFSET
  530.     CALL    CARCK    ;SEE IF CARRIER STILL ON
  531.     RNC        ;ALL OK
  532. ;CARRIER IS LOST.  TYPE MESSAGE SO LOCAL CONSOLE
  533. ;    SHOWS THE REASON
  534. BADPASS    EQU    $+OFFSET ;COME HERE ON BAD PASSWORD
  535.     MVI    A,1    ;SHOW CARRIER LOST SO
  536.     STA    LOSTFLG    ;..WE WON'T CK AGAIN
  537.     LXI    SP,STACK ;ENSURE VALID STACK
  538.     CALL    ILPRT
  539.     DB    CR,LF
  540.     DB    '++CARRIER LOST++'
  541.     DB    CR,LF,'   ',0
  542.     CALL    UNPATCH    ;RESTORE ORIG BIOS JMP TBL
  543.     XRA    A    ;CLEAR OUT CARRIER..
  544.     STA    LOSTFLG    ;..LOST FLAG
  545.     JMP    HANGUP
  546. ;
  547. ;READBYTE ROUTINE - USED TO READ THE
  548. ;    WELCOME FILE
  549. ;
  550. RDBYTE    EQU    $+OFFSET
  551.     MOV    A,H    ;TIME TO READ?
  552.     ORA    A    ;..IF AT 100H
  553.     JZ    NORD    ;NO READ REQ'D
  554. ;HAVE TO READ A SECTOR
  555.     LXI    D,FCB
  556.     MVI    C,READ
  557.     CALL    BDOS
  558.     ORA    A    ;OK?
  559.     MVI    A,1AH    ;FAKE UP EOF
  560.     RNZ        ;RET EOF IF BAD
  561.     LXI    H,80H
  562. NORD    EQU    $+OFFSET
  563.     MOV    A,M    ;GET CHAR
  564.     INX    H    ;TO NEXT
  565.     RET
  566. ;
  567. ;KEYBOARD/MODEM STATUS TEST ROUTINE
  568. ;
  569. MSTAT    EQU    $+OFFSET
  570. ;
  571.     IF    DUAL$IO    ;WANT LOCAL CONSOLE?
  572.     CALL    CONSTAT    ;GET LOCAL STATUS
  573.     ORA    A
  574.     RNZ        ;RET IF LOCAL CHAR
  575.     ENDIF
  576. ;
  577.     IN    TPORT    ;GET STATUS
  578.     ANI    P0DAV    ;DATA AVAILABLE?
  579.     RZ        ;RETURN IF NOT READY
  580.     MVI    A,0FFH    ;SHOW READY
  581.     RET
  582. ;
  583. ;MODEM INPUT FUNCTION, CHECKS LOCAL CONSOLE FIRST
  584. ;
  585. MINPUT    EQU    $+OFFSET
  586.     LDA    LOSTFLG    ;KNOWN LOSS..
  587.     ORA    A    ;..OF CARRIER?
  588.     CZ    CHECK    ;CARRIER STILL ON?
  589. ;
  590.     CALL    MSTAT    ;ANYTHING?
  591.     ORA    A
  592.     JZ    MINPUT    ;LOOP TILL CHAR RCD
  593. ;GOT CHAR - SEE WHICH PORT
  594. ;
  595.     IF    DUAL$IO    ;BOTH LOCAL AND REMOTE?
  596.     CALL    CONSTAT    ;CHECK LOCAL CONSOLE
  597.     ORA    A    ;CHAR?
  598.     JNZ    CONIN    ;..YES, READ IT, RET.
  599.     ENDIF
  600. ;
  601. ;LOCAL CONSOLE WASN'T READY, SO READ MODEM
  602.     IN    DPORT    ;GET DATA BYTE
  603.     ANI    7FH    ;DELETE PARITY
  604.     JZ    MINPUT    ;IGNORE NULLS
  605.     RET
  606. ;
  607. ;MODEM OUTPUT ROUTINE.  OUTPUTS TO MODEM,
  608. ;THEN TO LOCAL CONSOLE
  609. ;
  610. MOUTPUT    EQU    $+OFFSET
  611. ;IF WE ALREADY KNOW CARRIER IS LOST,
  612. ;DON'T CHECK FOR IT AGAIN
  613.     LDA    LOSTFLG    ;KNOWN LOSS OF CARRIER?
  614.     ORA    A
  615.     CZ    CHECK    ;CARRIER STILL ON?
  616.     IN    TPORT    ;READ MODEM STATUS
  617.     ANI    P0TBMT    ;XMIT BUFF EMPTY?
  618.     JZ    MOUTPUT    ;LOOP IF NOT READY
  619.     MOV    A,C    ;GET CHAR
  620.     OUT    DPORT    ;OUTPUT TO MODEM
  621. ;
  622.     IF    DUAL$IO    ;TO LOCAL ALSO?
  623.     CALL    CONOUT    ;SEND TO REGULAR BIOS
  624.     ENDIF
  625. ;
  626. ;CHECK FOR NULLS
  627. ;
  628.     CPI    LF    ;TIME FOR NULLS?
  629.     RNZ        ;NO, RETURN
  630. ;SEND NULLS IF REQUIRED
  631.     LDA    NULLS    ;GET COUNT
  632.     ORA    A    ;ANY?
  633.     RZ        ;..NO
  634.     PUSH    B
  635.     MOV    B,A    ;SAVE COUNT
  636.     MVI    C,0    ;0 IS A NULL
  637. NULLP    EQU    $+OFFSET
  638.     CALL    MOUTPUT    ;TYPE A NULL
  639.     DCR    B    ;MORE?
  640.     JNZ    NULLP    ;..YES, LOOP
  641.     POP    B
  642.     RET
  643. ;
  644. ;    INLINE PRINT ROUTINE
  645. ;    CALL ILPRT
  646. ;    DB    'MSG',0
  647. ;
  648. ILPRT    EQU    $+OFFSET
  649.     XTHL        ;SAVE HL, GET MSG
  650.     PUSH    B    ;SAVE
  651. ILPLP    EQU    $+OFFSET
  652.     MOV    C,M    ;GET CHAR
  653.     CALL    MOUTPUT    ;OUTPUT IT
  654.     INX    H    ;POINT TO NEXT
  655.     MOV    A,M    ;TEST
  656.     ORA    A    ;..FOR END
  657.     JNZ    ILPLP
  658.     POP    B    ;RESTORE
  659.     XTHL        ;RESTORE HL, RET ADDR
  660.     RET        ;RET PAST MSG
  661. ;
  662. ;ACCESS PASSWORD (ENDS IN C/R)
  663. ;
  664. PASSWD    EQU    $+OFFSET
  665.     DB    'HOUGH' ;THE PASSWORD ITSELF
  666.     DB    CR    ;END OF PASSWORD
  667. ;ALLOW ROOM FOR BIGGER PASSWORD TO BE
  668. ;    PATCHED IN
  669.     DB    0,0,0,0,0,0,0,0,0,0,0,0,0
  670. ;
  671. ;    THIS IS THE JMP TABLE WHICH IS COPIED
  672. ;    ON TOP OF THE ONE POINTED TO BY
  673. ;    LOCATION 1 IN CP/M
  674. ;
  675. NEWJTBL    EQU    $+OFFSET
  676.     JMP    MSTAT    ;MODEM STATUS TEST
  677.     JMP    MINPUT    ;MODEM INPUT ROUTINE
  678.     JMP    MOUTPUT    ;MODEM OUTPUT ROUTINE
  679.     RET        ;DUMMY LIST DEVICE
  680.     NOP
  681.     NOP
  682. ;
  683. WELFILN    EQU    $+OFFSET
  684.     DB    0,'WELCOME    ',0
  685. ;WELCOME FILE NAME ^^^^^^^^^^^
  686. ;
  687. NULLS    EQU    $+OFFSET
  688.     DB    5
  689. ;
  690. PEND    EQU    $+OFFSET ;END OF RELOCATED CODE
  691. ;
  692. ;KEEP TRACK OF LOST CARRIER WHEN TYPING
  693. ;"++CARRIER LOST++" SO WE DON'T LOOP
  694. ;
  695. LOSTFLG    EQU    $+OFFSET
  696.     DS    1
  697. ;
  698. ;SAVE THE CP/M JUMP TABLE HERE
  699. ;
  700. CONSTAT    EQU    $+OFFSET
  701.     DS    3
  702. CONIN    EQU    $+OFFSET
  703.     DS    3
  704. CONOUT    EQU    $+OFFSET
  705.     DS    3
  706. LISTOUT    EQU    $+OFFSET
  707.     DS    3
  708. ;
  709.     DS    40
  710. STACK    EQU    $+OFFSET    ;LOCAL STACK
  711. ;
  712. WRCON    EQU    2
  713. OPEN    EQU    15
  714. READ    EQU    20
  715. STDMA    EQU    26
  716. FCB    EQU    5CH 
  717. FCBRNO    EQU    FCB+32
  718. ;
  719.     END
  720.  
  721.