summaryrefslogtreecommitdiffstatshomepage
path: root/src/mess/machine/dgn_beta.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/mess/machine/dgn_beta.c')
-rw-r--r--src/mess/machine/dgn_beta.c1144
1 files changed, 0 insertions, 1144 deletions
diff --git a/src/mess/machine/dgn_beta.c b/src/mess/machine/dgn_beta.c
deleted file mode 100644
index 57de97d32f5..00000000000
--- a/src/mess/machine/dgn_beta.c
+++ /dev/null
@@ -1,1144 +0,0 @@
-// license:BSD-3-Clause
-// copyright-holders:Nathan Woods
-/***************************************************************************
-
- machine\dgn_beta.c (machine.c)
-
- Moved out of dragon.c, 2005-05-05, P.Harvey-Smith.
-
- I decided to move this out of the main Dragon/CoCo source files, as
- the Beta is so radically different from the other Dragon machines that
- this made more sense (to me at least).
-
- Functions to emulate general aspects of the machine (RAM, ROM, interrupts,
- I/O ports)
-
- References:
- Disassembly of Dragon Beta ROM, examination of only (known) surviving board.
-
- TODO:
- Pretty much everything !
-
- Display working with 6845 taking data from rom.
-
- 2005-05-10
- Memory banking seems to be working, as documented in code comments below.
-
- 2005-05-31
- CPU#2 now executes code correctly to do transfers from WD2797.
-
- 2005-06-03
-
- When fed a standard OS-9 boot disk it reads in the boot file and attempts
- to start it, not being able to find init, it fails. Hopefully I will
- soon have an image of a Beta boot disk.
-
- 2005-11-29
-
- Major track tracing excersise on scans of bare beta board, reveal where a
- whole bunch of the PIA lines go, especially the IRQs, most of them go back
- to the IRQ line on the main CPU.
-
- 2005-12-07
-
- First booted to OS9 prompt, did not execute startup scripts.
-
- 2005-12-08
-
- Fixed density setting on WD2797, so density of read data is now
- correctlty set as required by OS-9. This was the reason startup
- script was not being executed as Beta disks have a single denisty
- boot track, however the rest of the disk is double density.
- Booted completely to OS-9, including running startup script.
-
- 2006-09-27
-
- Clean up of IRQ/FIRQ handling code allows correct booting again.
-
-***************************************************************************/
-
-#include <math.h>
-#include "emu.h"
-#include "debug/debugcon.h"
-#include "cpu/m6809/m6809.h"
-#include "machine/6821pia.h"
-#include "includes/dgn_beta.h"
-#include "machine/mos6551.h"
-#include "imagedev/flopdrv.h"
-
-#include "debug/debugcpu.h"
-#include "debug/debugcon.h"
-#include "machine/ram.h"
-
-#define VERBOSE 0
-
-
-#define LOG_BANK_UPDATE(x) do { if (VERBOSE) logerror x; } while (0)
-#define LOG_DEFAULT_TASK(x) do { if (VERBOSE) logerror x; } while (0)
-#define LOG_PAGE_WRITE(x) do { if (VERBOSE) logerror x; } while (0)
-#define LOG_HALT(x) do { if (VERBOSE) logerror x; } while (0)
-#define LOG_TASK(x) do { if (VERBOSE) logerror x; } while (0)
-#define LOG_KEYBOARD(x) do { if (VERBOSE) logerror x; } while (0)
-#define LOG_VIDEO(x) do { if (VERBOSE) logerror x; } while (0)
-#define LOG_DISK(x) do { if (VERBOSE) logerror x; } while (0)
-#define LOG_INTS(x) do { if (VERBOSE) logerror x; } while (0)
-
-
-/* Debugging commands and handlers. */
-static offs_t dgnbeta_dasm_override(device_t &device, char *buffer, offs_t pc, const UINT8 *oprom, const UINT8 *opram, int options);
-static void execute_beta_dat_log(running_machine &machine, int ref, int params, const char *param[]);
-static void execute_beta_key_dump(running_machine &machine, int ref, int params, const char *param[]);
-
-//static int DMA_NMI; /* DMA cpu has received an NMI */
-
-#define INVALID_KEYROW -1 /* no ketrow selected */
-#define NO_KEY_PRESSED 0x7F /* retrurned by hardware if no key pressed */
-
-// Info for bank switcher
-struct bank_info_entry
-{
- write8_delegate func; // Pointer to write handler
- offs_t start; // Offset of start of block
- offs_t end; // offset of end of block
-};
-
-static const struct bank_info_entry bank_info[] =
-{
- { write8_delegate(FUNC(dgn_beta_state::dgnbeta_ram_b0_w),(dgn_beta_state*)0), 0x0000, 0x0fff },
- { write8_delegate(FUNC(dgn_beta_state::dgnbeta_ram_b1_w),(dgn_beta_state*)0), 0x1000, 0x1fff },
- { write8_delegate(FUNC(dgn_beta_state::dgnbeta_ram_b2_w),(dgn_beta_state*)0), 0x2000, 0x2fff },
- { write8_delegate(FUNC(dgn_beta_state::dgnbeta_ram_b3_w),(dgn_beta_state*)0), 0x3000, 0x3fff },
- { write8_delegate(FUNC(dgn_beta_state::dgnbeta_ram_b4_w),(dgn_beta_state*)0), 0x4000, 0x4fff },
- { write8_delegate(FUNC(dgn_beta_state::dgnbeta_ram_b5_w),(dgn_beta_state*)0), 0x5000, 0x5fff },
- { write8_delegate(FUNC(dgn_beta_state::dgnbeta_ram_b6_w),(dgn_beta_state*)0), 0x6000, 0x6fff },
- { write8_delegate(FUNC(dgn_beta_state::dgnbeta_ram_b7_w),(dgn_beta_state*)0), 0x7000, 0x7fff },
- { write8_delegate(FUNC(dgn_beta_state::dgnbeta_ram_b8_w),(dgn_beta_state*)0), 0x8000, 0x8fff },
- { write8_delegate(FUNC(dgn_beta_state::dgnbeta_ram_b9_w),(dgn_beta_state*)0), 0x9000, 0x9fff },
- { write8_delegate(FUNC(dgn_beta_state::dgnbeta_ram_bA_w),(dgn_beta_state*)0), 0xA000, 0xAfff },
- { write8_delegate(FUNC(dgn_beta_state::dgnbeta_ram_bB_w),(dgn_beta_state*)0), 0xB000, 0xBfff },
- { write8_delegate(FUNC(dgn_beta_state::dgnbeta_ram_bC_w),(dgn_beta_state*)0), 0xC000, 0xCfff },
- { write8_delegate(FUNC(dgn_beta_state::dgnbeta_ram_bD_w),(dgn_beta_state*)0), 0xD000, 0xDfff },
- { write8_delegate(FUNC(dgn_beta_state::dgnbeta_ram_bE_w),(dgn_beta_state*)0), 0xE000, 0xEfff },
- { write8_delegate(FUNC(dgn_beta_state::dgnbeta_ram_bF_w),(dgn_beta_state*)0), 0xF000, 0xFBff },
- { write8_delegate(FUNC(dgn_beta_state::dgnbeta_ram_bG_w),(dgn_beta_state*)0), 0xFF00, 0xFfff }
-};
-
-#define is_last_page(page) (((page==LastPage) || (page==LastPage+1)) ? 1 : 0)
-
-//
-// Memory pager, maps machine's 1Mb total address space into the 64K addressable by the 6809.
-// This is in some way similar to the system used on the CoCo 3, except the beta uses 4K
-// pages (instead of 8K on the CoCo), and has 16 task registers instead of the 2 on the CoCo.
-//
-// Each block of 16 page registers (1 for each task), is paged in at $FE00-$FE0F, the bottom
-// 4 bits of the PIA register at $FCC0 seem to contain which task is active.
-// bit 6 of the same port seems to enable the memory paging
-//
-// For the purpose of this driver any block that is not ram, and is not a known ROM block,
-// is mapped to the first page of the boot rom, I do not know what happens in the real
-// hardware, however this does allow the boot rom to correctly size the RAM.
-// this should probably be considdered a hack !
-//
-
-void dgn_beta_state::UpdateBanks(int first, int last)
-{
- address_space &space_0 = m_maincpu->space(AS_PROGRAM);
- address_space &space_1 = machine().device(DMACPU_TAG)->memory().space(AS_PROGRAM);
- int Page;
- UINT8 *readbank;
- int bank_start;
- int bank_end;
- int MapPage;
- char page_num[10];
-
- LOG_BANK_UPDATE(("\n\nUpdating banks %d to %d at PC=$%X\n",first,last,space_0.device().safe_pc()));
- for(Page=first;Page<=last;Page++)
- {
- sprintf(page_num,"bank%d",Page+1);
-
- bank_start = bank_info[Page].start;
- bank_end = bank_info[Page].end;
-
- // bank16 and bank17 are mapped to the same page with a hole for the IO memory
- if (!is_last_page(Page))
- MapPage = m_PageRegs[m_TaskReg][Page].value;
- else
- MapPage = m_PageRegs[m_TaskReg][LastPage].value;
-
- //
- // Map block, $00-$BF are ram, $FC-$FF are Boot ROM
- //
- if ((MapPage*4) < ((m_ram->size() / 1024)-1)) // Block is ram
- {
- if (!is_last_page(Page))
- {
- readbank = &m_ram->pointer()[MapPage*RamPageSize];
- if(m_LogDatWrites)
- debug_console_printf(machine(), "Mapping page %X, pageno=%X, mess_ram)[%X]\n",Page,MapPage,(MapPage*RamPageSize));
- }
- else
- {
- readbank = &m_ram->pointer()[(MapPage*RamPageSize)-256];
- logerror("Error RAM in Last page !\n");
- }
- write8_delegate func = bank_info[Page].func;
- if (!func.isnull()) func.late_bind(*this);
- space_0.install_write_handler(bank_start, bank_end, func);
- space_1.install_write_handler(bank_start, bank_end, func);
- }
- else // Block is rom, or undefined
- {
- if (MapPage>0xfB)
- {
- if (Page!=IOPage+1)
- readbank=&m_system_rom[(MapPage-0xFC)*0x1000];
- else
- readbank=&m_system_rom[0x3F00];
- }
- else
- readbank=m_system_rom;
-
- space_0.unmap_write(bank_start, bank_end);
- space_1.unmap_write(bank_start, bank_end);
- }
-
- m_PageRegs[m_TaskReg][Page].memory=readbank;
- membank(page_num)->set_base(readbank);
-
- LOG_BANK_UPDATE(("UpdateBanks:MapPage=$%02X readbank=$%X\n",MapPage,(int)(FPTR)readbank));
- LOG_BANK_UPDATE(("PageRegsSet Task=%X Page=%x\n",m_TaskReg,Page));
- //LOG_BANK_UPDATE(("%X)\n",membank(Page+1)));
- LOG_BANK_UPDATE(("memory_install_write8_handler CPU=0\n"));
- LOG_BANK_UPDATE(("memory_install_write8_handler CPU=1\n"));
- }
-}
-
-//
-void dgn_beta_state::SetDefaultTask()
-{
-// UINT8 *videoram = m_videoram;
- int Idx;
-
- LOG_DEFAULT_TASK(("SetDefaultTask()\n"));
- //if (VERBOSE) debug_console_printf(machine())->set_base("Set Default task\n");
-
- m_TaskReg=NoPagingTask;
-
- /* Reset ram pages */
- for(Idx=0;Idx<ROMPage-1;Idx++)
- {
- m_PageRegs[m_TaskReg][Idx].value=NoMemPageValue;
- }
-
- /* Reset RAM Page */
- m_PageRegs[m_TaskReg][RAMPage].value=RAMPageValue;
-
- /* Reset Video mem page */
- m_PageRegs[m_TaskReg][VideoPage].value=VideoPageValue;
-
- /* Reset rom page */
- m_PageRegs[m_TaskReg][ROMPage].value=ROMPageValue;
-
- /* Reset IO Page */
- m_PageRegs[m_TaskReg][LastPage].value=IOPageValue;
- m_PageRegs[m_TaskReg][LastPage+1].value=IOPageValue;
-
- UpdateBanks(0,LastPage+1);
-
- /* Map video ram to base of area it can use, that way we can take the literal RA */
- /* from the 6845 without having to mask it ! */
-// videoram=&m_ram->pointer()[TextVidBasePage*RamPageSize];
-}
-
-// Return the value of a page register
-READ8_MEMBER(dgn_beta_state::dgn_beta_page_r)
-{
- return m_PageRegs[m_PIATaskReg][offset].value;
-}
-
-// Write to a page register, writes to the register, and then checks to see
-// if memory banking is active, if it is, it calls UpdateBanks, to actually
-// setup the mappings.
-
-WRITE8_MEMBER(dgn_beta_state::dgn_beta_page_w )
-{
- m_PageRegs[m_PIATaskReg][offset].value=data;
-
- LOG_PAGE_WRITE(("PageRegWrite : task=$%X offset=$%X value=$%X\n",m_PIATaskReg,offset,data));
-
- if (m_EnableMapRegs)
- {
- UpdateBanks(offset,offset);
- if (offset==15)
- UpdateBanks(offset+1,offset+1);
- }
-}
-
-/*********************** Memory bank write handlers ************************/
-/* These actually write the data to the memory, and not to the page regs ! */
-void dgn_beta_state::dgn_beta_bank_memory(int offset, int data, int bank)
-{
- m_PageRegs[m_TaskReg][bank].memory[offset]=data;
-}
-
-WRITE8_MEMBER(dgn_beta_state::dgnbeta_ram_b0_w )
-{
- dgn_beta_bank_memory(offset,data,0);
-}
-
-WRITE8_MEMBER(dgn_beta_state::dgnbeta_ram_b1_w )
-{
- dgn_beta_bank_memory(offset,data,1);
-}
-
-WRITE8_MEMBER(dgn_beta_state::dgnbeta_ram_b2_w )
-{
- dgn_beta_bank_memory(offset,data,2);
-}
-
-WRITE8_MEMBER(dgn_beta_state::dgnbeta_ram_b3_w )
-{
- dgn_beta_bank_memory(offset,data,3);
-}
-
-WRITE8_MEMBER(dgn_beta_state::dgnbeta_ram_b4_w )
-{
- dgn_beta_bank_memory(offset,data,4);
-}
-
-WRITE8_MEMBER(dgn_beta_state::dgnbeta_ram_b5_w )
-{
- dgn_beta_bank_memory(offset,data,5);
-}
-
-WRITE8_MEMBER(dgn_beta_state::dgnbeta_ram_b6_w )
-{
- dgn_beta_bank_memory(offset,data,6);
-}
-
-WRITE8_MEMBER(dgn_beta_state::dgnbeta_ram_b7_w )
-{
- dgn_beta_bank_memory(offset,data,7);
-}
-
-WRITE8_MEMBER(dgn_beta_state::dgnbeta_ram_b8_w )
-{
- dgn_beta_bank_memory(offset,data,8);
-}
-
-WRITE8_MEMBER(dgn_beta_state::dgnbeta_ram_b9_w )
-{
- dgn_beta_bank_memory(offset,data,9);
-}
-
-WRITE8_MEMBER(dgn_beta_state::dgnbeta_ram_bA_w )
-{
- dgn_beta_bank_memory(offset,data,10);
-}
-
-WRITE8_MEMBER(dgn_beta_state::dgnbeta_ram_bB_w )
-{
- dgn_beta_bank_memory(offset,data,11);
-}
-
-WRITE8_MEMBER(dgn_beta_state::dgnbeta_ram_bC_w )
-{
- dgn_beta_bank_memory(offset,data,12);
-}
-
-WRITE8_MEMBER(dgn_beta_state::dgnbeta_ram_bD_w )
-{
- dgn_beta_bank_memory(offset,data,13);
-}
-
-WRITE8_MEMBER(dgn_beta_state::dgnbeta_ram_bE_w )
-{
- dgn_beta_bank_memory(offset,data,14);
-}
-
-WRITE8_MEMBER(dgn_beta_state::dgnbeta_ram_bF_w )
-{
- dgn_beta_bank_memory(offset,data,15);
-}
-
-WRITE8_MEMBER(dgn_beta_state::dgnbeta_ram_bG_w )
-{
- dgn_beta_bank_memory(offset,data,16);
-}
-
-/*
-The keyrow being scanned for any key is the lest significant bit
-of the output shift register that is zero, most of the time there should
-only be one row active e.g.
-
-Shifter Row being scanned
-1111111110 0
-1111111101 1
-1111111011 2
-
-etc.
-
-Returns row number or -1 if none selected.
-
-2006-12-03, P.Harvey-Smith, modified to scan from msb to lsb, and stop at
-first row with zero, as the beta_test fills the shifter with zeros, rather
-than using a walking zero as the OS-9 driver does. This meant that SelectKeyrow
-never moved past the first row, by scanning for the last active row
-the beta_test rom works, and it does not break the OS-9 driver :)
-*/
-int dgn_beta_state::SelectedKeyrow(dgn_beta_state *state, int Rows)
-{
- int Idx;
- int Row; /* Row selected */
- int Mask; /* Mask to test row */
- int Found; /* Set true when found */
-
- Row=INVALID_KEYROW; /* Pretend no rows selected */
- Mask=0x200; /* Start with row 9 */
- Found=0; /* Start with not found */
- Idx=9;
-
- while ((Mask>0) && !Found)
- {
- if((~Rows & Mask) && !Found)
- {
- Row=Idx; /* Get row */
- Found=1; /* Mark as found */
- }
- Idx=Idx-1; /* Decrement row count */
- Mask=Mask>>1; /* Select next bit */
- }
-
- return Row;
-}
-
-/* GetKeyRow, returns the value of a keyrow, checking for invalid rows */
-/* and returning no key pressed if row is invalid */
-int dgn_beta_state::GetKeyRow(dgn_beta_state *state, int RowNo)
-{
- if(RowNo==INVALID_KEYROW)
- return NO_KEY_PRESSED; /* row is invalid, so return no key down */
- else
- return m_Keyboard[RowNo]; /* Else return keyboard data */
-}
-
-/*********************************** PIA Handlers ************************/
-/* PIA #0 at $FC20-$FC23 I46
- This handles:-
- The Printer port, side A,
- PB0 R16 (pullup) -> Printer Port (PL1)
- PB1 Printer Port
- PB2 Keyboard (any key).
- PB3 D4 -> R37 -> TR1 switching circuit -> PL5
- PB4 Keyboard Data out, clocked by CB2.
- positive edge clocks data out of the input shift register.
- PB5 Keyboard data in, clocked by PB4.
- PB6 R79 -> I99/6/7416 -> PL9/26/READY (from floppy)
- PB7 Printer port
- CB1 I36/39/6845(Horz Sync)
- CB2 Keyboard (out) Low loads input shift reg
-*/
-READ8_MEMBER(dgn_beta_state::d_pia0_pa_r)
-{
- return 0;
-}
-
-WRITE8_MEMBER(dgn_beta_state::d_pia0_pa_w)
-{
-}
-
-READ8_MEMBER(dgn_beta_state::d_pia0_pb_r)
-{
- int RetVal;
- int Idx;
- int Selected;
- static const char *const keynames[] = {
- "KEY0", "KEY1", "KEY2", "KEY3", "KEY4",
- "KEY5", "KEY6", "KEY7", "KEY8", "KEY9"
- };
-
- LOG_KEYBOARD(("PB Read\n"));
-
- m_KAny_next = 0;
-
- Selected = SelectedKeyrow(this, m_RowShifter);
-
- /* Scan the whole keyboard, if output shifter is all low */
- /* This actually scans in the keyboard */
- if(m_RowShifter == 0x00)
- {
- for(Idx=0; Idx<NoKeyrows; Idx++)
- {
- m_Keyboard[Idx] = ioport(keynames[Idx])->read();
-
- if(m_Keyboard[Idx] != 0x7F)
- m_KAny_next = 1;
- }
- }
- else /* Just scan current row, from previously read values */
- {
- if(GetKeyRow(this, Selected) != NO_KEY_PRESSED)
- m_KAny_next = 1;
- }
-
- RetVal = (m_KInDat_next<<5) | (m_KAny_next<<2);
-
- LOG_KEYBOARD(("FC22=$%02X KAny=%d\n", RetVal, m_KAny_next));
-
- return RetVal;
-}
-
-WRITE8_MEMBER(dgn_beta_state::d_pia0_pb_w)
-{
- int InClkState;
- //int OutClkState;
-
- LOG_KEYBOARD(("PB Write\n"));
-
- InClkState = data & KInClk;
- //OutClkState = data & KOutClk;
-
- LOG_KEYBOARD(("InClkState=$%02X OldInClkState=$%02X Keyrow=$%02X ",InClkState,(m_d_pia0_pb_last & KInClk),m_Keyrow));
-
- /* Input clock bit has changed state */
- if ((InClkState) != (m_d_pia0_pb_last & KInClk))
- {
- /* Clock in bit */
- if(InClkState)
- {
- m_KInDat_next=(~m_Keyrow & 0x40)>>6;
- m_Keyrow = ((m_Keyrow<<1) | 0x01) & 0x7F ;
- LOG_KEYBOARD(("Keyrow=$%02X KInDat_next=%X\n",m_Keyrow,m_KInDat_next));
- }
- }
-
- m_d_pia0_pb_last=data;
-}
-
-WRITE_LINE_MEMBER(dgn_beta_state::d_pia0_cb2_w)
-{
- int RowNo;
- LOG_KEYBOARD(("\nCB2 Write\n"));
-
- /* load keyrow on rising edge of CB2 */
- if((state==1) && (m_d_pia0_cb2_last==0))
- {
- RowNo=SelectedKeyrow(this, m_RowShifter);
- m_Keyrow=GetKeyRow(this, RowNo);
-
- /* Output clock rising edge, clock CB2 value into rowshifterlow to high transition */
- /* In the beta the shift registers are a cmos 4015, and a cmos 4013 in series */
- m_RowShifter = (m_RowShifter<<1) | ((m_d_pia0_pb_last & KOutDat)>>4);
- m_RowShifter &= 0x3FF;
- LOG_KEYBOARD(("Rowshifter=$%02X Keyrow=$%02X\n",m_RowShifter,m_Keyrow));
- if (VERBOSE) debug_console_printf(machine(), "rowshifter clocked, value=%3X, RowNo=%d, Keyrow=%2X\n",m_RowShifter,RowNo,m_Keyrow);
- }
-
- m_d_pia0_cb2_last=state;
-}
-
-
-WRITE_LINE_MEMBER(dgn_beta_state::d_pia0_irq_a)
-{
- cpu0_recalc_irq(state);
-}
-
-WRITE_LINE_MEMBER(dgn_beta_state::d_pia0_irq_b)
-{
- cpu0_recalc_firq(state);
-}
-
-/* PIA #1 at $FC24-$FC27 I63
- This handles :-
- Mouse + Disk Select on side A
- Halt on DMA CPU PA7
- Beeper PB0
- Halt on main CPU PB1
- Character set select PB6
- Baud rate PB1..PB5 ????
-*/
-
-READ8_MEMBER(dgn_beta_state::d_pia1_pa_r)
-{
- return 0;
-}
-
-WRITE8_MEMBER(dgn_beta_state::d_pia1_pa_w)
-{
- int HALT_DMA;
-
- /* Only play with halt line if halt bit changed since last write */
- if((data & 0x80) != m_d_pia1_pa_last)
- {
- /* Bit 7 of $FF24, seems to control HALT on second CPU (through an inverter) */
- if(data & 0x80)
- HALT_DMA = ASSERT_LINE;
- else
- HALT_DMA = CLEAR_LINE;
-
- LOG_HALT(("DMA_CPU HALT=%d\n", HALT_DMA));
- machine().device(DMACPU_TAG)->execute().set_input_line(INPUT_LINE_HALT, HALT_DMA);
-
- /* CPU un-halted let it run ! */
- if (HALT_DMA == CLEAR_LINE)
- m_maincpu->yield();
-
- m_d_pia1_pa_last = data & 0x80;
- }
-
- /* Drive selects are binary encoded on PA0 & PA1 */
- floppy_image_device *floppy = NULL;
-
- switch (~data & 0x03)
- {
- case 0: floppy = m_floppy0->get_device(); break;
- case 1: floppy = m_floppy1->get_device(); break;
- case 2: floppy = m_floppy2->get_device(); break;
- case 3: floppy = m_floppy3->get_device(); break;
- }
-
- m_fdc->set_floppy(floppy);
-
- // not connected: bit 5 = ENP
- m_fdc->dden_w(BIT(data, 6));
- LOG_DISK(("Set density %s\n", BIT(data, 6) ? "low" : "high"));
-}
-
-READ8_MEMBER(dgn_beta_state::d_pia1_pb_r)
-{
- return 0;
-}
-
-WRITE8_MEMBER(dgn_beta_state::d_pia1_pb_w)
-{
- int HALT_CPU;
-
- /* Only play with halt line if halt bit changed since last write */
- if((data & 0x02) != m_d_pia1_pb_last)
- {
- /* Bit 1 of $FF26, seems to control HALT on primary CPU */
- if(data & 0x02)
- HALT_CPU = CLEAR_LINE;
- else
- HALT_CPU = ASSERT_LINE;
-
- LOG_HALT(("MAIN_CPU HALT=%d\n", HALT_CPU));
- m_maincpu->set_input_line(INPUT_LINE_HALT, HALT_CPU);
-
- m_d_pia1_pb_last = data & 0x02;
-
- /* CPU un-halted let it run ! */
- if (HALT_CPU == CLEAR_LINE)
- machine().device(DMACPU_TAG)->execute().yield();
- }
-}
-
-WRITE_LINE_MEMBER(dgn_beta_state::d_pia1_irq_a)
-{
- cpu0_recalc_irq(state);
-}
-
-WRITE_LINE_MEMBER(dgn_beta_state::d_pia1_irq_b)
-{
- cpu0_recalc_irq(state);
-}
-
-/* PIA #2 at FCC0-FCC3 I28
- This handles :-
- DAT task select PA0..PA3
-
- DMA CPU NMI PA7
-
- Graphics control PB0..PB7 ???
- VSYNC intutrupt CB2
-*/
-READ8_MEMBER(dgn_beta_state::d_pia2_pa_r)
-{
- return 0;
-}
-
-WRITE8_MEMBER(dgn_beta_state::d_pia2_pa_w)
-{
- int OldTask;
- int OldEnableMap;
- int NMI;
-
- LOG_TASK(("FCC0 write : $%02X\n", data));
-
- /* Bit 7 of $FFC0, seems to control NMI on second CPU */
- NMI=(data & 0x80);
-
- /* only take action if NMI changed */
- if(NMI != m_DMA_NMI_LAST)
- {
- LOG_INTS(("cpu1 NMI : %d\n", NMI));
- if(!NMI)
- {
- machine().device(DMACPU_TAG)->execute().set_input_line(INPUT_LINE_NMI, ASSERT_LINE);
- logerror("device_yield()\n");
- machine().device(DMACPU_TAG)->execute().yield(); /* Let DMA CPU run */
- }
- else
- {
- machine().device(DMACPU_TAG)->execute().set_input_line(INPUT_LINE_NMI, CLEAR_LINE);
- }
-
- m_DMA_NMI_LAST = NMI; /* Save it for next time */
- }
-
- OldEnableMap = m_EnableMapRegs;
- /* Bit 6 seems to enable memory paging */
- if(data & 0x40)
- m_EnableMapRegs = 0;
- else
- m_EnableMapRegs = 1;
-
- /* Bits 0..3 seem to control which task register is selected */
- OldTask = m_PIATaskReg;
- m_PIATaskReg = data & 0x0F;
-
- LOG_TASK(("OldTask=$%02X EnableMapRegs=%d OldEnableMap=%d\n", OldTask, m_EnableMapRegs, OldEnableMap));
-
- // Maping was enabled or disabled, select apropreate task reg
- // and map it in
- if (m_EnableMapRegs != OldEnableMap)
- {
- if(m_EnableMapRegs)
- m_TaskReg = m_PIATaskReg;
- else
- m_TaskReg = NoPagingTask;
-
- UpdateBanks(0, IOPage + 1);
- }
- else
- {
- // Update ram banks only if task reg changed and mapping enabled
- if ((m_PIATaskReg != OldTask) && (m_EnableMapRegs))
- {
- m_TaskReg = m_PIATaskReg;
- UpdateBanks(0, IOPage + 1);
- }
- }
- LOG_TASK(("TaskReg=$%02X PIATaskReg=$%02X\n", m_TaskReg, m_PIATaskReg));
-}
-
-READ8_MEMBER(dgn_beta_state::d_pia2_pb_r)
-{
- return 0;
-}
-
-WRITE8_MEMBER(dgn_beta_state::d_pia2_pb_w)
-{
- /* Update top video address lines */
- dgnbeta_vid_set_gctrl(data);
-}
-
-WRITE_LINE_MEMBER(dgn_beta_state::d_pia2_irq_a)
-{
- cpu0_recalc_irq(state);
-}
-
-WRITE_LINE_MEMBER(dgn_beta_state::d_pia2_irq_b)
-{
- cpu0_recalc_irq(state);
-}
-
-/************************************ Recalculate CPU inturrupts ****************************/
-/* CPU 0 */
-void dgn_beta_state::cpu0_recalc_irq(int state)
-{
- pia6821_device *pia_0 = machine().device<pia6821_device>( PIA_0_TAG );
- pia6821_device *pia_1 = machine().device<pia6821_device>( PIA_1_TAG );
- pia6821_device *pia_2 = machine().device<pia6821_device>( PIA_2_TAG );
- UINT8 pia0_irq_a = pia_0->irq_a_state();
- UINT8 pia1_irq_a = pia_1->irq_a_state();
- UINT8 pia1_irq_b = pia_1->irq_b_state();
- UINT8 pia2_irq_a = pia_2->irq_a_state();
- UINT8 pia2_irq_b = pia_2->irq_b_state();
- UINT8 IRQ;
-
- if (pia0_irq_a || pia1_irq_a || pia1_irq_b || pia2_irq_a || pia2_irq_b)
- IRQ = ASSERT_LINE;
- else
- IRQ = CLEAR_LINE;
-
- m_maincpu->set_input_line(M6809_IRQ_LINE, IRQ);
- LOG_INTS(("cpu0 IRQ : %d\n", IRQ));
-}
-
-void dgn_beta_state::cpu0_recalc_firq(int state)
-{
- pia6821_device *pia_0 = machine().device<pia6821_device>( PIA_0_TAG );
- UINT8 pia0_irq_b = pia_0->irq_b_state();
- UINT8 FIRQ;
-
- if (pia0_irq_b)
- FIRQ = ASSERT_LINE;
- else
- FIRQ = CLEAR_LINE;
-
- m_maincpu->set_input_line(M6809_FIRQ_LINE, FIRQ);
-
- LOG_INTS(("cpu0 FIRQ : %d\n", FIRQ));
-}
-
-/* CPU 1 */
-
-void dgn_beta_state::cpu1_recalc_firq(int state)
-{
- machine().device(DMACPU_TAG)->execute().set_input_line(M6809_FIRQ_LINE, state);
- LOG_INTS(("cpu1 FIRQ : %d\n",state));
-}
-
-/********************************************************************************************/
-/* Dragon Beta onboard FDC */
-/********************************************************************************************/
-
-/* The INTRQ line goes through pia2 ca1, in exactly the same way as DRQ from DragonDos does */
-WRITE_LINE_MEMBER( dgn_beta_state::dgnbeta_fdc_intrq_w )
-{
- device_t *device = machine().device(PIA_2_TAG);
- LOG_DISK(("dgnbeta_fdc_intrq_w(%d)\n", state));
- if(m_wd2797_written)
- downcast<pia6821_device *>(device)->ca1_w(state);
-}
-
-/* DRQ is routed through various logic to the FIRQ inturrupt line on *BOTH* CPUs */
-WRITE_LINE_MEMBER( dgn_beta_state::dgnbeta_fdc_drq_w )
-{
- LOG_DISK(("dgnbeta_fdc_drq_w(%d)\n", state));
- cpu1_recalc_firq(state);
-}
-
-READ8_MEMBER( dgn_beta_state::dgnbeta_wd2797_r )
-{
- return m_fdc->read(space, offset & 0x03);
-}
-
-WRITE8_MEMBER( dgn_beta_state::dgnbeta_wd2797_w )
-{
- m_wd2797_written = 1;
- m_fdc->write(space, offset & 0x03, data);
-}
-
-/* Scan physical keyboard into Keyboard array */
-/* gonna try and sync this more closely with hardware as keyboard being scanned */
-/* on *EVERY* vblank ! */
-void dgn_beta_state::ScanInKeyboard(void)
-{
-#if 0
- int Idx;
- int Row;
- static const char *const keynames[] = {
- "KEY0", "KEY1", "KEY2", "KEY3", "KEY4",
- "KEY5", "KEY6", "KEY7", "KEY8", "KEY9"
- };
-
- LOG_KEYBOARD(("Scanning Host keyboard\n"));
-
- for(Idx=0; Idx<NoKeyrows; Idx++)
- {
- if (Idx < 10)
- Row = ioport(keynames[Idx])->read();
-
- else
- Row = 0x7f;
-
- m_Keyboard[Idx]=Row;
- LOG_KEYBOARD(("Keyboard[%d]=$%02X\n",Idx,Row));
-
- if (Row != 0x7F)
- {
- LOG_KEYBOARD(("Found Pressed Key\n"));
- }
- }
-#endif
-}
-
-/* VBlank inturrupt */
-void dgn_beta_state::dgn_beta_frame_interrupt (int data)
-{
- pia6821_device *pia_2 = machine().device<pia6821_device>( PIA_2_TAG );
-
- /* Set PIA line, so it recognises inturrupt */
- if (!data)
- pia_2->cb2_w(ASSERT_LINE);
- else
- pia_2->cb2_w(CLEAR_LINE);
-
-// LOG_VIDEO(("Vblank\n"));
- ScanInKeyboard();
-}
-
-#ifdef UNUSED_FUNCTION
-void dgn_beta_state::dgn_beta_line_interrupt (int data)
-{
-// /* Set PIA line, so it recognises inturrupt */
-// if (data)
-// {
-// pia_0_cb1_w(machine, 0,ASSERT_LINE);
-// }
-// else
-// {
-// pia_0_cb1_w(machine, 0,CLEAR_LINE);
-// }
-}
-#endif
-
-
-/********************************* Machine/Driver Initialization ****************************************/
-void dgn_beta_state::machine_reset()
-{
- pia6821_device *pia_0 = machine().device<pia6821_device>( PIA_0_TAG );
- pia6821_device *pia_1 = machine().device<pia6821_device>( PIA_1_TAG );
- pia6821_device *pia_2 = machine().device<pia6821_device>( PIA_2_TAG );
-
- logerror("dgn_beta_state::machine_reset()\n");
-
- m_system_rom = memregion(MAINCPU_TAG)->base();
-
- /* Make sure CPU 1 is started out halted ! */
- machine().device(DMACPU_TAG)->execute().set_input_line(INPUT_LINE_HALT, ASSERT_LINE);
-
- /* Reset to task 0, and map banks disabled, so standard memory map */
- /* with ram at $0000-$BFFF, ROM at $C000-FBFF, IO at $FC00-$FEFF */
- /* and ROM at $FF00-$FFFF */
- m_TaskReg = 0;
- m_PIATaskReg = 0;
- m_EnableMapRegs = 0;
- memset(m_PageRegs, 0, sizeof(m_PageRegs)); /* Reset page registers to 0 */
- SetDefaultTask();
-
- /* Set pullups on all PIA port A, to match what hardware does */
- pia_0->set_port_a_z_mask(0xFF);
- pia_1->set_port_a_z_mask(0xFF);
- pia_2->set_port_a_z_mask(0xFF);
-
- m_d_pia1_pa_last = 0x00;
- m_d_pia1_pb_last = 0x00;
- m_RowShifter = 0x00; /* shift register to select row */
- m_Keyrow = 0x00; /* Keyboard row being shifted out */
- m_d_pia0_pb_last = 0x00; /* Last byte output to pia0 port b */
- m_d_pia0_cb2_last = 0x00; /* Last state of CB2 */
-
- m_KInDat_next = 0x00; /* Next data bit to input */
- m_KAny_next = 0x00; /* Next value for KAny */
-
- m_DMA_NMI_LAST = 0x80; /* start with DMA NMI inactive, as pulled up */
-// DMA_NMI = CLEAR_LINE; /* start with DMA NMI inactive */
-
- m_videoram.set_target(m_ram->pointer(),m_videoram.bytes()); /* Point video ram at the start of physical ram */
-
- m_wd2797_written=0;
-
- m_maincpu->reset();
-}
-
-void dgn_beta_state::machine_start()
-{
- logerror("MACHINE_START( dgnbeta )\n");
-
- if (machine().device<cpu_device>(MAINCPU_TAG)->debug()) {
- machine().device<cpu_device>(MAINCPU_TAG)->debug()->set_dasm_override(dgnbeta_dasm_override);
- }
-
- /* setup debug commands */
- if (machine().debug_flags & DEBUG_FLAG_ENABLED)
- {
- debug_console_register_command(machine(), "beta_dat_log", CMDFLAG_NONE, 0, 0, 0, execute_beta_dat_log);
- debug_console_register_command(machine(), "beta_key_dump", CMDFLAG_NONE, 0, 0, 0, execute_beta_key_dump);
- }
- m_LogDatWrites=0;
-}
-
-
-/***************************************************************************
- OS9 Syscalls for disassembly
-****************************************************************************/
-
-
-static const char *const os9syscalls[] =
-{
- "F$Link", /* Link to Module */
- "F$Load", /* Load Module from File */
- "F$UnLink", /* Unlink Module */
- "F$Fork", /* Start New Process */
- "F$Wait", /* Wait for Child Process to Die */
- "F$Chain", /* Chain Process to New Module */
- "F$Exit", /* Terminate Process */
- "F$Mem", /* Set Memory Size */
- "F$Send", /* Send Signal to Process */
- "F$Icpt", /* Set Signal Intercept */
- "F$Sleep", /* Suspend Process */
- "F$SSpd", /* Suspend Process */
- "F$ID", /* Return Process ID */
- "F$SPrior", /* Set Process Priority */
- "F$SSWI", /* Set Software Interrupt */
- "F$PErr", /* Print Error */
- "F$PrsNam", /* Parse Pathlist Name */
- "F$CmpNam", /* Compare Two Names */
- "F$SchBit", /* Search Bit Map */
- "F$AllBit", /* Allocate in Bit Map */
- "F$DelBit", /* Deallocate in Bit Map */
- "F$Time", /* Get Current Time */
- "F$STime", /* Set Current Time */
- "F$CRC", /* Generate CRC */
- "F$GPrDsc", /* get Process Descriptor copy */
- "F$GBlkMp", /* get System Block Map copy */
- "F$GModDr", /* get Module Directory copy */
- "F$CpyMem", /* Copy External Memory */
- "F$SUser", /* Set User ID number */
- "F$UnLoad", /* Unlink Module by name */
- "F$Alarm", /* Color Computer Alarm Call (system wide) */
- NULL,
- NULL,
- "F$NMLink", /* Color Computer NonMapping Link */
- "F$NMLoad", /* Color Computer NonMapping Load */
- NULL,
- NULL,
- "F$TPS", /* Return System's Ticks Per Second */
- "F$TimAlm", /* COCO individual process alarm call */
- "F$VIRQ", /* Install/Delete Virtual IRQ */
- "F$SRqMem", /* System Memory Request */
- "F$SRtMem", /* System Memory Return */
- "F$IRQ", /* Enter IRQ Polling Table */
- "F$IOQu", /* Enter I/O Queue */
- "F$AProc", /* Enter Active Process Queue */
- "F$NProc", /* Start Next Process */
- "F$VModul", /* Validate Module */
- "F$Find64", /* Find Process/Path Descriptor */
- "F$All64", /* Allocate Process/Path Descriptor */
- "F$Ret64", /* Return Process/Path Descriptor */
- "F$SSvc", /* Service Request Table Initialization */
- "F$IODel", /* Delete I/O Module */
- "F$SLink", /* System Link */
- "F$Boot", /* Bootstrap System */
- "F$BtMem", /* Bootstrap Memory Request */
- "F$GProcP", /* Get Process ptr */
- "F$Move", /* Move Data (low bound first) */
- "F$AllRAM", /* Allocate RAM blocks */
- "F$AllImg", /* Allocate Image RAM blocks */
- "F$DelImg", /* Deallocate Image RAM blocks */
- "F$SetImg", /* Set Process DAT Image */
- "F$FreeLB", /* Get Free Low Block */
- "F$FreeHB", /* Get Free High Block */
- "F$AllTsk", /* Allocate Process Task number */
- "F$DelTsk", /* Deallocate Process Task number */
- "F$SetTsk", /* Set Process Task DAT registers */
- "F$ResTsk", /* Reserve Task number */
- "F$RelTsk", /* Release Task number */
- "F$DATLog", /* Convert DAT Block/Offset to Logical */
- "F$DATTmp", /* Make temporary DAT image (Obsolete) */
- "F$LDAXY", /* Load A [X,[Y]] */
- "F$LDAXYP", /* Load A [X+,[Y]] */
- "F$LDDDXY", /* Load D [D+X,[Y]] */
- "F$LDABX", /* Load A from 0,X in task B */
- "F$STABX", /* Store A at 0,X in task B */
- "F$AllPrc", /* Allocate Process Descriptor */
- "F$DelPrc", /* Deallocate Process Descriptor */
- "F$ELink", /* Link using Module Directory Entry */
- "F$FModul", /* Find Module Directory Entry */
- "F$MapBlk", /* Map Specific Block */
- "F$ClrBlk", /* Clear Specific Block */
- "F$DelRAM", /* Deallocate RAM blocks */
- "F$GCMDir", /* Pack module directory */
- "F$AlHRam", /* Allocate HIGH RAM Blocks */
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- "F$RegDmp", /* Ron Lammardo's debugging register dump call */
- "F$NVRAM", /* Non Volatile RAM (RTC battery backed static) read/write */
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- "I$Attach", /* Attach I/O Device */
- "I$Detach", /* Detach I/O Device */
- "I$Dup", /* Duplicate Path */
- "I$Create", /* Create New File */
- "I$Open", /* Open Existing File */
- "I$MakDir", /* Make Directory File */
- "I$ChgDir", /* Change Default Directory */
- "I$Delete", /* Delete File */
- "I$Seek", /* Change Current Position */
- "I$Read", /* Read Data */
- "I$Write", /* Write Data */
- "I$ReadLn", /* Read Line of ASCII Data */
- "I$WritLn", /* Write Line of ASCII Data */
- "I$GetStt", /* Get Path Status */
- "I$SetStt", /* Set Path Status */
- "I$Close", /* Close Path */
- "I$DeletX" /* Delete from current exec dir */
-};
-
-
-static offs_t dgnbeta_dasm_override(device_t &device, char *buffer, offs_t pc, const UINT8 *oprom, const UINT8 *opram, int options)
-{
- unsigned call;
- unsigned result = 0;
-
- if ((oprom[0] == 0x10) && (oprom[1] == 0x3F))
- {
- call = oprom[2];
- if ((call < ARRAY_LENGTH(os9syscalls)) && os9syscalls[call])
- {
- sprintf(buffer, "OS9 %s", os9syscalls[call]);
- result = 3;
- }
- }
- return result;
-}
-
-static void execute_beta_dat_log(running_machine &machine, int ref, int params, const char *param[])
-{
- dgn_beta_state *state = machine.driver_data<dgn_beta_state>();
- state->m_LogDatWrites=!state->m_LogDatWrites;
-
- debug_console_printf(machine, "DAT register write info set : %d\n",state->m_LogDatWrites);
-}
-
-static void execute_beta_key_dump(running_machine &machine, int ref, int params, const char *param[])
-{
- dgn_beta_state *state = machine.driver_data<dgn_beta_state>();
- int Idx;
-
- for(Idx=0;Idx<NoKeyrows;Idx++)
- {
- debug_console_printf(machine, "KeyRow[%d]=%2X\n",Idx,state->m_Keyboard[Idx]);
- }
-}