1/* $NetBSD: hdfd_intr.s,v 1.7 2001/09/08 11:15:35 thomas Exp $ 2 3/* 4 * Copyright (c) 1996 Leo Weppelman. 5 * All rights reserved. 6 * 7 * This code is derived from software contributed to Berkeley by 8 * the Systems Programming Group of the University of Utah Computer 9 * Science Department. 10 * 11 * Redistribution and use in source and binary forms, with or without 12 * modification, are permitted provided that the following conditions 13 * are met: 14 * 1. Redistributions of source code must retain the above copyright 15 * notice, this list of conditions and the following disclaimer. 16 * 2. Redistributions in binary form must reproduce the above copyright 17 * notice, this list of conditions and the following disclaimer in the 18 * documentation and/or other materials provided with the distribution. 19 * 3. All advertising materials mentioning features or use of this software 20 * must display the following acknowledgement: 21 * This product includes software developed by Leo Weppelman. 22 * 4. Neither the name of the University nor the names of its contributors 23 * may be used to endorse or promote products derived from this software 24 * without specific prior written permission. 25 * 26 * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND 27 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 28 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 29 * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE 30 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 31 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 32 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 33 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 34 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 35 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 36 * SUCH DAMAGE. 37 * 38 */ 39 40#include "assym.h" 41#include <machine/asm.h> 42#define ASSEMBLER /* XXX */ 43#include <atari/dev/hdfdreg.h> 44 45 .text 46 .globl _C_LABEL(fddmaaddr) 47 .globl _C_LABEL(fdio_addr),_C_LABEL(fddmalen) 48 49/* 50 * Entry point when there is no fifo. Handles the read/write 51 * interrupts a bit faster because it *knows* that there is only 52 * one character waiting. 53 */ 54ENTRY_NOPROFILE(mfp_hdfd_nf) 55 addql #1,nintr | add another interrupt 56 57 moveml %d0-%d1/%a0-%a1,%sp@- | Save scratch registers 58 movl _C_LABEL(fdio_addr),%a0 | Get base of fdc registers 59 movb %a0@(fdsts),%d0 | Get fdsts 60 btst #5,%d0 | Dma active? 61 jeq hdfdc_norm | No, normal interrupt 62 tstl _C_LABEL(fddmalen) | Bytecount zero? 63 jeq hdfdc_norm | Yes -> normal interrupt 64 65 movl _C_LABEL(fddmaaddr),%a1 | a1 = dmabuffer 66 btst #6,%d0 | Read? 67 jeq hdfd_wrt_nf | No, write 68hdfd_rd_nf: 69 movb %a0@(fddata),%a1@+ | Get a byte 701: 71 subql #1, _C_LABEL(fddmalen) | decrement bytecount 72 movl %a1,_C_LABEL(fddmaaddr) | update dma pointer 73| addql #1,_cnt+V_INTR | chalk up another interrupt 74 moveml %sp@+,%d0-%d1/%a0-%a1 75 rte 76hdfd_wrt_nf: 77 movb %a1@+,%a0@(fddata) | Push a byte 78 jra 1b | And get out... 79 80/* 81 * Systems *with* fifo's enter here. 82 */ 83ENTRY_NOPROFILE(mfp_hdfd_fifo) 84 addql #1,_C_LABEL(intrcnt_user)+88 | add another interrupt 85 86 moveml %d0-%d1/%a0-%a1,%sp@- | Save scratch registers 87 movl _C_LABEL(fdio_addr),%a0 | Get base of fdc registers 88 movb %a0@(fdsts),%d0 | Get fdsts 89 btst #5,%d0 | Dma active? 90 jeq hdfdc_norm | No, normal interrupt 91 movl _C_LABEL(fddmaaddr),%a1 | a1 = dmabuffer 92 btst #6,%d0 | Read? 93 jeq hdfd_wrt | No, write 94 95hdfd_rd: 96 tstl _C_LABEL(fddmalen) | Bytecount zero? 97 jeq hdfdc1 | Yes -> done 98 movb %a0@(fddata),%a1@+ | Get a byte 99 subql #1, _C_LABEL(fddmalen) | decrement bytecount 100 movb %a0@(fdsts),%d0 | Get fdsts 101 andb #0xa0,%d0 | both NE7_NDM and NE7_RQM active? 102 cmpb #0xa0,%d0 103 jne hdfdc1 | No, end of this batch 104 jra hdfd_rd 105 106hdfd_wrt: 107 tstl _C_LABEL(fddmalen) | Bytecount zero? 108 jeq hdfdc1 | Yes -> done 109 movb %a1@+,%a0@(fddata) | Push a byte 110 subql #1, _C_LABEL(fddmalen) | decrement bytecount 111 jra hdfdc1 112 movb %a0@(fdsts),%d0 | Get fdsts 113 andb #0xa0,%d0 | both NE7_NDM and NE7_RQM active? 114 cmpb #0xa0,%d0 115 jne hdfdc1 | No, end of this batch 116 jra hdfd_wrt 117 118hdfdc1: 119 movl %a1,_C_LABEL(fddmaaddr) | update buffer pointer 120 btst #5,%d0 | Dma still active? 121 jeq hdfdc_norm | No -> take normal interrupt 122 123 /* 124 * Exit for read/write interrupts. Calling 'rei' this often 125 * seems wrong.... 126 */ 127hdfdc_xit: 128 addql #1,_C_LABEL(uvmexp)+UVMEXP_INTRS 129 moveml %sp@+,%d0-%d1/%a0-%a1 130 rte 131 132 /* 133 * No (more) data transfer interrupts. Do the normal 134 * stuff. 135 */ 136hdfdc_norm: 137 tstl nintr 138 jeq 0f 139 movl nintr,%d0 140 clrl nintr 141 addl %d0, _C_LABEL(intrcnt_user)+88 | add another interrupt 142 addl %d0,_C_LABEL(uvmexp)+UVMEXP_INTRS 1430: jbsr _C_LABEL(fdc_ctrl_intr) | handle interrupt 144 moveml %sp@+,%d0-%d1/%a0-%a1 | and saved registers 145 jra _ASM_LABEL(rei) 146 147 .data 148nintr: 149 .long 0 150