Files
kichikuou_xsystem35-sdl2/modules/ShArray/ShArray.c
T
2017-02-11 19:03:05 +09:00

1343 lines
30 KiB
C

/*
* ShArray.c 各種配列演算 module
*
* かえるにょ国にょアリス
* 大悪司
*
* Copyright (C) 1997-1998 Masaki Chikama (Wren) <chikama@kasumi.ipl.mech.nagoya-u.ac.jp>
* 1998- <masaki-c@is.aist-nara.ac.jp>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*
*/
/* $Id: ShArray.c,v 1.4 2002/08/18 09:35:29 chikama Exp $ */
#include "config.h"
#include <stdio.h>
#include "portab.h"
#include "system.h"
#include "xsystem35.h"
#include "nact.h"
void GetAtArray(void) { /* 0 */
/*
配列から演算しながら値を取り出す
vAry: 配列
cnt : 個数
type: 演算の種類
vResult: 演算結果を返す変数
*/
int *vAry = getCaliVariable();
int cnt = getCaliValue();
int type = getCaliValue();
int *vResult = getCaliVariable();
int i, j;
DEBUG_COMMAND("ShArray.GetAtArray %p,%d,%d,%p:\n", vAry, cnt, type, vResult);
j = *vAry; vAry++;
for (i = 1; i < cnt; i++) {
switch(type) {
case 1:
j += *vAry;
break;
case 2:
j *= *vAry;
break;
case 3:
j &= *vAry;
break;
case 4:
j |= *vAry;
break;
case 5:
j ^= *vAry;
break;
}
vAry++;
}
if (j > 65535) {
j = 65535;
}
*vResult = j;
}
void AddAtArray(void) { /* 1 */
/*
配列1に配列2を足す。65535 を超えたら 65535 に。
vAry1: 配列1
vAry2: 配列2
cnt : 個数
*/
int *vAry1 = getCaliVariable();
int *vAry2 = getCaliVariable();
int cnt = getCaliValue();
int i;
DEBUG_COMMAND("ShArray.AddAtArray %p,%p,%d:\n", vAry1, vAry2, cnt);
for (i = 0; i < cnt; i++) {
int result = (*vAry1) + (*vAry2);
if (result > 65535) {
*vAry1 = 65535;
} else {
*vAry1 = result;
}
vAry1++; vAry2++;
}
}
void SubAtArray(void) { /* 2 */
/*
配列1から配列2を引く。負になったら0をかく
vAry1: 配列1
vAry2: 配列2
cnt : 個数
*/
int *vAry1 = getCaliVariable();
int *vAry2 = getCaliVariable();
int cnt = getCaliValue();
int i;
DEBUG_COMMAND("ShArray.SubAtArray %p,%p,%d:\n", vAry1, vAry2, cnt);
for (i = 0; i < cnt; i++) {
int result = (*vAry1) - (*vAry2);
if (result < 0) {
*vAry1 = 0;
} else {
*vAry1 = result;
}
vAry1++; vAry2++;
}
}
void MulAtArray(void) { /* 3 */
/*
配列1に配列2をかけて、配列1に格納、65535まで。
vAry1: 配列1
vAry2: 配列2
cnt : 個数
*/
int *vAry1 = getCaliVariable();
int *vAry2 = getCaliVariable();
int cnt = getCaliValue();
int i;
DEBUG_COMMAND("ShArray.MulAtArray %p,%p,%d:\n", vAry1, vAry2, cnt);
for (i = 0; i < cnt; i++) {
int result = (*vAry1) * (*vAry2);
if (result > 65535) {
*vAry1 = 65535;
} else {
*vAry1 = result;
}
vAry1++; vAry2++;
}
}
void DivAtArray(void) { /* 4 */
/*
配列1を配列2で割って、配列1に格納、65535まで。
vAry1: 配列1
vAry2: 配列2
cnt : 個数
*/
int *vAry1 = getCaliVariable();
int *vAry2 = getCaliVariable();
int cnt = getCaliValue();
int i;
DEBUG_COMMAND("ShArray.DivAtArray: %d,%d,%d:\n", vAry1, vAry2, cnt);
for (i = 0; i < cnt; i++) {
if (*vAry2 == 0) {
*vAry1 = 0;
} else {
int result = (*vAry1) / (*vAry2);
if (result > 65535) {
*vAry1 = 65535;
} else {
*vAry1 = result;
}
}
vAry1++; vAry2++;
}
}
void MinAtArray(void) { /* 5 */
/*
配列 vAry1 の中身を配列 vAry2 で下限に設定する
vAry1: 配列1
vAry2: 配列2
cnt : 個数
*/
int *vAry1 = getCaliVariable();
int *vAry2 = getCaliVariable();
int cnt = getCaliValue();
int i;
DEBUG_COMMAND("ShArray.MinAtArray: %d,%d,%d:\n", vAry1, vAry2, cnt);
for (i = 0; i < cnt; i++) {
if (*vAry1 < *vAry2) {
*vAry1 = *vAry2;
}
vAry1++; vAry2++;
}
}
void MaxAtArray(void) { /* 6 */
/*
配列 vAry1 の中身を配列 vAry2 で上限に設定する
vAry1: 配列1
vAry2: 配列2
cnt : 個数
*/
int *vAry1 = getCaliVariable();
int *vAry2 = getCaliVariable();
int cnt = getCaliValue();
int i;
DEBUG_COMMAND("ShArray.MaxAtArray: %d,%d,%d:\n", vAry1, vAry2, cnt);
for (i = 0; i < cnt; i++) {
if (*vAry1 > *vAry2) {
*vAry1 = *vAry2;
}
vAry1++; vAry2++;
}
}
void AndNumArray(void) { /* 7 */
/*
配列のデータと val で AND をとる
vAry: 配列
cnt : 個数
val : ANDをとる値
*/
int *vAry = getCaliVariable();
int cnt = getCaliValue();
int val = getCaliValue();
int i;
DEBUG_COMMAND("ShArray.AndNumArray: %p,%d,%d:\n", vAry, cnt, val);
for (i = 0; i < cnt; i++) {
(*vAry) &= val;
vAry++;
}
}
void OrNumArray(void) { /* 8 */
/*
配列のデータと val で OR をとる
vAry: 配列
cnt : 個数
val : ORをとる値
*/
int *vAry = getCaliVariable();
int cnt = getCaliValue();
int val = getCaliValue();
int i;
DEBUG_COMMAND_YET("ShArray.OrNumArray: %p,%d,%d:\n", vAry, cnt, val);
for (i = 0; i < cnt; i++) {
(*vAry) |= val;
vAry++;
}
}
void XorNumArray(void) { /* 9 */
/*
配列のデータと val で XOR をとる
vAry: 配列
cnt : 個数
val : XORをとる値
*/
int *vAry = getCaliVariable();
int cnt = getCaliValue();
int val = getCaliValue();
int i;
DEBUG_COMMAND("ShArray.XorNumArray %p,%d,%d:\n", vAry, cnt, val);
for (i = 0; i < cnt; i++) {
(*vAry) ^= val;
vAry++;
}
}
void SetEquArray(void) { /* 10 */
/*
配列が val と等しければ 配列 vResults に 1 を、そうでなければ
0 を代入
vAry: 配列
cnt : 個数
val : 比較する値
vResults : 結果を格納する配列
*/
int *vAry = getCaliVariable();
int cnt = getCaliValue();
int val = getCaliValue();
int *vResults = getCaliVariable();
int i;
DEBUG_COMMAND("ShArray.SetEquArray %p,%d,%d,%p:\n", vAry, cnt, val, vResults);
for (i = 0; i < cnt; i++) {
*vResults = (*vAry == val) ? 1 : 0;
vResults++; vAry++;
}
}
void SetNotArray(void) { /* 11 */
/*
配列が val と等しくなければ配列 vResults に 1 を、そうでなければ
0 を代入
vAry: 配列
cnt : 個数
val : 比較する値
vResults : 結果を格納する配列
*/
int *vAry = getCaliVariable();
int cnt = getCaliValue();
int val = getCaliValue();
int *vResults = getCaliVariable();
int i;
DEBUG_COMMAND("ShArray.SetNotArray %p,%d,%d,%p:\n", vAry, cnt, val, vResults);
for (i = 0; i < cnt; i++) {
*vResults = (*vAry != val) ? 1 : 0;
vResults++; vAry++;
}
}
void SetLowArray(void) { /* 12 */
/*
配列データが val よりも小さければ vResult に 1 をセット
vAry: 配列
cnt : 個数
val : 閾値
vResult: 結果を返す変数
*/
int *vAry = getCaliVariable();
int cnt = getCaliValue();
int val = getCaliValue();
int *vResults = getCaliVariable();
int i;
DEBUG_COMMAND("ShArray.SetLowArray %p,%d,%d,%p:\n", vAry, cnt, val, vResults);
for (i = 0; i < cnt; i++) {
(*vResults) = ((*vAry < val) ? 1 : 0);
vResults++; vAry++;
}
}
void SetHighArray(void) { /* 13 */
/*
配列データが val よりも大きければ vResult に 1 をセット
vAry: 配列
cnt : 個数
val : 閾値
vResults: 結果を返す変数
*/
int *vAry = getCaliVariable();
int cnt = getCaliValue();
int val = getCaliValue();
int *vResults = getCaliVariable();
int i;
DEBUG_COMMAND("ShArray.SetHighArray %p,%d,%d,%p:\n", vAry, cnt, val, vResults);
for (i = 0; i < cnt; i++) {
(*vResults) = ((*vAry > val) ? 1 : 0);
vResults++; vAry++;
}
}
void SetRangeArray(void) { /* 14 */
/*
配列データがある範囲(min〜max)にあるかチェック
vAry: 配列
cnt : 個数
min : 最小値
max : 最大値
vResults: 結果を返す変数
min < vAry < max の時 vResults = 1;
それ以外 vResults = 0;
*/
int *vAry = getCaliVariable();
int cnt = getCaliValue();
int min = getCaliValue();
int max = getCaliValue();
int *vResults = getCaliVariable();
int i;
DEBUG_COMMAND("ShArray.SetRangeArray %p,%d,%d,%d,%p:\n", vAry, cnt, min, max, vResults);
for (i = 0; i < cnt; i++) {
*vResults = ((*vAry > min) && (*vAry < max)) ? 1 : 0;
vResults++; vAry++;
}
}
void SetAndEquArray(void) { /* 15 */
/*
配列 vAry と mask との AND をとって val に等しければ
配列 vResults に1を、等しくなければ 0 を書く
vAry: 配列
mask: 配列にかけるマスク
cnt : 個数
val : 比較する値
vResults : 結果を代入する配列
*/
int *vAry = getCaliVariable();
int mask = getCaliValue();
int cnt = getCaliValue();
int val = getCaliValue();
int *vResults = getCaliVariable();
int i;
DEBUG_COMMAND("ShArray.SetAndEquArray: %p,%d,%d,%d,%p:\n", vAry, mask, cnt, val, vResults);
for (i = 0; i < cnt; i++) {
*vResults = ((*vAry & mask) == val) ? 1 : 0;
vResults++; vAry++;
}
}
void AndEquArray(void) { /* 16 */
/*
配列 vAry 中で val と同じならば、vResult と 1 の AND を
違うならば 0 をかく。
vAry: 配列
cnt : 個数
val : 比較する値
vResults : 結果を代入する配列
*/
int *vAry = getCaliVariable();
int cnt = getCaliValue();
int val = getCaliValue();
int *vResults = getCaliVariable();
int i;
DEBUG_COMMAND("ShArray.AndEquArray %p,%d,%d,%p:\n", vAry, cnt, val, vResults);
for (i = 0; i < cnt; i++) {
*vResults &= ((*vAry == val) ? 1 : 0);
vResults++; vAry++;
}
}
void AndNotArray(void) { /* 17 */
/*
配列 vAry 中で val と等しくないならば、vResult と 1 の AND を
違う場合は 0 をかく。
vAry: 配列
cnt : 個数
val : 比較する値
vResults : 結果を代入する配列
*/
int *vAry = getCaliVariable();
int cnt = getCaliValue();
int val = getCaliValue();
int *vResults = getCaliVariable();
int i;
DEBUG_COMMAND("ShArray.AndNotArray %p,%d,%d,%p:\n", vAry, cnt, val, vResults);
for (i = 0; i < cnt; i++) {
*vResults &= ((*vAry != val) ? 1 : 0);
vResults++; vAry++;
}
}
void AndLowArray(void) { /* 18 */
/*
配列 vAry が min よりも小さいならば、vResult と 1 の AND を
そうでないならば 0 をかく。
vAry: 配列
cnt : 個数
min : 最小値
vResults : 結果を代入する配列
*/
int *vAry = getCaliVariable();
int cnt = getCaliValue();
int min = getCaliValue();
int *vResults = getCaliVariable();
int i;
DEBUG_COMMAND("ShArray.AndLowArray: %d,%d,%d,%d:\n", vAry, cnt, min, vResults);
for (i = 0; i < cnt; i++) {
*vResults &= ((*vAry < min) ? 1 : 0);
vResults++; vAry++;
}
}
void AndHighArray(void) { /* 19 */
/*
配列 vAry が min よりも大きいならば、vResult と 1 の AND を
そうでないならば 0 をかく。
vAry: 配列
cnt : 個数
max : 最小値
vResults : 結果を代入する配列
*/
int *vAry = getCaliVariable();
int cnt = getCaliValue();
int max = getCaliValue();
int *vResults = getCaliVariable();
int i;
DEBUG_COMMAND("ShArray.AndHighArray: %p,%d,%d,%p:\n", vAry, cnt, max, vResults);
for (i = 0; i < cnt; i++) {
*vResults &= ((*vAry > max) ? 1 : 0);
vResults++; vAry++;
}
}
void AndRangeArray(void) { /* 20 */
/*
vAry が min から max にある場合、vResults と 1 の AND を
そうでなければ 0 をかく。
vAry: 配列
cnt: 個数
min: 最小値
max: 最大値
vResults: 結果を返す配列
*/
int *vAry = getCaliVariable();
int cnt = getCaliValue();
int min = getCaliValue();
int max = getCaliValue();
int *vResults = getCaliVariable();
int i;
DEBUG_COMMAND("ShArray.AndRangeArray %d,%d,%d,%d,%d:\n", vAry, cnt, min, max, vResults);
for (i = 0; i < cnt; i++) {
*vResults &= (((*vAry > min) && (*vAry < max)) ? 1 : 0);
vResults++; vAry++;
}
}
void AndAndEquArray(void) { /* 21 */
/*
配列 vAry と mask との AND をとって val に等しければ
配列 vResults と1の AND、等しくなければ 0 を書く
vAry: 配列
mask: 配列にかけるマスク
cnt : 個数
val : 比較する値
vResults : 結果を代入する配列
*/
int *vAry = getCaliVariable();
int mask = getCaliValue();
int cnt = getCaliValue();
int val = getCaliValue();
int *vResults = getCaliVariable();
int i;
DEBUG_COMMAND("ShArray.AndAndEquArray: %d,%d,%d,%d,%d:\n", vAry, mask, cnt, val, vResults);
for (i = 0; i < cnt; i++) {
(*vResults) &= (((*vAry & mask) == val) ? 1 : 0);
vResults++; vAry++;
}
}
void OrEquArray(void) { /* 22 */
int p1 = getCaliValue();
int p2 = getCaliValue();
int p3 = getCaliValue();
int p4 = getCaliValue();
DEBUG_COMMAND_YET("ShArray.OrEquArray: %d,%d,%d,%d:\n", p1, p2, p3, p4);
}
void OrNotArray(void) { /* 23 */
/*
配列の値が val と等しくなければ vResult に 1 を書き込む
vAry: 配列
cnt : 個数
val : 比較する値
vResults: 結果を書き込む変数
*/
int *vAry = getCaliVariable();
int cnt = getCaliValue();
int val = getCaliValue();
int *vResults = getCaliVariable();
int i;
DEBUG_COMMAND("ShArray.OrNotArray %p,%d,%d,%p:\n", vAry, cnt, val, vResults);
for (i = 0; i < cnt; i++) {
// if (*vAry != val) *vResults = 1;
(*vResults) |= ((*vAry != val) ? 1 : 0);
vResults++; vAry++;
}
}
void OrLowArray(void) { /* 24 */
int p1 = getCaliValue();
int p2 = getCaliValue();
int p3 = getCaliValue();
int p4 = getCaliValue();
DEBUG_COMMAND_YET("ShArray.OrLowArray: %d,%d,%d,%d:\n", p1, p2, p3, p4);
}
void OrHighArray(void) { /* 25 */
int p1 = getCaliValue();
int p2 = getCaliValue();
int p3 = getCaliValue();
int p4 = getCaliValue();
DEBUG_COMMAND_YET("ShArray.OrHighArray: %d,%d,%d,%d:\n", p1, p2, p3, p4);
}
void OrRangeArray(void) { /* 26 */
int p1 = getCaliValue();
int p2 = getCaliValue();
int p3 = getCaliValue();
int p4 = getCaliValue();
int p5 = getCaliValue();
DEBUG_COMMAND_YET("ShArray.OrRangeArray: %d,%d,%d,%d,%d:\n", p1, p2, p3, p4,p5);
}
void OrAndEquArray(void) { /* 27 */
int p1 = getCaliValue();
int p2 = getCaliValue();
int p3 = getCaliValue();
int p4 = getCaliValue();
int p5 = getCaliValue();
DEBUG_COMMAND_YET("ShArray.OrAndEquArray: %d,%d,%d,%d,%d:\n", p1, p2, p3, p4,p5);
}
void EnumEquArray(void) { /* 28 */
/*
配列のデータ中に val と同じデータを数を vResult に返す
vAry: 配列
cnt : 個数
val : 比較する値
vResult: 一致する個数を返す変数
*/
int *vAry = getCaliVariable();
int cnt = getCaliValue();
int val = getCaliValue();
int *vResult = getCaliVariable();
int i;
DEBUG_COMMAND("ShArray.EnumEquArray %p,%d,%d,%p:\n", vAry, cnt, val, vResult);
*vResult = 0;
for (i = 0; i < cnt; i++) {
if (*vAry == val) (*vResult)++;
vAry++;
}
}
void EnumEquArray2(void) { /* 29 */
int p1 = getCaliValue();
int p2 = getCaliValue();
int p3 = getCaliValue();
int p4 = getCaliValue();
int p5 = getCaliValue();
int p6 = getCaliValue();
DEBUG_COMMAND_YET("ShArray.EnumEquArray2: %d,%d,%d,%d,%d,%d:\n", p1, p2, p3, p4, p5, p6);
}
void EnumEquNotArray2(void) { /* 30 */
/*
配列1が val1 に等しく、配列2がval2 に等しくないものの数を
vResult に返す。
vAry1: 配列1
vAry2: 配列2
cnt: 個数
val1: 配列1と比較する値
val2: 配列2と比較する値
vResult: 条件に一致する数を返す変数
*/
int *vAry1 = getCaliVariable();
int *vAry2 = getCaliVariable();
int cnt = getCaliValue();
int val1 = getCaliValue();
int val2 = getCaliValue();
int *vResult = getCaliVariable();
int i;
DEBUG_COMMAND("ShArray.EnumEquNotArray2 %p,%p,%d,%d,%d,%p:\n", vAry1, vAry2, cnt, val1, val2, vResult);
*vResult = 0;
for (i = 0; i < cnt; i++) {
if ((*vAry1 == val1) && (*vAry2 != val2)) {
(*vResult)++;
}
vAry1++; vAry2++;
}
}
void EnumNotArray(void) { /* 31 */
/*
配列のなかで val と等しくないものの個数を返す
vAry: 配列
cnt: 個数
val: 比較する値
vResult: 等しくないものの数
*/
int *vAry = getCaliVariable();
int cnt = getCaliValue();
int val = getCaliValue();
int *vResult = getCaliVariable();
int i;
DEBUG_COMMAND("ShArray.EnumNotArray %p, %d, %d, %p:\n", vAry, cnt, val, vResult);
*vResult = 0;
for (i = 0; i < cnt; i++) {
if (*vAry != val) {
(*vResult)++;
}
vAry++;
}
}
void EnumNotArray2(void) { /* 32 */
int p1 = getCaliValue();
int p2 = getCaliValue();
int p3 = getCaliValue();
int p4 = getCaliValue();
int p5 = getCaliValue();
int p6 = getCaliValue();
DEBUG_COMMAND_YET("ShArray.EnumNotArray2: %d,%d,%d,%d,%d,%d:\n", p1, p2, p3, p4, p5, p6);
}
void EnumLowArray(void) { /* 33 */
int p1 = getCaliValue();
int p2 = getCaliValue();
int p3 = getCaliValue();
int p4 = getCaliValue();
DEBUG_COMMAND_YET("ShArray.EnumLowArray: %d,%d,%d,%d:\n", p1, p2, p3, p4);
}
void EnumHighArray(void) { /* 34 */
int p1 = getCaliValue();
int p2 = getCaliValue();
int p3 = getCaliValue();
int p4 = getCaliValue();
DEBUG_COMMAND_YET("ShArray.EnumHighArray: %d,%d,%d,%d:\n", p1, p2, p3, p4);
}
void EnumRangeArray(void) { /* 35 */
/*
配列の値のうちが min と max の間あるものの数を vResult に返す
vAry: 配列
cnt : 個数
min : 最小値
max : 最大値
vResult: 一致した数を返す変数
*/
int *vAry = getCaliVariable();
int cnt = getCaliValue();
int min = getCaliValue();
int max = getCaliValue();
int *vResult = getCaliVariable();
int i;
DEBUG_COMMAND("ShArray.EnumRangeArray %d,%d,%d,%d,%d:\n", vAry, cnt, min, max, vResult);
*vResult = 0;
for (i = 0; i < cnt; i++) {
if ((*vAry > min) && (*vAry < max)) {
(*vResult)++;
}
vAry++;
}
}
void GrepEquArray(void) { /* 36 */
/*
配列の値が val と等しければ vLastMatch に一致した index を返し
vResult に 1 を返す
vAry: 配列
cnt : 個数
val : 比較する値
vMatch: 一致したインデックス
vResult: 一つでも val と同じ値があれば 1
*/
int *vAry = getCaliVariable();
int cnt = getCaliValue();
int val = getCaliValue();
int *vMatch = getCaliVariable();
int *vResult = getCaliVariable();
int i;
DEBUG_COMMAND("ShArray.GrepEquArray %p,%d,%d,%p,%p:\n", vAry, cnt, val, vMatch, vResult);
*vResult = 0;
for (i = 0; i < cnt; i++) {
if (*vAry == val) {
*vMatch = i;
*vResult = 1;
return;
}
vAry++;
}
}
void GrepNotArray(void) { /* 37 */
/*
配列の値が val と等しくなければ vLastMatch にその index を返し
vResult に 1 を返す
vAry: 配列
cnt : 個数
val : 比較する値
vMatch: 一致するindex
vResult: 一つでも val と同じ値があれば 1
*/
int *vAry = getCaliVariable();
int cnt = getCaliValue();
int val = getCaliValue();
int *vMatch = getCaliVariable();
int *vResult = getCaliVariable();
int i;
DEBUG_COMMAND("ShArray.GrepNotArray %p,%d,%d,%p,%p:\n", vAry, cnt, val, vMatch, vResult);
*vResult = 0;
for (i = 0; i < cnt; i++) {
if (*vAry != val) {
*vMatch = i;
*vResult = 1;
return;
}
vAry++;
}
}
void GrepEquArray2(void) { /* 38 */
int p1 = getCaliValue();
int p2 = getCaliValue();
int p3 = getCaliValue();
int p4 = getCaliValue();
int p5 = getCaliValue();
int p6 = getCaliValue();
int p7 = getCaliValue();
DEBUG_COMMAND_YET("ShArray.GrepEquArray2: %d,%d,%d,%d,%d,%d,%d:\n", p1, p2, p3, p4, p5, p6, p7);
}
void GrepNotArray2(void) { /* 39 */
int p1 = getCaliValue();
int p2 = getCaliValue();
int p3 = getCaliValue();
int p4 = getCaliValue();
int p5 = getCaliValue();
int p6 = getCaliValue();
int p7 = getCaliValue();
DEBUG_COMMAND_YET("ShArray.GrepNotArray2: %d,%d,%d,%d,%d,%d,%d:\n", p1, p2, p3, p4, p5, p6, p7);
}
void GrepEquNotArray2(void) { /* 40 */
int p1 = getCaliValue();
int p2 = getCaliValue();
int p3 = getCaliValue();
int p4 = getCaliValue();
int p5 = getCaliValue();
int p6 = getCaliValue();
int p7 = getCaliValue();
DEBUG_COMMAND_YET("ShArray.GrepEquNotArray2: %d,%d,%d,%d,%d,%d,%d:\n", p1, p2, p3, p4, p5, p6, p7);
}
void GrepLowArray(void) { /* 41 */
/*
配列の値が min よりも小さければ vMatch に一致した index
を返し vResult に 1 を返す
vAry: 配列
cnt : 個数
min : 最小値
vMatch: 一致したインデックス
vResult: 一つでも val と同じ値があれば 1
*/
int *vAry = getCaliVariable();
int cnt = getCaliValue();
int min = getCaliValue();
int *vMatch = getCaliVariable();
int *vResult = getCaliVariable();
int i;
DEBUG_COMMAND("ShArray.GrepLowArray: %p,%d,%d,%p,%p:\n", vAry, cnt, min, vMatch, vResult);
*vResult = 0;
for (i = 0; i < cnt; i++) {
if (*vAry < min) {
*vMatch = i;
*vResult = 1;
return;
}
vAry++;
}
}
void GrepHighArray(void) { /* 42 */
/*
配列の値が min よりも大きければ vMatch に一致した index
を返し vResult に 1 を返す
vAry: 配列
cnt : 個数
max : 最大値
vMatch: 一致したインデックス
vResult: 一つでも val と同じ値があれば 1
*/
int *vAry = getCaliVariable();
int cnt = getCaliValue();
int max = getCaliValue();
int *vMatch = getCaliVariable();
int *vResult = getCaliVariable();
int i;
DEBUG_COMMAND("ShArray.GrepHighArray: %p,%d,%d,%p,%p:\n", vAry, cnt, max, vMatch, vResult);
*vResult = 0;
for (i = 0; i < cnt; i++) {
if (*vAry > max) {
*vMatch = i;
*vResult = 1;
return;
}
vAry++;
}
}
void GrepRangeArray(void) { /* 43 */
/*
配列の値が max と min の間にあれば vMatch に一致した index
を返し vResult に 1 を返す
vAry: 配列
cnt : 個数
min : 最小値
max : 最大値
vMatch: 一致したインデックス
vResult: 一つでも val と同じ値があれば 1
*/
int *vAry = getCaliVariable();
int cnt = getCaliValue();
int min = getCaliValue();
int max = getCaliValue();
int *vMatch = getCaliVariable();
int *vResult = getCaliVariable();
int i;
DEBUG_COMMAND("ShArray.GrepRangeArray %p,%d,%d,%d,%p,%p:\n", vAry, cnt, max, min, vMatch, vResult);
*vResult = 0;
for (i = 0; i < cnt; i++) {
if ((*vAry > min) && (*vAry < max)) {
*vMatch = i;
*vResult = 1;
return;
}
vAry++;
}
}
void GrepLowOrderArray(void) { /* 44 */
/*
配列 vAry の中で minよりも大きく、 max よりも小さいもの
のうち、最も小さいものの index を vLastMatch に返す。
ただし。v1[index] は 0 である必要がある。
vAry: 配列
cnt : 個数
min : 最小値
max : 最大値
v1 : 結果を返す配列(0 の場所しか比較せず、最小の場所に 1 を書く
vLastMatch: 最小値を示す配列のindex
vResult: 最小値が見つかれば 1, 見つからなければ 0
*/
int *vAry = getCaliVariable();
int cnt = getCaliValue();
int min = getCaliValue();
int max = getCaliValue();
int *v1 = getCaliVariable();
int *vLastMatch = getCaliVariable();
int *vResult = getCaliVariable();
int i, j, k = 0;
DEBUG_COMMAND("ShArray.GrepLowOrderArray %p,%d,%d,%d,%p,%p,%p:\n", vAry, cnt, min, max, v1, vLastMatch, vResult);
*vResult = 0;
for (i = 0; i < cnt; i++) {
if((*(vAry + i) == min) && (*(v1 + i) == 0)) {
*vResult = 1;
*vLastMatch = i;
*(v1 + i) = 1;
return;
}
}
j = 65536;
for (i = 0; i < cnt; i++) {
if ((*(vAry + i) > min) && (*(vAry + i) < max) &&
(*(v1 + i) == 0) && (*(vAry + i) < j)) {
j = *(vAry + i);
k = i;
}
}
if (j < 65536) {
*vResult = 1;
*vLastMatch = k;
*(v1 + k) = 1;
}
}
void GrepHighOrderArray(void) { /* 45 */
/*
配列 vAry の中で minよりも大きく、 max よりも小さいもの
のうち、最も大きいものの index を vLastMatch に返す。
ただし。v1[index] は 0 である必要がある。
vAry: 配列
cnt : 個数
min : 最小値
max : 最大値
v1 : 結果を返す配列(0 の場所しか比較せず、最小の場所に 1 を書く
vLastMatch: 最大値を示す配列のindex
vResult: 最大値が見つかれば 1, 見つからなければ 0
*/
int *vAry = getCaliVariable();
int cnt = getCaliValue();
int min = getCaliValue();
int max = getCaliValue();
int *v1 = getCaliVariable();
int *vLastMatch = getCaliVariable();
int *vResult = getCaliVariable();
int i, j, k = 0;
DEBUG_COMMAND("ShArray.GrepHighOrderArray %p,%d,%d,%d,%p,%p,%p:\n", vAry, cnt, min, max, v1, vLastMatch, vResult);
*vResult = 0;
for (i = 0; i < cnt; i++) {
if ((*(vAry + i) == max) && (*(v1 + i) == 0)) {
*vResult = 1;
*vLastMatch = i;
*(v1 + i) = 1;
return;
}
}
j = -1;
for (i = 0; i < cnt; i++) {
if ((*(vAry + i) >= min) && (*(vAry + i) < max) &&
(*(v1 + i) == 0) && (*(vAry + i) > j)) {
j = *(vAry + i);
k = i;
}
}
if (j >= 0) {
*vResult = 1;
*vLastMatch = k;
*(v1 + k) = 1;
}
}
void ChangeEquArray(void) { /* 46 */
int *vAry = getCaliVariable();
int cnt = getCaliValue();
int src = getCaliValue();
int dst = getCaliValue();
int i;
DEBUG_COMMAND("ShArray.ChangeEquArray: %d,%d,%d,%d:\n", vAry, cnt, src, dst);
for (i = 0; i < cnt; i++) {
if (*vAry == src) {
*vAry = dst;
}
vAry++;
}
}
void ChangeNotArray(void) { /* 47 */
int p1 = getCaliValue();
int p2 = getCaliValue();
int p3 = getCaliValue();
int p4 = getCaliValue();
DEBUG_COMMAND_YET("ShArray.ChangeNotArray: %d,%d,%d,%d:\n", p1, p2, p3, p4);
}
void ChangeLowArray(void) { /* 48 */
int p1 = getCaliValue();
int p2 = getCaliValue();
int p3 = getCaliValue();
int p4 = getCaliValue();
DEBUG_COMMAND_YET("ShArray.ChangeLowArray: %d,%d,%d,%d:\n", p1, p2, p3, p4);
}
void ChangeHighArray(void) { /* 49 */
int p1 = getCaliValue();
int p2 = getCaliValue();
int p3 = getCaliValue();
int p4 = getCaliValue();
DEBUG_COMMAND_YET("ShArray.ChangeHighArray: %d,%d,%d,%d:\n", p1, p2, p3, p4);
}
void ChangeRangeArray(void) { /* 50 */
/*
配列内データが min から max の間にあるときは val で置き換え
vAry: 配列
cnt : 個数
min : 最小値
max : 最大値
val : 置き換える値
*/
int *vAry = getCaliVariable();
int cnt = getCaliValue();
int min = getCaliValue();
int max = getCaliValue();
int val = getCaliValue();
int i;
DEBUG_COMMAND("ShArray.ChangeRangeArray %p,%d,%d,%d,%d:\n", vAry, cnt, min, max, val);
for (i = 0; i < cnt; i++) {
if ((*vAry > min) && (*vAry < max)) {
*vAry = val;
}
vAry++;
}
}
void CopyArrayToRect(void) { /* 51 */
/*
vSrc の sw * sh の領域を vDst の dx,dy の位置にコピー
vSrc: コピー元配列
sw : コピー元 width
sh : コピー元 height
sx : コピー元 x
sy : コピー元 y
vDst: コピー先配列
dw : コピー先 width
dh : コピー先 height
*/
int *vSrc = getCaliVariable();
int sw = getCaliValue();
int sh = getCaliValue();
int sx = getCaliValue();
int sy = getCaliValue();
int *vDst = getCaliVariable();
int dw = getCaliValue();
int dh = getCaliValue();
int x, y;
DEBUG_COMMAND("ShArray.CopyArrayToRect %p,%d,%d,%d,%d,%p,%d,%d:\n", vSrc, sw, sh, sx, sy, vDst, dw, dh);
vSrc += (sy * sw + sx);
for (y = 0; y < dh; y++) {
for (x = 0; x < dw; x++) {
*(vDst + x) = *(vSrc + x);
}
vSrc += sw; vDst += dw;
}
}
void CopyRectToArray(void) { /* 52 */
/*
vSrc の sw * sh の領域を vDst の dx,dy の位置にコピー
vSrc: コピー元配列
sw : コピー元 width
sh : コピー元 height
vDst: コピー先配列
dw : コピー先 width
dh : コピー先 height
dx : コピー先 x
dy : コピー先 y
*/
int *vSrc = getCaliVariable();
int sw = getCaliValue();
int sh = getCaliValue();
int *vDst = getCaliVariable();
int dw = getCaliValue();
int dh = getCaliValue();
int dx = getCaliValue();
int dy = getCaliValue();
int x, y;
DEBUG_COMMAND("ShArray.CopyRectToArray %p,%d,%d,%p,%d,%d,%d,%d:\n", vSrc, sw, sh, vDst, dw, dh, dx, dy);
vDst += (dy * dw + dx);
for (y = 0; y < sh; y++) {
for (x = 0; x < sw; x++) {
*(vDst + x) = *(vSrc + x);
}
vSrc += sw; vDst += dw;
}
}
void ChangeSecretArray(void) { /* 53 */
/*
良く分からないが、データをコード化しているようだ
vAry: 配列
cnt : 個数
type: 機能番号
vResult: 結果を返す変数
*/
int *vAry = getCaliVariable();
int cnt = getCaliValue();
int type = getCaliValue();
int *vResult = getCaliVariable();
static WORD key[4] = { 0x7A7A, 0xADAD, 0xBCBC, 0xCECE }; /* key */
DEBUG_COMMAND("ShArray.ChangeSecretArray %p,%d,%d,%p:\n", vAry, cnt, type, vResult);
*vResult = 0;
switch(type) {
case 0:
/*
cnt -1 番目のキーを vAry に取り出す
*/
if (cnt > 0 && cnt < 5) {
*vAry = key[cnt -1];
*vResult = 1;
}
break;
case 1:
/*
vAry を cnt -1 番目のキーにセットする
*/
if (cnt > 0 && cnt < 5) {
key[cnt -1] = *vAry;
*vResult = 1;
}
break;
case 2:
{
/*
エンコードその1
*/
int i, j = 0;
WORD ax = key[3] ^ 0x5a5a;
for (i = 0; i < cnt; i++) {
(*vAry) ^= ax; ax = (key[i&3] ^ *vAry);
j ^= ax;
if (i & 2) {
ax = !ax ^ (i*3);
}
if (i & 4) {
ax = (ax >> 4) | (ax << 12);
}
vAry++;
}
*vResult = j;
}
break;
case 3:
{
/*
エンコードその2
*/
int i, j = 0, k;
WORD ax = key[3] ^ 0x5a5a;
for (i = 0; i < cnt; i++) {
k = *vAry;
*vAry ^= ax; ax = (key[i&3] ^ k);
j ^= ax;
if (i & 2) {
ax = !ax ^ (i*3);
}
if (i & 4) {
ax = (ax >> 4) | (ax << 12);
}
vAry++;
}
*vResult = j;
}
break;
}
}