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 / ENTERPRS / CPM / TERMS / ZMP15.PMA / ZMOMYZ80.Z80 < prev    next >
Text File  |  1979-12-31  |  13KB  |  650 lines

  1. ;-----------------------------------------------------------------------------
  2. ;
  3. ;    Overlay for ZMP (Z-Modem Program)
  4. ;
  5. ;    Name    ZMOMYZ80.Z80
  6. ;
  7. ;    Dated Feb 27, 1992
  8. ;
  9. ;    VERSION 0.2 - Testing, but seems to work.
  10. ;
  11. ;    Written by -
  12. ;     Simeon Cran, c/o Z-Node 62, 061-9-450-0200, Perth, Western Australia.
  13. ;
  14. ;-----------------------------------------------------------------------------
  15. ;
  16. ; Notes on modifying this file (from Ron Murray):
  17. ;
  18. ;    C requires that functions do not change either index register (IX or IY).
  19. ; If your overlay requires either of these to be changed, ensure they are
  20. ; restored to the original values on return.
  21. ;    Since collecting parameters from C functions can be tricky, only change
  22. ; the parts marked 'Insert your own code here'. Do NOT modify the jump
  23. ; table at the start. Do NOT modify the entry/exit sections of each
  24. ; function. Do NOT pass 'GO'. Do NOT collect $200.
  25. ;
  26. ;    An inline print routine is provided for printing strings
  27. ; in the usual way: usage is
  28. ;
  29. ;    call    print
  30. ;    db    'required string',0
  31. ;
  32. ;---------------------------------------------------------------------------
  33.  
  34. false    equ    0
  35. true    equ    not false
  36. EXTBIOS    equ    0fffdh
  37. ;------------------------------------------------------------------------------
  38.  
  39. ; User-set variables: 
  40.  
  41. clkspd    equ    10        ; Processor clock speed in MHz
  42. debug    equ    false        ; to allow debugging of overlay with Z8E etc.
  43.  
  44. ;Set the following two equates to the drive and user area which will contain
  45. ;   ZMP's .OVR files, .CFG file, .FON file and .HLP file. Set both to zero
  46. ;   (null) to locate them on the drive from which ZMP was invoked.
  47.  
  48. overdrive    equ    'A'    ; Drive to find overlay files on ('A'-'P')
  49. overuser    equ    13    ; User area to find files
  50.  
  51. ;------------------------------------------------------------------------------
  52.  
  53.  
  54. ; NOT user-set variables
  55.  
  56. userdef    equ    0145h        ; origin of this overlay
  57.                 ; This address should not change with
  58.                 ; subsequent revisions.
  59. mspeed    equ    03ch        ; location of current baud rate. 
  60. ovsize    equ    0400h        ; max size of this overlay
  61.  
  62. ;;;    .hd64            ; use 64180 code
  63.     aseg            ; absolute
  64.  
  65.      if    debug
  66.     org    100h        ; so you can debug it with cebug, zsid, etc
  67.      else
  68.     org    userdef
  69.      endif
  70.  
  71.  
  72. esc    equ    1bh
  73. ctrlq    equ    11h
  74. cr    equ    0dh
  75. lf    equ    0ah
  76. bdos    equ    5
  77.  
  78.  
  79. codebgn    equ    $
  80.  
  81. ;Jump table for the overlay: do NOT change this
  82. jump_tab:
  83.     jp    scrnpr        ; screen print
  84.     jp    mrd        ; modem read with timeout
  85.     jp    mchin        ; get a character from modem
  86.     jp    mchout        ; send a character to the modem
  87.     jp    mordy        ; test for tx buffer empty
  88.     jp    mirdy        ; test for character received
  89.     jp    sndbrk        ; send break
  90.     jp    cursadd        ; cursor addressing
  91.     jp    cls        ; clear screen
  92.     jp    invon        ; inverse video on
  93.     jp    invoff        ; inverse video off
  94.     jp    hide        ; hide cursor
  95.     jp    show        ; show cursor
  96.     jp    savecu        ; save cursor position
  97.     jp    rescu        ; restore cursor position
  98.     jp    mint        ; service modem interrupt
  99.     jp    invec        ; initialise interrupt vectors
  100.     jp    dinvec        ; de-initialise interrupt vectors
  101.     jp    mdmerr        ; test uart flags for error
  102.     jp    dtron        ; turn DTR on
  103.     jp    dtroff        ; turn DTR OFF
  104.     jp    init        ; initialise uart
  105.     jp    wait        ; wait seconds
  106.     jp    mswait        ; wait milliseconds
  107.     jp    userin        ; user-defined entry routine
  108.     jp    userout        ; user-defined exit routine
  109.     jp    getvars        ; get system variables
  110.     jp    setport        ; set port (1 or 2)
  111.  
  112. ; Spare jumps for compatibility with future versions
  113.     jp    spare        ; spare for later use
  114.     jp    spare        ; spare for later use
  115.     jp    spare        ; spare for later use
  116.     jp    spare        ; spare for later use
  117.     jp    spare        ; spare for later use
  118.     jp    spare        ; spare for later use
  119.  
  120. ;
  121. ; Main code starts here
  122. ;
  123. ;Screen print function
  124. scrnpr:
  125.                 ; <== Insert your own code here
  126.     call    print
  127.     db    'This function not supported.',cr,lf,0
  128.                 ; <== End of your own code
  129. spare:
  130.     ret
  131.  
  132. ; User-defined entry routine: leave empty if not needed
  133. userin:
  134.     ret
  135.  
  136. ; User-defined exit routine: leave empty if not needed
  137. userout:
  138.     ret
  139.  
  140.  
  141. ;Get a character from the modem: return in HL
  142. mchin:
  143.     push    bc
  144.     ld    a,(portbase+0)
  145.     ld    c,a
  146.     in    a,(c)        ; Get the character
  147.     ld    l,a        ; put it in HL
  148.     ld    h,0
  149.     or    a        ; set/clear Z
  150.     pop    bc
  151.     ret
  152.  
  153.  
  154. ;Send a character to the modem
  155. mchout:
  156.     ld    hl,2        ; get the character
  157.     add    hl,sp
  158.     push    bc
  159.     ld    a,(portbase+0)
  160.     ld    c,a
  161.     ld    a,(hl)
  162.     out    (c),a
  163.     pop    bc
  164.     ret            ; done
  165.  
  166.     
  167. ;Test for output ready: return TRUE (1) in HL if ok
  168. mordy:
  169.     push    bc
  170.     ld    a,(portbase+5)
  171.     ld    c,a
  172.     ld    hl,1        ; Assume ready
  173.     tstio    20h
  174.     jr    nz,mordyyes    ; Jump if ready
  175.     dec    hl
  176. mordyyes:
  177.     ld    a,l        ; set/clear Z
  178.     or    a
  179.     pop    bc
  180.     ret
  181.  
  182.  
  183. ;Test for character at modem: return TRUE (1) in HL if so
  184. mirdy:
  185.     push    bc
  186.     ld    hl,0        ; Assume no character
  187.     ld    a,(portbase+5)
  188.     ld    c,a
  189.     tstio    01h
  190.     jr    z,mirdyno    ; Jump if not ready 
  191.     inc    hl
  192. mirdyno:
  193.     ld    a,l        ; set/clear Z
  194.     or    a
  195.     pop    bc
  196.     ret
  197.  
  198.             
  199. ;Send a break to the modem.
  200. sndbrk:
  201.     ld    a,(portbase+3)
  202.     ld    c,a
  203.     in    a,(c)
  204.     or    40h        ; Set bit to turn break on
  205.     out    (c),a
  206.     push    bc
  207.     ld    hl,300        ; wait 300 mS
  208.     call    waithlms
  209.     pop    bc
  210.     in    a,(c)
  211.     and    10111111b
  212.     out    (c),a
  213.     ret
  214. ;
  215. ;Test UART flags for error: return TRUE (1) in HL if error.
  216. mdmerr:    push    bc
  217.     ld    hl,0        ; Assume no error
  218.     ld    a,(portbase+5)
  219.     ld    c,a
  220.     tstio    00011110b
  221.     jr    z,mdmerrNO
  222.     inc    hl
  223. mdmerrNO:
  224.     ld    a,l        ; set/clear Z
  225.     or    a
  226.     pop    bc
  227.     ret
  228.  
  229.  
  230. ;Turn DTR ON
  231. dtron:    ld    a,(portbase+4)
  232.     ld    c,a
  233.     in    a,(c)
  234.     bit    0,a
  235.     ret    nz        ; Return if already on
  236.     or    1        ; Turn DTR on
  237.     out    (c),a
  238.     ret
  239.  
  240.  
  241. ;Turn DTR OFF
  242. dtroff:
  243.     ld    a,(portbase+4)
  244.     ld    c,a
  245.     in    a,(c)
  246.     bit    0,a
  247.     ret    z        ; Return if already off
  248.     and    11111110b
  249.     out    (c),a
  250.     ret
  251.  
  252.  
  253.  
  254. ;Initialise the uart
  255.  
  256. init:    ld    hl,2        ; get parameters
  257.     add    hl,sp
  258.     ex    de,hl
  259.     call    getparm        ; in HL
  260.     ld    (brate),hl    ; baud rate
  261.     call    getparm
  262.     ld    (parity),hl    ; parity
  263.     call    getparm
  264.     ld    (data),hl    ; data bits (BINARY 7 or 8)
  265.     call    getparm
  266.     ld    (stop),hl    ; stop bits (BINARY 1 or 2)
  267.     ld    (initflg),hl    ; Set the initflag
  268. initagain:
  269.     push    bc
  270.     push    de
  271.     ld    a,(portbase+1)
  272.     ld    c,a
  273.     xor    a
  274.     out    (c),a        ; Prevent interrupts
  275.     ld    b,10011111b    ; Line control register value set for:
  276.                 ; DLAB access
  277.                 ; Break off
  278.                 ; Parity unstuck
  279.                 ; Even...
  280.                 ; Parity on
  281.                 ; 2 stop bits
  282.                 ; 8 data bits
  283.     ld    a,(data)    ; Get number of data bits (7,8)
  284.     cp    7
  285.     jr    z,data7
  286.     set    0,b        ; Make it 8 bits
  287. data7:
  288.     ld    a,(stop)    ; Get number of stop bits
  289.     dec    a
  290.     jr    nz,stop2
  291.     res    2,b
  292. stop2:
  293.     ld    a,(parity)
  294.     cp    'E'
  295.     jr    z,parityE
  296.     cp    'O'
  297.     jr    z,parityO
  298. ; Make it no parity
  299.     res    3,b
  300.     jr    parityE
  301. parityO:
  302.     res    4,b
  303. parityE:
  304.     ld    a,(portbase+3)
  305.     ld    c,a
  306.     ld    a,b
  307.     out    (c),a        ; Output it ready to set baudrate
  308.  
  309.     ld    hl,(brate)
  310.     ld    c,l
  311.     add    hl,hl        ; Double for word offset
  312.     ld    de,baudtbl
  313.     add    hl,de        ; Point to correct entry
  314.     ld    e,(hl)
  315.     inc    hl
  316.     ld    d,(hl)
  317.     ld    a,d
  318.     or    e
  319.     jr    z,nobaud
  320.     ld    a,c
  321.     ld    (mspeed),a
  322.     ld    a,(portbase+0)
  323.     ld    c,a
  324.     out    (c),e        ; Do low byte
  325.     inc    c
  326.     out    (c),d        ; Do high byte
  327. nobaud:
  328.     ld    a,(portbase+3)
  329.     ld    c,a
  330.     ld    a,b        ; Restore DLAB
  331.     res    7,a
  332.     out    (c),a
  333.     ld    a,(portbase+4)
  334.     ld    c,a
  335.     in    a,(c)
  336.     or    2        ; Make sure DSR is on
  337.     out    (c),a
  338.     call    dtron        ; Turn on DTR as well
  339.     pop    de
  340.     pop    bc
  341.     ret
  342. ;--------------------------------------------------------------------------
  343.  
  344. stop:    dw    1        ; stop bits
  345. parity:    dw    'N'        ; parity
  346. data:    dw    8        ; data bits
  347. brate:    dw    7        ; baud rate
  348.  
  349. baudtbl:dw    417h        ;110
  350.     dw    180h        ;300
  351.     dw    100h        ;450
  352.     dw    0c0h        ;600
  353.     dw    0a2h        ;710
  354.     dw    060h        ;1200
  355.     dw    030h        ;2400
  356.     dw    018h        ;4800
  357.     dw    0ch        ;9600
  358.     dw    06h        ;19200
  359.     dw    03        ;38400
  360.     dw    0
  361.     dw    0
  362.  
  363. portbase:    ; This table is to help access the correct port address
  364.     db    0,1,2,3,4,5,6,7
  365. initflg:
  366.     dw    0    ; Set when init is called.
  367. ;--------------------------------------------------------------------------
  368. ;Values of brate for each baud rate
  369. ;
  370. ; baud rate    brate    divisor
  371. ;
  372. ;   110         0    417h
  373. ;   300         1    180h
  374. ;   450         2
  375. ;   600         3    0c0h
  376. ;   710         4
  377. ;  1200         5    060h
  378. ;  2400         6    030h
  379. ;  4800         7    018h
  380. ;  9600         8    0ch
  381. ; 19200         9    06h
  382. ; 38400        10    03h
  383. ; 57600         11     -
  384. ; 76800         12     -
  385.  
  386. ;
  387. ; Set the port. ZMP supplies either 0 or 1 as a parameter. You're on your
  388. ; own here -- your system is bound to be different from any other! You may
  389. ; implement a software switch on all the modem-dependent routines, or perhaps
  390. ; you can have one or two centralised routines for accessing the UARTs and
  391. ; modify the code from this routine to select one or the other. (Who said
  392. ; there was anything wrong with self-modifying code?). If you have only one
  393. ; UART port, or if you don't want to go through all the hassles, just have
  394. ; this routine returning with no changes made. Note that ZMP calls this
  395. ; routine with both values for the port on initialisation.
  396. ;
  397. setport:
  398.     ld    hl,2        ; get port number
  399.     add    hl,sp
  400.     ex    de,hl
  401.     call    getparm        ; in HL (values are 0 and 1)
  402.     ld    a,l        ; Get the port number
  403.     ld    (port),a    ; Save current port number for later
  404.     ld    hl,portbase1    ; Assume port 1
  405.     or    a
  406.     jr    z,setport1    ; Jump if port 1
  407.     ld    hl,portbase2
  408. setport1:
  409.     ld    bc,8
  410.     ld    de,portbase
  411.     ldir            ; Copy the new port values    
  412.     ld    a,(initflg)
  413.     or    a
  414.     ret    z        ; If no port initialised, then don't do it.
  415.     jp    initagain    ; And make sure the port is initialised.
  416.  
  417. port:    dw    0
  418. portbase1:    db    0,1,2,3,4,5,6,7
  419. portbase2:    db    8,9,10,11,12,13,14,15
  420.  
  421.  
  422. ;****************************************************************************
  423. ;Video terminal sequences:
  424. ;Cursor addressing: 
  425. cursadd:
  426.     ld    hl,2        ; get parameters
  427.     add    hl,sp        ; Point to parameters
  428.     ld    e,(hl)        ; Get row
  429.     inc    hl
  430.     inc    hl
  431.     ld    d,(hl)        ; Get column
  432.     ld    hl,2020h    ; Offsets
  433.     add    hl,de
  434.     ld    (row),hl    ; Set row and column
  435.     call    print
  436.     db    esc,'='        ; ADM 3A leadin
  437. row:    db    0
  438. col:    db    0
  439.     db    0        ; Terminating 0
  440.     ret
  441.     
  442. ;Clear screen:
  443. cls:    ld    a,1ah
  444.     jp    cout
  445.  
  446. ;Inverse video on:
  447. invon:    call    print
  448.     db    esc,'G4',0
  449.     ret
  450.  
  451. ;Inverse video off:
  452. invoff:    call    print
  453.     db    esc,'G0',0
  454.     ret
  455.  
  456. ;Turn off cursor:
  457. hide:    call    print
  458.     db    esc,'.1',0
  459.     ret
  460.  
  461. ;Turn on cursor:
  462. show:    call    print
  463.     db    esc,'.3',0
  464.     ret
  465.  
  466. ;Save cursor position:
  467. savecu:    ret
  468.  
  469. ;Restore cursor position:
  470. rescu:    ret
  471.  
  472. ;****************************************************************************
  473.  
  474. ;Service modem interrupt:
  475. mint:    ret
  476.  
  477. ;Initialise interrupt vectors:
  478. invec:    ret
  479.  
  480. ;De-initialise interrupt vectors:
  481. dinvec:    ret
  482.  
  483. ;****************** End of user-defined code ********************************
  484. ;        Do not change anything below here.
  485.  
  486. ; For best results this code has been changed. Instead of calling mirdy
  487. ;  then waiting 100 times, it calls mirdy many more times and does no
  488. ;  waiting. The number of times to call mirdy needs to be changed according
  489. ;  to the speed of the system, but it doesn't matter too much if it calls too
  490. ;  many times.
  491.  
  492. ;Modem character test for 100 ms
  493. mrd:
  494. ;;    push    bc        ; save bc
  495. ;;    ld    bc,100        ; set limit
  496. ;;mrd1:
  497. ;;    call    mirdy        ; char at modem?
  498. ;;    jr    nz,mrd2        ; yes, exit
  499. ;;    ld    hl,1        ; else wait 1ms
  500. ;;    call    waithlms
  501. ;;    dec    bc        ; loop till done
  502. ;;    ld    a,b
  503. ;;    or    c
  504. ;;    jr    nz,mrd1
  505. ;;    ld    hl,0        ; none there, result=0
  506. ;;    xor    a
  507. ;;mrd2:
  508. ;;    pop    bc
  509. ;;    ret
  510.  
  511.     push    bc
  512.     ld    bc,4000        ;|||||
  513. mrd1:    call    mirdy
  514.     jr    nz,mrd2
  515.     dec    bc
  516.     ld    a,b
  517.     or    c
  518.     jr    nz,mrd1
  519.     ld    hl,0
  520.     xor    a
  521. mrd2:    pop    bc
  522.     ld    a,l
  523.     or    a
  524.     ret    
  525.  
  526. ; Inline print routine: destroys A and HL
  527.  
  528. print:    ex    (sp),hl        ; get address of string
  529. ploop:    ld    a,(hl)        ; get next
  530.     inc    hl        ; bump pointer
  531.     or    a        ; done if zero
  532.     jr    z,pdone
  533.     call    cout        ; else print
  534.     jr    ploop        ; and loop
  535.  
  536. pdone:    ex    (sp),hl        ; restore return address
  537.     ret            ; and quit
  538.  
  539. ;
  540. ;Output a character in A to the console
  541. ;
  542. cout:    push    bc        ; save regs
  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. wait:
  555.     ld    hl,2
  556.     add    hl,sp
  557.     ex    de,hl
  558.     call    getparm
  559.                 ; fall thru to..
  560. ;Wait seconds in HL
  561. waithls:
  562.     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. innerval    equ    (6667 / outerval) * clkspd
  573.  
  574. wait10:
  575.     ld    b,outerval
  576.  
  577. wait11:
  578.     ld    de,innerval
  579.  
  580. wait12:
  581.     bit    0,(ix)        ; time-wasters
  582.     bit    0,(ix)
  583.     bit    0,(ix)        ; 20 T-states each
  584.     bit    0,(ix)
  585.     bit    0,(ix)
  586.     bit    0,(ix)
  587.     dec    de
  588.     ld    a,e
  589.     ld    a,d
  590.     or    e
  591.     jr    nz,wait12    ; 150 T-states per inner loop
  592.     djnz    wait11        ; decrement outer loop
  593.     dec    hl        ; ok, decrement count in hl
  594.     ld    a,h
  595.     or    l
  596.     jr    nz,wait10
  597.     pop    ix        ; done -- restore ix
  598.     pop    de        ; de
  599.     pop    bc        ; and bc
  600.     ret
  601.  
  602. ;Wait milliseconds
  603. mswait:
  604.     ld    hl,2
  605.     add    hl,sp
  606.     ex    de,hl
  607.     call    getparm
  608.                 ; fall thru to..
  609. ;Wait milliseconds in HL
  610. waithlms:
  611.     push    de
  612. w1ms0:    ld    de,39 * clkspd
  613. w1ms1:    dec    de
  614.     ld    a,d
  615.     or    e
  616.     jr    nz,w1ms1
  617.     dec    hl
  618.     ld    a,h
  619.     or    l
  620.     jr    nz,w1ms0
  621.     pop    de
  622.     ret
  623.  
  624. ;Get next parameter from (de) into hl
  625. getparm:
  626.     ex    de,hl        ; get address into hl
  627.     ld    e,(hl)        ; get lo
  628.     inc    hl
  629.     ld    d,(hl)        ; then hi
  630.     inc    hl        ; bump for next
  631.     ex    de,hl        ; result in hl, address still in de
  632.     ret
  633.  
  634. ;Get address of user-defined variables
  635.  
  636. getvars:
  637.     ld    hl,uservars
  638.     ret
  639.  
  640. uservars:
  641.     dw    overdrive    ; .OVR etc. drive/user
  642.     dw    overuser
  643.  
  644.  
  645.      if    ($ - codebgn) gt ovsize
  646. toobig:    jp    errval        ; Overlay too large!
  647.      endif
  648.  
  649.     end
  650.