--- previous/src/kms.c 2018/04/24 19:30:01 1.1.1.1 +++ previous/src/kms.c 2018/04/24 19:31:28 1.1.1.2 @@ -19,8 +19,9 @@ #include "rtcnvram.h" #include "snd.h" #include "video.h" +#include "host.h" -#define LOG_KMS_LEVEL LOG_WARN +#define LOG_KMS_LEVEL LOG_DEBUG #define IO_SEG_MASK 0x1FFFF @@ -36,6 +37,14 @@ struct { Uint32 km_data; } kms; +void KMS_Reset() { + kms.status.snd_dma = 0; + kms.status.km = 0; + kms.status.transmit = 0; + kms.status.cmd = 0; + kms.data = 0; + kms.km_data = 0; +} /* KMS control and status register (0x0200E000) * @@ -68,7 +77,6 @@ struct { * ---x ---x ---- ---x ---- ---- ---- ---- zero bits */ - #define SNDOUT_DMA_ENABLE 0x80 #define SNDOUT_DMA_REQUEST 0x40 #define SNDOUT_DMA_UNDERRUN 0x20 @@ -138,7 +146,7 @@ void KMS_command(Uint8 command, Uint32 d Uint32 km_address = 0; Uint32 km_dev_msk = 0; -void access_km_reg(Uint32 data) { +static void access_km_reg(Uint32 data) { Uint8 reg_addr = (data>>24)&0xFF; Uint8 reg_data = (data>>16)&0xFF; @@ -238,6 +246,7 @@ void KMS_command(Uint8 command, Uint32 d snd_start_output(command&(SIO_DBL_SMPL|SIO_ZERO)); } else { Log_Printf(LOG_KMS_LEVEL, "[KMS] Sound out disable."); + kms.status.snd_dma &= ~(SNDOUT_DMA_UNDERRUN|SNDOUT_DMA_REQUEST); snd_stop_output(); } } else if ((command&KMSCMD_SIO_MASK)==KMSCMD_SND_IN) { @@ -245,8 +254,11 @@ void KMS_command(Uint8 command, Uint32 d if (command&SIO_ENABLE) { Log_Printf(LOG_KMS_LEVEL, "[KMS] Sound in enable."); + snd_start_input(command); } else { Log_Printf(LOG_KMS_LEVEL, "[KMS] Sound in disable."); + kms.status.snd_dma &= ~(SNDIN_DMA_OVERRUN|SNDIN_DMA_REQUEST); + snd_stop_input(); } } else { Log_Printf(LOG_WARN, "[KMS] Unknown command!"); @@ -255,18 +267,17 @@ void KMS_command(Uint8 command, Uint32 d } } - void KMS_Ctrl_Snd_Write(void) { Uint8 val = IoMem[IoAccessCurrentAddress&IO_SEG_MASK]; kms.status.snd_dma &= ~(SNDOUT_DMA_ENABLE|SNDIN_DMA_ENABLE); kms.status.snd_dma |= (val&(SNDOUT_DMA_ENABLE|SNDIN_DMA_ENABLE)); - if (val&SNDOUT_DMA_UNDERRUN) { + if (val&SNDOUT_DMA_UNDERRUN && (!snd_output_active())) { kms.status.snd_dma &= ~(SNDOUT_DMA_UNDERRUN|SNDOUT_DMA_REQUEST); set_interrupt(INT_SOUND_OVRUN, RELEASE_INT); } - if (val&SNDIN_DMA_OVERRUN) { + if (val&SNDIN_DMA_OVERRUN && (!snd_input_active())) { kms.status.snd_dma &= ~(SNDIN_DMA_OVERRUN|SNDIN_DMA_REQUEST); set_interrupt(INT_SOUND_OVRUN, RELEASE_INT); } @@ -276,6 +287,16 @@ void KMS_Stat_Snd_Read(void) { IoMem[IoAccessCurrentAddress&IO_SEG_MASK] = kms.status.snd_dma; } +void kms_sndout_underrun() { + kms.status.snd_dma |= SNDOUT_DMA_UNDERRUN|SNDOUT_DMA_REQUEST; + set_interrupt(INT_SOUND_OVRUN, SET_INT); +} + +void kms_sndin_overrun() { + kms.status.snd_dma |= SNDIN_DMA_OVERRUN|SNDIN_DMA_REQUEST; + set_interrupt(INT_SOUND_OVRUN, SET_INT); +} + void KMS_Ctrl_KM_Write(void) { Uint8 val = IoMem[IoAccessCurrentAddress&IO_SEG_MASK]; @@ -377,13 +398,13 @@ void KMS_Data_Read(void) { bool m_button_right = false; -bool m_button_left = false; -bool m_move_left = false; -bool m_move_up = false; -Uint8 m_move_x = 0; -Uint8 m_move_y = 0; - -Uint8 m_move_steps = 0; +bool m_button_left = false; +bool m_move_left = false; +bool m_move_up = false; +int m_move_x = 0; +int m_move_y = 0; +int m_move_dx = 0; +int m_move_dy = 0; void kms_mouse_move_step(void); @@ -394,7 +415,7 @@ void KMS_KM_Data_Read(void) { set_interrupt(INT_KEYMOUSE, RELEASE_INT); } -void kms_interrupt(void) { +static void kms_interrupt(void) { kms.status.cmd = KMSCMD_KBD_RECV; if (kms.status.km&KBD_RECEIVED) { @@ -404,7 +425,7 @@ void kms_interrupt(void) { set_interrupt(INT_KEYMOUSE, SET_INT); } -bool kms_device_enabled(int dev_addr) { +static bool kms_device_enabled(int dev_addr) { int i,mask; for (i=28; i>4; i-=4) { @@ -412,7 +433,7 @@ bool kms_device_enabled(int dev_addr) { if(mask==dev_addr && mask!=0xF) return true; } - Log_Printf(LOG_WARN, "[KMS] Device %i disabled (mask: %08X)",dev_addr,km_dev_msk); + Log_Printf(LOG_KMS_LEVEL, "[KMS] Device %i disabled (mask: %08X)",dev_addr,km_dev_msk); return false; } @@ -425,6 +446,7 @@ void kms_keydown(Uint8 modkeys, Uint8 ke if ((keycode==0x25)&&((modkeys&0x28)==0x28)) { /* asterisk and left alt and left command key */ Log_Printf(LOG_WARN, "Keyboard initiated CPU reset!"); + host_darkmatter(false); M68000_Reset(false); return; } @@ -475,42 +497,33 @@ void kms_mouse_button(bool left, bool do } } +#define MOUSE_STEP_FREQ 1000 + void kms_mouse_move(int x, bool left, int y, bool up) { - - if (x<0 || y<0) { - abort(); - } - - if (x>0x40) - x=0x40; - if (y>0x40) - y=0x40; + if (x<0 || y<0) abort(); m_move_left = left; - m_move_up = up; + m_move_up = up; + + int xsteps = x / 8; if(xsteps == 0) xsteps = 1; + int ysteps = y / 8; if(ysteps == 0) ysteps = 1; - m_move_x = x; - m_move_y = y; + m_move_x = x; + m_move_dx = x / xsteps; - m_move_steps = 8; + m_move_y = y; + m_move_dy = y / ysteps; - CycInt_AddRelativeInterrupt(CYCLES_PER_FRAME/10, INT_CPU_CYCLE, INTERRUPT_MOUSE); + CycInt_AddRelativeInterruptCycles(10, INTERRUPT_MOUSE); } void kms_mouse_move_step(void) { - int x = 0; - int y = 0; - if (m_move_x>0) { - x = m_move_x/m_move_steps; - m_move_x -= x; - } - if (m_move_y>0) { - y = m_move_y/m_move_steps; - m_move_y -= y; - } - - m_move_steps--; + int x = m_move_x > m_move_dx ? m_move_dx : m_move_x; + int y = m_move_y > m_move_dy ? m_move_dy : m_move_y; + + m_move_x -= x; + m_move_y -= y; if (!m_move_left && x>0) /* right */ x=(0x40-x)|0x40; @@ -541,9 +554,8 @@ void kms_response(void) { void Mouse_Handler(void) { CycInt_AcknowledgeInterrupt(); - if (m_move_steps>0 && (m_move_x>0 || m_move_y>0)) { + if (m_move_x > 0 || m_move_y > 0) { kms_mouse_move_step(); - - CycInt_AddRelativeInterrupt(CYCLES_PER_FRAME/10, INT_CPU_CYCLE, INTERRUPT_MOUSE); + CycInt_AddRelativeInterruptUs((1000*1000)/MOUSE_STEP_FREQ, 0, INTERRUPT_MOUSE); } }