home *** CD-ROM | disk | FTP | other *** search
/ Creative Computers / CreativeComputers.iso / shareware / text / dvi_3.62 / source / dvisrc.lha / dviprn.s < prev    next >
Text File  |  1993-07-09  |  4KB  |  196 lines

  1.  
  2. ; Datei: DVIPRN.S
  3. ; Autor: Ingo Eichenseher
  4. ; Letzte Aenderung: 09.04.1991 07:29
  5.  
  6.  
  7. mfpvec        equ        $100        ; Interruptvector table for mfp
  8. _hz_200        equ        $4BA        ; Anzahl der 200Hz Interrupts
  9. psg            equ        $FF8800        ; Sound chip
  10. mfp            equ        $FFFA01        ; Multi functional peripheral chip
  11. gpip        equ        $FFFA01        ; General purpose interrupt port
  12. aer            equ        $FFFA03        ; Active edge register
  13. ddr            equ        $FFFA05        ; Data direction register
  14. ierb        equ        $FFFA09        ; Interrupt enable register B
  15. iprb        equ        $FFFA0D        ; Interrupt pending register B
  16. isrb        equ        $FFFA11        ; Interrupt service register B
  17. imrb        equ        $FFFA15        ; Interrupt mask register B
  18.  
  19. buf_size    equ        16384
  20. wait_time    equ        2000        ; ca. 10 Sekunden
  21.  
  22.             export    dviprn, install, destall
  23.             
  24.             code
  25.  
  26. install:    tst.l    old_trap
  27.             bne.b    no_install
  28.             pea        trap_rout
  29.             move.w    #35,-(sp)        ; trap #3
  30.             move.w    #5,-(sp)
  31.             trap    #13
  32.             addq    #8,sp
  33.             move.l    d0,old_trap
  34.             pea        init
  35.             move.w    #$26,-(sp)
  36.             trap    #14
  37.             addq    #6,sp
  38. no_install:    rts
  39.             
  40. destall:    tst.l    old_trap
  41.             beq.b    no_destall
  42.             move.l    old_trap,-(sp)
  43.             move.w    #35,-(sp)        ; trap #3
  44.             move.w    #5,-(sp)
  45.             trap    #13
  46.             clr.l    old_trap
  47.             addq    #8,sp
  48.             pea        exit
  49.             move.w    #$26,-(sp)
  50.             trap    #14
  51.             addq    #6,sp
  52. no_destall:    rts
  53.  
  54. macro        inc        reg
  55.             local    ok
  56.             addq    #1,reg
  57.             cmp        #buf_size,reg
  58.             blt.b    ok
  59.             clr        reg
  60. ok:
  61. endm
  62.             
  63. dviprn:        trap    #3
  64.             rts
  65.  
  66.             super
  67. trap_rout:    movem.l    d1-d2/a0-a2,-(sp)
  68.             move.w    sr,save_sr
  69.             move.w    #$2700,sr
  70.  
  71.             btst.b    #0,gpip
  72.             bne.b    buffered
  73.             tst.b    ready
  74.             bne        direct
  75.  
  76. buffered:    clr.b    ready
  77.             move.w    in_ptr,d1
  78.             inc        d1
  79.             cmp        out_ptr,d1
  80.             bne.b    time_ok
  81.  
  82.             move.l    _hz_200,d2
  83.             add.l    #wait_time,d2
  84.             move.w    save_sr,sr
  85.             
  86. wait_buf:    cmp        out_ptr,d1
  87.             bne.b    time_ok
  88.             cmp.l    _hz_200,d2
  89.             bcc.b    wait_buf
  90.             clr        in_ptr
  91.             clr        out_ptr
  92.             st.b    ready
  93.             movem.l    (sp)+,d1-d2/a0-a2
  94.             moveq    #-1,d0
  95.             rte
  96.  
  97. time_ok:    move.w    #$2700,sr
  98.             lea        buffer,a0
  99.             move.w    in_ptr,d2
  100.             move.b    d0,0(a0,d2.w)
  101.             move.w    d1,in_ptr
  102.             clr.l    d0
  103.             movem.l    (sp)+,d1-d2/a0-a2
  104.             rte
  105.             
  106. direct:        clr.b    ready
  107.             lea        psg,a0        ; psg Register select
  108.             move.b    #15,(a0)    ; select register #15 (=Port B)
  109.             move.b    d0,2(a0)    ; move data to port B
  110.             move.b    #14,(a0)    ; select register #14 (=Port A)
  111.             move.b    (a0),d1        ; read Port A
  112.             bclr    #5,d1        ; clear data strobe bit
  113.             move.b    d1,2(a0)    ; write Port A
  114.             bset    #5,d1        ; set data strobe bit
  115.             move.b    d1,2(a0)    ; write Port A
  116.             clr.l    d0
  117.             movem.l    (sp)+,d1-d2/a0-a2
  118.             rte
  119.  
  120.             user
  121.             
  122. init:        lea        psg,a0        ; psg Register select
  123.             move.b    #7,(a0)        ; select Register #7
  124.             move.b    (a0),d1        ; get Register #7
  125.             or.b    #$80,d1        ; set bit for Port B output
  126.             move.b    d1,2(a0)    ; write to psg write register
  127.             
  128.             clr        in_ptr
  129.             clr        out_ptr
  130.             st.b    ready
  131.  
  132.             move.l    mfpvec,oldmfpv
  133.             move.l    #busyint,mfpvec
  134.             bclr.b    #0,aer        ; interrupt at high->low for busy
  135.             bclr.b    #0,ddr        ; select busy for input
  136.             bset.b    #0,ierb        ; enable interrupt
  137.             bset.b    #0,imrb        ; another enable
  138.             move.b    #-2,iprb
  139.             move.b    #-2,isrb
  140.             rts
  141.             
  142.             super
  143. exit:        movem.l    d0/d1,-(sp)
  144. exitl:        move.l    _hz_200,d1
  145.             add.l    #wait_time,d1
  146.             move.w    out_ptr,d0
  147. exitl1:        tst.b    ready
  148.             bne.b    exit1
  149.             cmp.w    out_ptr,d0
  150.             bne.b    exitl
  151.             cmp.l    _hz_200,d1
  152.             bcc.b    exitl1    
  153. exit1:        bclr.b    #0,ierb
  154.             move.l    oldmfpv,mfpvec
  155.             movem.l    (sp)+,d0/d1
  156.             rts
  157.  
  158. busyint:    movem.l    d0/d1/a0,-(sp)
  159.             move    out_ptr,d1
  160.             cmp        in_ptr,d1
  161.             seq.b    ready
  162.             beq.b    buf_empty
  163.             lea        buffer,a0
  164.             move.b    0(a0,d1.w),d0
  165.             inc        d1
  166.             move    d1,out_ptr
  167.             
  168.             lea        psg,a0        ; psg Register select
  169.             move.b    #15,(a0)    ; select register #15 (=Port B)
  170.             move.b    d0,2(a0)    ; move data to port B
  171.             move.b    #14,(a0)    ; select register #14 (=Port A)
  172.             move.b    (a0),d1        ; read Port A
  173.             bclr    #5,d1        ; clear data strobe bit
  174.             move.b    d1,2(a0)    ; write Port A
  175.             bset    #5,d1        ; set data strobe bit
  176.             move.b    d1,2(a0)    ; write Port A
  177.             
  178. buf_empty:    move.b    #-2,isrb
  179.             movem.l    (sp)+,d0/d1/a0
  180.             rte
  181.             
  182.             user
  183.             
  184.             bss            
  185.  
  186. old_trap:    ds.l    1
  187. oldmfpv:    ds.l    1
  188. in_ptr:        ds.w    1
  189. out_ptr:    ds.w    1
  190. save_sr:    ds.w    1
  191. buffer:        ds.b    buf_size
  192. cdata:        ds.b    1
  193. ready:        ds.b    1
  194.  
  195.             end        
  196.