diff --git a/CMakeLists.txt b/CMakeLists.txt index 61247aa..8c8af77 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -2,18 +2,40 @@ cmake_minimum_required(VERSION 3.12) project(zip LANGUAGES C) -set(ZIP_SOURCE +set(HEADERS + memory.h + oc_0op.h + oc_1op.h + oc_2op.h + oc_var_op.h + oc_ext.h + opcodes.h + state.h + stddclmr.h + story.h + text.h + zork1.h +) +list(TRANSFORM HEADERS PREPEND "${CMAKE_CURRENT_SOURCE_DIR}/include/") + +set(SOURCE main.c memory.c + oc_0op.c + oc_1op.c + oc_2op.c + oc_var_op.c + oc_ext.c + opcodes.c + state.c + story.c text.c ) +list(TRANSFORM SOURCE PREPEND "${CMAKE_CURRENT_SOURCE_DIR}/src/") -set(ALL_SOURCE - ${ZIP_SOURCE} +add_executable(${CMAKE_PROJECT_NAME} + ${HEADERS} + ${SOURCE} ) -list(TRANSFORM ALL_SOURCE PREPEND "${CMAKE_CURRENT_SOURCE_DIR}/src/") - -add_executable(${CMAKE_PROJECT_NAME} ${ALL_SOURCE} - src/story.c) target_include_directories(${CMAKE_PROJECT_NAME} PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}/include) diff --git a/include/memory.h b/include/memory.h index 5509bf2..ee28a62 100644 --- a/include/memory.h +++ b/include/memory.h @@ -31,8 +31,22 @@ #define MEMORY_ROUTINE 0 #define MEMORY_PRINT 1 +#define true 1 +#define false 0 + +#define PEEK(a) memoryByte(a) +#define POKE(a,v) memorySetByte(a,v) +#define PEEKW(a) memoryWord(a) +#define POKEW(a,v) memorySetWord(a,v) + + +typedef unsigned char byte; +typedef unsigned char bool; + uint8_t memoryByte(uint16_t address); +void memorySetByte(uint16_t address, uint8_t value); +void memorySetWord(uint16_t address, uint16_t value); uint32_t memoryUnpackAddress(uint16_t address, uint8_t type); uint16_t memoryWord(uint16_t address); void memoryLoadStory(void); diff --git a/include/oc_0op.h b/include/oc_0op.h new file mode 100644 index 0000000..fe1be3d --- /dev/null +++ b/include/oc_0op.h @@ -0,0 +1,32 @@ +/* + * Copyright (c) 2024 Scott Duensing, scott@kangaroopunch.com + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + + +#ifndef OC_0OP_H +#define OC_0OP_H + + +void opcodes_new_line(void); +void opcodes_print(void); + + +#endif // OC_0OP_H diff --git a/include/oc_1op.h b/include/oc_1op.h new file mode 100644 index 0000000..bfe3408 --- /dev/null +++ b/include/oc_1op.h @@ -0,0 +1,33 @@ +/* + * Copyright (c) 2024 Scott Duensing, scott@kangaroopunch.com + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + + +#ifndef OC_1OP_H +#define OC_1OP_H + + + +void opcodes_jump(void); +void opcodes_jz(void); +void opcodes_ret(void); + +#endif // OC_1OP_H diff --git a/include/oc_2op.h b/include/oc_2op.h new file mode 100644 index 0000000..52ba490 --- /dev/null +++ b/include/oc_2op.h @@ -0,0 +1,36 @@ +/* + * Copyright (c) 2024 Scott Duensing, scott@kangaroopunch.com + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + + +#ifndef OC_2OP_H +#define OC_2OP_H + + +void opcodes_add(void); +void opcodes_je(void); +void opcodes_loadw(void); +void opcodes_store(void); +void opcodes_sub(void); +void opcodes_test_attr(void); + + +#endif // OC_2OP_H diff --git a/include/oc_ext.h b/include/oc_ext.h new file mode 100644 index 0000000..ca04c0a --- /dev/null +++ b/include/oc_ext.h @@ -0,0 +1,27 @@ +/* + * Copyright (c) 2024 Scott Duensing, scott@kangaroopunch.com + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + + +#ifndef OC_EXT_H +#define OC_EXT_H + +#endif // OC_EXT_H diff --git a/include/oc_var_op.h b/include/oc_var_op.h new file mode 100644 index 0000000..4733980 --- /dev/null +++ b/include/oc_var_op.h @@ -0,0 +1,34 @@ +/* + * Copyright (c) 2024 Scott Duensing, scott@kangaroopunch.com + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + + +#ifndef OC_VAR_OP_H +#define OC_VAR_OP_H + + + +void opcodes_call(void); +void opcodes_put_prop(void); +void opcodes_storew(void); + + +#endif // OC_VAR_OP_H diff --git a/include/opcodes.h b/include/opcodes.h new file mode 100644 index 0000000..196084c --- /dev/null +++ b/include/opcodes.h @@ -0,0 +1,34 @@ +/* + * Copyright (c) 2024 Scott Duensing, scott@kangaroopunch.com + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + + +#ifndef OPCODES_H +#define OPCODES_H + + +typedef void (*opcodeT)(void); + + +void opcodesSetup(void); + + +#endif // OPCODES_H diff --git a/include/state.h b/include/state.h new file mode 100644 index 0000000..9aa5f56 --- /dev/null +++ b/include/state.h @@ -0,0 +1,45 @@ +/* + * Copyright (c) 2024 Scott Duensing, scott@kangaroopunch.com + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + + +#ifndef STATE_H +#define STATE_H + + +#include "memory.h" +#include "opcodes.h" + + +typedef struct stateS { + byte stack[2048]; //***TODO*** How big does this really need to be? Old games are 1024, new...? + bool quit; + uint16_t pc; + uint16_t sp; + opcodeT opcodes[256]; + opcodeT extOpcodes[30]; +} stateT; + + +extern stateT __state; + + +#endif // STATE_H diff --git a/include/stddclmr.h b/include/stddclmr.h new file mode 100644 index 0000000..8e6b3d9 --- /dev/null +++ b/include/stddclmr.h @@ -0,0 +1,95 @@ +#ifndef STDDCLMR_H +#define STDDCLMR_H + +/* +Action figures sold separately. Add toner. All models over 18 years of age. +All rights reserved. Allow four to six weeks for delivery. An equal +opportunity employer. Any resemblance to actual persons, living or dead, is +unintentional and purely coincidental. Apply only to affected area. Approved +for veterans. As seen on TV. At participating locations only. Avoid contact +with mucous membranes. Avoid contact with skin. Avoid extreme temperatures +and store in a cool dry place. Batteries not included. Be sure each item is +properly endorsed. Beware of dog. Booths for two or more. Breaking seal +constitutes acceptance of agreement. Call toll free number before digging. +Caveat emptor. Check here if tax deductible. Close cover before striking +Colors may fade. Contains a substantial amount of non-tobacco ingredients. +Contents may settle during shipment. Contestants have been briefed on some +questions before the show. Copyright 1995 Joker's Wild. Disclaimer does +not cover hurricane, lightning, tornado, tsunami, volcanic eruption, +earthquake, flood, and other Acts of God, misuse, neglect, unauthorized +repair, damage from improper installation, broken antenna or marred cabinet, +incorrect line voltage, missing or altered serial numbers, sonic boom +vibrations, electromagnetic radiation from nuclear blasts, customer +adjustments that are not covered in the joke list, and incidents owing to +airplane crash, ship sinking, motor vehicle accidents, leaky roof, broken +glass, falling rocks, mud slides, forest fire, flying projectiles, or +dropping the item. Do not bend, fold, mutilate, or spindle. Do not place +near flammable or magnetic source. Do not puncture, incinerate, or store +above 120 degrees Fahrenheit. Do not stamp. Use other side for additional +listings. Do not use while operating a motor vehicle or heavy equipment. Do +not write below this line. Documents are provided "as is" without any +warranties expressed or implied. Don't quote me on anything. Don't quote me +on that. Driver does not carry cash. Drop in any mailbox. Edited for +television. Employees and their families are not eligible. Falling rock. +First pull up, then pull down. Flames redirected to /dev/null. For a +limited time only. For external use only. For off-road use only. For office +use only. For recreational use only. Do not disturb. Freshest if eaten +before date on carton. Hand wash only, tumble dry on low heat. If a rash, +redness, irritation, or swelling develops, discontinue use. If condition +persists, consult your physician. If defects are discovered, do not attempt +to fix them yourself, but return to an authorized service center. If +ingested, do not induce vomiting, if symptoms persist, consult a doctor. +Keep away from open flames and avoid inhaling fumes. Keep away from +sunlight, pets, and small children. Keep cool; process promptly. Limit +one-per-family please. Limited time offer, call now to ensure prompt +delivery. List at least two alternate dates. List each check separately by +bank number. List was current at time of printing. Lost ticket pays maximum +rate. May be too intense for some viewers. Must be 18 to enter. No Canadian +coins. No alcohol, dogs or horses. No anchovies unless otherwise specified. +No animals were harmed in the production of these documents. No money down. +No other warranty expressed or implied. No passes accepted for this +engagement. No postage necessary if mailed in the United States. No +preservatives added. No purchase necessary. No salt, MSG, artificial color +or flavor added. No shoes, no shirt, no service, no kidding. No solicitors. +No substitutions allowed. No transfers issued until the bus comes to a +complete stop. No user-serviceable parts inside. Not affiliated with the +American Red Cross. Not liable for damages due to use or misuse. Not +recommended for children. Not responsible for direct, indirect, incidental +or consequential damages resulting from any defect, error or failure to +perform. Not the Beatles. Objects in mirror may be closer than they appear. +One size fits all. Many suitcases look alike. Other copyright laws for +specific entries apply wherever noted. Other restrictions may apply. Package +sold by weight, not volume. Parental advisory - explicit lyrics. Penalty for +private use. Place stamp here. Please remain seated until the ride has come +to a complete stop. Possible penalties for early withdrawal. Post office will +not deliver without postage. Postage will be paid by addressee. Prerecorded +for this time zone. Price does not include taxes. Processed at location +stamped in code at top of carton. Quantities are limited while supplies last. +Read at your own risk. Record additional transactions on back of previous +stub. Replace with same type. Reproduction strictly prohibited. Restaurant +package, not for resale. Return to sender, no forwarding order on file, +unable to forward. Safety goggles may be required during use. Sanitized for +your protection. Sealed for your protection, do not use if the safety seal is +broken. See label for sequence. Shading within a garment may occur. Sign here +without admitting guilt. Simulated picture. Slightly enlarged to show detail. +Slightly higher west of the Rockies. Slippery when wet. Smoking these may be +hazardous to your health. Some assembly required. Some equipment shown is +optional. Some of the trademarks mentioned in this product appear for +identification purposes only. Subject to FCC approval. Subject to change +without notice. Substantial penalty for early withdrawal. Text may contain +material some readers may find objectionable, parental guidance is advised. +Text used in these documents is made from 100% recycled electrons and magnetic +particles. These documents do not reflect the thoughts or opinions of either +myself, my company, my friends, or my rabbit. This is not an offer to sell +securities. This offer is void where prohibited, taxed, or otherwise +restricted. This product is meant for educational purposes only. Times +approximate. Unix is a registered trademark of AT&T. Use only as directed. Use +only in a well-ventilated are. User assumes full liabilities. Void where +prohibited. We have sent the forms which seem right for you. You must be +present to win. You need not be present to win. Your canceled check is your +receipt. Your mileage may vary. I didn't do it. You can't prove anything. + +This supersedes all previous notices. +*/ + +#endif // STDDCLMR_H diff --git a/include/story.h b/include/story.h index f099d19..9c5d2de 100644 --- a/include/story.h +++ b/include/story.h @@ -31,6 +31,8 @@ #define STORY_STATUS_SCORE_TURNS 0 #define STORY_STATUS_HOURS_MINUTES 1 +#define STORY_FLAG_V3 0x01 + #define STORY_FLAG_V3_STATUS (1 << 1) #define STORY_FLAG_V3_TWO_DISKS (1 << 2) #define STORY_FLAG_V3_STATUS_LINE_NOT_AVAILABLE (1 << 4) @@ -72,7 +74,7 @@ #define STORY_FLAG_3_USE_TRANSPARENCY (1 << 0) #define storyVersion() memoryByte(0x0) -#define storyFlags() memoryByte(0x1) +#define storyFlags() memoryByte(STORY_FLAG_V3) #define storyHightMemory() memoryWord(0x4) #define storyInitialPC() memoryWord(0x6) // V1-5 #define storyInitialPackedPC() memoryUnpackAddress(memoryWord(0x6), MEMORY_ROUTINE) // V6 diff --git a/src/main.c b/src/main.c index 3446f37..fc8feeb 100644 --- a/src/main.c +++ b/src/main.c @@ -37,12 +37,18 @@ #include +#include "stddclmr.h" + #include "memory.h" #include "story.h" +#include "state.h" +#include "opcodes.h" int main(void) { + memoryLoadStory(); - printf("%d\n", storyVersion()); + opcodesSetup(); + return 0; } diff --git a/src/memory.c b/src/memory.c index f11d1a4..ebf47ba 100644 --- a/src/memory.c +++ b/src/memory.c @@ -21,18 +21,32 @@ */ +#include + #include "memory.h" #include "story.h" +#include "state.h" #include "zork1.h" // The F256 has 512k of RAM. We use everything except the lower 64k. -static uint8_t RAM[1024 * (512 - 64)]; +static uint8_t _RAM[1024 * (512 - 64)]; uint8_t memoryByte(uint16_t address) { - return RAM[address]; + return _RAM[address]; +} + + +void memorySetByte(uint16_t address, uint8_t value) { + _RAM[address] = value; +} + + +void memorySetWord(uint16_t address, uint16_t value) { + _RAM[address] = (value & 0xff00) << 8; // MSB first. + _RAM[address + 1] = value & 0x00ff; } @@ -47,25 +61,42 @@ uint32_t memoryUnpackAddress(uint16_t address, uint8_t type) { return (uint32_t)address * 4; case 6: if (type == MEMORY_ROUTINE) { - return ((uint32_t)address * 4) + storyRoutineOffset; + return ((uint32_t)address * 4) + storyRoutinesOffset(); } else { - return ((uint32_t)address * 4) + storyStringOffset; + return ((uint32_t)address * 4) + storyStringsOffset(); } case 8: return (uint32_t)address * 8; } - return ((uint16_t)RAM[address] << 8) | ((uint16_t)RAM[address + 1]); + return ((uint16_t)_RAM[address] << 8) | ((uint16_t)_RAM[address + 1]); } uint16_t memoryWord(uint16_t address) { - return ((uint16_t)RAM[address] << 8) | ((uint16_t)RAM[address + 1]); + return ((uint16_t)_RAM[address] << 8) | ((uint16_t)_RAM[address + 1]); } void memoryLoadStory(void) { - uint32_t x; // For now, we just copy an embedded Zork 1 into RAM. - for (x=0; x + +#include "story.h" +#include "state.h" +#include "opcodes.h" +#include "oc_0op.h" +#include "oc_1op.h" +#include "oc_2op.h" +#include "oc_var_op.h" +#include "oc_ext.h" + + +// Macros to declare implemented opcodes. +#define OP(name) __state.opcodes[_nextOpcode++] = opcodes_##name +#define OPn(num, name) __state.opcodes[num] = opcodes_##name +#define OPX(name) __state.extOpcodes[_nextOpcode++] = opcodes_ext_##name +#define OPXn(num, name) __state.extOpcodes[num] = opcodes_ext_##name + +// Macros to declare un-implemented opcodes. +#define mOP(name) _nextOpcode++ +#define mOPn(num, name) +#define mOPX(name) _nextOpcode++ +#define mOPXn(num, name) + + +int16_t _nextOpcode; + + +void opcodesSetup(void) { + + // 2-operand instructions... + _nextOpcode = 1; + OP(je); + mOP(jl); + mOP(jg); + mOP(dec_chk); + mOP(inc_chk); + mOP(jin); + mOP(test); + mOP(or); + mOP(and); + OP(test_attr); + mOP(set_attr); + mOP(clear_attr); + OP(store); + mOP(insert_obj); + OP(loadw); + mOP(loadb); + mOP(get_prop); + mOP(get_prop_addr); + mOP(get_next_prop); + OP(add); + OP(sub); + mOP(mul); + mOP(div); + mOP(mod); // oc# 24 + + // 1-operand instructions... + _nextOpcode = 128; + OP(jz); + mOP(get_sibling); + mOP(get_child); + mOP(get_parent); + mOP(get_prop_len); + mOP(inc); + mOP(dec); // oc# 135 + + _nextOpcode = 137; + mOP(print_addr); + mOP(remove_obj); + mOP(print_obj); + OP(ret); + OP(jump); + mOP(print_paddr); + mOP(load); + mOP(not); // oc# 143 + + // 0-operand instructions... + _nextOpcode = 176; + mOP(rtrue); + mOP(rfalse); + OP(print); + mOP(print_ret); + mOP(nop); + mOP(save); + mOP(restore); + mOP(restart); + mOP(ret_popped); + mOP(pop); + mOP(quit); + OP(new_line); // oc# 187 + + // variable operand instructions... + _nextOpcode = 224; + OP(call); + OP(storew); + mOP(storeb); + OP(put_prop); + mOP(read); + mOP(print_char); + mOP(print_num); + mOP(random); + mOP(push); + mOP(pull); // oc# 233 + + if (storyVersion() < 3) return; + + _nextOpcode = 188; + mOP(show_status); + mOP(verify); // oc# 189 + + _nextOpcode = 234; + mOP(split_window); + mOP(set_window); // oc# 235 + + _nextOpcode = 243; + mOP(output_stream); + mOP(input_stream); + mOP(sound_effect); // oc# 245 + + if (storyVersion() < 4) return; + + // show_status is illegal in ver4+, but a build of Wishbringer + // accidentally calls it, so always treat it as NOP instead. + mOPn(188, opcode_nop); + mOPn(25, call_2s); + mOPn(180, save_ver4); + mOPn(224, call_vs); + mOPn(228, sread_ver4); + + _nextOpcode = 236; + mOP(call_vs2); + mOP(erase_window); + mOP(erase_line); + mOP(set_cursor); + mOP(get_cursor); + mOP(set_text_style); + mOP(buffer_mode); // oc# 242 + + _nextOpcode = 246; + mOP(read_char); + mOP(scan_table); // oc# 247 + + if (storyVersion() < 5) return; + + _nextOpcode = 26; + mOP(call_2n); + mOP(set_colour); + mOP(throw); + + mOPn(136, call_1s); + mOPn(143, call_1n); + mOPn(185, catch); + mOPn(191, piracy); + mOPn(228, aread); + mOPn(243, output_stream_ver5); + mOPn(245, sound_effect_ver5); + + _nextOpcode = 248; + mOP(not_ver5); + mOP(call_vn); + mOP(call_vn2); + mOP(tokenise); + mOP(encode_text); + mOP(copy_table); + mOP(print_table); + mOP(check_arg_count); // oc# 255 + + // this is the "save" and "restore" opcodes in ver1-4; illegal in ver5+. + // in ver5+, they use extended opcodes 0 and 1 for these. + __state.opcodes[180] = 0; + __state.opcodes[181] = 0; + + // extended opcodes in ver5+ ... + _nextOpcode = 0; + mOPX(save_ext); + mOPX(restore_ext); + mOPX(log_shift); + mOPX(art_shift); + mOPX(set_font); // xop# 4 + + _nextOpcode = 9; + mOPX(save_undo); + mOPX(restore_undo); + mOPX(print_unicode); + mOPX(check_unicode); + mOPX(set_true_colour); // xop# 13 + + if (storyVersion() < 6) return; + + _nextOpcode = 27; + mOP(set_colour_ver6); + mOP(throw_ver6); // op# 28 + + mOPn(185, catch_ver6); + mOPn(233, pull_ver6); + + _nextOpcode = 238; + mOP(erase_line_ver6); + mOP(set_cursor_ver6); // op# 239 + + mOPn(243, output_stream_ver6); + mOPn(248, not_ver6); + + _nextOpcode = 4; + mOPX(set_font_ver6); + mOPX(draw_picture); + mOPX(picture_data); + mOPX(erase_picture); + mOPX(set_margins); // xop# 8 + + mOPXn(13, set_true_colour_ver6); + + _nextOpcode = 16; + mOPX(move_window); + mOPX(window_size); + mOPX(window_style); + mOPX(get_wind_prop); + mOPX(scroll_window); + mOPX(pop_stack); + mOPX(read_mouse); + mOPX(mouse_window); + mOPX(push_stack); + mOPX(put_wind_prop); + mOPX(print_form); + mOPX(make_menu); + mOPX(picture_table); + mOPX(buffer_screen); // xop# 29 +} + + diff --git a/src/state.c b/src/state.c new file mode 100644 index 0000000..56716fc --- /dev/null +++ b/src/state.c @@ -0,0 +1,27 @@ +/* + * Copyright (c) 2024 Scott Duensing, scott@kangaroopunch.com + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + + +#include "state.h" + + +stateT __state;