home *** CD-ROM | disk | FTP | other *** search
/ HAM Radio 3 / hamradioversion3.0examsandprograms1992.iso / misc / 9q920411 / pivec.asm < prev    next >
Assembly Source File  |  1992-04-03  |  3KB  |  198 lines

  1. ; :ts=8
  2.     .MODEL    MEMMOD,C
  3.     LOCALS
  4.     %MACS
  5.     .LALL
  6.  
  7.     extrn    Stktop,Spsave,Sssave,piint:proc,doret:proc,eoi:proc
  8.  
  9. DMAEN    equ    4
  10.  
  11.     .DATA
  12.  
  13.     public    acc_delay
  14. acc_delay dw    0
  15.  
  16.  
  17.     .CODE
  18. dbase    dw    @Data        ; save loc for ds (must be in code segment)
  19.  
  20.     public    mloop
  21. mloop    proc
  22.     mov cx,65535
  23. Loop7:
  24.     nop
  25.     loop Loop7
  26.     ret
  27. mloop    endp
  28.  
  29.     public    wrtscc
  30. wrtscc    proc
  31.     arg    cbase:word,ctl:word,reg:word,val:word
  32.  
  33.     pushf
  34.     cli
  35.  
  36.     mov dx,cbase    ; get address of dma enable port
  37.     add dx,DMAEN
  38.     mov al,0    ; Write a 0 to disable DMA while we touch the scc
  39.     out dx,al
  40.  
  41.     mov cx,acc_delay
  42. Loop1:    nop
  43.     loop Loop1
  44.  
  45.     mov dx,ctl    ; Get address of scc control reg
  46.     mov ax,reg    ; Select register
  47.     out dx,al
  48.  
  49.     mov cx,acc_delay
  50. Loop2:    nop
  51.     loop Loop2
  52.  
  53.     mov ax,val    ; Output value
  54.     out dx,al
  55.  
  56.     mov cx,acc_delay
  57. Loop3:    nop
  58.     loop Loop3
  59.  
  60.     mov dx,cbase    ; get address of dma enable port
  61.     add dx,DMAEN
  62.     mov al,1    ; Enable DMA
  63.     out dx,al
  64.  
  65.     popf
  66.     ret
  67. wrtscc    endp
  68.  
  69.     public    rdscc
  70. rdscc    proc
  71.     arg    cbase:word,ctl:word,reg:byte
  72.     pushf
  73.     cli
  74.  
  75.     mov dx,cbase    ; Get address of dma enable port
  76.     add dx,DMAEN;
  77.     mov al,0    ; Disable DMA while we touch the scc
  78.     out dx,al;
  79.  
  80.     mov cx,acc_delay
  81. Loop4:    nop
  82.     loop Loop4
  83.  
  84.     mov dx,ctl    ; Get address of SCC control reg
  85.     mov al,reg    ; Select register
  86.     out dx,al;
  87.  
  88.     mov cx,acc_delay
  89. Loop5:    nop
  90.     loop Loop5
  91.  
  92.     in al,dx    ; read register
  93.     xor ah,ah
  94.     push ax        ; save return value
  95.  
  96.     mov cx,acc_delay
  97. Loop6:    nop
  98.     loop Loop6
  99.  
  100.     mov dx,cbase    ; get address of dma enable port
  101.     add dx,DMAEN
  102.     mov al,1    ; Enable DMA
  103.     out dx,al
  104.  
  105.     pop    ax    ; recover return value
  106.     popf
  107.     ret
  108. rdscc    endp
  109.  
  110. ; pi0vec - Pi card #0 interrupt handler
  111.     public    pi0vec
  112.     label    pi0vec far
  113.     push    ds        ; save on user stack
  114.     mov    ds,cs:dbase    ; establish interrupt data segment
  115.  
  116.     mov    Sssave,ss    ; stash user stack context
  117.     mov    Spsave,sp
  118.  
  119.     mov    ss,cs:dbase
  120.     lea    sp,Stktop
  121.  
  122.     push    ax        ; save user regs on interrupt stack
  123.     push    bx
  124.     push    cx
  125.     push    dx
  126.     push    bp
  127.     push    si
  128.     push    di
  129.     push    es
  130.     call    eoi
  131.  
  132.     mov    ax,0        ; arg for service routine
  133.     push    ax
  134.     call    piint
  135.     inc    sp
  136.     inc    sp
  137.     jmp    doret
  138.  
  139. ; pi1vec - Pi card #1 interrupt handler
  140.     public    pi1vec
  141.     label    pi1vec far
  142.     push    ds        ; save on user stack
  143.     mov    ds,cs:dbase    ; establish interrupt data segment
  144.  
  145.     mov    Sssave,ss    ; stash user stack context
  146.     mov    Spsave,sp
  147.  
  148.     mov    ss,cs:dbase
  149.     lea    sp,Stktop
  150.  
  151.     push    ax        ; save user regs on interrupt stack
  152.     push    bx
  153.     push    cx
  154.     push    dx
  155.     push    bp
  156.     push    si
  157.     push    di
  158.     push    es
  159.     call    eoi
  160.  
  161.     mov    ax,1        ; arg for service routine
  162.     push    ax
  163.     call    piint
  164.     inc    sp
  165.     inc    sp
  166.     jmp    doret
  167.  
  168. ; pi2vec - Pi card #2 interrupt handler
  169.     public    pi2vec
  170.     label    pi2vec far
  171.     push    ds        ; save on user stack
  172.     mov    ds,cs:dbase    ; establish interrupt data segment
  173.  
  174.     mov    Sssave,ss    ; stash user stack context
  175.     mov    Spsave,sp
  176.  
  177.     mov    ss,cs:dbase
  178.     lea    sp,Stktop
  179.  
  180.     push    ax        ; save user regs on interrupt stack
  181.     push    bx
  182.     push    cx
  183.     push    dx
  184.     push    bp
  185.     push    si
  186.     push    di
  187.     push    es
  188.     call    eoi
  189.  
  190.     mov    ax,2        ; arg for service routine
  191.     push    ax
  192.     call    piint
  193.     inc    sp
  194.     inc    sp
  195.     jmp    doret
  196.  
  197.     end
  198.