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 / CPM / NUBYE / NUBY-INS.LBR / NUOV-1.IQS / nuov-1.ins
Text File  |  1986-04-26  |  7KB  |  273 lines

  1. ; NUOV-1.INS - Osborne Vixen insert for NUBYE - 04/21/86
  2. ;
  3. ; This is for the Osborne Vixen (8251A I/O with extended BIOS jump for
  4. ; setting baudrate).  The normal serial input interrupt driver in BIOS
  5. ; is disabled while NUBYE is used.
  6. ;
  7. ; Note:  This is an insert, not an overlay.
  8. ;
  9. ; ========
  10. ;
  11. ; 04/21/86  Modified for NUBYE
  12. ; 06/15/85  Written for use with BYE5        - Roy Robinson
  13. ;                          FOG RCPM #4
  14. ;                          (415) 591-6259
  15. ; ========
  16. ;
  17. ; --------
  18. ; PATCH #1
  19. ; --------
  20. ;
  21. ; Listed below is a patch for disabling the serial input interrupt
  22. ; driver in the Vixen BIS.  This patch goes AFTER the label START1:
  23. ; and immediately AFTER the line of code, CALL MDCARCK
  24. ;
  25. ; ---->  beginning of patch:
  26. ;
  27. ;    JNZ    BYPASS
  28. ;
  29. ;INITMOD:
  30. ;    PUSH    PSW
  31. ;    MVI    C,7    ; Use BDOS to obtain current IOBYTE
  32. ;    CALL    BDOS
  33. ;    STA    OLDIOB    ; Save old IOBYTE
  34. ;    ANI    3FH
  35. ;    ORI    80H    ; Make CEN: PORT new LST: DEVICE
  36. ;    MOV    E,A
  37. ;    MVI    C,8
  38. ;    CALL    BDOS    ; Use BDOS to place new IOBYTE in first page of memory
  39. ;    DI
  40. ;    LHLD    INTVEC    ; Get serial port interrupt processor address
  41. ;    SHLD    OLDVEC    ; Save serial port interrupt processor address
  42. ;    DCX    H
  43. ;    DCX    H
  44. ;    DCX    H    ; HL has next interrupt processor address
  45. ;    SHLD    INTVEC    ; This is now first interrupt processor rather
  46. ;            ;   than second
  47. ;INITSIO:
  48. ;    LHLD    BIOS    ; Find start ofF BIOS
  49. ;    MVI    L,3CH    ; Displacement of baudrate byte from start of BIOS
  50. ;    MOV    A,M
  51. ;    STA    OLDBAUD ; Save original baudrate byte
  52. ;    MVI    L,3BH    ; Displacement of 8251 mode byte from start of BIOS
  53. ;    MOV    A,M    ; Old mode byte set by ROM is 2SB, NP, 8DB, X16 clock
  54. ;    STA    OLDMODE ; Save original 8251 mode byte
  55. ;    MOV    B,L
  56. ;    MVI    A,6EH    ; 1 SB, NP, 8 DB, X16 clock modem byte
  57. ;    CALL    IORESET ; Use extended BIOS jump to reset 8251
  58. ;    MVI    A,37H    ; 8251 command byte RTS/DTR active, TXD and RXD active
  59. ;    OUT    31H    ; Send it to 8251 control port
  60. ;    MVI    A,3    ; Select 8155 port C
  61. ;    OUT    21H
  62. ;    IN    28H    ; Get miscellaneous byte
  63. ;    STA    OLDMSC    ; Save misdellaneous info byte
  64. ;    ORI    0FH    ; Disable ring detect interrupt, RXD interrupt, XMIT
  65. ;            ;   interrupt, emab;e omterma; clock
  66. ;    MOV    E,A
  67. ;    MVI    A,3
  68. ;    OUT    21H    ; Select 8155 port C
  69. ;    MOV    A,E
  70. ;    OUT    28H    ; Send new control byte to 8155 port C
  71. ;    EI
  72. ;    POP    PSW
  73. ;    ORA    A
  74. ;
  75. ;BYPASS:
  76. ;
  77. ;--> Original code starts again with the following instruction:
  78. ;
  79. ;    JNZ    GOODBY
  80. ;
  81. ; --------
  82. ; PATCH #2
  83. ; --------
  84. ;
  85. ; Listed below is a patch for re-enabling the serial input interrupt
  86. ; driver in the Vixen.    Place this patch before the instruction line
  87. ; "JMP    0" in the EXCPM routine.
  88. ;
  89. ;--> Patch starts here
  90. ;
  91. ;RSTINT:LDA    OLDIOB    ; Get original IOBYTE
  92. ;    MVI    C,8
  93. ;    MOV    E,A    ; Use BDOS to restore original IOBYTE
  94. ;    CALL    BDOS
  95. ;    DI
  96. ;    XRA    A
  97. ;    OUT    STPORT    ; Disable 8251 DTR/RTS lines
  98. ;    LHLD    OLDVEC    ; Get original interrupt service address
  99. ;    SHLD    INTVEC    ; Restore original interrupt service address
  100. ;    MVI    A,3    ; Select 8155 port C
  101. ;    OUT    21H
  102. ;    IN    28H    ; Get misc. info byte for controlling interrupt lines
  103. ;    ANI    30H    ; Zero the least significant four bits, keep the
  104. ;            ;   remainining two most significant bits
  105. ;    MOV    E,A
  106. ;    LDA    OLDMSC    ; Get original misc. 8155 control byte
  107. ;    ANI    0FH    ; Keep least significant four bits
  108. ;    ORA    E    ; Combine everything
  109. ;    MOV    E,A
  110. ;    MVI    A,3
  111. ;    OUT    21H    ; Select 8155 port C
  112. ;    MOV    A,E
  113. ;    OUT    28H    ; Restore original 8155 control byte
  114. ;    EI
  115. ;    MVI    B,3CH
  116. ;    LDA    OLDBAUD ; Restore original baudrate byte
  117. ;    CALL    IORESET ; Do an 8251 reset
  118. ;    MVI    B,3BH
  119. ;    LDA    OLDMODE ; Restore original mode byte
  120. ;    CALL    IORESET ; Do an 8251 reset
  121. ;
  122. ;--> Original code starts again with the following instruction:
  123. ;
  124. ;    JMP    0
  125. ;
  126. ; ----------
  127. ;
  128. ; EQUATES
  129. ;
  130. INTVEC    EQU    0EFFEH        ; Address of interrupt vector to first
  131.                  ;   interrupt service routine
  132. BDOS    EQU    5        ; Address of bdos entry point in first
  133.                  ;   page of RAM
  134. BIOS    EQU    1        ; Address of pointer to CP/M warm boot
  135.                  ;   jump in BIOS
  136. AJUMP    EQU    0C3H        ; JUMP instruction opcode
  137. ;
  138. PORT    EQU    30H
  139. DATPORT    EQU    PORT        ; Modem data port
  140. STPORT    EQU    PORT+1        ; Modem status port
  141. ;
  142. ; Is there a carrier?  If not, return with the zero flag set.
  143. ;
  144. MDCARCK:MVI    A,17H        ; Reset status
  145.     OUT    STPORT
  146.     IN    STPORT        ; Get status
  147.     ANI    80H        ; Check for carrier detect
  148.     RET
  149. ;
  150. ; This routine will turn off the serial card and hang up the phone.
  151. ;
  152. MDINIT:    MVI    A,10H        ; Clear DTR
  153.     OUT    STPORT        ; Causing modem to hangup
  154.     PUSH    B        ; Preserve in case we need it
  155.     MVI    B,20        ; 2 seconds to drop DTR
  156. ;
  157. OFFTI:    CALL    DELAY        ; 0.1 second delay
  158.     DCR    B
  159.     JNZ    OFFTI        ; Keep waiting until carrier drops
  160.     POP    B        ; Restore BC
  161.     MVI    A,17H        ; Raise DTR so that modem can answer the phone
  162.     OUT    STPORT
  163. ;
  164.      IF    IMODEM
  165.     CALL    IMINIT        ; Initialize smartmodem
  166.      ENDIF            ; IMODEM
  167. ;
  168.     RET
  169. ;
  170. ; Input a character from the modem.
  171. ;
  172. MDINP:    IN    DATPORT        ; Get character
  173.     RET
  174. ;
  175. ; Check the status to see if a character is available.  Return with zero
  176. ; flag set, if not.  If yes, use 0FFH to clear the flag.
  177. ;
  178. MDINST:    IN    STPORT        ; Get status
  179.     ANI    2        ; Got a character?
  180.     RZ            ; Return if none
  181.     IN    STPORT        ; Get status again
  182.     ANI    ERR        ; Check for framing and overrun
  183.     JZ    MDINST1        ; No errors
  184.     MVI    A,17H        ; Reset error flags
  185.     OUT    STPORT
  186.     XRA    A        ; Return false
  187.     RET
  188. ;
  189. MDINST1:ORI    0FFH        ; We have a character
  190.     RET            ; And return
  191. ;
  192. ; Send a character to the modem.
  193. ;
  194. MDOUTP:    OUT    DATPORT        ; Send it
  195.     RET
  196. ;
  197. ; See if the output is ready for another character.
  198. ;
  199. MDOUTST:IN    STPORT        ; Read port
  200.     ANI    4        ; Mask crap
  201.     RZ
  202.     ORI    0FFH
  203.     RET
  204. ;
  205. ; Re-initialize modem and hang up phone by dropping DTR and leaving
  206. ; modem inactive
  207. ;
  208. MDQUIT:     IF    IMODEM
  209.     CALL    IMQUIT
  210.      ENDIF            ; IMODEM
  211. ;
  212. ; Called by main NUBYE program after caller types BYE
  213. ;
  214. MDSTOP:    XRA    A        ; Turn off rts/dtr, rx/tx
  215.     OUT    STPORT        ; Command byte to 8251 control port
  216.     RET
  217. ;
  218. ; If you do not support a particular baud rate, put it here before
  219. ; SETINV:
  220. ;
  221. SETINV:    MVI    A,0FFH
  222.     ORI    A        ; Make sure the Zero flag is not set
  223.     RET
  224. ;
  225. SET300:    MVI    A,6        ; Store baud rate parameter (300 baud)
  226.     MVI    B,3CH
  227.     JMP    SETBAUD
  228. ;
  229. SET1200:MVI    A,8        ; Store baud rate parameter (1200 baud)
  230.     MVI    B,3CH
  231.     JMP    SETBAUD
  232. ;
  233. SET2400:MVI    A,0BH        ; Store baud rate parameter (2400 baud)
  234.     MVI    B,3CH
  235. ;
  236. SETBAUD:CALL    IORESET        ; Use extended BIOS function to reset baudrate
  237.     XRA    A        ; Say baudrate change was satisfactory
  238.     RET
  239. ;
  240. ; Subroutine which executes a master reset for 8251.  8251 reset is a
  241. ; BIOS function in VIXEN extended BIOS
  242. ;
  243. ;    ENTRY:
  244. ;    A    =    byte value to be replaced in BIOS
  245. ;            (mode byte or baudrate byte)
  246. ;
  247. ;    B    =    hex displacement from base of BIOS
  248. ;            for mode byte or baudrate byte
  249. ;            (mode byte = 3BH)
  250. ;            (baudrate byte = 3CH)
  251. ;
  252. ;    EXIT:
  253. ;    NONE
  254. ;
  255. IORESET:LHLD    BIOS        ; Find base of BIOS
  256.     MOV    L,B
  257.     MOV    M,A
  258.     MVI    L,36H        ; Displacement in BIOS for 8251 reset function
  259.     SHLD    EXTFUN
  260.     CALL    BIOSFUNC    ; Subroutine call of BIOS 8251 reset function
  261.     RET
  262. ;
  263. OLDIOB:    DS    1        ; Original  IOBYTE
  264. OLDMSC:    DS    1        ; Original misc. control byte for 8155 port C
  265. OLDVEC:    DS    2        ; Original interrupt service vector
  266. OLDMODE:DB    1        ; Original 8251 mode byte from BIOS
  267. OLDBAUD:DB    1        ; Original baudrate byte for 8251 from BIOS
  268. BIOSFUNC: DB    AJUMP        ; Absolute jump to the    following memory address
  269. EXTFUN:    DS    2        ; BIOS extended function address
  270. ;
  271. ; end of insert
  272. ; -------------
  273.