@@ -11,6 +11,9 @@ Driver started on 22/12/2011
11
11
Stefano Bodrato, 09/12/2016 - skeleton for cassette support
12
12
True tape samples are needed to continue !
13
13
14
+ Robin Sergeant, 2024 - h/w scrolling, HRG, sound, 8" disk support
15
+ and various bug fixes.
16
+
14
17
===
15
18
16
19
From the Firmware Manual:
@@ -37,54 +40,30 @@ COS 4.2 A
37
40
/M = 5.25 inch single density floppy
38
41
Ver 4.2 can have either floppy type
39
42
40
- *** RM480Z ***
41
- RML 40-Character LINK 480Z V1.0
42
- RML 80-Character LINK 480Z V1.0
43
- RML 40-Character LINK 480Z V1.1 A
44
- RML 40-Character LINK 480Z V1.1 B
45
- RML 80-Character LINK 480Z V1.1 A
46
- RML 80-Character LINK 480Z V1.1 B
47
- RML 80-Character LINK 480Z V1.2 A
48
- RML 80-Character LINK 480Z V1.2 B
49
- RML 80-Character LINK 480Z V1.2 C
50
- RML 80-Character LINK 480Z V1.2 D
51
- RML 80-Character LINK 480Z V2.2 B
52
-
53
- V1.0 refers to ROS 1.0
54
- V1.1 refers to ROS 1.1
55
- V1.2 refers to ROS 1.2
56
- V2.2 refers to ROS 2.2
57
-
58
43
Monitor commands:
59
- B - Boot CP/M (COS /F, COS /M, ROS 1.2, ROS 2.2 )
44
+ B - Boot CP/M (COS /F, COS /M)
60
45
X - Boot CP/M from another drive (as above)
61
- N - Boot network (ROS)
62
- T - Enter terminal mode (ROS)
63
- L - Load program from cassette (COS /C, ROS)
46
+ L - Load program from cassette (COS /C)
64
47
D - Dump memory to cassette (as above)
65
48
C - Continue program at restart address (as above)
66
49
J - Go to address
67
- O - Select printer option (and cassette speed for COS /C, ROS )
50
+ O - Select printer option (and cassette speed for COS /C)
68
51
M - Enable HRG board as memory (COS 3.4, COS 4.0)
69
52
W - Select 40 or 80 characters per line (All 80-column machines)
70
- R - Start ROM BASIC (ROS 1.1, ROS 1.2, ROS 2.2)
71
- Ctrl+Shift+8 - Break and return to current OS (ROS)
72
- Ctrl+Shift+9 - Break and return to front panel (ROS)
73
53
Ctrl+F - Enter Front Panel (=the debugger)
74
54
Ctrl+T - Enter Typewriter mode
75
55
Ctrl+S - Autopaging on
76
56
Ctrl+Q - Autopaging off
77
57
Ctrl+A - Toggle autopaging
78
58
79
59
Graphics characters: These are low-res (2x3 TRS80-style) from 80-BF, repeated at C0-FF.
80
- 80-BF will be low-intensity, except for a RM480Z if using a colour monitor .
60
+ 80-BF will be low-intensity.
81
61
The characters 00-1F have one set for COS 3.4 and COS 4.0, and a different set for the others.
82
62
COS 4.0 and 4.2 allow one to redefine the 80-FF character range, and to have attributes.
83
63
ROS 2.2 allows an alternate character set.
84
64
85
65
Sound:
86
66
RM380Z has a connector for a speaker
87
- RM480Z has the speaker fitted
88
67
89
68
===
90
69
@@ -117,8 +96,8 @@ PAGE SEL bit in PORT0 set to 1:
117
96
FB00-FBFF - Memory-mapped ports (FBFC-FBFF)
118
97
FC00-FFFF - RAM
119
98
120
- Video resolution (not confirmed) :
121
- 80x24 - 6 pixels wide (5 + spacing) , 10 pixels high (9 + spacing) = 480x240
99
+ Video resolution:
100
+ 80x24 - 8 pixels wide, 10 pixels high = 640x240
122
101
Video input clock is 16MHz
123
102
124
103
According to the manuals, VDU-1 chargen is Texas 74LS262.
@@ -136,10 +115,7 @@ Notes on COS 4.0 disassembly:
136
115
137
116
TODO:
138
117
139
- - Properly implement dimming and graphic chars (>0x80)
140
- - Understand why any write to disk command fails with "bad sector"
141
- - Understand why ctrl-U (blinking cursor) in COS 4.0 stops keyboard input from working
142
- - Get a reliable ROM dump and charset ROM dump
118
+ - Make cassette interface work.
143
119
144
120
145
121
Attempt to register save state entry after state registration is closed!
@@ -190,29 +166,6 @@ void rm380z_state::rm380z_io(address_map &map)
190
166
map (0xe8 , 0xff ).rw (FUNC (rm380z_state::rm380z_porthi_r), FUNC (rm380z_state::rm380z_porthi_w));
191
167
}
192
168
193
- void rm480z_state::rm480z_mem (address_map &map)
194
- {
195
- map (0x0000 , 0xe7ff ).ram ();
196
- map (0xe800 , 0xf7ff ).rom ().region (RM380Z_MAINCPU_TAG, 0 );
197
- map (0xf800 , 0xffff ).ram ();
198
- }
199
-
200
- void rm480z_state::rm480z_io (address_map &map)
201
- {
202
- // map(0x00, 0x17).ram(); // videoram
203
- // map(0x18, 0x18).mirror(0xff00); // control port 0
204
- // map(0x19, 0x19).mirror(0xff00); // control port 1
205
- // map(0x1a, 0x1a).mirror(0xff00); // control port 2
206
- // map(0x1b, 0x1b).mirror(0xff00); // control port 3 (DAC) // option
207
- // map(0x1d, 0x1d).mirror(0xff00); // control port 5 (USERIO) // option
208
- // map(0x20, 0x23).mirror(0xff00); // system CTC - 0=SIO4&cassin, 1=SIO2&cassio, 2=keybd int, 3=50Hz int for repeat key
209
- // map(0x24, 0x27).mirror(0xff00); // system SIO - 0=chA network data, 1=chB SIO4 data, 2=ChA control, 3=ChB control
210
- // map(0x28, 0x29).mirror(0xff02); // am9511/am9512 maths chip // option
211
- // map(0x2c, 0x2f).mirror(0xff00); // z80ctc IEEE int, Maths int, RTC, RTC // option
212
- // map(0x30, 0x37).mirror(0xff00); // IEEE chip // option
213
- // map(0x38, 0x3b).mirror(0xff00); // Hi-res graphics option
214
- }
215
-
216
169
INPUT_PORTS_START ( rm380z )
217
170
218
171
// PORT_START("additional_chars")
@@ -318,30 +271,6 @@ void rm380z_state_cos40_hrg::rm380zhrg(machine_config &config)
318
271
m_palette->set_init (FUNC (rm380z_state_cos40_hrg::palette_init)).set_entries (19 );
319
272
}
320
273
321
- void rm480z_state::rm480z (machine_config &config)
322
- {
323
- /* basic machine hardware */
324
- Z80 (config, m_maincpu, 16_MHz_XTAL / 4 );
325
- m_maincpu->set_addrmap (AS_PROGRAM, &rm480z_state::rm480z_mem);
326
- m_maincpu->set_addrmap (AS_IO, &rm480z_state::rm480z_io);
327
-
328
- /* video hardware */
329
- // screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
330
- // screen.set_refresh_hz(50);
331
- // screen.set_vblank_time(ATTOSECONDS_IN_USEC(0));
332
- // screen.set_size((RM380Z_SCREENCOLS*(RM380Z_CHDIMX+1)), (RM380Z_SCREENROWS*(RM380Z_CHDIMY+1)));
333
- // screen.set_visarea(0, (RM380Z_SCREENCOLS*(RM380Z_CHDIMX+1))-1, 0, (RM380Z_SCREENROWS*(RM380Z_CHDIMY+1))-1);
334
- // screen.set_screen_update(FUNC(rm380z_state::screen_update_rm480z));
335
- // screen.set_palette("palette");
336
-
337
- // PALETTE(config, "palette", palette_device::MONOCHROME);
338
-
339
- /* keyboard */
340
- // generic_keyboard_device &keyboard(GENERIC_KEYBOARD(config, "keyboard", 0));
341
- // keyboard.set_keyboard_callback(FUNC(rm380z_state::keyboard_put));
342
- }
343
-
344
-
345
274
/* ROM definitions */
346
275
347
276
ROM_START ( rm380z34d ) // COS 3.4D/F
@@ -390,28 +319,6 @@ ROM_START( rm380zfhrg ) // COS 4.0B/F
390
319
ROM_LOAD( " c-gen-22.bin" , 0x0000 , 0x0800 , CRC(1b67127f) SHA1(289a919871d30c5e832d22244bcac1dcfd544baa) )
391
320
ROM_END
392
321
393
- // RM480Z is quite different, might be better off in its own driver
394
- ROM_START( rm480z )
395
- ROM_REGION( 0x10000 , RM380Z_MAINCPU_TAG, 0 )
396
- ROM_LOAD( " fv2.0_0_12099_19.2.86.ic83" , 0x0000 , 0x4000 , CRC(a0f02d8a) SHA1(1c063b842699dc0ad85a5a5f337f2864497f9c0f) )
397
- ROM_LOAD( " fv2.0_1_12100_27.2.86.ic93" , 0x4000 , 0x4000 , CRC(2a93ca6e) SHA1(7fdd772d4251dbf951a687d184ed787cfe21212b) )
398
- ROM_REGION( 0x2000 , " chargen" , 0 )
399
- ROM_LOAD( " cg06_12098_28.2.86.ic98" , 0x0000 , 0x2000 , CRC(15d40f7e) SHA1(a7266357eb9be849f77a97ff3013b236c0af8289) )
400
- ROM_END
401
-
402
- ROM_START( rm480za )
403
- ROM_REGION( 0x10000 , RM380Z_MAINCPU_TAG, 0 )
404
- ROM_LOAD( " ros_1.2b.ls" , 0x0000 , 0x2000 , CRC(37e93287 ) SHA1(c96d4b7eedadb0fb8e3732b6ba3e898e123c393f) )
405
- ROM_LOAD( " bir_5.4b_0.lt" , 0x2000 , 0x4000 , CRC(64759792 ) SHA1(ffce5e59788cd492937e85b368b71e8a5a2aaa9c) )
406
- ROM_LOAD( " bir_5.4b_1.lu" , 0x6000 , 0x4000 , CRC(adce35df) SHA1(dc20df0fcfefc5e2682b47e7ce454043dc593cd8) )
407
- ROM_LOAD( " bir_5.4b_2.lv" , 0xa000 , 0x4000 , CRC(5a455fc8) SHA1(04c5f17120ee085c013e600b77ca63cbb138aa4d) )
408
- ROM_REGION( 0x10000 , " user1" , 0 ) // bioses for fdc board versions
409
- ROM_LOAD( " idc3-1i.rom" , 0x0000 , 0x2000 , CRC(39e2cdf0) SHA1(ba523af357b61bbe6192727139850f36597d79f1) )
410
- ROM_LOAD( " idc5-1j.rom" , 0x2000 , 0x2000 , CRC(d2ac27e2) SHA1(12d3966e0096c9bfb98135e15c3ddb37920cce15) )
411
- ROM_REGION( 0x2000 , " chargen" , 0 )
412
- ROM_LOAD( " cg06.lq" , 0x0000 , 0x2000 , BAD_DUMP CRC (15d40f7e) SHA1(a7266357eb9be849f77a97ff3013b236c0af8289) ) // chip is marked CG05, might not be the same, so marked as bad
413
- ROM_END
414
-
415
322
416
323
/* Driver */
417
324
// YEAR NAME PARENT COMPAT MACHINE INPUT CLASS INIT COMPANY FULLNAME FLAGS
@@ -421,5 +328,3 @@ COMP(1978, rm380zf, 0, 0, rm380zf, rm380z, rm380z_state_cos4
421
328
COMP(1978 , rm380zfhrg, rm380zf, 0 , rm380zfhrg, rm380zhrg, rm380z_state_cos40_hrg, driver_device::empty_init, " Research Machines" , " RM-380Z, COS 4.0B/F with HRG" , 0 )
422
329
COMP(1978 , rm380z34d, rm380z, 0 , rm380z34d, rm380z, rm380z_state_cos34, driver_device::empty_init, " Research Machines" , " RM-380Z, COS 3.4D/F" , MACHINE_NO_SOUND_HW)
423
330
COMP(1978 , rm380z34e, rm380z, 0 , rm380z34e, rm380z, rm380z_state_cos34, driver_device::empty_init, " Research Machines" , " RM-380Z, COS 3.4E/M" , MACHINE_NO_SOUND_HW)
424
- COMP(1981 , rm480z, rm380z, 0 , rm480z, rm380z, rm480z_state, driver_device::empty_init, " Research Machines" , " LINK RM-480Z (set 1)" , MACHINE_IS_SKELETON)
425
- COMP(1981 , rm480za, rm380z, 0 , rm480za, rm380z, rm480z_state, driver_device::empty_init, " Research Machines" , " LINK RM-480Z (set 2)" , MACHINE_IS_SKELETON)
0 commit comments