source: branches/simple/DeviceMapper.pas

Last change on this file was 40, checked in by chronos, 9 months ago
  • Added: Simple multi bit width experimental cpu and machine.
File size: 3.1 KB
Line 
1unit DeviceMapper;
2
3interface
4
5uses
6 Classes, SysUtils, DataBus;
7
8type
9 TReadEvent8 = function: Byte of object;
10 TReadEvent16 = function: Word of object;
11 TWriteEvent8 = procedure (Data: Byte) of object;
12 TWriteEvent16 = procedure (Data: Word) of object;
13
14 { TDeviceMapper8 }
15
16 TDeviceMapper8 = class(TDataBus8)
17 public
18 WriteHandlers8: array of TWriteEvent8;
19 ReadHandlers8: array of TReadEvent8;
20 procedure RegisterReadHandler(ReadHandler: TReadEvent8);
21 procedure RegisterWriteHandler(WriteHandler: TWriteEvent8);
22 procedure Write8(Address: Byte; Data: Byte); override;
23 function Read8(Address: Byte): Byte; override;
24 end;
25
26 { TDeviceMapper16 }
27
28 TDeviceMapper16 = class(TDataBus16)
29 public
30 ReadHandlers8: array of TReadEvent8;
31 ReadHandlers16: array of TReadEvent16;
32 WriteHandlers8: array of TWriteEvent8;
33 WriteHandlers16: array of TWriteEvent16;
34 procedure RegisterReadHandler(ReadHandler8: TReadEvent8;
35 ReadHandler16: TReadEvent16);
36 procedure RegisterWriteHandler(WriteHandler8: TWriteEvent8;
37 WriteHandler16: TWriteEvent16);
38 function Read8(Address: Word): Byte; override;
39 function Read16(Address: Word): Word; override;
40 procedure Write8(Address: Word; Data: Byte); override;
41 procedure Write16(Address: Word; Data: Word); override;
42 end;
43
44
45implementation
46
47{ TDeviceMapper16 }
48
49procedure TDeviceMapper16.RegisterReadHandler(ReadHandler8: TReadEvent8;
50 ReadHandler16: TReadEvent16);
51begin
52 SetLength(ReadHandlers8, Length(ReadHandlers8) + 1);
53 ReadHandlers8[Length(ReadHandlers8) - 1] := ReadHandler8;
54 SetLength(ReadHandlers16, Length(ReadHandlers8) + 1);
55 ReadHandlers16[Length(ReadHandlers16) - 1] := ReadHandler16;
56end;
57
58procedure TDeviceMapper16.RegisterWriteHandler(WriteHandler8: TWriteEvent8;
59 WriteHandler16: TWriteEvent16);
60begin
61 SetLength(WriteHandlers8, Length(WriteHandlers8) + 1);
62 WriteHandlers8[Length(WriteHandlers8) - 1] := WriteHandler8;
63 SetLength(WriteHandlers16, Length(WriteHandlers16) + 1);
64 WriteHandlers16[Length(WriteHandlers16) - 1] := WriteHandler16;
65end;
66
67function TDeviceMapper16.Read8(Address: Word): Byte;
68begin
69 Result := ReadHandlers8[Address];
70end;
71
72function TDeviceMapper16.Read16(Address: Word): Word;
73begin
74 Result := ReadHandlers16[Address];
75end;
76
77procedure TDeviceMapper16.Write8(Address: Word; Data: Byte);
78begin
79 WriteHandlers8[Address](Data);
80end;
81
82procedure TDeviceMapper16.Write16(Address: Word; Data: Word);
83begin
84 WriteHandlers16[Address](Data);
85end;
86
87{ TDeviceMapper8 }
88
89procedure TDeviceMapper8.RegisterReadHandler(ReadHandler: TReadEvent8);
90begin
91 SetLength(ReadHandlers8, Length(ReadHandlers8) + 1);
92 ReadHandlers8[Length(ReadHandlers8) - 1] := ReadHandler;
93end;
94
95procedure TDeviceMapper8.RegisterWriteHandler(WriteHandler: TWriteEvent8);
96begin
97 SetLength(WriteHandlers8, Length(WriteHandlers8) + 1);
98 WriteHandlers8[Length(WriteHandlers8) - 1] := WriteHandler;
99end;
100
101procedure TDeviceMapper8.Write8(Address: Byte; Data: Byte);
102begin
103 WriteHandlers8[Address](Data);
104end;
105
106function TDeviceMapper8.Read8(Address: Byte): Byte;
107begin
108 Result := ReadHandlers8[Address];
109end;
110
111end.
112
Note: See TracBrowser for help on using the repository browser.