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 / CPMUG025.ARK / DCHAYES.ASM < prev    next >
Assembly Source File  |  1984-04-29  |  9KB  |  378 lines

  1.  
  2.   ;MODEM CONTROL PROGRAM BY DALE HEATHERINGTON
  3. ;    4/4/77
  4. ;    ENTERED BY R.J.S.    01/01/78
  5. ;
  6. ;    MODIFIED BY DAVE JAFFE
  7. ;    FOR:    BDOS CALLS
  8. ;        RETURN TO CP/M ON CONTROL C
  9. ;
  10. ;
  11. ;MODEM CONTROL BYTES
  12. ORIG300    EQU    5    ;300 BPS ORIGINATE
  13. ANSW300    EQU    1    ;300 BPS ANSWER
  14. ORIG110    EQU    4    ;100 BPS ORIGINATE
  15. ANSW110    EQU    0    ;110 BPS ANSWER
  16. OFFHOOK    EQU    80H    ;OFF HOOK MASK
  17. ONHOOK    EQU    7FH    ;ON HOOK MASK
  18. TXE    EQU    2    ;XMTR ON MASK
  19. TXOFF    EQU    0FDH    ;XMTR OFF MASK
  20. WORD    EQU    1FH    ;8 BITS, NO PARITY, 2 STOP BITS
  21. ;
  22. ;PORT ASSIGNMENTS
  23. ;
  24. DATA    EQU    80H    ;MODEM DATA I/O PORT
  25. STAT     EQU    DATA+1    ;STATUS PORT
  26. MODE    EQU    DATA+2    ;MODE CONTROL PORT
  27. ;
  28. ;    SYSTEM EQUATES
  29. BDOS    EQU    5
  30. ;
  31.     ORG    100H
  32. ;SENSE SWITCH A-15 IS USED FOR SPEED SELECT.UP IS 300 BAUD
  33. ;DOWN IS 110 BAUD.
  34. ;
  35. ;SENSE SWITCH A-8 UP WILL SUPRESS ECHO ON DATA TRANSMISSION
  36. ;
  37. START    JMP    SIGNON
  38. OUTPUT    JMP    USEROT    ;JUMP TO USER OUT ROUTINE
  39. INPUT    JMP    USERIN    ;JUMP TO USER IN ROUTINE
  40. INSTAT    JMP    USERST    ;JUMP TO USER CONSOLE STATUS
  41.             ;CHECK ROUTINE. RETURNS 'FF'
  42.             ;IF A BYTE IS WAITING OR
  43.             ; '00' IF NOT.
  44. ;
  45. ;THIS ROUTINE LOOPS UNTIL THE LINE RINGS OR A
  46. ;CONTROL B IS TYPED ON THE CONSOLE.
  47. ;
  48. SIGNON:    LXI     SP,STKTOP
  49.     LXI    H,SIGN    ;POINT TO SIGNON MESSAGE
  50.     CALL    PRINTM
  51.     MVI    A,0
  52.     OUT    STAT    ;CLEAR MODEM REGISTER
  53. RINGCK:    
  54.     CALL    INSTAT    ;GET CONSOLE STATUS
  55.     CNZ    INPUT    ;GET BYTE IF READY
  56.     CPI    2    ;CHECK FOR "STX" OR CONTROL B
  57.     JZ    MAKCALL    ;GOTO ORIG ROUTINE
  58.     CPI    3    ;CONTROL C?
  59.     JZ    0    ;BACK TO CP/M
  60.     IN    STAT    ;GET MODEM STATUS
  61.     ANI    80H    ;ISOLATE RING DET. BIT
  62.     JNZ    RINGCK    ;LOOP UNTIL IT GOES LOW
  63. ANCALL:
  64.     CALL    AN110    ;SET TO ANSWER MODE
  65.     CALL    OFFHK    ;GO OFFHOOK
  66.     LDA    MDBYTE    ;GET MODE
  67.     ORI    TXE
  68.     STA    MDBYTE
  69.     OUT     MODE    ;TURN ON XMITTER
  70.     JMP    CARR-3    ;JMP TO DATA HANDLING ROUTINE
  71. MAKCALL:
  72.     LXI    SP,STKTOP
  73.     CALL    OR110    ;SET TO ORIGINATE MODE
  74.     LXI    H,MNUM    ;POINT TO STRING "NUMBER"
  75.     CALL    PRINTM    ;PRINT THE STRING
  76.     CALL    DIAL    ;GET AND DIAL A PHONE NUMBER
  77.     LXI    D,400    ;SETUP FOR A 20 SECOND DELAY
  78. CARR:    CALL    SPEED    ;SET SPEED
  79.     IN    STAT    ;LOOK FOR A CARRIER
  80.     ANI    40H    ;ISOLATE CARRIER BIT
  81.     JNZ    CONNECT    ;JUMP IF TRUE
  82.     CALL    DELAY    ;WAIT 50 MS
  83.     DCX    D    ;COUNT IT
  84.     MOV    A,D    ;TEST FOR D&E =0
  85.     ORA    E
  86.     JNZ    CARR    ;LOOP IF NOT TIMED OUT
  87.     LXI    H,NOASW    ;POINT TO STRING "NO ANSWER"
  88.     CALL    PRINTM    ;PRINT THE STRING
  89.     JMP    EOT    ;DISCONNECT
  90. CONNECT:
  91.     LDA    MDBYTE    ;GET MODE
  92.     ORI    TXE    ;TURN ON XMTTR
  93.     OUT    MODE
  94.     STA    MDBYTE
  95.     ANI    4    ;ISOLATE ORIG/ANSW BIT
  96.     CZ    SAB    ;SEND ANSWER/BACK
  97. TTY:    IN    STAT    ;GET MODEM STATUS
  98.     ANI    40H    ;ISOLATE CARRIER DETECT BIT
  99.     JNZ    OK    ;
  100.     LXI    H,LOSTC    ;POINT TO STRING "LOST CARRIER"
  101.     CALL    PRINTM    ;PRINT THE STRING
  102.     JMP    EOT
  103. OK:    CALL     SPEED    ;SET SPEED
  104.     IN    STAT    ;GET MODEM STATUS
  105.     ANI    1    ;CHECK FOR A DATA BYTE
  106.     CNZ    GETC    ;GET THE BYTE
  107.     CALL    INSTAT    ;CHECK THE CONSOL STATUS
  108.     ANA    A    ;SET THE FLAGS
  109.     JZ    TTY    ;LOOP IF STATUS NOT TRUE
  110.     CALL    INPUT    ;GET THE CONSOL CHAR
  111.     MOV    C,A    ;SAVE IT
  112. TTY1:    CALL    TRANS    ;SEND AND ECHO THE CHAR
  113.     JMP    TTY    ;LOOP AGAIN
  114. ;
  115. ;SPEED SELECT ROUTINE
  116. ;USES SENSE SWITCH A-15; UP IS 300 BAUD,DOWN IS 110
  117. ;
  118. SPEED:    PUSH    B
  119.     LDA    MDBYTE    ;GET PRESENT MODE
  120.     MOV    B,A    
  121.     IN    255    ;GET SENSE SWITCH
  122.     ANI    80H    
  123.     MOV    A,B
  124.     JZ    S110
  125.     ORI    1    ;SET TO 300 BPS
  126.     DB    01H    ;*****TRICK*** LXI B (NOP NEXT 2 BYTES)
  127. S110:    ANI    0FEH    ;SET TO 110 BPS
  128.     STA    MDBYTE    
  129.     OUT    MODE    ;SET MODEM
  130.     POP    B
  131.     RET
  132. ;
  133. ;PRINTS CHAR ON CONSOLE.CHECKS FOR EOT CHAR
  134. ;AND TERMINATES CALL IF TRUE.
  135. ;
  136. PRINT:    MOV    A,C    ;GET A BYTE
  137.     CPI    4    ;CHECK FOR EOT
  138.     JNZ    OUTPUT    ;OUTPUT THE BYTE
  139. EOT1:    LXI    H,MEOT    ;POINT TO STRING "EOT"
  140.     CALL    PRINTM    ;PRINT IT
  141.     MVI    B,10    ;SET FOR .5 SEC DELAY
  142. DLY3:    CALL    DELAY
  143.     DCR    B
  144.     JNZ    DLY3    ;LOOP FOR .5 SEC
  145. EOT:    LDA    MDBYTE    ;GET CURRENT MODE
  146.     ANI    TXOFF    ;TURN OFF XMTTR
  147.     ANI    ONHOOK    ;DISCONNECT LINE
  148.     OUT MODE
  149.     STA    MDBYTE
  150.     LXI    H,TERM    ;POINT TO STRING "TERMINATED"
  151.     CALL    PRINTM    ;PRINT IT
  152.     JMP    SIGNON    ;BACK TO THE START
  153. ;
  154. ;GETS A BYT FROM THE MODEM
  155. ;
  156. GETC:    IN    DATA    ;GET A MODEM BYTE
  157.     ANI    7FH    ;KILL PARITY
  158.     CPI    4    ;CHECK FOR EOT
  159.     JZ    EOT1    ;
  160.     CPI    5    ;CHECK FOR ENQ
  161.     CZ    SAB    ;SEND ANSWERBACK IF TRUE
  162.     MOV    C,A
  163.     CALL    OUTPUT    ;PRINT THE CHAR
  164.     RET
  165. ;
  166. ;THIS ROUTINE PRINTS AN ASCII STRING IN MEMORY ON THE CONSOL
  167. ;
  168. PRINTM:    MVI    A,255
  169.     MOV    C,M    ;GET A BYTE
  170.     CMP    C    ;TEST FOR FF (END OF STRING)
  171.     RZ        ;FINISHED
  172.     CALL    OUTPUT    ;PRINT IT
  173.     INX    H    ;POINT TO NEXT BYTE
  174.     JMP    PRINTM    ;LOOP AGAIN
  175. ;
  176. ;SETS THE MODEM TO ORIGINATE OR ANSWER MODE
  177. ;
  178. OR110:    MVI    A,ORIG110    ;GET MODE BYTE
  179.     JMP    AN110+2
  180. AN110:    MVI    A,ANSW110    ;GET ANSWER MODE BYTE
  181.     STA    MDBYTE    ;SAVE IT
  182.     OUT    MODE    ;SETUP MODEM
  183.     MVI    A,WORD    ;GET WORD FORMAT
  184.     OUT    STAT    ;SETUP MODEM
  185.     RET
  186. ;
  187. ;THIS ROUTINE GETS DIGITS FROM THE CONLOL
  188. ;AND STORES THEM IN MEMORY. IT HTEN TAKES THE LINE
  189. ;OFF HOOK AND DIALS THE DIGITS STORED IN MEMORY.
  190. ;IF A '*' APPEARS IN THE DIGIT STRING THE PROGRAM
  191. ;PAUSES FOR 2 SECONDS. THIS IS TO WAIT FOR SECOND DIAL
  192. ;TONE IN SOME EXCHANGES.
  193. ;
  194. DIAL:    CALL    GETNUM    ;GET PHONE NUMBER FROM KBD
  195.     CALL    OFFHK    ;GO OFFHOOK
  196.     LXI    H,MDIAL    ;POINT TO STRING "DIALING--"
  197.     CALL    PRINTM    ;PRINT IT
  198.     MVI    B,40    ;SETUP FOR 2 SECOND DELAY
  199. WAIT:    CALL    DELAY    ;WAIT FOR DIAL TONE
  200.     DCR    B
  201.     JNZ    WAIT
  202. DIAL2    LXI    H,NMBR    ;POINT TO PHONE NUMBER
  203.     MOV    A,M    ;GET A DIGIT
  204.     CPI    0DH    ;CHECK FOR THE END
  205.     RZ
  206.     MOV    C,A    ;
  207.     CALL    OUTPUT    ;PRINT THE DIGIT TO BE DIALED
  208.     CPI    '*'    ;DELAY?
  209.     JNZ    NODLY
  210.     MVI    B,40    ;SETUP FOR 2 SECOND DELAY
  211. WAIT2:    CALL    DELAY
  212.     DCR    B
  213.     JNZ    WAIT2
  214. NODLY:    INX    H    ;POINT TO NEXT DIGIT
  215.     SUI    30H    ;REMOVE ASCII BIAS
  216.     JNZ    NOTZERO    ;CHECK FOR A DIGIT "0"
  217.     MVI    A,10    ;MAKE A 0 A 10
  218. NOTZERO:
  219.     JC    DIAL2+3    ;IF <0 GET NEXT DIGIT
  220.     CPI    11    ;CHECK FOR MORE THAN 10
  221.     JNC    DIAL2+3    ;IF MORE GET NEXT DIGIT
  222.     CALL    PULSE    ;MAKE DIAL PULSES
  223.     JMP    DIAL2+3
  224. ;
  225. ;THIS SUBROUTINE PULSES THE LINE,
  226. ;THE VALUE IN ACC EQUALS THE NUMBER OF
  227. ;PULSES OUTPUT.
  228. ;
  229. PULSE:    PUSH    PSW
  230.     CALL    ONHK    ;GO ONHOOK
  231.     CALL    DELAY    ;WAIT 50 MS
  232.     CALL    OFFHK    ;GO OFF HOOK
  233.     CALL    DELAY    ;WAIT 50 MS
  234.     POP    PSW    ;GET DIGIT
  235.     DCR    A    ;SUBTRACT 1 FROM DIGIT
  236.     JNZ    PULSE    ;ANOTHER PULSE IF NOT ZERO
  237.     MVI    A,10    ;SET UP FOR 500 MS DELAY
  238. SPACE:    CALL    DELAY    ;WAIT 500 MS
  239.     DCR    A    ;
  240.     JNZ    SPACE
  241.     RET        ;DIGIT COMPLETE
  242. ;
  243. ;    THIS ROUTINE WAITS 50 MS BEFORE RETURNING
  244. ;
  245. DELAY:    PUSH    H
  246.     PUSH    D
  247.     PUSH    PSW
  248.     CALL    INSTAT
  249.     ORA    A    ;SET FLAGS
  250.     CNZ    INPUT    ;GET A CONSOL BYTE
  251.     CPI    4    ;CONTROL D?
  252.     JZ    EOT1    ;ABORT
  253.     POP    PSW
  254.     LXI    D,50
  255.     LXI    H,0
  256. DLYLP:    XTHL        ;WAIST TIME FOR DELAY
  257.     XTHL
  258.     DAD    D    ;ADD D&E TO H&L
  259.     JNC    DLYLP    ;LOOP UNTIL CARRY
  260.     POP    D
  261.     POP    H
  262.     RET
  263. ;
  264. ;GETS BYTES FROM THE CONSOLE AND STORES THEM IN RAM.
  265. ;
  266. GETNUM:    LXI    H,NMBR    ;POINT TO BUFFER
  267.     CALL    INSTAT    ;GET KBD STATUS
  268.     ANA    A    ;SET FLAGS
  269.     JZ    GETNUM+3;LOOP UNTIL KBD IS READY
  270.     CALL    INPUT    ;GET A DIGIT
  271.     CPI    4    ;CONTROL D
  272.     JZ    SIGNON    ;ABORT
  273.     CPI    2    ;IS IT A CONTROL B?
  274.     JZ    GETNUM+3;IGNORE GARBAGE CHAR
  275.     CPI    3    ;IS IT A CONTROL C?
  276.     JZ    0    ;RETURN TO CP/M
  277.     MOV    M,A    ;STORE IT
  278.     MOV    C,A    ;
  279.     PUSH    PSW    ;SAVE ACC FROM VDM ROUTINE
  280.     CALL    OUTPUT    ;ECHO THE DIGIT
  281.     POP    PSW    ;SAFE AND SOUND
  282.     CPI    0DH    ;CHECK FOR ASCII "CR"
  283.     RZ        ;DONE IF TRUE
  284.     INX    H    ;POINT TO NEXT BUFFER LOC.
  285.     CPI    08H    ;BACKSPACE?
  286.     JNZ    GETNUM+3;IF NOT GET NEXT DIGIT
  287.     DCX    H
  288.     DCX    H    ;BACKUP POINTER
  289.     JMP    GETNUM+3    ;GET NEXT DIGIT
  290. ;
  291. ;THESE ROUTINES SET THE MODEM FOR "ONHOOK" OR "OFFHOOK"
  292. ;
  293. OFFHK:    LDA    MDBYTE    ;GET THE CURRENT MODE BYTE
  294.     ORI    OFFHOOK    ;SET THE OFF HOOK BIT
  295.     JMP    SETT    
  296. ONHK:    LDA    MDBYTE    ;GET CURRENT MODE BYTE
  297.     ANI    ONHOOK    ;RESET THE OFF HOOK BIT
  298. SETT:    STA    MDBYTE    ;SAVE NEW MODE BYTE
  299.     OUT    MODE    ;SET THE MODEM
  300.     RET
  301. ;
  302. ;THIS SUBROUTINE SENDS THE ANSWER BACK MESSAGE
  303.                 ;
  304. SAB:    PUSH    H
  305.     PUSH    B
  306.     LXI    H,ANSBK    ;POINT TO ANSWER BACK MESSAGE
  307. GAB:    MOV    A,M    ;GET A BYTE
  308.     CPI    255    ;END?
  309.     JZ    EXIT
  310.     MOV    C,A
  311.     CALL    TRANS    ;SEND THE BYTE
  312.     INX    H
  313.     JMP    GAB    ;LOOP AGAIN
  314. EXIT:    POP    B
  315.     POP    H
  316.     RET
  317. ;
  318. ;THIS SUBROUTINE SENDS A BYTE TO THE MODEM
  319. ;AND TO THE CONSOL DISPLAY DEVICE.
  320. ;
  321. TRANS:    IN    STAT    ;SEE IF READY FOR BYTE
  322.     ANI    2
  323.     JZ    TRANS    ;LOOP UNTIL READY
  324.     MOV    A,C    ;GET THE BYTE
  325.     OUT    DATA    ;SEND IT
  326.     IN    0FFH    ;INPUT FROM SENSE
  327.     ANI    01    ;CHECK ECHO BIT
  328.     RZ        ;DO NOT ECHO
  329.     MOV    A,C    ;GET BACK CHAR
  330.     CALL    PRINT    ;ECHO CHAR
  331.     RET
  332. MNUM:    DB    0DH,0AH
  333.     DB    'NUMBER ?'
  334.     DB    0DH,0AH,255
  335. NOASW:    DB     0DH,0AH
  336.     DB    'NO ANSWER---'
  337.     DB    255
  338. TERM:    DB    0DH,0AH
  339.     DB    'CALL TERMINATED'
  340.     DB    0DH,0AH,255
  341. MDIAL:    DB    0DH,0AH
  342.     DB    'DIALING-'
  343.     DB    255
  344. LOSTC:    DB    0DH,0AH
  345.     DB    'LOST CARRIER'
  346.     DB    255
  347. MEOT:    DB    0DH,0AH
  348.     DB    'EOT'
  349.     DB    255
  350. SIGN:    DB    0DH,0AH
  351.     DB     '80/103 CONTROL PROGRAM'
  352.     DB    0DH,0AH
  353.     DB    0DH,0AH
  354.     DB    'WAITING FOR RING OR CONTROL SHIFT B'
  355.     DB    0DH,0AH
  356.     DB    255
  357. ANSBK:    DB    0,0,0DH,0,0,0AH
  358.     DB    'THE CACHE COMPUTER NETWORK'
  359.     DB    0DH,0,0,0,0AH,255
  360. ;
  361. ;USER ROUTINES
  362. ;
  363. USEROT:    CALL    5A0CH
  364.     RET
  365. USERIN:    IN    1
  366.     ANI    7FH
  367.     RET
  368. USERST:    IN    0
  369.     ANI    80H
  370.     MVI    A,0
  371.     RNZ
  372.     DCR    A
  373.     RET
  374. MDBYTE    DS    1        ;MODE BYTE STORAGE LOC.
  375. NMBR:    DS    20        ;20 SPACES FOR PHONE #
  376. STKTOP    EQU    $+16H        ;STACK HERE
  377.     END    START
  378.