diff options
Diffstat (limited to 'src')
78 files changed, 1469 insertions, 5546 deletions
diff --git a/src/aes_prng.c b/src/aes_prng.c index e0287fc1..aad0a38a 100644 --- a/src/aes_prng.c +++ b/src/aes_prng.c @@ -20,920 +20,868 @@ // effective PRNG (see: Empirical Evidence concerning AES, Hellekalek // & Wegenkittl, 2003). // -// The AES implementation is from GnuPG. Original copyright notice is -// below. +// AES implementation is taken from the Linux kernel's AES +// implementation, found in crypto/aes_generic.c. It has been hacked +// up to work independently. // -/* Rijndael (AES) for GnuPG - * Copyright (C) 2000, 2001, 2008 Free Software Foundation, Inc. +#include <stdint.h> + +#include "aes_prng.h" +#include "doomtype.h" +#include "i_swap.h" + +/* + * Cryptographic API. + * + * AES Cipher Algorithm. + * + * Based on Brian Gladman's code. * - * This file is part of GnuPG. + * Linux developers: + * Alexander Kjeldaas <astor@fast.no> + * Herbert Valerio Riedel <hvr@hvrlab.org> + * Kyle McMartin <kyle@debian.org> + * Adam J. Richter <adam@yggdrasil.com> (conversion to 2.5 API). * - * GnuPG is free software; you can redistribute it and/or modify + * 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 3 of the License, or + * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * - * GnuPG 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. + * --------------------------------------------------------------------------- + * Copyright (c) 2002, Dr Brian Gladman <brg@gladman.me.uk>, Worcester, UK. + * All rights reserved. * - * You should have received a copy of the GNU General Public License - * along with this program; if not, see <http://www.gnu.org/licenses/>. - ******************************************************************* - * The code here is based on the optimized implementation taken from - * http://www.esat.kuleuven.ac.be/~rijmen/rijndael/ on Oct 2, 2000, - * which carries this notice: - *------------------------------------------ - * rijndael-alg-fst.c v2.3 April '2000 + * LICENSE TERMS * - * Optimised ANSI C code + * The free distribution and use of this software in both source and binary + * form is allowed (with or without changes) provided that: * - * authors: v1.0: Antoon Bosselaers - * v2.0: Vincent Rijmen - * v2.3: Paulo Barreto + * 1. distributions of this source code include the above copyright + * notice, this list of conditions and the following disclaimer; * - * This code is placed in the public domain. - *------------------------------------------ + * 2. distributions in binary form include the above copyright + * notice, this list of conditions and the following disclaimer + * in the documentation and/or other associated materials; + * + * 3. the copyright holder's name is not used to endorse products + * built using this software without specific written permission. + * + * ALTERNATIVELY, provided that this notice is retained in full, this product + * may be distributed under the terms of the GNU General Public License (GPL), + * in which case the provisions of the GPL apply INSTEAD OF those given above. + * + * DISCLAIMER + * + * This software is provided 'as is' with no explicit or implied warranties + * in respect of its properties, including, but not limited to, correctness + * and/or fitness for purpose. + * --------------------------------------------------------------------------- */ -#include <stdio.h> -#include <stdlib.h> -#include <string.h> /* for memcmp() */ - -#include "aes_prng.h" -#include "doomtype.h" -#include "i_system.h" - -#define MAXKC (256/32) -#define MAXROUNDS 14 - +#define AES_MIN_KEY_SIZE 16 +#define AES_MAX_KEY_SIZE 32 +#define AES_KEYSIZE_128 16 +#define AES_KEYSIZE_192 24 +#define AES_KEYSIZE_256 32 +#define AES_BLOCK_SIZE 16 +#define AES_MAX_KEYLENGTH (15 * 16) +#define AES_MAX_KEYLENGTH_U32 (AES_MAX_KEYLENGTH / sizeof(uint32_t)) + +/* + * Please ensure that the first two fields are 16-byte aligned + * relative to the start of the structure, i.e., don't move them! + */ typedef struct { - int ROUNDS; /* key-length-dependent number of rounds */ - uint32_t keySched[MAXROUNDS+1][4]; /* key schedule */ -} RIJNDAEL_context; + uint32_t key_enc[AES_MAX_KEYLENGTH_U32]; + uint32_t key_dec[AES_MAX_KEYLENGTH_U32]; + uint32_t key_length; +} aes_context_t; -static const byte S[256] = +static inline uint8_t get_byte(const uint32_t x, const unsigned n) { - 99, 124, 119, 123, 242, 107, 111, 197, - 48, 1, 103, 43, 254, 215, 171, 118, - 202, 130, 201, 125, 250, 89, 71, 240, - 173, 212, 162, 175, 156, 164, 114, 192, - 183, 253, 147, 38, 54, 63, 247, 204, - 52, 165, 229, 241, 113, 216, 49, 21, - 4, 199, 35, 195, 24, 150, 5, 154, - 7, 18, 128, 226, 235, 39, 178, 117, - 9, 131, 44, 26, 27, 110, 90, 160, - 82, 59, 214, 179, 41, 227, 47, 132, - 83, 209, 0, 237, 32, 252, 177, 91, - 106, 203, 190, 57, 74, 76, 88, 207, - 208, 239, 170, 251, 67, 77, 51, 133, - 69, 249, 2, 127, 80, 60, 159, 168, - 81, 163, 64, 143, 146, 157, 56, 245, - 188, 182, 218, 33, 16, 255, 243, 210, - 205, 12, 19, 236, 95, 151, 68, 23, - 196, 167, 126, 61, 100, 93, 25, 115, - 96, 129, 79, 220, 34, 42, 144, 136, - 70, 238, 184, 20, 222, 94, 11, 219, - 224, 50, 58, 10, 73, 6, 36, 92, - 194, 211, 172, 98, 145, 149, 228, 121, - 231, 200, 55, 109, 141, 213, 78, 169, - 108, 86, 244, 234, 101, 122, 174, 8, - 186, 120, 37, 46, 28, 166, 180, 198, - 232, 221, 116, 31, 75, 189, 139, 138, - 112, 62, 181, 102, 72, 3, 246, 14, - 97, 53, 87, 185, 134, 193, 29, 158, - 225, 248, 152, 17, 105, 217, 142, 148, - 155, 30, 135, 233, 206, 85, 40, 223, - 140, 161, 137, 13, 191, 230, 66, 104, - 65, 153, 45, 15, 176, 84, 187, 22 -}; - + return x >> (n << 3); +} -static const byte T1[256][4] = -{ - { 0xc6,0x63,0x63,0xa5 }, { 0xf8,0x7c,0x7c,0x84 }, - { 0xee,0x77,0x77,0x99 }, { 0xf6,0x7b,0x7b,0x8d }, - { 0xff,0xf2,0xf2,0x0d }, { 0xd6,0x6b,0x6b,0xbd }, - { 0xde,0x6f,0x6f,0xb1 }, { 0x91,0xc5,0xc5,0x54 }, - { 0x60,0x30,0x30,0x50 }, { 0x02,0x01,0x01,0x03 }, - { 0xce,0x67,0x67,0xa9 }, { 0x56,0x2b,0x2b,0x7d }, - { 0xe7,0xfe,0xfe,0x19 }, { 0xb5,0xd7,0xd7,0x62 }, - { 0x4d,0xab,0xab,0xe6 }, { 0xec,0x76,0x76,0x9a }, - { 0x8f,0xca,0xca,0x45 }, { 0x1f,0x82,0x82,0x9d }, - { 0x89,0xc9,0xc9,0x40 }, { 0xfa,0x7d,0x7d,0x87 }, - { 0xef,0xfa,0xfa,0x15 }, { 0xb2,0x59,0x59,0xeb }, - { 0x8e,0x47,0x47,0xc9 }, { 0xfb,0xf0,0xf0,0x0b }, - { 0x41,0xad,0xad,0xec }, { 0xb3,0xd4,0xd4,0x67 }, - { 0x5f,0xa2,0xa2,0xfd }, { 0x45,0xaf,0xaf,0xea }, - { 0x23,0x9c,0x9c,0xbf }, { 0x53,0xa4,0xa4,0xf7 }, - { 0xe4,0x72,0x72,0x96 }, { 0x9b,0xc0,0xc0,0x5b }, - { 0x75,0xb7,0xb7,0xc2 }, { 0xe1,0xfd,0xfd,0x1c }, - { 0x3d,0x93,0x93,0xae }, { 0x4c,0x26,0x26,0x6a }, - { 0x6c,0x36,0x36,0x5a }, { 0x7e,0x3f,0x3f,0x41 }, - { 0xf5,0xf7,0xf7,0x02 }, { 0x83,0xcc,0xcc,0x4f }, - { 0x68,0x34,0x34,0x5c }, { 0x51,0xa5,0xa5,0xf4 }, - { 0xd1,0xe5,0xe5,0x34 }, { 0xf9,0xf1,0xf1,0x08 }, - { 0xe2,0x71,0x71,0x93 }, { 0xab,0xd8,0xd8,0x73 }, - { 0x62,0x31,0x31,0x53 }, { 0x2a,0x15,0x15,0x3f }, - { 0x08,0x04,0x04,0x0c }, { 0x95,0xc7,0xc7,0x52 }, - { 0x46,0x23,0x23,0x65 }, { 0x9d,0xc3,0xc3,0x5e }, - { 0x30,0x18,0x18,0x28 }, { 0x37,0x96,0x96,0xa1 }, - { 0x0a,0x05,0x05,0x0f }, { 0x2f,0x9a,0x9a,0xb5 }, - { 0x0e,0x07,0x07,0x09 }, { 0x24,0x12,0x12,0x36 }, - { 0x1b,0x80,0x80,0x9b }, { 0xdf,0xe2,0xe2,0x3d }, - { 0xcd,0xeb,0xeb,0x26 }, { 0x4e,0x27,0x27,0x69 }, - { 0x7f,0xb2,0xb2,0xcd }, { 0xea,0x75,0x75,0x9f }, - { 0x12,0x09,0x09,0x1b }, { 0x1d,0x83,0x83,0x9e }, - { 0x58,0x2c,0x2c,0x74 }, { 0x34,0x1a,0x1a,0x2e }, - { 0x36,0x1b,0x1b,0x2d }, { 0xdc,0x6e,0x6e,0xb2 }, - { 0xb4,0x5a,0x5a,0xee }, { 0x5b,0xa0,0xa0,0xfb }, - { 0xa4,0x52,0x52,0xf6 }, { 0x76,0x3b,0x3b,0x4d }, - { 0xb7,0xd6,0xd6,0x61 }, { 0x7d,0xb3,0xb3,0xce }, - { 0x52,0x29,0x29,0x7b }, { 0xdd,0xe3,0xe3,0x3e }, - { 0x5e,0x2f,0x2f,0x71 }, { 0x13,0x84,0x84,0x97 }, - { 0xa6,0x53,0x53,0xf5 }, { 0xb9,0xd1,0xd1,0x68 }, - { 0x00,0x00,0x00,0x00 }, { 0xc1,0xed,0xed,0x2c }, - { 0x40,0x20,0x20,0x60 }, { 0xe3,0xfc,0xfc,0x1f }, - { 0x79,0xb1,0xb1,0xc8 }, { 0xb6,0x5b,0x5b,0xed }, - { 0xd4,0x6a,0x6a,0xbe }, { 0x8d,0xcb,0xcb,0x46 }, - { 0x67,0xbe,0xbe,0xd9 }, { 0x72,0x39,0x39,0x4b }, - { 0x94,0x4a,0x4a,0xde }, { 0x98,0x4c,0x4c,0xd4 }, - { 0xb0,0x58,0x58,0xe8 }, { 0x85,0xcf,0xcf,0x4a }, - { 0xbb,0xd0,0xd0,0x6b }, { 0xc5,0xef,0xef,0x2a }, - { 0x4f,0xaa,0xaa,0xe5 }, { 0xed,0xfb,0xfb,0x16 }, - { 0x86,0x43,0x43,0xc5 }, { 0x9a,0x4d,0x4d,0xd7 }, - { 0x66,0x33,0x33,0x55 }, { 0x11,0x85,0x85,0x94 }, - { 0x8a,0x45,0x45,0xcf }, { 0xe9,0xf9,0xf9,0x10 }, - { 0x04,0x02,0x02,0x06 }, { 0xfe,0x7f,0x7f,0x81 }, - { 0xa0,0x50,0x50,0xf0 }, { 0x78,0x3c,0x3c,0x44 }, - { 0x25,0x9f,0x9f,0xba }, { 0x4b,0xa8,0xa8,0xe3 }, - { 0xa2,0x51,0x51,0xf3 }, { 0x5d,0xa3,0xa3,0xfe }, - { 0x80,0x40,0x40,0xc0 }, { 0x05,0x8f,0x8f,0x8a }, - { 0x3f,0x92,0x92,0xad }, { 0x21,0x9d,0x9d,0xbc }, - { 0x70,0x38,0x38,0x48 }, { 0xf1,0xf5,0xf5,0x04 }, - { 0x63,0xbc,0xbc,0xdf }, { 0x77,0xb6,0xb6,0xc1 }, - { 0xaf,0xda,0xda,0x75 }, { 0x42,0x21,0x21,0x63 }, - { 0x20,0x10,0x10,0x30 }, { 0xe5,0xff,0xff,0x1a }, - { 0xfd,0xf3,0xf3,0x0e }, { 0xbf,0xd2,0xd2,0x6d }, - { 0x81,0xcd,0xcd,0x4c }, { 0x18,0x0c,0x0c,0x14 }, - { 0x26,0x13,0x13,0x35 }, { 0xc3,0xec,0xec,0x2f }, - { 0xbe,0x5f,0x5f,0xe1 }, { 0x35,0x97,0x97,0xa2 }, - { 0x88,0x44,0x44,0xcc }, { 0x2e,0x17,0x17,0x39 }, - { 0x93,0xc4,0xc4,0x57 }, { 0x55,0xa7,0xa7,0xf2 }, - { 0xfc,0x7e,0x7e,0x82 }, { 0x7a,0x3d,0x3d,0x47 }, - { 0xc8,0x64,0x64,0xac }, { 0xba,0x5d,0x5d,0xe7 }, - { 0x32,0x19,0x19,0x2b }, { 0xe6,0x73,0x73,0x95 }, - { 0xc0,0x60,0x60,0xa0 }, { 0x19,0x81,0x81,0x98 }, - { 0x9e,0x4f,0x4f,0xd1 }, { 0xa3,0xdc,0xdc,0x7f }, - { 0x44,0x22,0x22,0x66 }, { 0x54,0x2a,0x2a,0x7e }, - { 0x3b,0x90,0x90,0xab }, { 0x0b,0x88,0x88,0x83 }, - { 0x8c,0x46,0x46,0xca }, { 0xc7,0xee,0xee,0x29 }, - { 0x6b,0xb8,0xb8,0xd3 }, { 0x28,0x14,0x14,0x3c }, - { 0xa7,0xde,0xde,0x79 }, { 0xbc,0x5e,0x5e,0xe2 }, - { 0x16,0x0b,0x0b,0x1d }, { 0xad,0xdb,0xdb,0x76 }, - { 0xdb,0xe0,0xe0,0x3b }, { 0x64,0x32,0x32,0x56 }, - { 0x74,0x3a,0x3a,0x4e }, { 0x14,0x0a,0x0a,0x1e }, - { 0x92,0x49,0x49,0xdb }, { 0x0c,0x06,0x06,0x0a }, - { 0x48,0x24,0x24,0x6c }, { 0xb8,0x5c,0x5c,0xe4 }, - { 0x9f,0xc2,0xc2,0x5d }, { 0xbd,0xd3,0xd3,0x6e }, - { 0x43,0xac,0xac,0xef }, { 0xc4,0x62,0x62,0xa6 }, - { 0x39,0x91,0x91,0xa8 }, { 0x31,0x95,0x95,0xa4 }, - { 0xd3,0xe4,0xe4,0x37 }, { 0xf2,0x79,0x79,0x8b }, - { 0xd5,0xe7,0xe7,0x32 }, { 0x8b,0xc8,0xc8,0x43 }, - { 0x6e,0x37,0x37,0x59 }, { 0xda,0x6d,0x6d,0xb7 }, - { 0x01,0x8d,0x8d,0x8c }, { 0xb1,0xd5,0xd5,0x64 }, - { 0x9c,0x4e,0x4e,0xd2 }, { 0x49,0xa9,0xa9,0xe0 }, - { 0xd8,0x6c,0x6c,0xb4 }, { 0xac,0x56,0x56,0xfa }, - { 0xf3,0xf4,0xf4,0x07 }, { 0xcf,0xea,0xea,0x25 }, - { 0xca,0x65,0x65,0xaf }, { 0xf4,0x7a,0x7a,0x8e }, - { 0x47,0xae,0xae,0xe9 }, { 0x10,0x08,0x08,0x18 }, - { 0x6f,0xba,0xba,0xd5 }, { 0xf0,0x78,0x78,0x88 }, - { 0x4a,0x25,0x25,0x6f }, { 0x5c,0x2e,0x2e,0x72 }, - { 0x38,0x1c,0x1c,0x24 }, { 0x57,0xa6,0xa6,0xf1 }, - { 0x73,0xb4,0xb4,0xc7 }, { 0x97,0xc6,0xc6,0x51 }, - { 0xcb,0xe8,0xe8,0x23 }, { 0xa1,0xdd,0xdd,0x7c }, - { 0xe8,0x74,0x74,0x9c }, { 0x3e,0x1f,0x1f,0x21 }, - { 0x96,0x4b,0x4b,0xdd }, { 0x61,0xbd,0xbd,0xdc }, - { 0x0d,0x8b,0x8b,0x86 }, { 0x0f,0x8a,0x8a,0x85 }, - { 0xe0,0x70,0x70,0x90 }, { 0x7c,0x3e,0x3e,0x42 }, - { 0x71,0xb5,0xb5,0xc4 }, { 0xcc,0x66,0x66,0xaa }, - { 0x90,0x48,0x48,0xd8 }, { 0x06,0x03,0x03,0x05 }, - { 0xf7,0xf6,0xf6,0x01 }, { 0x1c,0x0e,0x0e,0x12 }, - { 0xc2,0x61,0x61,0xa3 }, { 0x6a,0x35,0x35,0x5f }, - { 0xae,0x57,0x57,0xf9 }, { 0x69,0xb9,0xb9,0xd0 }, - { 0x17,0x86,0x86,0x91 }, { 0x99,0xc1,0xc1,0x58 }, - { 0x3a,0x1d,0x1d,0x27 }, { 0x27,0x9e,0x9e,0xb9 }, - { 0xd9,0xe1,0xe1,0x38 }, { 0xeb,0xf8,0xf8,0x13 }, - { 0x2b,0x98,0x98,0xb3 }, { 0x22,0x11,0x11,0x33 }, - { 0xd2,0x69,0x69,0xbb }, { 0xa9,0xd9,0xd9,0x70 }, - { 0x07,0x8e,0x8e,0x89 }, { 0x33,0x94,0x94,0xa7 }, - { 0x2d,0x9b,0x9b,0xb6 }, { 0x3c,0x1e,0x1e,0x22 }, - { 0x15,0x87,0x87,0x92 }, { 0xc9,0xe9,0xe9,0x20 }, - { 0x87,0xce,0xce,0x49 }, { 0xaa,0x55,0x55,0xff }, - { 0x50,0x28,0x28,0x78 }, { 0xa5,0xdf,0xdf,0x7a }, - { 0x03,0x8c,0x8c,0x8f }, { 0x59,0xa1,0xa1,0xf8 }, - { 0x09,0x89,0x89,0x80 }, { 0x1a,0x0d,0x0d,0x17 }, - { 0x65,0xbf,0xbf,0xda }, { 0xd7,0xe6,0xe6,0x31 }, - { 0x84,0x42,0x42,0xc6 }, { 0xd0,0x68,0x68,0xb8 }, - { 0x82,0x41,0x41,0xc3 }, { 0x29,0x99,0x99,0xb0 }, - { 0x5a,0x2d,0x2d,0x77 }, { 0x1e,0x0f,0x0f,0x11 }, - { 0x7b,0xb0,0xb0,0xcb }, { 0xa8,0x54,0x54,0xfc }, - { 0x6d,0xbb,0xbb,0xd6 }, { 0x2c,0x16,0x16,0x3a } -}; +static const uint32_t rco_tab[10] = { 1, 2, 4, 8, 16, 32, 64, 128, 27, 54 }; -static const byte T2[256][4] = -{ - { 0xa5,0xc6,0x63,0x63 }, { 0x84,0xf8,0x7c,0x7c }, - { 0x99,0xee,0x77,0x77 }, { 0x8d,0xf6,0x7b,0x7b }, - { 0x0d,0xff,0xf2,0xf2 }, { 0xbd,0xd6,0x6b,0x6b }, - { 0xb1,0xde,0x6f,0x6f }, { 0x54,0x91,0xc5,0xc5 }, - { 0x50,0x60,0x30,0x30 }, { 0x03,0x02,0x01,0x01 }, - { 0xa9,0xce,0x67,0x67 }, { 0x7d,0x56,0x2b,0x2b }, - { 0x19,0xe7,0xfe,0xfe }, { 0x62,0xb5,0xd7,0xd7 }, - { 0xe6,0x4d,0xab,0xab }, { 0x9a,0xec,0x76,0x76 }, - { 0x45,0x8f,0xca,0xca }, { 0x9d,0x1f,0x82,0x82 }, - { 0x40,0x89,0xc9,0xc9 }, { 0x87,0xfa,0x7d,0x7d }, - { 0x15,0xef,0xfa,0xfa }, { 0xeb,0xb2,0x59,0x59 }, - { 0xc9,0x8e,0x47,0x47 }, { 0x0b,0xfb,0xf0,0xf0 }, - { 0xec,0x41,0xad,0xad }, { 0x67,0xb3,0xd4,0xd4 }, - { 0xfd,0x5f,0xa2,0xa2 }, { 0xea,0x45,0xaf,0xaf }, - { 0xbf,0x23,0x9c,0x9c }, { 0xf7,0x53,0xa4,0xa4 }, - { 0x96,0xe4,0x72,0x72 }, { 0x5b,0x9b,0xc0,0xc0 }, - { 0xc2,0x75,0xb7,0xb7 }, { 0x1c,0xe1,0xfd,0xfd }, - { 0xae,0x3d,0x93,0x93 }, { 0x6a,0x4c,0x26,0x26 }, - { 0x5a,0x6c,0x36,0x36 }, { 0x41,0x7e,0x3f,0x3f }, - { 0x02,0xf5,0xf7,0xf7 }, { 0x4f,0x83,0xcc,0xcc }, - { 0x5c,0x68,0x34,0x34 }, { 0xf4,0x51,0xa5,0xa5 }, - { 0x34,0xd1,0xe5,0xe5 }, { 0x08,0xf9,0xf1,0xf1 }, - { 0x93,0xe2,0x71,0x71 }, { 0x73,0xab,0xd8,0xd8 }, - { 0x53,0x62,0x31,0x31 }, { 0x3f,0x2a,0x15,0x15 }, - { 0x0c,0x08,0x04,0x04 }, { 0x52,0x95,0xc7,0xc7 }, - { 0x65,0x46,0x23,0x23 }, { 0x5e,0x9d,0xc3,0xc3 }, - { 0x28,0x30,0x18,0x18 }, { 0xa1,0x37,0x96,0x96 }, - { 0x0f,0x0a,0x05,0x05 }, { 0xb5,0x2f,0x9a,0x9a }, - { 0x09,0x0e,0x07,0x07 }, { 0x36,0x24,0x12,0x12 }, - { 0x9b,0x1b,0x80,0x80 }, { 0x3d,0xdf,0xe2,0xe2 }, - { 0x26,0xcd,0xeb,0xeb }, { 0x69,0x4e,0x27,0x27 }, - { 0xcd,0x7f,0xb2,0xb2 }, { 0x9f,0xea,0x75,0x75 }, - { 0x1b,0x12,0x09,0x09 }, { 0x9e,0x1d,0x83,0x83 }, - { 0x74,0x58,0x2c,0x2c }, { 0x2e,0x34,0x1a,0x1a }, - { 0x2d,0x36,0x1b,0x1b }, { 0xb2,0xdc,0x6e,0x6e }, - { 0xee,0xb4,0x5a,0x5a }, { 0xfb,0x5b,0xa0,0xa0 }, - { 0xf6,0xa4,0x52,0x52 }, { 0x4d,0x76,0x3b,0x3b }, - { 0x61,0xb7,0xd6,0xd6 }, { 0xce,0x7d,0xb3,0xb3 }, - { 0x7b,0x52,0x29,0x29 }, { 0x3e,0xdd,0xe3,0xe3 }, - { 0x71,0x5e,0x2f,0x2f }, { 0x97,0x13,0x84,0x84 }, - { 0xf5,0xa6,0x53,0x53 }, { 0x68,0xb9,0xd1,0xd1 }, - { 0x00,0x00,0x00,0x00 }, { 0x2c,0xc1,0xed,0xed }, - { 0x60,0x40,0x20,0x20 }, { 0x1f,0xe3,0xfc,0xfc }, - { 0xc8,0x79,0xb1,0xb1 }, { 0xed,0xb6,0x5b,0x5b }, - { 0xbe,0xd4,0x6a,0x6a }, { 0x46,0x8d,0xcb,0xcb }, - { 0xd9,0x67,0xbe,0xbe }, { 0x4b,0x72,0x39,0x39 }, - { 0xde,0x94,0x4a,0x4a }, { 0xd4,0x98,0x4c,0x4c }, - { 0xe8,0xb0,0x58,0x58 }, { 0x4a,0x85,0xcf,0xcf }, - { 0x6b,0xbb,0xd0,0xd0 }, { 0x2a,0xc5,0xef,0xef }, - { 0xe5,0x4f,0xaa,0xaa }, { 0x16,0xed,0xfb,0xfb }, - { 0xc5,0x86,0x43,0x43 }, { 0xd7,0x9a,0x4d,0x4d }, - { 0x55,0x66,0x33,0x33 }, { 0x94,0x11,0x85,0x85 }, - { 0xcf,0x8a,0x45,0x45 }, { 0x10,0xe9,0xf9,0xf9 }, - { 0x06,0x04,0x02,0x02 }, { 0x81,0xfe,0x7f,0x7f }, - { 0xf0,0xa0,0x50,0x50 }, { 0x44,0x78,0x3c,0x3c }, - { 0xba,0x25,0x9f,0x9f }, { 0xe3,0x4b,0xa8,0xa8 }, - { 0xf3,0xa2,0x51,0x51 }, { 0xfe,0x5d,0xa3,0xa3 }, - { 0xc0,0x80,0x40,0x40 }, { 0x8a,0x05,0x8f,0x8f }, - { 0xad,0x3f,0x92,0x92 }, { 0xbc,0x21,0x9d,0x9d }, - { 0x48,0x70,0x38,0x38 }, { 0x04,0xf1,0xf5,0xf5 }, - { 0xdf,0x63,0xbc,0xbc }, { 0xc1,0x77,0xb6,0xb6 }, - { 0x75,0xaf,0xda,0xda }, { 0x63,0x42,0x21,0x21 }, - { 0x30,0x20,0x10,0x10 }, { 0x1a,0xe5,0xff,0xff }, - { 0x0e,0xfd,0xf3,0xf3 }, { 0x6d,0xbf,0xd2,0xd2 }, - { 0x4c,0x81,0xcd,0xcd }, { 0x14,0x18,0x0c,0x0c }, - { 0x35,0x26,0x13,0x13 }, { 0x2f,0xc3,0xec,0xec }, - { 0xe1,0xbe,0x5f,0x5f }, { 0xa2,0x35,0x97,0x97 }, - { 0xcc,0x88,0x44,0x44 }, { 0x39,0x2e,0x17,0x17 }, - { 0x57,0x93,0xc4,0xc4 }, { 0xf2,0x55,0xa7,0xa7 }, - { 0x82,0xfc,0x7e,0x7e }, { 0x47,0x7a,0x3d,0x3d }, - { 0xac,0xc8,0x64,0x64 }, { 0xe7,0xba,0x5d,0x5d }, - { 0x2b,0x32,0x19,0x19 }, { 0x95,0xe6,0x73,0x73 }, - { 0xa0,0xc0,0x60,0x60 }, { 0x98,0x19,0x81,0x81 }, - { 0xd1,0x9e,0x4f,0x4f }, { 0x7f,0xa3,0xdc,0xdc }, - { 0x66,0x44,0x22,0x22 }, { 0x7e,0x54,0x2a,0x2a }, - { 0xab,0x3b,0x90,0x90 }, { 0x83,0x0b,0x88,0x88 }, - { 0xca,0x8c,0x46,0x46 }, { 0x29,0xc7,0xee,0xee }, - { 0xd3,0x6b,0xb8,0xb8 }, { 0x3c,0x28,0x14,0x14 }, - { 0x79,0xa7,0xde,0xde }, { 0xe2,0xbc,0x5e,0x5e }, - { 0x1d,0x16,0x0b,0x0b }, { 0x76,0xad,0xdb,0xdb }, - { 0x3b,0xdb,0xe0,0xe0 }, { 0x56,0x64,0x32,0x32 }, - { 0x4e,0x74,0x3a,0x3a }, { 0x1e,0x14,0x0a,0x0a }, - { 0xdb,0x92,0x49,0x49 }, { 0x0a,0x0c,0x06,0x06 }, - { 0x6c,0x48,0x24,0x24 }, { 0xe4,0xb8,0x5c,0x5c }, - { 0x5d,0x9f,0xc2,0xc2 }, { 0x6e,0xbd,0xd3,0xd3 }, - { 0xef,0x43,0xac,0xac }, { 0xa6,0xc4,0x62,0x62 }, - { 0xa8,0x39,0x91,0x91 }, { 0xa4,0x31,0x95,0x95 }, - { 0x37,0xd3,0xe4,0xe4 }, { 0x8b,0xf2,0x79,0x79 }, - { 0x32,0xd5,0xe7,0xe7 }, { 0x43,0x8b,0xc8,0xc8 }, - { 0x59,0x6e,0x37,0x37 }, { 0xb7,0xda,0x6d,0x6d }, - { 0x8c,0x01,0x8d,0x8d }, { 0x64,0xb1,0xd5,0xd5 }, - { 0xd2,0x9c,0x4e,0x4e }, { 0xe0,0x49,0xa9,0xa9 }, - { 0xb4,0xd8,0x6c,0x6c }, { 0xfa,0xac,0x56,0x56 }, - { 0x07,0xf3,0xf4,0xf4 }, { 0x25,0xcf,0xea,0xea }, - { 0xaf,0xca,0x65,0x65 }, { 0x8e,0xf4,0x7a,0x7a }, - { 0xe9,0x47,0xae,0xae }, { 0x18,0x10,0x08,0x08 }, - { 0xd5,0x6f,0xba,0xba }, { 0x88,0xf0,0x78,0x78 }, - { 0x6f,0x4a,0x25,0x25 }, { 0x72,0x5c,0x2e,0x2e }, - { 0x24,0x38,0x1c,0x1c }, { 0xf1,0x57,0xa6,0xa6 }, - { 0xc7,0x73,0xb4,0xb4 }, { 0x51,0x97,0xc6,0xc6 }, - { 0x23,0xcb,0xe8,0xe8 }, { 0x7c,0xa1,0xdd,0xdd }, - { 0x9c,0xe8,0x74,0x74 }, { 0x21,0x3e,0x1f,0x1f }, - { 0xdd,0x96,0x4b,0x4b }, { 0xdc,0x61,0xbd,0xbd }, - { 0x86,0x0d,0x8b,0x8b }, { 0x85,0x0f,0x8a,0x8a }, - { 0x90,0xe0,0x70,0x70 }, { 0x42,0x7c,0x3e,0x3e }, - { 0xc4,0x71,0xb5,0xb5 }, { 0xaa,0xcc,0x66,0x66 }, - { 0xd8,0x90,0x48,0x48 }, { 0x05,0x06,0x03,0x03 }, - { 0x01,0xf7,0xf6,0xf6 }, { 0x12,0x1c,0x0e,0x0e }, - { 0xa3,0xc2,0x61,0x61 }, { 0x5f,0x6a,0x35,0x35 }, - { 0xf9,0xae,0x57,0x57 }, { 0xd0,0x69,0xb9,0xb9 }, - { 0x91,0x17,0x86,0x86 }, { 0x58,0x99,0xc1,0xc1 }, - { 0x27,0x3a,0x1d,0x1d }, { 0xb9,0x27,0x9e,0x9e }, - { 0x38,0xd9,0xe1,0xe1 }, { 0x13,0xeb,0xf8,0xf8 }, - { 0xb3,0x2b,0x98,0x98 }, { 0x33,0x22,0x11,0x11 }, - { 0xbb,0xd2,0x69,0x69 }, { 0x70,0xa9,0xd9,0xd9 }, - { 0x89,0x07,0x8e,0x8e }, { 0xa7,0x33,0x94,0x94 }, - { 0xb6,0x2d,0x9b,0x9b }, { 0x22,0x3c,0x1e,0x1e }, - { 0x92,0x15,0x87,0x87 }, { 0x20,0xc9,0xe9,0xe9 }, - { 0x49,0x87,0xce,0xce }, { 0xff,0xaa,0x55,0x55 }, - { 0x78,0x50,0x28,0x28 }, { 0x7a,0xa5,0xdf,0xdf }, - { 0x8f,0x03,0x8c,0x8c }, { 0xf8,0x59,0xa1,0xa1 }, - { 0x80,0x09,0x89,0x89 }, { 0x17,0x1a,0x0d,0x0d }, - { 0xda,0x65,0xbf,0xbf }, { 0x31,0xd7,0xe6,0xe6 }, - { 0xc6,0x84,0x42,0x42 }, { 0xb8,0xd0,0x68,0x68 }, - { 0xc3,0x82,0x41,0x41 }, { 0xb0,0x29,0x99,0x99 }, - { 0x77,0x5a,0x2d,0x2d }, { 0x11,0x1e,0x0f,0x0f }, - { 0xcb,0x7b,0xb0,0xb0 }, { 0xfc,0xa8,0x54,0x54 }, - { 0xd6,0x6d,0xbb,0xbb }, { 0x3a,0x2c,0x16,0x16 } +static const uint32_t crypto_ft_tab[4][256] = { + { + 0xa56363c6, 0x847c7cf8, 0x997777ee, 0x8d7b7bf6, + 0x0df2f2ff, 0xbd6b6bd6, 0xb16f6fde, 0x54c5c591, + 0x50303060, 0x03010102, 0xa96767ce, 0x7d2b2b56, + 0x19fefee7, 0x62d7d7b5, 0xe6abab4d, 0x9a7676ec, + 0x45caca8f, 0x9d82821f, 0x40c9c989, 0x877d7dfa, + 0x15fafaef, 0xeb5959b2, 0xc947478e, 0x0bf0f0fb, + 0xecadad41, 0x67d4d4b3, 0xfda2a25f, 0xeaafaf45, + 0xbf9c9c23, 0xf7a4a453, 0x967272e4, 0x5bc0c09b, + 0xc2b7b775, 0x1cfdfde1, 0xae93933d, 0x6a26264c, + 0x5a36366c, 0x413f3f7e, 0x02f7f7f5, 0x4fcccc83, + 0x5c343468, 0xf4a5a551, 0x34e5e5d1, 0x08f1f1f9, + 0x937171e2, 0x73d8d8ab, 0x53313162, 0x3f15152a, + 0x0c040408, 0x52c7c795, 0x65232346, 0x5ec3c39d, + 0x28181830, 0xa1969637, 0x0f05050a, 0xb59a9a2f, + 0x0907070e, 0x36121224, 0x9b80801b, 0x3de2e2df, + 0x26ebebcd, 0x6927274e, 0xcdb2b27f, 0x9f7575ea, + 0x1b090912, 0x9e83831d, 0x742c2c58, 0x2e1a1a34, + 0x2d1b1b36, 0xb26e6edc, 0xee5a5ab4, 0xfba0a05b, + 0xf65252a4, 0x4d3b3b76, 0x61d6d6b7, 0xceb3b37d, + 0x7b292952, 0x3ee3e3dd, 0x712f2f5e, 0x97848413, + 0xf55353a6, 0x68d1d1b9, 0x00000000, 0x2cededc1, + 0x60202040, 0x1ffcfce3, 0xc8b1b179, 0xed5b5bb6, + 0xbe6a6ad4, 0x46cbcb8d, 0xd9bebe67, 0x4b393972, + 0xde4a4a94, 0xd44c4c98, 0xe85858b0, 0x4acfcf85, + 0x6bd0d0bb, 0x2aefefc5, 0xe5aaaa4f, 0x16fbfbed, + 0xc5434386, 0xd74d4d9a, 0x55333366, 0x94858511, + 0xcf45458a, 0x10f9f9e9, 0x06020204, 0x817f7ffe, + 0xf05050a0, 0x443c3c78, 0xba9f9f25, 0xe3a8a84b, + 0xf35151a2, 0xfea3a35d, 0xc0404080, 0x8a8f8f05, + 0xad92923f, 0xbc9d9d21, 0x48383870, 0x04f5f5f1, + 0xdfbcbc63, 0xc1b6b677, 0x75dadaaf, 0x63212142, + 0x30101020, 0x1affffe5, 0x0ef3f3fd, 0x6dd2d2bf, + 0x4ccdcd81, 0x140c0c18, 0x35131326, 0x2fececc3, + 0xe15f5fbe, 0xa2979735, 0xcc444488, 0x3917172e, + 0x57c4c493, 0xf2a7a755, 0x827e7efc, 0x473d3d7a, + 0xac6464c8, 0xe75d5dba, 0x2b191932, 0x957373e6, + 0xa06060c0, 0x98818119, 0xd14f4f9e, 0x7fdcdca3, + 0x66222244, 0x7e2a2a54, 0xab90903b, 0x8388880b, + 0xca46468c, 0x29eeeec7, 0xd3b8b86b, 0x3c141428, + 0x79dedea7, 0xe25e5ebc, 0x1d0b0b16, 0x76dbdbad, + 0x3be0e0db, 0x56323264, 0x4e3a3a74, 0x1e0a0a14, + 0xdb494992, 0x0a06060c, 0x6c242448, 0xe45c5cb8, + 0x5dc2c29f, 0x6ed3d3bd, 0xefacac43, 0xa66262c4, + 0xa8919139, 0xa4959531, 0x37e4e4d3, 0x8b7979f2, + 0x32e7e7d5, 0x43c8c88b, 0x5937376e, 0xb76d6dda, + 0x8c8d8d01, 0x64d5d5b1, 0xd24e4e9c, 0xe0a9a949, + 0xb46c6cd8, 0xfa5656ac, 0x07f4f4f3, 0x25eaeacf, + 0xaf6565ca, 0x8e7a7af4, 0xe9aeae47, 0x18080810, + 0xd5baba6f, 0x887878f0, 0x6f25254a, 0x722e2e5c, + 0x241c1c38, 0xf1a6a657, 0xc7b4b473, 0x51c6c697, + 0x23e8e8cb, 0x7cdddda1, 0x9c7474e8, 0x211f1f3e, + 0xdd4b4b96, 0xdcbdbd61, 0x868b8b0d, 0x858a8a0f, + 0x907070e0, 0x423e3e7c, 0xc4b5b571, 0xaa6666cc, + 0xd8484890, 0x05030306, 0x01f6f6f7, 0x120e0e1c, + 0xa36161c2, 0x5f35356a, 0xf95757ae, 0xd0b9b969, + 0x91868617, 0x58c1c199, 0x271d1d3a, 0xb99e9e27, + 0x38e1e1d9, 0x13f8f8eb, 0xb398982b, 0x33111122, + 0xbb6969d2, 0x70d9d9a9, 0x898e8e07, 0xa7949433, + 0xb69b9b2d, 0x221e1e3c, 0x92878715, 0x20e9e9c9, + 0x49cece87, 0xff5555aa, 0x78282850, 0x7adfdfa5, + 0x8f8c8c03, 0xf8a1a159, 0x80898909, 0x170d0d1a, + 0xdabfbf65, 0x31e6e6d7, 0xc6424284, 0xb86868d0, + 0xc3414182, 0xb0999929, 0x772d2d5a, 0x110f0f1e, + 0xcbb0b07b, 0xfc5454a8, 0xd6bbbb6d, 0x3a16162c, + }, { + 0x6363c6a5, 0x7c7cf884, 0x7777ee99, 0x7b7bf68d, + 0xf2f2ff0d, 0x6b6bd6bd, 0x6f6fdeb1, 0xc5c59154, + 0x30306050, 0x01010203, 0x6767cea9, 0x2b2b567d, + 0xfefee719, 0xd7d7b562, 0xabab4de6, 0x7676ec9a, + 0xcaca8f45, 0x82821f9d, 0xc9c98940, 0x7d7dfa87, + 0xfafaef15, 0x5959b2eb, 0x47478ec9, 0xf0f0fb0b, + 0xadad41ec, 0xd4d4b367, 0xa2a25ffd, 0xafaf45ea, + 0x9c9c23bf, 0xa4a453f7, 0x7272e496, 0xc0c09b5b, + 0xb7b775c2, 0xfdfde11c, 0x93933dae, 0x26264c6a, + 0x36366c5a, 0x3f3f7e41, 0xf7f7f502, 0xcccc834f, + 0x3434685c, 0xa5a551f4, 0xe5e5d134, 0xf1f1f908, + 0x7171e293, 0xd8d8ab73, 0x31316253, 0x15152a3f, + 0x0404080c, 0xc7c79552, 0x23234665, 0xc3c39d5e, + 0x18183028, 0x969637a1, 0x05050a0f, 0x9a9a2fb5, + 0x07070e09, 0x12122436, 0x80801b9b, 0xe2e2df3d, + 0xebebcd26, 0x27274e69, 0xb2b27fcd, 0x7575ea9f, + 0x0909121b, 0x83831d9e, 0x2c2c5874, 0x1a1a342e, + 0x1b1b362d, 0x6e6edcb2, 0x5a5ab4ee, 0xa0a05bfb, + 0x5252a4f6, 0x3b3b764d, 0xd6d6b761, 0xb3b37dce, + 0x2929527b, 0xe3e3dd3e, 0x2f2f5e71, 0x84841397, + 0x5353a6f5, 0xd1d1b968, 0x00000000, 0xededc12c, + 0x20204060, 0xfcfce31f, 0xb1b179c8, 0x5b5bb6ed, + 0x6a6ad4be, 0xcbcb8d46, 0xbebe67d9, 0x3939724b, + 0x4a4a94de, 0x4c4c98d4, 0x5858b0e8, 0xcfcf854a, + 0xd0d0bb6b, 0xefefc52a, 0xaaaa4fe5, 0xfbfbed16, + 0x434386c5, 0x4d4d9ad7, 0x33336655, 0x85851194, + 0x45458acf, 0xf9f9e910, 0x02020406, 0x7f7ffe81, + 0x5050a0f0, 0x3c3c7844, 0x9f9f25ba, 0xa8a84be3, + 0x5151a2f3, 0xa3a35dfe, 0x404080c0, 0x8f8f058a, + 0x92923fad, 0x9d9d21bc, 0x38387048, 0xf5f5f104, + 0xbcbc63df, 0xb6b677c1, 0xdadaaf75, 0x21214263, + 0x10102030, 0xffffe51a, 0xf3f3fd0e, 0xd2d2bf6d, + 0xcdcd814c, 0x0c0c1814, 0x13132635, 0xececc32f, + 0x5f5fbee1, 0x979735a2, 0x444488cc, 0x17172e39, + 0xc4c49357, 0xa7a755f2, 0x7e7efc82, 0x3d3d7a47, + 0x6464c8ac, 0x5d5dbae7, 0x1919322b, 0x7373e695, + 0x6060c0a0, 0x81811998, 0x4f4f9ed1, 0xdcdca37f, + 0x22224466, 0x2a2a547e, 0x90903bab, 0x88880b83, + 0x46468cca, 0xeeeec729, 0xb8b86bd3, 0x1414283c, + 0xdedea779, 0x5e5ebce2, 0x0b0b161d, 0xdbdbad76, + 0xe0e0db3b, 0x32326456, 0x3a3a744e, 0x0a0a141e, + 0x494992db, 0x06060c0a, 0x2424486c, 0x5c5cb8e4, + 0xc2c29f5d, 0xd3d3bd6e, 0xacac43ef, 0x6262c4a6, + 0x919139a8, 0x959531a4, 0xe4e4d337, 0x7979f28b, + 0xe7e7d532, 0xc8c88b43, 0x37376e59, 0x6d6ddab7, + 0x8d8d018c, 0xd5d5b164, 0x4e4e9cd2, 0xa9a949e0, + 0x6c6cd8b4, 0x5656acfa, 0xf4f4f307, 0xeaeacf25, + 0x6565caaf, 0x7a7af48e, 0xaeae47e9, 0x08081018, + 0xbaba6fd5, 0x7878f088, 0x25254a6f, 0x2e2e5c72, + 0x1c1c3824, 0xa6a657f1, 0xb4b473c7, 0xc6c69751, + 0xe8e8cb23, 0xdddda17c, 0x7474e89c, 0x1f1f3e21, + 0x4b4b96dd, 0xbdbd61dc, 0x8b8b0d86, 0x8a8a0f85, + 0x7070e090, 0x3e3e7c42, 0xb5b571c4, 0x6666ccaa, + 0x484890d8, 0x03030605, 0xf6f6f701, 0x0e0e1c12, + 0x6161c2a3, 0x35356a5f, 0x5757aef9, 0xb9b969d0, + 0x86861791, 0xc1c19958, 0x1d1d3a27, 0x9e9e27b9, + 0xe1e1d938, 0xf8f8eb13, 0x98982bb3, 0x11112233, + 0x6969d2bb, 0xd9d9a970, 0x8e8e0789, 0x949433a7, + 0x9b9b2db6, 0x1e1e3c22, 0x87871592, 0xe9e9c920, + 0xcece8749, 0x5555aaff, 0x28285078, 0xdfdfa57a, + 0x8c8c038f, 0xa1a159f8, 0x89890980, 0x0d0d1a17, + 0xbfbf65da, 0xe6e6d731, 0x424284c6, 0x6868d0b8, + 0x414182c3, 0x999929b0, 0x2d2d5a77, 0x0f0f1e11, + 0xb0b07bcb, 0x5454a8fc, 0xbbbb6dd6, 0x16162c3a, + }, { + 0x63c6a563, 0x7cf8847c, 0x77ee9977, 0x7bf68d7b, + 0xf2ff0df2, 0x6bd6bd6b, 0x6fdeb16f, 0xc59154c5, + 0x30605030, 0x01020301, 0x67cea967, 0x2b567d2b, + 0xfee719fe, 0xd7b562d7, 0xab4de6ab, 0x76ec9a76, + 0xca8f45ca, 0x821f9d82, 0xc98940c9, 0x7dfa877d, + 0xfaef15fa, 0x59b2eb59, 0x478ec947, 0xf0fb0bf0, + 0xad41ecad, 0xd4b367d4, 0xa25ffda2, 0xaf45eaaf, + 0x9c23bf9c, 0xa453f7a4, 0x72e49672, 0xc09b5bc0, + 0xb775c2b7, 0xfde11cfd, 0x933dae93, 0x264c6a26, + 0x366c5a36, 0x3f7e413f, 0xf7f502f7, 0xcc834fcc, + 0x34685c34, 0xa551f4a5, 0xe5d134e5, 0xf1f908f1, + 0x71e29371, 0xd8ab73d8, 0x31625331, 0x152a3f15, + 0x04080c04, 0xc79552c7, 0x23466523, 0xc39d5ec3, + 0x18302818, 0x9637a196, 0x050a0f05, 0x9a2fb59a, + 0x070e0907, 0x12243612, 0x801b9b80, 0xe2df3de2, + 0xebcd26eb, 0x274e6927, 0xb27fcdb2, 0x75ea9f75, + 0x09121b09, 0x831d9e83, 0x2c58742c, 0x1a342e1a, + 0x1b362d1b, 0x6edcb26e, 0x5ab4ee5a, 0xa05bfba0, + 0x52a4f652, 0x3b764d3b, 0xd6b761d6, 0xb37dceb3, + 0x29527b29, 0xe3dd3ee3, 0x2f5e712f, 0x84139784, + 0x53a6f553, 0xd1b968d1, 0x00000000, 0xedc12ced, + 0x20406020, 0xfce31ffc, 0xb179c8b1, 0x5bb6ed5b, + 0x6ad4be6a, 0xcb8d46cb, 0xbe67d9be, 0x39724b39, + 0x4a94de4a, 0x4c98d44c, 0x58b0e858, 0xcf854acf, + 0xd0bb6bd0, 0xefc52aef, 0xaa4fe5aa, 0xfbed16fb, + 0x4386c543, 0x4d9ad74d, 0x33665533, 0x85119485, + 0x458acf45, 0xf9e910f9, 0x02040602, 0x7ffe817f, + 0x50a0f050, 0x3c78443c, 0x9f25ba9f, 0xa84be3a8, + 0x51a2f351, 0xa35dfea3, 0x4080c040, 0x8f058a8f, + 0x923fad92, 0x9d21bc9d, 0x38704838, 0xf5f104f5, + 0xbc63dfbc, 0xb677c1b6, 0xdaaf75da, 0x21426321, + 0x10203010, 0xffe51aff, 0xf3fd0ef3, 0xd2bf6dd2, + 0xcd814ccd, 0x0c18140c, 0x13263513, 0xecc32fec, + 0x5fbee15f, 0x9735a297, 0x4488cc44, 0x172e3917, + 0xc49357c4, 0xa755f2a7, 0x7efc827e, 0x3d7a473d, + 0x64c8ac64, 0x5dbae75d, 0x19322b19, 0x73e69573, + 0x60c0a060, 0x81199881, 0x4f9ed14f, 0xdca37fdc, + 0x22446622, 0x2a547e2a, 0x903bab90, 0x880b8388, + 0x468cca46, 0xeec729ee, 0xb86bd3b8, 0x14283c14, + 0xdea779de, 0x5ebce25e, 0x0b161d0b, 0xdbad76db, + 0xe0db3be0, 0x32645632, 0x3a744e3a, 0x0a141e0a, + 0x4992db49, 0x060c0a06, 0x24486c24, 0x5cb8e45c, + 0xc29f5dc2, 0xd3bd6ed3, 0xac43efac, 0x62c4a662, + 0x9139a891, 0x9531a495, 0xe4d337e4, 0x79f28b79, + 0xe7d532e7, 0xc88b43c8, 0x376e5937, 0x6ddab76d, + 0x8d018c8d, 0xd5b164d5, 0x4e9cd24e, 0xa949e0a9, + 0x6cd8b46c, 0x56acfa56, 0xf4f307f4, 0xeacf25ea, + 0x65caaf65, 0x7af48e7a, 0xae47e9ae, 0x08101808, + 0xba6fd5ba, 0x78f08878, 0x254a6f25, 0x2e5c722e, + 0x1c38241c, 0xa657f1a6, 0xb473c7b4, 0xc69751c6, + 0xe8cb23e8, 0xdda17cdd, 0x74e89c74, 0x1f3e211f, + 0x4b96dd4b, 0xbd61dcbd, 0x8b0d868b, 0x8a0f858a, + 0x70e09070, 0x3e7c423e, 0xb571c4b5, 0x66ccaa66, + 0x4890d848, 0x03060503, 0xf6f701f6, 0x0e1c120e, + 0x61c2a361, 0x356a5f35, 0x57aef957, 0xb969d0b9, + 0x86179186, 0xc19958c1, 0x1d3a271d, 0x9e27b99e, + 0xe1d938e1, 0xf8eb13f8, 0x982bb398, 0x11223311, + 0x69d2bb69, 0xd9a970d9, 0x8e07898e, 0x9433a794, + 0x9b2db69b, 0x1e3c221e, 0x87159287, 0xe9c920e9, + 0xce8749ce, 0x55aaff55, 0x28507828, 0xdfa57adf, + 0x8c038f8c, 0xa159f8a1, 0x89098089, 0x0d1a170d, + 0xbf65dabf, 0xe6d731e6, 0x4284c642, 0x68d0b868, + 0x4182c341, 0x9929b099, 0x2d5a772d, 0x0f1e110f, + 0xb07bcbb0, 0x54a8fc54, 0xbb6dd6bb, 0x162c3a16, + }, { + 0xc6a56363, 0xf8847c7c, 0xee997777, 0xf68d7b7b, + 0xff0df2f2, 0xd6bd6b6b, 0xdeb16f6f, 0x9154c5c5, + 0x60503030, 0x02030101, 0xcea96767, 0x567d2b2b, + 0xe719fefe, 0xb562d7d7, 0x4de6abab, 0xec9a7676, + 0x8f45caca, 0x1f9d8282, 0x8940c9c9, 0xfa877d7d, + 0xef15fafa, 0xb2eb5959, 0x8ec94747, 0xfb0bf0f0, + 0x41ecadad, 0xb367d4d4, 0x5ffda2a2, 0x45eaafaf, + 0x23bf9c9c, 0x53f7a4a4, 0xe4967272, 0x9b5bc0c0, + 0x75c2b7b7, 0xe11cfdfd, 0x3dae9393, 0x4c6a2626, + 0x6c5a3636, 0x7e413f3f, 0xf502f7f7, 0x834fcccc, + 0x685c3434, 0x51f4a5a5, 0xd134e5e5, 0xf908f1f1, + 0xe2937171, 0xab73d8d8, 0x62533131, 0x2a3f1515, + 0x080c0404, 0x9552c7c7, 0x46652323, 0x9d5ec3c3, + 0x30281818, 0x37a19696, 0x0a0f0505, 0x2fb59a9a, + 0x0e090707, 0x24361212, 0x1b9b8080, 0xdf3de2e2, + 0xcd26ebeb, 0x4e692727, 0x7fcdb2b2, 0xea9f7575, + 0x121b0909, 0x1d9e8383, 0x58742c2c, 0x342e1a1a, + 0x362d1b1b, 0xdcb26e6e, 0xb4ee5a5a, 0x5bfba0a0, + 0xa4f65252, 0x764d3b3b, 0xb761d6d6, 0x7dceb3b3, + 0x527b2929, 0xdd3ee3e3, 0x5e712f2f, 0x13978484, + 0xa6f55353, 0xb968d1d1, 0x00000000, 0xc12ceded, + 0x40602020, 0xe31ffcfc, 0x79c8b1b1, 0xb6ed5b5b, + 0xd4be6a6a, 0x8d46cbcb, 0x67d9bebe, 0x724b3939, + 0x94de4a4a, 0x98d44c4c, 0xb0e85858, 0x854acfcf, + 0xbb6bd0d0, 0xc52aefef, 0x4fe5aaaa, 0xed16fbfb, + 0x86c54343, 0x9ad74d4d, 0x66553333, 0x11948585, + 0x8acf4545, 0xe910f9f9, 0x04060202, 0xfe817f7f, + 0xa0f05050, 0x78443c3c, 0x25ba9f9f, 0x4be3a8a8, + 0xa2f35151, 0x5dfea3a3, 0x80c04040, 0x058a8f8f, + 0x3fad9292, 0x21bc9d9d, 0x70483838, 0xf104f5f5, + 0x63dfbcbc, 0x77c1b6b6, 0xaf75dada, 0x42632121, + 0x20301010, 0xe51affff, 0xfd0ef3f3, 0xbf6dd2d2, + 0x814ccdcd, 0x18140c0c, 0x26351313, 0xc32fecec, + 0xbee15f5f, 0x35a29797, 0x88cc4444, 0x2e391717, + 0x9357c4c4, 0x55f2a7a7, 0xfc827e7e, 0x7a473d3d, + 0xc8ac6464, 0xbae75d5d, 0x322b1919, 0xe6957373, + 0xc0a06060, 0x19988181, 0x9ed14f4f, 0xa37fdcdc, + 0x44662222, 0x547e2a2a, 0x3bab9090, 0x0b838888, + 0x8cca4646, 0xc729eeee, 0x6bd3b8b8, 0x283c1414, + 0xa779dede, 0xbce25e5e, 0x161d0b0b, 0xad76dbdb, + 0xdb3be0e0, 0x64563232, 0x744e3a3a, 0x141e0a0a, + 0x92db4949, 0x0c0a0606, 0x486c2424, 0xb8e45c5c, + 0x9f5dc2c2, 0xbd6ed3d3, 0x43efacac, 0xc4a66262, + 0x39a89191, 0x31a49595, 0xd337e4e4, 0xf28b7979, + 0xd532e7e7, 0x8b43c8c8, 0x6e593737, 0xdab76d6d, + 0x018c8d8d, 0xb164d5d5, 0x9cd24e4e, 0x49e0a9a9, + 0xd8b46c6c, 0xacfa5656, 0xf307f4f4, 0xcf25eaea, + 0xcaaf6565, 0xf48e7a7a, 0x47e9aeae, 0x10180808, + 0x6fd5baba, 0xf0887878, 0x4a6f2525, 0x5c722e2e, + 0x38241c1c, 0x57f1a6a6, 0x73c7b4b4, 0x9751c6c6, + 0xcb23e8e8, 0xa17cdddd, 0xe89c7474, 0x3e211f1f, + 0x96dd4b4b, 0x61dcbdbd, 0x0d868b8b, 0x0f858a8a, + 0xe0907070, 0x7c423e3e, 0x71c4b5b5, 0xccaa6666, + 0x90d84848, 0x06050303, 0xf701f6f6, 0x1c120e0e, + 0xc2a36161, 0x6a5f3535, 0xaef95757, 0x69d0b9b9, + 0x17918686, 0x9958c1c1, 0x3a271d1d, 0x27b99e9e, + 0xd938e1e1, 0xeb13f8f8, 0x2bb39898, 0x22331111, + 0xd2bb6969, 0xa970d9d9, 0x07898e8e, 0x33a79494, + 0x2db69b9b, 0x3c221e1e, 0x15928787, 0xc920e9e9, + 0x8749cece, 0xaaff5555, 0x50782828, 0xa57adfdf, + 0x038f8c8c, 0x59f8a1a1, 0x09808989, 0x1a170d0d, + 0x65dabfbf, 0xd731e6e6, 0x84c64242, 0xd0b86868, + 0x82c34141, 0x29b09999, 0x5a772d2d, 0x1e110f0f, + 0x7bcbb0b0, 0xa8fc5454, 0x6dd6bbbb, 0x2c3a1616, + } }; -static const byte T3[256][4] = -{ - { 0x63,0xa5,0xc6,0x63 }, { 0x7c,0x84,0xf8,0x7c }, - { 0x77,0x99,0xee,0x77 }, { 0x7b,0x8d,0xf6,0x7b }, - { 0xf2,0x0d,0xff,0xf2 }, { 0x6b,0xbd,0xd6,0x6b }, - { 0x6f,0xb1,0xde,0x6f }, { 0xc5,0x54,0x91,0xc5 }, - { 0x30,0x50,0x60,0x30 }, { 0x01,0x03,0x02,0x01 }, - { 0x67,0xa9,0xce,0x67 }, { 0x2b,0x7d,0x56,0x2b }, - { 0xfe,0x19,0xe7,0xfe }, { 0xd7,0x62,0xb5,0xd7 }, - { 0xab,0xe6,0x4d,0xab }, { 0x76,0x9a,0xec,0x76 }, - { 0xca,0x45,0x8f,0xca }, { 0x82,0x9d,0x1f,0x82 }, - { 0xc9,0x40,0x89,0xc9 }, { 0x7d,0x87,0xfa,0x7d }, - { 0xfa,0x15,0xef,0xfa }, { 0x59,0xeb,0xb2,0x59 }, - { 0x47,0xc9,0x8e,0x47 }, { 0xf0,0x0b,0xfb,0xf0 }, - { 0xad,0xec,0x41,0xad }, { 0xd4,0x67,0xb3,0xd4 }, - { 0xa2,0xfd,0x5f,0xa2 }, { 0xaf,0xea,0x45,0xaf }, - { 0x9c,0xbf,0x23,0x9c }, { 0xa4,0xf7,0x53,0xa4 }, - { 0x72,0x96,0xe4,0x72 }, { 0xc0,0x5b,0x9b,0xc0 }, - { 0xb7,0xc2,0x75,0xb7 }, { 0xfd,0x1c,0xe1,0xfd }, - { 0x93,0xae,0x3d,0x93 }, { 0x26,0x6a,0x4c,0x26 }, - { 0x36,0x5a,0x6c,0x36 }, { 0x3f,0x41,0x7e,0x3f }, - { 0xf7,0x02,0xf5,0xf7 }, { 0xcc,0x4f,0x83,0xcc }, - { 0x34,0x5c,0x68,0x34 }, { 0xa5,0xf4,0x51,0xa5 }, - { 0xe5,0x34,0xd1,0xe5 }, { 0xf1,0x08,0xf9,0xf1 }, - { 0x71,0x93,0xe2,0x71 }, { 0xd8,0x73,0xab,0xd8 }, - { 0x31,0x53,0x62,0x31 }, { 0x15,0x3f,0x2a,0x15 }, - { 0x04,0x0c,0x08,0x04 }, { 0xc7,0x52,0x95,0xc7 }, - { 0x23,0x65,0x46,0x23 }, { 0xc3,0x5e,0x9d,0xc3 }, - { 0x18,0x28,0x30,0x18 }, { 0x96,0xa1,0x37,0x96 }, - { 0x05,0x0f,0x0a,0x05 }, { 0x9a,0xb5,0x2f,0x9a }, - { 0x07,0x09,0x0e,0x07 }, { 0x12,0x36,0x24,0x12 }, - { 0x80,0x9b,0x1b,0x80 }, { 0xe2,0x3d,0xdf,0xe2 }, - { 0xeb,0x26,0xcd,0xeb }, { 0x27,0x69,0x4e,0x27 }, - { 0xb2,0xcd,0x7f,0xb2 }, { 0x75,0x9f,0xea,0x75 }, - { 0x09,0x1b,0x12,0x09 }, { 0x83,0x9e,0x1d,0x83 }, - { 0x2c,0x74,0x58,0x2c }, { 0x1a,0x2e,0x34,0x1a }, - { 0x1b,0x2d,0x36,0x1b }, { 0x6e,0xb2,0xdc,0x6e }, - { 0x5a,0xee,0xb4,0x5a }, { 0xa0,0xfb,0x5b,0xa0 }, - { 0x52,0xf6,0xa4,0x52 }, { 0x3b,0x4d,0x76,0x3b }, - { 0xd6,0x61,0xb7,0xd6 }, { 0xb3,0xce,0x7d,0xb3 }, - { 0x29,0x7b,0x52,0x29 }, { 0xe3,0x3e,0xdd,0xe3 }, - { 0x2f,0x71,0x5e,0x2f }, { 0x84,0x97,0x13,0x84 }, - { 0x53,0xf5,0xa6,0x53 }, { 0xd1,0x68,0xb9,0xd1 }, - { 0x00,0x00,0x00,0x00 }, { 0xed,0x2c,0xc1,0xed }, - { 0x20,0x60,0x40,0x20 }, { 0xfc,0x1f,0xe3,0xfc }, - { 0xb1,0xc8,0x79,0xb1 }, { 0x5b,0xed,0xb6,0x5b }, - { 0x6a,0xbe,0xd4,0x6a }, { 0xcb,0x46,0x8d,0xcb }, - { 0xbe,0xd9,0x67,0xbe }, { 0x39,0x4b,0x72,0x39 }, - { 0x4a,0xde,0x94,0x4a }, { 0x4c,0xd4,0x98,0x4c }, - { 0x58,0xe8,0xb0,0x58 }, { 0xcf,0x4a,0x85,0xcf }, - { 0xd0,0x6b,0xbb,0xd0 }, { 0xef,0x2a,0xc5,0xef }, - { 0xaa,0xe5,0x4f,0xaa }, { 0xfb,0x16,0xed,0xfb }, - { 0x43,0xc5,0x86,0x43 }, { 0x4d,0xd7,0x9a,0x4d }, - { 0x33,0x55,0x66,0x33 }, { 0x85,0x94,0x11,0x85 }, - { 0x45,0xcf,0x8a,0x45 }, { 0xf9,0x10,0xe9,0xf9 }, - { 0x02,0x06,0x04,0x02 }, { 0x7f,0x81,0xfe,0x7f }, - { 0x50,0xf0,0xa0,0x50 }, { 0x3c,0x44,0x78,0x3c }, - { 0x9f,0xba,0x25,0x9f }, { 0xa8,0xe3,0x4b,0xa8 }, - { 0x51,0xf3,0xa2,0x51 }, { 0xa3,0xfe,0x5d,0xa3 }, - { 0x40,0xc0,0x80,0x40 }, { 0x8f,0x8a,0x05,0x8f }, - { 0x92,0xad,0x3f,0x92 }, { 0x9d,0xbc,0x21,0x9d }, - { 0x38,0x48,0x70,0x38 }, { 0xf5,0x04,0xf1,0xf5 }, - { 0xbc,0xdf,0x63,0xbc }, { 0xb6,0xc1,0x77,0xb6 }, - { 0xda,0x75,0xaf,0xda }, { 0x21,0x63,0x42,0x21 }, - { 0x10,0x30,0x20,0x10 }, { 0xff,0x1a,0xe5,0xff }, - { 0xf3,0x0e,0xfd,0xf3 }, { 0xd2,0x6d,0xbf,0xd2 }, - { 0xcd,0x4c,0x81,0xcd }, { 0x0c,0x14,0x18,0x0c }, - { 0x13,0x35,0x26,0x13 }, { 0xec,0x2f,0xc3,0xec }, - { 0x5f,0xe1,0xbe,0x5f }, { 0x97,0xa2,0x35,0x97 }, - { 0x44,0xcc,0x88,0x44 }, { 0x17,0x39,0x2e,0x17 }, - { 0xc4,0x57,0x93,0xc4 }, { 0xa7,0xf2,0x55,0xa7 }, - { 0x7e,0x82,0xfc,0x7e }, { 0x3d,0x47,0x7a,0x3d }, - { 0x64,0xac,0xc8,0x64 }, { 0x5d,0xe7,0xba,0x5d }, - { 0x19,0x2b,0x32,0x19 }, { 0x73,0x95,0xe6,0x73 }, - { 0x60,0xa0,0xc0,0x60 }, { 0x81,0x98,0x19,0x81 }, - { 0x4f,0xd1,0x9e,0x4f }, { 0xdc,0x7f,0xa3,0xdc }, - { 0x22,0x66,0x44,0x22 }, { 0x2a,0x7e,0x54,0x2a }, - { 0x90,0xab,0x3b,0x90 }, { 0x88,0x83,0x0b,0x88 }, - { 0x46,0xca,0x8c,0x46 }, { 0xee,0x29,0xc7,0xee }, - { 0xb8,0xd3,0x6b,0xb8 }, { 0x14,0x3c,0x28,0x14 }, - { 0xde,0x79,0xa7,0xde }, { 0x5e,0xe2,0xbc,0x5e }, - { 0x0b,0x1d,0x16,0x0b }, { 0xdb,0x76,0xad,0xdb }, - { 0xe0,0x3b,0xdb,0xe0 }, { 0x32,0x56,0x64,0x32 }, - { 0x3a,0x4e,0x74,0x3a }, { 0x0a,0x1e,0x14,0x0a }, - { 0x49,0xdb,0x92,0x49 }, { 0x06,0x0a,0x0c,0x06 }, - { 0x24,0x6c,0x48,0x24 }, { 0x5c,0xe4,0xb8,0x5c }, - { 0xc2,0x5d,0x9f,0xc2 }, { 0xd3,0x6e,0xbd,0xd3 }, - { 0xac,0xef,0x43,0xac }, { 0x62,0xa6,0xc4,0x62 }, - { 0x91,0xa8,0x39,0x91 }, { 0x95,0xa4,0x31,0x95 }, - { 0xe4,0x37,0xd3,0xe4 }, { 0x79,0x8b,0xf2,0x79 }, - { 0xe7,0x32,0xd5,0xe7 }, { 0xc8,0x43,0x8b,0xc8 }, - { 0x37,0x59,0x6e,0x37 }, { 0x6d,0xb7,0xda,0x6d }, - { 0x8d,0x8c,0x01,0x8d }, { 0xd5,0x64,0xb1,0xd5 }, - { 0x4e,0xd2,0x9c,0x4e }, { 0xa9,0xe0,0x49,0xa9 }, - { 0x6c,0xb4,0xd8,0x6c }, { 0x56,0xfa,0xac,0x56 }, - { 0xf4,0x07,0xf3,0xf4 }, { 0xea,0x25,0xcf,0xea }, - { 0x65,0xaf,0xca,0x65 }, { 0x7a,0x8e,0xf4,0x7a }, - { 0xae,0xe9,0x47,0xae }, { 0x08,0x18,0x10,0x08 }, - { 0xba,0xd5,0x6f,0xba }, { 0x78,0x88,0xf0,0x78 }, - { 0x25,0x6f,0x4a,0x25 }, { 0x2e,0x72,0x5c,0x2e }, - { 0x1c,0x24,0x38,0x1c }, { 0xa6,0xf1,0x57,0xa6 }, - { 0xb4,0xc7,0x73,0xb4 }, { 0xc6,0x51,0x97,0xc6 }, - { 0xe8,0x23,0xcb,0xe8 }, { 0xdd,0x7c,0xa1,0xdd }, - { 0x74,0x9c,0xe8,0x74 }, { 0x1f,0x21,0x3e,0x1f }, - { 0x4b,0xdd,0x96,0x4b }, { 0xbd,0xdc,0x61,0xbd }, - { 0x8b,0x86,0x0d,0x8b }, { 0x8a,0x85,0x0f,0x8a }, - { 0x70,0x90,0xe0,0x70 }, { 0x3e,0x42,0x7c,0x3e }, - { 0xb5,0xc4,0x71,0xb5 }, { 0x66,0xaa,0xcc,0x66 }, - { 0x48,0xd8,0x90,0x48 }, { 0x03,0x05,0x06,0x03 }, - { 0xf6,0x01,0xf7,0xf6 }, { 0x0e,0x12,0x1c,0x0e }, - { 0x61,0xa3,0xc2,0x61 }, { 0x35,0x5f,0x6a,0x35 }, - { 0x57,0xf9,0xae,0x57 }, { 0xb9,0xd0,0x69,0xb9 }, - { 0x86,0x91,0x17,0x86 }, { 0xc1,0x58,0x99,0xc1 }, - { 0x1d,0x27,0x3a,0x1d }, { 0x9e,0xb9,0x27,0x9e }, - { 0xe1,0x38,0xd9,0xe1 }, { 0xf8,0x13,0xeb,0xf8 }, - { 0x98,0xb3,0x2b,0x98 }, { 0x11,0x33,0x22,0x11 }, - { 0x69,0xbb,0xd2,0x69 }, { 0xd9,0x70,0xa9,0xd9 }, - { 0x8e,0x89,0x07,0x8e }, { 0x94,0xa7,0x33,0x94 }, - { 0x9b,0xb6,0x2d,0x9b }, { 0x1e,0x22,0x3c,0x1e }, - { 0x87,0x92,0x15,0x87 }, { 0xe9,0x20,0xc9,0xe9 }, - { 0xce,0x49,0x87,0xce }, { 0x55,0xff,0xaa,0x55 }, - { 0x28,0x78,0x50,0x28 }, { 0xdf,0x7a,0xa5,0xdf }, - { 0x8c,0x8f,0x03,0x8c }, { 0xa1,0xf8,0x59,0xa1 }, - { 0x89,0x80,0x09,0x89 }, { 0x0d,0x17,0x1a,0x0d }, - { 0xbf,0xda,0x65,0xbf }, { 0xe6,0x31,0xd7,0xe6 }, - { 0x42,0xc6,0x84,0x42 }, { 0x68,0xb8,0xd0,0x68 }, - { 0x41,0xc3,0x82,0x41 }, { 0x99,0xb0,0x29,0x99 }, - { 0x2d,0x77,0x5a,0x2d }, { 0x0f,0x11,0x1e,0x0f }, - { 0xb0,0xcb,0x7b,0xb0 }, { 0x54,0xfc,0xa8,0x54 }, - { 0xbb,0xd6,0x6d,0xbb }, { 0x16,0x3a,0x2c,0x16 } +static const uint32_t crypto_fl_tab[4][256] = { + { + 0x00000063, 0x0000007c, 0x00000077, 0x0000007b, + 0x000000f2, 0x0000006b, 0x0000006f, 0x000000c5, + 0x00000030, 0x00000001, 0x00000067, 0x0000002b, + 0x000000fe, 0x000000d7, 0x000000ab, 0x00000076, + 0x000000ca, 0x00000082, 0x000000c9, 0x0000007d, + 0x000000fa, 0x00000059, 0x00000047, 0x000000f0, + 0x000000ad, 0x000000d4, 0x000000a2, 0x000000af, + 0x0000009c, 0x000000a4, 0x00000072, 0x000000c0, + 0x000000b7, 0x000000fd, 0x00000093, 0x00000026, + 0x00000036, 0x0000003f, 0x000000f7, 0x000000cc, + 0x00000034, 0x000000a5, 0x000000e5, 0x000000f1, + 0x00000071, 0x000000d8, 0x00000031, 0x00000015, + 0x00000004, 0x000000c7, 0x00000023, 0x000000c3, + 0x00000018, 0x00000096, 0x00000005, 0x0000009a, + 0x00000007, 0x00000012, 0x00000080, 0x000000e2, + 0x000000eb, 0x00000027, 0x000000b2, 0x00000075, + 0x00000009, 0x00000083, 0x0000002c, 0x0000001a, + 0x0000001b, 0x0000006e, 0x0000005a, 0x000000a0, + 0x00000052, 0x0000003b, 0x000000d6, 0x000000b3, + 0x00000029, 0x000000e3, 0x0000002f, 0x00000084, + 0x00000053, 0x000000d1, 0x00000000, 0x000000ed, + 0x00000020, 0x000000fc, 0x000000b1, 0x0000005b, + 0x0000006a, 0x000000cb, 0x000000be, 0x00000039, + 0x0000004a, 0x0000004c, 0x00000058, 0x000000cf, + 0x000000d0, 0x000000ef, 0x000000aa, 0x000000fb, + 0x00000043, 0x0000004d, 0x00000033, 0x00000085, + 0x00000045, 0x000000f9, 0x00000002, 0x0000007f, + 0x00000050, 0x0000003c, 0x0000009f, 0x000000a8, + 0x00000051, 0x000000a3, 0x00000040, 0x0000008f, + 0x00000092, 0x0000009d, 0x00000038, 0x000000f5, + 0x000000bc, 0x000000b6, 0x000000da, 0x00000021, + 0x00000010, 0x000000ff, 0x000000f3, 0x000000d2, + 0x000000cd, 0x0000000c, 0x00000013, 0x000000ec, + 0x0000005f, 0x00000097, 0x00000044, 0x00000017, + 0x000000c4, 0x000000a7, 0x0000007e, 0x0000003d, + 0x00000064, 0x0000005d, 0x00000019, 0x00000073, + 0x00000060, 0x00000081, 0x0000004f, 0x000000dc, + 0x00000022, 0x0000002a, 0x00000090, 0x00000088, + 0x00000046, 0x000000ee, 0x000000b8, 0x00000014, + 0x000000de, 0x0000005e, 0x0000000b, 0x000000db, + 0x000000e0, 0x00000032, 0x0000003a, 0x0000000a, + 0x00000049, 0x00000006, 0x00000024, 0x0000005c, + 0x000000c2, 0x000000d3, 0x000000ac, 0x00000062, + 0x00000091, 0x00000095, 0x000000e4, 0x00000079, + 0x000000e7, 0x000000c8, 0x00000037, 0x0000006d, + 0x0000008d, 0x000000d5, 0x0000004e, 0x000000a9, + 0x0000006c, 0x00000056, 0x000000f4, 0x000000ea, + 0x00000065, 0x0000007a, 0x000000ae, 0x00000008, + 0x000000ba, 0x00000078, 0x00000025, 0x0000002e, + 0x0000001c, 0x000000a6, 0x000000b4, 0x000000c6, + 0x000000e8, 0x000000dd, 0x00000074, 0x0000001f, + 0x0000004b, 0x000000bd, 0x0000008b, 0x0000008a, + 0x00000070, 0x0000003e, 0x000000b5, 0x00000066, + 0x00000048, 0x00000003, 0x000000f6, 0x0000000e, + 0x00000061, 0x00000035, 0x00000057, 0x000000b9, + 0x00000086, 0x000000c1, 0x0000001d, 0x0000009e, + 0x000000e1, 0x000000f8, 0x00000098, 0x00000011, + 0x00000069, 0x000000d9, 0x0000008e, 0x00000094, + 0x0000009b, 0x0000001e, 0x00000087, 0x000000e9, + 0x000000ce, 0x00000055, 0x00000028, 0x000000df, + 0x0000008c, 0x000000a1, 0x00000089, 0x0000000d, + 0x000000bf, 0x000000e6, 0x00000042, 0x00000068, + 0x00000041, 0x00000099, 0x0000002d, 0x0000000f, + 0x000000b0, 0x00000054, 0x000000bb, 0x00000016, + }, { + 0x00006300, 0x00007c00, 0x00007700, 0x00007b00, + 0x0000f200, 0x00006b00, 0x00006f00, 0x0000c500, + 0x00003000, 0x00000100, 0x00006700, 0x00002b00, + 0x0000fe00, 0x0000d700, 0x0000ab00, 0x00007600, + 0x0000ca00, 0x00008200, 0x0000c900, 0x00007d00, + 0x0000fa00, 0x00005900, 0x00004700, 0x0000f000, + 0x0000ad00, 0x0000d400, 0x0000a200, 0x0000af00, + 0x00009c00, 0x0000a400, 0x00007200, 0x0000c000, + 0x0000b700, 0x0000fd00, 0x00009300, 0x00002600, + 0x00003600, 0x00003f00, 0x0000f700, 0x0000cc00, + 0x00003400, 0x0000a500, 0x0000e500, 0x0000f100, + 0x00007100, 0x0000d800, 0x00003100, 0x00001500, + 0x00000400, 0x0000c700, 0x00002300, 0x0000c300, + 0x00001800, 0x00009600, 0x00000500, 0x00009a00, + 0x00000700, 0x00001200, 0x00008000, 0x0000e200, + 0x0000eb00, 0x00002700, 0x0000b200, 0x00007500, + 0x00000900, 0x00008300, 0x00002c00, 0x00001a00, + 0x00001b00, 0x00006e00, 0x00005a00, 0x0000a000, + 0x00005200, 0x00003b00, 0x0000d600, 0x0000b300, + 0x00002900, 0x0000e300, 0x00002f00, 0x00008400, + 0x00005300, 0x0000d100, 0x00000000, 0x0000ed00, + 0x00002000, 0x0000fc00, 0x0000b100, 0x00005b00, + 0x00006a00, 0x0000cb00, 0x0000be00, 0x00003900, + 0x00004a00, 0x00004c00, 0x00005800, 0x0000cf00, + 0x0000d000, 0x0000ef00, 0x0000aa00, 0x0000fb00, + 0x00004300, 0x00004d00, 0x00003300, 0x00008500, + 0x00004500, 0x0000f900, 0x00000200, 0x00007f00, + 0x00005000, 0x00003c00, 0x00009f00, 0x0000a800, + 0x00005100, 0x0000a300, 0x00004000, 0x00008f00, + 0x00009200, 0x00009d00, 0x00003800, 0x0000f500, + 0x0000bc00, 0x0000b600, 0x0000da00, 0x00002100, + 0x00001000, 0x0000ff00, 0x0000f300, 0x0000d200, + 0x0000cd00, 0x00000c00, 0x00001300, 0x0000ec00, + 0x00005f00, 0x00009700, 0x00004400, 0x00001700, + 0x0000c400, 0x0000a700, 0x00007e00, 0x00003d00, + 0x00006400, 0x00005d00, 0x00001900, 0x00007300, + 0x00006000, 0x00008100, 0x00004f00, 0x0000dc00, + 0x00002200, 0x00002a00, 0x00009000, 0x00008800, + 0x00004600, 0x0000ee00, 0x0000b800, 0x00001400, + 0x0000de00, 0x00005e00, 0x00000b00, 0x0000db00, + 0x0000e000, 0x00003200, 0x00003a00, 0x00000a00, + 0x00004900, 0x00000600, 0x00002400, 0x00005c00, + 0x0000c200, 0x0000d300, 0x0000ac00, 0x00006200, + 0x00009100, 0x00009500, 0x0000e400, 0x00007900, + 0x0000e700, 0x0000c800, 0x00003700, 0x00006d00, + 0x00008d00, 0x0000d500, 0x00004e00, 0x0000a900, + 0x00006c00, 0x00005600, 0x0000f400, 0x0000ea00, + 0x00006500, 0x00007a00, 0x0000ae00, 0x00000800, + 0x0000ba00, 0x00007800, 0x00002500, 0x00002e00, + 0x00001c00, 0x0000a600, 0x0000b400, 0x0000c600, + 0x0000e800, 0x0000dd00, 0x00007400, 0x00001f00, + 0x00004b00, 0x0000bd00, 0x00008b00, 0x00008a00, + 0x00007000, 0x00003e00, 0x0000b500, 0x00006600, + 0x00004800, 0x00000300, 0x0000f600, 0x00000e00, + 0x00006100, 0x00003500, 0x00005700, 0x0000b900, + 0x00008600, 0x0000c100, 0x00001d00, 0x00009e00, + 0x0000e100, 0x0000f800, 0x00009800, 0x00001100, + 0x00006900, 0x0000d900, 0x00008e00, 0x00009400, + 0x00009b00, 0x00001e00, 0x00008700, 0x0000e900, + 0x0000ce00, 0x00005500, 0x00002800, 0x0000df00, + 0x00008c00, 0x0000a100, 0x00008900, 0x00000d00, + 0x0000bf00, 0x0000e600, 0x00004200, 0x00006800, + 0x00004100, 0x00009900, 0x00002d00, 0x00000f00, + 0x0000b000, 0x00005400, 0x0000bb00, 0x00001600, + }, { + 0x00630000, 0x007c0000, 0x00770000, 0x007b0000, + 0x00f20000, 0x006b0000, 0x006f0000, 0x00c50000, + 0x00300000, 0x00010000, 0x00670000, 0x002b0000, + 0x00fe0000, 0x00d70000, 0x00ab0000, 0x00760000, + 0x00ca0000, 0x00820000, 0x00c90000, 0x007d0000, + 0x00fa0000, 0x00590000, 0x00470000, 0x00f00000, + 0x00ad0000, 0x00d40000, 0x00a20000, 0x00af0000, + 0x009c0000, 0x00a40000, 0x00720000, 0x00c00000, + 0x00b70000, 0x00fd0000, 0x00930000, 0x00260000, + 0x00360000, 0x003f0000, 0x00f70000, 0x00cc0000, + 0x00340000, 0x00a50000, 0x00e50000, 0x00f10000, + 0x00710000, 0x00d80000, 0x00310000, 0x00150000, + 0x00040000, 0x00c70000, 0x00230000, 0x00c30000, + 0x00180000, 0x00960000, 0x00050000, 0x009a0000, + 0x00070000, 0x00120000, 0x00800000, 0x00e20000, + 0x00eb0000, 0x00270000, 0x00b20000, 0x00750000, + 0x00090000, 0x00830000, 0x002c0000, 0x001a0000, + 0x001b0000, 0x006e0000, 0x005a0000, 0x00a00000, + 0x00520000, 0x003b0000, 0x00d60000, 0x00b30000, + 0x00290000, 0x00e30000, 0x002f0000, 0x00840000, + 0x00530000, 0x00d10000, 0x00000000, 0x00ed0000, + 0x00200000, 0x00fc0000, 0x00b10000, 0x005b0000, + 0x006a0000, 0x00cb0000, 0x00be0000, 0x00390000, + 0x004a0000, 0x004c0000, 0x00580000, 0x00cf0000, + 0x00d00000, 0x00ef0000, 0x00aa0000, 0x00fb0000, + 0x00430000, 0x004d0000, 0x00330000, 0x00850000, + 0x00450000, 0x00f90000, 0x00020000, 0x007f0000, + 0x00500000, 0x003c0000, 0x009f0000, 0x00a80000, + 0x00510000, 0x00a30000, 0x00400000, 0x008f0000, + 0x00920000, 0x009d0000, 0x00380000, 0x00f50000, + 0x00bc0000, 0x00b60000, 0x00da0000, 0x00210000, + 0x00100000, 0x00ff0000, 0x00f30000, 0x00d20000, + 0x00cd0000, 0x000c0000, 0x00130000, 0x00ec0000, + 0x005f0000, 0x00970000, 0x00440000, 0x00170000, + 0x00c40000, 0x00a70000, 0x007e0000, 0x003d0000, + 0x00640000, 0x005d0000, 0x00190000, 0x00730000, + 0x00600000, 0x00810000, 0x004f0000, 0x00dc0000, + 0x00220000, 0x002a0000, 0x00900000, 0x00880000, + 0x00460000, 0x00ee0000, 0x00b80000, 0x00140000, + 0x00de0000, 0x005e0000, 0x000b0000, 0x00db0000, + 0x00e00000, 0x00320000, 0x003a0000, 0x000a0000, + 0x00490000, 0x00060000, 0x00240000, 0x005c0000, + 0x00c20000, 0x00d30000, 0x00ac0000, 0x00620000, + 0x00910000, 0x00950000, 0x00e40000, 0x00790000, + 0x00e70000, 0x00c80000, 0x00370000, 0x006d0000, + 0x008d0000, 0x00d50000, 0x004e0000, 0x00a90000, + 0x006c0000, 0x00560000, 0x00f40000, 0x00ea0000, + 0x00650000, 0x007a0000, 0x00ae0000, 0x00080000, + 0x00ba0000, 0x00780000, 0x00250000, 0x002e0000, + 0x001c0000, 0x00a60000, 0x00b40000, 0x00c60000, + 0x00e80000, 0x00dd0000, 0x00740000, 0x001f0000, + 0x004b0000, 0x00bd0000, 0x008b0000, 0x008a0000, + 0x00700000, 0x003e0000, 0x00b50000, 0x00660000, + 0x00480000, 0x00030000, 0x00f60000, 0x000e0000, + 0x00610000, 0x00350000, 0x00570000, 0x00b90000, + 0x00860000, 0x00c10000, 0x001d0000, 0x009e0000, + 0x00e10000, 0x00f80000, 0x00980000, 0x00110000, + 0x00690000, 0x00d90000, 0x008e0000, 0x00940000, + 0x009b0000, 0x001e0000, 0x00870000, 0x00e90000, + 0x00ce0000, 0x00550000, 0x00280000, 0x00df0000, + 0x008c0000, 0x00a10000, 0x00890000, 0x000d0000, + 0x00bf0000, 0x00e60000, 0x00420000, 0x00680000, + 0x00410000, 0x00990000, 0x002d0000, 0x000f0000, + 0x00b00000, 0x00540000, 0x00bb0000, 0x00160000, + }, { + 0x63000000, 0x7c000000, 0x77000000, 0x7b000000, + 0xf2000000, 0x6b000000, 0x6f000000, 0xc5000000, + 0x30000000, 0x01000000, 0x67000000, 0x2b000000, + 0xfe000000, 0xd7000000, 0xab000000, 0x76000000, + 0xca000000, 0x82000000, 0xc9000000, 0x7d000000, + 0xfa000000, 0x59000000, 0x47000000, 0xf0000000, + 0xad000000, 0xd4000000, 0xa2000000, 0xaf000000, + 0x9c000000, 0xa4000000, 0x72000000, 0xc0000000, + 0xb7000000, 0xfd000000, 0x93000000, 0x26000000, + 0x36000000, 0x3f000000, 0xf7000000, 0xcc000000, + 0x34000000, 0xa5000000, 0xe5000000, 0xf1000000, + 0x71000000, 0xd8000000, 0x31000000, 0x15000000, + 0x04000000, 0xc7000000, 0x23000000, 0xc3000000, + 0x18000000, 0x96000000, 0x05000000, 0x9a000000, + 0x07000000, 0x12000000, 0x80000000, 0xe2000000, + 0xeb000000, 0x27000000, 0xb2000000, 0x75000000, + 0x09000000, 0x83000000, 0x2c000000, 0x1a000000, + 0x1b000000, 0x6e000000, 0x5a000000, 0xa0000000, + 0x52000000, 0x3b000000, 0xd6000000, 0xb3000000, + 0x29000000, 0xe3000000, 0x2f000000, 0x84000000, + 0x53000000, 0xd1000000, 0x00000000, 0xed000000, + 0x20000000, 0xfc000000, 0xb1000000, 0x5b000000, + 0x6a000000, 0xcb000000, 0xbe000000, 0x39000000, + 0x4a000000, 0x4c000000, 0x58000000, 0xcf000000, + 0xd0000000, 0xef000000, 0xaa000000, 0xfb000000, + 0x43000000, 0x4d000000, 0x33000000, 0x85000000, + 0x45000000, 0xf9000000, 0x02000000, 0x7f000000, + 0x50000000, 0x3c000000, 0x9f000000, 0xa8000000, + 0x51000000, 0xa3000000, 0x40000000, 0x8f000000, + 0x92000000, 0x9d000000, 0x38000000, 0xf5000000, + 0xbc000000, 0xb6000000, 0xda000000, 0x21000000, + 0x10000000, 0xff000000, 0xf3000000, 0xd2000000, + 0xcd000000, 0x0c000000, 0x13000000, 0xec000000, + 0x5f000000, 0x97000000, 0x44000000, 0x17000000, + 0xc4000000, 0xa7000000, 0x7e000000, 0x3d000000, + 0x64000000, 0x5d000000, 0x19000000, 0x73000000, + 0x60000000, 0x81000000, 0x4f000000, 0xdc000000, + 0x22000000, 0x2a000000, 0x90000000, 0x88000000, + 0x46000000, 0xee000000, 0xb8000000, 0x14000000, + 0xde000000, 0x5e000000, 0x0b000000, 0xdb000000, + 0xe0000000, 0x32000000, 0x3a000000, 0x0a000000, + 0x49000000, 0x06000000, 0x24000000, 0x5c000000, + 0xc2000000, 0xd3000000, 0xac000000, 0x62000000, + 0x91000000, 0x95000000, 0xe4000000, 0x79000000, + 0xe7000000, 0xc8000000, 0x37000000, 0x6d000000, + 0x8d000000, 0xd5000000, 0x4e000000, 0xa9000000, + 0x6c000000, 0x56000000, 0xf4000000, 0xea000000, + 0x65000000, 0x7a000000, 0xae000000, 0x08000000, + 0xba000000, 0x78000000, 0x25000000, 0x2e000000, + 0x1c000000, 0xa6000000, 0xb4000000, 0xc6000000, + 0xe8000000, 0xdd000000, 0x74000000, 0x1f000000, + 0x4b000000, 0xbd000000, 0x8b000000, 0x8a000000, + 0x70000000, 0x3e000000, 0xb5000000, 0x66000000, + 0x48000000, 0x03000000, 0xf6000000, 0x0e000000, + 0x61000000, 0x35000000, 0x57000000, 0xb9000000, + 0x86000000, 0xc1000000, 0x1d000000, 0x9e000000, + 0xe1000000, 0xf8000000, 0x98000000, 0x11000000, + 0x69000000, 0xd9000000, 0x8e000000, 0x94000000, + 0x9b000000, 0x1e000000, 0x87000000, 0xe9000000, + 0xce000000, 0x55000000, 0x28000000, 0xdf000000, + 0x8c000000, 0xa1000000, 0x89000000, 0x0d000000, + 0xbf000000, 0xe6000000, 0x42000000, 0x68000000, + 0x41000000, 0x99000000, 0x2d000000, 0x0f000000, + 0xb0000000, 0x54000000, 0xbb000000, 0x16000000, + } }; -static const byte T4[256][4] = -{ - { 0x63,0x63,0xa5,0xc6 }, { 0x7c,0x7c,0x84,0xf8 }, - { 0x77,0x77,0x99,0xee }, { 0x7b,0x7b,0x8d,0xf6 }, - { 0xf2,0xf2,0x0d,0xff }, { 0x6b,0x6b,0xbd,0xd6 }, - { 0x6f,0x6f,0xb1,0xde }, { 0xc5,0xc5,0x54,0x91 }, - { 0x30,0x30,0x50,0x60 }, { 0x01,0x01,0x03,0x02 }, - { 0x67,0x67,0xa9,0xce }, { 0x2b,0x2b,0x7d,0x56 }, - { 0xfe,0xfe,0x19,0xe7 }, { 0xd7,0xd7,0x62,0xb5 }, - { 0xab,0xab,0xe6,0x4d }, { 0x76,0x76,0x9a,0xec }, - { 0xca,0xca,0x45,0x8f }, { 0x82,0x82,0x9d,0x1f }, - { 0xc9,0xc9,0x40,0x89 }, { 0x7d,0x7d,0x87,0xfa }, - { 0xfa,0xfa,0x15,0xef }, { 0x59,0x59,0xeb,0xb2 }, - { 0x47,0x47,0xc9,0x8e }, { 0xf0,0xf0,0x0b,0xfb }, - { 0xad,0xad,0xec,0x41 }, { 0xd4,0xd4,0x67,0xb3 }, - { 0xa2,0xa2,0xfd,0x5f }, { 0xaf,0xaf,0xea,0x45 }, - { 0x9c,0x9c,0xbf,0x23 }, { 0xa4,0xa4,0xf7,0x53 }, - { 0x72,0x72,0x96,0xe4 }, { 0xc0,0xc0,0x5b,0x9b }, - { 0xb7,0xb7,0xc2,0x75 }, { 0xfd,0xfd,0x1c,0xe1 }, - { 0x93,0x93,0xae,0x3d }, { 0x26,0x26,0x6a,0x4c }, - { 0x36,0x36,0x5a,0x6c }, { 0x3f,0x3f,0x41,0x7e }, - { 0xf7,0xf7,0x02,0xf5 }, { 0xcc,0xcc,0x4f,0x83 }, - { 0x34,0x34,0x5c,0x68 }, { 0xa5,0xa5,0xf4,0x51 }, - { 0xe5,0xe5,0x34,0xd1 }, { 0xf1,0xf1,0x08,0xf9 }, - { 0x71,0x71,0x93,0xe2 }, { 0xd8,0xd8,0x73,0xab }, - { 0x31,0x31,0x53,0x62 }, { 0x15,0x15,0x3f,0x2a }, - { 0x04,0x04,0x0c,0x08 }, { 0xc7,0xc7,0x52,0x95 }, - { 0x23,0x23,0x65,0x46 }, { 0xc3,0xc3,0x5e,0x9d }, - { 0x18,0x18,0x28,0x30 }, { 0x96,0x96,0xa1,0x37 }, - { 0x05,0x05,0x0f,0x0a }, { 0x9a,0x9a,0xb5,0x2f }, - { 0x07,0x07,0x09,0x0e }, { 0x12,0x12,0x36,0x24 }, - { 0x80,0x80,0x9b,0x1b }, { 0xe2,0xe2,0x3d,0xdf }, - { 0xeb,0xeb,0x26,0xcd }, { 0x27,0x27,0x69,0x4e }, - { 0xb2,0xb2,0xcd,0x7f }, { 0x75,0x75,0x9f,0xea }, - { 0x09,0x09,0x1b,0x12 }, { 0x83,0x83,0x9e,0x1d }, - { 0x2c,0x2c,0x74,0x58 }, { 0x1a,0x1a,0x2e,0x34 }, - { 0x1b,0x1b,0x2d,0x36 }, { 0x6e,0x6e,0xb2,0xdc }, - { 0x5a,0x5a,0xee,0xb4 }, { 0xa0,0xa0,0xfb,0x5b }, - { 0x52,0x52,0xf6,0xa4 }, { 0x3b,0x3b,0x4d,0x76 }, - { 0xd6,0xd6,0x61,0xb7 }, { 0xb3,0xb3,0xce,0x7d }, - { 0x29,0x29,0x7b,0x52 }, { 0xe3,0xe3,0x3e,0xdd }, - { 0x2f,0x2f,0x71,0x5e }, { 0x84,0x84,0x97,0x13 }, - { 0x53,0x53,0xf5,0xa6 }, { 0xd1,0xd1,0x68,0xb9 }, - { 0x00,0x00,0x00,0x00 }, { 0xed,0xed,0x2c,0xc1 }, - { 0x20,0x20,0x60,0x40 }, { 0xfc,0xfc,0x1f,0xe3 }, - { 0xb1,0xb1,0xc8,0x79 }, { 0x5b,0x5b,0xed,0xb6 }, - { 0x6a,0x6a,0xbe,0xd4 }, { 0xcb,0xcb,0x46,0x8d }, - { 0xbe,0xbe,0xd9,0x67 }, { 0x39,0x39,0x4b,0x72 }, - { 0x4a,0x4a,0xde,0x94 }, { 0x4c,0x4c,0xd4,0x98 }, - { 0x58,0x58,0xe8,0xb0 }, { 0xcf,0xcf,0x4a,0x85 }, - { 0xd0,0xd0,0x6b,0xbb }, { 0xef,0xef,0x2a,0xc5 }, - { 0xaa,0xaa,0xe5,0x4f }, { 0xfb,0xfb,0x16,0xed }, - { 0x43,0x43,0xc5,0x86 }, { 0x4d,0x4d,0xd7,0x9a }, - { 0x33,0x33,0x55,0x66 }, { 0x85,0x85,0x94,0x11 }, - { 0x45,0x45,0xcf,0x8a }, { 0xf9,0xf9,0x10,0xe9 }, - { 0x02,0x02,0x06,0x04 }, { 0x7f,0x7f,0x81,0xfe }, - { 0x50,0x50,0xf0,0xa0 }, { 0x3c,0x3c,0x44,0x78 }, - { 0x9f,0x9f,0xba,0x25 }, { 0xa8,0xa8,0xe3,0x4b }, - { 0x51,0x51,0xf3,0xa2 }, { 0xa3,0xa3,0xfe,0x5d }, - { 0x40,0x40,0xc0,0x80 }, { 0x8f,0x8f,0x8a,0x05 }, - { 0x92,0x92,0xad,0x3f }, { 0x9d,0x9d,0xbc,0x21 }, - { 0x38,0x38,0x48,0x70 }, { 0xf5,0xf5,0x04,0xf1 }, - { 0xbc,0xbc,0xdf,0x63 }, { 0xb6,0xb6,0xc1,0x77 }, - { 0xda,0xda,0x75,0xaf }, { 0x21,0x21,0x63,0x42 }, - { 0x10,0x10,0x30,0x20 }, { 0xff,0xff,0x1a,0xe5 }, - { 0xf3,0xf3,0x0e,0xfd }, { 0xd2,0xd2,0x6d,0xbf }, - { 0xcd,0xcd,0x4c,0x81 }, { 0x0c,0x0c,0x14,0x18 }, - { 0x13,0x13,0x35,0x26 }, { 0xec,0xec,0x2f,0xc3 }, - { 0x5f,0x5f,0xe1,0xbe }, { 0x97,0x97,0xa2,0x35 }, - { 0x44,0x44,0xcc,0x88 }, { 0x17,0x17,0x39,0x2e }, - { 0xc4,0xc4,0x57,0x93 }, { 0xa7,0xa7,0xf2,0x55 }, - { 0x7e,0x7e,0x82,0xfc }, { 0x3d,0x3d,0x47,0x7a }, - { 0x64,0x64,0xac,0xc8 }, { 0x5d,0x5d,0xe7,0xba }, - { 0x19,0x19,0x2b,0x32 }, { 0x73,0x73,0x95,0xe6 }, - { 0x60,0x60,0xa0,0xc0 }, { 0x81,0x81,0x98,0x19 }, - { 0x4f,0x4f,0xd1,0x9e }, { 0xdc,0xdc,0x7f,0xa3 }, - { 0x22,0x22,0x66,0x44 }, { 0x2a,0x2a,0x7e,0x54 }, - { 0x90,0x90,0xab,0x3b }, { 0x88,0x88,0x83,0x0b }, - { 0x46,0x46,0xca,0x8c }, { 0xee,0xee,0x29,0xc7 }, - { 0xb8,0xb8,0xd3,0x6b }, { 0x14,0x14,0x3c,0x28 }, - { 0xde,0xde,0x79,0xa7 }, { 0x5e,0x5e,0xe2,0xbc }, - { 0x0b,0x0b,0x1d,0x16 }, { 0xdb,0xdb,0x76,0xad }, - { 0xe0,0xe0,0x3b,0xdb }, { 0x32,0x32,0x56,0x64 }, - { 0x3a,0x3a,0x4e,0x74 }, { 0x0a,0x0a,0x1e,0x14 }, - { 0x49,0x49,0xdb,0x92 }, { 0x06,0x06,0x0a,0x0c }, - { 0x24,0x24,0x6c,0x48 }, { 0x5c,0x5c,0xe4,0xb8 }, - { 0xc2,0xc2,0x5d,0x9f }, { 0xd3,0xd3,0x6e,0xbd }, - { 0xac,0xac,0xef,0x43 }, { 0x62,0x62,0xa6,0xc4 }, - { 0x91,0x91,0xa8,0x39 }, { 0x95,0x95,0xa4,0x31 }, - { 0xe4,0xe4,0x37,0xd3 }, { 0x79,0x79,0x8b,0xf2 }, - { 0xe7,0xe7,0x32,0xd5 }, { 0xc8,0xc8,0x43,0x8b }, - { 0x37,0x37,0x59,0x6e }, { 0x6d,0x6d,0xb7,0xda }, - { 0x8d,0x8d,0x8c,0x01 }, { 0xd5,0xd5,0x64,0xb1 }, - { 0x4e,0x4e,0xd2,0x9c }, { 0xa9,0xa9,0xe0,0x49 }, - { 0x6c,0x6c,0xb4,0xd8 }, { 0x56,0x56,0xfa,0xac }, - { 0xf4,0xf4,0x07,0xf3 }, { 0xea,0xea,0x25,0xcf }, - { 0x65,0x65,0xaf,0xca }, { 0x7a,0x7a,0x8e,0xf4 }, - { 0xae,0xae,0xe9,0x47 }, { 0x08,0x08,0x18,0x10 }, - { 0xba,0xba,0xd5,0x6f }, { 0x78,0x78,0x88,0xf0 }, - { 0x25,0x25,0x6f,0x4a }, { 0x2e,0x2e,0x72,0x5c }, - { 0x1c,0x1c,0x24,0x38 }, { 0xa6,0xa6,0xf1,0x57 }, - { 0xb4,0xb4,0xc7,0x73 }, { 0xc6,0xc6,0x51,0x97 }, - { 0xe8,0xe8,0x23,0xcb }, { 0xdd,0xdd,0x7c,0xa1 }, - { 0x74,0x74,0x9c,0xe8 }, { 0x1f,0x1f,0x21,0x3e }, - { 0x4b,0x4b,0xdd,0x96 }, { 0xbd,0xbd,0xdc,0x61 }, - { 0x8b,0x8b,0x86,0x0d }, { 0x8a,0x8a,0x85,0x0f }, - { 0x70,0x70,0x90,0xe0 }, { 0x3e,0x3e,0x42,0x7c }, - { 0xb5,0xb5,0xc4,0x71 }, { 0x66,0x66,0xaa,0xcc }, - { 0x48,0x48,0xd8,0x90 }, { 0x03,0x03,0x05,0x06 }, - { 0xf6,0xf6,0x01,0xf7 }, { 0x0e,0x0e,0x12,0x1c }, - { 0x61,0x61,0xa3,0xc2 }, { 0x35,0x35,0x5f,0x6a }, - { 0x57,0x57,0xf9,0xae }, { 0xb9,0xb9,0xd0,0x69 }, - { 0x86,0x86,0x91,0x17 }, { 0xc1,0xc1,0x58,0x99 }, - { 0x1d,0x1d,0x27,0x3a }, { 0x9e,0x9e,0xb9,0x27 }, - { 0xe1,0xe1,0x38,0xd9 }, { 0xf8,0xf8,0x13,0xeb }, - { 0x98,0x98,0xb3,0x2b }, { 0x11,0x11,0x33,0x22 }, - { 0x69,0x69,0xbb,0xd2 }, { 0xd9,0xd9,0x70,0xa9 }, - { 0x8e,0x8e,0x89,0x07 }, { 0x94,0x94,0xa7,0x33 }, - { 0x9b,0x9b,0xb6,0x2d }, { 0x1e,0x1e,0x22,0x3c }, - { 0x87,0x87,0x92,0x15 }, { 0xe9,0xe9,0x20,0xc9 }, - { 0xce,0xce,0x49,0x87 }, { 0x55,0x55,0xff,0xaa }, - { 0x28,0x28,0x78,0x50 }, { 0xdf,0xdf,0x7a,0xa5 }, - { 0x8c,0x8c,0x8f,0x03 }, { 0xa1,0xa1,0xf8,0x59 }, - { 0x89,0x89,0x80,0x09 }, { 0x0d,0x0d,0x17,0x1a }, - { 0xbf,0xbf,0xda,0x65 }, { 0xe6,0xe6,0x31,0xd7 }, - { 0x42,0x42,0xc6,0x84 }, { 0x68,0x68,0xb8,0xd0 }, - { 0x41,0x41,0xc3,0x82 }, { 0x99,0x99,0xb0,0x29 }, - { 0x2d,0x2d,0x77,0x5a }, { 0x0f,0x0f,0x11,0x1e }, - { 0xb0,0xb0,0xcb,0x7b }, { 0x54,0x54,0xfc,0xa8 }, - { 0xbb,0xbb,0xd6,0x6d }, { 0x16,0x16,0x3a,0x2c } -}; +/* initialise the key schedule from the user supplied key */ -static const uint32_t rcon[30] = +static uint32_t aes_ror32(uint32_t word, unsigned int shift) { - 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0x1b, 0x36, 0x6c, - 0xd8, 0xab, 0x4d, 0x9a, 0x2f, 0x5e, 0xbc, 0x63, 0xc6, 0x97, 0x35, - 0x6a, 0xd4, 0xb3, 0x7d, 0xfa, 0xef, 0xc5, 0x91 -}; - -static char *AES_SelfTest(void); + return (word >> shift) | (word << (32 - shift)); +} -/* Perform the key setup. +#define cpu_to_le32(x) SDL_SwapLE32(x) +#define le32_to_cpu(x) SDL_SwapLE32(x) + +#define star_x(x) (((x) & 0x7f7f7f7f) << 1) ^ ((((x) & 0x80808080) >> 7) * 0x1b) + +#define imix_col(y, x) do { \ + u = star_x(x); \ + v = star_x(u); \ + w = star_x(v); \ + t = w ^ (x); \ + (y) = u ^ v ^ w; \ + (y) ^= aes_ror32(u ^ t, 8) ^ \ + aes_ror32(v ^ t, 16) ^ \ + aes_ror32(t, 24); \ +} while (0) + +#define ls_box(x) \ + crypto_fl_tab[0][get_byte(x, 0)] ^ \ + crypto_fl_tab[1][get_byte(x, 1)] ^ \ + crypto_fl_tab[2][get_byte(x, 2)] ^ \ + crypto_fl_tab[3][get_byte(x, 3)] + +#define loop4(i) do { \ + t = aes_ror32(t, 8); \ + t = ls_box(t) ^ rco_tab[i]; \ + t ^= ctx->key_enc[4 * i]; \ + ctx->key_enc[4 * i + 4] = t; \ + t ^= ctx->key_enc[4 * i + 1]; \ + ctx->key_enc[4 * i + 5] = t; \ + t ^= ctx->key_enc[4 * i + 2]; \ + ctx->key_enc[4 * i + 6] = t; \ + t ^= ctx->key_enc[4 * i + 3]; \ + ctx->key_enc[4 * i + 7] = t; \ +} while (0) + +#define loop6(i) do { \ + t = aes_ror32(t, 8); \ + t = ls_box(t) ^ rco_tab[i]; \ + t ^= ctx->key_enc[6 * i]; \ + ctx->key_enc[6 * i + 6] = t; \ + t ^= ctx->key_enc[6 * i + 1]; \ + ctx->key_enc[6 * i + 7] = t; \ + t ^= ctx->key_enc[6 * i + 2]; \ + ctx->key_enc[6 * i + 8] = t; \ + t ^= ctx->key_enc[6 * i + 3]; \ + ctx->key_enc[6 * i + 9] = t; \ + t ^= ctx->key_enc[6 * i + 4]; \ + ctx->key_enc[6 * i + 10] = t; \ + t ^= ctx->key_enc[6 * i + 5]; \ + ctx->key_enc[6 * i + 11] = t; \ +} while (0) + +#define loop8tophalf(i) do { \ + t = aes_ror32(t, 8); \ + t = ls_box(t) ^ rco_tab[i]; \ + t ^= ctx->key_enc[8 * i]; \ + ctx->key_enc[8 * i + 8] = t; \ + t ^= ctx->key_enc[8 * i + 1]; \ + ctx->key_enc[8 * i + 9] = t; \ + t ^= ctx->key_enc[8 * i + 2]; \ + ctx->key_enc[8 * i + 10] = t; \ + t ^= ctx->key_enc[8 * i + 3]; \ + ctx->key_enc[8 * i + 11] = t; \ +} while (0) + +#define loop8(i) do { \ + loop8tophalf(i); \ + t = ctx->key_enc[8 * i + 4] ^ ls_box(t); \ + ctx->key_enc[8 * i + 12] = t; \ + t ^= ctx->key_enc[8 * i + 5]; \ + ctx->key_enc[8 * i + 13] = t; \ + t ^= ctx->key_enc[8 * i + 6]; \ + ctx->key_enc[8 * i + 14] = t; \ + t ^= ctx->key_enc[8 * i + 7]; \ + ctx->key_enc[8 * i + 15] = t; \ +} while (0) + +/** + * AES_ExpandKey - Expands the AES key as described in FIPS-197 + * @ctx: The location where the computed key will be stored. + * @in_key: The supplied key. + * @key_len: The length of the supplied key. + * + * Returns 0 on success. The function fails only if an invalid key size (or + * pointer) is supplied. + * The expanded key size is 240 bytes (max of 14 rounds with a unique 16 bytes + * key schedule plus a 16 bytes key which is used before the first round). + * The decryption key is prepared for the "Equivalent Inverse Cipher" as + * described in FIPS-197. The first slot (16 bytes) of each key (enc or dec) is + * for the initial combination, the second slot for the first round and so on. */ -static boolean AES_SetKey(RIJNDAEL_context *ctx, const byte *key, - const unsigned keylen) +static int AES_ExpandKey(aes_context_t *ctx, const uint8_t *in_key, + unsigned int key_len) { - int ROUNDS; - byte k[MAXKC][4]; - int i,j, r, t, rconpointer = 0; - byte tk[MAXKC][4]; - int KC; - - if( keylen == 128/8 ) - { - ROUNDS = 10; - KC = 4; - } - else if ( keylen == 192/8 ) - { - ROUNDS = 12; - KC = 6; - } - else if ( keylen == 256/8 ) - { - ROUNDS = 14; - KC = 8; - } - else - { - return false; - } - - ctx->ROUNDS = ROUNDS; - - for (i = 0; i < keylen; i++) - { - k[i >> 2][i & 3] = key[i]; + const uint32_t *key = (const uint32_t *)in_key; + uint32_t i, t, u, v, w, j; + + if (key_len != AES_KEYSIZE_128 && key_len != AES_KEYSIZE_192 && + key_len != AES_KEYSIZE_256) + return -1; + + ctx->key_length = key_len; + + ctx->key_dec[key_len + 24] = ctx->key_enc[0] = le32_to_cpu(key[0]); + ctx->key_dec[key_len + 25] = ctx->key_enc[1] = le32_to_cpu(key[1]); + ctx->key_dec[key_len + 26] = ctx->key_enc[2] = le32_to_cpu(key[2]); + ctx->key_dec[key_len + 27] = ctx->key_enc[3] = le32_to_cpu(key[3]); + + switch (key_len) { + case AES_KEYSIZE_128: + t = ctx->key_enc[3]; + for (i = 0; i < 10; ++i) + loop4(i); + break; + + case AES_KEYSIZE_192: + ctx->key_enc[4] = le32_to_cpu(key[4]); + t = ctx->key_enc[5] = le32_to_cpu(key[5]); + for (i = 0; i < 8; ++i) + loop6(i); + break; + + case AES_KEYSIZE_256: + ctx->key_enc[4] = le32_to_cpu(key[4]); + ctx->key_enc[5] = le32_to_cpu(key[5]); + ctx->key_enc[6] = le32_to_cpu(key[6]); + t = ctx->key_enc[7] = le32_to_cpu(key[7]); + for (i = 0; i < 6; ++i) + loop8(i); + loop8tophalf(i); + break; } -#define W (ctx->keySched) - for (j = KC-1; j >= 0; j--) - { - *((uint32_t*)tk[j]) = *((uint32_t*)k[j]); - } - r = 0; - t = 0; - /* copy values into round key array */ - for (j = 0; (j < KC) && (r < ROUNDS + 1); ) - { - for (; (j < KC) && (t < 4); j++, t++) - { - W[r][t] = *((uint32_t*)tk[j]); - } - if (t == 4) - { - r++; - t = 0; - } - } - - while (r < ROUNDS + 1) - { - /* while not enough round key material calculated */ - /* calculate new values */ - tk[0][0] ^= S[tk[KC-1][1]]; - tk[0][1] ^= S[tk[KC-1][2]]; - tk[0][2] ^= S[tk[KC-1][3]]; - tk[0][3] ^= S[tk[KC-1][0]]; - tk[0][0] ^= rcon[rconpointer++]; + ctx->key_dec[0] = ctx->key_enc[key_len + 24]; + ctx->key_dec[1] = ctx->key_enc[key_len + 25]; + ctx->key_dec[2] = ctx->key_enc[key_len + 26]; + ctx->key_dec[3] = ctx->key_enc[key_len + 27]; - if (KC != 8) - { - for (j = 1; j < KC; j++) - { - *((uint32_t*)tk[j]) ^= *((uint32_t*)tk[j-1]); - } - } - else - { - for (j = 1; j < KC/2; j++) - { - *((uint32_t*)tk[j]) ^= *((uint32_t*)tk[j-1]); - } - tk[KC/2][0] ^= S[tk[KC/2 - 1][0]]; - tk[KC/2][1] ^= S[tk[KC/2 - 1][1]]; - tk[KC/2][2] ^= S[tk[KC/2 - 1][2]]; - tk[KC/2][3] ^= S[tk[KC/2 - 1][3]]; - for (j = KC/2 + 1; j < KC; j++) - { - *((uint32_t*)tk[j]) ^= *((uint32_t*)tk[j-1]); - } - } - /* copy values into round key array */ - for (j = 0; (j < KC) && (r < ROUNDS + 1); ) - { - for (; (j < KC) && (t < 4); j++, t++) - { - W[r][t] = *((uint32_t*)tk[j]); - } - if (t == 4) - { - r++; - t = 0; - } - } + for (i = 4; i < key_len + 24; ++i) { + j = key_len + 24 - (i & ~3) + (i & 3); + imix_col(ctx->key_dec[j], ctx->key_enc[i]); } - -#undef W - return true; + return 0; } -/* Encrypt one block. A and B need to be aligned on a 4 byte - boundary. A and B may be the same. */ -static void AES_EncryptAligned(const RIJNDAEL_context *ctx, - byte *b, const byte *a) +/** + * AES_SetKey - Set the AES key. + * @ctx: AES context struct. + * @in_key: The input key. + * @key_len: The size of the key. + * + * Returns 0 on success, on failure -1 is returned. + * The function uses AES_ExpandKey() to expand the key. + */ +static int AES_SetKey(aes_context_t *ctx, const uint8_t *in_key, + unsigned int key_len) { -#define rk (ctx->keySched) - int ROUNDS = ctx->ROUNDS; - int r; - union - { - uint32_t u32; - byte b[4]; - } temp[4]; - - temp[0].u32 = *((uint32_t*)(a )) ^ rk[0][0]; - temp[1].u32 = *((uint32_t*)(a+ 4)) ^ rk[0][1]; - temp[2].u32 = *((uint32_t*)(a+ 8)) ^ rk[0][2]; - temp[3].u32 = *((uint32_t*)(a+12)) ^ rk[0][3]; - *((uint32_t*)(b )) = (*((uint32_t*)T1[temp[0].b[0]]) - ^ *((uint32_t*)T2[temp[1].b[1]]) - ^ *((uint32_t*)T3[temp[2].b[2]]) - ^ *((uint32_t*)T4[temp[3].b[3]])); - *((uint32_t*)(b + 4)) = (*((uint32_t*)T1[temp[1].b[0]]) - ^ *((uint32_t*)T2[temp[2].b[1]]) - ^ *((uint32_t*)T3[temp[3].b[2]]) - ^ *((uint32_t*)T4[temp[0].b[3]])); - *((uint32_t*)(b + 8)) = (*((uint32_t*)T1[temp[2].b[0]]) - ^ *((uint32_t*)T2[temp[3].b[1]]) - ^ *((uint32_t*)T3[temp[0].b[2]]) - ^ *((uint32_t*)T4[temp[1].b[3]])); - *((uint32_t*)(b +12)) = (*((uint32_t*)T1[temp[3].b[0]]) - ^ *((uint32_t*)T2[temp[0].b[1]]) - ^ *((uint32_t*)T3[temp[1].b[2]]) - ^ *((uint32_t*)T4[temp[2].b[3]])); + int ret; - for (r = 1; r < ROUNDS-1; r++) - { - temp[0].u32 = *((uint32_t*)(b )) ^ rk[r][0]; - temp[1].u32 = *((uint32_t*)(b+ 4)) ^ rk[r][1]; - temp[2].u32 = *((uint32_t*)(b+ 8)) ^ rk[r][2]; - temp[3].u32 = *((uint32_t*)(b+12)) ^ rk[r][3]; - - *((uint32_t*)(b )) = (*((uint32_t*)T1[temp[0].b[0]]) - ^ *((uint32_t*)T2[temp[1].b[1]]) - ^ *((uint32_t*)T3[temp[2].b[2]]) - ^ *((uint32_t*)T4[temp[3].b[3]])); - *((uint32_t*)(b + 4)) = (*((uint32_t*)T1[temp[1].b[0]]) - ^ *((uint32_t*)T2[temp[2].b[1]]) - ^ *((uint32_t*)T3[temp[3].b[2]]) - ^ *((uint32_t*)T4[temp[0].b[3]])); - *((uint32_t*)(b + 8)) = (*((uint32_t*)T1[temp[2].b[0]]) - ^ *((uint32_t*)T2[temp[3].b[1]]) - ^ *((uint32_t*)T3[temp[0].b[2]]) - ^ *((uint32_t*)T4[temp[1].b[3]])); - *((uint32_t*)(b +12)) = (*((uint32_t*)T1[temp[3].b[0]]) - ^ *((uint32_t*)T2[temp[0].b[1]]) - ^ *((uint32_t*)T3[temp[1].b[2]]) - ^ *((uint32_t*)T4[temp[2].b[3]])); - } - - /* Last round is special. */ - temp[0].u32 = *((uint32_t*)(b )) ^ rk[ROUNDS-1][0]; - temp[1].u32 = *((uint32_t*)(b+ 4)) ^ rk[ROUNDS-1][1]; - temp[2].u32 = *((uint32_t*)(b+ 8)) ^ rk[ROUNDS-1][2]; - temp[3].u32 = *((uint32_t*)(b+12)) ^ rk[ROUNDS-1][3]; - b[ 0] = T1[temp[0].b[0]][1]; - b[ 1] = T1[temp[1].b[1]][1]; - b[ 2] = T1[temp[2].b[2]][1]; - b[ 3] = T1[temp[3].b[3]][1]; - b[ 4] = T1[temp[1].b[0]][1]; - b[ 5] = T1[temp[2].b[1]][1]; - b[ 6] = T1[temp[3].b[2]][1]; - b[ 7] = T1[temp[0].b[3]][1]; - b[ 8] = T1[temp[2].b[0]][1]; - b[ 9] = T1[temp[3].b[1]][1]; - b[10] = T1[temp[0].b[2]][1]; - b[11] = T1[temp[1].b[3]][1]; - b[12] = T1[temp[3].b[0]][1]; - b[13] = T1[temp[0].b[1]][1]; - b[14] = T1[temp[1].b[2]][1]; - b[15] = T1[temp[2].b[3]][1]; - *((uint32_t*)(b )) ^= rk[ROUNDS][0]; - *((uint32_t*)(b+ 4)) ^= rk[ROUNDS][1]; - *((uint32_t*)(b+ 8)) ^= rk[ROUNDS][2]; - *((uint32_t*)(b+12)) ^= rk[ROUNDS][3]; -#undef rk -} - -static void AES_Encrypt(const RIJNDAEL_context *ctx, - byte *bx, const byte *ax) -{ - /* BX and AX are not necessary correctly aligned. Thus we need to - copy them here. */ - uint32_t a[4]; - uint32_t b[4]; + ret = AES_ExpandKey(ctx, in_key, key_len); + if (!ret) + return 0; - memcpy(a, ax, 16); - AES_EncryptAligned(ctx, (byte *) b, (byte *) a); - memcpy(bx, b, 16); + return -1; } -/* Test a single encryption and decryption with each key size. */ - -static char *AES_SelfTest(void) +/* encrypt a block of text */ + +#define f_rn(bo, bi, n, k) do { \ + bo[n] = crypto_ft_tab[0][get_byte(bi[n], 0)] ^ \ + crypto_ft_tab[1][get_byte(bi[(n + 1) & 3], 1)] ^ \ + crypto_ft_tab[2][get_byte(bi[(n + 2) & 3], 2)] ^ \ + crypto_ft_tab[3][get_byte(bi[(n + 3) & 3], 3)] ^ *(k + n); \ +} while (0) + +#define f_nround(bo, bi, k) do {\ + f_rn(bo, bi, 0, k); \ + f_rn(bo, bi, 1, k); \ + f_rn(bo, bi, 2, k); \ + f_rn(bo, bi, 3, k); \ + k += 4; \ +} while (0) + +#define f_rl(bo, bi, n, k) do { \ + bo[n] = crypto_fl_tab[0][get_byte(bi[n], 0)] ^ \ + crypto_fl_tab[1][get_byte(bi[(n + 1) & 3], 1)] ^ \ + crypto_fl_tab[2][get_byte(bi[(n + 2) & 3], 2)] ^ \ + crypto_fl_tab[3][get_byte(bi[(n + 3) & 3], 3)] ^ *(k + n); \ +} while (0) + +#define f_lround(bo, bi, k) do {\ + f_rl(bo, bi, 0, k); \ + f_rl(bo, bi, 1, k); \ + f_rl(bo, bi, 2, k); \ + f_rl(bo, bi, 3, k); \ +} while (0) + +static void AES_Encrypt(aes_context_t *ctx, uint8_t *out, + const uint8_t *in) { - RIJNDAEL_context ctx; - byte scratch[16]; - - /* The test vectors are from the AES supplied ones; more or less - * randomly taken from ecb_tbl.txt (I=42,81,14) - */ - static const byte plaintext[16] = { - 0x01,0x4B,0xAF,0x22,0x78,0xA6,0x9D,0x33, - 0x1D,0x51,0x80,0x10,0x36,0x43,0xE9,0x9A - }; - static const byte key[16] = { - 0xE8,0xE9,0xEA,0xEB,0xED,0xEE,0xEF,0xF0, - 0xF2,0xF3,0xF4,0xF5,0xF7,0xF8,0xF9,0xFA - }; - static const byte ciphertext[16] = { - 0x67,0x43,0xC3,0xD1,0x51,0x9A,0xB4,0xF2, - 0xCD,0x9A,0x78,0xAB,0x09,0xA5,0x11,0xBD - }; - - static const byte plaintext_192[16] = { - 0x76,0x77,0x74,0x75,0xF1,0xF2,0xF3,0xF4, - 0xF8,0xF9,0xE6,0xE7,0x77,0x70,0x71,0x72 - }; - static const byte key_192[24] = { - 0x04,0x05,0x06,0x07,0x09,0x0A,0x0B,0x0C, - 0x0E,0x0F,0x10,0x11,0x13,0x14,0x15,0x16, - 0x18,0x19,0x1A,0x1B,0x1D,0x1E,0x1F,0x20 - }; - static const byte ciphertext_192[16] = { - 0x5D,0x1E,0xF2,0x0D,0xCE,0xD6,0xBC,0xBC, - 0x12,0x13,0x1A,0xC7,0xC5,0x47,0x88,0xAA - }; - - static const byte plaintext_256[16] = { - 0x06,0x9A,0x00,0x7F,0xC7,0x6A,0x45,0x9F, - 0x98,0xBA,0xF9,0x17,0xFE,0xDF,0x95,0x21 - }; - static const byte key_256[32] = { - 0x08,0x09,0x0A,0x0B,0x0D,0x0E,0x0F,0x10, - 0x12,0x13,0x14,0x15,0x17,0x18,0x19,0x1A, - 0x1C,0x1D,0x1E,0x1F,0x21,0x22,0x23,0x24, - 0x26,0x27,0x28,0x29,0x2B,0x2C,0x2D,0x2E - }; - static const byte ciphertext_256[16] = { - 0x08,0x0E,0x95,0x17,0xEB,0x16,0x77,0x71, - 0x9A,0xCF,0x72,0x80,0x86,0x04,0x0A,0xE3 - }; - - AES_SetKey(&ctx, key, sizeof(key)); - AES_Encrypt(&ctx, scratch, plaintext); - if (memcmp (scratch, ciphertext, sizeof (ciphertext))) - return "Rijndael-128 test encryption failed."; - - AES_SetKey(&ctx, key_192, sizeof(key_192)); - AES_Encrypt(&ctx, scratch, plaintext_192); - if (memcmp (scratch, ciphertext_192, sizeof (ciphertext_192))) - return "Rijndael-192 test encryption failed."; + const uint32_t *src = (const uint32_t *)in; + uint32_t *dst = (uint32_t *)out; + uint32_t b0[4], b1[4]; + const uint32_t *kp = ctx->key_enc + 4; + const int key_len = ctx->key_length; + + b0[0] = le32_to_cpu(src[0]) ^ ctx->key_enc[0]; + b0[1] = le32_to_cpu(src[1]) ^ ctx->key_enc[1]; + b0[2] = le32_to_cpu(src[2]) ^ ctx->key_enc[2]; + b0[3] = le32_to_cpu(src[3]) ^ ctx->key_enc[3]; + + if (key_len > 24) { + f_nround(b1, b0, kp); + f_nround(b0, b1, kp); + } - AES_SetKey(&ctx, key_256, sizeof(key_256)); - AES_Encrypt(&ctx, scratch, plaintext_256); - if (memcmp (scratch, ciphertext_256, sizeof (ciphertext_256))) - return "Rijndael-256 test encryption failed."; + if (key_len > 16) { + f_nround(b1, b0, kp); + f_nround(b0, b1, kp); + } - return NULL; + f_nround(b1, b0, kp); + f_nround(b0, b1, kp); + f_nround(b1, b0, kp); + f_nround(b0, b1, kp); + f_nround(b1, b0, kp); + f_nround(b0, b1, kp); + f_nround(b1, b0, kp); + f_nround(b0, b1, kp); + f_nround(b1, b0, kp); + f_lround(b0, b1, kp); + + dst[0] = cpu_to_le32(b0[0]); + dst[1] = cpu_to_le32(b0[1]); + dst[2] = cpu_to_le32(b0[2]); + dst[3] = cpu_to_le32(b0[3]); } -#ifndef TEST - static boolean prng_enabled = false; -static RIJNDAEL_context prng_context; +static aes_context_t prng_context; static uint32_t prng_input_counter; static uint32_t prng_values[4]; static unsigned int prng_value_index = 0; @@ -942,15 +890,6 @@ static unsigned int prng_value_index = 0; void PRNG_Start(prng_seed_t key) { - char *errormsg; - - errormsg = AES_SelfTest(); - - if (errormsg != NULL) - { - I_Error("Failed to initialize PRNG: %s", errormsg); - } - AES_SetKey(&prng_context, key, sizeof(prng_seed_t)); prng_value_index = 4; prng_input_counter = 0; @@ -1015,25 +954,3 @@ unsigned int PRNG_Random(void) return result; } - -#else /* #ifndef TEST */ - -int main(int argc, char *argv[]) -{ - char *errormsg; - - errormsg = AES_SelfTest(); - - if (errormsg == NULL) - { - printf("AES Self test passed.\n"); - return 0; - } - else - { - fprintf(stderr, "AES self test failed: %s\n", errormsg); - return 1; - } -} - -#endif diff --git a/src/deh_io.c b/src/deh_io.c index c5e81b0a..e8beb438 100644 --- a/src/deh_io.c +++ b/src/deh_io.c @@ -235,7 +235,7 @@ char *DEH_ReadLine(deh_context_t *context, boolean extended) { c = DEH_GetChar(context); - if (c < 0) + if (c < 0 && pos == 0) { // end of file @@ -273,7 +273,7 @@ char *DEH_ReadLine(deh_context_t *context, boolean extended) // blanks before the backslash are included in the string // but indentation after the linefeed is not - if (escaped && isspace(c) && c != '\n') + if (escaped && c >= 0 && isspace(c) && c != '\n') { continue; } @@ -282,7 +282,7 @@ char *DEH_ReadLine(deh_context_t *context, boolean extended) escaped = false; } - if (c == '\n') + if (c == '\n' || c < 0) { // end of line: a full line has been read diff --git a/src/doom.desktop.in b/src/doom.desktop.in index e554a244..1ec35b37 100644 --- a/src/doom.desktop.in +++ b/src/doom.desktop.in @@ -5,3 +5,4 @@ Icon=@PROGRAM_PREFIX@doom Type=Application Comment=@PACKAGE_SHORTDESC@ Categories=Game;ActionGame; +Keywords=first;person;shooter;vanilla; diff --git a/src/doom/d_main.c b/src/doom/d_main.c index ca722dc6..bcdfcaa3 100644 --- a/src/doom/d_main.c +++ b/src/doom/d_main.c @@ -1151,6 +1151,11 @@ static void LoadIwadDeh(void) } } +static void G_CheckDemoStatusAtExit (void) +{ + G_CheckDemoStatus(); +} + // // D_DoomMain // @@ -1470,9 +1475,12 @@ void D_DoomMain (void) if (p) { + char *uc_filename = strdup(myargv[p + 1]); + M_ForceUppercase(uc_filename); + // With Vanilla you have to specify the file without extension, // but make that optional. - if (M_StringEndsWith(myargv[p + 1], ".lmp")) + if (M_StringEndsWith(uc_filename, ".LMP")) { M_StringCopy(file, myargv[p + 1], sizeof(file)); } @@ -1481,6 +1489,8 @@ void D_DoomMain (void) DEH_snprintf(file, sizeof(file), "%s.lmp", myargv[p+1]); } + free(uc_filename); + if (D_AddFile(file)) { M_StringCopy(demolumpname, lumpinfo[numlumps - 1].name, @@ -1498,7 +1508,7 @@ void D_DoomMain (void) printf("Playing demo %s.\n", file); } - I_AtExit((atexit_func_t) G_CheckDemoStatus, true); + I_AtExit(G_CheckDemoStatusAtExit, true); // Generate the WAD hash table. Speed things up a bit. W_GenerateHashTable(); diff --git a/src/doom/doom.desktop.in b/src/doom/doom.desktop.in deleted file mode 100644 index 44b76e62..00000000 --- a/src/doom/doom.desktop.in +++ /dev/null @@ -1,7 +0,0 @@ -[Desktop Entry] -Name=@PACKAGE_NAME@ -Exec=@PROGRAM_PREFIX@doom -Icon=@PROGRAM_PREFIX@doom -Type=Application -Comment=@PACKAGE_SHORTDESC@ -Categories=Game;ActionGame; diff --git a/src/doom/g_game.c b/src/doom/g_game.c index 64f5b274..bc582a52 100644 --- a/src/doom/g_game.c +++ b/src/doom/g_game.c @@ -612,6 +612,30 @@ void G_DoLoadLevel (void) skyflatnum = R_FlatNumForName(DEH_String(SKYFLATNAME)); + // The "Sky never changes in Doom II" bug was fixed in + // the id Anthology version of doom2.exe for Final Doom. + if ((gamemode == commercial) && (gameversion == exe_final2)) + { + char *skytexturename; + + if (gamemap < 12) + { + skytexturename = "SKY1"; + } + else if (gamemap < 21) + { + skytexturename = "SKY2"; + } + else + { + skytexturename = "SKY3"; + } + + skytexturename = DEH_String(skytexturename); + + skytexture = R_TextureNumForName(skytexturename); + } + levelstarttic = gametic; // for time calculation if (wipegamestate == GS_LEVEL) diff --git a/src/doom/p_maputl.c b/src/doom/p_maputl.c index 098c2c73..6cc35a5a 100644 --- a/src/doom/p_maputl.c +++ b/src/doom/p_maputl.c @@ -846,7 +846,7 @@ static void InterceptsOverrun(int num_intercepts, intercept_t *intercept) InterceptsMemoryOverrun(location, intercept->frac); InterceptsMemoryOverrun(location + 4, intercept->isaline); - InterceptsMemoryOverrun(location + 8, (int) intercept->d.thing); + InterceptsMemoryOverrun(location + 8, (intptr_t) intercept->d.thing); } diff --git a/src/doom/p_saveg.c b/src/doom/p_saveg.c index 6a48271d..5cb81967 100644 --- a/src/doom/p_saveg.c +++ b/src/doom/p_saveg.c @@ -184,12 +184,12 @@ static void saveg_write_pad(void) static void *saveg_readp(void) { - return (void *) saveg_read32(); + return (void *) (intptr_t) saveg_read32(); } static void saveg_writep(void *p) { - saveg_write32((int) p); + saveg_write32((intptr_t) p); } // Enum values are 32-bit integers. diff --git a/src/doom/p_setup.c b/src/doom/p_setup.c index 00306e84..08fed7aa 100644 --- a/src/doom/p_setup.c +++ b/src/doom/p_setup.c @@ -770,7 +770,10 @@ P_SetupLevel // UNUSED W_Profile (); P_InitThinkers (); - + + // if working with a devlopment map, reload it + W_Reload (); + // find map name if ( gamemode == commercial) { diff --git a/src/doom/p_tick.c b/src/doom/p_tick.c index 22893500..c933cfe9 100644 --- a/src/doom/p_tick.c +++ b/src/doom/p_tick.c @@ -93,24 +93,26 @@ void P_AllocateThinker (thinker_t* thinker) // void P_RunThinkers (void) { - thinker_t* currentthinker; + thinker_t *currentthinker, *nextthinker; currentthinker = thinkercap.next; while (currentthinker != &thinkercap) { + nextthinker = currentthinker->next; + if ( currentthinker->function.acv == (actionf_v)(-1) ) { // time to remove it currentthinker->next->prev = currentthinker->prev; currentthinker->prev->next = currentthinker->next; - Z_Free (currentthinker); + Z_Free(currentthinker); } else { if (currentthinker->function.acp1) currentthinker->function.acp1 (currentthinker); } - currentthinker = currentthinker->next; + currentthinker = nextthinker; } } diff --git a/src/doom/s_sound.c b/src/doom/s_sound.c index 5a97a2f6..884e0c1a 100644 --- a/src/doom/s_sound.c +++ b/src/doom/s_sound.c @@ -175,11 +175,12 @@ static void S_StopChannel(int cnum) break; } } - + // degrade usefulness of sound data c->sfxinfo->usefulness--; c->sfxinfo = NULL; + c->origin = NULL; } } diff --git a/src/doomtype.h b/src/doomtype.h index 83b119a0..10820c12 100644 --- a/src/doomtype.h +++ b/src/doomtype.h @@ -21,6 +21,10 @@ #ifndef __DOOMTYPE__ #define __DOOMTYPE__ +#if defined(_MSC_VER) && !defined(__cplusplus) +#define inline __inline +#endif + // #define macros to provide functions missing in Windows. // Outside Windows, we use strings.h for str[n]casecmp. diff --git a/src/heretic.desktop.in b/src/heretic.desktop.in index 54ef6a83..2c9c2fb4 100644 --- a/src/heretic.desktop.in +++ b/src/heretic.desktop.in @@ -5,3 +5,4 @@ Icon=@PROGRAM_PREFIX@doom Type=Application Comment=@PACKAGE_SHORTDESC@ Categories=Game;ActionGame; +Keywords=first;person;shooter;doom;vanilla; diff --git a/src/heretic/Makefile.am b/src/heretic/Makefile.am index 88ccc7b8..0cf95c8c 100644 --- a/src/heretic/Makefile.am +++ b/src/heretic/Makefile.am @@ -53,10 +53,6 @@ sb_bar.c \ sounds.c sounds.h \ s_sound.c s_sound.h -EXTRA_DIST= \ -i_sound.c \ -i_ibm.c - FEATURE_DEHACKED_SOURCE_FILES = \ deh_ammo.c \ deh_frame.c \ diff --git a/src/heretic/d_main.c b/src/heretic/d_main.c index 2a57016f..beb876ca 100644 --- a/src/heretic/d_main.c +++ b/src/heretic/d_main.c @@ -1001,9 +1001,12 @@ void D_DoomMain(void) if (p) { + char *uc_filename = strdup(myargv[p + 1]); + M_ForceUppercase(uc_filename); + // In Vanilla, the filename must be specified without .lmp, // but make that optional. - if (M_StringEndsWith(myargv[p + 1], ".lmp")) + if (M_StringEndsWith(uc_filename, ".LMP")) { M_StringCopy(file, myargv[p + 1], sizeof(file)); } @@ -1012,6 +1015,8 @@ void D_DoomMain(void) DEH_snprintf(file, sizeof(file), "%s.lmp", myargv[p + 1]); } + free(uc_filename); + if (D_AddFile(file)) { M_StringCopy(demolumpname, lumpinfo[numlumps - 1].name, diff --git a/src/heretic/i_ibm.c b/src/heretic/i_ibm.c deleted file mode 100644 index e2dffef8..00000000 --- a/src/heretic/i_ibm.c +++ /dev/null @@ -1,1642 +0,0 @@ -// -// Copyright(C) 1993-1996 Id Software, Inc. -// Copyright(C) 1993-2008 Raven Software -// Copyright(C) 2005-2014 Simon Howard -// -// 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. -// - -// I_IBM.C - -#include <dos.h> -#include <conio.h> -#include <stdlib.h> -#include <stdarg.h> -#include <graph.h> -#include "doomdef.h" -#include "r_local.h" -#include "dmx.h" -#include "v_video.h" - -// Macros - -#define DPMI_INT 0x31 -//#define NOKBD -//#define NOTIMER - -// Public Data - -int DisplayTicker = 0; - -// Code - -void main(int argc, char **argv) -{ - myargc = argc; - myargv = argv; - D_DoomMain(); -} - -void I_StartupNet(void); -void I_ShutdownNet(void); -void I_ReadExternDriver(void); - -typedef struct -{ - unsigned edi, esi, ebp, reserved, ebx, edx, ecx, eax; - unsigned short flags, es, ds, fs, gs, ip, cs, sp, ss; -} dpmiregs_t; - -extern dpmiregs_t dpmiregs; - -void I_ReadMouse(void); -void I_InitDiskFlash(void); - -extern int usemouse, usejoystick; - -extern void **lumpcache; - -/* -============================================================================= - - CONSTANTS - -============================================================================= -*/ - -#define SC_INDEX 0x3C4 -#define SC_RESET 0 -#define SC_CLOCK 1 -#define SC_MAPMASK 2 -#define SC_CHARMAP 3 -#define SC_MEMMODE 4 - -#define CRTC_INDEX 0x3D4 -#define CRTC_H_TOTAL 0 -#define CRTC_H_DISPEND 1 -#define CRTC_H_BLANK 2 -#define CRTC_H_ENDBLANK 3 -#define CRTC_H_RETRACE 4 -#define CRTC_H_ENDRETRACE 5 -#define CRTC_V_TOTAL 6 -#define CRTC_OVERFLOW 7 -#define CRTC_ROWSCAN 8 -#define CRTC_MAXSCANLINE 9 -#define CRTC_CURSORSTART 10 -#define CRTC_CURSOREND 11 -#define CRTC_STARTHIGH 12 -#define CRTC_STARTLOW 13 -#define CRTC_CURSORHIGH 14 -#define CRTC_CURSORLOW 15 -#define CRTC_V_RETRACE 16 -#define CRTC_V_ENDRETRACE 17 -#define CRTC_V_DISPEND 18 -#define CRTC_OFFSET 19 -#define CRTC_UNDERLINE 20 -#define CRTC_V_BLANK 21 -#define CRTC_V_ENDBLANK 22 -#define CRTC_MODE 23 -#define CRTC_LINECOMPARE 24 - - -#define GC_INDEX 0x3CE -#define GC_SETRESET 0 -#define GC_ENABLESETRESET 1 -#define GC_COLORCOMPARE 2 -#define GC_DATAROTATE 3 -#define GC_READMAP 4 -#define GC_MODE 5 -#define GC_MISCELLANEOUS 6 -#define GC_COLORDONTCARE 7 -#define GC_BITMASK 8 - -#define ATR_INDEX 0x3c0 -#define ATR_MODE 16 -#define ATR_OVERSCAN 17 -#define ATR_COLORPLANEENABLE 18 -#define ATR_PELPAN 19 -#define ATR_COLORSELECT 20 - -#define STATUS_REGISTER_1 0x3da - -#define PEL_WRITE_ADR 0x3c8 -#define PEL_READ_ADR 0x3c7 -#define PEL_DATA 0x3c9 -#define PEL_MASK 0x3c6 - -boolean grmode; - -//================================================== -// -// joystick vars -// -//================================================== - -boolean joystickpresent; -extern unsigned joystickx, joysticky; -boolean I_ReadJoystick(void); // returns false if not connected - - -//================================================== - -#define VBLCOUNTER 34000 // hardware tics to a frame - - -#define TIMERINT 8 -#define KEYBOARDINT 9 - -#define CRTCOFF (_inbyte(STATUS_REGISTER_1)&1) -#define CLI _disable() -#define STI _enable() - -#define _outbyte(x,y) (outp(x,y)) -#define _outhword(x,y) (outpw(x,y)) - -#define _inbyte(x) (inp(x)) -#define _inhword(x) (inpw(x)) - -#define MOUSEB1 1 -#define MOUSEB2 2 -#define MOUSEB3 4 - -boolean mousepresent; -//static int tsm_ID = -1; // tsm init flag - -//=============================== - -int ticcount; - -// REGS stuff used for int calls -union REGS regs; -struct SREGS segregs; - -boolean novideo; // if true, stay in text mode for debugging - -#define KBDQUESIZE 32 -byte keyboardque[KBDQUESIZE]; -int kbdtail, kbdhead; - -#define KEY_LSHIFT 0xfe - -#define KEY_INS (0x80+0x52) -#define KEY_DEL (0x80+0x53) -#define KEY_PGUP (0x80+0x49) -#define KEY_PGDN (0x80+0x51) -#define KEY_HOME (0x80+0x47) -#define KEY_END (0x80+0x4f) - -#define SC_RSHIFT 0x36 -#define SC_LSHIFT 0x2a - -byte scantokey[128] = { -// 0 1 2 3 4 5 6 7 -// 8 9 A B C D E F - 0, 27, '1', '2', '3', '4', '5', '6', - '7', '8', '9', '0', '-', '=', KEY_BACKSPACE, 9, // 0 - 'q', 'w', 'e', 'r', 't', 'y', 'u', 'i', - 'o', 'p', '[', ']', 13, KEY_RCTRL, 'a', 's', // 1 - 'd', 'f', 'g', 'h', 'j', 'k', 'l', ';', - 39, '`', KEY_LSHIFT, 92, 'z', 'x', 'c', 'v', // 2 - 'b', 'n', 'm', ',', '.', '/', KEY_RSHIFT, '*', - KEY_RALT, ' ', 0, KEY_F1, KEY_F2, KEY_F3, KEY_F4, KEY_F5, // 3 - KEY_F6, KEY_F7, KEY_F8, KEY_F9, KEY_F10, 0, 0, KEY_HOME, - KEY_UPARROW, KEY_PGUP, '-', KEY_LEFTARROW, '5', KEY_RIGHTARROW, '+', KEY_END, //4 - KEY_DOWNARROW, KEY_PGDN, KEY_INS, KEY_DEL, 0, 0, 0, KEY_F11, - KEY_F12, 0, 0, 0, 0, 0, 0, 0, // 5 - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, // 6 - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0 // 7 -}; - -//========================================================================== - -//-------------------------------------------------------------------------- -// -// FUNC I_GetTime -// -// Returns time in 1/35th second tics. -// -//-------------------------------------------------------------------------- - -int I_GetTime(void) -{ -#ifdef NOTIMER - ticcount++; -#endif - return (ticcount); -} - -//-------------------------------------------------------------------------- -// -// PROC I_ColorBorder -// -//-------------------------------------------------------------------------- - -void I_ColorBorder(void) -{ - int i; - - I_WaitVBL(1); - _outbyte(PEL_WRITE_ADR, 0); - for (i = 0; i < 3; i++) - { - _outbyte(PEL_DATA, 63); - } -} - -//-------------------------------------------------------------------------- -// -// PROC I_UnColorBorder -// -//-------------------------------------------------------------------------- - -void I_UnColorBorder(void) -{ - int i; - - I_WaitVBL(1); - _outbyte(PEL_WRITE_ADR, 0); - for (i = 0; i < 3; i++) - { - _outbyte(PEL_DATA, 0); - } -} - -/* -============================================================================ - - USER INPUT - -============================================================================ -*/ - -//-------------------------------------------------------------------------- -// -// PROC I_WaitVBL -// -//-------------------------------------------------------------------------- - -void I_WaitVBL(int vbls) -{ - int i; - int old; - int stat; - - if (novideo) - { - return; - } - while (vbls--) - { - do - { - stat = inp(STATUS_REGISTER_1); - if (stat & 8) - { - break; - } - } - while (1); - do - { - stat = inp(STATUS_REGISTER_1); - if ((stat & 8) == 0) - { - break; - } - } - while (1); - } -} - -//-------------------------------------------------------------------------- -// -// PROC I_SetPalette -// -// Palette source must use 8 bit RGB elements. -// -//-------------------------------------------------------------------------- - -void I_SetPalette(byte * palette) -{ - int i; - - if (novideo) - { - return; - } - I_WaitVBL(1); - _outbyte(PEL_WRITE_ADR, 0); - for (i = 0; i < 768; i++) - { - _outbyte(PEL_DATA, (gammatable[usegamma][*palette++]) >> 2); - } -} - -/* -============================================================================ - - GRAPHICS MODE - -============================================================================ -*/ - -byte *pcscreen, *destscreen, *destview; - - -/* -============== -= -= I_Update -= -============== -*/ - -int UpdateState; -extern int screenblocks; - -void I_Update(void) -{ - int i; - byte *dest; - int tics; - static int lasttic; - -// -// blit screen to video -// - if (DisplayTicker) - { - if (screenblocks > 9 || UpdateState & (I_FULLSCRN | I_MESSAGES)) - { - dest = (byte *) screen; - } - else - { - dest = (byte *) pcscreen; - } - tics = ticcount - lasttic; - lasttic = ticcount; - if (tics > 20) - { - tics = 20; - } - for (i = 0; i < tics; i++) - { - *dest = 0xff; - dest += 2; - } - for (i = tics; i < 20; i++) - { - *dest = 0x00; - dest += 2; - } - } - if (UpdateState == I_NOUPDATE) - { - return; - } - if (UpdateState & I_FULLSCRN) - { - memcpy(pcscreen, screen, SCREENWIDTH * SCREENHEIGHT); - UpdateState = I_NOUPDATE; // clear out all draw types - } - if (UpdateState & I_FULLVIEW) - { - if (UpdateState & I_MESSAGES && screenblocks > 7) - { - for (i = 0; i < - (viewwindowy + viewheight) * SCREENWIDTH; i += SCREENWIDTH) - { - memcpy(pcscreen + i, screen + i, SCREENWIDTH); - } - UpdateState &= ~(I_FULLVIEW | I_MESSAGES); - } - else - { - for (i = viewwindowy * SCREENWIDTH + viewwindowx; i < - (viewwindowy + viewheight) * SCREENWIDTH; i += SCREENWIDTH) - { - memcpy(pcscreen + i, screen + i, viewwidth); - } - UpdateState &= ~I_FULLVIEW; - } - } - if (UpdateState & I_STATBAR) - { - memcpy(pcscreen + SCREENWIDTH * (SCREENHEIGHT - SBARHEIGHT), - screen + SCREENWIDTH * (SCREENHEIGHT - SBARHEIGHT), - SCREENWIDTH * SBARHEIGHT); - UpdateState &= ~I_STATBAR; - } - if (UpdateState & I_MESSAGES) - { - memcpy(pcscreen, screen, SCREENWIDTH * 28); - UpdateState &= ~I_MESSAGES; - } - -// memcpy(pcscreen, screen, SCREENHEIGHT*SCREENWIDTH); -} - -//-------------------------------------------------------------------------- -// -// PROC I_InitGraphics -// -//-------------------------------------------------------------------------- - -void I_InitGraphics(void) -{ - if (novideo) - { - return; - } - grmode = true; - regs.w.ax = 0x13; - int386(0x10, (const union REGS *) ®s, ®s); - pcscreen = destscreen = (byte *) 0xa0000; - I_SetPalette(W_CacheLumpName("PLAYPAL", PU_CACHE)); - I_InitDiskFlash(); -} - -//-------------------------------------------------------------------------- -// -// PROC I_ShutdownGraphics -// -//-------------------------------------------------------------------------- - -void I_ShutdownGraphics(void) -{ - - if (*(byte *) 0x449 == 0x13) // don't reset mode if it didn't get set - { - regs.w.ax = 3; - int386(0x10, ®s, ®s); // back to text mode - } -} - -//-------------------------------------------------------------------------- -// -// PROC I_ReadScreen -// -// Reads the screen currently displayed into a linear buffer. -// -//-------------------------------------------------------------------------- - -void I_ReadScreen(byte * scr) -{ - memcpy(scr, screen, SCREENWIDTH * SCREENHEIGHT); -} - - -//=========================================================================== - -/* -=================== -= -= I_StartTic -= -// called by D_DoomLoop -// called before processing each tic in a frame -// can call D_PostEvent -// asyncronous interrupt functions should maintain private ques that are -// read by the syncronous functions to be converted into events -=================== -*/ - -/* - OLD STARTTIC STUFF - -void I_StartTic (void) -{ - int k; - event_t ev; - - - I_ReadMouse (); - -// -// keyboard events -// - while (kbdtail < kbdhead) - { - k = keyboardque[kbdtail&(KBDQUESIZE-1)]; - -// if (k==14) -// I_Error ("exited"); - - kbdtail++; - - // extended keyboard shift key bullshit - if ( (k&0x7f)==KEY_RSHIFT ) - { - if ( keyboardque[(kbdtail-2)&(KBDQUESIZE-1)]==0xe0 ) - continue; - k &= 0x80; - k |= KEY_RSHIFT; - } - - if (k==0xe0) - continue; // special / pause keys - if (keyboardque[(kbdtail-2)&(KBDQUESIZE-1)] == 0xe1) - continue; // pause key bullshit - - if (k==0xc5 && keyboardque[(kbdtail-2)&(KBDQUESIZE-1)] == 0x9d) - { - ev.type = ev_keydown; - ev.data1 = KEY_PAUSE; - D_PostEvent (&ev); - continue; - } - - if (k&0x80) - ev.type = ev_keyup; - else - ev.type = ev_keydown; - k &= 0x7f; - - ev.data1 = k; - //ev.data1 = scantokey[k]; - - D_PostEvent (&ev); - } -} -*/ - -#define SC_UPARROW 0x48 -#define SC_DOWNARROW 0x50 -#define SC_LEFTARROW 0x4b -#define SC_RIGHTARROW 0x4d - -void I_StartTic(void) -{ - int k; - event_t ev; - - - I_ReadMouse(); - -// -// keyboard events -// - while (kbdtail < kbdhead) - { - k = keyboardque[kbdtail & (KBDQUESIZE - 1)]; - kbdtail++; - - // extended keyboard shift key bullshit - if ((k & 0x7f) == SC_LSHIFT || (k & 0x7f) == SC_RSHIFT) - { - if (keyboardque[(kbdtail - 2) & (KBDQUESIZE - 1)] == 0xe0) - continue; - k &= 0x80; - k |= SC_RSHIFT; - } - - if (k == 0xe0) - continue; // special / pause keys - if (keyboardque[(kbdtail - 2) & (KBDQUESIZE - 1)] == 0xe1) - continue; // pause key bullshit - - if (k == 0xc5 - && keyboardque[(kbdtail - 2) & (KBDQUESIZE - 1)] == 0x9d) - { - ev.type = ev_keydown; - ev.data1 = KEY_PAUSE; - D_PostEvent(&ev); - continue; - } - - if (k & 0x80) - ev.type = ev_keyup; - else - ev.type = ev_keydown; - k &= 0x7f; - switch (k) - { - case SC_UPARROW: - ev.data1 = KEY_UPARROW; - break; - case SC_DOWNARROW: - ev.data1 = KEY_DOWNARROW; - break; - case SC_LEFTARROW: - ev.data1 = KEY_LEFTARROW; - break; - case SC_RIGHTARROW: - ev.data1 = KEY_RIGHTARROW; - break; - default: - ev.data1 = scantokey[k]; - break; - } - D_PostEvent(&ev); - } - -} - - -void I_ReadKeys(void) -{ - int k; - event_t ev; - - - while (1) - { - while (kbdtail < kbdhead) - { - k = keyboardque[kbdtail & (KBDQUESIZE - 1)]; - kbdtail++; - printf("0x%x\n", k); - if (k == 1) - I_Quit(); - } - } -} - -/* -=============== -= -= I_StartFrame -= -=============== -*/ - -void I_StartFrame(void) -{ - I_JoystickEvents(); - I_ReadExternDriver(); -} - -/* -============================================================================ - - TIMER INTERRUPT - -============================================================================ -*/ - -void I_ColorBlack(int r, int g, int b) -{ - _outbyte(PEL_WRITE_ADR, 0); - _outbyte(PEL_DATA, r); - _outbyte(PEL_DATA, g); - _outbyte(PEL_DATA, b); -} - - -/* -================ -= -= I_TimerISR -= -================ -*/ - -int I_TimerISR(void) -{ - ticcount++; - return 0; -} - -/* -============================================================================ - - KEYBOARD - -============================================================================ -*/ - -void (__interrupt __far * oldkeyboardisr) () = NULL; - -int lastpress; - -/* -================ -= -= I_KeyboardISR -= -================ -*/ - -void __interrupt I_KeyboardISR(void) -{ -// Get the scan code - - keyboardque[kbdhead & (KBDQUESIZE - 1)] = lastpress = _inbyte(0x60); - kbdhead++; - -// acknowledge the interrupt - - _outbyte(0x20, 0x20); -} - - - -/* -=============== -= -= I_StartupKeyboard -= -=============== -*/ - -void I_StartupKeyboard(void) -{ -#ifndef NOKBD - oldkeyboardisr = _dos_getvect(KEYBOARDINT); - _dos_setvect(0x8000 | KEYBOARDINT, I_KeyboardISR); -#endif - -//I_ReadKeys (); -} - - -void I_ShutdownKeyboard(void) -{ - if (oldkeyboardisr) - _dos_setvect(KEYBOARDINT, oldkeyboardisr); - *(short *) 0x41c = *(short *) 0x41a; // clear bios key buffer -} - - - -/* -============================================================================ - - MOUSE - -============================================================================ -*/ - - -int I_ResetMouse(void) -{ - regs.w.ax = 0; // reset - int386(0x33, ®s, ®s); - return regs.w.ax; -} - - - -/* -================ -= -= StartupMouse -= -================ -*/ - -void I_StartupCyberMan(void); - -void I_StartupMouse(void) -{ - int (far * function) (); - - // - // General mouse detection - // - mousepresent = 0; - if (M_CheckParm("-nomouse") || !usemouse) - return; - - if (I_ResetMouse() != 0xffff) - { - tprintf("Mouse: not present ", 0); - return; - } - tprintf("Mouse: detected ", 0); - - mousepresent = 1; - - I_StartupCyberMan(); -} - - -/* -================ -= -= ShutdownMouse -= -================ -*/ - -void I_ShutdownMouse(void) -{ - if (!mousepresent) - return; - - I_ResetMouse(); -} - - -/* -================ -= -= I_ReadMouse -= -================ -*/ - -void I_ReadMouse(void) -{ - event_t ev; - -// -// mouse events -// - if (!mousepresent) - return; - - ev.type = ev_mouse; - - memset(&dpmiregs, 0, sizeof(dpmiregs)); - dpmiregs.eax = 3; // read buttons / position - DPMIInt(0x33); - ev.data1 = dpmiregs.ebx; - - dpmiregs.eax = 11; // read counters - DPMIInt(0x33); - ev.data2 = (short) dpmiregs.ecx; - ev.data3 = -(short) dpmiregs.edx; - - D_PostEvent(&ev); -} - -/* -============================================================================ - - JOYSTICK - -============================================================================ -*/ - -int joyxl, joyxh, joyyl, joyyh; - -boolean WaitJoyButton(void) -{ - int oldbuttons, buttons; - - oldbuttons = 0; - do - { - I_WaitVBL(1); - buttons = ((inp(0x201) >> 4) & 1) ^ 1; - if (buttons != oldbuttons) - { - oldbuttons = buttons; - continue; - } - - if ((lastpress & 0x7f) == 1) - { - joystickpresent = false; - return false; - } - } - while (!buttons); - - do - { - I_WaitVBL(1); - buttons = ((inp(0x201) >> 4) & 1) ^ 1; - if (buttons != oldbuttons) - { - oldbuttons = buttons; - continue; - } - - if ((lastpress & 0x7f) == 1) - { - joystickpresent = false; - return false; - } - } - while (buttons); - - return true; -} - - - -/* -=============== -= -= I_StartupJoystick -= -=============== -*/ - -int basejoyx, basejoyy; - -void I_StartupJoystick(void) -{ - int buttons; - int count; - int centerx, centery; - - joystickpresent = 0; - if (M_CheckParm("-nojoy") || !usejoystick) - return; - - if (!I_ReadJoystick()) - { - joystickpresent = false; - tprintf("joystick not found ", 0); - return; - } - printf("joystick found\n"); - joystickpresent = true; - - printf("CENTER the joystick and press button 1:"); - if (!WaitJoyButton()) - return; - I_ReadJoystick(); - centerx = joystickx; - centery = joysticky; - - printf - ("\nPush the joystick to the UPPER LEFT corner and press button 1:"); - if (!WaitJoyButton()) - return; - I_ReadJoystick(); - joyxl = (centerx + joystickx) / 2; - joyyl = (centerx + joysticky) / 2; - - printf - ("\nPush the joystick to the LOWER RIGHT corner and press button 1:"); - if (!WaitJoyButton()) - return; - I_ReadJoystick(); - joyxh = (centerx + joystickx) / 2; - joyyh = (centery + joysticky) / 2; - printf("\n"); -} - -/* -=============== -= -= I_JoystickEvents -= -=============== -*/ - -void I_JoystickEvents(void) -{ - event_t ev; - -// -// joystick events -// - if (!joystickpresent) - return; - - I_ReadJoystick(); - ev.type = ev_joystick; - ev.data1 = ((inp(0x201) >> 4) & 15) ^ 15; - - if (joystickx < joyxl) - ev.data2 = -1; - else if (joystickx > joyxh) - ev.data2 = 1; - else - ev.data2 = 0; - if (joysticky < joyyl) - ev.data3 = -1; - else if (joysticky > joyyh) - ev.data3 = 1; - else - ev.data3 = 0; - - D_PostEvent(&ev); -} - - - -/* -============================================================================ - - DPMI STUFF - -============================================================================ -*/ - -#define REALSTACKSIZE 1024 - -dpmiregs_t dpmiregs; - -unsigned realstackseg; - -void I_DivException(void); -int I_SetDivException(void); - -void DPMIFarCall(void) -{ - segread(&segregs); - regs.w.ax = 0x301; - regs.w.bx = 0; - regs.w.cx = 0; - regs.x.edi = (unsigned) &dpmiregs; - segregs.es = segregs.ds; - int386x(DPMI_INT, ®s, ®s, &segregs); -} - - -void DPMIInt(int i) -{ - dpmiregs.ss = realstackseg; - dpmiregs.sp = REALSTACKSIZE - 4; - - segread(&segregs); - regs.w.ax = 0x300; - regs.w.bx = i; - regs.w.cx = 0; - regs.x.edi = (unsigned) &dpmiregs; - segregs.es = segregs.ds; - int386x(DPMI_INT, ®s, ®s, &segregs); -} - - -/* -============== -= -= I_StartupDPMI -= -============== -*/ - -void I_StartupDPMI(void) -{ - extern char __begtext; - extern char ___argc; - int n, d; - -// -// allocate a decent stack for real mode ISRs -// - realstackseg = (int) I_AllocLow(1024) >> 4; - -// -// lock the entire program down -// - -// _dpmi_lockregion (&__begtext, &___argc - &__begtext); - - -// -// catch divide by 0 exception -// -#if 0 - segread(&segregs); - regs.w.ax = 0x0203; // DPMI set processor exception handler vector - regs.w.bx = 0; // int 0 - regs.w.cx = segregs.cs; - regs.x.edx = (int) &I_DivException; - printf("%x : %x\n", regs.w.cx, regs.x.edx); - int386(DPMI_INT, ®s, ®s); -#endif - -#if 0 - n = I_SetDivException(); - printf("return: %i\n", n); - n = 100; - d = 0; - printf("100 / 0 = %i\n", n / d); - - exit(1); -#endif -} - - - -/* -============================================================================ - - TIMER INTERRUPT - -============================================================================ -*/ - -void (__interrupt __far * oldtimerisr) (); - - -void IO_ColorBlack(int r, int g, int b) -{ - _outbyte(PEL_WRITE_ADR, 0); - _outbyte(PEL_DATA, r); - _outbyte(PEL_DATA, g); - _outbyte(PEL_DATA, b); -} - - -/* -================ -= -= IO_TimerISR -= -================ -*/ - -//void __interrupt IO_TimerISR (void) - -void __interrupt __far IO_TimerISR(void) -{ - ticcount++; - _outbyte(0x20, 0x20); // Ack the interrupt -} - -/* -===================== -= -= IO_SetTimer0 -= -= Sets system timer 0 to the specified speed -= -===================== -*/ - -void IO_SetTimer0(int speed) -{ - if (speed > 0 && speed < 150) - I_Error("INT_SetTimer0: %i is a bad value", speed); - - _outbyte(0x43, 0x36); // Change timer 0 - _outbyte(0x40, speed); - _outbyte(0x40, speed >> 8); -} - - - -/* -=============== -= -= IO_StartupTimer -= -=============== -*/ - -void IO_StartupTimer(void) -{ - oldtimerisr = _dos_getvect(TIMERINT); - - _dos_setvect(0x8000 | TIMERINT, IO_TimerISR); - IO_SetTimer0(VBLCOUNTER); -} - -void IO_ShutdownTimer(void) -{ - if (oldtimerisr) - { - IO_SetTimer0(0); // back to 18.4 ips - _dos_setvect(TIMERINT, oldtimerisr); - } -} - -//=========================================================================== - - -/* -=============== -= -= I_Init -= -= hook interrupts and set graphics mode -= -=============== -*/ - -void I_Init(void) -{ - extern void I_StartupTimer(void); - - novideo = M_CheckParm("novideo"); - tprintf("I_StartupDPMI", 1); - I_StartupDPMI(); - tprintf("I_StartupMouse ", 1); - I_StartupMouse(); -// tprintf("I_StartupJoystick ",1); -// I_StartupJoystick(); -// tprintf("I_StartupKeyboard ",1); -// I_StartupKeyboard(); -} - - -/* -=============== -= -= I_Shutdown -= -= return to default system state -= -=============== -*/ - -void I_Shutdown(void) -{ - I_ShutdownGraphics(); - IO_ShutdownTimer(); - S_ShutDown(); - I_ShutdownMouse(); - I_ShutdownKeyboard(); - - IO_SetTimer0(0); -} - - -/* -================ -= -= I_Error -= -================ -*/ - -void I_Error(char *error, ...) -{ - union REGS regs; - - va_list argptr; - - D_QuitNetGame(); - I_Shutdown(); - va_start(argptr, error); - regs.x.eax = 0x3; - int386(0x10, ®s, ®s); - vprintf(error, argptr); - va_end(argptr); - printf("\n"); - exit(1); -} - -//-------------------------------------------------------------------------- -// -// I_Quit -// -// Shuts down net game, saves defaults, prints the exit text message, -// goes to text mode, and exits. -// -//-------------------------------------------------------------------------- - -void I_Quit(void) -{ - byte *scr; - char *lumpName; - int r; - - D_QuitNetGame(); - M_SaveDefaults(); - scr = (byte *) W_CacheLumpName("ENDTEXT", PU_CACHE); - I_Shutdown(); - memcpy((void *) 0xb8000, scr, 80 * 25 * 2); - regs.w.ax = 0x0200; - regs.h.bh = 0; - regs.h.dl = 0; - regs.h.dh = 23; - int386(0x10, (const union REGS *) ®s, ®s); // Set text pos - _settextposition(24, 1); - exit(0); -} - -/* -=============== -= -= I_ZoneBase -= -=============== -*/ - -byte *I_ZoneBase(int *size) -{ - int meminfo[32]; - int heap; - int i; - int block; - byte *ptr; - - memset(meminfo, 0, sizeof(meminfo)); - segread(&segregs); - segregs.es = segregs.ds; - regs.w.ax = 0x500; // get memory info - regs.x.edi = (int) &meminfo; - int386x(0x31, ®s, ®s, &segregs); - - heap = meminfo[0]; - printf("DPMI memory: 0x%x, ", heap); - - do - { - heap -= 0x10000; // leave 64k alone - if (heap > 0x800000) - heap = 0x800000; - ptr = malloc(heap); - } - while (!ptr); - - printf("0x%x allocated for zone\n", heap); - if (heap < 0x180000) - I_Error("Insufficient DPMI memory!"); -#if 0 - regs.w.ax = 0x501; // allocate linear block - regs.w.bx = heap >> 16; - regs.w.cx = heap & 0xffff; - int386(0x31, ®s, ®s); - if (regs.w.cflag) - I_Error("Couldn't allocate DPMI memory!"); - - block = (regs.w.si << 16) + regs.w.di; -#endif - - *size = heap; - return ptr; -} - -/* -============================================================================= - - DISK ICON FLASHING - -============================================================================= -*/ - -void I_InitDiskFlash(void) -{ -#if 0 - void *pic; - byte *temp; - - pic = W_CacheLumpName("STDISK", PU_CACHE); - temp = destscreen; - destscreen = (byte *) 0xac000; - V_DrawPatchDirect(SCREENWIDTH - 16, SCREENHEIGHT - 16, 0, pic); - destscreen = temp; -#endif -} - -// draw disk icon -void I_BeginRead(void) -{ -#if 0 - byte *src, *dest; - int y; - - if (!grmode) - return; - -// write through all planes - outp(SC_INDEX, SC_MAPMASK); - outp(SC_INDEX + 1, 15); -// set write mode 1 - outp(GC_INDEX, GC_MODE); - outp(GC_INDEX + 1, inp(GC_INDEX + 1) | 1); - -// copy to backup - src = currentscreen + 184 * 80 + 304 / 4; - dest = (byte *) 0xac000 + 184 * 80 + 288 / 4; - for (y = 0; y < 16; y++) - { - dest[0] = src[0]; - dest[1] = src[1]; - dest[2] = src[2]; - dest[3] = src[3]; - src += 80; - dest += 80; - } - -// copy disk over - dest = currentscreen + 184 * 80 + 304 / 4; - src = (byte *) 0xac000 + 184 * 80 + 304 / 4; - for (y = 0; y < 16; y++) - { - dest[0] = src[0]; - dest[1] = src[1]; - dest[2] = src[2]; - dest[3] = src[3]; - src += 80; - dest += 80; - } - - -// set write mode 0 - outp(GC_INDEX, GC_MODE); - outp(GC_INDEX + 1, inp(GC_INDEX + 1) & ~1); -#endif -} - -// erase disk icon -void I_EndRead(void) -{ -#if 0 - byte *src, *dest; - int y; - - if (!grmode) - return; - -// write through all planes - outp(SC_INDEX, SC_MAPMASK); - outp(SC_INDEX + 1, 15); -// set write mode 1 - outp(GC_INDEX, GC_MODE); - outp(GC_INDEX + 1, inp(GC_INDEX + 1) | 1); - - -// copy disk over - dest = currentscreen + 184 * 80 + 304 / 4; - src = (byte *) 0xac000 + 184 * 80 + 288 / 4; - for (y = 0; y < 16; y++) - { - dest[0] = src[0]; - dest[1] = src[1]; - dest[2] = src[2]; - dest[3] = src[3]; - src += 80; - dest += 80; - } - -// set write mode 0 - outp(GC_INDEX, GC_MODE); - outp(GC_INDEX + 1, inp(GC_INDEX + 1) & ~1); -#endif -} - - - -/* -============= -= -= I_AllocLow -= -============= -*/ - -byte *I_AllocLow(int length) -{ - byte *mem; - - // DPMI call 100h allocates DOS memory - segread(&segregs); - regs.w.ax = 0x0100; // DPMI allocate DOS memory - regs.w.bx = (length + 15) / 16; - int386(DPMI_INT, ®s, ®s); -// segment = regs.w.ax; -// selector = regs.w.dx; - if (regs.w.cflag != 0) - I_Error("I_AllocLow: DOS alloc of %i failed, %i free", - length, regs.w.bx * 16); - - - mem = (void *) ((regs.x.eax & 0xFFFF) << 4); - - memset(mem, 0, length); - return mem; -} - -/* -============================================================================ - - NETWORKING - -============================================================================ -*/ - -/* // FUCKED LINES -typedef struct -{ - char priv[508]; - } doomdata_t; -*/// FUCKED LINES - -#define DOOMCOM_ID 0x12345678l - -/* // FUCKED LINES -typedef struct -{ - long id; - short intnum; // DOOM executes an int to execute commands - -// communication between DOOM and the driver - short command; // CMD_SEND or CMD_GET - short remotenode; // dest for send, set by get (-1 = no packet) - short datalength; // bytes in doomdata to be sent - -// info common to all nodes - short numnodes; // console is allways node 0 - short ticdup; // 1 = no duplication, 2-5 = dup for slow nets - short extratics; // 1 = send a backup tic in every packet - short deathmatch; // 1 = deathmatch - short savegame; // -1 = new game, 0-5 = load savegame - short episode; // 1-3 - short map; // 1-9 - short skill; // 1-5 - -// info specific to this node - short consoleplayer; - short numplayers; - short angleoffset; // 1 = left, 0 = center, -1 = right - short drone; // 1 = drone - -// packet data to be sent - doomdata_t data; - } doomcom_t; -*/// FUCKED LINES - -extern doomcom_t *doomcom; - -/* -==================== -= -= I_InitNetwork -= -==================== -*/ - -void I_InitNetwork(void) -{ - int i; - - i = M_CheckParm("-net"); - if (!i) - { - // - // single player game - // - doomcom = malloc(sizeof(*doomcom)); - memset(doomcom, 0, sizeof(*doomcom)); - netgame = false; - doomcom->id = DOOMCOM_ID; - doomcom->numplayers = doomcom->numnodes = 1; - doomcom->deathmatch = false; - doomcom->consoleplayer = 0; - doomcom->ticdup = 1; - doomcom->extratics = 0; - return; - } - - netgame = true; - doomcom = (doomcom_t *) atoi(myargv[i + 1]); -//DEBUG - doomcom->skill = startskill; - doomcom->episode = startepisode; - doomcom->map = startmap; - doomcom->deathmatch = deathmatch; - -} - -void I_NetCmd(void) -{ - if (!netgame) - I_Error("I_NetCmd when not in netgame"); - DPMIInt(doomcom->intnum); -} - -int i_Vector; -externdata_t *i_ExternData; -boolean useexterndriver; - -//========================================================================= -// -// I_CheckExternDriver -// -// Checks to see if a vector, and an address for an external driver -// have been passed. -//========================================================================= - -void I_CheckExternDriver(void) -{ - int i; - - if (!(i = M_CheckParm("-externdriver"))) - { - return; - } - i_ExternData = (externdata_t *) atoi(myargv[i + 1]); - i_Vector = i_ExternData->vector; - - useexterndriver = true; -} - -//========================================================================= -// -// I_ReadExternDriver -// -// calls the external interrupt, which should then update i_ExternDriver -//========================================================================= - -void I_ReadExternDriver(void) -{ - event_t ev; - - if (useexterndriver) - { - DPMIInt(i_Vector); - } -} diff --git a/src/heretic/i_sound.c b/src/heretic/i_sound.c deleted file mode 100644 index 97f736cf..00000000 --- a/src/heretic/i_sound.c +++ /dev/null @@ -1,426 +0,0 @@ -// -// Copyright(C) 1993-1996 Id Software, Inc. -// Copyright(C) 1993-2008 Raven Software -// Copyright(C) 2005-2014 Simon Howard -// -// 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. -// - -// I_SOUND.C - -#include <stdio.h> -#include "doomdef.h" -#include "dmx.h" -#include "sounds.h" -#include "i_sound.h" -#include "v_video.h" - -/* -=============== -= -= I_StartupTimer -= -=============== -*/ - -int tsm_ID = -1; - -void I_StartupTimer(void) -{ -#ifndef NOTIMER - extern int I_TimerISR(void); - - tprintf("I_StartupTimer()\n", 0); - // installs master timer. Must be done before StartupTimer()! - TSM_Install(SND_TICRATE); - tsm_ID = TSM_NewService(I_TimerISR, 35, 255, 0); // max priority - if (tsm_ID == -1) - { - I_Error("Can't register 35 Hz timer w/ DMX library"); - } -#endif -} - -void I_ShutdownTimer(void) -{ - TSM_DelService(tsm_ID); - TSM_Remove(); -} - -/* - * - * SOUND HEADER & DATA - * - * - */ - -// sound information -#if 0 -const char *dnames[] = { "None", - "PC_Speaker", - "Adlib", - "Sound_Blaster", - "ProAudio_Spectrum16", - "Gravis_Ultrasound", - "MPU", - "AWE32" -}; -#endif - -const char snd_prefixen[] = { 'P', 'P', 'A', 'S', 'S', 'S', 'M', - 'M', 'M', 'S' -}; - -int snd_Channels; -int snd_DesiredMusicDevice, snd_DesiredSfxDevice; -int snd_MusicDevice, // current music card # (index to dmxCodes) - snd_SfxDevice, // current sfx card # (index to dmxCodes) - snd_MaxVolume, // maximum volume for sound - snd_MusicVolume; // maximum volume for music -int dmxCodes[NUM_SCARDS]; // the dmx code for a given card - -int snd_SBport, snd_SBirq, snd_SBdma; // sound blaster variables -int snd_Mport; // midi variables - -extern boolean snd_MusicAvail, // whether music is available - snd_SfxAvail; // whether sfx are available - -void I_PauseSong(int handle) -{ - MUS_PauseSong(handle); -} - -void I_ResumeSong(int handle) -{ - MUS_ResumeSong(handle); -} - -void I_SetMusicVolume(int volume) -{ - MUS_SetMasterVolume(volume * 8); -// snd_MusicVolume = volume; -} - -void I_SetSfxVolume(int volume) -{ - snd_MaxVolume = volume; // THROW AWAY? -} - -/* - * - * SONG API - * - */ - -int I_RegisterSong(void *data) -{ - int rc = MUS_RegisterSong(data); -#ifdef SNDDEBUG - if (rc < 0) - printf("MUS_Reg() returned %d\n", rc); -#endif - return rc; -} - -void I_UnRegisterSong(int handle) -{ - int rc = MUS_UnregisterSong(handle); -#ifdef SNDDEBUG - if (rc < 0) - printf("MUS_Unreg() returned %d\n", rc); -#endif -} - -int I_QrySongPlaying(int handle) -{ - int rc = MUS_QrySongPlaying(handle); -#ifdef SNDDEBUG - if (rc < 0) - printf("MUS_QrySP() returned %d\n", rc); -#endif - return rc; -} - -// Stops a song. MUST be called before I_UnregisterSong(). - -void I_StopSong(int handle) -{ - int rc; - rc = MUS_StopSong(handle); -#ifdef SNDDEBUG - if (rc < 0) - printf("MUS_StopSong() returned %d\n", rc); -#endif - // Fucking kluge pause - { - int s; - extern volatile int ticcount; - for (s = ticcount; ticcount - s < 10;); - } -} - -void I_PlaySong(int handle, boolean looping) -{ - int rc; - rc = MUS_ChainSong(handle, looping ? handle : -1); -#ifdef SNDDEBUG - if (rc < 0) - printf("MUS_ChainSong() returned %d\n", rc); -#endif - rc = MUS_PlaySong(handle, snd_MusicVolume); -#ifdef SNDDEBUG - if (rc < 0) - printf("MUS_PlaySong() returned %d\n", rc); -#endif - -} - -/* - * - * SOUND FX API - * - */ - -// Gets lump nums of the named sound. Returns pointer which will be -// passed to I_StartSound() when you want to start an SFX. Must be -// sure to pass this to UngetSoundEffect() so that they can be -// freed! - - -int I_GetSfxLumpNum(sfxinfo_t * sound) -{ - char namebuf[9]; - - if (sound->name == 0) - return 0; - if (sound->link) - sound = sound->link; -// M_snprintf(namebuf, sizeof(namebuf), "d%c%s", -// snd_prefixen[snd_SfxDevice], sound->name); - return W_GetNumForName(sound->name); - -} - -int I_StartSound(int id, void *data, int vol, int sep, int pitch, - int priority) -{ -/* - // hacks out certain PC sounds - if (snd_SfxDevice == PC - && (data == S_sfx[sfx_posact].data - || data == S_sfx[sfx_bgact].data - || data == S_sfx[sfx_dmact].data - || data == S_sfx[sfx_dmpain].data - || data == S_sfx[sfx_popain].data - || data == S_sfx[sfx_sawidl].data)) return -1; - - else - */ - return SFX_PlayPatch(data, pitch, sep, vol, 0, 0); - -} - -void I_StopSound(int handle) -{ -// extern volatile long gDmaCount; -// long waittocount; - SFX_StopPatch(handle); -// waittocount = gDmaCount + 2; -// while (gDmaCount < waittocount) ; -} - -int I_SoundIsPlaying(int handle) -{ - return SFX_Playing(handle); -} - -void I_UpdateSoundParams(int handle, int vol, int sep, int pitch) -{ - SFX_SetOrigin(handle, pitch, sep, vol); -} - -/* - * - * SOUND STARTUP STUFF - * - * - */ - -// -// Why PC's Suck, Reason #8712 -// - -void I_sndArbitrateCards(void) -{ - char tmp[160]; - boolean gus, adlib, pc, sb, midi; - int i, rc, mputype, p, opltype, wait, dmxlump; - -// snd_MaxVolume = 127; - //Damn you, Dave Taylor! - - snd_MusicDevice = snd_DesiredMusicDevice; - snd_SfxDevice = snd_DesiredSfxDevice; - - // check command-line parameters- overrides config file - // - if (M_CheckParm("-nosound")) - snd_MusicDevice = snd_SfxDevice = snd_none; - if (M_CheckParm("-nosfx")) - snd_SfxDevice = snd_none; - if (M_CheckParm("-nomusic")) - snd_MusicDevice = snd_none; - - if (snd_MusicDevice > snd_MPU && snd_MusicDevice <= snd_MPU3) - snd_MusicDevice = snd_MPU; - if (snd_MusicDevice == snd_SB) - snd_MusicDevice = snd_Adlib; - if (snd_MusicDevice == snd_PAS) - snd_MusicDevice = snd_Adlib; - - // figure out what i've got to initialize - // - gus = snd_MusicDevice == snd_GUS || snd_SfxDevice == snd_GUS; - sb = snd_SfxDevice == snd_SB || snd_MusicDevice == snd_SB; - adlib = snd_MusicDevice == snd_Adlib; - pc = snd_SfxDevice == snd_PC; - midi = snd_MusicDevice == snd_MPU; - - // initialize whatever i've got - // - if (gus) - { - if (GF1_Detect()) - tprintf("Dude. The GUS ain't responding.\n", 1); - else - { - dmxlump = W_GetNumForName("dmxgus"); - GF1_SetMap(W_CacheLumpNum(dmxlump, PU_CACHE), - lumpinfo[dmxlump].size); - } - - } - if (sb) - { - if (debugmode) - { - M_snprintf(tmp, sizeof(tmp), "cfg p=0x%x, i=%d, d=%d\n", - snd_SBport, snd_SBirq, snd_SBdma); - tprintf(tmp, 0); - } - if (SB_Detect(&snd_SBport, &snd_SBirq, &snd_SBdma, 0)) - { - M_snprintf(tmp, sizeof(tmp), - "SB isn't responding at p=0x%x, i=%d, d=%d\n", - snd_SBport, snd_SBirq, snd_SBdma); - tprintf(tmp, 0); - } - else - SB_SetCard(snd_SBport, snd_SBirq, snd_SBdma); - - if (debugmode) - { - M_snprintf(tmp, sizeof(tmp), "SB_Detect returned p=0x%x,i=%d,d=%d\n", - snd_SBport, snd_SBirq, snd_SBdma); - tprintf(tmp, 0); - } - } - - if (adlib) - { - if (AL_Detect(&wait, 0)) - tprintf("Dude. The Adlib isn't responding.\n", 1); - else - AL_SetCard(wait, W_CacheLumpName("genmidi", PU_STATIC)); - } - - if (midi) - { - if (debugmode) - { - M_snprintf(tmp, sizeof(tmp), "cfg p=0x%x\n", snd_Mport); - tprintf(tmp, 0); - } - - if (MPU_Detect(&snd_Mport, &i)) - { - M_snprintf(tmp, sizeof(tmp), - "The MPU-401 isn't reponding @ p=0x%x.\n", snd_Mport); - tprintf(tmp, 0); - } - else - MPU_SetCard(snd_Mport); - } - -} - -// inits all sound stuff - -void I_StartupSound(void) -{ - char tmp[80]; - int rc, i; - - if (debugmode) - tprintf("I_StartupSound: Hope you hear a pop.\n", 1); - - // initialize dmxCodes[] - dmxCodes[0] = 0; - dmxCodes[snd_PC] = AHW_PC_SPEAKER; - dmxCodes[snd_Adlib] = AHW_ADLIB; - dmxCodes[snd_SB] = AHW_SOUND_BLASTER; - dmxCodes[snd_PAS] = AHW_MEDIA_VISION; - dmxCodes[snd_GUS] = AHW_ULTRA_SOUND; - dmxCodes[snd_MPU] = AHW_MPU_401; - dmxCodes[snd_AWE] = AHW_AWE32; - - // inits sound library timer stuff - I_StartupTimer(); - - // pick the sound cards i'm going to use - // - I_sndArbitrateCards(); - - if (debugmode) - { - M_snprintf(tmp, sizeof(tmp), " Music device #%d & dmxCode=%d", - snd_MusicDevice, dmxCodes[snd_MusicDevice]); - tprintf(tmp, 0); - M_snprintf(tmp, sizeof(tmp), " Sfx device #%d & dmxCode=%d\n", - snd_SfxDevice, dmxCodes[snd_SfxDevice]); - tprintf(tmp, 0); - } - - // inits DMX sound library - tprintf(" calling DMX_Init", 0); - rc = DMX_Init(SND_TICRATE, SND_MAXSONGS, dmxCodes[snd_MusicDevice], - dmxCodes[snd_SfxDevice]); - - if (debugmode) - { - M_snprintf(tmp, sizeof(tmp), " DMX_Init() returned %d", rc); - tprintf(tmp, 0); - } - -} - -// shuts down all sound stuff - -void I_ShutdownSound(void) -{ - DMX_DeInit(); - I_ShutdownTimer(); -} - -void I_SetChannels(int channels) -{ - WAV_PlayMode(channels, SND_SAMPLERATE); -} diff --git a/src/heretic/mn_menu.c b/src/heretic/mn_menu.c index b0a8d6b7..4cd52a0d 100644 --- a/src/heretic/mn_menu.c +++ b/src/heretic/mn_menu.c @@ -16,6 +16,7 @@ // MN_menu.c +#include <stdlib.h> #include <ctype.h> #include "deh_str.h" diff --git a/src/heretic/p_enemy.c b/src/heretic/p_enemy.c index b4222ec8..55608c54 100644 --- a/src/heretic/p_enemy.c +++ b/src/heretic/p_enemy.c @@ -1904,7 +1904,7 @@ void A_WhirlwindSeek(mobj_t * actor) void A_HeadIceImpact(mobj_t * ice) { - int i; + unsigned int i; angle_t angle; mobj_t *shard; @@ -2519,7 +2519,7 @@ void A_VolcanoBlast(mobj_t * volcano) void A_VolcBallImpact(mobj_t * ball) { - int i; + unsigned int i; mobj_t *tiny; angle_t angle; diff --git a/src/heretic/p_pspr.c b/src/heretic/p_pspr.c index 2cbe3674..813dd6a2 100644 --- a/src/heretic/p_pspr.c +++ b/src/heretic/p_pspr.c @@ -1330,7 +1330,7 @@ void A_DeathBallImpact(mobj_t * ball) void A_SpawnRippers(mobj_t * actor) { - int i; + unsigned int i; angle_t angle; mobj_t *ripper; diff --git a/src/heretic/p_saveg.c b/src/heretic/p_saveg.c index 3bd7c2b2..34e9e906 100644 --- a/src/heretic/p_saveg.c +++ b/src/heretic/p_saveg.c @@ -16,6 +16,8 @@ // P_tick.c +#include <stdlib.h> + #include "doomdef.h" #include "i_swap.h" #include "i_system.h" diff --git a/src/heretic/p_tick.c b/src/heretic/p_tick.c index c93a211f..323cc1e6 100644 --- a/src/heretic/p_tick.c +++ b/src/heretic/p_tick.c @@ -110,11 +110,13 @@ void P_AllocateThinker(thinker_t * thinker) void P_RunThinkers(void) { - thinker_t *currentthinker; + thinker_t *currentthinker, *nextthinker; currentthinker = thinkercap.next; while (currentthinker != &thinkercap) { + nextthinker = currentthinker->next; + if (currentthinker->function == (think_t) - 1) { // time to remove it currentthinker->next->prev = currentthinker->prev; @@ -126,7 +128,7 @@ void P_RunThinkers(void) if (currentthinker->function) currentthinker->function(currentthinker); } - currentthinker = currentthinker->next; + currentthinker = nextthinker; } } diff --git a/src/hexen.desktop.in b/src/hexen.desktop.in index 14603840..01eafccb 100644 --- a/src/hexen.desktop.in +++ b/src/hexen.desktop.in @@ -5,3 +5,4 @@ Icon=@PROGRAM_PREFIX@doom Type=Application Comment=@PACKAGE_SHORTDESC@ Categories=Game;ActionGame; +Keywords=first;person;shooter;doom;vanilla; diff --git a/src/hexen/Makefile.am b/src/hexen/Makefile.am index b3953ce6..74c30950 100644 --- a/src/hexen/Makefile.am +++ b/src/hexen/Makefile.am @@ -13,10 +13,8 @@ f_finale.c \ g_game.c \ h2def.h \ h2_main.c \ - i_header.h \ info.c info.h \ in_lude.c \ -m_misc.c \ m_random.c m_random.h \ mn_menu.c \ p_acs.c \ @@ -60,8 +58,4 @@ sv_save.c \ textdefs.h \ xddefs.h -EXTRA_DIST= \ -i_ibm.c \ -i_sound.c - libhexen_a_SOURCES=$(SOURCE_FILES) diff --git a/src/hexen/a_action.c b/src/hexen/a_action.c index c4c194e3..1923ff70 100644 --- a/src/hexen/a_action.c +++ b/src/hexen/a_action.c @@ -211,7 +211,7 @@ void A_PotteryCheck(mobj_t * actor) } else { - for (i = 0; i < MAXPLAYERS; i++) + for (i = 0; i < maxplayers; i++) { if (!playeringame[i]) { @@ -905,7 +905,7 @@ void A_Quake(mobj_t * actor) if (actor->args[1]-- > 0) { - for (playnum = 0; playnum < MAXPLAYERS; playnum++) + for (playnum = 0; playnum < maxplayers; playnum++) { player = &players[playnum]; if (!playeringame[playnum]) @@ -934,7 +934,7 @@ void A_Quake(mobj_t * actor) } else { - for (playnum = 0; playnum < MAXPLAYERS; playnum++) + for (playnum = 0; playnum < maxplayers; playnum++) { localQuakeHappening[playnum] = false; } diff --git a/src/hexen/am_map.c b/src/hexen/am_map.c index 2d082415..6a28b45c 100644 --- a/src/hexen/am_map.c +++ b/src/hexen/am_map.c @@ -292,7 +292,7 @@ void AM_initVariables(void) // find player to center on initially if (!playeringame[pnum = consoleplayer]) - for (pnum = 0; pnum < MAXPLAYERS; pnum++) + for (pnum = 0; pnum < maxplayers; pnum++) if (playeringame[pnum]) break; plr = &players[pnum]; @@ -1280,7 +1280,7 @@ void AM_drawPlayers(void) return; } - for (i = 0; i < MAXPLAYERS; i++) + for (i = 0; i < maxplayers; i++) { their_color++; p = &players[i]; @@ -1418,12 +1418,12 @@ void AM_DrawDeathmatchStats(void) char textBuffer[80]; int yPosition; - for (i = 0; i < MAXPLAYERS; i++) + for (i = 0; i < maxplayers; i++) { fragCount[i] = 0; order[i] = -1; } - for (i = 0; i < MAXPLAYERS; i++) + for (i = 0; i < maxplayers; i++) { if (!playeringame[i]) { @@ -1431,14 +1431,14 @@ void AM_DrawDeathmatchStats(void) } else { - for (j = 0; j < MAXPLAYERS; j++) + for (j = 0; j < maxplayers; j++) { if (playeringame[j]) { fragCount[i] += players[i].frags[j]; } } - for (k = 0; k < MAXPLAYERS; k++) + for (k = 0; k < maxplayers; k++) { if (order[k] == -1) { @@ -1447,7 +1447,7 @@ void AM_DrawDeathmatchStats(void) } else if (fragCount[i] > fragCount[order[k]]) { - for (m = MAXPLAYERS - 1; m > k; m--) + for (m = maxplayers - 1; m > k; m--) { order[m] = order[m - 1]; } @@ -1458,7 +1458,7 @@ void AM_DrawDeathmatchStats(void) } } yPosition = 15; - for (i = 0; i < MAXPLAYERS; i++) + for (i = 0; i < maxplayers; i++) { if (!playeringame[order[i]]) { diff --git a/src/hexen/ct_chat.c b/src/hexen/ct_chat.c index 4785f8b2..55934006 100644 --- a/src/hexen/ct_chat.c +++ b/src/hexen/ct_chat.c @@ -116,7 +116,7 @@ void CT_Init(void) tail = 0; chatmodeon = false; memset(ChatQueue, 0, QUEUESIZE); - for (i = 0; i < MAXPLAYERS; i++) + for (i = 0; i < maxplayers; i++) { chat_dest[i] = 0; msgptr[i] = 0; @@ -292,7 +292,7 @@ void CT_Ticker(void) char c; int numplayers; - for (i = 0; i < MAXPLAYERS; i++) + for (i = 0; i < maxplayers; i++) { if (!playeringame[i]) { @@ -312,7 +312,7 @@ void CT_Ticker(void) else if (c == KEY_ENTER) { numplayers = 0; - for (j = 0; j < MAXPLAYERS; j++) + for (j = 0; j < maxplayers; j++) { numplayers += playeringame[j]; } diff --git a/src/hexen/d_net.c b/src/hexen/d_net.c index 5bd0eed0..bd0e8b21 100644 --- a/src/hexen/d_net.c +++ b/src/hexen/d_net.c @@ -76,7 +76,7 @@ static void RunTic(ticcmd_t *cmds, boolean *ingame) // Check for player quits. - for (i = 0; i < MAXPLAYERS; ++i) + for (i = 0; i < maxplayers; ++i) { if (!demoplayback && playeringame[i] && !ingame[i]) { @@ -120,7 +120,7 @@ static void LoadGameSettings(net_gamesettings_t *settings) respawnparm = settings->respawn_monsters; consoleplayer = settings->consoleplayer; - for (i=0; i<MAXPLAYERS; ++i) + for (i=0; i<maxplayers; ++i) { playeringame[i] = i < settings->num_players; PlayerClass[i] = settings->player_classes[i]; @@ -172,7 +172,7 @@ static void InitConnectData(net_connect_data_t *connect_data) connect_data->lowres_turn = false; connect_data->drone = false; - connect_data->max_players = MAXPLAYERS; + connect_data->max_players = maxplayers; //! // @category net diff --git a/src/hexen/g_game.c b/src/hexen/g_game.c index 3593ffe2..e0a7afac 100644 --- a/src/hexen/g_game.c +++ b/src/hexen/g_game.c @@ -639,7 +639,7 @@ void G_DoLoadLevel(void) levelstarttic = gametic; // for time calculation gamestate = GS_LEVEL; - for (i = 0; i < MAXPLAYERS; i++) + for (i = 0; i < maxplayers; i++) { if (playeringame[i] && players[i].playerstate == PST_DEAD) players[i].playerstate = PST_REBORN; @@ -756,7 +756,7 @@ boolean G_Responder(event_t * ev) do { displayplayer++; - if (displayplayer == MAXPLAYERS) + if (displayplayer == maxplayers) { displayplayer = 0; } @@ -899,7 +899,7 @@ void G_Ticker(void) // // do player reborns if needed // - for (i = 0; i < MAXPLAYERS; i++) + for (i = 0; i < maxplayers; i++) if (playeringame[i] && players[i].playerstate == PST_REBORN) G_DoReborn(i); @@ -963,7 +963,7 @@ void G_Ticker(void) //buf = gametic%BACKUPTICS; buf = (gametic / ticdup) % BACKUPTICS; - for (i = 0; i < MAXPLAYERS; i++) + for (i = 0; i < maxplayers; i++) if (playeringame[i]) { cmd = &players[i].cmd; @@ -993,7 +993,7 @@ void G_Ticker(void) // // check for special buttons // - for (i = 0; i < MAXPLAYERS; i++) + for (i = 0; i < maxplayers; i++) if (playeringame[i]) { if (players[i].cmd.buttons & BT_SPECIAL) @@ -1335,7 +1335,7 @@ void G_DoReborn(int playernum) else { // Try to spawn at one of the other player start spots - for (i = 0; i < MAXPLAYERS; i++) + for (i = 0; i < maxplayers; i++) { if (G_CheckSpot(playernum, &playerstarts[RebornPosition][i])) { // Found an open start spot @@ -1471,6 +1471,13 @@ void G_SecretExitLevel (void) void G_Completed(int map, int position) { + if (gamemode == shareware && map > 4) + { + P_SetMessage(&players[consoleplayer], "ACCESS DENIED -- DEMO", true); + S_StartSound(NULL, SFX_CHAT); + return; + } + gameaction = ga_completed; LeaveMap = map; LeavePosition = position; @@ -1485,7 +1492,7 @@ void G_DoCompleted(void) { return; } - for (i = 0; i < MAXPLAYERS; i++) + for (i = 0; i < maxplayers; i++) { if (playeringame[i]) { @@ -1512,7 +1519,7 @@ void G_DoCompleted(void) { return; } - for(i = 0; i < MAXPLAYERS; i++) + for(i = 0; i < maxplayers; i++) { if(playeringame[i]) { @@ -1725,7 +1732,7 @@ void G_InitNew(skill_t skill, int episode, int map) } M_ClearRandom(); // Force players to be initialized upon first level load - for (i = 0; i < MAXPLAYERS; i++) + for (i = 0; i < maxplayers; i++) { players[i].playerstate = PST_REBORN; players[i].worldTimer = 0; @@ -1748,7 +1755,7 @@ void G_InitNew(skill_t skill, int episode, int map) // Give one null ticcmd_t //gametic = 0; //maketic = 1; - //for (i=0 ; i<MAXPLAYERS ; i++) + //for (i=0 ; i<maxplayers ; i++) // nettics[i] = 1; // one null event for this gametic //memset (localcmds,0,sizeof(localcmds)); //memset (netcmds,0,sizeof(netcmds)); @@ -1819,7 +1826,7 @@ void G_RecordDemo(skill_t skill, int numplayers, int episode, int map, *demo_p++ = episode; *demo_p++ = map; - for (i = 0; i < MAXPLAYERS; i++) + for (i = 0; i < maxplayers; i++) { *demo_p++ = playeringame[i]; *demo_p++ = PlayerClass[i]; @@ -1855,7 +1862,7 @@ void G_DoPlayDemo(void) episode = *demo_p++; map = *demo_p++; - for (i = 0; i < MAXPLAYERS; i++) + for (i = 0; i < maxplayers; i++) { playeringame[i] = *demo_p++; PlayerClass[i] = *demo_p++; @@ -1890,7 +1897,7 @@ void G_TimeDemo(char *name) episode = *demo_p++; map = *demo_p++; - for (i = 0; i < MAXPLAYERS; i++) + for (i = 0; i < maxplayers; i++) { playeringame[i] = *demo_p++; PlayerClass[i] = *demo_p++; diff --git a/src/hexen/h2_main.c b/src/hexen/h2_main.c index 9d92a65b..b98621b2 100644 --- a/src/hexen/h2_main.c +++ b/src/hexen/h2_main.c @@ -93,6 +93,7 @@ extern boolean askforquit; // PUBLIC DATA DEFINITIONS ------------------------------------------------- GameMode_t gamemode; +char *gamedescription; char *iwadfile; static char demolumpname[9]; // Demo lump to start playing. boolean nomonsters; // checkparm of -nomonsters @@ -112,6 +113,7 @@ boolean autostart; boolean advancedemo; FILE *debugfile; int UpdateState; +int maxplayers = MAXPLAYERS; // PRIVATE DATA DEFINITIONS ------------------------------------------------ @@ -253,6 +255,57 @@ static void D_AddFile(char *filename) W_AddFile(filename); } +// Find out what version of Hexen is playing. + +void D_IdentifyVersion(void) +{ + // The Hexen Shareware, ne 4 Level Demo Version, is missing the SKY1 lump + // and uses the SKY2 lump instead. Let's use this fact and the missing + // levels from MAP05 onward to identify it and set gamemode accordingly. + + if (W_CheckNumForName("SKY1") == -1 && + W_CheckNumForName("MAP05") == -1 ) + { + gamemode = shareware; + maxplayers = 4; + } + + // The v1.0 IWAD file is missing a bunch of lumps. + if (gamemode != shareware && W_CheckNumForName("CLUS1MSG") == -1) + { + printf( + "** WARNING: You are playing with the Hexen v1.0 IWAD. This\n" + "** isn't supported by " PACKAGE_NAME ", and you may find that\n" + "** the game will crash. Please upgrade to the v1.1 IWAD file.\n" + "** See here for more information:\n" + "** http://www.doomworld.com/classicdoom/info/patches.php\n"); + } +} + +// Set the gamedescription string. + +void D_SetGameDescription(void) +{ +/* + NB: The 4 Level Demo Version actually prints a four-lined banner + (and indeed waits for a keypress): + + Hexen: Beyond Heretic + + 4 Level Demo Version + Press any key to continue. +*/ + + if (gamemode == shareware) + { + gamedescription = "Hexen: 4 Level Demo Version"; + } + else + { + gamedescription = "Hexen"; + } +} + //========================================================================== // // H2_Main @@ -332,11 +385,13 @@ void D_DoomMain(void) D_AddFile(iwadfile); W_CheckCorrectIWAD(hexen); + D_IdentifyVersion(); + D_SetGameDescription(); AdjustForMacIWAD(); HandleArgs(); - I_PrintStartupBanner("Hexen"); + I_PrintStartupBanner(gamedescription); ST_Message("MN_Init: Init menu system.\n"); MN_Init(); @@ -579,17 +634,23 @@ static void HandleArgs(void) if (p) { + char *uc_filename; char file[256]; M_StringCopy(file, myargv[p+1], sizeof(file)); // With Vanilla Hexen you have to specify the file without // extension, but make that optional. - if (!M_StringEndsWith(myargv[p+1], ".lmp")) + uc_filename = strdup(myargv[p + 1]); + M_ForceUppercase(uc_filename); + + if (!M_StringEndsWith(uc_filename, ".LMP")) { M_StringConcat(file, ".lmp", sizeof(file)); } + free(uc_filename); + if (W_AddFile(file) != NULL) { M_StringCopy(demolumpname, lumpinfo[numlumps - 1].name, @@ -664,7 +725,7 @@ void H2_GameLoop(void) M_snprintf(filename, sizeof(filename), "debug%i.txt", consoleplayer); debugfile = fopen(filename, "w"); } - I_SetWindowTitle("Hexen"); + I_SetWindowTitle(gamedescription); I_GraphicsCheckCommandLine(); I_SetGrabMouseCallback(D_GrabMouseCallback); I_InitGraphics(); @@ -805,7 +866,7 @@ static void DrawMessage(void) player_t *player; player = &players[consoleplayer]; - if (player->messageTics <= 0 || !player->message) + if (player->messageTics <= 0) { // No message return; } diff --git a/src/hexen/h2def.h b/src/hexen/h2def.h index 43e7c91b..0658b7d5 100644 --- a/src/hexen/h2def.h +++ b/src/hexen/h2def.h @@ -655,6 +655,7 @@ extern int RebornPosition; #define MAX_PLAYER_STARTS 8 extern mapthing_t playerstarts[MAX_PLAYER_STARTS][MAXPLAYERS]; +extern int maxplayers; extern int mouseSensitivity; diff --git a/src/hexen/i_header.h b/src/hexen/i_header.h deleted file mode 100644 index 95a1532f..00000000 --- a/src/hexen/i_header.h +++ /dev/null @@ -1,92 +0,0 @@ -// -// Copyright(C) 1993-1996 Id Software, Inc. -// Copyright(C) 1993-2008 Raven Software -// Copyright(C) 2005-2014 Simon Howard -// -// 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. -// -#ifndef __I_HEADER_H__ -#define __I_HEADER_H__ - -#include "h2def.h" - -//-------- -//SOUND IO -//-------- -#define FREQ_LOW 0x40 -#define FREQ_NORM 0x80 -#define FREQ_HIGH 0xff - -void I_SetMasterVolume(int volume); - -void I_TurnOffSfx(void); -void I_TurnOnSfx(void); -void I_TurnOffMusic(void); -void I_TurnOnMusic(void); - -// MUSIC I/O -// - -int I_RegisterSong(void *songdata); -// called by anything that wants to register a song lump with the sound lib -// calls Paul's function of the similar name to register music only. -// note that the song data is the same for any sound card and is paul's -// MUS format. Returns a handle which will be passed to all other music -// functions. - -void I_UnregisterSong(int handle); -// called by anything which is finished with a song and no longer needs -// the sound library to be aware of it. All songs should be stopped -// before calling this, but it will double check and stop it if necessary. - -void I_LoopSong(int handle); -// called by anything that wishes to start music. -// plays a song, and when the song is done, starts playing it again in -// an endless loop. the start is faded in over three seconds. - -void I_FadeOutSong(int handle, int fotime); -// called by anything that wishes to stop music. -// fades out the song over <fotime> milliseconds. - -void I_StopSong(int handle); -// called by anything that wishes to stop music. -// stops a song abruptly. - -// SFX I/O -// - -void *I_GetSoundEffect(char *soundname); -// called by routines which wish to play a sound effect at some later -// time. Pass it the lump name of a sound effect WITHOUT the sfx -// prefix. This means the maximum name length is 7 letters/digits. -// The prefixes for different sound cards are 'S','M','A', and 'P'. -// They refer to the card type. The routine will cache in the -// appropriate sound effect when it is played. - -void I_UngetSoundEffect(void *soundset); -// called by routines which wish to no longer use the sounds at all -// frees up the associated structure. It stops any currently playing -// sound effects. - -void I_StartSound(channel_t * c, int vol, int sep, int pitch, int priority); -// Starts a sound in a particular sound channel - -void I_UpdateSoundParams(channel_t * c, int vol, int sep, int pitch); -// Updates the volume, separation, and pitch of a sound channel - -void I_StopSound(channel_t * c); -// Stops a sound channel - -int I_SoundIsPlaying(channel_t * c); -// called by S_*()'s to see if a channel is still playing. Returns 0 -// if no longer playing, 1 if playing. - -#endif diff --git a/src/hexen/i_ibm.c b/src/hexen/i_ibm.c deleted file mode 100644 index 82247ce8..00000000 --- a/src/hexen/i_ibm.c +++ /dev/null @@ -1,1837 +0,0 @@ -// -// Copyright(C) 1993-1996 Id Software, Inc. -// Copyright(C) 1993-2008 Raven Software -// Copyright(C) 2005-2014 Simon Howard -// -// 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. -// - - -#include <dos.h> -#include <conio.h> -#include <stdlib.h> -#include <stdarg.h> -#include <graph.h> -#include "h2def.h" -#include "i_system.h" -#include "m_argv.h" -#include "r_local.h" -#include "p_local.h" // for P_AproxDistance -#include "sounds.h" -#include "i_sound.h" -#include "st_start.h" -#include "dmx.h" -#include "dpmiapi.h" - -// Macros - -#define DPMI_INT 0x31 - -#define SEQ_ADDR 0x3C4 -#define SEQ_DATA 0x3C5 -#define REG_MAPMASK 0x02 - -#define MASK_PLANE0 0x01 -#define MASK_PLANE1 0x02 -#define MASK_PLANE2 0x04 -#define MASK_PLANE3 0x08 - -#define P0OFFSET 38400*0 -#define P1OFFSET 38400*1 -#define P2OFFSET 38400*2 -#define P3OFFSET 38400*3 - -#define VID_INT 0x10 -#define VB_SYNC {while(!(inp(0x3da)&8)); while(inp(0x3da)&8);} -#define BITPLANE(p) (outp(SEQ_ADDR,REG_MAPMASK),outp(SEQ_DATA,(p))) - -//#define NOKBD -//#define NOTIMER - -// Public Data - -int DisplayTicker = 0; - -// Code - -void main(int argc, char **argv) -{ - myargc = argc; - myargv = argv; - H2_Main(); -} - -void I_StartupNet(void); -void I_ShutdownNet(void); -void I_ReadExternDriver(void); - -typedef struct -{ - unsigned edi, esi, ebp, reserved, ebx, edx, ecx, eax; - unsigned short flags, es, ds, fs, gs, ip, cs, sp, ss; -} dpmiregs_t; - -extern dpmiregs_t dpmiregs; - -void I_ReadMouse(void); - -extern int usemouse, usejoystick; - -extern void **lumpcache; - -int i_Vector; -externdata_t *i_ExternData; -boolean useexterndriver; - -//========================================================================== -// -// I_UpdateCDMusic -// -// Updates playing time for current track, and restarts the track, if -// needed -// -//========================================================================== - -void I_UpdateCDMusic(void) -{ - extern boolean MenuActive; - - if (MusicPaused || i_CDMusicLength < 0 || (paused && !MenuActive)) - { // Non-looping song/song paused - return; - } - i_CDMusicLength -= gametic - oldTic; - oldTic = gametic; - if (i_CDMusicLength <= 0) - { - S_StartSong(gamemap, true); - } -} - -/* -============================================================================ - - CONSTANTS - -============================================================================ -*/ - -#define SC_INDEX 0x3C4 -#define SC_RESET 0 -#define SC_CLOCK 1 -#define SC_MAPMASK 2 -#define SC_CHARMAP 3 -#define SC_MEMMODE 4 - -#define CRTC_INDEX 0x3D4 -#define CRTC_H_TOTAL 0 -#define CRTC_H_DISPEND 1 -#define CRTC_H_BLANK 2 -#define CRTC_H_ENDBLANK 3 -#define CRTC_H_RETRACE 4 -#define CRTC_H_ENDRETRACE 5 -#define CRTC_V_TOTAL 6 -#define CRTC_OVERFLOW 7 -#define CRTC_ROWSCAN 8 -#define CRTC_MAXSCANLINE 9 -#define CRTC_CURSORSTART 10 -#define CRTC_CURSOREND 11 -#define CRTC_STARTHIGH 12 -#define CRTC_STARTLOW 13 -#define CRTC_CURSORHIGH 14 -#define CRTC_CURSORLOW 15 -#define CRTC_V_RETRACE 16 -#define CRTC_V_ENDRETRACE 17 -#define CRTC_V_DISPEND 18 -#define CRTC_OFFSET 19 -#define CRTC_UNDERLINE 20 -#define CRTC_V_BLANK 21 -#define CRTC_V_ENDBLANK 22 -#define CRTC_MODE 23 -#define CRTC_LINECOMPARE 24 - - -#define GC_INDEX 0x3CE -#define GC_SETRESET 0 -#define GC_ENABLESETRESET 1 -#define GC_COLORCOMPARE 2 -#define GC_DATAROTATE 3 -#define GC_READMAP 4 -#define GC_MODE 5 -#define GC_MISCELLANEOUS 6 -#define GC_COLORDONTCARE 7 -#define GC_BITMASK 8 - -#define ATR_INDEX 0x3c0 -#define ATR_MODE 16 -#define ATR_OVERSCAN 17 -#define ATR_COLORPLANEENABLE 18 -#define ATR_PELPAN 19 -#define ATR_COLORSELECT 20 - -#define STATUS_REGISTER_1 0x3da - -#define PEL_WRITE_ADR 0x3c8 -#define PEL_READ_ADR 0x3c7 -#define PEL_DATA 0x3c9 -#define PEL_MASK 0x3c6 - -// boolean grmode; - -//================================================== -// -// joystick vars -// -//================================================== - -boolean joystickpresent; -extern unsigned joystickx, joysticky; -boolean I_ReadJoystick(void); // returns false if not connected - - -//================================================== - -#define VBLCOUNTER 34000 // hardware tics to a frame - - -#define TIMERINT 8 -#define KEYBOARDINT 9 - -#define CRTCOFF (_inbyte(STATUS_REGISTER_1)&1) -#define CLI _disable() -#define STI _enable() - -#define _outbyte(x,y) (outp(x,y)) -#define _outhword(x,y) (outpw(x,y)) - -#define _inbyte(x) (inp(x)) -#define _inhword(x) (inpw(x)) - -#define MOUSEB1 1 -#define MOUSEB2 2 -#define MOUSEB3 4 - -boolean mousepresent; -//static int tsm_ID = -1; // tsm init flag - -//=============================== - -int ticcount; - -// REGS stuff used for int calls -union REGS regs; -struct SREGS segregs; - -boolean novideo; // if true, stay in text mode for debugging - -#define KBDQUESIZE 32 -byte keyboardque[KBDQUESIZE]; -int kbdtail, kbdhead; - -#define KEY_LSHIFT 0xfe - -#define KEY_INS (0x80+0x52) -#define KEY_DEL (0x80+0x53) -#define KEY_PGUP (0x80+0x49) -#define KEY_PGDN (0x80+0x51) -#define KEY_HOME (0x80+0x47) -#define KEY_END (0x80+0x4f) - -#define SC_RSHIFT 0x36 -#define SC_LSHIFT 0x2a - -byte scantokey[128] = { -// 0 1 2 3 4 5 6 7 -// 8 9 A B C D E F - 0, 27, '1', '2', '3', '4', '5', '6', - '7', '8', '9', '0', '-', '=', KEY_BACKSPACE, 9, // 0 - 'q', 'w', 'e', 'r', 't', 'y', 'u', 'i', - 'o', 'p', '[', ']', 13, KEY_RCTRL, 'a', 's', // 1 - 'd', 'f', 'g', 'h', 'j', 'k', 'l', ';', - 39, '`', KEY_LSHIFT, 92, 'z', 'x', 'c', 'v', // 2 - 'b', 'n', 'm', ',', '.', '/', KEY_RSHIFT, '*', - KEY_RALT, ' ', 0, KEY_F1, KEY_F2, KEY_F3, KEY_F4, KEY_F5, // 3 - KEY_F6, KEY_F7, KEY_F8, KEY_F9, KEY_F10, 0, 0, KEY_HOME, - KEY_UPARROW, KEY_PGUP, '-', KEY_LEFTARROW, '5', KEY_RIGHTARROW, '+', KEY_END, //4 - KEY_DOWNARROW, KEY_PGDN, KEY_INS, KEY_DEL, 0, 0, 0, KEY_F11, - KEY_F12, 0, 0, 0, 0, 0, 0, 0, // 5 - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, // 6 - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0 // 7 -}; - -//========================================================================== - -//-------------------------------------------------------------------------- -// -// FUNC I_GetTime -// -// Returns time in 1/35th second tics. -// -//-------------------------------------------------------------------------- - -int I_GetTime(void) -{ -#ifdef NOTIMER - ticcount++; -#endif - return (ticcount); -} - -//-------------------------------------------------------------------------- -// -// PROC I_ColorBorder -// -//-------------------------------------------------------------------------- - -/* -void I_ColorBorder(void) -{ - int i; - - I_WaitVBL(1); - _outbyte(PEL_WRITE_ADR, 0); - for(i = 0; i < 3; i++) - { - _outbyte(PEL_DATA, 63); - } -} -*/ - -//-------------------------------------------------------------------------- -// -// PROC I_UnColorBorder -// -//-------------------------------------------------------------------------- - -/* -void I_UnColorBorder(void) -{ - int i; - - I_WaitVBL(1); - _outbyte(PEL_WRITE_ADR, 0); - for(i = 0; i < 3; i++) - { - _outbyte(PEL_DATA, 0); - } -} -*/ - -/* -============================================================================ - - USER INPUT - -============================================================================ -*/ - -//-------------------------------------------------------------------------- -// -// PROC I_WaitVBL -// -//-------------------------------------------------------------------------- - -void I_WaitVBL(int vbls) -{ - int stat; - - if (novideo) - { - return; - } - while (vbls--) - { - do - { - stat = inp(STATUS_REGISTER_1); - if (stat & 8) - { - break; - } - } - while (1); - do - { - stat = inp(STATUS_REGISTER_1); - if ((stat & 8) == 0) - { - break; - } - } - while (1); - } -} - -//-------------------------------------------------------------------------- -// -// PROC I_SetPalette -// -// Palette source must use 8 bit RGB elements. -// -//-------------------------------------------------------------------------- - -void I_SetPalette(byte * palette) -{ - int i; - - if (novideo) - { - return; - } - I_WaitVBL(1); - _outbyte(PEL_WRITE_ADR, 0); - for (i = 0; i < 768; i++) - { - _outbyte(PEL_DATA, (gammatable[usegamma][*palette++]) >> 2); - } -} - -/* -============================================================================ - - GRAPHICS MODE - -============================================================================ -*/ - -byte *pcscreen, *destscreen, *destview; - - -/* -============== -= -= I_Update -= -============== -*/ - -int UpdateState; -extern int screenblocks; - -void I_Update(void) -{ - int i; - byte *dest; - int tics; - static int lasttic; - -// -// blit screen to video -// - if (DisplayTicker) - { - if (screenblocks > 9 || UpdateState & (I_FULLSCRN | I_MESSAGES)) - { - dest = (byte *) screen; - } - else - { - dest = (byte *) pcscreen; - } - tics = ticcount - lasttic; - lasttic = ticcount; - if (tics > 20) - { - tics = 20; - } - for (i = 0; i < tics; i++) - { - *dest = 0xff; - dest += 2; - } - for (i = tics; i < 20; i++) - { - *dest = 0x00; - dest += 2; - } - } - - //memset(pcscreen, 255, SCREENHEIGHT*SCREENWIDTH); - - if (UpdateState == I_NOUPDATE) - { - return; - } - if (UpdateState & I_FULLSCRN) - { - memcpy(pcscreen, screen, SCREENWIDTH * SCREENHEIGHT); - UpdateState = I_NOUPDATE; // clear out all draw types - } - if (UpdateState & I_FULLVIEW) - { - if (UpdateState & I_MESSAGES && screenblocks > 7) - { - for (i = 0; i < - (viewwindowy + viewheight) * SCREENWIDTH; i += SCREENWIDTH) - { - memcpy(pcscreen + i, screen + i, SCREENWIDTH); - } - UpdateState &= ~(I_FULLVIEW | I_MESSAGES); - } - else - { - for (i = viewwindowy * SCREENWIDTH + viewwindowx; i < - (viewwindowy + viewheight) * SCREENWIDTH; i += SCREENWIDTH) - { - memcpy(pcscreen + i, screen + i, viewwidth); - } - UpdateState &= ~I_FULLVIEW; - } - } - if (UpdateState & I_STATBAR) - { - memcpy(pcscreen + SCREENWIDTH * (SCREENHEIGHT - SBARHEIGHT), - screen + SCREENWIDTH * (SCREENHEIGHT - SBARHEIGHT), - SCREENWIDTH * SBARHEIGHT); - UpdateState &= ~I_STATBAR; - } - if (UpdateState & I_MESSAGES) - { - memcpy(pcscreen, screen, SCREENWIDTH * 28); - UpdateState &= ~I_MESSAGES; - } - - -// memcpy(pcscreen, screen, SCREENHEIGHT*SCREENWIDTH); -} - -//-------------------------------------------------------------------------- -// -// PROC I_InitGraphics -// -//-------------------------------------------------------------------------- - -void I_InitGraphics(void) -{ - if (novideo) - { - return; - } - //grmode = true; - regs.w.ax = 0x13; - int386(0x10, (const union REGS *) ®s, ®s); - pcscreen = destscreen = (byte *) 0xa0000; - I_SetPalette(W_CacheLumpName("PLAYPAL", PU_CACHE)); -} - -//-------------------------------------------------------------------------- -// -// PROC I_ShutdownGraphics -// -//-------------------------------------------------------------------------- - -void I_ShutdownGraphics(void) -{ - byte mode; - - // don't reset mode if it didn't get set - mode = *(byte *) 0x449; - if (mode == 0x12 || mode == 0x13) - { - regs.w.ax = 3; - int386(0x10, ®s, ®s); // back to text mode - } -} - -//-------------------------------------------------------------------------- -// -// PROC I_ReadScreen -// -// Reads the screen currently displayed into a linear buffer. -// -//-------------------------------------------------------------------------- - -/* -void I_ReadScreen(byte *scr) -{ - memcpy(scr, screen, SCREENWIDTH*SCREENHEIGHT); -} -*/ - -//=========================================================================== - -/* -=================== -= -= I_StartTic -= -// called by D_DoomLoop -// called before processing each tic in a frame -// can call D_PostEvent -// asyncronous interrupt functions should maintain private ques that are -// read by the syncronous functions to be converted into events -=================== -*/ - -/* - OLD STARTTIC STUFF - -void I_StartTic (void) -{ - int k; - event_t ev; - - - I_ReadMouse (); - -// -// keyboard events -// - while (kbdtail < kbdhead) - { - k = keyboardque[kbdtail&(KBDQUESIZE-1)]; - -// if (k==14) -// I_Error ("exited"); - - kbdtail++; - - // extended keyboard shift key bullshit - if ( (k&0x7f)==KEY_RSHIFT ) - { - if ( keyboardque[(kbdtail-2)&(KBDQUESIZE-1)]==0xe0 ) - continue; - k &= 0x80; - k |= KEY_RSHIFT; - } - - if (k==0xe0) - continue; // special / pause keys - if (keyboardque[(kbdtail-2)&(KBDQUESIZE-1)] == 0xe1) - continue; // pause key bullshit - - if (k==0xc5 && keyboardque[(kbdtail-2)&(KBDQUESIZE-1)] == 0x9d) - { - ev.type = ev_keydown; - ev.data1 = KEY_PAUSE; - D_PostEvent (&ev); - continue; - } - - if (k&0x80) - ev.type = ev_keyup; - else - ev.type = ev_keydown; - k &= 0x7f; - - ev.data1 = k; - //ev.data1 = scantokey[k]; - - D_PostEvent (&ev); - } -} -*/ - -#define SC_UPARROW 0x48 -#define SC_DOWNARROW 0x50 -#define SC_LEFTARROW 0x4b -#define SC_RIGHTARROW 0x4d - -void I_StartTic(void) -{ - int k; - event_t ev; - - - I_ReadMouse(); - -// -// keyboard events -// - while (kbdtail < kbdhead) - { - k = keyboardque[kbdtail & (KBDQUESIZE - 1)]; - kbdtail++; - - // extended keyboard shift key bullshit - if ((k & 0x7f) == SC_LSHIFT || (k & 0x7f) == SC_RSHIFT) - { - if (keyboardque[(kbdtail - 2) & (KBDQUESIZE - 1)] == 0xe0) - continue; - k &= 0x80; - k |= SC_RSHIFT; - } - - if (k == 0xe0) - continue; // special / pause keys - if (keyboardque[(kbdtail - 2) & (KBDQUESIZE - 1)] == 0xe1) - continue; // pause key bullshit - - if (k == 0xc5 - && keyboardque[(kbdtail - 2) & (KBDQUESIZE - 1)] == 0x9d) - { - ev.type = ev_keydown; - ev.data1 = KEY_PAUSE; - H2_PostEvent(&ev); - continue; - } - - if (k & 0x80) - ev.type = ev_keyup; - else - ev.type = ev_keydown; - k &= 0x7f; - switch (k) - { - case SC_UPARROW: - ev.data1 = KEY_UPARROW; - break; - case SC_DOWNARROW: - ev.data1 = KEY_DOWNARROW; - break; - case SC_LEFTARROW: - ev.data1 = KEY_LEFTARROW; - break; - case SC_RIGHTARROW: - ev.data1 = KEY_RIGHTARROW; - break; - default: - ev.data1 = scantokey[k]; - break; - } - H2_PostEvent(&ev); - } - -} - - -/* -void I_ReadKeys (void) -{ - int k; - - - while (1) - { - while (kbdtail < kbdhead) - { - k = keyboardque[kbdtail&(KBDQUESIZE-1)]; - kbdtail++; - printf ("0x%x\n",k); - if (k == 1) - I_Quit (); - } - } -} -*/ - -/* -=============== -= -= I_StartFrame -= -=============== -*/ - -void I_StartFrame(void) -{ - I_JoystickEvents(); - if (useexterndriver) - { - DPMIInt(i_Vector); - } -} - -/* -============================================================================ - - TIMER INTERRUPT - -============================================================================ -*/ - -/* -void I_ColorBlack (int r, int g, int b) -{ -_outbyte (PEL_WRITE_ADR,0); -_outbyte(PEL_DATA,r); -_outbyte(PEL_DATA,g); -_outbyte(PEL_DATA,b); -} -*/ - - -/* -================ -= -= I_TimerISR -= -================ -*/ - -int I_TimerISR(void) -{ - ticcount++; - return 0; -} - -/* -============================================================================ - - KEYBOARD - -============================================================================ -*/ - -void (__interrupt __far * oldkeyboardisr) () = NULL; - -int lastpress; - -/* -================ -= -= I_KeyboardISR -= -================ -*/ - -void __interrupt I_KeyboardISR(void) -{ -// Get the scan code - - keyboardque[kbdhead & (KBDQUESIZE - 1)] = lastpress = _inbyte(0x60); - kbdhead++; - -// acknowledge the interrupt - - _outbyte(0x20, 0x20); -} - - - -/* -=============== -= -= I_StartupKeyboard -= -=============== -*/ - -void I_StartupKeyboard(void) -{ -#ifndef NOKBD - oldkeyboardisr = _dos_getvect(KEYBOARDINT); - _dos_setvect(0x8000 | KEYBOARDINT, I_KeyboardISR); -#endif - -//I_ReadKeys (); -} - - -void I_ShutdownKeyboard(void) -{ - if (oldkeyboardisr) - _dos_setvect(KEYBOARDINT, oldkeyboardisr); - *(short *) 0x41c = *(short *) 0x41a; // clear bios key buffer -} - - - -/* -============================================================================ - - MOUSE - -============================================================================ -*/ - - -int I_ResetMouse(void) -{ - regs.w.ax = 0; // reset - int386(0x33, ®s, ®s); - return regs.w.ax; -} - - - -/* -================ -= -= StartupMouse -= -================ -*/ - -void I_StartupCyberMan(void); - -void I_StartupMouse(void) -{ - // - // General mouse detection - // - mousepresent = 0; - if (M_CheckParm("-nomouse") || !usemouse) - return; - - if (I_ResetMouse() != 0xffff) - { - ST_Message("Mouse: not present\n"); - return; - } - ST_Message("Mouse: detected\n"); - - mousepresent = 1; - - I_StartupCyberMan(); -} - - -/* -================ -= -= ShutdownMouse -= -================ -*/ - -void I_ShutdownMouse(void) -{ - if (!mousepresent) - return; - - I_ResetMouse(); -} - - -/* -================ -= -= I_ReadMouse -= -================ -*/ - -void I_ReadMouse(void) -{ - event_t ev; - -// -// mouse events -// - if (!mousepresent) - return; - - ev.type = ev_mouse; - - memset(&dpmiregs, 0, sizeof(dpmiregs)); - dpmiregs.eax = 3; // read buttons / position - DPMIInt(0x33); - ev.data1 = dpmiregs.ebx; - - dpmiregs.eax = 11; // read counters - DPMIInt(0x33); - ev.data2 = (short) dpmiregs.ecx; - ev.data3 = -(short) dpmiregs.edx; - - H2_PostEvent(&ev); -} - -/* -============================================================================ - - JOYSTICK - -============================================================================ -*/ - -int joyxl, joyxh, joyyl, joyyh; - -boolean WaitJoyButton(void) -{ - int oldbuttons, buttons; - - oldbuttons = 0; - do - { - I_WaitVBL(1); - buttons = ((inp(0x201) >> 4) & 1) ^ 1; - if (buttons != oldbuttons) - { - oldbuttons = buttons; - continue; - } - - if ((lastpress & 0x7f) == 1) - { - joystickpresent = false; - return false; - } - } - while (!buttons); - - do - { - I_WaitVBL(1); - buttons = ((inp(0x201) >> 4) & 1) ^ 1; - if (buttons != oldbuttons) - { - oldbuttons = buttons; - continue; - } - - if ((lastpress & 0x7f) == 1) - { - joystickpresent = false; - return false; - } - } - while (buttons); - - return true; -} - - - -/* -=============== -= -= I_StartupJoystick -= -=============== -*/ - -int basejoyx, basejoyy; - -void I_StartupJoystick(void) -{ - int centerx, centery; - - joystickpresent = 0; - if (M_CheckParm("-nojoy") || !usejoystick) - return; - - if (!I_ReadJoystick()) - { - joystickpresent = false; - ST_Message("joystick not found\n "); - return; - } - ST_Message("joystick found\n"); - joystickpresent = true; - - ST_RealMessage("CENTER the joystick and press button 1:"); - if (!WaitJoyButton()) - return; - I_ReadJoystick(); - centerx = joystickx; - centery = joysticky; - - ST_RealMessage - ("\nPush the joystick to the UPPER LEFT corner and press button 1:"); - if (!WaitJoyButton()) - return; - I_ReadJoystick(); - joyxl = (centerx + joystickx) / 2; - joyyl = (centerx + joysticky) / 2; - - ST_RealMessage - ("\nPush the joystick to the LOWER RIGHT corner and press button 1:"); - if (!WaitJoyButton()) - return; - I_ReadJoystick(); - joyxh = (centerx + joystickx) / 2; - joyyh = (centery + joysticky) / 2; - ST_RealMessage("\n"); -} - -/* -=============== -= -= I_JoystickEvents -= -=============== -*/ - -void I_JoystickEvents(void) -{ - event_t ev; - -// -// joystick events -// - if (!joystickpresent) - return; - - I_ReadJoystick(); - ev.type = ev_joystick; - ev.data1 = ((inp(0x201) >> 4) & 15) ^ 15; - - if (joystickx < joyxl) - ev.data2 = -1; - else if (joystickx > joyxh) - ev.data2 = 1; - else - ev.data2 = 0; - if (joysticky < joyyl) - ev.data3 = -1; - else if (joysticky > joyyh) - ev.data3 = 1; - else - ev.data3 = 0; - - H2_PostEvent(&ev); -} - - - -/* -============================================================================ - - DPMI STUFF - -============================================================================ -*/ - -#define REALSTACKSIZE 1024 - -dpmiregs_t dpmiregs; - -unsigned realstackseg; - -void I_DivException(void); -int I_SetDivException(void); - -/* -void DPMIFarCall (void) -{ - segread (&segregs); - regs.w.ax = 0x301; - regs.w.bx = 0; - regs.w.cx = 0; - regs.x.edi = (unsigned)&dpmiregs; - segregs.es = segregs.ds; - int386x( DPMI_INT, ®s, ®s, &segregs ); -} -*/ - -void DPMIInt(int i) -{ - dpmiregs.ss = realstackseg; - dpmiregs.sp = REALSTACKSIZE - 4; - - segread(&segregs); - regs.w.ax = 0x300; - regs.w.bx = i; - regs.w.cx = 0; - regs.x.edi = (unsigned) &dpmiregs; - segregs.es = segregs.ds; - int386x(DPMI_INT, ®s, ®s, &segregs); -} - - -/* -============== -= -= I_StartupDPMI -= -============== -*/ - -void I_StartupDPMI(void) -{ -// extern char __begtext; -// extern char ___argc; -// int n,d; - -// -// allocate a decent stack for real mode ISRs -// - realstackseg = (int) I_AllocLow(1024) >> 4; - -// -// lock the entire program down -// - -// _dpmi_lockregion (&__begtext, &___argc - &__begtext); - - -// -// catch divide by 0 exception -// -#if 0 - segread(&segregs); - regs.w.ax = 0x0203; // DPMI set processor exception handler vector - regs.w.bx = 0; // int 0 - regs.w.cx = segregs.cs; - regs.x.edx = (int) &I_DivException; - printf("%x : %x\n", regs.w.cx, regs.x.edx); - int386(DPMI_INT, ®s, ®s); -#endif - -#if 0 - n = I_SetDivException(); - printf("return: %i\n", n); - n = 100; - d = 0; - printf("100 / 0 = %i\n", n / d); - - exit(1); -#endif -} - - - -/* -============================================================================ - - TIMER INTERRUPT - -============================================================================ -*/ - -void (__interrupt __far * oldtimerisr) (); - - -/* -void IO_ColorBlack (int r, int g, int b) -{ -_outbyte (PEL_WRITE_ADR,0); -_outbyte(PEL_DATA,r); -_outbyte(PEL_DATA,g); -_outbyte(PEL_DATA,b); -} -*/ - - -/* -================ -= -= IO_TimerISR -= -================ -*/ - -//void __interrupt IO_TimerISR (void) - -void __interrupt __far IO_TimerISR(void) -{ - ticcount++; - _outbyte(0x20, 0x20); // Ack the interrupt -} - -/* -===================== -= -= IO_SetTimer0 -= -= Sets system timer 0 to the specified speed -= -===================== -*/ - -void IO_SetTimer0(int speed) -{ - if (speed > 0 && speed < 150) - I_Error("INT_SetTimer0: %i is a bad value", speed); - - _outbyte(0x43, 0x36); // Change timer 0 - _outbyte(0x40, speed); - _outbyte(0x40, speed >> 8); -} - - - -/* -=============== -= -= IO_StartupTimer -= -=============== -*/ - -/* -void IO_StartupTimer (void) -{ - oldtimerisr = _dos_getvect(TIMERINT); - - _dos_setvect (0x8000 | TIMERINT, IO_TimerISR); - IO_SetTimer0 (VBLCOUNTER); -} -*/ - -void IO_ShutdownTimer(void) -{ - if (oldtimerisr) - { - IO_SetTimer0(0); // back to 18.4 ips - _dos_setvect(TIMERINT, oldtimerisr); - } -} - -//=========================================================================== - - -/* -=============== -= -= I_Init -= -= hook interrupts and set graphics mode -= -=============== -*/ - -void I_Init(void) -{ - extern void I_StartupTimer(void); - - novideo = M_CheckParm("novideo"); - ST_Message(" I_StartupDPMI\n"); - I_StartupDPMI(); - ST_Message(" I_StartupMouse "); - I_StartupMouse(); -// tprintf("I_StartupJoystick ",1); -// I_StartupJoystick(); -// tprintf("I_StartupKeyboard ",1); -// I_StartupKeyboard(); - ST_Message(" S_Init... "); - S_Init(); - //IO_StartupTimer(); - S_Start(); -} - - -/* -=============== -= -= I_Shutdown -= -= return to default system state -= -=============== -*/ - -void I_Shutdown(void) -{ - I_ShutdownGraphics(); - IO_ShutdownTimer(); - S_ShutDown(); - I_ShutdownMouse(); - I_ShutdownKeyboard(); - - IO_SetTimer0(0); -} - - -/* -================ -= -= I_Error -= -================ -*/ - -void I_Error(char *error, ...) -{ - union REGS regs; - - va_list argptr; - - D_QuitNetGame(); - I_Shutdown(); - va_start(argptr, error); - regs.x.eax = 0x3; - int386(0x10, ®s, ®s); - vprintf(error, argptr); - va_end(argptr); - printf("\n"); - exit(1); -} - -//-------------------------------------------------------------------------- -// -// I_Quit -// -// Shuts down net game, saves defaults, prints the exit text message, -// goes to text mode, and exits. -// -//-------------------------------------------------------------------------- - -void I_Quit(void) -{ - D_QuitNetGame(); - M_SaveDefaults(); - I_Shutdown(); - -// scr = (byte *)W_CacheLumpName("ENDTEXT", PU_CACHE); -/* - memcpy((void *)0xb8000, scr, 80*25*2); - regs.w.ax = 0x0200; - regs.h.bh = 0; - regs.h.dl = 0; - regs.h.dh = 23; - int386(0x10, (const union REGS *)®s, ®s); // Set text pos - _settextposition(24, 1); -*/ - printf("\nHexen: Beyond Heretic\n"); - exit(0); -} - -/* -=============== -= -= I_ZoneBase -= -=============== -*/ - -byte *I_ZoneBase(int *size) -{ - int meminfo[32]; - int heap; - byte *ptr; - - memset(meminfo, 0, sizeof(meminfo)); - segread(&segregs); - segregs.es = segregs.ds; - regs.w.ax = 0x500; // get memory info - regs.x.edi = (int) &meminfo; - int386x(0x31, ®s, ®s, &segregs); - - heap = meminfo[0]; - ST_Message(" DPMI memory: 0x%x, ", heap); - ST_Message("Maxzone: 0x%x\n", maxzone); - - do - { - heap -= 0x10000; // leave 64k alone - if (heap > maxzone) - heap = maxzone; - ptr = malloc(heap); - } - while (!ptr); - - ST_Message(" 0x%x allocated for zone, ", heap); - ST_Message("ZoneBase: 0x%X\n", (int) ptr); - - if (heap < 0x180000) - I_Error(" Insufficient DPMI memory!"); -#if 0 - regs.w.ax = 0x501; // allocate linear block - regs.w.bx = heap >> 16; - regs.w.cx = heap & 0xffff; - int386(0x31, ®s, ®s); - if (regs.w.cflag) - I_Error(" Couldn't allocate DPMI memory!"); - - block = (regs.w.si << 16) + regs.w.di; -#endif - - *size = heap; - return ptr; -} - -/* -============= -= -= I_AllocLow -= -============= -*/ - -byte *I_AllocLow(int length) -{ - byte *mem; - - // DPMI call 100h allocates DOS memory - segread(&segregs); - regs.w.ax = 0x0100; // DPMI allocate DOS memory - regs.w.bx = (length + 15) / 16; - int386(DPMI_INT, ®s, ®s); -// segment = regs.w.ax; -// selector = regs.w.dx; - if (regs.w.cflag != 0) - I_Error("I_AllocLow: DOS alloc of %i failed, %i free", - length, regs.w.bx * 16); - - - mem = (void *) ((regs.x.eax & 0xFFFF) << 4); - - memset(mem, 0, length); - return mem; -} - -/* -============================================================================ - - NETWORKING - -============================================================================ -*/ - -/* // FUCKED LINES -typedef struct -{ - char priv[508]; - } doomdata_t; -*/// FUCKED LINES - -#define DOOMCOM_ID 0x12345678l - -/* // FUCKED LINES -typedef struct -{ - long id; - short intnum; // DOOM executes an int to execute commands - -// communication between DOOM and the driver - short command; // CMD_SEND or CMD_GET - short remotenode; // dest for send, set by get (-1 = no packet) - short datalength; // bytes in doomdata to be sent - -// info common to all nodes - short numnodes; // console is allways node 0 - short ticdup; // 1 = no duplication, 2-5 = dup for slow nets - short extratics; // 1 = send a backup tic in every packet - short deathmatch; // 1 = deathmatch - short savegame; // -1 = new game, 0-5 = load savegame - short episode; // 1-3 - short map; // 1-9 - short skill; // 1-5 - -// info specific to this node - short consoleplayer; - short numplayers; - short angleoffset; // 1 = left, 0 = center, -1 = right - short drone; // 1 = drone - -// packet data to be sent - doomdata_t data; - } doomcom_t; -*/// FUCKED LINES - -extern doomcom_t *doomcom; - -/* -==================== -= -= I_InitNetwork -= -==================== -*/ - -void I_InitNetwork(void) -{ - int i; - - i = M_CheckParm("-net"); - if (!i) - { - // - // single player game - // - doomcom = malloc(sizeof(*doomcom)); - memset(doomcom, 0, sizeof(*doomcom)); - netgame = false; - doomcom->id = DOOMCOM_ID; - doomcom->numplayers = doomcom->numnodes = 1; - doomcom->deathmatch = false; - doomcom->consoleplayer = 0; - doomcom->ticdup = 1; - doomcom->extratics = 0; - return; - } - - netgame = true; - doomcom = (doomcom_t *) atoi(myargv[i + 1]); -//DEBUG - doomcom->skill = startskill; - doomcom->episode = startepisode; - doomcom->map = startmap; - doomcom->deathmatch = deathmatch; - -} - -void I_NetCmd(void) -{ - if (!netgame) - I_Error("I_NetCmd when not in netgame"); - DPMIInt(doomcom->intnum); -} - -//========================================================================= -// -// I_CheckExternDriver -// -// Checks to see if a vector, and an address for an external driver -// have been passed. -//========================================================================= - -void I_CheckExternDriver(void) -{ - int i; - - if (!(i = M_CheckParm("-externdriver"))) - { - return; - } - i_ExternData = (externdata_t *) atoi(myargv[i + 1]); - i_Vector = i_ExternData->vector; - - useexterndriver = true; -} - -//========================================================================= -//========================================================================= -// Hi-Res (mode 12) stuff -//========================================================================= -//========================================================================= - - -//========================================================================== -// -// SetVideoModeHR - Set video mode to 640x480x16 -// -//========================================================================== - - -void SetVideoModeHR(void) -{ - union REGS regs; - regs.x.eax = 0x12; - int386(VID_INT, ®s, ®s); -} - - -//========================================================================== -// -// ClearScreenHR - Clear the screen to color 0 -// -//========================================================================== - -void ClearScreenHR(void) -{ - BITPLANE(MASK_PLANE0 | MASK_PLANE1 | MASK_PLANE2 | MASK_PLANE3); - memset((char *) 0xa0000, 0, 38400); -} - - -//========================================================================== -// -// SlamHR - copy 4-plane buffer to screen -// -//========================================================================== - -void SlamHR(char *buffer) -{ - BITPLANE(MASK_PLANE0); - memcpy((char *) 0xA0000, buffer + P0OFFSET, 38400); - BITPLANE(MASK_PLANE1); - memcpy((char *) 0xA0000, buffer + P1OFFSET, 38400); - BITPLANE(MASK_PLANE2); - memcpy((char *) 0xA0000, buffer + P2OFFSET, 38400); - BITPLANE(MASK_PLANE3); - memcpy((char *) 0xA0000, buffer + P3OFFSET, 38400); -} - - -//========================================================================== -// -// SlamHR - copy 4-plane buffer to screen -// -// X and Width should be a multiple of 8 -// src should be 4 planes of block size, back to back -//========================================================================== - -void SlamBlockHR(int x, int y, int w, int h, char *src) -{ - int srcwid = w >> 3; - char *dest = ((char *) 0xA0000) + (y * (640 / 8)) + (x >> 3); - char *dst; - int i; - - VB_SYNC; - - BITPLANE(MASK_PLANE0); - dst = dest; - for (i = 0; i < h; i++) - { - memcpy(dst, src, srcwid); - dst += 640 / 8; - src += srcwid; - } - BITPLANE(MASK_PLANE1); - dst = dest; - for (i = 0; i < h; i++) - { - memcpy(dst, src, srcwid); - dst += 640 / 8; - src += srcwid; - } - BITPLANE(MASK_PLANE2); - dst = dest; - for (i = 0; i < h; i++) - { - memcpy(dst, src, srcwid); - dst += 640 / 8; - src += srcwid; - } - BITPLANE(MASK_PLANE3); - dst = dest; - for (i = 0; i < h; i++) - { - memcpy(dst, src, srcwid); - dst += 640 / 8; - src += srcwid; - } -} - -//========================================================================== -// -// InitPaletteHR -// -//========================================================================== - -void InitPaletteHR(void) -{ - int i; - union REGS regs; - - // Set palette registers to point into color registers - for (i = 0; i < 16; i++) - { - regs.x.eax = (0x10 << 8) | 0x00; - regs.x.ebx = (i << 8) | i; - int386(VID_INT, ®s, ®s); - } - -} - - -//========================================================================== -// -// SetPaletteHR - Set the HR palette -// -//========================================================================== - -void SetPaletteHR(byte * palette) -{ - int i; - VB_SYNC; - outp(PEL_WRITE_ADR, 0); - - for (i = 0; i < 16 * 3; i++) - { - outp(PEL_DATA, (*palette++)); - } -} - - -//========================================================================== -// -// GetPaletteHR - Get the HR palette -// -//========================================================================== - -void GetPaletteHR(byte * palette) -{ - int i; - outp(PEL_READ_ADR, 0); - for (i = 0; i < 16 * 3; i++) - { - *palette++ = inp(PEL_DATA); - } -} - - -//========================================================================== -// -// FadeToPaletteHR -// -//========================================================================== - -void FadeToPaletteHR(byte * palette) -{ - int i, j; - int steps = 140; // two-seconds - byte basep[16 * 3]; - byte work[16 * 3]; - int delta; - - GetPaletteHR(basep); - for (i = 0; i < steps; i++) - { - for (j = 0; j < 16 * 3; j++) - { - delta = palette[j] - basep[j]; - work[j] = basep[j] + delta * i / steps; - } - SetPaletteHR(work); - } - SetPaletteHR(palette); -} - - -//========================================================================== -// -// FadeToBlackHR - Fades the palette out to black -// -//========================================================================== - -/* -void FadeToBlackHR(void) -{ - char work[16*3]; - char base[16*3]; - int i,j,steps=70; - - GetPaletteHR(base); - for (i=0; i<steps; i++) - { - for (j=0; j<16*3; j++) - { - work[j] = base[j]-(base[j]*i/steps); - } - VB_SYNC; - SetPaletteHR(work); - } - memset(work,0,16*3); - SetPaletteHR(work); -} -*/ - -//========================================================================== -// -// BlackPaletteHR - Instantly blacks out the palette -// -//========================================================================== - -void BlackPaletteHR(void) -{ - char blackpal[16 * 3]; - - memset(blackpal, 0, 16 * 3); - SetPaletteHR(blackpal); -} - -//========================================================================== -// -// -// I_StartupReadKeys -// -// -//========================================================================== - -void I_StartupReadKeys(void) -{ - int k; - - while (kbdtail < kbdhead) - { - k = keyboardque[kbdtail & (KBDQUESIZE - 1)]; - kbdtail++; - if (k == 1) - I_Quit(); - } -} diff --git a/src/hexen/i_sound.c b/src/hexen/i_sound.c deleted file mode 100644 index e6313bc0..00000000 --- a/src/hexen/i_sound.c +++ /dev/null @@ -1,402 +0,0 @@ -// -// Copyright(C) 1993-1996 Id Software, Inc. -// Copyright(C) 1993-2008 Raven Software -// Copyright(C) 2005-2014 Simon Howard -// -// 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. -// - -// I_SOUND.C - -#include <stdio.h> -#include "h2def.h" -#include "i_system.h" -#include "m_argv.h" -#include "dmx.h" -#include "sounds.h" -#include "i_sound.h" - -/* -=============== -= -= I_StartupTimer -= -=============== -*/ - -int tsm_ID = -1; - -void I_StartupTimer(void) -{ -#ifndef NOTIMER - extern int I_TimerISR(void); - - ST_Message(" I_StartupTimer()\n"); - // installs master timer. Must be done before StartupTimer()! - TSM_Install(SND_TICRATE); - tsm_ID = TSM_NewService(I_TimerISR, 35, 255, 0); // max priority - if (tsm_ID == -1) - { - I_Error("Can't register 35 Hz timer w/ DMX library"); - } -#endif -} - -void I_ShutdownTimer(void) -{ - TSM_DelService(tsm_ID); - TSM_Remove(); -} - -/* - * - * SOUND HEADER & DATA - * - * - */ - -// sound information -#if 0 -const char *dnames[] = { "None", - "PC_Speaker", - "Adlib", - "Sound_Blaster", - "ProAudio_Spectrum16", - "Gravis_Ultrasound", - "MPU", - "AWE32" -}; -#endif - -const char snd_prefixen[] = { 'P', 'P', 'A', 'S', 'S', 'S', 'M', - 'M', 'M', 'S' -}; - -int snd_Channels; -int snd_DesiredMusicDevice, snd_DesiredSfxDevice; -int snd_MusicDevice, // current music card # (index to dmxCodes) - snd_SfxDevice, // current sfx card # (index to dmxCodes) - snd_MaxVolume, // maximum volume for sound - snd_MusicVolume; // maximum volume for music -int dmxCodes[NUM_SCARDS]; // the dmx code for a given card - -int snd_SBport, snd_SBirq, snd_SBdma; // sound blaster variables -int snd_Mport; // midi variables - -extern boolean snd_MusicAvail, // whether music is available - snd_SfxAvail; // whether sfx are available - -void I_PauseSong(int handle) -{ - MUS_PauseSong(handle); -} - -void I_ResumeSong(int handle) -{ - MUS_ResumeSong(handle); -} - -void I_SetMusicVolume(int volume) -{ - MUS_SetMasterVolume(volume * 8); -// snd_MusicVolume = volume; -} - -void I_SetSfxVolume(int volume) -{ - snd_MaxVolume = volume; // THROW AWAY? -} - -/* - * - * SONG API - * - */ - -int I_RegisterSong(void *data) -{ - int rc = MUS_RegisterSong(data); -#ifdef SNDDEBUG - if (rc < 0) - ST_Message(" MUS_Reg() returned %d\n", rc); -#endif - return rc; -} - -void I_UnRegisterSong(int handle) -{ - int rc = MUS_UnregisterSong(handle); -#ifdef SNDDEBUG - if (rc < 0) - ST_Message(" MUS_Unreg() returned %d\n", rc); -#endif -} - -int I_QrySongPlaying(int handle) -{ - int rc = MUS_QrySongPlaying(handle); -#ifdef SNDDEBUG - if (rc < 0) - ST_Message(" MUS_QrySP() returned %d\n", rc); -#endif - return rc; -} - -// Stops a song. MUST be called before I_UnregisterSong(). - -void I_StopSong(int handle) -{ - int rc; - rc = MUS_StopSong(handle); -#ifdef SNDDEBUG - if (rc < 0) - ST_Message(" MUS_StopSong() returned %d\n", rc); -#endif -/* - // Fucking kluge pause - { - int s; - extern volatile int ticcount; - for (s=ticcount ; ticcount - s < 10 ; ); - } -*/ -} - -void I_PlaySong(int handle, boolean looping) -{ - int rc; - rc = MUS_ChainSong(handle, looping ? handle : -1); -#ifdef SNDDEBUG - if (rc < 0) - ST_Message(" MUS_ChainSong() returned %d\n", rc); -#endif - rc = MUS_PlaySong(handle, snd_MusicVolume); -#ifdef SNDDEBUG - if (rc < 0) - ST_Message(" MUS_PlaySong() returned %d\n", rc); -#endif - -} - -/* - * - * SOUND FX API - * - */ - -// Gets lump nums of the named sound. Returns pointer which will be -// passed to I_StartSound() when you want to start an SFX. Must be -// sure to pass this to UngetSoundEffect() so that they can be -// freed! - - -int I_GetSfxLumpNum(sfxinfo_t * sound) -{ - return W_GetNumForName(sound->lumpname); - -} - -int I_StartSound(int id, void *data, int vol, int sep, int pitch, - int priority) -{ - return SFX_PlayPatch(data, pitch, sep, vol, 0, 0); -} - -void I_StopSound(int handle) -{ -// extern volatile long gDmaCount; -// long waittocount; - SFX_StopPatch(handle); -// waittocount = gDmaCount + 2; -// while (gDmaCount < waittocount) ; -} - -int I_SoundIsPlaying(int handle) -{ - return SFX_Playing(handle); -} - -void I_UpdateSoundParams(int handle, int vol, int sep, int pitch) -{ - SFX_SetOrigin(handle, pitch, sep, vol); -} - -/* - * - * SOUND STARTUP STUFF - * - * - */ - -// -// Why PC's Suck, Reason #8712 -// - -void I_sndArbitrateCards(void) -{ - char tmp[160]; - boolean gus, adlib, pc, sb, midi; - int i, rc, mputype, p, opltype, wait, dmxlump; - - snd_MusicDevice = snd_DesiredMusicDevice; - snd_SfxDevice = snd_DesiredSfxDevice; - - // check command-line parameters- overrides config file - // - if (M_CheckParm("-nosound")) - snd_MusicDevice = snd_SfxDevice = snd_none; - if (M_CheckParm("-nosfx")) - snd_SfxDevice = snd_none; - if (M_CheckParm("-nomusic")) - snd_MusicDevice = snd_none; - - if (snd_MusicDevice > snd_MPU && snd_MusicDevice <= snd_MPU3) - snd_MusicDevice = snd_MPU; - if (snd_MusicDevice == snd_SB) - snd_MusicDevice = snd_Adlib; - if (snd_MusicDevice == snd_PAS) - snd_MusicDevice = snd_Adlib; - - // figure out what i've got to initialize - // - gus = snd_MusicDevice == snd_GUS || snd_SfxDevice == snd_GUS; - sb = snd_SfxDevice == snd_SB || snd_MusicDevice == snd_SB; - adlib = snd_MusicDevice == snd_Adlib; - pc = snd_SfxDevice == snd_PC; - midi = snd_MusicDevice == snd_MPU; - - // initialize whatever i've got - // - if (gus) - { - if (GF1_Detect()) - ST_Message(" Dude. The GUS ain't responding.\n"); - else - { - dmxlump = W_GetNumForName("dmxgus"); - GF1_SetMap(W_CacheLumpNum(dmxlump, PU_CACHE), - lumpinfo[dmxlump].size); - } - - } - if (sb) - { - if (debugmode) - { - ST_Message(" Sound cfg p=0x%x, i=%d, d=%d\n", - snd_SBport, snd_SBirq, snd_SBdma); - } - if (SB_Detect(&snd_SBport, &snd_SBirq, &snd_SBdma, 0)) - { - ST_Message(" SB isn't responding at p=0x%x, i=%d, d=%d\n", - snd_SBport, snd_SBirq, snd_SBdma); - } - else - SB_SetCard(snd_SBport, snd_SBirq, snd_SBdma); - - if (debugmode) - { - ST_Message(" SB_Detect returned p=0x%x, i=%d, d=%d\n", - snd_SBport, snd_SBirq, snd_SBdma); - } - } - - if (adlib) - { - if (AL_Detect(&wait, 0)) - { - ST_Message(" Dude. The Adlib isn't responding.\n"); - } - else - { - AL_SetCard(wait, W_CacheLumpName("genmidi", PU_STATIC)); - } - } - - if (midi) - { - if (debugmode) - { - ST_Message(" cfg p=0x%x\n", snd_Mport); - } - - if (MPU_Detect(&snd_Mport, &i)) - { - ST_Message(" The MPU-401 isn't reponding @ p=0x%x.\n", - snd_Mport); - } - else - MPU_SetCard(snd_Mport); - } - -} - -// inits all sound stuff - -void I_StartupSound(void) -{ - int rc, i; - - if (debugmode) - ST_Message("I_StartupSound: Hope you hear a pop.\n"); - - // initialize dmxCodes[] - dmxCodes[0] = 0; - dmxCodes[snd_PC] = AHW_PC_SPEAKER; - dmxCodes[snd_Adlib] = AHW_ADLIB; - dmxCodes[snd_SB] = AHW_SOUND_BLASTER; - dmxCodes[snd_PAS] = AHW_MEDIA_VISION; - dmxCodes[snd_GUS] = AHW_ULTRA_SOUND; - dmxCodes[snd_MPU] = AHW_MPU_401; - dmxCodes[snd_MPU2] = AHW_MPU_401; - dmxCodes[snd_MPU3] = AHW_MPU_401; - dmxCodes[snd_AWE] = AHW_AWE32; - dmxCodes[snd_CDMUSIC] = 0; - - // inits sound library timer stuff - I_StartupTimer(); - - // pick the sound cards i'm going to use - // - I_sndArbitrateCards(); - - if (debugmode) - { - ST_Message(" Music device #%d & dmxCode=%d,", snd_MusicDevice, - dmxCodes[snd_MusicDevice]); - ST_Message(" Sfx device #%d & dmxCode=%d\n", snd_SfxDevice, - dmxCodes[snd_SfxDevice]); - } - - // inits DMX sound library - ST_Message(" Calling DMX_Init..."); - rc = DMX_Init(SND_TICRATE, SND_MAXSONGS, dmxCodes[snd_MusicDevice], - dmxCodes[snd_SfxDevice]); - - if (debugmode) - { - ST_Message(" DMX_Init() returned %d\n", rc); - } - -} - -// shuts down all sound stuff - -void I_ShutdownSound(void) -{ - DMX_DeInit(); - I_ShutdownTimer(); -} - -void I_SetChannels(int channels) -{ - WAV_PlayMode(channels, SND_SAMPLERATE); -} diff --git a/src/hexen/in_lude.c b/src/hexen/in_lude.c index daabf497..7b137006 100644 --- a/src/hexen/in_lude.c +++ b/src/hexen/in_lude.c @@ -106,7 +106,7 @@ void IN_Start(void) skipintermission = false; intertime = 0; AM_Stop(); - for (i = 0; i < MAXPLAYERS; i++) + for (i = 0; i < maxplayers; i++) { players[i].messageTics = 0; players[i].message[0] = 0; @@ -208,13 +208,13 @@ static void InitStats(void) posnum = 0; playercount = 0; slaughtercount = 0; - for (i = 0; i < MAXPLAYERS; i++) + for (i = 0; i < maxplayers; i++) { totalFrags[i] = 0; if (playeringame[i]) { playercount++; - for (j = 0; j < MAXPLAYERS; j++) + for (j = 0; j < maxplayers; j++) { if (playeringame[j]) { @@ -338,7 +338,7 @@ static void CheckForSkip(void) player_t *player; static boolean triedToSkip; - for (i = 0, player = players; i < MAXPLAYERS; i++, player++) + for (i = 0, player = players; i < maxplayers; i++, player++) { if (playeringame[i]) { @@ -478,10 +478,10 @@ static void DrDeathTally(void) S_StartSound(NULL, SFX_PLATFORM_STOP); } y = yPos >> FRACBITS; - for (i = 0; i < MAXPLAYERS; i++) + for (i = 0; i < maxplayers; i++) { xPos = xStart; - for (j = 0; j < MAXPLAYERS; j++, xPos += xDelta) + for (j = 0; j < maxplayers; j++, xPos += xDelta) { x = xPos >> FRACBITS; bold = (i == consoleplayer || j == consoleplayer); diff --git a/src/hexen/m_misc.c b/src/hexen/m_misc.c deleted file mode 100644 index 3e0c63a7..00000000 --- a/src/hexen/m_misc.c +++ /dev/null @@ -1,21 +0,0 @@ -// -// Copyright(C) 1993-1996 Id Software, Inc. -// Copyright(C) 1993-2008 Raven Software -// Copyright(C) 2005-2014 Simon Howard -// -// 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. -// - - -// HEADER FILES ------------------------------------------------------------ - -#include "h2def.h" - diff --git a/src/hexen/mn_menu.c b/src/hexen/mn_menu.c index ff573317..15170279 100644 --- a/src/hexen/mn_menu.c +++ b/src/hexen/mn_menu.c @@ -1190,11 +1190,13 @@ boolean MN_Responder(event_t * event) if (InfoType) { + /* The 4-Level Demo Version also has 3 Info pages if (gamemode == shareware) { InfoType = (InfoType + 1) % 5; } else + */ { InfoType = (InfoType + 1) % 4; } diff --git a/src/hexen/p_acs.c b/src/hexen/p_acs.c index b9fd8f08..b7a63fe9 100644 --- a/src/hexen/p_acs.c +++ b/src/hexen/p_acs.c @@ -1681,7 +1681,7 @@ static int CmdEndPrintBold(void) { int i; - for (i = 0; i < MAXPLAYERS; i++) + for (i = 0; i < maxplayers; i++) { if (playeringame[i]) { @@ -1722,7 +1722,7 @@ static int CmdPlayerCount(void) int count; count = 0; - for (i = 0; i < MAXPLAYERS; i++) + for (i = 0; i < maxplayers; i++) { count += playeringame[i]; } diff --git a/src/hexen/p_enemy.c b/src/hexen/p_enemy.c index 18cc79eb..38f3a2b5 100644 --- a/src/hexen/p_enemy.c +++ b/src/hexen/p_enemy.c @@ -546,8 +546,8 @@ boolean P_LookForPlayers(mobj_t * actor, boolean allaround) // stop = (actor->lastlook - 1) & 3; // for (;; actor->lastlook = (actor->lastlook + 1) & 3) - stop = (actor->lastlook + MAXPLAYERS - 1) % MAXPLAYERS; - for (;; actor->lastlook = (actor->lastlook + 1) % MAXPLAYERS) + stop = (actor->lastlook + maxplayers - 1) % maxplayers; + for (;; actor->lastlook = (actor->lastlook + 1) % maxplayers) { if (!playeringame[actor->lastlook]) continue; @@ -1179,7 +1179,7 @@ void A_MinotaurLook(mobj_t * actor) actor->target = NULL; if (deathmatch) // Quick search for players { - for (i = 0; i < MAXPLAYERS; i++) + for (i = 0; i < maxplayers; i++) { if (!playeringame[i]) continue; @@ -3855,7 +3855,7 @@ void A_IceGuyDie(mobj_t * actor) void A_IceGuyMissileExplode(mobj_t * actor) { mobj_t *mo; - int i; + unsigned int i; for (i = 0; i < 8; i++) { diff --git a/src/hexen/p_inter.c b/src/hexen/p_inter.c index 587614ff..4f1ecda8 100644 --- a/src/hexen/p_inter.c +++ b/src/hexen/p_inter.c @@ -747,6 +747,12 @@ static void TryPickupArtifact(player_t * player, artitype_t artifactType, TXT_ARTIPUZZGEAR }; + if (gamemode == shareware) + { + artifactMessages[arti_blastradius] = TXT_ARTITELEPORT; + artifactMessages[arti_teleport] = TXT_ARTIBLASTRADIUS; + } + if (P_GiveArtifact(player, artifactType, artifact)) { if (artifact->special) diff --git a/src/hexen/p_mobj.c b/src/hexen/p_mobj.c index 98f81984..b868da8c 100644 --- a/src/hexen/p_mobj.c +++ b/src/hexen/p_mobj.c @@ -1190,7 +1190,7 @@ mobj_t *P_SpawnMobj(fixed_t x, fixed_t y, fixed_t z, mobjtype_t type) { mobj->reactiontime = info->reactiontime; } - mobj->lastlook = P_Random() % MAXPLAYERS; + mobj->lastlook = P_Random() % maxplayers; // Set the state, but do not use P_SetMobjState, because action // routines can't be called yet. If the spawnstate has an action @@ -1295,7 +1295,7 @@ void P_SpawnPlayer(mapthing_t * mthing) fixed_t x, y, z; mobj_t *mobj; - if (mthing->type - 1 >= MAXPLAYERS || !playeringame[mthing->type - 1]) + if (mthing->type - 1 >= maxplayers || !playeringame[mthing->type - 1]) { // Not playing return; } @@ -1500,7 +1500,7 @@ void P_SpawnMapThing(mapthing_t * mthing) else if (deathmatch == false) { // Cooperative spawnMask = 0; - for (i = 0; i < MAXPLAYERS; i++) + for (i = 0; i < maxplayers; i++) { if (playeringame[i]) { diff --git a/src/hexen/p_setup.c b/src/hexen/p_setup.c index 1ff6cef5..f24fb34e 100644 --- a/src/hexen/p_setup.c +++ b/src/hexen/p_setup.c @@ -387,7 +387,7 @@ void P_LoadThings(int lump) return; } playerCount = 0; - for (i = 0; i < MAXPLAYERS; i++) + for (i = 0; i < maxplayers; i++) { playerCount += playeringame[i]; } @@ -672,7 +672,7 @@ void P_SetupLevel(int episode, int map, int playermask, skill_t skill) int lumpnum; mobj_t *mobj; - for (i = 0; i < MAXPLAYERS; i++) + for (i = 0; i < maxplayers; i++) { players[i].killcount = players[i].secretcount = players[i].itemcount = 0; @@ -722,7 +722,7 @@ void P_SetupLevel(int episode, int map, int playermask, skill_t skill) TimerGame = 0; if (deathmatch) { - for (i = 0; i < MAXPLAYERS; i++) + for (i = 0; i < maxplayers; i++) { if (playeringame[i]) { // must give a player spot before deathmatchspawn @@ -796,16 +796,22 @@ static void InitMapInfo(void) int mcmdValue; mapInfo_t *info; char songMulch[10]; + char *default_sky_name = DEFAULT_SKY_NAME; mapMax = 1; + if (gamemode == shareware) + { + default_sky_name = "SKY2"; + } + // Put defaults into MapInfo[0] info = MapInfo; info->cluster = 0; info->warpTrans = 0; info->nextMap = 1; // Always go to map 1 if not specified info->cdTrack = 1; - info->sky1Texture = R_TextureNumForName(DEFAULT_SKY_NAME); + info->sky1Texture = R_TextureNumForName(default_sky_name); info->sky2Texture = info->sky1Texture; info->sky1ScrollDelta = 0; info->sky2ScrollDelta = 0; diff --git a/src/hexen/p_switch.c b/src/hexen/p_switch.c index 9d86f92a..a90269a7 100644 --- a/src/hexen/p_switch.c +++ b/src/hexen/p_switch.c @@ -25,7 +25,14 @@ // CHANGE THE TEXTURE OF A WALL SWITCH TO ITS OPPOSITE // //================================================================== -switchlist_t alphSwitchList[] = { +switchlist_t alphSwitchListDemo[] = { + {"SW_1_UP", "SW_1_DN", SFX_SWITCH1}, + {"SW_2_UP", "SW_2_DN", SFX_SWITCH1}, + {"SW52_OFF", "SW52_ON", SFX_SWITCH2}, + {"\0", "\0", 0} +}; + +switchlist_t alphSwitchListFull[] = { {"SW_1_UP", "SW_1_DN", SFX_SWITCH1}, {"SW_2_UP", "SW_2_DN", SFX_SWITCH1}, {"VALVE1", "VALVE2", SFX_VALVE_TURN}, @@ -39,6 +46,8 @@ switchlist_t alphSwitchList[] = { {"\0", "\0", 0} }; +switchlist_t *alphSwitchList = NULL; + int switchlist[MAXSWITCHES * 2]; int numswitches; button_t buttonlist[MAXBUTTONS]; @@ -58,6 +67,18 @@ void P_InitSwitchList(void) int i; int index; + if (!alphSwitchList) + { + if (gamemode == shareware) + { + alphSwitchList = alphSwitchListDemo; + } + else + { + alphSwitchList = alphSwitchListFull; + } + } + for (index = 0, i = 0; i < MAXSWITCHES; i++) { if (!alphSwitchList[i].soundID) diff --git a/src/hexen/p_tick.c b/src/hexen/p_tick.c index aac61ff8..c58d6e82 100644 --- a/src/hexen/p_tick.c +++ b/src/hexen/p_tick.c @@ -58,7 +58,7 @@ void P_Ticker(void) { return; } - for (i = 0; i < MAXPLAYERS; i++) + for (i = 0; i < maxplayers; i++) { if (playeringame[i]) { @@ -86,11 +86,13 @@ void P_Ticker(void) static void RunThinkers(void) { - thinker_t *currentthinker; + thinker_t *currentthinker, *nextthinker; currentthinker = thinkercap.next; while (currentthinker != &thinkercap) { + nextthinker = currentthinker->next; + if (currentthinker->function == (think_t) - 1) { // Time to remove it currentthinker->next->prev = currentthinker->prev; @@ -101,7 +103,8 @@ static void RunThinkers(void) { currentthinker->function(currentthinker); } - currentthinker = currentthinker->next; + + currentthinker = nextthinker; } } diff --git a/src/hexen/p_user.c b/src/hexen/p_user.c index d24ec053..c7fa7a3f 100644 --- a/src/hexen/p_user.c +++ b/src/hexen/p_user.c @@ -480,7 +480,7 @@ int P_GetPlayerNum(player_t * player) { int i; - for (i = 0; i < MAXPLAYERS; i++) + for (i = 0; i < maxplayers; i++) { if (player == &players[i]) { @@ -1017,7 +1017,7 @@ void P_TeleportToPlayerStarts(mobj_t * victim) fixed_t destX, destY; angle_t destAngle; - for (i = 0; i < MAXPLAYERS; i++) + for (i = 0; i < maxplayers; i++) { if (!playeringame[i]) continue; diff --git a/src/hexen/r_draw.c b/src/hexen/r_draw.c index e7481934..13a0421b 100644 --- a/src/hexen/r_draw.c +++ b/src/hexen/r_draw.c @@ -320,9 +320,9 @@ void R_InitTranslationTables(void) V_LoadTintTable(); // Allocate translation tables - translationtables = Z_Malloc(256 * 3 * (MAXPLAYERS - 1), PU_STATIC, 0); + translationtables = Z_Malloc(256 * 3 * (maxplayers - 1), PU_STATIC, 0); - for (i = 0; i < 3 * (MAXPLAYERS - 1); i++) + for (i = 0; i < 3 * (maxplayers - 1); i++) { lumpnum = W_GetNumForName("trantbl0") + i; transLump = W_CacheLumpNum(lumpnum, PU_STATIC); diff --git a/src/hexen/r_things.c b/src/hexen/r_things.c index aae6dc60..9d1cb6b5 100644 --- a/src/hexen/r_things.c +++ b/src/hexen/r_things.c @@ -388,7 +388,7 @@ void R_DrawVisSprite(vissprite_t * vis, int x1, int x2) { colfunc = R_DrawTranslatedTLColumn; dc_translation = translationtables - 256 - + vis->class * ((MAXPLAYERS - 1) * 256) + + + vis->class * ((maxplayers - 1) * 256) + ((vis->mobjflags & MF_TRANSLATION) >> (MF_TRANSSHIFT - 8)); } else if (vis->mobjflags & MF_SHADOW) @@ -405,7 +405,7 @@ void R_DrawVisSprite(vissprite_t * vis, int x1, int x2) // Draw using translated column function colfunc = R_DrawTranslatedColumn; dc_translation = translationtables - 256 - + vis->class * ((MAXPLAYERS - 1) * 256) + + + vis->class * ((maxplayers - 1) * 256) + ((vis->mobjflags & MF_TRANSLATION) >> (MF_TRANSSHIFT - 8)); } diff --git a/src/hexen/sb_bar.c b/src/hexen/sb_bar.c index bcc5b675..52a65824 100644 --- a/src/hexen/sb_bar.c +++ b/src/hexen/sb_bar.c @@ -242,6 +242,10 @@ static Cheat_t Cheats[] = { {CheatRevealFunc, &CheatRevealSeq}, }; +#define SET_CHEAT(cheat, seq) \ + { memcpy(cheat.sequence, seq, sizeof(seq)); \ + cheat.sequence_len = sizeof(seq) - 1; } + // CODE -------------------------------------------------------------------- //========================================================================== @@ -303,6 +307,34 @@ void SB_Init(void) PatchKILLS = W_CacheLumpName("KILLS", PU_STATIC); } SB_SetClassData(); + + if (gamemode == shareware) + { + SET_CHEAT(CheatGodSeq, "bgokey"); + SET_CHEAT(CheatNoClipSeq, "rjohnson"); + SET_CHEAT(CheatWeaponsSeq, "crhinehart"); + SET_CHEAT(CheatHealthSeq,"sgurno"); + SET_CHEAT(CheatKeysSeq, "mraymondjudy"); + SET_CHEAT(CheatSoundSeq, "kschilder"); + SET_CHEAT(CheatTickerSeq, "rrettenmund"); + SET_CHEAT(CheatArtifactAllSeq, "braffel"); + SET_CHEAT(CheatPuzzleSeq, "tmoore"); + SET_CHEAT(CheatWarpSeq, "bpelletier"); + SET_CHEAT(CheatPigSeq, "ebiessman"); + SET_CHEAT(CheatMassacreSeq, "cstika"); + SET_CHEAT(CheatIDKFASeq, "rambo"); + SET_CHEAT(CheatQuickenSeq1, "quicken"); + SET_CHEAT(CheatQuickenSeq2, "quickenquicken"); + SET_CHEAT(CheatQuickenSeq3, "quickenquickenquicken"); + SET_CHEAT(CheatClass1Seq, "plipo"); + SET_CHEAT(CheatClass2Seq, "plipo"); + SET_CHEAT(CheatVersionSeq, "pmacarther"); + SET_CHEAT(CheatDebugSeq, "jsumwalt"); + SET_CHEAT(CheatScriptSeq1, "mwagabaza"); + SET_CHEAT(CheatScriptSeq2, "mwagabaza"); + SET_CHEAT(CheatScriptSeq3, "mwagabaza"); + SET_CHEAT(CheatRevealSeq, "reveal"); + } } //========================================================================== @@ -330,12 +362,12 @@ void SB_SetClassData(void) if (!netgame) { // single player game uses red life gem (the second gem) PatchLIFEGEM = W_CacheLumpNum(W_GetNumForName("lifegem") - + MAXPLAYERS * class + 1, PU_STATIC); + + maxplayers * class + 1, PU_STATIC); } else { PatchLIFEGEM = W_CacheLumpNum(W_GetNumForName("lifegem") - + MAXPLAYERS * class + consoleplayer, + + maxplayers * class + consoleplayer, PU_STATIC); } SB_state = -1; @@ -1024,7 +1056,7 @@ void DrawMainBar(void) if (deathmatch) { temp = 0; - for (i = 0; i < MAXPLAYERS; i++) + for (i = 0; i < maxplayers; i++) { temp += CPlayer->frags[i]; } @@ -1351,7 +1383,7 @@ void DrawFullScreenStuff(void) if (deathmatch) { temp = 0; - for (i = 0; i < MAXPLAYERS; i++) + for (i = 0; i < maxplayers; i++) { if (playeringame[i]) { diff --git a/src/hexen/sv_save.c b/src/hexen/sv_save.c index b210ad9d..8fa211d8 100644 --- a/src/hexen/sv_save.c +++ b/src/hexen/sv_save.c @@ -346,7 +346,7 @@ static void StreamIn_player_t(player_t *str) // mobj_t *mo; // Pointer value is reset on load. - GET_LONG; + str->mo = (void *) (intptr_t) GET_LONG; str->mo = NULL; // playerstate_t playerstate; @@ -416,7 +416,7 @@ static void StreamIn_player_t(player_t *str) str->pieces = GET_LONG; // signed int frags[MAXPLAYERS]; - for (i=0; i<MAXPLAYERS; ++i) + for (i=0; i<maxplayers; ++i) { str->frags[i] = GET_LONG; } @@ -478,12 +478,12 @@ static void StreamIn_player_t(player_t *str) // mobj_t *poisoner; // Pointer value is reset. - GET_LONG; + str->poisoner = (void *) (intptr_t) GET_LONG; str->poisoner = NULL; // mobj_t *attacker; // Pointer value is reset. - GET_LONG; + str->attacker = (void *) (intptr_t) GET_LONG; str->attacker = NULL; // int extralight; @@ -585,7 +585,7 @@ static void StreamOut_player_t(player_t *str) StreamOutLong(str->pieces); // signed int frags[MAXPLAYERS]; - for (i=0; i<MAXPLAYERS; ++i) + for (i=0; i<maxplayers; ++i) { StreamOutLong(str->frags[i]); } @@ -685,14 +685,14 @@ static void StreamIn_thinker_t(thinker_t *str) { // struct thinker_s *prev, *next; // Pointers are discarded: - GET_LONG; + str->prev = (void *) (intptr_t) GET_LONG; str->prev = NULL; - GET_LONG; + str->next = (void *) (intptr_t) GET_LONG; str->next = NULL; // think_t function; // Function pointer is discarded: - GET_LONG; + str->function = (void *) (intptr_t) GET_LONG; str->function = NULL; } @@ -766,9 +766,9 @@ static void StreamIn_mobj_t(mobj_t *str) // struct mobj_s *snext, *sprev; // Pointer values are discarded: - GET_LONG; + str->snext = (void *) (intptr_t) GET_LONG; str->snext = NULL; - GET_LONG; + str->sprev = (void *) (intptr_t) GET_LONG; str->sprev = NULL; // angle_t angle; @@ -783,14 +783,14 @@ static void StreamIn_mobj_t(mobj_t *str) // struct mobj_s *bnext, *bprev; // Values are read but discarded; this will be restored when the thing's // position is set. - GET_LONG; + str->bnext = (void *) (intptr_t) GET_LONG; str->bnext = NULL; - GET_LONG; + str->bprev = (void *) (intptr_t) GET_LONG; str->bprev = NULL; // struct subsector_s *subsector; // Read but discard: pointer will be restored when thing position is set. - GET_LONG; + str->subsector = (void *) (intptr_t) GET_LONG; str->subsector = NULL; // fixed_t floorz, ceilingz; @@ -817,7 +817,7 @@ static void StreamIn_mobj_t(mobj_t *str) // mobjinfo_t *info; // Pointer value is read but discarded. - GET_LONG; + str->info = (void *) (intptr_t) GET_LONG; str->info = NULL; // int tics; @@ -2081,7 +2081,7 @@ void SV_LoadGame(int slot) Z_Free(SaveBuffer); // Save player structs - for (i = 0; i < MAXPLAYERS; i++) + for (i = 0; i < maxplayers; i++) { playerBackup[i] = players[i]; } @@ -2095,7 +2095,7 @@ void SV_LoadGame(int slot) // Restore player structs inv_ptr = 0; curpos = 0; - for (i = 0; i < MAXPLAYERS; i++) + for (i = 0; i < maxplayers; i++) { mobj = players[i].mo; players[i] = playerBackup[i]; @@ -2170,7 +2170,7 @@ void SV_MapTeleport(int map, int position) // Store player structs for later rClass = randomclass; randomclass = false; - for (i = 0; i < MAXPLAYERS; i++) + for (i = 0; i < maxplayers; i++) { playerBackup[i] = players[i]; } @@ -2194,7 +2194,7 @@ void SV_MapTeleport(int map, int position) G_InitNew(gameskill, gameepisode, gamemap); // Destroy all freshly spawned players - for (i = 0; i < MAXPLAYERS; i++) + for (i = 0; i < maxplayers; i++) { if (playeringame[i]) { @@ -2205,7 +2205,7 @@ void SV_MapTeleport(int map, int position) // Restore player structs targetPlayerMobj = NULL; - for (i = 0; i < MAXPLAYERS; i++) + for (i = 0; i < maxplayers; i++) { if (!playeringame[i]) { @@ -2286,7 +2286,7 @@ void SV_MapTeleport(int map, int position) } // Destroy all things touching players - for (i = 0; i < MAXPLAYERS; i++) + for (i = 0; i < maxplayers; i++) { if (playeringame[i]) { @@ -2403,11 +2403,11 @@ static void ArchivePlayers(void) int i; StreamOutLong(ASEG_PLAYERS); - for (i = 0; i < MAXPLAYERS; i++) + for (i = 0; i < maxplayers; i++) { StreamOutByte(playeringame[i]); } - for (i = 0; i < MAXPLAYERS; i++) + for (i = 0; i < maxplayers; i++) { if (!playeringame[i]) { @@ -2429,11 +2429,11 @@ static void UnarchivePlayers(void) int i; AssertSegment(ASEG_PLAYERS); - for (i = 0; i < MAXPLAYERS; i++) + for (i = 0; i < maxplayers; i++) { playeringame[i] = GET_BYTE; } - for (i = 0; i < MAXPLAYERS; i++) + for (i = 0; i < maxplayers; i++) { if (!playeringame[i]) { @@ -2968,7 +2968,7 @@ static void ArchiveMisc(void) int ix; StreamOutLong(ASEG_MISC); - for (ix = 0; ix < MAXPLAYERS; ix++) + for (ix = 0; ix < maxplayers; ix++) { StreamOutLong(localQuakeHappening[ix]); } @@ -2985,7 +2985,7 @@ static void UnarchiveMisc(void) int ix; AssertSegment(ASEG_MISC); - for (ix = 0; ix < MAXPLAYERS; ix++) + for (ix = 0; ix < maxplayers; ix++) { localQuakeHappening[ix] = GET_LONG; } diff --git a/src/i_oplmusic.c b/src/i_oplmusic.c index ae102982..2df361e5 100644 --- a/src/i_oplmusic.c +++ b/src/i_oplmusic.c @@ -358,7 +358,8 @@ static boolean LoadInstrumentTable(void) main_instrs = (genmidi_instr_t *) (lump + strlen(GENMIDI_HEADER)); percussion_instrs = main_instrs + GENMIDI_NUM_INSTRS; - main_instr_names = (char (*)[32]) (percussion_instrs + GENMIDI_NUM_PERCUSSION); + main_instr_names = + (char (*)[32]) (percussion_instrs + GENMIDI_NUM_PERCUSSION); percussion_names = main_instr_names + GENMIDI_NUM_INSTRS; return true; @@ -555,7 +556,8 @@ static void SetVoiceVolume(opl_voice_t *voice, unsigned int volume) midi_volume = 2 * (volume_mapping_table[(voice->channel->volume * current_music_volume) / 127] + 1); - full_volume = (volume_mapping_table[voice->note_volume] * midi_volume) >> 9; + full_volume = (volume_mapping_table[voice->note_volume] * midi_volume) + >> 9; // The volume value to use in the register: car_volume = 0x3f - full_volume; @@ -571,7 +573,8 @@ static void SetVoiceVolume(opl_voice_t *voice, unsigned int volume) // If we are using non-modulated feedback mode, we must set the // volume for both voices. - if ((opl_voice->feedback & 0x01) != 0 && opl_voice->modulator.level != 0x3f) + if ((opl_voice->feedback & 0x01) != 0 + && opl_voice->modulator.level != 0x3f) { mod_volume = 0x3f - opl_voice->modulator.level; if (mod_volume >= car_volume) @@ -579,7 +582,8 @@ static void SetVoiceVolume(opl_voice_t *voice, unsigned int volume) mod_volume = car_volume; } OPL_WriteRegister(OPL_REGS_LEVEL + voice->op1, - mod_volume | (opl_voice->modulator.scale & 0xc0)); + mod_volume | + (opl_voice->modulator.scale & 0xc0)); } } } @@ -711,7 +715,7 @@ static void KeyOffEvent(opl_track_data_t *track, midi_event_t *event) // passed to the function is the channel for the new note to be // played. -static void ReplaceExistingVoice() +static void ReplaceExistingVoice(void) { opl_voice_t *rover; opl_voice_t *result; @@ -728,8 +732,9 @@ static void ReplaceExistingVoice() for (rover = voice_alloced_list; rover != NULL; rover = rover->next) { - if (rover->current_instr_voice != 0 - || rover->channel >= result->channel) + if (rover->current_instr_voice > result->current_instr_voice + || (rover->current_instr_voice == result->current_instr_voice + && rover->channel >= result->channel)) { result = rover; } diff --git a/src/i_scale.c b/src/i_scale.c index 4d7bb22c..545a1f13 100644 --- a/src/i_scale.c +++ b/src/i_scale.c @@ -28,10 +28,6 @@ #include "m_argv.h" #include "z_zone.h" -#if defined(_MSC_VER) && !defined(__cplusplus) -#define inline __inline -#endif - // Should be I_VideoBuffer static byte *src_buffer; diff --git a/src/i_sdlmusic.c b/src/i_sdlmusic.c index 63a3467a..80bc49ab 100644 --- a/src/i_sdlmusic.c +++ b/src/i_sdlmusic.c @@ -20,6 +20,8 @@ #include <stdio.h> #include <stdlib.h> #include <string.h> +#include <ctype.h> + #include "SDL.h" #include "SDL_mixer.h" @@ -631,7 +633,7 @@ static boolean ReadSubstituteConfig(char *filename) FILE *fs; char *error; int linenum = 1; - int old_subst_music_len; +// int old_subst_music_len; fs = fopen(filename, "r"); @@ -640,7 +642,7 @@ static boolean ReadSubstituteConfig(char *filename) return false; } - old_subst_music_len = subst_music_len; +// old_subst_music_len = subst_music_len; while (!feof(fs)) { diff --git a/src/i_sdlsound.c b/src/i_sdlsound.c index 7089378e..79a15dbf 100644 --- a/src/i_sdlsound.c +++ b/src/i_sdlsound.c @@ -340,7 +340,7 @@ static boolean ExpandSoundData_SRC(sfxinfo_t *sfxinfo, { SRC_DATA src_data; uint32_t i, abuf_index=0, clipped=0; - uint32_t alen; +// uint32_t alen; int retn; int16_t *expanded; Mix_Chunk *chunk; @@ -372,7 +372,7 @@ static boolean ExpandSoundData_SRC(sfxinfo_t *sfxinfo, // Allocate the new chunk. - alen = src_data.output_frames_gen * 4; +// alen = src_data.output_frames_gen * 4; chunk = AllocateSound(sfxinfo, src_data.output_frames_gen * 4); diff --git a/src/i_video.c b/src/i_video.c index 8fb1f178..ec0fc58f 100644 --- a/src/i_video.c +++ b/src/i_video.c @@ -479,9 +479,7 @@ static int TranslateKey(SDL_keysym *sym) case SDLK_PAUSE: return KEY_PAUSE; -#if !SDL_VERSION_ATLEAST(1, 3, 0) case SDLK_EQUALS: return KEY_EQUALS; -#endif case SDLK_MINUS: return KEY_MINUS; @@ -495,10 +493,8 @@ static int TranslateKey(SDL_keysym *sym) case SDLK_LALT: case SDLK_RALT: -#if !SDL_VERSION_ATLEAST(1, 3, 0) case SDLK_LMETA: case SDLK_RMETA: -#endif return KEY_RALT; case SDLK_CAPSLOCK: return KEY_CAPSLOCK; @@ -829,11 +825,7 @@ static void CenterMouse(void) // Clear any relative movement caused by warping SDL_PumpEvents(); -#if SDL_VERSION_ATLEAST(1, 3, 0) - SDL_GetRelativeMouseState(0, NULL, NULL); -#else SDL_GetRelativeMouseState(NULL, NULL); -#endif } // @@ -847,11 +839,7 @@ static void I_ReadMouse(void) int x, y; event_t ev; -#if SDL_VERSION_ATLEAST(1, 3, 0) - SDL_GetRelativeMouseState(0, &x, &y); -#else SDL_GetRelativeMouseState(&x, &y); -#endif if (x != 0 || y != 0) { @@ -935,6 +923,7 @@ static void UpdateGrab(void) // example. SDL_WarpMouse(screen->w - 16, screen->h - 16); + SDL_PumpEvents(); SDL_GetRelativeMouseState(NULL, NULL); } @@ -2023,9 +2012,7 @@ void I_InitGraphics(void) // has to be done before the call to SDL_SetVideoMode. I_InitWindowTitle(); -#if !SDL_VERSION_ATLEAST(1, 3, 0) I_InitWindowIcon(); -#endif // Warning to OS X users... though they might never see it :( #ifdef __MACOSX__ diff --git a/src/m_misc.c b/src/m_misc.c index 2e363412..53b86dba 100644 --- a/src/m_misc.c +++ b/src/m_misc.c @@ -372,12 +372,20 @@ char *M_StringReplace(const char *haystack, const char *needle, boolean M_StringCopy(char *dest, const char *src, size_t dest_size) { + size_t len; + if (dest_size >= 1) { dest[dest_size - 1] = '\0'; strncpy(dest, src, dest_size - 1); } - return strlen(dest) == strlen(src); + else + { + return false; + } + + len = strlen(dest); + return src[len] == '\0'; } // Safe string concat function that works like OpenBSD's strlcat(). diff --git a/src/midifile.c b/src/midifile.c index 92ffd803..1ab4ecdb 100644 --- a/src/midifile.c +++ b/src/midifile.c @@ -130,7 +130,7 @@ static boolean ReadByte(byte *result, FILE *stream) static boolean ReadVariableLength(unsigned int *result, FILE *stream) { int i; - byte b; + byte b = 0; *result = 0; @@ -203,7 +203,7 @@ static boolean ReadChannelEvent(midi_event_t *event, byte event_type, boolean two_param, FILE *stream) { - byte b; + byte b = 0; // Set basics: @@ -269,7 +269,7 @@ static boolean ReadSysExEvent(midi_event_t *event, int event_type, static boolean ReadMetaEvent(midi_event_t *event, FILE *stream) { - byte b; + byte b = 0; event->event_type = MIDI_EVENT_META; @@ -308,7 +308,7 @@ static boolean ReadMetaEvent(midi_event_t *event, FILE *stream) static boolean ReadEvent(midi_event_t *event, unsigned int *last_event_type, FILE *stream) { - byte event_type; + byte event_type = 0; if (!ReadVariableLength(&event->delta_time, stream)) { diff --git a/src/net_sdl.c b/src/net_sdl.c index 7de61cb7..da667ff7 100644 --- a/src/net_sdl.c +++ b/src/net_sdl.c @@ -302,15 +302,27 @@ static boolean NET_SDL_RecvPacket(net_addr_t **addr, net_packet_t **packet) void NET_SDL_AddrToString(net_addr_t *addr, char *buffer, int buffer_len) { IPaddress *ip; + uint32_t host; + uint16_t port; ip = (IPaddress *) addr->handle; - - M_snprintf(buffer, buffer_len, - "%i.%i.%i.%i", - ip->host & 0xff, - (ip->host >> 8) & 0xff, - (ip->host >> 16) & 0xff, - (ip->host >> 24) & 0xff); + host = SDLNet_Read32(&ip->host); + port = SDLNet_Read16(&ip->port); + + M_snprintf(buffer, buffer_len, "%i.%i.%i.%i", + (host >> 24) & 0xff, (host >> 16) & 0xff, + (host >> 8) & 0xff, host & 0xff); + + // If we are using the default port we just need to show the IP address, + // but otherwise we need to include the port. This is important because + // we use the string representation in the setup tool to provided an + // address to connect to. + if (port != DEFAULT_PORT) + { + char portbuf[10]; + M_snprintf(portbuf, sizeof(portbuf), ":%i", port); + M_StringConcat(buffer, portbuf, buffer_len); + } } net_addr_t *NET_SDL_ResolveAddress(char *address) diff --git a/src/setup/compatibility.c b/src/setup/compatibility.c index df202117..14d5bc35 100644 --- a/src/setup/compatibility.c +++ b/src/setup/compatibility.c @@ -22,6 +22,8 @@ #include "compatibility.h" +#define WINDOW_HELP_URL "http://www.chocolate-doom.org/setup-compat" + int vanilla_savegame_limit = 1; int vanilla_demo_limit = 1; @@ -31,7 +33,9 @@ void CompatibilitySettings(void) window = TXT_NewWindow("Compatibility"); - TXT_AddWidgets(window, + TXT_SetWindowHelpURL(window, WINDOW_HELP_URL); + + TXT_AddWidgets(window, TXT_NewCheckBox("Vanilla savegame limit", &vanilla_savegame_limit), TXT_NewCheckBox("Vanilla demo limit", diff --git a/src/setup/display.c b/src/setup/display.c index 1398aaf0..e94db94e 100644 --- a/src/setup/display.c +++ b/src/setup/display.c @@ -28,6 +28,8 @@ #include "display.h" #include "config.h" +#define WINDOW_HELP_URL "http://www.chocolate-doom.org/setup-display" + extern void RestartTextscreen(void); typedef struct @@ -535,6 +537,8 @@ static void AdvancedDisplayConfig(TXT_UNCAST_ARG(widget), window = TXT_NewWindow("Advanced display options"); + TXT_SetWindowHelpURL(window, WINDOW_HELP_URL); + TXT_SetColumnWidths(window, 35); TXT_AddWidgets(window, @@ -595,6 +599,8 @@ void ConfigDisplay(void) window = TXT_NewWindow("Display Configuration"); + TXT_SetWindowHelpURL(window, WINDOW_HELP_URL); + // Some machines can have lots of video modes. This tries to // keep a limit of six lines by increasing the number of // columns. In extreme cases, the window is moved up slightly. diff --git a/src/setup/execute.c b/src/setup/execute.c index bbb23c38..26f59fd8 100644 --- a/src/setup/execute.c +++ b/src/setup/execute.c @@ -18,6 +18,7 @@ #include <stdio.h> #include <stdlib.h> #include <string.h> +#include <ctype.h> #include <sys/types.h> diff --git a/src/setup/joystick.c b/src/setup/joystick.c index dc94b2f0..22b1a089 100644 --- a/src/setup/joystick.c +++ b/src/setup/joystick.c @@ -14,6 +14,7 @@ #include <stdio.h> #include <stdlib.h> +#include <string.h> #include "doomtype.h" #include "i_joystick.h" @@ -28,6 +29,8 @@ #include "txt_joyaxis.h" #include "txt_joybinput.h" +#define WINDOW_HELP_URL "http://www.chocolate-doom.org/setup-gamepad" + typedef struct { char *name; // Config file name @@ -136,6 +139,7 @@ static const joystick_config_t empty_defaults[] = {"joyb_straferight", -1}, {"joyb_prevweapon", -1}, {"joyb_nextweapon", -1}, + {"joyb_jump", -1}, {"joyb_menu_activate", -1}, {NULL, 0}, }; @@ -292,6 +296,24 @@ static const joystick_config_t buffalo_classic_controller[] = {NULL, 0}, }; +// Config for if the user is actually using an old PC joystick or gamepad, +// probably via a USB-Gameport adapter. +static const joystick_config_t pc_gameport_controller[] = +{ + {"joystick_x_axis", 0}, + {"joystick_y_axis", 1}, + // Button configuration is the default as used for Vanilla Doom, + // Heretic and Hexen. When playing with a Gravis Gamepad, this + // layout should also be vaguely similar to the standard layout + // described above. + {"joyb_fire", 0}, + {"joyb_strafe", 1}, + {"joyb_use", 3}, + {"joyb_speed", 2}, + {NULL, 0}, +}; + + static const known_joystick_t known_joysticks[] = { { @@ -331,6 +353,13 @@ static const known_joystick_t known_joysticks[] = xbox360_controller_linux, }, + // Xbox One controller as it appears on Linux. + { + "Microsoft X-Box One pad", + 6, 11, 1, + xbox360_controller_linux, + }, + { "Logitech Dual Action", 4, 12, 1, @@ -357,6 +386,25 @@ static const known_joystick_t known_joysticks[] = 6, 14, 1, ps4_ds4_controller, }, + + // This is the configuration for the USB-Gameport adapter listed on + // this page as the "Mayflash USB to Gameport Adapter" (though the + // device is labeled as "Super Joy Box 7"): + // https://sites.google.com/site/joystickrehab/itemcatal + // TODO: Add extra configurations here for other USB-Gameport adapters, + // which should just be the same configuration. + { + "WiseGroup.,Ltd Gameport to USB Controller", + 4, 8, 1, + pc_gameport_controller, + }, + + // How the Super Joy Box 7 appears on Mac OS X. + { + "Gameport to USB Controller", + 2, 8, 1, + pc_gameport_controller, + }, }; static const known_joystick_t *GetJoystickType(int index) @@ -520,7 +568,7 @@ static int OpenAllJoysticks(void) result = 0; - for (i=0; i<num_joysticks; ++i) + for (i = 0; i < num_joysticks; ++i) { all_joysticks[i] = SDL_JoystickOpen(i); @@ -556,7 +604,7 @@ static void CloseAllJoysticks(void) num_joysticks = SDL_NumJoysticks(); - for (i=0; i<num_joysticks; ++i) + for (i = 0; i < num_joysticks; ++i) { if (all_joysticks[i] != NULL) { @@ -587,6 +635,7 @@ static int CalibrationEventCallback(SDL_Event *event, void *user_data) // At this point, we have a button press. // In the first "center" stage, we're just trying to work out which // joystick is being configured and which button the user is pressing. + usejoystick = 1; joystick_index = event->jbutton.which; calibrate_button = event->jbutton.button; @@ -595,7 +644,6 @@ static int CalibrationEventCallback(SDL_Event *event, void *user_data) if (IsKnownJoystick(joystick_index)) { LoadKnownConfiguration(); - usejoystick = 1; TXT_CloseWindow(calibration_window); } else @@ -613,11 +661,12 @@ static int CalibrationEventCallback(SDL_Event *event, void *user_data) static void NoJoystick(void) { - TXT_MessageBox(NULL, "No joysticks or gamepads could be found.\n\n" + TXT_MessageBox(NULL, "No gamepads or joysticks could be found.\n\n" "Try configuring your controller from within\n" "your OS first. Maybe you need to install\n" "some drivers or otherwise configure it."); + usejoystick = 0; joystick_index = -1; SetJoystickButtonLabel(); } @@ -659,7 +708,7 @@ static void CalibrateJoystick(TXT_UNCAST_ARG(widget), TXT_UNCAST_ARG(unused)) TXT_SignalConnect(calibration_window, "closed", CalibrateWindowClosed, NULL); // Start calibration - + usejoystick = 0; joystick_index = -1; } @@ -685,8 +734,9 @@ void ConfigJoystick(void) window = TXT_NewWindow("Gamepad/Joystick configuration"); + TXT_SetWindowHelpURL(window, WINDOW_HELP_URL); + TXT_AddWidgets(window, - TXT_NewCheckBox("Enable gamepad/joystick", &usejoystick), joystick_table = TXT_NewTable(2), TXT_NewSeparator("Axes"), axis_table = TXT_NewTable(2), @@ -694,6 +744,13 @@ void ConfigJoystick(void) button_table = TXT_NewTable(4), NULL); + TXT_SetColumnWidths(joystick_table, 13, 40); + + TXT_AddWidgets(joystick_table, + TXT_NewLabel("Controller"), + joystick_button = TXT_NewButton("zzzz"), + NULL); + TXT_SetColumnWidths(axis_table, 20, 15); TXT_AddWidgets(axis_table, @@ -711,13 +768,6 @@ void ConfigJoystick(void) JOYSTICK_AXIS_HORIZONTAL), NULL); - TXT_SetColumnWidths(joystick_table, 20, 15); - - TXT_AddWidgets(joystick_table, - TXT_NewLabel("Current controller"), - joystick_button = TXT_NewButton("zzzz"), - NULL); - TXT_SetColumnWidths(button_table, 16, 12, 14, 11); AddJoystickControl(button_table, "Fire/Attack", &joybfire); diff --git a/src/setup/keyboard.c b/src/setup/keyboard.c index 0d672436..4bbe1507 100644 --- a/src/setup/keyboard.c +++ b/src/setup/keyboard.c @@ -25,6 +25,8 @@ #include "joystick.h" #include "keyboard.h" +#define WINDOW_HELP_URL "http://www.chocolate-doom.org/setup-keyboard" + int vanilla_keyboard_mapping = 1; static int always_run = 0; @@ -181,6 +183,8 @@ static void ConfigExtraKeys(TXT_UNCAST_ARG(widget), TXT_UNCAST_ARG(unused)) window = TXT_NewWindow("Extra keyboard controls"); + TXT_SetWindowHelpURL(window, WINDOW_HELP_URL); + table = TXT_NewTable(2); TXT_SetColumnWidths(table, 21, 9); @@ -270,6 +274,8 @@ static void OtherKeysDialog(TXT_UNCAST_ARG(widget), TXT_UNCAST_ARG(unused)) window = TXT_NewWindow("Other keys"); + TXT_SetWindowHelpURL(window, WINDOW_HELP_URL); + table = TXT_NewTable(2); TXT_SetColumnWidths(table, 25, 9); @@ -356,6 +362,8 @@ void ConfigKeyboard(void) window = TXT_NewWindow("Keyboard configuration"); + TXT_SetWindowHelpURL(window, WINDOW_HELP_URL); + TXT_AddWidgets(window, TXT_NewSeparator("Movement"), movement_table = TXT_NewTable(4), diff --git a/src/setup/mainmenu.c b/src/setup/mainmenu.c index a599812e..e35decd5 100644 --- a/src/setup/mainmenu.c +++ b/src/setup/mainmenu.c @@ -38,6 +38,8 @@ #include "multiplayer.h" #include "sound.h" +#define WINDOW_HELP_URL "http://www.chocolate-doom.org/setup" + static const int cheat_sequence[] = { KEY_UPARROW, KEY_UPARROW, KEY_DOWNARROW, KEY_DOWNARROW, @@ -209,6 +211,8 @@ void MainMenu(void) window = TXT_NewWindow("Main Menu"); + TXT_SetWindowHelpURL(window, WINDOW_HELP_URL); + TXT_AddWidgets(window, TXT_NewButton2("Configure Display", (TxtWidgetSignalFunc) ConfigDisplay, NULL), @@ -247,7 +251,7 @@ void MainMenu(void) NULL); quit_action = TXT_NewWindowAction(KEY_ESCAPE, "Quit"); - warp_action = TXT_NewWindowAction(KEY_F1, "Warp"); + warp_action = TXT_NewWindowAction(KEY_F2, "Warp"); TXT_SignalConnect(quit_action, "pressed", QuitConfirm, NULL); TXT_SignalConnect(warp_action, "pressed", (TxtWidgetSignalFunc) WarpMenu, NULL); diff --git a/src/setup/mouse.c b/src/setup/mouse.c index 9fdfc833..91e38870 100644 --- a/src/setup/mouse.c +++ b/src/setup/mouse.c @@ -25,6 +25,8 @@ #include "mode.h" #include "mouse.h" +#define WINDOW_HELP_URL "http://www.chocolate-doom.org/setup-mouse" + static int usemouse = 1; static int mouseSensitivity = 5; @@ -84,6 +86,8 @@ static void ConfigExtraButtons(TXT_UNCAST_ARG(widget), TXT_UNCAST_ARG(unused)) window = TXT_NewWindow("Additional mouse buttons"); + TXT_SetWindowHelpURL(window, WINDOW_HELP_URL); + TXT_AddWidgets(window, buttons_table = TXT_NewTable(2), NULL); @@ -112,6 +116,8 @@ void ConfigMouse(void) window = TXT_NewWindow("Mouse configuration"); + TXT_SetWindowHelpURL(window, WINDOW_HELP_URL); + TXT_AddWidgets(window, TXT_NewCheckBox("Enable mouse", &usemouse), TXT_NewInvertedCheckBox("Allow vertical mouse movement", diff --git a/src/setup/multiplayer.c b/src/setup/multiplayer.c index 6b294077..4aaff921 100644 --- a/src/setup/multiplayer.c +++ b/src/setup/multiplayer.c @@ -355,7 +355,7 @@ static void SetExMyWarp(TXT_UNCAST_ARG(widget), void *val) { int l; - l = (int) val; + l = (intptr_t) val; warpepisode = l / 10; warpmap = l % 10; @@ -367,7 +367,7 @@ static void SetMAPxyWarp(TXT_UNCAST_ARG(widget), void *val) { int l; - l = (int) val; + l = (intptr_t) val; warpmap = l; @@ -389,8 +389,8 @@ static void LevelSelectDialog(TXT_UNCAST_ARG(widget), TXT_UNCAST_ARG(user_data)) const iwad_t *iwad; char buf[10]; int episodes; - int x, y; - int l; + intptr_t x, y; + intptr_t l; int i; window = TXT_NewWindow("Select level"); @@ -957,7 +957,7 @@ static void ServerQueryWindow(char *title) TXT_NewScrollPane(70, 10, results_table = TXT_NewTable(3))); - TXT_SetColumnWidths(results_table, 7, 16, 46); + TXT_SetColumnWidths(results_table, 7, 22, 40); TXT_SetPeriodicCallback(QueryPeriodicCallback, results_table, 1); TXT_SignalConnect(query_window, "closed", QueryWindowClosed, NULL); diff --git a/src/setup/sound.c b/src/setup/sound.c index e7670feb..280a6bc2 100644 --- a/src/setup/sound.c +++ b/src/setup/sound.c @@ -25,6 +25,8 @@ #include "mode.h" #include "sound.h" +#define WINDOW_HELP_URL "http://www.chocolate-doom.org/setup-sound" + typedef enum { SFXMODE_DISABLED, @@ -237,6 +239,8 @@ void ConfigSound(void) window = TXT_NewWindow("Sound configuration"); + TXT_SetWindowHelpURL(window, WINDOW_HELP_URL); + TXT_SetWindowPosition(window, TXT_HORIZ_CENTER, TXT_VERT_TOP, TXT_SCREEN_W / 2, 5); @@ -7,7 +7,7 @@ * * GnuPG 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 3 of the License, or + * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * GnuPG is distributed in the hope that it will be useful, @@ -16,7 +16,9 @@ * 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, see <http://www.gnu.org/licenses/>. + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, + * USA. */ diff --git a/src/strife.desktop.in b/src/strife.desktop.in index eb44c61d..541c2adb 100644 --- a/src/strife.desktop.in +++ b/src/strife.desktop.in @@ -5,3 +5,4 @@ Icon=@PROGRAM_PREFIX@doom Type=Application Comment=@PACKAGE_SHORTDESC@ Categories=Game;ActionGame; +Keywords=first;person;shooter;doom;vanilla; diff --git a/src/strife/d_main.c b/src/strife/d_main.c index 35d2c908..cc1a9022 100644 --- a/src/strife/d_main.c +++ b/src/strife/d_main.c @@ -1285,6 +1285,11 @@ void D_IntroTick(void) // //============================================================================= +static void G_CheckDemoStatusAtExit (void) +{ + G_CheckDemoStatus(); +} + // // D_DoomMain // @@ -1606,9 +1611,12 @@ void D_DoomMain (void) if (p) { + char *uc_filename = strdup(myargv[p + 1]); + M_ForceUppercase(uc_filename); + // With Vanilla you have to specify the file without extension, // but make that optional. - if (M_StringEndsWith(myargv[p + 1], ".lmp")) + if (M_StringEndsWith(uc_filename, ".LMP")) { M_StringCopy(file, myargv[p + 1], sizeof(file)); } @@ -1617,6 +1625,8 @@ void D_DoomMain (void) DEH_snprintf(file, sizeof(file), "%s.lmp", myargv[p+1]); } + free(uc_filename); + if (D_AddFile (file)) { M_StringCopy(demolumpname, lumpinfo[numlumps - 1].name, @@ -1634,7 +1644,7 @@ void D_DoomMain (void) printf("Playing demo %s.\n", file); } - I_AtExit((atexit_func_t) G_CheckDemoStatus, true); + I_AtExit(G_CheckDemoStatusAtExit, true); // Generate the WAD hash table. Speed things up a bit. diff --git a/src/strife/f_finale.c b/src/strife/f_finale.c index 9c55c102..23ed3dec 100644 --- a/src/strife/f_finale.c +++ b/src/strife/f_finale.c @@ -934,11 +934,11 @@ void F_DrawMap34End (void) { signed int scrolled; int x; - patch_t* p1; - patch_t* p2; +// patch_t* p1; +// patch_t* p2; - p1 = W_CacheLumpName (DEH_String("credit"), PU_LEVEL); - p2 = W_CacheLumpName (DEH_String("vellogo"), PU_LEVEL); +// p1 = W_CacheLumpName (DEH_String("credit"), PU_LEVEL); +// p2 = W_CacheLumpName (DEH_String("vellogo"), PU_LEVEL); V_MarkRect (0, 0, SCREENWIDTH, SCREENHEIGHT); diff --git a/src/strife/g_game.c b/src/strife/g_game.c index e0c0ae27..906d3c99 100644 --- a/src/strife/g_game.c +++ b/src/strife/g_game.c @@ -984,7 +984,6 @@ void G_Ticker (void) && turbodetected[i]) { static char turbomessage[80]; - extern char player_names[8][16]; M_snprintf(turbomessage, sizeof(turbomessage), "%s is turbo!", player_names[i]); players[consoleplayer].message = turbomessage; diff --git a/src/strife/p_saveg.c b/src/strife/p_saveg.c index 9fec0c02..ffe9dbcb 100644 --- a/src/strife/p_saveg.c +++ b/src/strife/p_saveg.c @@ -186,12 +186,12 @@ static void saveg_write_pad(void) static void *saveg_readp(void) { - return (void *) saveg_read32(); + return (void *) (intptr_t) saveg_read32(); } static void saveg_writep(void *p) { - saveg_write32((int) p); + saveg_write32((intptr_t) p); } // Enum values are 32-bit integers. diff --git a/src/strife/p_setup.c b/src/strife/p_setup.c index 1fd889fa..ad65f20e 100644 --- a/src/strife/p_setup.c +++ b/src/strife/p_setup.c @@ -324,7 +324,7 @@ void P_LoadThings (int lump) mapthing_t *mt; mapthing_t spawnthing; int numthings; - boolean spawn; +// boolean spawn; data = W_CacheLumpNum (lump,PU_STATIC); numthings = W_LumpLength (lump) / sizeof(mapthing_t); @@ -332,7 +332,7 @@ void P_LoadThings (int lump) mt = (mapthing_t *)data; for (i=0 ; i<numthings ; i++, mt++) { - spawn = true; +// spawn = true; // Do not spawn cool, new monsters if !commercial // STRIFE-TODO: replace with isregistered stuff @@ -785,6 +785,9 @@ P_SetupLevel // UNUSED W_Profile (); P_InitThinkers (); + // if working with a devlopment map, reload it + W_Reload(); + // [STRIFE] Removed ExMy map support if (map<10) DEH_snprintf(lumpname, 9, "map0%i", map); diff --git a/src/strife/p_tick.c b/src/strife/p_tick.c index f4ed2711..c0dd4786 100644 --- a/src/strife/p_tick.c +++ b/src/strife/p_tick.c @@ -99,11 +99,13 @@ void P_AllocateThinker (thinker_t* thinker) // void P_RunThinkers (void) { - thinker_t* currentthinker; + thinker_t *currentthinker, *nextthinker; currentthinker = thinkercap.next; while (currentthinker != &thinkercap) { + nextthinker = currentthinker->next; + if ( currentthinker->function.acv == (actionf_v)(-1) ) { // time to remove it @@ -116,7 +118,8 @@ void P_RunThinkers (void) if (currentthinker->function.acp1) currentthinker->function.acp1 (currentthinker); } - currentthinker = currentthinker->next; + + currentthinker = nextthinker; } } diff --git a/src/strife/st_stuff.c b/src/strife/st_stuff.c index 59017690..9b055a77 100644 --- a/src/strife/st_stuff.c +++ b/src/strife/st_stuff.c @@ -1495,8 +1495,8 @@ void ST_loadGraphics(void) void ST_loadData(void) { - static int dword_8848C = 1; // STRIFE-TODO: what is the purpose of this? - dword_8848C = 0; +// static int dword_8848C = 1; // STRIFE-TODO: what is the purpose of this? +// dword_8848C = 0; lu_palette = W_GetNumForName (DEH_String("PLAYPAL")); ST_loadGraphics(); diff --git a/src/w_wad.c b/src/w_wad.c index aa0646af..a8a952b6 100644 --- a/src/w_wad.c +++ b/src/w_wad.c @@ -39,7 +39,7 @@ typedef struct { // Should be "IWAD" or "PWAD". - char identification[4]; + char identification[4]; int numlumps; int infotableofs; } PACKEDATTR wadinfo_t; @@ -57,16 +57,20 @@ typedef struct // // Location of each lump on disk. - -lumpinfo_t *lumpinfo; +lumpinfo_t *lumpinfo; unsigned int numlumps = 0; // Hash table for fast lookups - static lumpinfo_t **lumphash; -// Hash function used for lump names. +// Variables for the reload hack: filename of the PWAD to reload, and the +// lumps from WADs before the reload file, so we can resent numlumps and +// load the file again. +static wad_file_t *reloadhandle = NULL; +static char *reloadname = NULL; +static int reloadlump = -1; +// Hash function used for lump names. unsigned int W_LumpNameHash(const char *s) { // This is the djb2 string hash function, modded to work on strings @@ -148,8 +152,26 @@ wad_file_t *W_AddFile (char *filename) filelump_t *filerover; int newnumlumps; - // open the file and add to directory + // If the filename begins with a ~, it indicates that we should use the + // reload hack. + if (filename[0] == '~') + { + if (reloadname != NULL) + { + I_Error("Prefixing a WAD filename with '~' indicates that the " + "WAD should be reloaded\n" + "on each level restart, for use by level authors for " + "rapid development. You\n" + "can only reload one WAD file, and it must be the last " + "file in the -file list."); + } + reloadname = strdup(filename); + reloadlump = numlumps; + ++filename; + } + + // Open the file and add to directory wad_file = W_OpenFile(filename); if (wad_file == NULL) @@ -158,6 +180,13 @@ wad_file_t *W_AddFile (char *filename) return NULL; } + // If this is the reload file, we need to save the file handle so that we + // can close it later on when we do a reload. + if (reloadname) + { + reloadhandle = wad_file; + } + newnumlumps = numlumps; if (strcasecmp(filename+strlen(filename)-3 , "wad" ) ) @@ -539,8 +568,7 @@ void W_GenerateHashTable(void) { unsigned int i; - // Free the old hash table, if there is one - + // Free the old hash table, if there is one: if (lumphash != NULL) { Z_Free(lumphash); @@ -568,6 +596,49 @@ void W_GenerateHashTable(void) // All done! } +// The Doom reload hack. The idea here is that if you give a WAD file to -file +// prefixed with the ~ hack, that WAD file will be reloaded each time a new +// level is loaded. This lets you use a level editor in parallel and make +// incremental changes to the level you're working on without having to restart +// the game after every change. +// But: the reload feature is a fragile hack... +void W_Reload(void) +{ + char *filename; + int i; + + if (reloadname == NULL) + { + return; + } + + // We must release any lumps being held in the PWAD we're about to reload: + for (i = reloadlump; i < numlumps; ++i) + { + if (lumpinfo[i].cache != NULL) + { + W_ReleaseLumpNum(i); + } + } + + // Reset numlumps to remove the reload WAD file: + numlumps = reloadlump; + + // Now reload the WAD file. + filename = reloadname; + + W_CloseFile(reloadhandle); + reloadname = NULL; + reloadlump = -1; + reloadhandle = NULL; + W_AddFile(filename); + free(filename); + + // The WAD directory has changed, so we have to regenerate the + // fast lookup hashtable: + W_GenerateHashTable(); +} + // Lump names that are unique to particular game types. This lets us check // the user is not trying to play with the wrong executable, eg. // chocolate-doom -iwad hexen.wad. diff --git a/src/w_wad.h b/src/w_wad.h index 71895749..e5dc18b3 100644 --- a/src/w_wad.h +++ b/src/w_wad.h @@ -56,6 +56,7 @@ extern lumpinfo_t *lumpinfo; extern unsigned int numlumps; wad_file_t *W_AddFile (char *filename); +void W_Reload (void); int W_CheckNumForName (char* name); int W_GetNumForName (char* name); diff --git a/src/z_zone.c b/src/z_zone.c index 16da22b9..f88e3f02 100644 --- a/src/z_zone.c +++ b/src/z_zone.c @@ -16,10 +16,13 @@ // Zone Memory Allocation. Neat. // +#include <string.h> -#include "z_zone.h" -#include "i_system.h" #include "doomtype.h" +#include "i_system.h" +#include "m_argv.h" + +#include "z_zone.h" // @@ -61,8 +64,9 @@ typedef struct -memzone_t* mainzone; - +static memzone_t *mainzone; +static boolean zero_on_free; +static boolean scan_on_free; // @@ -110,15 +114,63 @@ void Z_Init (void) mainzone->blocklist.user = (void *)mainzone; mainzone->blocklist.tag = PU_STATIC; mainzone->rover = block; - + block->prev = block->next = &mainzone->blocklist; // free block block->tag = PU_FREE; - + block->size = mainzone->size - sizeof(memzone_t); + + //! + // Zone memory debugging flag. If set, memory is zeroed after it is freed + // to deliberately break any code that attempts to use it after free. + // + zero_on_free = M_ParmExists("-zonezero"); + + //! + // Zone memory debugging flag. If set, each time memory is freed, the zone + // heap is scanned to look for remaining pointers to the freed block. + // + scan_on_free = M_ParmExists("-zonescan"); } +// Scan the zone heap for pointers within the specified range, and warn about +// any remaining pointers. +static void ScanForBlock(void *start, void *end) +{ + memblock_t *block; + void **mem; + int i, len, tag; + + block = mainzone->blocklist.next; + + while (block->next != &mainzone->blocklist) + { + tag = block->tag; + + if (tag == PU_STATIC || tag == PU_LEVEL || tag == PU_LEVSPEC) + { + // Scan for pointers on the assumption that pointers are aligned + // on word boundaries (word size depending on pointer size): + mem = (void **) ((byte *) block + sizeof(memblock_t)); + len = (block->size - sizeof(memblock_t)) / sizeof(void *); + + for (i = 0; i < len; ++i) + { + if (start <= mem[i] && mem[i] <= end) + { + fprintf(stderr, + "%p has dangling pointer into freed block " + "%p (%p -> %p)\n", + mem, start, &mem[i], mem[i]); + } + } + } + + block = block->next; + } +} // // Z_Free @@ -127,12 +179,12 @@ void Z_Free (void* ptr) { memblock_t* block; memblock_t* other; - + block = (memblock_t *) ( (byte *)ptr - sizeof(memblock_t)); if (block->id != ZONEID) I_Error ("Z_Free: freed a pointer without ZONEID"); - + if (block->tag != PU_FREE && block->user != NULL) { // clear the user's mark @@ -143,7 +195,19 @@ void Z_Free (void* ptr) block->tag = PU_FREE; block->user = NULL; block->id = 0; - + + // If the -zonezero flag is provided, we zero out the block on free + // to break code that depends on reading freed memory. + if (zero_on_free) + { + memset(ptr, 0, block->size - sizeof(memblock_t)); + } + if (scan_on_free) + { + ScanForBlock(ptr, + (byte *) ptr + block->size - sizeof(memblock_t)); + } + other = block->prev; if (other->tag == PU_FREE) @@ -158,7 +222,7 @@ void Z_Free (void* ptr) block = other; } - + other = block->next; if (other->tag == PU_FREE) { @@ -285,7 +349,7 @@ Z_Malloc mainzone->rover = base->next; base->id = ZONEID; - + return result; } |