/* 3b2_cpu.h: AT&T 3B2 Model 400 Floppy (TMS2797NL) 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_IF_H__ | |
#define __3B2_IF_H__ | |
#include "3b2_defs.h" | |
#include "3b2_sysdev.h" | |
#include "3b2_sys.h" | |
typedef struct { | |
uint8 data; | |
uint8 cmd; | |
uint8 cmd_type; | |
uint8 status; | |
uint8 track; | |
uint8 sector; | |
uint8 side; | |
uint8 read_addr_ptr; | |
int8 step_dir; | |
t_bool drq; | |
} IF_STATE; | |
extern DEVICE if_dev; | |
extern DEBTAB sys_deb_tab[]; | |
extern IF_STATE if_state; | |
extern t_bool if_irq; | |
#define IFBASE 0x4d000 | |
#define IFSIZE 0x10 | |
#define IF_STATUS_REG 0 | |
#define IF_CMD_REG 0 | |
#define IF_TRACK_REG 1 | |
#define IF_SECTOR_REG 2 | |
#define IF_DATA_REG 3 | |
/* Status Bits */ | |
#define IF_BUSY 0x01 | |
#define IF_DRQ 0x02 | |
#define IF_INDEX 0x02 | |
#define IF_TK_0 0x04 | |
#define IF_LOST_DATA 0x04 | |
#define IF_CRC_ERR 0x08 | |
#define IF_SEEK_ERR 0x10 | |
#define IF_RNF 0x10 | |
#define IF_HEAD_LOADED 0x20 | |
#define IF_RECORD_TYPE 0x20 | |
#define IF_WP 0x40 | |
#define IF_NRDY 0x80 | |
/* Type I Commands */ | |
#define IF_RESTORE 0x00 | |
#define IF_SEEK 0x10 | |
#define IF_STEP 0x20 | |
#define IF_STEP_T 0x30 | |
#define IF_STEP_IN 0x40 | |
#define IF_STEP_IN_T 0x50 | |
#define IF_STEP_OUT 0x60 | |
#define IF_STEP_OUT_T 0x70 | |
/* Type II Commands */ | |
#define IF_READ_SEC 0x80 | |
#define IF_READ_SEC_M 0x90 | |
#define IF_WRITE_SEC 0xA0 | |
#define IF_WRITE_SEC_M 0xB0 | |
/* Type III Commands */ | |
#define IF_READ_ADDR 0xC0 | |
#define IF_READ_TRACK 0xE0 | |
#define IF_WRITE_TRACK 0xF0 | |
/* Type IV Command */ | |
#define IF_FORCE_INT 0xD0 | |
/* Command flags */ | |
#define IF_C_FLAG 0x02 | |
#define IF_V_FLAG 0x04 | |
#define IF_E_FLAG 0x04 | |
#define IF_U_FLAG 0x02 | |
#define IF_H_FLAG 0x08 | |
#define IF_S_FLAG 0x10 | |
/* Constants */ | |
#define IF_SIDES 2 | |
#define IF_TRACK_SIZE 4608 | |
#define IF_SECTOR_SIZE 512 | |
#define IF_TRACK_COUNT 80 | |
#define IF_STEP_IN_DIR 1 | |
#define IF_STEP_OUT_DIR -1 | |
#define IF_DSK_SIZE (IF_SIDES * IF_TRACK_SIZE * IF_TRACK_COUNT) | |
/* Function prototypes */ | |
static SIM_INLINE void if_set_irq(); | |
static SIM_INLINE void if_clear_irq(); | |
static SIM_INLINE void if_cancel_pending_irq(); | |
t_stat if_svc(UNIT *uptr); | |
t_stat if_reset(DEVICE *dptr); | |
uint32 if_read(uint32 pa, size_t size); | |
void if_write(uint32 pa, uint32 val, size_t size); | |
void if_drq_handled(); | |
void if_handle_command(); | |
uint32 if_buf_offset(); | |
#endif |