| /* 3b2_dmac.h: AT&T 3B2 Model 400 AM9517A DMA Controller Header | |
| Copyright (c) 2017, Seth J. Morabito | |
| Permission is hereby granted, free of charge, to any person | |
| obtaining a copy of this software and associated documentation | |
| files (the "Software"), to deal in the Software without | |
| restriction, including without limitation the rights to use, copy, | |
| modify, merge, publish, distribute, sublicense, and/or sell copies | |
| of the Software, and to permit persons to whom the Software is | |
| furnished to do so, subject to the following conditions: | |
| The above copyright notice and this permission notice shall be | |
| included in all copies or substantial portions of the Software. | |
| THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, | |
| EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF | |
| MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND | |
| NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS | |
| BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN | |
| ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN | |
| CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE | |
| SOFTWARE. | |
| Except as contained in this notice, the name of the author shall | |
| not be used in advertising or otherwise to promote the sale, use or | |
| other dealings in this Software without prior written authorization | |
| from the author. | |
| */ | |
| #ifndef _3B2_DMAC_H_ | |
| #define _3B2_DMAC_H_ | |
| #include "3b2_sysdev.h" | |
| #include "3b2_id.h" | |
| #include "3b2_if.h" | |
| /* DMA Controller */ | |
| #define DMACBASE 0x48000 | |
| #define DMACSIZE 0x11 | |
| /* DMA integrated disk page buffer */ | |
| #define DMAIDBASE 0x45000 | |
| #define DMAIDSIZE 0x5 | |
| /* DMA integrated uart A page buffer */ | |
| #define DMAIUABASE 0x46000 | |
| #define DMAIUASIZE 0x5 | |
| /* DMA integrated uart B page buffer */ | |
| #define DMAIUBBASE 0x47000 | |
| #define DMAIUBSIZE 0x5 | |
| /* DMA integrated floppy page buffer */ | |
| #define DMAIFBASE 0x4E000 | |
| #define DMAIFSIZE 0x5 | |
| #define DMA_ID_CHAN 0 | |
| #define DMA_IF_CHAN 1 | |
| #define DMA_IUA_CHAN 2 | |
| #define DMA_IUB_CHAN 3 | |
| #define DMA_ID 0x45 | |
| #define DMA_IUA 0x46 | |
| #define DMA_IUB 0x47 | |
| #define DMA_C 0x48 | |
| #define DMA_IF 0x4E | |
| #define DMA_MODE_VERIFY 0 | |
| #define DMA_MODE_WRITE 1 /* Write to memory from device */ | |
| #define DMA_MODE_READ 2 /* Read from memory to device */ | |
| #define DMA_IF_READ (IFBASE + IF_DATA_REG) | |
| typedef struct { | |
| uint8 page; | |
| uint16 addr; /* Original addr */ | |
| uint16 wcount; /* Original wcount */ | |
| uint16 addr_c; /* Current addr */ | |
| uint16 wcount_c; /* Current word-count */ | |
| } dma_channel; | |
| typedef struct { | |
| /* Byte (high/low) flip-flop */ | |
| uint8 bff; | |
| /* Address and count registers for channels 0-3 */ | |
| dma_channel channels[4]; | |
| /* DMAC programmable registers */ | |
| uint8 command; | |
| uint8 mode; | |
| uint8 request; | |
| uint8 mask; | |
| uint8 status; | |
| } DMA_STATE; | |
| typedef struct { | |
| uint8 channel; | |
| uint32 service_address; | |
| t_bool *drq; | |
| void (*handled_callback)(); | |
| } dmac_drq_handler; | |
| /* DMAC */ | |
| t_stat dmac_reset(DEVICE *dptr); | |
| uint32 dmac_read(uint32 pa, size_t size); | |
| void dmac_write(uint32 pa, uint32 val, size_t size); | |
| void dmac_service_drqs(); | |
| void dmac_transfer(uint8 channel, uint32 service_address); | |
| #endif |