⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 vcxi.c

📁 一个两碟控制的VCD的代码,两碟之间的转动及连续播放,已大量生产的CODE.
💻 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 + -