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 / BYE5 / B5MH-3.IQS / B5MH-3.INS
Text File  |  2000-06-30  |  11KB  |  497 lines

  1.  
  2. ; B5MH-3.INS - BYE5 insert for Morrow MD5, MD11, MD16, MD34 - 10/10/85
  3. ;
  4. ;                Z80 SIO
  5. ;
  6. ;            This is an insert, not an overlay
  7. ;
  8. ; This insert adapts the Morrow computers using hard disk and CP/M+
  9. ; with banked memory to BYE5.
  10. ;
  11. ;
  12. ;=   =     =   =     =   =     =   =     =   =     =   =     =   =     =   =     =   =
  13. ;
  14. ; 10/10/85  Reorganized and simplified. - Ed Meyer
  15. ;  B5MH-3
  16. ;
  17. ; 08/25/85  Fixed BUG in the Morrow BIOS INTER-BANK routine.
  18. ;  B5MH-2                - Paul Bartholomew
  19. ;
  20. ; 08/17/85  Updated for compatibility with BYE501.
  21. ;  B5MH-1                - George Peace
  22. ;
  23. ;=   =     =   =     =   =     =   =     =   =     =   =     =   =     =   =     =   =
  24. ;
  25. ;
  26. ; To get this to work correctly with a Morrow MD-HD, you must use the
  27. ; following cable configuration:
  28. ;
  29. ;          Modem End       Morrow MD-HD End
  30. ;          =========       ================
  31. ;        GND  1 <--------> 1  GND - ground
  32. ;         TD  2    --------> 3  RD  - receive data
  33. ;         RD  3 <--------  2  TD  - transmit data
  34. ;         SG  7 <--------> 7  SG  - signal ground
  35. ;         CD  8    --------> 4  CD  - carrier detect
  36. ;        DTR 20 <--------  5  DTR - data terminal ready
  37. ;
  38. ;
  39. ; Depending on the setting of the jumpers inside your computer, pins 2
  40. ; and 3 may or may not need to be crossed.
  41. ;
  42. ; MAKE SURE THE JUMPERS INSIDE THE MORROW ARE SET TO FACTORY SETTINGS.
  43. ;  (See Appendix D, figures D-5 and D-6 of the MD-11 users guide)
  44. ;
  45. ; NOTE: The CD (Carrier Detect) line is connected the Morrow pin 4 (RTS
  46. ;    on most computers, while usually pin 8 is carrier detect.)
  47. ;
  48. ;-----------------------------------------------------------------------
  49. ;
  50. ;
  51. ; Set ONE of the following to YES, the other to NO
  52. ;
  53. PMPORT    EQU    NO        ; Yes, using "Printer/Modem" port
  54. AUXPORT    EQU    YES        ; Yes, using "Auxilliary" port
  55. ;
  56. PORT    EQU    060H        ; Port for local console output
  57. CONST    EQU    PORT+1        ; Local console status
  58. ;
  59. ;
  60.      IF    PMPORT
  61. BPORT    EQU    062H
  62. BAUDS    EQU    051H
  63. MODEW    EQU    07EH
  64.      ENDIF            ; PMPORT
  65.  
  66.      IF    AUXPORT
  67. BPORT    EQU    070H
  68. BAUDS    EQU    050H
  69. MODEW    EQU    03EH
  70.      ENDIF            ; AUXPORT
  71. ;
  72. ;
  73. ; The following define the port addresses to use.
  74. ;
  75. DPORT    EQU    BPORT        ; Data port
  76. MDCTL1    EQU    BPORT+1        ; Status/control port
  77. BRPORT    EQU    053H
  78. ;
  79. ;
  80. ; The following are MDCTL1 status masks
  81. ;
  82. MDRCV    EQU    1        ; Data available
  83. MDSND    EQU    4        ; Transmit buffer empty
  84. DCD    EQU    8        ; Data carrier detect
  85. ;
  86. ;-----------------------------------------------------------------------
  87. ;
  88. ;
  89. ; See if we still have a carrier - if not, return with the zero flag set
  90. ;
  91. MDCARCK:MVI    A,10H        ; Reset status
  92.     OUT    MDCTL1
  93.     IN    MDCTL1        ; Get status
  94.     ANI    DCD        ; Check for data carrier
  95.     RET            ; Return
  96. ;.....
  97. ;
  98. ;
  99. ; Disconnect and wait for an incoming call
  100. ;
  101. MDINIT:    MVI    A,18H        ; Reset channel
  102.     OUT    MDCTL1
  103.     MVI    A,4        ; Setup to write register 4
  104.     OUT    MDCTL1
  105.     MVI    A,44H        ; No parity, 1 stop, 16x
  106.     OUT    MDCTL1
  107.     MVI    A,1        ; Setup to write register 1
  108.     OUT    MDCTL1
  109.     MVI    A,0
  110.     OUT    MDCTL1
  111.     MVI    A,5        ; Setup to write register 5
  112.     OUT    MDCTL1
  113.     MVI    A,0        ; DTR, RTS both off
  114.     OUT    MDCTL1
  115.     PUSH    B        ; Save in case it's being used elsewhere
  116.     MVI    B,20        ; 2 second delay
  117. ;
  118. OFFTI:    CALL    DELAY        ; 0.1 second delay
  119.     DCR    B
  120.     JNZ    OFFTI        ; Keep looping until finished
  121.     POP    B        ; Restore bc
  122.     MVI    A,3        ; Setup to write register 3
  123.     OUT    MDCTL1
  124.     MVI    A,0C1H        ; 8 bits, enable receive
  125.     OUT    MDCTL1
  126.     MVI    A,5        ; Setup to write register 5
  127.     OUT    MDCTL1
  128.     MVI    A,0EAH        ; DTR, RTS, TX on, 8 bits
  129.     OUT    MDCTL1
  130.  
  131.      IF    IMODEM        ; If using intelligent modem
  132.     CALL    IMINIT        ; Go initialize modem now
  133.      ENDIF            ; IMODEM
  134. ;
  135.     RET            ; Return
  136. ;.....
  137. ;
  138. ;
  139. ; Input a character from the modem port
  140. ;
  141. MDINP:
  142.     IN    DPORT        ; Get character
  143.     RET            ; Return
  144. ;.....
  145. ;
  146. ;
  147. ; Check the status to see if a character is available.    If not, return
  148. ; with the zero flag set.  If yes, use 0FFH to clear the flag.
  149. ;
  150. MDINST:
  151.     IN    MDCTL1        ; Get status
  152.     ANI    MDRCV        ; Got a character?
  153.     RZ            ; Return if none
  154.     ORI    0FFH        ; Otherwise, set the proper flag
  155.     RET            ; And return
  156. ;.....
  157. ;
  158. ;
  159. ; Send a character to the modem
  160. ;
  161. MDOUTP:    OUT    DPORT        ; Send it
  162.     RET            ; Return
  163. ;.....
  164. ;
  165. ;
  166. ; See if the output is ready for another character
  167. ;
  168. MDOUTST:
  169.     IN    MDCTL1
  170.     ANI    MDSND        ; Mask it
  171.     RET            ; Return
  172. ;.....
  173. ;
  174. ;
  175. ; Reinitialize the modem and hang up the phone by dropping DTR and
  176. ; leaving it inactive.
  177. ;
  178. MDQUIT:     IF    IMODEM        ; If using an intelligent modem
  179.     CALL    IMQUIT        ; Tell it to shut down
  180.      ENDIF            ; IMODEM
  181. ;
  182. ;
  183. ; Called by the main program after caller types BYE.
  184. ;
  185. MDSTOP:    MVI    A,5        ; Setup to write register 5
  186.     OUT    MDCTL1
  187.     MVI    A,0        ; Clear DTR, RTS causing shutdown
  188.     OUT    MDCTL1
  189.     RET
  190. ;.....
  191. ;
  192. ;
  193. ; The following routine sets the baudrate.  BYE5 asks for the maximum
  194. ; speed you have available.
  195. ;
  196. SETINV:    MVI    A,0FFH
  197.     ORA    A        ; Make sure the zero flag is set
  198.     RET
  199. ;.....
  200. ;
  201. ;
  202. SET300:    LXI    H,BD300
  203.     JMP    SETBAUD
  204. ;.....
  205. ;
  206. ;
  207. SET1200:LXI    H,BD1200
  208.     JMP    SETBAUD
  209. ;.....
  210. ;
  211. ;
  212. SET2400:LXI    H,BD2400
  213.     JMP    SETBAUD
  214. ;.....
  215. ;
  216. ;
  217. SETBAUD:MVI    A,MODEW
  218.     OUT    BRPORT
  219.     MOV    A,M
  220.     OUT    BAUDS
  221.     INX    H
  222.     MOV    A,M
  223.     OUT    BAUDS
  224.     XRA    A        ; Say rate is ok
  225.     RET            ; Return
  226. ;.....
  227. ;
  228. ;
  229. ; The following are baud rates for BPORT -- they will have to be changed
  230. ; for your particular CTC.
  231. ;
  232. BD300: DW    832
  233. BD1200:DW    208
  234. BD2400:DW    104
  235. BD9600:DW    26
  236.  
  237.  
  238. ;.....
  239. ;
  240. ;
  241. ;Find address of INTER-BANK BUG in Morrow's BIOS
  242. ;
  243. FINDBUG:LDA    FNDBUG        ; See if we already found the address
  244.     ORA    A
  245.     JZ    FBUG0        ; No, go find it
  246.     LHLD    BUGADR        ; Yes, return with address
  247.     RET
  248. ;.....
  249. ;
  250. ;
  251. FBUG0:    LHLD    1
  252.     INX    H
  253.     MOV    E,M
  254.     INX    H
  255.     MOV    D,M
  256.     XCHG            ; Hl points to warm boot code
  257. ;
  258. ;
  259. ; The warm boot in common memory is as follows:
  260. ;
  261. ; loc  opcodes    mneumonics
  262. ; ---- -------    --------------------
  263. ; xxxx 21 yyyy    LD    HL,BNK-WBOOT ;WARM BOOT code in SYSTEM bank
  264. ; xxxx 18 zz    JR    INTER-BANK
  265. ;
  266. ; We will find the address of INTER-BANK and modify it to fix the BUG.
  267. ;
  268. ; The INTER-BANK code in COMMON memory is as follows:
  269. ;
  270. ; loc  opcodes    mneumonics
  271. ; ---- -------    --------------------
  272. ; xxxx 3A yyyy    LD    A,(SYSMTE-BANK-BITS)
  273. ; xxxx CB 47    BIT    0,A    ;Should be BIT 1,A (CB 4F)
  274. ;
  275. ;
  276. ;
  277. FBUG1:    MOV    A,M
  278.     CPI    18H        ; Look for JR to INTER-BANK
  279.     JZ    FBUG2
  280.     INX    H
  281.     JMP    FBUG1
  282. ;
  283. FBUG2:    INX    H
  284.     MOV    A,M        ; Get JR offset
  285.     INX    H
  286.     MOV    E,A
  287.     MVI    D,0
  288.     DAD    D        ; HL now points to INTER-BANK
  289. ;
  290. FBUG3:    MOV    A,M
  291.     CPI    0CBH        ; Look for bit opcode
  292.     JZ    FBUG4
  293.     INX    H
  294.     JMP    FBUG3
  295. ;
  296. FBUG4:    INX    H
  297.     SHLD    BUGADR
  298.     MVI    A,0FFH
  299.     STA    FNDBUG
  300.     RET
  301. ;.....
  302. ;
  303. ;
  304. FNDBUG:    DB    0
  305. BUGADR:    DW    0
  306. BUGVAL:    DB    0
  307. ;.....
  308. ;
  309. ;
  310. ; Perform system or hardware dependent PRE-processing.    The following
  311. ; code will be executed by the PATCH subroutine before the BIOS jump
  312. ; table is overwritten.  This will allow the BIOS intercept routines to
  313. ; operate as early as the initial signon message display.
  314. ;
  315. MDPREP:    CALL    FINDBUG        ; Get address of BIOS bug
  316.     MOV    A,M
  317.     STA    BUGVAL        ; Save old value
  318.     MVI    M,04FH        ; Change the bit 0,A to a bit 1,A
  319. ;
  320. ;
  321. ; OK, the BIOS BUG is now fixed.
  322. ;
  323. ;
  324. ; Replace the NEWJTBL BIOS routing table with our own
  325. ;
  326. ;
  327.     LXI    H,JTBLNEW    ; Get replacement table address
  328.     LXI    D,NEWJTBL    ; Get address to overwrite
  329.     LXI    B,JTBLEN    ; Get number of bytes to overwrite
  330.     DB    0EDH,0B0H    ; Move the jump table
  331. ;
  332. ;
  333. ; Move the BIOS intercept routines up to common memory
  334. ;
  335.     LXI    H,STCOMN    ; Start of interface routines
  336.     LXI    D,COMMN        ; Address in high memory to load them
  337.     LXI    B,COMLEN    ; Length of common code
  338.     DB    0EDH,0B0H    ; Move the code to common memory
  339.     RET
  340. ;.....
  341. ;
  342. ;
  343. ; Perform system or hardware dependent POST-processing.  The following
  344. ; code will be executed by the EXCPM routine before returning control to
  345. ; CP/M Plus when the BYE5 program is terminated.
  346. ;
  347. MDPOSP:    CALL    FINDBUG        ; Get address of BIOS bug
  348.     LDA    BUGVAL        ; Get old value
  349.     MOV    M,A        ; Un-fix the BIOS bug (make it a bit 0)
  350.     RET
  351. ;.....
  352. ;
  353. ;
  354. ; The following code is required for proper operation on the Morrow
  355. ; MD-HD.  As the MD-HD operates in a banked environment, BIOS calls MAT
  356. ; originate in any bank (0 or 1).  It is therefore possible that window
  357. ; 1 (where BYE5 resides) will not be selected at the time a BIOS call is
  358. ; made.  As a result, steps must be taken to be sure that the BIOS jump
  359. ; table does not direct a BIOS call into bank 1 unless that bank is
  360. ; selected.  This code is moved up to common memory where it will be
  361. ; visible to all banks.  For each of the intercepted BIOS calls, it will:
  362. ;
  363. ;   - save the caller's stack pointer
  364. ;   - save the caller's bank select mask
  365. ;   - switch to bank 1
  366. ;   - execute the BYE interface routine and then the
  367. ;    original BIOS routine as necessary
  368. ;   - recover the caller's stack pointer
  369. ;   - reset the bank select mask to that of the caller
  370. ;   - return control to the caller
  371. ;
  372. ;
  373. ;NOTE: With Morrow MD-HD computers (BIOS <= 2.0), the free common memory
  374. ;      is from FF48H to FFA9H (97 bytes).  Make sure COMLEN is <= 61H!
  375. ;
  376. ;      All other common RAM is used by BIOS for stacks and interrupts.
  377. ;
  378. ;
  379. COMMN    EQU    0FF48H        ; Address for unmodified bios <= 2.0
  380. ;
  381. SXBIOS    EQU    0F885H        ; Address of stack for BIOS intercepts
  382. ;
  383. PNTSELM    EQU    0FE51H+1    ; Pointer to SELMEN JMP +1
  384. ;
  385. BNKSTB    EQU    41H        ; Bank select port
  386. ;
  387. STCOMN    EQU    $
  388. ;
  389. WBCOMN    EQU    COMMN+($-STCOMN) ; Warm boot
  390.     CALL    SWIN
  391.     JMP    MBOOT
  392. ;.....
  393. ;
  394. ;
  395. CSCOMN    EQU    COMMN+($-STCOMN) ; Console status
  396.     CALL    SWIN
  397.     CALL    MSTAT
  398.     JMP    SWOUT
  399. ;....
  400. ;
  401. ;
  402. CICOMN    EQU    COMMN+($-STCOMN) ; Console input
  403.     CALL    SWIN
  404.     CALL    MINPUT
  405.     JMP    SWOUT
  406. ;.....
  407. ;
  408. ;
  409. COCOMN    EQU    COMMN+($-STCOMN) ; Console output
  410.     CALL    SWIN
  411.     CALL    MOUTPUT
  412.     JMP    SWOUT
  413. ;.....
  414. ;
  415. ;
  416. SWIN    EQU    COMMN+($-STCOMN) ; Bank switch in routine
  417.                 ; Destroys register HL,A
  418.     POP    H        ; Get return address
  419.     DB    0EDH,073H
  420.     DW    SXSAVE
  421.     LXI    SP,SXBIOS    ; Load new stack pointer in common
  422.     PUSH    H
  423.     CALL    FNDSBB        ; HL=address of SYSTEM-BANK-BITS
  424.     MOV    A,M
  425.     RRC            ; Bank # in bit 1, move to bit 0
  426.     ANI    1        ; A now has the current bank in it
  427.     POP    H
  428.     PUSH    PSW        ; Save it for return from BIOS
  429.     MVI    A,1        ; Get bank 1 mask
  430.     CALL    SELMEM
  431.     PUSH    H        ; Put return address on new stack
  432.     RET
  433. ;.....
  434. ;
  435. ;
  436. SWOUT    EQU    COMMN+($-STCOMN) ; Bank switch out routine
  437.     MOV    H,A        ; Save A reg. (for console input call)
  438.     POP    PSW        ; Retrieve caller's bank selection mask
  439.     DB    0EDH,07BH
  440.     DW    SXSAVE
  441.     CALL    SELMEM
  442.     MOV    A,H        ; Restore A reg. (for console input call)
  443.     RET
  444. ;.....
  445. ;
  446. ;
  447. SELMEM    EQU    COMMN+($-STCOMN)
  448.     PUSH    H
  449.     LHLD    PNTSELM
  450.     CALL    MYPC
  451.     POP    H
  452.     RET
  453. ;.....
  454. ;
  455. ;
  456. MYPC    EQU    COMMN+($-STCOMN)
  457.     PCHL
  458. ;.....
  459. ;
  460. ;
  461. FNDSBB    EQU    COMMN+($-STCOMN) ; Point HL to SYSMTE-BANK-BITS
  462.     PUSH    D
  463.     LHLD    PNTSELM
  464.     INX    H
  465.     INX    H
  466.     MOV    E,M
  467.     INX    H
  468.     MOV    D,M        ; DE points to SYSTEM-BANK-BITS
  469.     XCHG
  470.     POP    D
  471.     RET
  472. ;.....
  473. ;
  474. ;
  475. SXSAVE    EQU    COMMN+($-STCOMN)
  476.     DS    2        ; Save area for caller's stack pointer
  477. ;
  478. COMLEN    EQU    $-STCOMN    ; Length of common memory interface code
  479. ;
  480. JTBLNEW:
  481.     JMP    MCBOOT        ; Cold boot
  482.     JMP    WBCOMN        ; Warm boot
  483.     JMP    CSCOMN        ; Modem status test
  484.     JMP    CICOMN        ; Modem input routine
  485.     JMP    COCOMN        ; Modem output routine
  486. ;
  487.      IF    (NOT HARDLOG) AND (NOT PRINTER)
  488.     JMP    COCOMN        ; Modem list device
  489.     JMP    COCOMN        ; Modem punch device
  490.     JMP    CICOMN        ; Modem reader device
  491.      ENDIF            ; (NOT HARDLOG) AND (NOT PRINTER)
  492. ;
  493. JTBLEN    EQU    $-JTBLNEW
  494. ;
  495. ;                   end
  496. ;----------------------------------------------------------------------
  497.