diff options
| author | Franklin Wei <frankhwei536@gmail.com> | 2014-10-13 21:00:47 -0400 |
|---|---|---|
| committer | Michael Giacomelli <giac2000@hotmail.com> | 2014-12-23 23:48:12 +0100 |
| commit | 33cb13dee5a527ac445ea1b13d42723e4eb3e3b0 (patch) | |
| tree | 3ce36ea21b53377b900049143e77e74b77ca1b0d /apps/plugins/xworld/vm.h | |
| parent | b681e932a9da797249ddc0e4ccab7ed7cf50fd41 (diff) | |
| download | rockbox-33cb13dee5a527ac445ea1b13d42723e4eb3e3b0.zip rockbox-33cb13dee5a527ac445ea1b13d42723e4eb3e3b0.tar.gz rockbox-33cb13dee5a527ac445ea1b13d42723e4eb3e3b0.tar.bz2 rockbox-33cb13dee5a527ac445ea1b13d42723e4eb3e3b0.tar.xz | |
Xworld - Another World interpreter for Rockbox
Co-conspirators: Franklin Wei, Benjamin Brown
--------------------------------------------------------------------
This work is based on:
- Fabien Sanglard's "Fabother World" based on
- Piotr Padkowski's newRaw interpreter which was based on
- Gregory Montoir's reverse engineering of
- Eric Chahi's assembly code
--------------------------------------------------------------------
Progress:
* The plugin runs pretty nicely (with sound!) on most color targets
* Keymaps for color LCD targets are complete
* The manual entry is finished
* Grayscale/monochrome support is NOT PLANNED
- the game looks horrible in grayscale! :p
--------------------------------------------------------------------
Notes:
* The original game strings were built-in to the executable, and
were copyrighted and could not be used.
* This port ships with an alternate set of strings by default, but
can load the "official" strings from a file at runtime.
--------------------------------------------------------------------
To be done (in descending order of importance):
* vertical stride compatibility <30% done>
* optimization <10% done>
Change-Id: I3155b0d97c2ac470cb8a2040f40d4139ddcebfa5
Reviewed-on: http://gerrit.rockbox.org/1077
Reviewed-by: Michael Giacomelli <giac2000@hotmail.com>
Diffstat (limited to 'apps/plugins/xworld/vm.h')
| -rw-r--r-- | apps/plugins/xworld/vm.h | 184 |
1 files changed, 184 insertions, 0 deletions
diff --git a/apps/plugins/xworld/vm.h b/apps/plugins/xworld/vm.h new file mode 100644 index 0000000..1409dd4 --- /dev/null +++ b/apps/plugins/xworld/vm.h @@ -0,0 +1,184 @@ +/*************************************************************************** + * __________ __ ___. + * Open \______ \ ____ ____ | | _\_ |__ _______ ___ + * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ / + * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < < + * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \ + * \/ \/ \/ \/ \/ + * $Id$ + * + * Copyright (C) 2014 Franklin Wei, Benjamin Brown + * Copyright (C) 2004 Gregory Montoir + * + * 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 software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY + * KIND, either express or implied. + * + ***************************************************************************/ + +#ifndef __LOGIC_H__ +#define __LOGIC_H__ + + + +#include "intern.h" + +#define VM_NUM_THREADS 64 +#define VM_NUM_VARIABLES 256 +#define VM_NO_SETVEC_REQUESTED 0xFFFF +#define VM_INACTIVE_THREAD 0xFFFF + + +#define VM_VARIABLE_RANDOM_SEED 0x3C + +#define VM_VARIABLE_LAST_KEYCHAR 0xDA + +#define VM_VARIABLE_HERO_POS_UP_DOWN 0xE5 +#define VM_VARIABLE_MUS_MARK 0xF4 + +#define VM_VARIABLE_SCROLL_Y 0xF9 +#define VM_VARIABLE_HERO_ACTION 0xFA +#define VM_VARIABLE_HERO_POS_JUMP_DOWN 0xFB +#define VM_VARIABLE_HERO_POS_LEFT_RIGHT 0xFC +#define VM_VARIABLE_HERO_POS_MASK 0xFD +#define VM_VARIABLE_HERO_ACTION_POS_MASK 0xFE +#define VM_VARIABLE_PAUSE_SLICES 0xFF + +struct Mixer; +struct Resource; +struct Serializer; +struct SfxPlayer; +struct System; +struct Video; + +//For threadsData navigation +#define PC_OFFSET 0 +#define REQUESTED_PC_OFFSET 1 +#define NUM_DATA_FIELDS 2 + +//For vmIsChannelActive navigation +#define CURR_STATE 0 +#define REQUESTED_STATE 1 +#define NUM_THREAD_FIELDS 2 + +struct VirtualMachine; + +void vm_create(struct VirtualMachine*, struct Mixer *mix, struct Resource *res, struct SfxPlayer *ply, struct Video *vid, struct System *stub); +void vm_init(struct VirtualMachine*); + +void vm_op_movConst(struct VirtualMachine*); +void vm_op_mov(struct VirtualMachine*); +void vm_op_add(struct VirtualMachine*); +void vm_op_addConst(struct VirtualMachine*); +void vm_op_call(struct VirtualMachine*); +void vm_op_ret(struct VirtualMachine*); +void vm_op_pauseThread(struct VirtualMachine*); +void vm_op_jmp(struct VirtualMachine*); +void vm_op_setSetVect(struct VirtualMachine*); +void vm_op_jnz(struct VirtualMachine*); +void vm_op_condJmp(struct VirtualMachine*); +void vm_op_setPalette(struct VirtualMachine*); +void vm_op_resetThread(struct VirtualMachine*); +void vm_op_selectVideoPage(struct VirtualMachine*); +void vm_op_fillVideoPage(struct VirtualMachine*); +void vm_op_copyVideoPage(struct VirtualMachine*); +void vm_op_blitFramebuffer(struct VirtualMachine*); +void vm_op_killThread(struct VirtualMachine*); +void vm_op_drawString(struct VirtualMachine*); +void vm_op_sub(struct VirtualMachine*); +void vm_op_and(struct VirtualMachine*); +void vm_op_or(struct VirtualMachine*); +void vm_op_shl(struct VirtualMachine*); +void vm_op_shr(struct VirtualMachine*); +void vm_op_playSound(struct VirtualMachine*); +void vm_op_updateMemList(struct VirtualMachine*); +void vm_op_playMusic(struct VirtualMachine*); + +void vm_initForPart(struct VirtualMachine*, uint16_t partId); +void vm_setupPart(struct VirtualMachine*, uint16_t partId); +void vm_checkThreadRequests(struct VirtualMachine*); +void vm_hostFrame(struct VirtualMachine*); +void vm_executeThread(struct VirtualMachine*); + +void vm_inp_updatePlayer(struct VirtualMachine*); +void vm_inp_handleSpecialKeys(struct VirtualMachine*); + +void vm_snd_playSound(struct VirtualMachine*, uint16_t resNum, uint8_t freq, uint8_t vol, uint8_t channel); +void vm_snd_playMusic(struct VirtualMachine*, uint16_t resNum, uint16_t delay, uint8_t pos); + +void vm_saveOrLoad(struct VirtualMachine*, struct Serializer *ser); +void vm_bypassProtection(struct VirtualMachine*); + +typedef void (*OpcodeStub)(struct VirtualMachine*); + +// The type of entries in opcodeTable. This allows "fast" branching +static const OpcodeStub vm_opcodeTable[] = { + /* 0x00 */ + &vm_op_movConst, + &vm_op_mov, + &vm_op_add, + &vm_op_addConst, + /* 0x04 */ + &vm_op_call, + &vm_op_ret, + &vm_op_pauseThread, + &vm_op_jmp, + /* 0x08 */ + &vm_op_setSetVect, + &vm_op_jnz, + &vm_op_condJmp, + &vm_op_setPalette, + /* 0x0C */ + &vm_op_resetThread, + &vm_op_selectVideoPage, + &vm_op_fillVideoPage, + &vm_op_copyVideoPage, + /* 0x10 */ + &vm_op_blitFramebuffer, + &vm_op_killThread, + &vm_op_drawString, + &vm_op_sub, + /* 0x14 */ + &vm_op_and, + &vm_op_or, + &vm_op_shl, + &vm_op_shr, + /* 0x18 */ + &vm_op_playSound, + &vm_op_updateMemList, + &vm_op_playMusic +}; + +struct VirtualMachine { + //This table is used to play a sound + //static const uint16_t frequenceTable[]; + /* FW: moved from staticres.c to vm.c */ + + struct Mixer *mixer; + struct Resource *res; + struct SfxPlayer *player; + struct Video *video; + struct System *sys; + + int16_t vmVariables[VM_NUM_VARIABLES]; + uint16_t _scriptStackCalls[VM_NUM_THREADS]; + + uint16_t threadsData[NUM_DATA_FIELDS][VM_NUM_THREADS]; + // This array is used: + // 0 to save the channel's instruction pointer + // when the channel release control (this happens on a break). + + // 1 When a setVec is requested for the next vm frame. + + uint8_t vmIsChannelActive[NUM_THREAD_FIELDS][VM_NUM_THREADS]; + + struct Ptr _scriptPtr; + uint8_t _stackPtr; + bool gotoNextThread; + bool _fastMode; +}; +#endif |