00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014 #include <stdio.h>
00015 #include <assert.h>
00016 #include "midas.h"
00017 #include "msystem.h"
00018 #include "mcstd.h"
00019
00020
00021
00022 static int cnaf_debug = 0;
00023
00024 INT cnaf_callback(INT index, void *prpc_param[])
00025 {
00026 DWORD cmd, b, c, n, a, f, *pdword, *size, *x, *q, dtemp;
00027 WORD *pword, *pdata, temp;
00028 INT i, count;
00029
00030
00031 cmd = CDWORD(0);
00032 b = CDWORD(1);
00033 c = CDWORD(2);
00034 n = CDWORD(3);
00035 a = CDWORD(4);
00036 f = CDWORD(5);
00037 pdword = CPDWORD(6);
00038 pword = CPWORD(6);
00039 pdata = CPWORD(6);
00040 size = CPDWORD(7);
00041 x = CPDWORD(8);
00042 q = CPDWORD(9);
00043
00044
00045 if (index == RPC_CNAF16)
00046 count = *size / sizeof(WORD);
00047 else
00048 count = *size / sizeof(DWORD);
00049
00050 switch (cmd) {
00051
00052
00053 case CNAF_INHIBIT_SET:
00054 cam_inhibit_set(c);
00055 break;
00056 case CNAF_INHIBIT_CLEAR:
00057 cam_inhibit_clear(c);
00058 break;
00059 case CNAF_CRATE_CLEAR:
00060 cam_crate_clear(c);
00061 break;
00062 case CNAF_CRATE_ZINIT:
00063 cam_crate_zinit(c);
00064 break;
00065
00066 case CNAF_TEST:
00067 break;
00068
00069 case CNAF:
00070 if (index == RPC_CNAF16) {
00071 for (i = 0; i < count; i++)
00072 if (f < 16)
00073 cam16i_q(c, n, a, f, pword++, (int *) x, (int *) q);
00074 else if (f < 24)
00075 cam16o_q(c, n, a, f, pword[i], (int *) x, (int *) q);
00076 else
00077 cam16i_q(c, n, a, f, &temp, (int *) x, (int *) q);
00078 } else {
00079 for (i = 0; i < count; i++)
00080 if (f < 16)
00081 cam24i_q(c, n, a, f, pdword++, (int *) x, (int *) q);
00082 else if (f < 24)
00083 cam24o_q(c, n, a, f, pdword[i], (int *) x, (int *) q);
00084 else
00085 cam24i_q(c, n, a, f, &dtemp, (int *) x, (int *) q);
00086 }
00087
00088 break;
00089
00090 case CNAF_nQ:
00091 if (index == RPC_CNAF16) {
00092 if (f < 16) {
00093 cam16i_rq(c, n, a, f, &pword, count);
00094 *size = (POINTER_T) pword - (POINTER_T) pdata;
00095 }
00096 } else {
00097 if (f < 16) {
00098 cam24i_rq(c, n, a, f, &pdword, count);
00099 *size = (POINTER_T) pdword - (POINTER_T) pdata;
00100 }
00101 }
00102
00103
00104 break;
00105
00106 default:
00107 printf("cnaf: Unknown command 0x%X\n", (unsigned int) cmd);
00108 }
00109
00110 if (cnaf_debug) {
00111 if (index == RPC_CNAF16)
00112 printf("cmd=%d r=%d c=%d n=%d a=%d f=%d d=%X x=%d q=%d\n",
00113 (int) cmd, (int) count, (int) c, (int) n, (int) a, (int) f,
00114 (int) pword[0], (int) *x, (int) *q);
00115 else if (index == RPC_CNAF24)
00116 printf("cmd=%d r=%d c=%d n=%d a=%d f=%d d=%X x=%d q=%d\n",
00117 (int) cmd, (int) count, (int) c, (int) n, (int) a, (int) f,
00118 (int) pdword[0], (int) *x, (int) *q);
00119 }
00120
00121 return RPC_SUCCESS;
00122 }
00123
00124 void register_cnaf_callback(int debug)
00125 {
00126 cnaf_debug = debug;
00127
00128 cm_register_function(RPC_CNAF16, cnaf_callback);
00129 cm_register_function(RPC_CNAF24, cnaf_callback);
00130 }
00131
00132