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-MIC5.Z80 < prev    next >
Text File  |  2000-06-30  |  14KB  |  639 lines

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