/* 3b2_cpu.h: AT&T 3B2 Model 400 System Devices (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_SYSDEV_H_ | |
#define _3B2_SYSDEV_H_ | |
#include "3b2_defs.h" | |
#include "3b2_sys.h" | |
#include "3b2_cpu.h" | |
extern DEVICE nvram_dev; | |
extern DEVICE timer_dev; | |
extern DEVICE csr_dev; | |
extern DEVICE tod_dev; | |
extern DEBTAB sys_deb_tab[]; | |
struct timer_ctr { | |
uint16 divider; | |
uint16 val; | |
uint8 mode; | |
t_bool lmb; | |
t_bool enabled; | |
t_bool gate; | |
double stime; /* Most recent start time of counter */ | |
}; | |
/* NVRAM */ | |
t_stat nvram_ex(t_value *vptr, t_addr exta, UNIT *uptr, int32 sw); | |
t_stat nvram_dep(t_value val, t_addr exta, UNIT *uptr, int32 sw); | |
t_stat nvram_reset(DEVICE *dptr); | |
uint32 nvram_read(uint32 pa, size_t size); | |
t_stat nvram_attach(UNIT *uptr, CONST char *cptr); | |
t_stat nvram_detach(UNIT *uptr); | |
const char *nvram_description(DEVICE *dptr); | |
t_stat nvram_help(FILE *st, DEVICE *dptr, UNIT *uptr, int32 flag, const char *cptr); | |
void nvram_write(uint32 pa, uint32 val, size_t size); | |
/* 8253 Timer */ | |
t_stat timer_reset(DEVICE *dptr); | |
uint32 timer_read(uint32 pa, size_t size); | |
void timer_write(uint32 pa, uint32 val, size_t size); | |
t_stat timer0_svc(UNIT *uptr); | |
t_stat timer1_svc(UNIT *uptr); | |
t_stat timer2_svc(UNIT *uptr); | |
/* CSR */ | |
t_stat csr_svc(UNIT *uptr); | |
t_stat csr_ex(t_value *vptr, t_addr exta, UNIT *uptr, int32 sw); | |
t_stat csr_dep(t_value val, t_addr exta, UNIT *uptr, int32 sw); | |
t_stat csr_reset(DEVICE *dptr); | |
uint32 csr_read(uint32 pa, size_t size); | |
void csr_write(uint32 pa, uint32 val, size_t size); | |
/* TOD */ | |
typedef struct tod_data { | |
int32 delta; /* Delta between simulated time and real time (sec.) */ | |
uint8 tsec; /* 1/10 seconds */ | |
uint8 unit_sec; /* 1's column seconds */ | |
uint8 ten_sec; /* 10's column seconds */ | |
uint8 unit_min; /* 1's column minutes */ | |
uint8 ten_min; /* 10's column minutes */ | |
uint8 unit_hour; /* 1's column hours */ | |
uint8 ten_hour; /* 10's column hours */ | |
uint8 unit_day; /* 1's column day of month */ | |
uint8 ten_day; /* 10's column day of month */ | |
uint8 wday; /* Day of week (0-6) */ | |
uint8 unit_mon; /* 1's column month */ | |
uint8 ten_mon; /* 10's column month */ | |
uint8 year; /* 1, 2, 4, 8 shift register */ | |
uint8 pad[3]; /* Padding to 32 bytes */ | |
} TOD_DATA; | |
void tod_resync(); | |
void tod_update_delta(); | |
t_stat tod_reset(DEVICE *dptr); | |
t_stat tod_attach(UNIT *uptr, CONST char *cptr); | |
t_stat tod_detach(UNIT *uptr); | |
const char *tod_description(DEVICE *dptr); | |
t_stat tod_help(FILE *st, DEVICE *dptr, UNIT *uptr, int32 flag, const char *cptr); | |
uint32 tod_read(uint32 pa, size_t size); | |
void tod_write(uint32, uint32 val, size_t size); | |
#endif |