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 / NUMH-1.IQS / numh-1.ins
Text File  |  1986-04-26  |  11KB  |  421 lines

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