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 / MODEMS / ZMODEM / ZMO-BB05.ZZ0 / ZMO-BB05.Z80
Text File  |  2000-06-30  |  13KB  |  649 lines

  1. ;  PROGRAM: ZMO-BB05.Z80
  2. ;  AUTHOR:  Ron Murray
  3. ;  VERSION: 1.5
  4. ;  DATE:  18 Sept, 1988
  5. ;-----------------------------------------------------------------------
  6. ;    This overlay is set up for a BigBoardII using port B.
  7. ;     Uses a Z80SIO AND A Z80CTC.
  8. ;-----------------------------------------------------------------------
  9. ; 89/04/12 - Modified to ZMP v1.5        - George Conover
  10. ; 89/03/15 - Removed the beginning remarks to make the file
  11. ;            smaller. If you need the remarks there are in the
  12. ;            file ZMP-BLNK.Z80             - George Conover
  13. ; 89/03/14 - Modified to ZMP v1.4        - George Conover
  14. ; 88/10/10 - Modified to ZMP v1.3        - Ron Murray
  15. ; 88/09/15 - Modified to ZMP v1.2        - Ron Murray
  16. ; 88/09/14 - First version of this file        - Ron Murray
  17. ;
  18. ;    Written by -
  19. ;      Ron Murray, c/o Z-Node 62, 061-9-450-0200, Perth, Western Australia.
  20. ;-----------------------------------------------------------------------
  21. NO    EQU    0
  22. YES    EQU    NOT NO
  23. ;
  24. ; User-set variables: ***********
  25. ;
  26. CLKSPD    EQU    4        ; Processor clock speed in MHz
  27. DEBUG    EQU    NO        ; to allow debugging of overlay with Z8E etc.
  28.  
  29. ;Set the following two equates to the drive and user area which will contain
  30. ;   ZMP's .OVR files, .CFG file, .FON file and .HLP file. Set both to zero
  31. ;   (null) to locate them on the drive from which ZMP was invoked.
  32.  
  33. OVERDRIVE    EQU    'A'    ; Drive to find overlay files on ('A'-'P')
  34. OVERUSER    EQU    0    ; User area to find files
  35.  
  36. ;------------------------------------------------------------------------------
  37. ;
  38. ; NOT user-set variables
  39. ;
  40. USERDEF    EQU    0145H        ; Origin of this overlay.  This address
  41. ;                ;   may change with subsequent revisions
  42. MSPEED    EQU    05CH        ; Location of current baud rate.
  43. OVSIZE    EQU    0400H        ; Max size of this overlay
  44. ;
  45.     .Z80            ; Use Z80 code
  46.     ASEG            ; Absolute
  47. ;
  48. ESC    EQU    1BH
  49. CTRLQ    EQU    11H
  50. CR    EQU    0DH
  51. LF    EQU    0AH
  52. BDOS    EQU    5
  53. ;
  54. ; BBII specific equates
  55. ;
  56. MDATA    EQU    082H
  57. MSTAT    EQU    083H
  58. RDA    EQU    0
  59. TBE    EQU    2
  60. CTC    EQU    88H
  61. MODE    EQU    47H
  62. ONHOOK    EQU    7FH
  63. ONLINE    EQU    80H
  64. ERROR    EQU    70H
  65. BREAK    EQU    0F8H
  66. RESET    EQU    30H
  67. ;
  68. ; Main code starts here
  69. ;
  70. CODEBGN    EQU    $
  71. ;
  72. ;Jump table for the overlay: do NOT change this
  73. ;
  74. JUMPTAB:
  75.     JP    SCRNPR        ; Screen print
  76.     JP    MRD        ; Modem read with timeout
  77.     JP    MCHIN        ; Get a character from modem
  78.     JP    MCHOUT        ; Send a character to the modem
  79.     JP    MORDY        ; Test for tx buffer empty
  80.     JP    MIRDY        ; Test for character received
  81.     JP    SNDBRK        ; Send break
  82.     JP    CURSADD        ; Cursor addressing
  83.     JP    CLS        ; Clear screen
  84.     JP    INVON        ; Inverse video on
  85.     JP    INVOFF        ; Inverse video off
  86.     JP    HIDE        ; Hide cursor
  87.     JP    SHOW        ; Show cursor
  88.     JP    SAVECU        ; Save cursor position
  89.     JP    RESCU        ; Restore cursor position
  90.     JP    MINT        ; Service modem interrupt
  91.     JP    INVEC        ; Initialise interrupt vectors
  92.     JP    DINVEC        ; De-initialise interrupt vectors
  93.     JP    MDMERR        ; Test uart flags for error
  94.     JP    DTRON        ; Turn DTR on
  95.     JP    DTROFF        ; Turn DTR OFF
  96.     JP    INIT        ; Initialise uart
  97.     JP    WAIT        ; Wait seconds
  98.     JP    MSWAIT        ; Wait milliseconds
  99.     JP    USERIN        ; User-defined entry routine
  100.     JP    USEROUT        ; User-defined exit routine
  101.     JP    GETVARS        ; get system variables
  102.       JP    SETPORT        ; Set port (0 or 1)
  103. ;
  104. ; Spare jumps for compatibility with future versions
  105. ;
  106.     JP    SPARE        ; Spares for later use
  107.     JP    SPARE        ; Spares for later use
  108.     JP    SPARE        ; Spares for later use
  109.     JP    SPARE        ; Spares for later use
  110.     JP    SPARE        ; Spares for later use
  111.     JP    SPARE        ; Spares for later use
  112. ;
  113. SPARE:    RET
  114. ;
  115. ;-----------------------------------------------------------------------
  116. ;
  117. ; Screen print function
  118. ;
  119. SCRNPR:    DB    0
  120. ;
  121. ; <== Insert your own code here
  122. ;
  123.     CALL    PRINT
  124.     DB    'This function not supported.',CR,LF,0
  125. ;
  126. ; <== End of your own code
  127. ;
  128.     RET
  129. ;
  130. ; Get a character from the modem: return in HL
  131. ;
  132. MCHIN:    PUSH    BC
  133. ;
  134. ; <== Insert your own code here
  135. ;
  136. MCHIN2:    IN    A,(MSTAT)    ; Check for char waiting
  137.     BIT    RDA,A
  138.     JR    Z,MCHIN2
  139.     IN    A,(MDATA)    ; Read the char
  140. ;
  141. ; <== End of your own code
  142. ;
  143.     LD    L,A        ; Put in HL
  144.     LD    H,0
  145.     OR    A        ; Set/clear Z
  146.     POP    BC
  147.     RET
  148. ;
  149. ; Send a character to the modem
  150. ;
  151. MCHOUT:    LD    HL,2        ; Get the character
  152.     ADD    HL,SP
  153.     LD    A,(HL)
  154. ;
  155. ; <== Insert your own code here
  156. ;
  157.     PUSH    BC
  158.     LD    B,A        ; Save the char
  159. ;
  160. MCHOUT2:IN    A,(MSTAT)    ; Check for uart ready
  161.     BIT    TBE,A
  162.     JR    Z,MCHOUT2
  163.     LD    A,B        ; Char in a
  164.     OUT    (MDATA),A    ; Send it
  165.     POP    BC
  166. ;
  167. ; <== End of your own code
  168. ;
  169.     RET            ; Done
  170. ;
  171. ;Test for output ready: return YES (1) in HL if ok
  172. ;
  173. MORDY:    DS    0
  174. ;
  175. ; <== Insert your own code here
  176. ;
  177.     LD    HL,0
  178.     IN    A,(MSTAT)
  179.     BIT    TBE,A        ; Transmit buffer empty
  180.     JR    Z,MORDY1
  181.     INC    HL
  182. ;
  183. MORDY1:    DS    0
  184. ;
  185. ; <== End of your own code
  186. ;
  187.     LD    A,L        ; Set/clear Z
  188.     OR    A
  189.     RET
  190. ;
  191. ; Test for character at modem: return YES (1) in HL if so
  192. ;
  193. MIRDY:    DS    0
  194. ;
  195. ; <== Insert your own code here
  196. ;
  197.     LD    HL,0
  198.     IN    A,(MSTAT)
  199.     BIT    RDA,A        ; Received data available
  200.     JR    Z,MIRDY1
  201.     INC    HL
  202. ;
  203. MIRDY1:    DS    0
  204. ;
  205. ; <== End of your own code
  206. ;
  207.     LD    A,L        ; Set/clear Z
  208.     OR    A
  209.     RET
  210. ;
  211. ; Send a break to the modem: leave empty if your system can't do it
  212. ;
  213. SNDBRK:    DS    0
  214. ;
  215. ; <== Insert your own code here
  216. ;
  217.     LD    A,5
  218.     OUT    (MSTAT),A
  219.     LD    A,BREAK        ; F8
  220.     OUT    (MSTAT),A
  221.     LD    HL,300        ; Wait 300 mS
  222.     CALL    WAITHLMS
  223.     LD    A,5
  224.     OUT    (MSTAT),A
  225.     LD    A,ONLINE    ; 68
  226.     OUT    (MSTAT),A
  227.     LD    A,3
  228.     OUT    (MSTAT),A
  229.     LD    A,0E1H
  230.     OUT    (MSTAT),A    ; E1
  231. ;
  232. ; <== End of your own code
  233. ;
  234.     RET
  235. ;
  236. ; Test UART flags for error: return YES (1) in HL if error
  237. ;
  238. MDMERR:    DS    0
  239. ;
  240. ; <== Insert your own code here
  241. ;
  242.     LD    HL,0
  243.     IN    A,(MSTAT)
  244.     AND    A,ERROR
  245.     JR    Z,MDMER1
  246.     INC    HL
  247. ;
  248. MDMER1:    DS    0
  249. ;
  250. ; <== End of your own code
  251. ;
  252.     LD    A,L        ; Set/clear Z
  253.     OR    A
  254.     RET
  255. ;
  256. ;Turn DTR ON
  257. ;
  258. DTRON:    DS    0
  259. ;
  260. ; <== Insert your own code here
  261. ;
  262.     LD    A,5
  263.     OUT    (MSTAT),A
  264.     LD    A,(COMBYT)    ; Get the one we used last time
  265.     OR    A,ONLINE    ; 80h - set bit 7 high
  266.     LD    (COMBYT),A    ; Save it for next time
  267.     OUT    (MSTAT),A    ; Go
  268. ;
  269. ; <== End of your own code
  270. ;
  271.     RET
  272. ;
  273. ; Turn DTR OFF
  274. ;
  275. DTROFF:    DS    0
  276. ;
  277. ; <== Insert your own code here
  278. ;
  279.     LD    A,5
  280.     OUT    (MSTAT),A
  281.     LD    A,(COMBYT)    ; Get the one we used last time
  282.     AND    ONHOOK        ; 7Fh - clear bit 7
  283.     LD    (COMBYT),A    ; Save it for next time
  284.     OUT    (MSTAT),A    ; Go
  285. ;
  286. ; <== End of your own code
  287. ;
  288.     RET
  289. ;
  290. ; Initialise the SIO +++
  291. ;
  292. ; The SIO is set up in four steps:
  293. ;    1)  Reset
  294. ;    2)  Reg 4 - clock, stop bits, parity
  295. ;    3)  Reg 5 - dtr, Tx bits, Brk, TxEn, rts
  296. ;    4)  Reg 3 - Rx bits, RxEn
  297. ;
  298. INIT:    LD    HL,2        ; Get parameters
  299.     ADD    HL,SP
  300.     EX    DE,HL
  301.     CALL    GETPARM        ; In HL
  302.     LD    (BRATE),HL    ; Baud rate
  303.     CALL    GETPARM
  304.     LD    (PARITY),HL    ; Parity
  305.     CALL    GETPARM
  306.     LD    (DATA),HL    ; Data bits
  307.     CALL    GETPARM
  308.     LD    (STOP),HL    ; Stop bits
  309. ;
  310. ; <== Insert your own code here, using values below
  311. ;
  312.     PUSH    BC
  313.     LD    A,0
  314.     OUT    (MSTAT),A    ; Point to reg 0
  315.     LD    A,18H        ; Reset
  316.     OUT    (MSTAT),A    ; *** step 1
  317.     LD    A,4        ; Point to wrt reg 4
  318.     OUT    (MSTAT),A
  319.     LD    E,44H        ; Assume  x16, 1 stop, No parity
  320.     LD    A,(STOP)    ; Set stop bits
  321.     CP    2        ; Set 2 if required
  322.     JR    NZ,SETPAR
  323.     SET    3,E
  324. ;
  325. SETPAR:    LD    A,(PARITY)    ; Set parity bits
  326.     CP    'O'
  327.     JR    NZ,SETPA1
  328.     SET    0,E        ; ODD
  329.     JR    SETPA2
  330. ;
  331. SETPA1:    CP    'E'
  332.     JR    NZ,SETPA2
  333.     SET    0,E
  334.     SET    1,E        ; EVEN
  335. ;
  336. SETPA2:    LD    A,E
  337.     OUT    (MSTAT),A    ; *** step 2
  338.     LD    A,5        ; Point to wrt reg 5 - dtr, Tx bits, etc
  339.     OUT    (MSTAT),A
  340.     LD    E,0EAH        ; Assume dtr, TX 8 bits, TxEn, rts
  341.     LD    A,(DATA)
  342.     CP    7
  343.     JR    NZ,SETBI2
  344.     RES    6,E        ; 7 bits
  345. ;
  346. SETBI2:    LD    A,E
  347.     OUT    (MSTAT),A    ; *** step 3
  348.     LD    A,3        ; Point to wrt reg 3
  349.     OUT    (MSTAT),A
  350.     LD    E,0C1H        ; Assume 8 bits
  351.     LD    A,(DATA)
  352.     CP    7
  353.     JR    NZ,SETBI3
  354.     RES    7,E        ; 7 bits
  355. ;
  356. SETBI3:    LD    A,E
  357.     OUT    (MSTAT),A    ; *** step 4
  358. ;
  359. SETBRATE:
  360.     LD    DE,(BRATE)    ; Get baud rate value (0-10)
  361.     LD    HL,BRVAL
  362.     ADD    HL,DE
  363.     LD    A,(HL)        ; Get value from table
  364.     OR    A        ; 0 = not valid
  365.     JR    Z,SETBRX    ; So quit
  366.     LD    A,MODE        ; 47h
  367.     OUT    (CTC),A        ; Select the correct timer and mode of the CTC
  368.     LD    A,(HL)        ; Then get value back
  369.     OUT    (CTC),A        ; Do it
  370.     LD    A,(BRATE)
  371.     LD    (MSPEED),A    ; Tell ZMP it's ok
  372. ;
  373. SETBRX:    POP    BC
  374.     RET
  375. ;
  376. BRATE:    DW    7        ; Baud rate:
  377. PARITY:    DW    'N'        ; Parity
  378. DATA:    DW    8        ; Data bits
  379. STOP:    DW    1        ; Stop bits
  380. COMBYT:    DB    0EAH        ; Save it here
  381. ;
  382. ;Values for Z80CTC control reg for each baud rate: 0 if invalid
  383. ;
  384. BRVAL:    DB    0        ; 110        0
  385.     DB    80H        ; 300        1
  386.     DB    0        ; 450        2
  387.     DB    40H        ; 600        3
  388.     DB    0        ; 710        4
  389.     DB    20H        ; 1200        5
  390.     DB    10H        ; 2400        6
  391.     DB    08H        ; 4800        7
  392.     DB    04H        ; 9600        8
  393.     DB    02H        ; 19200     9
  394.     DB    0        ; 38400        10
  395.     DB    0        ; 57600        11
  396.     DB    0        ; 76800        12
  397. ;
  398. ; Set the port. ZMP supplies either 0 or 1 as a parameter.
  399. ;
  400. setport:
  401.     ld    hl,2        ; get port number
  402.     add    hl,sp
  403.     ex    de,hl
  404.     call    getparm        ; in HL (values are 0 and 1)
  405.  
  406.                 ; <== Insert your own code here
  407.  
  408.                 ; <== End of your own code
  409.     ret
  410. ;
  411. ;-----------------------------------------------------------------------
  412. ;
  413. ; Video terminal sequences: these are for ADM-3A: Modify as you wish
  414. ; Cursor addressing:
  415. ;
  416. CURSADD:LD    HL,2        ; Get parameters
  417.     ADD    HL,SP
  418.     EX    DE,HL
  419.     CALL    GETPARM        ; In HL
  420.     LD    (ROW),HL    ; Row
  421.     CALL    GETPARM
  422.     LD    (COL),HL    ; Column
  423. ;
  424. ; <== Insert your own code here, using values in row and column
  425. ;
  426.     CALL    PRINT
  427.     DB    ESC,'=',0    ; ADM-3A leadin
  428.     LD    A,(ROW)        ; Row first
  429.     ADD    A,' '        ; Add offset
  430.     CALL    COUT
  431.     LD    A,(COL)        ; Sane for column
  432.     ADD    A,' '
  433.     CALL    COUT
  434. ;
  435. ; <== end of your own code
  436. ;
  437.     RET
  438. ;
  439. ROW:    DS    2        ; Row
  440. COL:    DS    2        ; Column
  441. ;
  442. ; Clear screen
  443. ;
  444. CLS:    CALL    PRINT
  445.     DB    ESC,'*',0
  446.     RET
  447. ;
  448. ; Inverse video on
  449. ;
  450. INVON:    CALL    PRINT
  451.     DB    ESC,'G4',0
  452.     RET
  453. ;
  454. ;Inverse video off
  455. ;
  456. INVOFF:    CALL    PRINT
  457.     DB    ESC,'G0',0
  458.     RET
  459. ;
  460. ; Turn off cursor
  461. ;
  462. HIDE:    DS    0
  463. ;;    CALL    PRINT
  464. ;;    DB    ESC,'.1',0
  465.     RET
  466. ;
  467. ; Turn on cursor
  468. ;
  469. SHOW:    DS    0
  470. ;;    CALLl    PRINT
  471. ;;    DB    ESC,'.3',0
  472.     RET
  473. ;
  474. ; Save cursor position
  475. ;
  476. SAVECU:    RET
  477. ;
  478. ; Restore cursor position
  479. ;
  480. RESCU:    RET
  481. ;
  482. ; User-defined entry routine: leave empty if not used
  483. ;
  484. USERIN:    RET
  485. ;
  486. ; User-defined exit routine: leave empty if not used
  487. ;
  488. USEROUT:RET
  489. ;
  490. ;-----------------------------------------------------------------------
  491. ;
  492. ; Service modem interrupt
  493. ;
  494. MINT:    RET            ; My system doesn't need this
  495. ;
  496. ; Initialise interrupt vectors
  497. ;
  498. INVEC:    RET            ; Ditto
  499. ;
  500. ;De-initialise interrupt vectors
  501. ;
  502. DINVEC:    RET            ; Ditto
  503. ;
  504. ;------------------- End of user-defined code --------------------------
  505. ;         Do not change anything below here
  506. ;
  507. ; Modem character test for 100 ms
  508. ;
  509. MRD:    PUSH    BC        ; Save bc
  510.     LD    BC,100        ; Set limit
  511. ;
  512. MRD1:    CALL    MIRDY        ; Char at modem?
  513.     JR    NZ,MRD2        ; Yes, exit
  514.     LD    HL,1        ; Else wait 1ms
  515.     CALL    WAITHLMS
  516.     DEC    BC        ; Loop till done
  517.     LD    A,B
  518.     OR    C
  519.     JR    NZ,MRD1
  520.     LD    HL,0        ; None there, result=0
  521.     XOR    A
  522. ;
  523. MRD2:    POP    BC
  524.     RET
  525. ;
  526. ; Inline print routine: destroys A and HL
  527. ;
  528. PRINT:    EX    (SP),HL        ; Get address of string
  529. ;
  530. PLOOP:    LD    A,(HL)        ; Get next
  531.     INC    HL        ; Bump pointer
  532.     OR    A        ; Done if zero
  533.     JR    Z,PDONE
  534.     CALL    COUT        ; Else print
  535.     JR    PLOOP        ; And loop
  536. ;
  537. PDONE:    EX    (SP),HL        ; Restore return address
  538.     RET            ; And quit
  539. ;
  540. ; Output a character in A to the console
  541. ;
  542. COUT:    PUSH    BC        ; Save registers
  543.     PUSH    DE
  544.     PUSH    HL
  545.     LD    E,A        ; Character to E
  546.     LD    C,2
  547.     CALL    BDOS        ; Print it
  548.     POP    HL
  549.     POP    DE
  550.     POP    BC
  551.     RET
  552. ;
  553. ; Wait(seconds)
  554. ;
  555. WAIT:    LD    HL,2
  556.     ADD    HL,SP
  557.     EX    DE,HL        ; Get delay size
  558.     CALL    GETPARM
  559. ;                ; Fall thru to...
  560. ; Wait seconds in HL
  561. ;
  562. WAITHLS:PUSH    BC        ; Save BC
  563.     PUSH    DE        ; DE
  564.     PUSH    IX        ; And IX
  565.     LD    IX,0        ; Then point IX to 0
  566. ;                ;   so we don't upset memory-mapped I/O
  567. ;
  568. ; Calculate values for loop constants. Need to have two loops to avoid
  569. ; 16-bit overflow with clock speeds above 9 MHz.
  570. ;
  571. OUTERVAL EQU    (CLKSPD    / 10) +    1
  572. ;
  573. INNERVAL EQU    (6667 /    OUTERVAL) * CLKSPD
  574. ;
  575. WAIT10:    LD    B,OUTERVAL
  576. ;
  577. WAIT11:    LD    DE,INNERVAL
  578. ;
  579. WAIT12:    BIT    0,(IX)        ; Time-wasters
  580.     BIT    0,(IX)
  581.     BIT    0,(IX)        ; 20 T-states each
  582.     BIT    0,(IX)
  583.     BIT    0,(IX)
  584.     BIT    0,(IX)
  585.     DEC    DE
  586.     LD    A,E
  587.     LD    A,D
  588.     OR    E
  589.     JR    NZ,WAIT12    ; 150 T-states per inner loop
  590.     DJNZ    WAIT11        ; Decrement outer loop
  591.     DEC    HL        ; Ok, decrement count in HL
  592.     LD    A,H
  593.     OR    L
  594.     JR    NZ,WAIT10
  595.     POP    IX        ; Done -- restore IX
  596.     POP    DE        ; DE
  597.     POP    BC        ; And BC
  598.     RET
  599. ;
  600. ; Wait milliseconds
  601. ;
  602. MSWAIT:    LD    HL,2
  603.     ADD    HL,SP
  604.     EX    DE,HL        ; Get delay size
  605.     CALL    GETPARM
  606. ;
  607. ; Wait milliseconds in HL
  608. ;
  609. WAITHLMS:
  610.     PUSH    DE
  611. ;
  612. W1MS0:    LD    DE,39 *    CLKSPD
  613. ;
  614. W1MS1:    DEC    DE
  615.     LD    A,D
  616.     OR    E
  617.     JR    NZ,W1MS1
  618.     DEC    HL
  619.     LD    A,H
  620.     OR    L
  621.     JR    NZ,W1MS0
  622.     POP    DE
  623.     RET
  624. ;
  625. ; Get next parameter from (DE) into HL
  626. ;
  627. GETPARM:EX    DE,HL        ; Get address into HL
  628.     LD    E,(HL)        ; Get low
  629.     INC    HL
  630.     LD    D,(HL)        ; Then hihi
  631.     INC    HL        ; Bump for next
  632.     EX    DE,HL        ; Result in HL, address still in DE
  633.     RET
  634. ;
  635. ;Get address of user-defined variables
  636. ;
  637. GETVARS:
  638.     LD    HL,USERVARS
  639.     RET
  640. USERVARS:
  641.     DW    OVERDRIVE    ; .OVR etc. drive/user
  642.     DW    OVERUSER
  643. ;
  644.      IF    ($ - CODEBGN) GT OVSIZE
  645. TOOBIG:    JP    ERRVAL        ; Overlay is too large
  646.      ENDIF
  647. ;
  648.     END
  649.