1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
|
// license:BSD-3-Clause
// copyright-holders:smf
#ifndef MAME_MACHINE_53C810_H
#define MAME_MACHINE_53C810_H
#pragma once
#include "legscsi.h"
class lsi53c810_device : public legacy_scsi_host_adapter
{
public:
typedef device_delegate<void (int state)> irq_delegate;
typedef device_delegate<void (uint32_t src, uint32_t dst, int length, int byteswap)> dma_delegate;
typedef device_delegate<uint32_t (uint32_t dsp)> fetch_delegate;
// construction/destruction
lsi53c810_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock = 0);
template <class FunctionClass> void set_irq_callback(void (FunctionClass::*callback)(int), const char *name)
{
m_irq_cb = irq_delegate(callback, name, nullptr, static_cast<FunctionClass *>(nullptr));
}
template <class FunctionClass> void set_dma_callback(void (FunctionClass::*callback)(uint32_t, uint32_t, int, int), const char *name)
{
m_dma_cb = dma_delegate(callback, name, nullptr, static_cast<FunctionClass *>(nullptr));
}
template <class FunctionClass> void set_fetch_callback(uint32_t (FunctionClass::*callback)(uint32_t), const char *name)
{
m_fetch_cb = fetch_delegate(callback, name, nullptr, static_cast<FunctionClass *>(nullptr));
}
uint8_t reg_r(int offset);
void reg_w(int offset, uint8_t data);
protected:
// device-level overrides
virtual void device_start() override;
private:
typedef delegate<void (void)> opcode_handler_delegate;
opcode_handler_delegate dma_opcode[256];
irq_delegate m_irq_cb;
dma_delegate m_dma_cb;
fetch_delegate m_fetch_cb;
uint32_t FETCH();
void dmaop_invalid();
void dmaop_move_memory();
void dmaop_interrupt();
void dmaop_block_move();
void dmaop_select();
void dmaop_wait_disconnect();
void dmaop_wait_reselect();
void dmaop_set();
void dmaop_clear();
void dmaop_move_from_sfbr();
void dmaop_move_to_sfbr();
void dmaop_read_modify_write();
int scripts_compute_branch();
uint32_t scripts_get_jump_dest();
void dmaop_jump();
void dmaop_call();
void dmaop_return();
void dmaop_store();
void dmaop_load();
void dma_exec();
void add_opcode(uint8_t op, uint8_t mask, opcode_handler_delegate handler);
uint32_t lsi53c810_dasm_fetch(uint32_t pc);
unsigned lsi53c810_dasm(char *buf, uint32_t pc);
uint8_t scntl0;
uint8_t scntl1;
uint8_t scntl2;
uint8_t scntl3;
uint8_t scid;
uint8_t sxfer;
uint8_t socl;
uint8_t istat;
uint8_t dstat;
uint8_t sstat0;
uint8_t sstat1;
uint8_t sstat2;
uint8_t dien;
uint8_t dcntl;
uint8_t dmode;
uint32_t temp;
uint32_t dsa;
uint32_t dsp;
uint32_t dsps;
uint32_t dcmd;
uint8_t sien0;
uint8_t sien1;
uint8_t stime0;
uint8_t respid;
uint8_t stest1;
uint8_t scratch_a[4];
uint8_t scratch_b[4];
int dma_icount;
int halted;
int carry;
};
// device type definition
DECLARE_DEVICE_TYPE(LSI53C810, lsi53c810_device)
#endif // MAME_MACHINE_53C810_H
|