OSDN Git Service

[VM][FMTOWNS] Improbe I/O definition.
authorK.Ohta <whatisthis.sowhat@gmail.com>
Wed, 22 Jan 2020 18:23:30 +0000 (03:23 +0900)
committerK.Ohta <whatisthis.sowhat@gmail.com>
Wed, 22 Jan 2020 18:23:30 +0000 (03:23 +0900)
[VM][FMTOWNS] Add secret free run counter (Thanks to developer of MAME).

13 files changed:
source/src/vm/fmtowns/adpcm.cpp
source/src/vm/fmtowns/floppy.cpp
source/src/vm/fmtowns/floppy.h
source/src/vm/fmtowns/fmtowns.cpp
source/src/vm/fmtowns/keyboard.cpp
source/src/vm/fmtowns/keyboard.h
source/src/vm/fmtowns/timer.cpp
source/src/vm/fmtowns/timer.h
source/src/vm/fmtowns/towns_crtc.cpp
source/src/vm/fmtowns/towns_crtc.h
source/src/vm/fmtowns/towns_memory.cpp
source/src/vm/fmtowns/towns_memory.h
source/src/vm/fmtowns/towns_vram.cpp

index aa41429..f63d890 100644 (file)
@@ -132,7 +132,7 @@ uint32_t ADPCM::read_io8(uint32_t addr)
                                dac_intr[i] = false;
                        }
                        if(_s) {
-                               d_pic->write_signal(SIG_I8259_IR5 | SIG_I8259_CHIP1, 0x00000000, 0xffffffff);
+                               write_signals(&outputs_intr, 0);
                        }
                }
                break;
index 39fb3dd..7af8fab 100644 (file)
@@ -76,7 +76,7 @@ void FLOPPY::write_signal(int id, uint32_t data, uint32_t mask)
 
 void FLOPPY::update_intr()
 {
-       d_pic->write_signal(SIG_I8259_CHIP0 | SIG_I8259_IR6, irq && irqmsk ? 1 : 0, 1);
+       write_signals(&output_intr_line, irq && irqmsk ? 1 : 0);
 }
 
 #define STATE_VERSION  1
index d1725bf..a570f4f 100644 (file)
@@ -24,14 +24,16 @@ class FLOPPY : public DEVICE
 {
 private:
        MB8877 *d_fdc;
-       DEVICE *d_pic;
-       
+       outputs_t output_intr_line;
        int drvreg, drvsel;
        bool irq, irqmsk, changed[4];
        void update_intr();
        
 public:
-       FLOPPY(VM_TEMPLATE* parent_vm, EMU* parent_emu) : DEVICE(parent_vm, parent_emu) {}
+       FLOPPY(VM_TEMPLATE* parent_vm, EMU* parent_emu) : DEVICE(parent_vm, parent_emu)
+       {
+               initialize_output_signals(&output_intr_line);
+       }
        ~FLOPPY() {}
        
        // common functions
@@ -47,9 +49,9 @@ public:
        {
                d_fdc = device;
        }
-       void set_context_pic(DEVICE* device)
+       void set_context_intr_line(DEVICE* dev, int id, uint32_t mask)
        {
-               d_pic = device;
+               register_output_signal(&output_intr_line, dev, id, mask);
        }
        void change_disk(int drv)
        {
index 14d3964..883e9da 100644 (file)
@@ -281,39 +281,6 @@ VM::VM(EMU* parent_emu) : VM_TEMPLATE(parent_emu)
        event->set_context_sound(seek_sound);
        event->set_context_sound(head_down_sound);
        event->set_context_sound(head_up_sound);
-
-       
-/*     pic     0       timer
-               1       keyboard
-               2       rs-232c
-               3       ex rs-232c
-               4       (option)
-               5       (option)
-               6       floppy drive or dma ???
-               7       (slave)
-               8       scsi
-               9       cd-rom controller
-               10      (option)
-               11      crtc vsync
-               12      printer
-               13      sound (OPN2 + ADPCM)
-               14      (option)
-               15      (reserve)
-       nmi 0   keyboard (RAS)
-        1   extend slot
-       dma     0       floppy drive
-               1       hard drive
-               2       printer
-               3       cd-rom controller
-    dma 4   extend slot
-        5   (reserve)
-        6   (reserve)
-        7   (reserve)
-
-
-*/
-       
-       
        
        pit0->set_context_ch0(timer, SIG_TIMER_CH0, 1);
        pit0->set_context_ch1(timer, SIG_TIMER_CH1, 1);
@@ -322,8 +289,8 @@ VM::VM(EMU* parent_emu) : VM_TEMPLATE(parent_emu)
        pit0->set_constant_clock(1, 307200);
        pit0->set_constant_clock(2, 307200);
        pit1->set_constant_clock(1, 1228800);
-       pic->set_context_cpu(cpu);
-       fdc->set_context_drq(dma, SIG_UPD71071_CH0, 1);
+//     pic->set_context_cpu(cpu);
+       pic->set_context_cpu(memory);
        fdc->set_context_irq(floppy, SIG_FLOPPY_IRQ, 1);
        rtc->set_context_data(timer, SIG_TIMER_RTC, 0x0f, 0);
        rtc->set_context_busy(timer, SIG_TIMER_RTC, 0x80);
@@ -337,8 +304,6 @@ VM::VM(EMU* parent_emu) : VM_TEMPLATE(parent_emu)
        dma->set_context_child_dma(extra_dma);
        
        floppy->set_context_fdc(fdc);
-       floppy->set_context_pic(pic);
-       keyboard->set_context_pic(pic);
        
        sprite->set_context_vram(vram);
        vram->set_context_sprite(sprite);
@@ -367,15 +332,11 @@ VM::VM(EMU* parent_emu) : VM_TEMPLATE(parent_emu)
 
        cdc->set_context_cdrom(cdrom);
        cdc->set_context_scsi_host(cdc_scsi);
-       cdc->set_context_dmareq_line(dma, SIG_UPD71071_CH3, 0xff);
-//     cdc->set_context_pic(pic, SIG_I8259_CHIP1 | SIG_I8259_IR1);
+//     cdc->set_context_dmaint_line(dma, SIG_UPD71071_CH3, 0xff);
        
-       crtc->set_context_vsync(pic, SIG_I8259_CHIP1 | SIG_I8259_IR3, 0xffffffff); // VSYNC
        adpcm->set_context_opn2(opn2);
        adpcm->set_context_rf5c68(rf5c68);
        adpcm->set_context_adc(adc);
-       adpcm->set_context_pic(pic);
-       adpcm->set_context_intr_line(pic, SIG_I8259_CHIP1 | SIG_I8259_IR5, 0xffffffff); // ADPCM AND OPN2
 
        rf5c68->set_context_interrupt_boundary(adpcm, SIG_ADPCM_WRITE_INTERRUPT, 0xffffffff);
        opn2->set_context_irq(adpcm, SIG_ADPCM_OPX_INTR, 0xffffffff);
@@ -385,10 +346,9 @@ VM::VM(EMU* parent_emu) : VM_TEMPLATE(parent_emu)
        adc->set_context_interrupt(adpcm, SIG_ADPCM_ADC_INTR, 0xffffffff); 
        
        scsi->set_context_dma(dma);
-       scsi->set_context_pic(pic);
        scsi->set_context_host(scsi_host);
+       scsi->set_context_pic(pic);
        timer->set_context_pcm(beep);
-       timer->set_context_pic(pic);
        timer->set_context_rtc(rtc);
        
        // cpu bus
@@ -400,122 +360,153 @@ VM::VM(EMU* parent_emu) : VM_TEMPLATE(parent_emu)
 #ifdef USE_DEBUGGER
        cpu->set_context_debugger(new DEBUGGER(this, emu));
 #endif
+       // Interrupts
+       // IRQ0  : TIMER
+       // IRQ1  : KEYBOARD
+       // IRQ2  : USART (ToDo)
+       // IRQ3  : EXTRA USART (ToDo)
+       // IRQ4  : EXTRA I/O (Maybe not implement)
+       // IRQ5  : EXTRA I/O (Maybe not implement)
+       // IRQ6  : FDC
+       // IRQ7  : Deisy chain (to IRQ8 - 15)
+       timer->set_context_intr_line(pic, SIG_I8259_CHIP0 | SIG_I8259_IR0, 0xffffffff);
+       keyboard->set_context_intr_line(pic, SIG_I8259_CHIP0 | SIG_I8259_IR1, 0xffffffff);
+       floppy->set_context_intr_line(pic, SIG_I8259_CHIP0 | SIG_I8259_IR6, 0xffffffff);
+       
+       // IRQ8  : SCSI (-> scsi.cpp)
+       // IRQ9  : CDC
+       // IRQ10 : EXTRA I/O (Maybe not implement)
+       // IRQ11 : VSYNC
+       // IRQ12 : PRINTER (ToDo)
+       // IRQ13 : ADPCM AND OPN2 (Route to adpcm.cpp)
+       // IRQ14 : EXTRA I/O (Maybe not implement)
+       // IRQ15 : RESERVED.
+       cdc->set_context_dmaint_line(pic, SIG_I8259_CHIP1 | SIG_I8259_IR1, 0xffffffff);
+       cdc->set_context_mpuint_line(pic, SIG_I8259_CHIP1 | SIG_I8259_IR1, 0xffffffff);
+       crtc->set_context_vsync(pic, SIG_I8259_CHIP1 | SIG_I8259_IR3, 0xffffffff);
+       adpcm->set_context_intr_line(pic, SIG_I8259_CHIP1 | SIG_I8259_IR5, 0xffffffff);
+
+       // DMA0  : FDC/DRQ
+       // DMA1  : SCSI (-> scsi.cpp)
+       // DMA2  : PRINTER (ToDo)
+       // DMA3  : CDC
+       // EXTRA DMA0 : EXTRA SLOT (Maybe not implement)
+       // EXTRA DMA1 : Reserved
+       // EXTRA DMA2 : Reserved
+       // EXTRA DMA3 : Reserved
+       fdc->set_context_drq(dma, SIG_UPD71071_CH0, 1);
+       cdc->set_context_dmareq_line(dma, SIG_UPD71071_CH3, 0xff);
+
+       // NMI0 : KEYBOARD (RAS)
+       // NMI1 : Extra SLOT (Maybe not implement)
+       keyboard->set_context_nmi_line(memory, SIG_CPU_NMI, 0xffffffff);
        
        // i/o bus
-       io->set_iomap_alias_rw(0x00, pic, I8259_ADDR_CHIP0 | 0);
-       io->set_iomap_alias_rw(0x02, pic, I8259_ADDR_CHIP0 | 1);
-       io->set_iomap_alias_rw(0x10, pic, I8259_ADDR_CHIP1 | 0);
-       io->set_iomap_alias_rw(0x12, pic, I8259_ADDR_CHIP1 | 1);
-       io->set_iomap_single_rw(0x20, memory);  // reset
-       io->set_iomap_single_r(0x21, memory);   // cpu misc
-       io->set_iomap_single_w(0x22, memory);   // power
-       io->set_iomap_single_rw(0x24, memory);  // dma
-       io->set_iomap_single_r(0x25, memory);   // cpu_misc4 (after Towns2)
-       io->set_iomap_single_r(0x26, timer);
-       io->set_iomap_single_r(0x27, timer);
-       io->set_iomap_single_r(0x28, memory);   // NMI MASK (after Towns2)
-       io->set_iomap_single_r(0x30, memory);   // cpu id
-       io->set_iomap_single_r(0x31, memory);   // cpu id
-       
-       io->set_iomap_single_rw(0x32, serialrom);       // serial rom
-
-       io->set_iomap_alias_rw(0x40, pit0, 0);
-       io->set_iomap_alias_rw(0x42, pit0, 1);
-       io->set_iomap_alias_rw(0x44, pit0, 2);
-       io->set_iomap_alias_rw(0x46, pit0, 3);
-       io->set_iomap_alias_rw(0x50, pit1, 0);
-       io->set_iomap_alias_rw(0x52, pit1, 1);
-       io->set_iomap_alias_rw(0x54, pit1, 2);
-       io->set_iomap_alias_rw(0x56, pit1, 3);
-       
-       io->set_iomap_single_rw(0x60, timer);
-       io->set_iomap_single_rw(0x68, timer); // Interval timer register2 (after Towns 10F).
-       io->set_iomap_single_rw(0x6a, timer); // Interval timer register2 (after Towns 10F).
-       io->set_iomap_single_rw(0x6b, timer); // Interval timer register2 (after Towns 10F).
-       io->set_iomap_single_rw(0x6c, memory); // 1uS wait register (after Towns 10F).
-       
-       io->set_iomap_single_rw(0x70, timer);
-       io->set_iomap_single_w(0x80, timer);
-       
-       io->set_iomap_range_rw(0xa0, 0xaf, dma);
-       io->set_iomap_range_rw(0xb0, 0xbf, extra_dma);
-       
-       io->set_iomap_alias_rw(0x200, fdc, 0);
-       io->set_iomap_alias_rw(0x202, fdc, 1);
-       io->set_iomap_alias_rw(0x204, fdc, 2);
-       io->set_iomap_alias_rw(0x206, fdc, 3);
-       io->set_iomap_single_rw(0x208, floppy);
-       io->set_iomap_single_rw(0x20c, floppy);
-       io->set_iomap_single_rw(0x20e, floppy); // Towns drive SW
-       
-       io->set_iomap_single_rw(0x400, memory); // System Status
-       io->set_iomap_single_rw(0x402, memory);
-       io->set_iomap_single_rw(0x404, memory); // System status
-       io->set_iomap_range_rw(0x406, 0x43f, memory);
-       
-       io->set_iomap_range_rw(0x440, 0x443, crtc); // CRTC
-       io->set_iomap_range_rw(0x448, 0x44f, crtc); // 
-       io->set_iomap_single_rw(0x450, sprite); //
-       io->set_iomap_single_rw(0x452, sprite); //
-       
-       io->set_iomap_range_rw(0x458, 0x45f, vram); // CRTC
-       
-       io->set_iomap_single_rw(0x480, memory); //
-       io->set_iomap_single_rw(0x484, dictionary); // Dictionary
+       io->set_iomap_alias_rw (0x0000, pic, I8259_ADDR_CHIP0 | 0);
+       io->set_iomap_alias_rw (0x0002, pic, I8259_ADDR_CHIP0 | 1);
+       io->set_iomap_alias_rw (0x0010, pic, I8259_ADDR_CHIP1 | 0);
+       io->set_iomap_alias_rw (0x0012, pic, I8259_ADDR_CHIP1 | 1);
+       
+       io->set_iomap_range_rw (0x0020, 0x0028, memory);
+       io->set_iomap_range_r  (0x0030, 0x0031, memory);        // cpu id / machine id
+       io->set_iomap_single_rw(0x0032, memory);        // serial rom (routed from memory)
+
+       io->set_iomap_alias_rw(0x0040, pit0, 0);
+       io->set_iomap_alias_rw(0x0042, pit0, 1);
+       io->set_iomap_alias_rw(0x0044, pit0, 2);
+       io->set_iomap_alias_rw(0x0046, pit0, 3);
+       io->set_iomap_alias_rw(0x0050, pit1, 0);
+       io->set_iomap_alias_rw(0x0052, pit1, 1);
+       io->set_iomap_alias_rw(0x0054, pit1, 2);
+       io->set_iomap_alias_rw(0x0056, pit1, 3);
+       
+       io->set_iomap_single_rw(0x0060, timer);
+       io->set_iomap_single_rw(0x0068, timer); // Interval timer register2 (after Towns 10F).
+       io->set_iomap_single_rw(0x006a, timer); // Interval timer register2 (after Towns 10F).
+       io->set_iomap_single_rw(0x006b, timer); // Interval timer register2 (after Towns 10F).
+       io->set_iomap_single_rw(0x006c, memory); // 1uS wait register (after Towns 10F).
+       
+       io->set_iomap_single_rw(0x0070, timer); // RTC DATA
+       io->set_iomap_single_w (0x0080, timer); // RTC COMMAND
+       
+       io->set_iomap_range_rw (0x00a0, 0x00af, dma);
+       io->set_iomap_range_rw (0x00b0, 0x00bf, extra_dma);
+       
+       io->set_iomap_alias_rw (0x0200, fdc, 0);  // STATUS/COMMAND
+       io->set_iomap_alias_rw (0x0202, fdc, 1);  // TRACK
+       io->set_iomap_alias_rw (0x0204, fdc, 2);  // SECTOR
+       io->set_iomap_alias_rw (0x0206, fdc, 3);  // DATA
+       io->set_iomap_single_rw(0x0208, floppy);  // DRIVE STATUS / DRIVE CONTROL
+       io->set_iomap_single_rw(0x020c, floppy);  // DRIVE SELECT
+       io->set_iomap_single_rw(0x020e, floppy);  // Towns drive SW
+       
+       io->set_iomap_range_rw (0x0400, 0x0404, memory); // System Status
+       io->set_iomap_range_rw (0x0406, 0x403f, memory); // Reserved
+       
+       io->set_iomap_range_rw(0x0440, 0x0443, crtc); // CRTC
+       io->set_iomap_range_rw(0x0448, 0x044f, crtc); // VIDEO OUT (CRTC)
+       
+       io->set_iomap_range_rw(0x0450, 0x0452, sprite); // SPRITE
+       
+       io->set_iomap_single_rw(0x0458, vram);         // VRAM ACCESS CONTROLLER (ADDRESS)
+       io->set_iomap_range_rw (0x045a, 0x045f, vram); // VRAM ACCESS CONTROLLER (DATA)
+       
+       io->set_iomap_single_rw(0x0480, sysrom); //  MEMORY REGISTER
+       io->set_iomap_single_rw(0x0484, dictionary); // Dictionary
+       
        //io->set_iomap_alias_r(0x48a, memory_card, 0); //
        //io->set_iomap_alias_rw(0x490, memory_card); // After Towns2
        //io->set_iomap_alias_rw(0x491, memory_card); // After Towns2
        
-       io->set_iomap_range_rw(0x4c0, 0x4cf, cdc); // CDROM
+       io->set_iomap_range_rw(0x04c0, 0x04cf, cdc); // CDROM
        // PAD, Sound
 #if 0
-       io->set_iomap_alias_r(0x4d0, pad, 0); // Pad1
-       io->set_iomap_alias_r(0x4d2, pad, 1); // Pad 2
-       io->set_iomap_alias_rw(0x4d5, adpcm, 0); // mute 
-       io->set_iomap_alias_w(0x4d6, pad, 3); // Pad out
-#else
-       io->set_iomap_alias_rw(0x4d5, adpcm, 0); // mute 
+       io->set_iomap_single_r(0x04d0, pad); // Pad1
+       io->set_iomap_single_r(0x04d2, pad); // Pad 2
+       io->set_iomap_single_w(0x04d6, pad); // Pad out
 #endif 
+       io->set_iomap_single_rw(0x04d5, adpcm); // mute 
        // OPN2(YM2612)
-       io->set_iomap_alias_rw(0x4d8, opn2, 0); // STATUS(R)/Addrreg 0(W)
-       io->set_iomap_alias_w(0x4da, opn2, 1);  // Datareg 0(W)
-       io->set_iomap_alias_w(0x4dc, opn2, 2);  // Addrreg 1(W)
-       io->set_iomap_alias_w(0x4de, opn2, 3);  // Datareg 1(W)
+       io->set_iomap_alias_rw(0x04d8, opn2, 0); // STATUS(R)/Addrreg 0(W)
+       io->set_iomap_alias_w (0x04da, opn2, 1);  // Datareg 0(W)
+       io->set_iomap_alias_w (0x04dc, opn2, 2);  // Addrreg 1(W)
+       io->set_iomap_alias_w (0x04de, opn2, 3);  // Datareg 1(W)
        // Electrical volume
-//     io->set_iomap_alias_rw(0x4e0, e_volume[0], 0);
-//     io->set_iomap_alias_rw(0x4e1, e_volume[0], 1);
-//     io->set_iomap_alias_rw(0x4e2, e_volume[1], 0);
-//     io->set_iomap_alias_rw(0x4e3, e_volume[1], 1);
+//     io->set_iomap_alias_rw(0x04e0, e_volume[0], 0);
+//     io->set_iomap_alias_rw(0x04e1, e_volume[0], 1);
+//     io->set_iomap_alias_rw(0x04e2, e_volume[1], 0);
+//     io->set_iomap_alias_rw(0x04e3, e_volume[1], 1);
 
        // ADPCM
-       io->set_iomap_range_w(0x4e7, 0x4ff, adpcm); // 
-
-       io->set_iomap_single_rw(0x5c0, memory); // NMI MASK
-       io->set_iomap_single_r(0x5c2, memory);  // NMI STATUS
-       io->set_iomap_single_r(0x5c8, vram); // TVRAM EMULATION
-       io->set_iomap_single_w(0x5ca, vram); // VSYNC INTERRUPT
-       
-       io->set_iomap_single_r(0x5e8, memory); // RAM capacity register.(later Towns1H/2H/1F/2F).
-       io->set_iomap_single_r(0x5ec, memory); // RAM Wait register , ofcially after Towns2, but exists after Towns1H.
-       
-       io->set_iomap_single_rw(0x600, keyboard);
-       io->set_iomap_single_rw(0x602, keyboard);
-       io->set_iomap_single_rw(0x604, keyboard);
-       //io->set_iomap_single_r(0x606, keyboard); // BufFul (After Towns2)
-
-       //io->set_iomap_single_rw(0x800, printer);
-       //io->set_iomap_single_rw(0x802, printer);
-       //io->set_iomap_single_rw(0x804, printer);
-       
-       io->set_iomap_alias_rw(0xa00, sio, 0);
-       io->set_iomap_alias_rw(0xa02, sio, 1);
-//     io->set_iomap_single_r(0xa04, serial);
-//     io->set_iomap_single_r(0xa06, serial);
-//     io->set_iomap_single_w(0xa08, serial);
-//     io->set_iomap_single_rw(0xa0a, modem);
-       
-       io->set_iomap_single_rw(0xc30, scsi);
-       io->set_iomap_single_rw(0xc32, scsi);
+       io->set_iomap_range_rw(0x04e7, 0x04ef, adpcm); // A/D SAMPLING DATA REG 
+       io->set_iomap_range_rw(0x04f0, 0x04ff, adpcm); // A/D SAMPLING DATA REG 
+
+       io->set_iomap_single_rw(0x05c0, memory); // NMI MASK
+       io->set_iomap_single_r (0x05c2, memory);  // NMI STATUS
+       io->set_iomap_single_r (0x05c8, vram); // TVRAM EMULATION
+       io->set_iomap_single_w (0x05ca, vram); // VSYNC INTERRUPT
+       
+       io->set_iomap_single_rw(0x05e8, memory); // RAM capacity register.(later Towns1H/2H/1F/2F).
+       io->set_iomap_single_rw(0x05ec, memory); // RAM Wait register , ofcially after Towns2, but exists after Towns1H.
+       
+       io->set_iomap_single_rw(0x0600, keyboard);
+       io->set_iomap_single_rw(0x0602, keyboard);
+       io->set_iomap_single_rw(0x0604, keyboard);
+       io->set_iomap_single_r (0x0606, keyboard); // BufFul (After Towns2)
+
+       //io->set_iomap_single_rw(0x0800, printer);
+       //io->set_iomap_single_rw(0x0802, printer);
+       //io->set_iomap_single_rw(0x0804, printer);
+       
+       io->set_iomap_alias_rw (0x0a00, sio, 0);
+       io->set_iomap_alias_rw (0x0a02, sio, 1);
+//     io->set_iomap_single_r (0x0a04, serial);
+//     io->set_iomap_single_r (0x0a06, serial);
+//     io->set_iomap_single_w (0x0a08, serial);
+//     io->set_iomap_single_rw(0x0a0a, modem);
+       
+       io->set_iomap_single_rw(0x0c30, scsi);
+       io->set_iomap_single_rw(0x0c32, scsi);
 
        
        io->set_iomap_range_rw(0x3000, 0x3fff, dictionary); // CMOS
index 8ef55ec..882748b 100644 (file)
@@ -53,7 +53,7 @@ uint32_t KEYBOARD::read_io8(uint32_t addr)
        switch(addr) {
        case 0x600:
                kbint &= ~1;
-               d_pic->write_signal(SIG_I8259_CHIP0 | SIG_I8259_IR1, 0, 0);
+               write_signals(&output_intr_line, 0);
                kbstat &= ~1;
                return kbdata;
        case 0x602:
@@ -72,7 +72,7 @@ void KEYBOARD::event_frame()
        }
        if((kbstat & 1) && (kbmsk & 1) && !(kbint & 1)) {
                kbint |= 1;
-               d_pic->write_signal(SIG_I8259_CHIP0 | SIG_I8259_IR1, 1, 1);
+               write_signals(&output_intr_line, 0xffffffff);
        }
 //     kbstat &= ~2;
 }
index d68ed49..d4c6b19 100644 (file)
@@ -56,14 +56,18 @@ namespace FMTOWNS {
 class KEYBOARD : public DEVICE
 {
 private:
-       DEVICE* d_pic;
+       outputs_t output_intr_line;
+       outputs_t output_nmi_line;
        
        FIFO *key_buf;
        uint8_t kbstat, kbdata, kbint, kbmsk;
        uint8_t table[256];
-       
 public:
-       KEYBOARD(VM_TEMPLATE* parent_vm, EMU* parent_emu) : DEVICE(parent_vm, parent_emu) {}
+       KEYBOARD(VM_TEMPLATE* parent_vm, EMU* parent_emu) : DEVICE(parent_vm, parent_emu)
+       {
+               initialize_output_signals(&output_intr_line);
+               initialize_output_signals(&output_nmi_line);
+       }
        ~KEYBOARD() {}
        
        // common functions
@@ -76,9 +80,13 @@ public:
        bool process_state(FILEIO* state_fio, bool loading);
        
        // unique functions
-       void set_context_pic(DEVICE* device)
+       void set_context_intr_line(DEVICE* dev, int id, uint32_t mask)
+       {
+               register_output_signal(&output_intr_line, dev, id, mask);
+       }
+       void set_context_nmi_line(DEVICE* dev, int id, uint32_t mask)
        {
-               d_pic = device;
+               register_output_signal(&output_nmi_line, dev, id, mask);
        }
        void key_down(int code);
        void key_up(int code);
index 4405867..5a481b5 100644 (file)
@@ -79,9 +79,9 @@ void TIMER::write_signal(int id, uint32_t data, uint32_t mask)
 void TIMER::update_intr()
 {
        if((tmout0 && (intr_reg & 1)) || (tmout1 && (intr_reg & 2))) {
-               d_pic->write_signal(SIG_I8259_CHIP0 | SIG_I8259_IR0, 1, 1);
+               write_signals(&output_intr_line, 1);
        } else {
-               d_pic->write_signal(SIG_I8259_CHIP0 | SIG_I8259_IR0, 0, 1);
+               write_signals(&output_intr_line, 0);
        }
 }
 
index 6503bd0..98d7bbf 100644 (file)
@@ -23,7 +23,8 @@ namespace FMTOWNS {
 class TIMER : public DEVICE
 {
 private:
-       DEVICE *d_pcm, *d_pic, *d_rtc;
+       DEVICE *d_pcm, *d_rtc;
+       outputs_t output_intr_line;
        
        uint16_t free_run_counter;
        uint8_t intr_reg, rtc_data;
@@ -31,7 +32,10 @@ private:
        void update_intr();
        
 public:
-       TIMER(VM_TEMPLATE* parent_vm, EMU* parent_emu) : DEVICE(parent_vm, parent_emu) {}
+       TIMER(VM_TEMPLATE* parent_vm, EMU* parent_emu) : DEVICE(parent_vm, parent_emu)
+       {
+               initialize_output_signals(&output_intr_line);
+       }
        ~TIMER() {}
        
        // common functions
@@ -47,14 +51,14 @@ public:
        {
                d_pcm = device;
        }
-       void set_context_pic(DEVICE* device)
-       {
-               d_pic = device;
-       }
        void set_context_rtc(DEVICE* device)
        {
                d_rtc = device;
        }
+       void set_context_intr_line(DEVICE* dev, int id, uint32_t mask)
+       {
+               register_output_signal(&output_intr_line, dev, id, mask);
+       }
 };
 }
 
index e976a2c..8b2c29e 100644 (file)
@@ -154,10 +154,19 @@ void TOWNS_CRTC::reset()
        set_lines_per_frame(512);
        //set_pixels_per_line(640);
        
+       set_vsync(vsync, true);
+       
        force_recalc_crtc_param();
 //     register_event(this, EVENT_CRTC_VSTART, vstart_us, false, &event_id_vstart);
 }
 
+void TOWNS_CRTC::set_vsync(bool val, bool force)
+{
+       if((vsync != val) || (force)) {
+               write_signals(&outputs_int_vsync, (val) ? 0xffffffff : 0x00000000);
+               vsync = val;
+       }
+}
 void TOWNS_CRTC::restart_display()
 {
        // ToDo
@@ -212,6 +221,24 @@ void TOWNS_CRTC::force_recalc_crtc_param(void)
                horiz_start_us[layer] = ((double)(regs[(layer << 1) + 9] & 0x07ff)) * crtc_clock ;   // HDSx
                horiz_end_us[layer] =   ((double)(regs[(layer << 1) + 9 + 1] & 0x07ff)) * crtc_clock ;   // HDEx
        }
+#if 1
+       out_debug_log(_T("RECALC: CRTC_CLOCK=%f MHz FPS=%f"), 1.0 / crtc_clock, 1.0e6 / frame_us);
+       _TCHAR sdata[32 * 5];
+       _TCHAR sdata2[8];
+       for(int q = 0; q < 4; q++) {
+               memset(sdata, 0x00, sizeof(sdata));
+               for(int r = 0; r < 8; r++) {
+                       my_sprintf_s(sdata2, 8, "%04X ", regs[r + q * 8]);
+                       my_tcscat_s(sdata, sizeof(sdata) / sizeof(_TCHAR), sdata2);
+               }
+               out_debug_log(_T("RECALC: regs[%02d..%02d]= %s"), q * 8, q * 8 + 7, sdata);
+       }
+       out_debug_log(_T("RECALC: HORIZ_us=%f HORIZ_WIDTH_P_us=%f HORIZ_WIDTH_N_us=%f"), horiz_us, horiz_width_posi_us, horiz_width_nega_us);
+       out_debug_log(_T("RECALC: VERT_SYNC_PRE_us=%f VST2_us=%f EET_us=%f frame_us=%f"), vert_sync_pre_us, vst2_us, eet_us, frame_us);
+       for(int q = 0; q < 2; q++) {
+               out_debug_log(_T("RECALC: LAYER%d: VERT_START_us=%f VERT_END_us=%f HORIZ_START_us=%f HORIZ_END_us=%f"), q, vert_start_us[q], vert_end_us[q], horiz_start_us[q], horiz_end_us[q]);
+       }
+#endif
        req_recalc = false;
 }
 
@@ -240,8 +267,17 @@ void TOWNS_CRTC::write_io8(uint32_t addr, uint32_t data)
                }
                break;
        case 0x0448:
+               voutreg_num = data & 0x01;
+               break;
        case 0x044a:
+               if(voutreg_num == 0) {
+                       voutreg_ctrl = data & 0x10;
+               } else if(voutreg_num == 1) {
+                       voutreg_prio = data & 0x10;
+               }                       
+               break;
        case 0x044c:
+               break;
        case 0xfd98:
        case 0xfd99:
        case 0xfd9a:
@@ -250,8 +286,21 @@ void TOWNS_CRTC::write_io8(uint32_t addr, uint32_t data)
        case 0xfd9d:
        case 0xfd9e:
        case 0xfd9f:
+               {
+                       pair32_t n;
+                       n.d = data;
+                       if(addr == 0xfd9f) {
+                               dpalette_regs[7] = n.b.l & 0x0f;
+                       } else {
+                               dpalette_regs[addr & 7] = n.b.l & 0x0f;
+                               dpalette_regs[(addr + 1) & 7] = n.b.h & 0x0f;
+                       }
+                       dpalette_changed = true;
+               }
+               break;
        case 0xfda0:
-               write_io16(addr, data);
+               crtout[0] = ((data & 0x0c) != 0) ? true : false;
+               crtout[1] = ((data & 0x03) != 0) ? true : false;
                break;
        }
 }
@@ -259,13 +308,8 @@ void TOWNS_CRTC::write_io8(uint32_t addr, uint32_t data)
 void TOWNS_CRTC::write_io16(uint32_t addr, uint32_t data)
 {
 //     out_debug_log(_T("WRITE16 ADDR=%04x DATA=%04x"), addr, data);
-       switch(addr) {
-       case 0x0440:
-       case 0x0441:
-               crtc_ch = data & 0x1f;
-               break;
+       switch(addr & 0xfffe) {
        case 0x0442:
-       case 0x0443:
                {
                        if(crtc_ch < 32) {
                                if((crtc_ch < 0x09) && ((crtc_ch >= 0x04) || (crtc_ch <= 0x01))) { // HSW1..VST
@@ -377,44 +421,8 @@ void TOWNS_CRTC::write_io16(uint32_t addr, uint32_t data)
                        }
                }
                break;
-       case 0x0448:
-       case 0x0449:
-               voutreg_num = data & 0x01;
-               break;
-       case 0x044a:
-       case 0x044b:
-               if(voutreg_num == 0) {
-                       voutreg_ctrl = data & 0x10;
-               } else if(voutreg_num == 1) {
-                       voutreg_prio = data & 0x10;
-               }                       
-               break;
-       case 0x044c:
-               break;
-       case 0xfd98:
-       case 0xfd99:
-       case 0xfd9a:
-       case 0xfd9b:
-       case 0xfd9c:
-       case 0xfd9d:
-       case 0xfd9e:
-       case 0xfd9f:
-               {
-                       pair32_t n;
-                       n.d = data;
-                       if(addr == 0xfd9f) {
-                               dpalette_regs[7] = n.b.l & 0x0f;
-                       } else {
-                               dpalette_regs[addr & 7] = n.b.l & 0x0f;
-                               dpalette_regs[(addr + 1) & 7] = n.b.h & 0x0f;
-                       }
-                       dpalette_changed = true;
-               }
-               break;
-       case 0xfda0:
-               crtout[0] = ((data & 0x0c) != 0) ? true : false;
-               crtout[1] = ((data & 0x03) != 0) ? true : false;
-               break;
+       default:
+               write_io8(addr & 0xfffe, data);
        }
 }
 
@@ -439,59 +447,16 @@ uint16_t TOWNS_CRTC::read_reg30()
 uint32_t TOWNS_CRTC::read_io16(uint32_t addr)
 {
 //     out_debug_log(_T("READ16 ADDR=%04x"), addr);
-       switch(addr) {
-       case 0x0440:
-       case 0x0441:
-               return (uint32_t)crtc_ch;
-               break;
+       switch(addr & 0xfffe) {
        case 0x0442:
-       case 0x0443:
                if(crtc_ch == 30) {
                        return (uint32_t)read_reg30();
                } else {
                        return regs[crtc_ch];
                }
                break;
-       case 0x044c:
-       case 0x044d:
-               {
-                       uint16_t d = 0xff7c;
-                       d = d | ((dpalette_changed) ? 0x80 : 0x00);
-                       if(d_sprite != NULL) {
-                               d = d | ((d_sprite->read_signal(SIG_TOWNS_SPRITE_BUSY) != 0) ? 0x02 : 0x00);
-                       }
-                       d = d | ((sprite_disp_page != 0) ? 0x01 : 0x00);
-                       dpalette_changed = false;
-                       return d;
-               }
-               break;
-       case 0xfd98:
-       case 0xfd99:
-       case 0xfd9a:
-       case 0xfd9b:
-       case 0xfd9c:
-       case 0xfd9d:
-       case 0xfd9e:
-       case 0xfd9f:
-               {
-                       pair16_t n;
-                       if(addr == 0xfd9f) {
-                               n.b.l = dpalette_regs[7];
-                               n.b.h = 0xff;
-                       } else {
-                               n.b.l = dpalette_regs[addr & 0x07];
-                               n.b.h = dpalette_regs[(addr + 1) & 0x07];
-                       }
-                       return n.w;
-               }
-               break;
-       case 0xfda0:
-               {
-                       uint16_t d = 0xfffc;
-                       d = d | ((vsync) ? 0x01 : 0);
-                       d = d | ((hsync) ? 0x02 : 0);
-                       return d;
-               }
+       default:
+               return read_io8(addr & 0xfffe);
                break;
        }
        return 0xffff;
@@ -526,6 +491,18 @@ uint32_t TOWNS_CRTC::read_io8(uint32_t addr)
                        return (uint32_t)(d.b.h);
                }
                break;
+       case 0x044c:
+               {
+                       uint16_t d = 0x7c;
+                       d = d | ((dpalette_changed) ? 0x80 : 0x00);
+                       if(d_sprite != NULL) {
+                               d = d | ((d_sprite->read_signal(SIG_TOWNS_SPRITE_BUSY) != 0) ? 0x02 : 0x00);
+                       }
+                       d = d | ((sprite_disp_page != 0) ? 0x01 : 0x00);
+                       dpalette_changed = false;
+                       return d;
+               }
+               break;
        case 0xfd98:
        case 0xfd99:
        case 0xfd9a:
@@ -919,7 +896,7 @@ void TOWNS_CRTC::draw_screen()
                                        int xx = pwidth & ~15;
                                        int w = pwidth & 15;
                                        for(int i = 0; i < w; i++) {
-                                               pbuf[i] = p++;
+                                               pbuf[i] = *p++;
                                        }
                                        for(int i = 0; i < w; i++) {
                                                lbuffer1[xx++] = apal256[pbuf[i]];
@@ -1280,10 +1257,10 @@ void TOWNS_CRTC::event_frame()
                event_id_vst2 = -1;
        }
        if(vert_sync_pre_us > 0.0) {
-               vsync = false;
+               set_vsync(false, true);
                register_event(this, EVENT_CRTC_VST1, vert_sync_pre_us, false, &event_id_vst1); // VST1
        } else {
-               vsync = true;
+               set_vsync(true, true);
        }
        if(vst2_us > 0.0) {
                register_event(this, EVENT_CRTC_VST2, vst2_us, false, &event_id_vst2);
@@ -1336,10 +1313,10 @@ void TOWNS_CRTC::event_callback(int event_id, int err)
        int eid2 = (event_id / 2) * 2;
        // EVENT_VSTART MOVED TO event_frame().
        if(event_id == EVENT_CRTC_VST1) { // VSYNC
-               vsync = true;
+               set_vsync(true, false);
                event_id_vst1 = -1;
        } else if (event_id == EVENT_CRTC_VST2) {
-               vsync = false;
+               set_vsync(false, false);
                event_id_vst2 = -1;
        } else if(eid2 == EVENT_CRTC_VDS) { // Display start
                int layer = event_id & 1;
@@ -1550,7 +1527,7 @@ bool TOWNS_CRTC::process_state(FILEIO* state_fio, bool loading)
        if(loading) {
                for(int i = 0; i < 4; i++) {
                        if(linebuffers[i] == NULL) {
-                               linebuffers[i] = malloc(sizeof(linebuffer_t ) * TOWNS_CRTC_MAX_LINES);
+                               linebuffers[i] = (linebuffer_t*)malloc(sizeof(linebuffer_t ) * TOWNS_CRTC_MAX_LINES);
                        }
                        for(int l = 0; l < TOWNS_CRTC_MAX_LINES; l++) {
                                memset(&(linebuffers[i][l]), 0x00, sizeof(linebuffer_t));
index 0be963b..27f9da7 100644 (file)
@@ -280,14 +280,12 @@ protected:
        int display_linebuf;
        linebuffer_t *linebuffers[4];
        
-       void set_display(bool val);
-       void set_vblank(bool val);
-       void set_vsync(bool val);
-       void set_hsync(bool val);
+       void __FASTCALL set_vsync(bool val, bool force);
        void force_recalc_crtc_param(void);
        void restart_display();
        void stop_display();
        void notify_mode_changed(int layer, uint8_t mode);
+       
        void set_crtc_clock(uint16_t val);
        uint16_t read_reg30();
        
index 7d3d170..01b178d 100644 (file)
@@ -16,7 +16,8 @@
 #include "../pcm1bit.h"
 
 namespace FMTOWNS {
-#define EVENT_1US_WAIT 1
+#define EVENT_1US_WAIT    1
+#define EVENT_1US_FREERUN 2
 
 void TOWNS_MEMORY::config_page00()
 {
@@ -90,6 +91,7 @@ void TOWNS_MEMORY::initialize()
        // load rom image
        // ToDo: More smart.
        vram_size = 0x80000; // OK?
+       event_freerun = -1;
 }
 
 void TOWNS_MEMORY::set_wait_values()
@@ -555,11 +557,17 @@ void TOWNS_MEMORY::reset()
 {
        // reset memory
        // ToDo
-       d_cpu->set_address_mask(0xffffffff);
+       if(d_cpu != NULL) {
+               d_cpu->set_address_mask(0xffffffff);
+       }
        dma_is_vram = true;
        nmi_vector_protect = false;
        config_page00();
        set_wait_values();
+       freerun_counter = 0;
+       if(event_freerun > -1) cancel_event(this, event_freerun);
+       register_event(this, EVENT_1US_FREERUN, 1.0, true, &event_freerun);
+       
 }
 
 uint32_t TOWNS_MEMORY::read_data8(uint32_t addr)
@@ -611,15 +619,33 @@ uint32_t TOWNS_MEMORY::read_io8(uint32_t addr)
        switch(addr & 0xffff) {
        case 0x0020: // Software reset ETC.
                // reset cause register
-               val = ((software_reset) ? 1 : 0) | ((d_cpu->get_shutdown_flag() != 0) ? 2 : 0);
+               if(d_cpu != NULL) {
+                       val = ((software_reset) ? 1 : 0) | ((d_cpu->get_shutdown_flag() != 0) ? 2 : 0);
+               }
                software_reset = false;
-               d_cpu->set_shutdown_flag(0);
+               if(d_cpu != NULL) {
+                       d_cpu->set_shutdown_flag(0);
+               }
                val =  val | 0x7c;
                break;
        case 0x0022:
                // Power register
                val = 0xff;
                break;
+       case 0x0026:
+               {
+                       pair16_t n;
+                       n.w = freerun_counter;
+                       val = n.b.l;
+               }
+               break;
+       case 0x0027:
+               {
+                       pair16_t n;
+                       n.w = freerun_counter;
+                       val = n.b.l;
+               }
+               break;
        case 0x0030:
                val = (((machine_id & 0x1f) << 3) | (cpu_id & 7));
                // SPEED: bit0/Write
@@ -695,6 +721,25 @@ uint32_t TOWNS_MEMORY::read_io8(uint32_t addr)
        return val;
 }
 
+uint32_t TOWNS_MEMORY::read_io16(uint32_t addr)
+{
+       switch(addr & 0xfffe) {
+       case 0x0026:
+               return freerun_counter;
+               break;
+       default:
+               {
+                       // OK?
+                       pair16_t n;
+                       n.b.l = read_io8((addr & 0xfffe) + 0);
+                       n.b.h = read_io8((addr & 0xfffe) + 1);
+                       return n.w;
+               }
+               break;
+       }
+       return 0xffff;
+}
+
 void TOWNS_MEMORY::write_io8(uint32_t addr, uint32_t data)
 {
 
@@ -712,24 +757,32 @@ void TOWNS_MEMORY::write_io8(uint32_t addr, uint32_t data)
                        software_reset = false;
                }
                if((data & 0x40) != 0) {
-                       d_cpu->set_shutdown_flag(1);
+                       if(d_cpu != NULL) {
+                               d_cpu->set_shutdown_flag(1);
+                       }
                        emu->power_off();
                }
                if(software_reset) {
-                       d_cpu->reset();
+                       if(d_cpu != NULL) {
+                               d_cpu->reset();
+                       }
                }
-               switch(data & 0x08) {
-               case 0x00:      // 20bit
-                       d_cpu->set_address_mask(0xffffffff);
-                       break;
-               default:        // 32bit
-                       d_cpu->set_address_mask(0x000fffff);
-                       break;
+               if(d_cpu != NULL) {
+                       switch(data & 0x08) {
+                       case 0x00:      // 20bit
+                               d_cpu->set_address_mask(0xffffffff);
+                               break;
+                       default:        // 32bit
+                               d_cpu->set_address_mask(0x000fffff);
+                               break;
+                       }
                }
                break;
        case 0x0022:
                if((data & 0x40) != 0) {
-                       d_cpu->set_shutdown_flag(1);
+                       if(d_cpu != NULL) {
+                               d_cpu->set_shutdown_flag(1);
+                       }
                        emu->power_off();
                }
                // Power register
@@ -745,7 +798,9 @@ void TOWNS_MEMORY::write_io8(uint32_t addr, uint32_t data)
                if(machine_id >= 0x0300) { // After UX*/10F/20F/40H/80H
                        if(event_wait_1us != -1) cancel_event(this, event_wait_1us);
                        register_event(this, EVENT_1US_WAIT, 1.0, false, &event_wait_1us);
-                       d_cpu->write_signal(SIG_CPU_BUSREQ, 1, 1);
+                       if(d_cpu != NULL) {
+                               d_cpu->write_signal(SIG_CPU_BUSREQ, 1, 1);
+                       }
                }
                break;
        case 0x0404: // System Status Reg.
@@ -774,10 +829,15 @@ void TOWNS_MEMORY::write_io8(uint32_t addr, uint32_t data)
 void TOWNS_MEMORY::event_callback(int id, int err)
 {
        switch(id) {
+       case EVENT_1US_FREERUN:
+               freerun_counter++;
+               break;
        case EVENT_1US_WAIT:
                event_wait_1us = -1;
                if(machine_id >= 0x0300) { // After UX*/10F/20F/40H/80H
-                       d_cpu->write_signal(SIG_CPU_BUSREQ, 0, 1);
+                       if(d_cpu != NULL) {
+                               d_cpu->write_signal(SIG_CPU_BUSREQ, 0, 1);
+                       }
                }
                break;
        default:
@@ -823,7 +883,7 @@ uint32_t TOWNS_MEMORY::read_memory_mapped_io8(uint32_t addr)
                break;
        case 0x18:
                if(d_beep != NULL) {
-                       //d_beep->write_signal(SIG_BEEP_ON, 1, 1);
+                       d_beep->write_signal(SIG_PCM1BIT_ON, 1, 1);
                }
                break;
        case 0x19:
@@ -876,7 +936,7 @@ void TOWNS_MEMORY::write_memory_mapped_io8(uint32_t addr, uint32_t data)
                break;
        case 0x18:
                if(d_beep != NULL) {
-                       //d_beep->write_signal(SIG_BEEP_ON, 0, 1);
+                       d_beep->write_signal(SIG_PCM1BIT_ON, 0, 1);
                }
                break;
        case 0x19:
@@ -898,15 +958,29 @@ void TOWNS_MEMORY::write_signal(int ch, uint32_t data, uint32_t mask)
 {
        if(ch == SIG_MEMORY_EXTNMI) {
                extra_nmi_val = ((data & mask) != 0);
+               if(!(extra_nmi_mask)) {
+                       // Not MASK
+                       if(d_cpu != NULL) {
+                               d_cpu->write_signal(SIG_CPU_NMI, data, mask);
+                       }
+               }                       
        } else if(ch == SIG_CPU_NMI) {
                // Check protect
-               d_cpu->write_signal(SIG_CPU_NMI, data, mask);
+               if(d_cpu != NULL) {
+                       d_cpu->write_signal(SIG_CPU_NMI, data, mask);
+               }
        } else if(ch == SIG_CPU_IRQ) {
-               d_cpu->write_signal(SIG_CPU_IRQ, data, mask);
+               if(d_cpu != NULL) {
+                       d_cpu->write_signal(SIG_CPU_IRQ, data, mask);
+               }
        } else if(ch == SIG_CPU_BUSREQ) {
-               d_cpu->write_signal(SIG_CPU_BUSREQ, data, mask);
+               if(d_cpu != NULL) {
+                       d_cpu->write_signal(SIG_CPU_BUSREQ, data, mask);
+               }
        } else if(ch == SIG_I386_A20) {
-               d_cpu->write_signal(SIG_I386_A20, data, mask);
+               if(d_cpu != NULL) {
+                       d_cpu->write_signal(SIG_I386_A20, data, mask);
+               }
        } else if(ch == SIG_FMTOWNS_RAM_WAIT) {
                mem_wait_val = (int)data;
                set_wait_values();
@@ -933,6 +1007,14 @@ uint32_t TOWNS_MEMORY::read_signal(int ch)
        } 
        return 0;
 }
+
+void TOWNS_MEMORY::set_intr_line(bool line, bool pending, uint32_t bit)
+{
+       if(d_cpu != NULL) {
+               d_cpu->set_intr_line(line, pending, bit);
+       }
+}
+
 // ToDo: DMA
 
 #define STATE_VERSION  1
@@ -953,6 +1035,9 @@ bool TOWNS_MEMORY::process_state(FILEIO* state_fio, bool loading)
        state_fio->StateValue(software_reset);
 
        state_fio->StateValue(event_wait_1us);
+       state_fio->StateValue(event_freerun);
+       state_fio->StateValue(freerun_counter);
+       
        state_fio->StateValue(extra_nmi_val);
        state_fio->StateValue(extra_nmi_mask);
        
index c5b3ade..0379a46 100644 (file)
@@ -113,7 +113,9 @@ protected:
        uint16_t machine_id;
        uint8_t cpu_id;
        bool dma_is_vram;
-       
+
+       // Freerun counter : I/O 0x0026 (word) : From MAME 0.216
+       uint16_t freerun_counter;
        // RAM
        uint8_t ram_page0[0xc0000];       // 0x00000000 - 0x000bffff : RAM
        uint8_t ram_pagee[0x16000];       // 0x000da000 - 0x000effff : RAM
@@ -143,6 +145,7 @@ protected:
        uint32_t type_bank_adrs_cx[0x100000]; // Per 4KB.
 
        int event_wait_1us;
+       int event_freerun;
 
 //     virtual void initialize_tables(void);
        virtual void set_wait_values();
@@ -246,6 +249,7 @@ public:
        
        virtual void     __FASTCALL write_io8(uint32_t addr, uint32_t data);
        virtual uint32_t __FASTCALL read_io8(uint32_t addr);
+       virtual uint32_t __FASTCALL read_io16(uint32_t addr);
 
        virtual void __FASTCALL write_memory_mapped_io8(uint32_t addr, uint32_t data);
        virtual uint32_t __FASTCALL read_memory_mapped_io8(uint32_t addr);
@@ -255,9 +259,10 @@ public:
        
        //void event_frame();
        void event_callback(int id, int err);
+       virtual void set_intr_line(bool line, bool pending, uint32_t bit);
        
        bool process_state(FILEIO* state_fio, bool loading);
-       
+
        // unique functions
        void set_context_cpu(I386* device)
        {
index c42cb01..dcb80f5 100644 (file)
@@ -424,7 +424,7 @@ uint32_t TOWNS_VRAM::read_memory_mapped_io32(uint32_t addr)
 
 uint32_t TOWNS_VRAM::read_raw_vram8(uint32_t addr)
 {
-       return vram[addr];
+       return vram[addr & 0x7ffff];
 }
        
 uint32_t TOWNS_VRAM::read_raw_vram16(uint32_t addr)
@@ -715,7 +715,6 @@ uint32_t TOWNS_VRAM::read_plane_data8(uint32_t addr)
        // Plane Access
        uint32_t x_addr = 0;
        uint8_t *p = (uint8_t*)vram;
-       uint32_t mod_pos;
 
        // ToDo: Writing plane.
        if(access_page1) x_addr = 0x40000; //?
@@ -774,7 +773,6 @@ void TOWNS_VRAM::write_plane_data8(uint32_t addr, uint32_t data)
        // Plane Access
        uint32_t x_addr = 0;
        uint8_t *p = (uint8_t*)vram;
-       uint32_t mod_pos;
 
        // ToDo: Writing plane.
        if(access_page1) x_addr = 0x40000; //?
@@ -991,7 +989,6 @@ uint32_t TOWNS_VRAM::read_io8(uint32_t address)
 
 uint32_t TOWNS_VRAM::read_io16(uint32_t address)
 {
-       pair32_t d;
        switch(address & 0xffff) {
        case 0x0458:
                return vram_access_reg_addr;