📄 vcxi.c
字号:
/* SCCSID @(#)vcxi.c 1.32 5/26/98 *//* * $Log$ */#include "common.h"#include "mvd.h"#include "dsc.h"#include "constvar.h"#include "spoolint.h"#include "timedef.h"#include "config.h"#define SPOOL_PRINT 0xf2 /* danielc 040497 */#if defined(VCW) || defined(VCWSPOOL1) || defined(VCWSPOOL2)int spool_ready ;extern int spoolint_job_number;#endifstatic int vcxi_state ; /* One of the states shown above */static int vcxi_cmd = -1;static int vcxi_temp ; /* Where the longword being sent received is saved */static int *vcxi_addr ; /* Where address to peek/poke is stored */#ifndef EMULATOR/* VCXI variables and defines */#define VCXI_NULL 0#define VCXI_CMD 1#define VCXI_RDRAM 2#define VCXI_WRBYTE1 3#define VCXI_WRBYTE2 4#define VCXI_WRBYTE3 5#define VCXI_WRRAM 6#define VCXI_SETAD 7#define VCXI_RBYTE3 8#define VCXI_RBYTE2 9#define VCXI_RBYTE1 10#define VCXI_RBYTE0 11#define RDRAM 0#define WRRAM 1#define SETAD 2static int vcxi_mask = 0x20; /* Default is wait for comm. from host*/void mon_put_long0(unsigned int data){ int i; for (i=0; i<4; i++) { while (!(mvd[r_hostirqstat] & 0x40)); mvd[r_hostdbgport] = data; data >>= 8; }}void VCX_service(void){ int flag; if((mvd[r_hostirqstat] & vcxi_mask)) { switch(vcxi_state) { case VCXI_NULL: flag = (mvd[r_hostdbgport] & 0xff) ; if (flag == 0x5c) vcxi_state = VCXI_CMD; else if (flag == SPOOL_PRINT) {#if defined(VCW)||defined(VCWSPOOL1)||defined(VCWSPOOL2) spool_ready = (spoolint_job_number<<8); mon_put_long0(spool_ready); if (spool_ready) spoolhandler();#else mon_put_long0(0);#endif break; } case VCXI_CMD: if(!(mvd[r_hostirqstat] & 0x20)) break; vcxi_cmd = mvd[r_hostdbgport] & 0xff; switch(vcxi_cmd) { case RDRAM: vcxi_cmd = vcxi_state = VCXI_RDRAM; vcxi_temp = *vcxi_addr; vcxi_mask = 0x40; goto rd; break; case WRRAM: vcxi_cmd = vcxi_state = VCXI_WRRAM; goto wr_set; break; case SETAD: vcxi_cmd = vcxi_state = VCXI_SETAD; goto wr_set; break; default: break; } break; rd: case VCXI_RDRAM: if(!(mvd[r_hostirqstat] & 0x40)) break; mvd[r_hostdbgport] = vcxi_temp; vcxi_temp >>= 8; vcxi_state = VCXI_WRBYTE1; case VCXI_WRBYTE1: if(!(mvd[r_hostirqstat] & 0x40)) break; mvd[r_hostdbgport] = vcxi_temp; vcxi_temp >>= 8; vcxi_state = VCXI_WRBYTE2; case VCXI_WRBYTE2: if(!(mvd[r_hostirqstat] & 0x40)) break; mvd[r_hostdbgport] = vcxi_temp; vcxi_temp >>= 8; vcxi_state = VCXI_WRBYTE3; case VCXI_WRBYTE3: if(!(mvd[r_hostirqstat] & 0x40)) break; mvd[r_hostdbgport] = vcxi_temp; vcxi_temp >>= 8; vcxi_mask = 0x20; vcxi_state = VCXI_NULL; break; wr_set: case VCXI_WRRAM: case VCXI_SETAD: vcxi_state = VCXI_RBYTE3; case VCXI_RBYTE3: if(!(mvd[r_hostirqstat] & 0x20)) break; vcxi_temp = mvd[r_hostdbgport] & 0xff; vcxi_state = VCXI_RBYTE2; case VCXI_RBYTE2: if(!(mvd[r_hostirqstat] & 0x20)) break; vcxi_temp <<= 8; vcxi_temp |= mvd[r_hostdbgport] & 0xff; vcxi_state = VCXI_RBYTE1; case VCXI_RBYTE1: if(!(mvd[r_hostirqstat] & 0x20)) break; vcxi_temp <<= 8; vcxi_temp |= mvd[r_hostdbgport] & 0xff; vcxi_state = VCXI_RBYTE0; case VCXI_RBYTE0: if(!(mvd[r_hostirqstat] & 0x20)) break; vcxi_temp <<= 8; vcxi_temp |= mvd[r_hostdbgport] & 0xff; vcxi_mask = 0x20; /* To be sure */ vcxi_state = VCXI_NULL; if(vcxi_cmd == VCXI_SETAD) { (int)vcxi_addr = vcxi_temp; } else { *vcxi_addr = vcxi_temp; } break; default: } /* end of switch(vcxi_state) */ } /* end of if((mvd[r_hostirqstat] & vcxi_mask)) */}#else/* Using the ROM emulator */#ifndef HOST_DATA#ifdef NEW_EMULATOR/* * Has to use char pointer (otherwise the delay is too long) * * All the newer NEW_EMULATOR's actually use A4 (older NEW_EMULATOR's use * A3). */#define HOST_DATA (*(char*) x1400001b)#define HOST_STATUS (*(volatile char*) x1400001f)#else/* Has to use int pointer (otherwise the delay is too short) */#define HOST_DATA (*(int*) x1c000000)#define HOST_STATUS (*(volatile int*) x1c000004)#endif#endif /* HOST_DATA */#define VCXI_NULL 0#define VCXI_CMD 1#define VCXI_WRRAM 2#define VCXI_SETAD 3#define VCXI_RBYTE3 4#define VCXI_RBYTE2 5#define VCXI_RBYTE1 6#define VCXI_RBYTE0 7#define VCXI_RDRAM 8#define VCXI_WRBYTE1 9#define VCXI_WRBYTE2 10#define VCXI_WRBYTE3 11 #define RDRAM 0#define WRRAM 1#define SETAD 2#if (defined(DVD_VCD)&&defined(DEBUG)) || !defined(MKROM)void mon_put_long1(unsigned int data){ int i; for (i=0;i<4;i++) { while (!(~HOST_STATUS & 2)); HOST_DATA = data&0xff ; data >>=8 ; while (HOST_STATUS & 2); } }#endif#ifdef NEW_EMULATORstatic int VCX_emulator = 1; /* Assume we are using emulator */void VCX_init(void){ int * ptr = (int *) 0x1c000000; /* * If we are using actual ROM, then location 0 is not 0, in which * case, we don't want to run VCX_service. */ if (*ptr) VCX_emulator = 0;}#endif /* NEW_EMULATOR */PRIVATE int VCX_wait_host_status = 0;PRIVATE unsigned int VCX_wait_til = 0;PRIVATE int VCX_needimprove = 0;int dsc_port = 0;void VCX_service(void){ int flag;#ifdef DSC if (dsc_port & 0x10000) { dsc_port = DSC_cmd(dsc_port >> 8, dsc_port); }#endif#ifdef NEW_EMULATOR /* * If this is actual ROM, then don't run this routine. It not * only waste time, but may also hang things! */ if (!VCX_emulator) return;#endif /* * In theory, we should be ready by the time we get here, but if * if it is still not ready, then it needs improvement! */ if (VCX_wait_host_status) { if (HOST_STATUS & 2) { /* Give it some time, if it is not back, then just ignore it! */ if (glbTimer >= VCX_wait_til) VCX_needimprove++; else return; } VCX_wait_host_status = 0; } if (HOST_STATUS & 1) { switch (vcxi_state) { case VCXI_NULL: flag = (HOST_DATA & 0xff) ; if (flag == 0x5c) vcxi_state = VCXI_CMD;#ifndef MKROM else if (flag == SPOOL_PRINT) {#if defined(VCW)||defined(VCWSPOOL1)||defined(VCWSPOOL2) spool_ready = (spoolint_job_number<<8); mon_put_long1(spool_ready); if (spool_ready) spoolhandler();#else mon_put_long1(0);#endif }#endif break; case VCXI_CMD: vcxi_cmd = HOST_DATA & 0xff; switch(vcxi_cmd) { case RDRAM: vcxi_cmd = vcxi_state = VCXI_RDRAM; vcxi_temp = *vcxi_addr; break; case WRRAM: vcxi_cmd = VCXI_WRRAM; vcxi_state = VCXI_RBYTE3; break; case SETAD: vcxi_cmd = VCXI_SETAD; vcxi_state = VCXI_RBYTE3; break; default: return; break; } break; case VCXI_WRRAM: case VCXI_SETAD: case VCXI_RBYTE3: vcxi_temp = HOST_DATA & 0xff; vcxi_state = VCXI_RBYTE2; break; case VCXI_RBYTE2: vcxi_temp <<= 8; vcxi_temp |= HOST_DATA & 0xff; vcxi_state = VCXI_RBYTE1; break; case VCXI_RBYTE1: vcxi_temp <<= 8; vcxi_temp |= HOST_DATA & 0xff; vcxi_state = VCXI_RBYTE0; break; case VCXI_RBYTE0: vcxi_temp <<= 8; vcxi_temp |= HOST_DATA & 0xff; vcxi_state = VCXI_NULL; if(vcxi_cmd == VCXI_SETAD) { (int)vcxi_addr = vcxi_temp; } else { *vcxi_addr = vcxi_temp; } break; default: return; } } if ((~HOST_STATUS & 2) && ((vcxi_state>=VCXI_RDRAM) && (vcxi_state<=VCXI_WRBYTE3))) { HOST_DATA = vcxi_temp; vcxi_temp >>= 8; if (vcxi_state == VCXI_WRBYTE3) vcxi_state = VCXI_NULL; else vcxi_state ++ ; /* Don't put a while loop here! May hang the machine! */ if (HOST_STATUS & 2) { VCX_wait_host_status = 1; VCX_wait_til = glbTimer + 3; } }}#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -