home *** CD-ROM | disk | FTP | other *** search
/ CP/M / CPM_CDROM.iso / mbug / mbug167.arc / ZMP-BEE.LBR / ZMO-MB01.MZC / ZMO-MB01.MAC
Text File  |  1979-12-31  |  14KB  |  651 lines

  1. ;-----------------------------------------------------------------------------
  2. ;
  3. ;    ZMP (Z-Modem Program) Overlay for 56k Microbee
  4. ;
  5. ;    Name    ZMO-MB01.Z80
  6. ;
  7. ;    Dated Dec 11, 1988
  8. ;
  9. ;    Written by -
  10. ;      Ron Murray, c/o Z-Node 62, 061-9-450-0200, Perth, Western Australia.
  11. ;    - Based on George Hansper's MEX overlay
  12. ;
  13. ;
  14. ;-----------------------------------------------------------------------------
  15. ;
  16. ;
  17. ;    System-dependent code overlay for ZMODEM
  18. ;
  19. ;
  20. ;
  21. ;    Insert your own code as necessary in this file. Code contained herein
  22. ; has been written in Z80 code for use with M80 or SLR. Assemble as follows:
  23. ;
  24. ;    SLR ZMO-xx01/h
  25. ;    MLOAD ZMP.COM=ZMODEM.COM,ZMO-xx01.HEX
  26. ; or
  27. ;    M80 =ZMO-xx01.Z80
  28. ;    RELHEX ZMO-xx01
  29. ;    MLOAD ZMP.COM=ZMODEM.COM,ZMO-xx01.HEX
  30. ;
  31. ;
  32. ;       (Don't use L80 without changing the source for assembly as a
  33. ;         cseg file.)
  34. ;
  35. ;-----------------------------------------------------------------------------
  36. ;
  37. ;
  38. ; Notes on modifying this file:
  39. ;
  40. ;    C requires that functions do not change either index register (IX or IY).
  41. ; If your overlay requires either of these to be changed, ensure they are
  42. ; restored to the original values on return.
  43. ;    Since collecting parameters from C functions can be tricky, only change
  44. ; the parts marked 'Insert your own code here'. Do NOT modify the jump
  45. ; table at the start. Do NOT modify the entry/exit sections of each
  46. ; function. Do NOT pass 'GO'. Do NOT collect $200.
  47. ;    Apart from defining modem functions, this file also defines terminal
  48. ; characteristics. Examples provided are for ADM-3A (with a few of my own
  49. ; additions). Modify to suit your own terminal. An inline print routine
  50. ; is provided for printing strings in the usual way: usage is
  51. ;
  52. ;    call    print
  53. ;    db    'required string',0
  54. ;
  55. ;-----------------------------------------------------------------------------
  56. ;
  57. ;
  58. ;    Don't forget to set your clock speed at the clkspd variable.
  59. ;
  60. ;
  61. ;    If you find your overlay exceeds the maximum size (currently 0400h),
  62. ; you will have to contact me for another version. If too many people need 
  63. ; to do it, we haven't allowed enough room.
  64. ;
  65. ; Ron Murray 15/8/88
  66. ;
  67. ;
  68. ;
  69. ;---------------------------------------------------------------------------
  70.  
  71. false    equ    0
  72. true    equ    not false
  73.  
  74. ;------------------------------------------------------------------------------
  75.  
  76. ; User-set variables: 
  77.  
  78. clkspd    equ    4        ; Processor clock speed in MHz
  79. debug    equ    false        ; to allow debugging of overlay with Z8E etc.
  80.  
  81. ;Set the following two equates to the drive and user area which will contain
  82. ;   ZMP's .OVR files, .CFG file, .FON file and .HLP file. Set both to zero
  83. ;   (null) to locate them on the drive from which ZMP was invoked.
  84.  
  85. overdrive    equ    'B'    ; Drive to find overlay files on ('A'-'P')
  86. overuser    equ    0    ; User area to find files
  87.  
  88. ;------------------------------------------------------------------------------
  89.  
  90.  
  91. ; NOT user-set variables
  92.  
  93. userdef    equ    0145h        ; origin of this overlay
  94.                 ; This address should not change with
  95.                 ; subsequent revisions.
  96. mspeed    equ    03ch        ; location of current baud rate. 
  97. ovsize    equ    0400h        ; max size of this overlay
  98.  
  99.     .z80            ; use z80 code
  100.     aseg            ; absolute
  101.  
  102.      if    debug
  103.     org    100h        ; so you can debug it with cebug, zsid, etc
  104.      else
  105.     org    userdef
  106.      endif
  107.  
  108.  
  109. esc    equ    1bh
  110. ctrlq    equ    11h
  111. cr    equ    0dh
  112. lf    equ    0ah
  113. bdos    equ    5
  114.  
  115. ;rsx calls
  116. status    equ    51        ; modem status
  117. odata    equ    52        ; data out
  118. idata    equ    53        ; data in
  119.  
  120. ;location of Port B interrupt vector (as used by your operating system):
  121. ;INTVCB    equ    50h        ;Dreamdisk (ROM v2.18)
  122. INTVCB    equ    0DF4Ah        ;Applied Tech. (64k Adv Pers Communicator)
  123. ;INTVCB    equ    0E8E2h        ;Applied Tech. (128k)
  124. ;
  125. ; Z80 PIO equates:
  126. DATAB    equ    2        ;PIO port B data
  127. CTLB    equ    3        ; "   "   " control
  128. DTR    equ    4        ;DTR  output on bit 2
  129. RSOUT    equ    20h        ;RS-232  "   "   "  5
  130. CTS    equ    8        ;CTS   input "   "  3
  131. RSIN    equ    10h        ;RS-232  "   "   "  4
  132.  
  133. codebgn    equ    $
  134.  
  135. ;Jump table for the overlay: do NOT change this
  136. jump_tab:
  137.     jp    scrnpr        ; screen print
  138.     jp    mrd        ; modem read with timeout
  139.     jp    mchin        ; get a character from modem
  140.     jp    mchout        ; send a character to the modem
  141.     jp    mordy        ; test for tx buffer empty
  142.     jp    mirdy        ; test for character received
  143.     jp    sndbrk        ; send break
  144.     jp    cursadd        ; cursor addressing
  145.     jp    cls        ; clear screen
  146.     jp    invon        ; inverse video on
  147.     jp    invoff        ; inverse video off
  148.     jp    hide        ; hide cursor
  149.     jp    show        ; show cursor
  150.     jp    savecu        ; save cursor position
  151.     jp    rescu        ; restore cursor position
  152.     jp    mint        ; service modem interrupt
  153.     jp    invec        ; initialise interrupt vectors
  154.     jp    dinvec        ; de-initialise interrupt vectors
  155.     jp    mdmerr        ; test uart flags for error
  156.     jp    dtron        ; turn DTR on
  157.     jp    dtroff        ; turn DTR OFF
  158.     jp    init        ; initialise uart
  159.     jp    wait        ; wait seconds
  160.     jp    mswait        ; wait milliseconds
  161.     jp    userin        ; user-defined entry routine
  162.     jp    userout        ; user-defined exit routine
  163.     jp    getvars        ; get system variables
  164.  
  165. ; Spare jumps for compatibility with future versions
  166.     jp    spare        ; spare for later use
  167.     jp    spare        ; spare for later use
  168.     jp    spare        ; spare for later use
  169.     jp    spare        ; spare for later use
  170.     jp    spare        ; spare for later use
  171.     jp    spare        ; spare for later use
  172.  
  173. ;
  174. ; Main code starts here
  175. ;
  176. ;Screen print function
  177. scrnpr:
  178.                 ; <== Insert your own code here
  179.     call    print
  180.     db    'This function not supported.',cr,lf,0
  181.                 ; <== End of your own code
  182. spare:
  183.     ret
  184.  
  185. ; User-defined entry routine: leave empty if not needed
  186. userin:
  187.     ret
  188.  
  189. ; User-defined exit routine: leave empty if not needed
  190. userout:
  191.     ret
  192.  
  193.  
  194. ;Get a character from the modem: return in HL
  195. mchin:
  196.     push    bc
  197.                 ; <== Insert your own code here
  198.     push    ix
  199.     push    iy
  200.     ld    de,00ffh    ; ensure in range
  201.     ld    c,idata
  202.     call    bdos
  203.     pop    iy
  204.     pop    ix
  205.                 ; <== End of your own code
  206.  
  207.     ld    a,l        ; put in A
  208.     or    a        ; set/clear Z
  209.     pop    bc
  210.     ret
  211.  
  212. ;Send a character to the modem
  213. mchout:
  214.     ld    hl,2        ; get the character
  215.     add    hl,sp
  216.     ld    e,(hl)
  217.                 ; <== Insert your own code here
  218.  
  219.     push    ix
  220.     push    iy
  221.     ld    d,080h        ; ensure we don't upset the rsx
  222.     ld    c,odata
  223.     call    bdos
  224.     pop    iy
  225.     pop    ix
  226.                 ; <== End of your own code
  227.     ret            ; done
  228.  
  229. ;Test for output ready: return TRUE (1) in HL if ok
  230. mordy:
  231.                 ; <== Insert your own code here
  232.  
  233.     push    ix
  234.     push    iy
  235.     ld    de,08000h
  236.     ld    c,status
  237.     call    bdos        ; get status reg
  238.     ld    a,l        ; get result
  239.     ld    hl,0
  240.     and    010h        ; TDRE?
  241.     jr    z,mordy1
  242.     inc    hl        ; yes
  243.  
  244. mordy1:
  245.     pop    iy
  246.     pop    ix
  247.                 ; <== End of your own code
  248.  
  249.     ld    a,l        ; set/clear Z
  250.     or    a
  251.     ret
  252.  
  253. ;Test for character at modem: return TRUE (1) in HL if so
  254. mirdy:
  255.                 ; <== Insert your own code here
  256.     push    bc
  257.     push    ix
  258.     push    iy
  259.     ld    de,08000h
  260.     ld    c,status
  261.     call    bdos        ; get status reg
  262.     ld    a,l        ; get result
  263.     ld    hl,0
  264.     and    08h        ; RDRF?
  265.     jr    z,mirdy1
  266.     inc    hl        ; yes
  267.  
  268. mirdy1:
  269.     pop    iy
  270.     pop    ix
  271.     pop    bc
  272.  
  273.                 ; <== End of your own code
  274.     ld    a,l        ; set/clear Z
  275.     or    a
  276.     ret
  277.  
  278. ;Send a break to the modem: leave empty if your system can't do it
  279. sndbrk:
  280.                 ; <== Insert your own code here
  281.  
  282.     ld    hl,300        ; wait 300 mS
  283.     call    waithlms
  284.  
  285.                 ; <== End of your own code
  286.     ret
  287. ;
  288. ;Test UART flags for error: return TRUE (1) in HL if error.
  289. mdmerr:
  290.                 ; <== Insert your own code here
  291.     ld    hl,0
  292.                 ; <== End of your own code
  293.     ld    a,l        ; set/clear Z
  294.     or    a
  295.     ret
  296.  
  297.  
  298.  
  299. ;Turn DTR ON
  300. dtron:
  301.                 ; <== Insert your own code here
  302.  
  303.     ld    a,DTR+RSOUT    ; DTR high, RSOUT low
  304.     out    (DATAB),a
  305.                 ; <== End of your own code
  306.     ret
  307.  
  308.  
  309.  
  310. ;Turn DTR OFF
  311. dtroff:
  312.                 ; <== Insert your own code here
  313.  
  314.     ld    a,RSOUT        ; DTR low, RSOUT low
  315.     out    (DATAB),a
  316.                 ; <== End of your own code
  317.     ret
  318.  
  319.  
  320.  
  321. ;Initialise the uart
  322.  
  323. init:
  324.  
  325.     ld    hl,2        ; get parameters
  326.     add    hl,sp
  327.     ex    de,hl
  328.     call    getparm        ; in HL
  329.     ld    (brate),hl    ; baud rate
  330.     call    getparm
  331.     ld    (parity),hl    ; parity
  332.     call    getparm
  333.     ld    (data),hl    ; data bits (BINARY 7 or 8)
  334.     call    getparm
  335.     ld    (stop),hl    ; stop bits (BINARY 1 or 2)
  336.  
  337.  
  338.                 ; <== Insert your own code here
  339.                 ; using values below
  340.                 ; don't forget to load mspeed with the
  341.                 ; current brate value if the new rate is
  342.                 ; valid. See table of values below.
  343.     push    ix
  344.     ld    hl,(brate)    ; do baud rate
  345.     ld    a,l        ; if > 10,
  346.     cp    10
  347.     jr    nc,setpar    ; ignore
  348.     ld    (mspeed),a    ; ok
  349.     ld    de,btable    ; get delay for this speed
  350.     add    hl,de
  351.     ld    a,(hl)
  352.     ld    ix,(baud)
  353.     ld    (ix),a
  354.     ld    (ix+1),a    ; put in upper and lower byte
  355.  
  356. setpar:
  357.     ld    a,(parity)
  358.     ld    c,1
  359.     cp    'N'
  360.     jr    z,setpr1    ; none = 1
  361.     inc    c
  362.     cp    'O'
  363.     jr    z,setpr1    ; odd  = 2
  364.     inc    c        ; even = 3
  365.     cp    'E'
  366.     jr    z,setpr1
  367.     ld    c,1        ; default to none
  368.  
  369. setpr1:
  370.     ld    ix,(bparity)
  371.     ld    (ix),a
  372.  
  373. setdata:
  374.     ld    a,(data)
  375.     and    0fh
  376.     cp    7        ; only 7 or 8
  377.     jr    z,setdat1
  378.     cp    8
  379.     jr    z,setdat1
  380.     ld    a,8        ; default to 8
  381.  
  382. setdat1:
  383.     ld    ix,(ndata)
  384.     ld    (ix),a
  385.     ld    ix,(bparity)
  386.     ld    b,(ix)
  387.     dec    b
  388.     jr    z,setdt1    ; parity = none
  389.     inc    a        ; parity = odd,even
  390.  
  391. setdt1:
  392.     ld    ix,(npdata)
  393.     ld    (ix),a        ; = no of data bits + parity bit
  394.  
  395. setstop:
  396.     ld    a,(stop)    ; set stop bits
  397.     ld    ix,(stopbits)
  398.     and    07h        ; either binary 1 or 2
  399.     ld    (ix),a
  400.  
  401.     pop    ix
  402.                 ; <== End of your own code
  403.     ret
  404. ;--------------------------------------------------------------------------
  405.  
  406. stop:    dw    1        ; stop bits
  407. parity:    dw    'N'        ; parity
  408. data:    dw    8        ; data bits
  409. brate:    dw    7        ; baud rate:
  410.  
  411. ;--------------------------------------------------------------------------
  412. ;Values of brate for each baud rate
  413. ;
  414. ; baud rate    brate        delay
  415. ;
  416. ;   110         0        170
  417. ;   300         1         64
  418. ;   450         2         43
  419. ;   600         3         32
  420. ;   710         4         27
  421. ;  1200         5         16
  422. ;  2400         6          8
  423. ;  4800         7          4
  424. ;  9600         8          2
  425. ; 19200         9          1
  426. ; 38400        10        ---
  427. ; 57600         11        ---
  428. ; 76800         12        ---
  429. ;
  430.  
  431. btable:
  432.     db    170,64,43,32,27,16,8,4,2,1
  433.  
  434. ;****************************************************************************
  435. ;Video terminal sequences: these are for ADM-3A: Modify as you wish
  436. ;Cursor addressing: 
  437. cursadd:
  438.     ld    hl,2        ; get parameters
  439.     add    hl,sp
  440.     ex    de,hl
  441.     call    getparm        ; in HL
  442.     ld    (row),hl    ; row
  443.     call    getparm
  444.     ld    (col),hl    ; column
  445.                 ; <== Insert your own code here
  446.                 ; using values in row and col
  447.     call    print
  448.     db    esc,'=',0    ; ADM-3A leadin
  449.     ld    a,(row)        ; row first
  450.     add    a,' '        ; add offset
  451.     call    cout
  452.     ld    a,(col)        ; sane for column
  453.     add    a,' '
  454.     call    cout
  455.                 ; <== end of your own code
  456.     ret
  457.  
  458. row:    ds    2        ; row
  459. col:    ds    2        ; column
  460.  
  461.  
  462. ;Clear screen:
  463. cls:
  464.     call    print
  465.     db    1ah,0
  466.     ret
  467.  
  468. ;Inverse video on:
  469. invon:
  470.     call    print
  471.     db    esc,')',0
  472.     ret
  473.  
  474. ;Inverse video off:
  475. invoff:
  476.     call    print
  477.     db    esc,'(',0
  478.     ret
  479.  
  480. ;Turn off cursor:
  481. hide:
  482.     ret
  483.  
  484. ;Turn on cursor:
  485. show:
  486.     ret
  487.  
  488. ;Save cursor position:
  489. savecu:
  490.     ret
  491.  
  492. ;Restore cursor position:
  493. rescu:
  494.     ret
  495.  
  496. ;****************************************************************************
  497.  
  498. ;Service modem interrupt:
  499. mint:
  500.     ret            ; my system doesn't need this
  501.  
  502. ;Initialise interrupt vectors:
  503. invec:
  504.     ret            ; ditto
  505.  
  506. ;De-initialise interrupt vectors:
  507. dinvec:
  508.     ret            ; ditto
  509.  
  510. ;****************** End of user-defined code ********************************
  511. ; Don't change anything below this point. We needed some assembly language
  512. ; stuff for speed, and this seemed like a good place to put it.
  513.  
  514. ;Modem character test for 100 ms
  515. mrd:
  516.     push    bc        ; save bc
  517.     ld    bc,100        ; set limit
  518. mrd1:
  519.     call    mirdy        ; char at modem?
  520.     jr    nz,mrd2        ; yes, exit
  521.     ld    hl,1        ; else wait 1ms
  522.     call    waithlms
  523.     dec    bc        ; loop till done
  524.     ld    a,b
  525.     or    c
  526.     jr    nz,mrd1
  527.     ld    hl,0        ; none there, result=0
  528.     xor    a
  529. mrd2:
  530.     pop    bc
  531.     ret
  532.  
  533. ; Inline print routine: destroys A and HL
  534.  
  535. print:
  536.     ex    (sp),hl        ; get address of string
  537. ploop:
  538.     ld    a,(hl)        ; get next
  539.     inc    hl        ; bump pointer
  540.     or    a        ; done if zero
  541.     jr    z,pdone
  542.     call    cout        ; else print
  543.     jr    ploop        ; and loop
  544. pdone:
  545.     ex    (sp),hl        ; restore return address
  546.     ret            ; and quit
  547.  
  548. ;
  549. ;Output a character in A to the console
  550. ;
  551. cout:
  552.     push    bc        ; save regs
  553.     push    de
  554.     push    hl
  555.     ld    e,a        ; character to E
  556.     ld    c,2
  557.     call    bdos        ; print it
  558.     pop    hl
  559.     pop    de
  560.     pop    bc
  561.     ret
  562.  
  563. ;Wait(seconds)
  564. wait:
  565.     ld    hl,2
  566.     add    hl,sp
  567.     ex    de,hl        ; get delay size
  568.     call    getparm
  569.                 ; fall thru to..
  570. ;Wait seconds in HL
  571. waithls:
  572.     push    bc        ; save bc
  573.     push    de        ; de
  574.     push    ix        ; and ix
  575.     ld    ix,0        ; then point ix to 0
  576.                 ; so we don't upset memory-mapped i/o
  577.  
  578. ;Calculate values for loop constants. Need to have two loops to avoid
  579. ;   16-bit overflow with clock speeds above 9 MHz.
  580.  
  581. outerval    equ    (clkspd / 10) + 1
  582. innerval    equ    (6667 / outerval) * clkspd
  583.  
  584. wait10:
  585.     ld    b,outerval
  586.  
  587. wait11:
  588.     ld    de,innerval
  589.  
  590. wait12:
  591.     bit    0,(ix)        ; time-wasters
  592.     bit    0,(ix)
  593.     bit    0,(ix)        ; 20 T-states each
  594.     bit    0,(ix)
  595.     bit    0,(ix)
  596.     bit    0,(ix)
  597.     dec    de
  598.     ld    a,e
  599.     ld    a,d
  600.     or    e
  601.     jr    nz,wait12    ; 150 T-states per inner loop
  602.     djnz    wait11        ; decrement outer loop
  603.     dec    hl        ; ok, decrement count in hl
  604.     ld    a,h
  605.     or    l
  606.     jr    nz,wait10
  607.     pop    ix        ; done -- restore ix
  608.     pop    de        ; de
  609.     pop    bc        ; and bc
  610.     ret
  611.  
  612. ;Wait milliseconds
  613. mswait:
  614.     ld    hl,2
  615.     add    hl,sp
  616.     ex    de,hl        ; get delay size
  617.     call    getparm
  618.                 ; fall thru to..
  619. ;Wait milliseconds in HL
  620. waithlms:
  621.     push    de
  622. w1ms0:
  623.     ld    de,39 *    clkspd
  624. w1ms1:
  625.     dec    de
  626.     ld    a,d
  627.     or    e
  628.     jr    nz,w1ms1
  629.     dec    hl
  630.     ld    a,h
  631.     or    l
  632.     jr    nz,w1ms0
  633.     pop    de
  634.     ret
  635.  
  636. ;Get next parameter from (de) into hl
  637. getparm:
  638.     ex    de,hl        ; get address into hl
  639.     ld    e,(hl)        ; get lo
  640.     inc    hl
  641.     ld    d,(hl)        ; then hi
  642.     inc    hl        ; bump for next
  643.     ex    de,hl        ; result in hl, address still in de
  644.     ret
  645.  
  646.      if    ($ - codebgn) gt ovsize
  647. toobig:    jp    errval        ; Overlay too large!
  648.      endif
  649.  
  650.     end
  651.