[Armadeus-commitlog] SF.net SVN: armadeus: [572] trunk/target/demos
Brought to you by:
sszy
|
From: <ar...@us...> - 2007-02-25 11:17:38
|
Revision: 572
http://armadeus.svn.sourceforge.net/armadeus/?rev=572&view=rev
Author: artemys
Date: 2007-02-25 03:17:37 -0800 (Sun, 25 Feb 2007)
Log Message:
-----------
[DEMOS] First (usable but buggy) version of Wolfenstein3D for Armadeus Project's boards.
Added Paths:
-----------
trunk/target/demos/wolfenstein3d/
trunk/target/demos/wolfenstein3d/BUGS.txt
trunk/target/demos/wolfenstein3d/IDEAS
trunk/target/demos/wolfenstein3d/Makefile
trunk/target/demos/wolfenstein3d/NOTES
trunk/target/demos/wolfenstein3d/README
trunk/target/demos/wolfenstein3d/TODO
trunk/target/demos/wolfenstein3d/audiosod.h
trunk/target/demos/wolfenstein3d/audiowl6.h
trunk/target/demos/wolfenstein3d/docs/
trunk/target/demos/wolfenstein3d/docs/goodstuf.txt
trunk/target/demos/wolfenstein3d/docs/release.txt
trunk/target/demos/wolfenstein3d/fmopl.c
trunk/target/demos/wolfenstein3d/fmopl.h
trunk/target/demos/wolfenstein3d/foreign.h
trunk/target/demos/wolfenstein3d/gfxv_sdm.h
trunk/target/demos/wolfenstein3d/gfxv_sod.h
trunk/target/demos/wolfenstein3d/gfxv_wl1.h
trunk/target/demos/wolfenstein3d/gfxv_wl6.h
trunk/target/demos/wolfenstein3d/id_ca.c
trunk/target/demos/wolfenstein3d/id_ca.h
trunk/target/demos/wolfenstein3d/id_heads.h
trunk/target/demos/wolfenstein3d/id_us.c
trunk/target/demos/wolfenstein3d/id_us.h
trunk/target/demos/wolfenstein3d/id_vh.c
trunk/target/demos/wolfenstein3d/id_vh.h
trunk/target/demos/wolfenstein3d/misc.c
trunk/target/demos/wolfenstein3d/misc.h
trunk/target/demos/wolfenstein3d/objs.c
trunk/target/demos/wolfenstein3d/sd_comm.c
trunk/target/demos/wolfenstein3d/sd_comm.h
trunk/target/demos/wolfenstein3d/sd_null.c
trunk/target/demos/wolfenstein3d/sd_oss.c
trunk/target/demos/wolfenstein3d/version.h
trunk/target/demos/wolfenstein3d/vi_comm.c
trunk/target/demos/wolfenstein3d/vi_comm.h
trunk/target/demos/wolfenstein3d/vi_sdl.c
trunk/target/demos/wolfenstein3d/wl_act1.c
trunk/target/demos/wolfenstein3d/wl_act2.c
trunk/target/demos/wolfenstein3d/wl_act3.c
trunk/target/demos/wolfenstein3d/wl_act3.h
trunk/target/demos/wolfenstein3d/wl_agent.c
trunk/target/demos/wolfenstein3d/wl_debug.c
trunk/target/demos/wolfenstein3d/wl_def.h
trunk/target/demos/wolfenstein3d/wl_draw.c
trunk/target/demos/wolfenstein3d/wl_game.c
trunk/target/demos/wolfenstein3d/wl_inter.c
trunk/target/demos/wolfenstein3d/wl_main.c
trunk/target/demos/wolfenstein3d/wl_menu.c
trunk/target/demos/wolfenstein3d/wl_menu.h
trunk/target/demos/wolfenstein3d/wl_play.c
trunk/target/demos/wolfenstein3d/wl_state.c
trunk/target/demos/wolfenstein3d/wl_text.c
Added: trunk/target/demos/wolfenstein3d/BUGS.txt
===================================================================
--- trunk/target/demos/wolfenstein3d/BUGS.txt (rev 0)
+++ trunk/target/demos/wolfenstein3d/BUGS.txt 2007-02-25 11:17:37 UTC (rev 572)
@@ -0,0 +1,30 @@
+LIST OF BUGS on Armadeus Project port:
+--------------------------------------
+
+1]-----------
+
+When shooting, player can't stop and when no more ammunition game exits with an error.
+When provocating a SegFault instead of an error, here is the backtrace:
+
+Core was generated by `../sdlwolf3d'.
+Program terminated with signal 11, Segmentation fault.
+#0 0x0000b6c0 in PML_ReadFromFile (buf=0xb6bb8 "", offset=0, length=0)
+ at id_ca.c:767
+767 id_ca.c: No such file or directory.
+ in id_ca.c
+(gdb) bt
+#0 0x0000b6c0 in PML_ReadFromFile (buf=0xb6bb8 "", offset=0, length=0)
+ at id_ca.c:767
+#1 0x0000ba60 in PM_GetPage (pagenum=636) at id_ca.c:832
+#2 0x0002d4c0 in DeCompileSprite (shapenum=530) at wl_draw.c:768
+#3 0x0002d7ec in SimpleScaleShape (xcenter=120, shapenum=530, height=121)
+ at wl_draw.c:825
+#4 0x0002c6b8 in DrawPlayerWeapon () at wl_draw.c:419
+#5 0x0002d030 in ThreeDRefresh () at wl_draw.c:673
+#6 0x00022894 in PlayLoop () at wl_play.c:1218
+#7 0x00018364 in GameLoop () at wl_game.c:1067
+#8 0x0002a1c8 in DemoLoop () at wl_main.c:1253
+#9 0x0002a298 in WolfMain (argc=1, argv=0xbe8efdc4) at wl_main.c:1288
+#10 0x0002ea40 in main (argc=1, argv=0xbe8efdc4) at vi_sdl.c:14
+
+Bug doesn't occur when game is compiled for PC
\ No newline at end of file
Added: trunk/target/demos/wolfenstein3d/IDEAS
===================================================================
--- trunk/target/demos/wolfenstein3d/IDEAS (rev 0)
+++ trunk/target/demos/wolfenstein3d/IDEAS 2007-02-25 11:17:37 UTC (rev 572)
@@ -0,0 +1,22 @@
+* One binary, any game type.
+* A key to change viewsize while playing
+* Game able to work with any resolution in software mode
+* Audio support using OpenAL
+* Add support for the Mac version, if possible
+* Network support!
+* Fully compile with no warnings/errors using -Wall -ansi -pedantic and with
+ other compilers (would need to turn off warnings about unused parameters)
+* Port to: Linux/SVGAlib, Unix/OpenGL?, Linux/SDL, DOS/Allegro?, Win32/GDI?,
+ Win32/DX?, Win32/D3D?, Win32/OpenGL?, BeOS?, MacOS?, QNX?
+* Ease in using demos. Playing demos from files, recording to files, batch
+ playing, and so on.
+* Make Wolf3D the game it was originally planned to be... More strategy...
+* Empty TODO File
+* Test with other available mods (that were compatible with the original
+ game)
+* Unified input handling
+* Configuration files and save games which work regardless of operating
+ system/processor/binary build
+* Suite of utilities to edit the game data.
+* Resolve any endian issues
+* Add a ViewMap?
Added: trunk/target/demos/wolfenstein3d/Makefile
===================================================================
--- trunk/target/demos/wolfenstein3d/Makefile (rev 0)
+++ trunk/target/demos/wolfenstein3d/Makefile 2007-02-25 11:17:37 UTC (rev 572)
@@ -0,0 +1,69 @@
+ifeq ($(TARGET),arm)
+INCLUDE_PATH="../../../buildroot/build_arm_nofpu/SDL-1.2.11/include/"
+LIBRARY_PATH="../../../buildroot/build_arm_nofpu/root/usr/lib/"
+INSTALL_DIR="../../../buildroot/build_arm_nofpu/root/usr/bin/"
+CC:=../../../buildroot/build_arm_nofpu/staging_dir/bin/arm-linux-gcc
+DEFINES=TARGET
+ROOT=../../../buildroot/build_arm_nofpu/staging_dir/
+else
+INCLUDE_PATH="/usr/include/SDL"
+LIBRARY_PATH="/usr/lib/"
+INSTALL_DIR="."
+CC=gcc
+DEFINES=HOST
+endif
+
+CFLAGS = -O2 -Wall
+#CFLAGS = -g -Wall -pedantic
+#CFLAGS = -g -O2 -Wall -pedantic
+#CFLAGS = -Wall -O6 -fomit-frame-pointer -ffast-math -funroll-loops -mpentiumpro -mcpu=pentiumpro -march=pentiumpro
+#CFLAGS = -g -Wall -pedantic -std=gnu99
+#CFLAGS = -Os -Wall -pedantic
+#CFLAGS = -Os -Wall -fomit-frame-pointer -ffast-math -mpentiumpro -mcpu=pentiumpro -march=pentiumpro
+
+OBJS = objs.o misc.o id_ca.o id_vh.o id_us.o \
+ wl_act1.o wl_act2.o wl_act3.o wl_agent.o wl_game.o \
+ wl_inter.o wl_menu.o wl_play.o wl_state.o wl_text.o wl_main.o \
+ wl_debug.o vi_comm.o sd_comm.o
+ROBJS = wl_draw.o
+DOBJS = $(OBJS) $(ROBJS) vi_sdl.o
+
+LFLAGS = -lm
+
+OBJS += sd_null.o
+#OBJS += sd_oss.o fmopl.o
+#CFLAGS += -D_REENTRANT
+#LFLAGS += -lpthread
+
+CFLAGS += `$(ROOT)/usr/bin/sdl-config --cflags`
+
+DLFLAGS = $(LFLAGS) `$(ROOT)/usr/bin/sdl-config --libs`
+
+NASM = nasm
+
+.SUFFIXES: .asm
+
+all: sdlwolf3d
+
+$(DOBJS): version.h id_heads.h wl_def.h
+
+.asm.o:
+ $(NASM) -f elf -o $@ $<
+
+swolf3d: $(SOBJS)
+ $(CC) -o swolf3d $(SOBJS) $(SLFLAGS)
+
+xwolf3d: $(XOBJS)
+ $(CC) -o xwolf3d $(XOBJS) $(XLFLAGS)
+
+sdlwolf3d: $(DOBJS)
+ $(CC) -o sdlwolf3d $(DOBJS) $(DLFLAGS)
+
+clean:
+ rm -rf swolf3d xwolf3d sdlwolf3d *.o
+
+distclean: clean
+ rm -rf *~ DEADJOE
+
+forced: distclean all
+ rm -rf *.o
Added: trunk/target/demos/wolfenstein3d/NOTES
===================================================================
--- trunk/target/demos/wolfenstein3d/NOTES (rev 0)
+++ trunk/target/demos/wolfenstein3d/NOTES 2007-02-25 11:17:37 UTC (rev 572)
@@ -0,0 +1,71 @@
+Just some random facts/thoughts/ideas/musings:
+
+* Wolfenstein 3D for:
+ - PC [May 5, 1992]
+ - PC (Spear of Destiny) [September 18, 1992]
+ - SNES
+ - Macintosh
+ - Jaguar
+ - Apple IIGS: http://www.sheppyware.com/products/a2/wolf3d/
+ - 3DO
+ - Acorn/Archemedes: http://www.users.globalnet.co.uk/~brlowe/info2.htm
+
+* Rumored/Never Released?
+ - Atari Lynx
+ - Sega Genesis (was cancelled after a month)
+ - Japanese PC Version (referenced in source)
+ - Spanish PC Version (referenced in source)
+ - Japanese Mac Version (referenced in source ??)
+
+* Unofficial ports:
+ - Linux (this, xwolf, wolfgl)
+ XWolf: http://www.sirius.demon.co.uk/xwolf/
+ - Amiga (port of my first pc wolf3d linux port)
+ http://www.silab.dsi.unimi.it/~cs556770/wolf3d/
+ - Windows
+ WolfGL: http://www.sourceforge.net/projects/wolfgl/
+ Wolf DX: http://www.phoebe.co.uk/glwolf/
+ NewWolf: http://wolfgl.narod.ru/
+
+* PC source released Jul 21, 1995 [http://www.3dgamers.com/games/wolfenstein3d/]
+ - ftp://ftp.idsoftware.com/idstuff/source/wolfsrc.zip
+ * now many ports, projects, etc
+ - http://www.abraxis.com/brucel/wolf3d.html
+ - http://www.wolf3dbunker.com
+ - http://www.wolf3dmansion.com/index.phtml
+* Macintosh source released January 21, 2000
+ - http://www.maccentral.com/news/0001/24.wolf3d.shtml
+* TED5 source (map editor used for tons of games including wolf3d)
+ - ftp://ftp.3drealms.com/misc/ted5.zip
+* Games which used the Wolfenstein 3D Engine:
+ - Blake Stone (Aliens of Gold, Planet Strike)
+ - Corridor 7
+ - Operation Body Count
+
+Apogee FAQ (lots of information regarding Wolf3D):
+- http://www.rinkworks.com/apogee/
+
+Wolfenstein 3D FAQ:
+- http://www.wolf3d.co.uk/Wolfenstein-3D.faq
+
+How to get Wolfenstein 3D:
+- Wolfenstein 3D Shareware:
+ ftp://ftp.gamers.org/pub/games/wolf3d/official/1wolf14.zip
+ http://www.3drealms.com/downloads.html
+- Spear of Destiny Demo:
+ ftp://ftp.gamers.org/pub/3daction/00archives/speardestiny/releases/soddemo2.zip
+- Macintosh versions:
+ - Search for the shareware version (First Encounter) on Macintosh Shareware
+ websites.
+ - The commercial Macintosh version (Second Encounter, not Third) is out of
+ print, but you may find someone selling it on websites such as
+ http://www.ebay.com.
+- Where to Buy:
+ http://www.3drealms.com
+ http://www.idsoftware.com (look for how to order direct, etc)
+ http://www.activison.com
+
+
+-----
+Steven Fuller
+re...@ic...
Added: trunk/target/demos/wolfenstein3d/README
===================================================================
--- trunk/target/demos/wolfenstein3d/README (rev 0)
+++ trunk/target/demos/wolfenstein3d/README 2007-02-25 11:17:37 UTC (rev 572)
@@ -0,0 +1,74 @@
+This is a "quick and dirty" port of "Wolfenstein 3D Linux" to the Armadeus Project
+boards. You will need a keyboard connected to your board to appreciate this game ! ;-)
+
+Original sources were found here: http://www.icculus.org/wolf3d/
+
+To compile it:
+- for your Host: make
+- for your board; make TARGET=arm
+
+To use it you will need to have original game data (wolfdata.zip):
+http://sourceforge.net/project/showfiles.php?group_id=11904
+Launch the game executable (sdlwolf3d) from the data directory.
+
+There is still some bugs, please consult BUGS.txt.
+
+Julien Boibessot
+jul...@ar...
+
+
+Original text start here: --------------------------->>>>
+
+This is a October 28, 2001 Snapshot of "Wolfenstein 3D Linux" by Steven
+Fuller. It is an unofficial Linux port of the id Software game, Wolfenstein
+3D (1992).
+
+I am releasing this snapshot to find out what still needs to be done to make
+this port 'complete.' So all feedback is welcome.
+
+My Goal:
+Take the 1992 DOS game, and bring it to Linux. Extra features will be kept
+at a minimum.
+
+To compile, type: make
+Be sure to have SDL 1.2 (http://www.libsdl.org) installed.
+
+To change which version of the game is used, edit version.h (change the
+#define WMODE <number> line, replacing <number> with: 0 for the Wolfenstein
+3D Shareware (WL1), Wolfenstein 3D registered, all six episodes (WL6), the
+Spear of Destiny Demo (SDM), and Spear of Destiny (SOD). Make sure you have
+the latest versions of the game). Wolfenstein 3D, the first three episodes
+(WL3) is not supported; let me know if you have a copy (or you could pick up
+a copy of the full version...). To find out where to get the
+demos/shareware, look in NOTES.
+
+Sound support is there. Edit the Makefile (find the line that has 'OBJS +=
+sd_null.o'. Add a # in front of it, and remove the # from the next three
+lines. Recompile and sound should work.)
+
+If you have anything to contribute to NOTES (interesting facts, etc),
+please let me know.
+
+Note:
+Config files are not implemented. They should be implemented in the next
+release.
+
+If you like your Wolf3D with OpenGL, be sure to check out WolfGL:
+http://www.sourceforge.net/projects/wolfgl/
+
+
+Thanks:
+* id Software
+* David Haslam
+* Ryan Gordon
+* Bill Heineman
+* Dan Olson
+* Leonardo Zide
+* Tatsuyuki Satoh
+* Chuck Mason
+* And everyone who has emailed me about this code! Thanks!
+
+-----
+Steven Fuller
+re...@ic...
+http://icculus.org/wolf3d/
Added: trunk/target/demos/wolfenstein3d/TODO
===================================================================
--- trunk/target/demos/wolfenstein3d/TODO (rev 0)
+++ trunk/target/demos/wolfenstein3d/TODO 2007-02-25 11:17:37 UTC (rev 572)
@@ -0,0 +1,137 @@
+Priority Levels: I > R > M (I, R required to be complete before full release)
+Program: P=PC Wolf3D, M=Mac Wolf3D, B=Both
+P R - create a better "read direction" for menu movement
+P M - convert while (Keyboard[sc_Blah]) IN_CheckAck() to IN_WaitKeyDown(sc..
+P I - finish changing the game movement to the new style
+P R - update input menus/config
+P M - cleanup/rewrite menu code
+P R - update sound menus/config
+P I - rewrite sound code: get rid of packed structs, clean up thread stuff
+P I - fix issues (speed, hacks) with variable screen size
+P M - BSP trees (or something similar), then OpenGL support
+M R - port menu code (after fixed up)
+M R - add sound
+M M - complete/fix opengl mode
+M M - add music (would need to RE the sound lib)
+B I - complete savegame, config formats
+M I - add SDL
+B R - decide if to keep SVGA/X11 targets
+B M - configure scripts? (autoconf/automake/etc)
+B M - port to dreamcast?
+B M - add compression to savegames/config
+B I - play through game (w/ sound and music) to make sure things work
+B M - use stdint.h where appropiate
+B M - finish serializing reads/writes, endian issues.
+ - PC version should be OK for loading -- savegames not yet tested.
+P M - fix raycast bug where at certain points you can see through corners
+B I - merge other TODO lists into this list
+B M - use something like config file or getenv to point at data directories
+P I - finish handling/mapping for all keys in sys. specific code
+B I - add mouse support
+B M - add joystick/gamepad support
+P I - fill in the new fizzlefade function
+P I - add sound "emulation" to the necessary targets so WaitSoundDone works
+P R - change boolean SD_PlaySound to void SD_PlaySound
+P M - position pushwall sounds
+P M - id_ca.c cache code: fix/readd/rewrite the "garbage collection" system
+P M - rewrite id_ca.c: uniform memory handling system
+P M - either move id_heads into wl_def or split header files apart
+P R - rewrite fmopl.c to avoid licensing issues (or provide as a separate patch? may not be advisable since id owns copyright on wolf code)
+P R - remove CA_LoadAllSounds now that the sound code does everything
+B I - README, etc.
+B M - Code Documentation
+P M - rename visable to visible
+B M - change the commandline handling (use something like getopt?)
+P R - rewrite RLEWexpand to not use words
+B M - openal support
+B I - when window loses focus, it should clear the keys
+B M - [X11] use the data in the visual/image for formatting colors
+
+Complete:
+P I - fix or remove fizzle fade
+ - Removed [nice, but very hacky effect]
+------------------------------------------------------------------------------
+* what exactly is the point of all the DigiMode checks in wl_act2.c?
+* add ylookup?
+* remove farmapylookup?
+* would be nice if Quit() used vsnprintf, etc
+* actor walking through door is drawn in front of door: near end of E1M1 for
+example (is this reproducible?)
+* use static and const where appropriate
+* clean up header files, especially wl_def.h, where some declarations aren't
+in the right place
+* remove check for debugmode?
+* check filehandling (ex, file missing, bad file type, and such)
+PlayDemoFromFile specifically
+* deathcam went by too fast, same with the spear of destiny ending animation
+ - probably due to waiting for sounds to finish
+* split wl_draw into two files (draw independent, draw dependent)
+------------------------------------------------------------------------------
+void ControlMovement(objtype *ob) (wl_agent.c)
+void UpdateInput() / void PollControls() (wl_play.c)
+------------------------------------------------------------------------------
+Control Menu:
+* TODO
+
+Sound Menu:
+* Digital Sound Effects:
+- On [PCM]
+- Off
+* Sound Effects
+- On [AdLib/OPL2]
+- PC Speaker?
+- Off
+* Music:
+- On [AdLib/OPL2]
+- Off
+------------------------------------------------------------------------------
+Where to Look for/Save Files:
+
+~/.wolf3d
+cwd
+/usr/games/share
+$ENVIRONMENT_VARIABLE
+
+Need to establish where to look, order to look, strict/lenient loading (load
+all files from the determined game directory, or look in order for each
+file), and where to put savegames and config files.
+------------------------------------------------------------------------------
+Save game header:
+8 bytes: WOLF3D, 0, 0
+4 bytes: SAV, 0
+4 bytes: version (integer)
+4 bytes: game type (WL1, WL6, SDM, SOD)
+4 bytes: seconds past 1970 (time(NULL))
+4 bytes: padding
+4 bytes: checksum for the data (after text string)
+32 bytes: text string
+
+Version 0xFFFFFFFF Data: (Unofficial Save Game data)
+<see wl_main.c>
+
+Version 0x00000000 Data: (Official)
+<undetermined>
+
+Version 0x00000001 Data: (Official)
+<undetermined but will be compressed>
+
+---
+
+Config header:
+8 bytes: WOLF3D, 0, 0
+4 bytes: CFG, 0
+4 bytes: version (integer)
+4 bytes: game type (WL1, WL6, SDM, SOD)
+4 bytes: seconds past 1970 (time(NULL))
+4 bytes: padding
+4 bytes: checksum for the data
+
+Version 0xFFFFFFFF Data: (Unofficial Config data)
+<see wl_main.c>
+
+Version 0x00000000 Data: (Official)
+<undetermined>
+
+Version 0x00000001 Data: (Official)
+<undetermined but will be compressed>
+
Added: trunk/target/demos/wolfenstein3d/audiosod.h
===================================================================
--- trunk/target/demos/wolfenstein3d/audiosod.h (rev 0)
+++ trunk/target/demos/wolfenstein3d/audiosod.h 2007-02-25 11:17:37 UTC (rev 572)
@@ -0,0 +1,122 @@
+#define NUMSOUNDS 81
+#define NUMSNDCHUNKS 267
+
+/* Sound names & indexes */
+typedef enum {
+ HITWALLSND, // 0
+ MISSILEHITSND, // 1
+ SELECTITEMSND, // 2
+ GHOSTSIGHTSND, // 3
+ MOVEGUN2SND, // 4
+ MOVEGUN1SND, // 5
+ NOWAYSND, // 6
+ NAZIHITPLAYERSND, // 7
+ MISSILEFIRESND, // 8
+ PLAYERDEATHSND, // 9
+ DOGDEATHSND, // 10
+ ATKGATLINGSND, // 11
+ GETKEYSND, // 12
+ NOITEMSND, // 13
+ WALK1SND, // 14
+ WALK2SND, // 15
+ TAKEDAMAGESND, // 16
+ GAMEOVERSND, // 17
+ OPENDOORSND, // 18
+ CLOSEDOORSND, // 19
+ DONOTHINGSND, // 20
+ HALTSND, // 21
+ DEATHSCREAM2SND, // 22
+ ATKKNIFESND, // 23
+ ATKPISTOLSND, // 24
+ DEATHSCREAM3SND, // 25
+ ATKMACHINEGUNSND, // 26
+ HITENEMYSND, // 27
+ SHOOTDOORSND, // 28
+ DEATHSCREAM1SND, // 29
+ GETMACHINESND, // 30
+ GETAMMOSND, // 31
+ SHOOTSND, // 32
+ HEALTH1SND, // 33
+ HEALTH2SND, // 34
+ BONUS1SND, // 35
+ BONUS2SND, // 36
+ BONUS3SND, // 37
+ GETGATLINGSND, // 38
+ ESCPRESSEDSND, // 39
+ LEVELDONESND, // 40
+ DOGBARKSND, // 41
+ ENDBONUS1SND, // 42
+ ENDBONUS2SND, // 43
+ BONUS1UPSND, // 44
+ BONUS4SND, // 45
+ PUSHWALLSND, // 46
+ NOBONUSSND, // 47
+ PERCENT100SND, // 48
+ BOSSACTIVESND, // 49
+ DEATHSCREAM4SND, // 50
+ SCHUTZADSND, // 51
+ AHHHGSND, // 52
+ DEATHSCREAM5SND, // 53
+ DEATHSCREAM7SND, // 54
+ DEATHSCREAM8SND, // 55
+ LEBENSND, // 56
+ DEATHSCREAM6SND, // 57
+ NAZIFIRESND, // 58
+ BOSSFIRESND, // 59
+ SSFIRESND, // 60
+ SLURPIESND, // 61
+ GHOSTFADESND, // 62
+ DEATHSCREAM9SND, // 63
+ GETAMMOBOXSND, // 64
+ ANGELSIGHTSND, // 65
+ SPIONSND, // 66
+ NEINSOVASSND, // 67
+ DOGATTACKSND, // 68
+ ANGELFIRESND, // 69
+ TRANSSIGHTSND, // 70
+ TRANSDEATHSND, // 71
+ WILHELMSIGHTSND, // 72
+ WILHELMDEATHSND, // 73
+ UBERDEATHSND, // 74
+ KNIGHTSIGHTSND, // 75
+ KNIGHTDEATHSND, // 76
+ ANGELDEATHSND, // 77
+ KNIGHTMISSILESND, // 78
+ GETSPEARSND, // 79
+ ANGELTIREDSND, // 80
+ LASTSOUND
+ } soundnames;
+
+/* Base offsets */
+#define STARTPCSOUNDS 0
+#define STARTADLIBSOUNDS 81
+#define STARTMUSIC 243
+
+/* Music names & indexes */
+typedef enum {
+ XFUNKIE_MUS, // 0
+ DUNGEON_MUS, // 1
+ XDEATH_MUS, // 2
+ GETTHEM_MUS, // 3
+ XTIPTOE_MUS, // 4
+ GOINGAFT_MUS, // 5
+ URAHERO_MUS, // 6
+ XTHEEND_MUS, // 7
+ NAZI_OMI_MUS, // 8
+ POW_MUS, // 9
+ TWELFTH_MUS, // 10
+ SEARCHN_MUS, // 11
+ SUSPENSE_MUS, // 12
+ ZEROHOUR_MUS, // 13
+ WONDERIN_MUS, // 14
+ ULTIMATE_MUS, // 15
+ ENDLEVEL_MUS, // 16
+ XEVIL_MUS, // 17
+ XJAZNAZI_MUS, // 18
+ COPYPRO_MUS, // 19
+ XAWARD_MUS, // 20
+ XPUTIT_MUS, // 21
+ XGETYOU_MUS, // 22
+ XTOWER2_MUS, // 23
+ LASTMUSIC
+ } musicnames;
Added: trunk/target/demos/wolfenstein3d/audiowl6.h
===================================================================
--- trunk/target/demos/wolfenstein3d/audiowl6.h (rev 0)
+++ trunk/target/demos/wolfenstein3d/audiowl6.h 2007-02-25 11:17:37 UTC (rev 572)
@@ -0,0 +1,137 @@
+#define NUMSOUNDS 87
+#define NUMSNDCHUNKS 288
+
+//
+// Sound names & indexes
+//
+typedef enum {
+ HITWALLSND, // 0
+ SELECTWPNSND, // 1
+ SELECTITEMSND, // 2
+ HEARTBEATSND, // 3
+ MOVEGUN2SND, // 4
+ MOVEGUN1SND, // 5
+ NOWAYSND, // 6
+ NAZIHITPLAYERSND, // 7
+ SCHABBSTHROWSND, // 8
+ PLAYERDEATHSND, // 9
+ DOGDEATHSND, // 10
+ ATKGATLINGSND, // 11
+ GETKEYSND, // 12
+ NOITEMSND, // 13
+ WALK1SND, // 14
+ WALK2SND, // 15
+ TAKEDAMAGESND, // 16
+ GAMEOVERSND, // 17
+ OPENDOORSND, // 18
+ CLOSEDOORSND, // 19
+ DONOTHINGSND, // 20
+ HALTSND, // 21
+ DEATHSCREAM2SND, // 22
+ ATKKNIFESND, // 23
+ ATKPISTOLSND, // 24
+ DEATHSCREAM3SND, // 25
+ ATKMACHINEGUNSND, // 26
+ HITENEMYSND, // 27
+ SHOOTDOORSND, // 28
+ DEATHSCREAM1SND, // 29
+ GETMACHINESND, // 30
+ GETAMMOSND, // 31
+ SHOOTSND, // 32
+ HEALTH1SND, // 33
+ HEALTH2SND, // 34
+ BONUS1SND, // 35
+ BONUS2SND, // 36
+ BONUS3SND, // 37
+ GETGATLINGSND, // 38
+ ESCPRESSEDSND, // 39
+ LEVELDONESND, // 40
+ DOGBARKSND, // 41
+ ENDBONUS1SND, // 42
+ ENDBONUS2SND, // 43
+ BONUS1UPSND, // 44
+ BONUS4SND, // 45
+ PUSHWALLSND, // 46
+ NOBONUSSND, // 47
+ PERCENT100SND, // 48
+ BOSSACTIVESND, // 49
+ MUTTISND, // 50
+ SCHUTZADSND, // 51
+ AHHHGSND, // 52
+ DIESND, // 53
+ EVASND, // 54
+ GUTENTAGSND, // 55
+ LEBENSND, // 56
+ SCHEISTSND, // 57
+ NAZIFIRESND, // 58
+ BOSSFIRESND, // 59
+ SSFIRESND, // 60
+ SLURPIESND, // 61
+ TOT_HUNDSND, // 62
+ MEINGOTTSND, // 63
+ SCHABBSHASND, // 64
+ HITLERHASND, // 65
+ SPIONSND, // 66
+ NEINSOVASSND, // 67
+ DOGATTACKSND, // 68
+ FLAMETHROWERSND, // 69
+ MECHSTEPSND, // 70
+ GOOBSSND, // 71
+ YEAHSND, // 72
+ DEATHSCREAM4SND, // 73
+ DEATHSCREAM5SND, // 74
+ DEATHSCREAM6SND, // 75
+ DEATHSCREAM7SND, // 76
+ DEATHSCREAM8SND, // 77
+ DEATHSCREAM9SND, // 78
+ DONNERSND, // 79
+ EINESND, // 80
+ ERLAUBENSND, // 81
+ KEINSND, // 82
+ MEINSND, // 83
+ ROSESND, // 84
+ MISSILEFIRESND, // 85
+ MISSILEHITSND, // 86
+ LASTSOUND
+ } soundnames;
+
+//
+// Base offsets
+//
+#define STARTPCSOUNDS 0
+#define STARTADLIBSOUNDS 87
+#define STARTMUSIC 261
+
+//
+// Music names & indexes
+//
+typedef enum {
+ CORNER_MUS, // 0
+ DUNGEON_MUS, // 1
+ WARMARCH_MUS, // 2
+ GETTHEM_MUS, // 3
+ HEADACHE_MUS, // 4
+ HITLWLTZ_MUS, // 5
+ INTROCW3_MUS, // 6
+ NAZI_NOR_MUS, // 7
+ NAZI_OMI_MUS, // 8
+ POW_MUS, // 9
+ SALUTE_MUS, // 10
+ SEARCHN_MUS, // 11
+ SUSPENSE_MUS, // 12
+ VICTORS_MUS, // 13
+ WONDERIN_MUS, // 14
+ FUNKYOU_MUS, // 15
+ ENDLEVEL_MUS, // 16
+ GOINGAFT_MUS, // 17
+ PREGNANT_MUS, // 18
+ ULTIMATE_MUS, // 19
+ NAZI_RAP_MUS, // 20
+ ZEROHOUR_MUS, // 21
+ TWELFTH_MUS, // 22
+ ROSTER_MUS, // 23
+ URAHERO_MUS, // 24
+ VICMARCH_MUS, // 25
+ PACMAN_MUS, // 26
+ LASTMUSIC
+ } musicnames;
Added: trunk/target/demos/wolfenstein3d/docs/goodstuf.txt
===================================================================
--- trunk/target/demos/wolfenstein3d/docs/goodstuf.txt (rev 0)
+++ trunk/target/demos/wolfenstein3d/docs/goodstuf.txt 2007-02-25 11:17:37 UTC (rev 572)
@@ -0,0 +1,56 @@
+To: ROMERO,TOM
+From: LOTHAR/JAY
+Date: 9 Aug 92 21:06:46
+Subject: AOL Message
+X-mailer: Pegasus Mail v2.3 (R2).
+
+Subj: DREAMS, FLASHBACKS
+Date: 92-08-09 03:59:55 EDT
+From: Tug Hill 2
+Posted on: America Online
+
+On a serious note...
+
+As a former POW (Vietnam), I hesitated to play WOLF for over a
+month after downloading as I feared flashbacks. I didn't want to
+remember all that I had been through all those years ago, when, as
+POW's, my friend and I decided an escape attempt would be better than
+a slow death by torture and starvation.
+
+My friend and I made crude maps and hoarded food. The day of the
+escape we clubbed the guard with stones, took his gun and fought our
+way through two levels of underground tunnels (only a few guards and
+had to crawl). I made it, my friend didn't.
+
+Dreams...NO! NIGHTMARES...YES!! However, the more I play
+WOLF the less frequently I have nightmares. The chilling part is
+turning a corner and seeing a guard with his gun drawn.
+
+WOLF is a powerful game. Fearful as well. I believe that a
+person should face the past. So... when I can play EPISODE 1
+comfortably (no nightmares), I plan on ordering the full series.
+
+Don't let a few bad dreams make you discard this game.
+
+-------------------------------------------------------------------------
+
+Subj: Wolf-3D Section: Action/Arcade Games
+From: Ty Graham 72350,2636 # 191387, * No Replies *
+To: Id Software 72600,1333 Date: 24-Jul-92 18:27:27
+
+Jay, just thought I'd drop a note to let you know how popular Wolf3D is
+here at Microsoft. It seems like I can't walk down a hall without hearing
+'Mein Leben' from someone's office. I hope you guys are getting revenue
+from all this.
+
+Anyway, we were sitting around talking the other day, discussing games for
+Windows, and someone said 'What are those cool guys at Id doing?'. So how
+about it. Are you guys looking at Win games at all? Win32?
+
+In a perfect world, I'd have you guys port the Wolf engine to a multiuser
+maze game for Windows for Workgroups. We need a good M'user Win game.
+
+Anyway some thoughts.
+
+Ty Graham (Microsoft)
+
Added: trunk/target/demos/wolfenstein3d/docs/release.txt
===================================================================
--- trunk/target/demos/wolfenstein3d/docs/release.txt (rev 0)
+++ trunk/target/demos/wolfenstein3d/docs/release.txt 2007-02-25 11:17:37 UTC (rev 572)
@@ -0,0 +1,53 @@
+We are releasing this code for the entertainment of the
+user community. We don't guarentee that anything even
+builds in here. Projects just seem to rot when you leave
+them alone for long periods of time.
+
+This is all the source we have relating to the original
+PC wolfenstein 3D project. We haven't looked at this
+stuff in years, and I would probably be horribly embarassed
+to dig through my old code, so please don't ask any questions
+about it. The original project was built in borland c++ 3.0.
+I think some minor changes were required for later versions.
+
+You will need the data from a released version of wolf or spear
+to use the exe built from this code. You can just use a
+shareware version if you are really cheap.
+
+
+Some coding comments in retrospect:
+
+The ray casting refresh architecture is still reasonably
+appropriate for the game. A BSP based texture mapper could
+go faster, but ray casting was a lot simpler to do at the time.
+
+The dynamically compiled scaling routines are now a Bad Thing.
+On uncached machines (the original target) they are the fastest
+possible way to scale walls, but on modern processors you just
+wind up thrashing the code cash and wrecking performance.
+A simple looping texture mapper would be faster on 486+ machines.
+
+The whole page manager caching scheme is unecessarily complex.
+
+Way too many #ifdefs in the code!
+
+
+Some project ideas with this code:
+
+Add new monsters or weapons.
+
+Add taller walls and vertical motion. This should only be
+done if the texture mapper is rewritten.
+
+Convert to a 32 bit compiler. This would be a fair amount
+of work, but I would hate to even mess with crusty old 16
+bit code. The code would get a LOT smaller.
+
+Make a multi-player game that runs on DOOM sersetup / ipxsetup drivers.
+
+
+Have fun...
+
+John Carmack
+Technical Director
+Id Software
Added: trunk/target/demos/wolfenstein3d/fmopl.c
===================================================================
--- trunk/target/demos/wolfenstein3d/fmopl.c (rev 0)
+++ trunk/target/demos/wolfenstein3d/fmopl.c 2007-02-25 11:17:37 UTC (rev 572)
@@ -0,0 +1,1026 @@
+/*
+**
+** File: fmopl.c -- software implementation of FM sound generator
+**
+** Copyright (C) 1999,2000 Tatsuyuki Satoh , MultiArcadeMachineEmulator development
+**
+** Version 0.37
+**
+** Modified for Wolfenstein 3D by Steven Fuller
+*/
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <stdarg.h>
+#include <math.h>
+
+#include "fmopl.h"
+
+#define INLINE static /* inline */
+
+void logerror(const char *text, ...);
+
+#ifndef PI
+#define PI 3.14159265358979323846
+#endif
+
+/* -------------------- for debug --------------------- */
+/* #define OPL_OUTPUT_LOG */
+#ifdef OPL_OUTPUT_LOG
+static FILE *opl_dbg_fp = NULL;
+static FM_OPL *opl_dbg_opl[16];
+static int opl_dbg_maxchip,opl_dbg_chip;
+#endif
+
+/* -------------------- preliminary define section --------------------- */
+/* attack/decay rate */
+#define OPL_ARRATE 141280 /* RATE 4 = 2826.24ms @ 3.6MHz */
+#define OPL_DRRATE 1956000 /* RATE 4 = 39280.64ms @ 3.6MHz */
+
+#define FREQ_BITS 24 /* frequency turn */
+
+/* counter bits = 20, octave 7 */
+#define FREQ_RATE (1<<(FREQ_BITS-20))
+#define TL_BITS (FREQ_BITS+2)
+
+/* final output shift, limit minimum and maximum */
+#define OPL_OUTSB (TL_BITS+3-16) /* OPL output final shift 16bit */
+#define OPL_MAXOUT (0x7fff<<OPL_OUTSB)
+#define OPL_MINOUT (-0x8000<<OPL_OUTSB)
+
+/* -------------------- quality selection --------------------- */
+
+/* sinwave entries */
+/* used static memory = SIN_ENT * 4 (byte) */
+#define SIN_ENT 2048
+
+/* output level entries (envelope,sinwave) */
+/* envelope counter lower bits */
+#define ENV_BITS 16
+/* envelope output entries */
+#define EG_ENT 4096
+/* used dynamic memory = EG_ENT*4*4(byte)or EG_ENT*6*4(byte) */
+/* used static memory = EG_ENT*4 (byte) */
+
+#define EG_OFF ((2*EG_ENT)<<ENV_BITS) /* OFF */
+#define EG_DED EG_OFF
+#define EG_DST (EG_ENT<<ENV_BITS) /* DECAY START */
+#define EG_AED EG_DST
+#define EG_AST 0 /* ATTACK START */
+
+#define EG_STEP (96.0/EG_ENT) /* OPL is 0.1875 dB step */
+
+/* LFO table entries */
+#define VIB_ENT 512
+#define VIB_SHIFT (32-9)
+#define AMS_ENT 512
+#define AMS_SHIFT (32-9)
+
+#define VIB_RATE 256
+
+/* -------------------- local defines , macros --------------------- */
+
+/* register number to channel number , slot offset */
+#define SLOT1 0
+#define SLOT2 1
+
+/* envelope phase */
+#define ENV_MOD_RR 0x00
+#define ENV_MOD_DR 0x01
+#define ENV_MOD_AR 0x02
+
+/* -------------------- tables --------------------- */
+static const int slot_array[32]=
+{
+ 0, 2, 4, 1, 3, 5,-1,-1,
+ 6, 8,10, 7, 9,11,-1,-1,
+ 12,14,16,13,15,17,-1,-1,
+ -1,-1,-1,-1,-1,-1,-1,-1
+};
+
+/* key scale level */
+/* table is 3dB/OCT , DV converts this in TL step at 6dB/OCT */
+#define DV (EG_STEP/2)
+static const UINT32 KSL_TABLE[8*16]=
+{
+ /* OCT 0 */
+ 0.000/DV, 0.000/DV, 0.000/DV, 0.000/DV,
+ 0.000/DV, 0.000/DV, 0.000/DV, 0.000/DV,
+ 0.000/DV, 0.000/DV, 0.000/DV, 0.000/DV,
+ 0.000/DV, 0.000/DV, 0.000/DV, 0.000/DV,
+ /* OCT 1 */
+ 0.000/DV, 0.000/DV, 0.000/DV, 0.000/DV,
+ 0.000/DV, 0.000/DV, 0.000/DV, 0.000/DV,
+ 0.000/DV, 0.750/DV, 1.125/DV, 1.500/DV,
+ 1.875/DV, 2.250/DV, 2.625/DV, 3.000/DV,
+ /* OCT 2 */
+ 0.000/DV, 0.000/DV, 0.000/DV, 0.000/DV,
+ 0.000/DV, 1.125/DV, 1.875/DV, 2.625/DV,
+ 3.000/DV, 3.750/DV, 4.125/DV, 4.500/DV,
+ 4.875/DV, 5.250/DV, 5.625/DV, 6.000/DV,
+ /* OCT 3 */
+ 0.000/DV, 0.000/DV, 0.000/DV, 1.875/DV,
+ 3.000/DV, 4.125/DV, 4.875/DV, 5.625/DV,
+ 6.000/DV, 6.750/DV, 7.125/DV, 7.500/DV,
+ 7.875/DV, 8.250/DV, 8.625/DV, 9.000/DV,
+ /* OCT 4 */
+ 0.000/DV, 0.000/DV, 3.000/DV, 4.875/DV,
+ 6.000/DV, 7.125/DV, 7.875/DV, 8.625/DV,
+ 9.000/DV, 9.750/DV,10.125/DV,10.500/DV,
+ 10.875/DV,11.250/DV,11.625/DV,12.000/DV,
+ /* OCT 5 */
+ 0.000/DV, 3.000/DV, 6.000/DV, 7.875/DV,
+ 9.000/DV,10.125/DV,10.875/DV,11.625/DV,
+ 12.000/DV,12.750/DV,13.125/DV,13.500/DV,
+ 13.875/DV,14.250/DV,14.625/DV,15.000/DV,
+ /* OCT 6 */
+ 0.000/DV, 6.000/DV, 9.000/DV,10.875/DV,
+ 12.000/DV,13.125/DV,13.875/DV,14.625/DV,
+ 15.000/DV,15.750/DV,16.125/DV,16.500/DV,
+ 16.875/DV,17.250/DV,17.625/DV,18.000/DV,
+ /* OCT 7 */
+ 0.000/DV, 9.000/DV,12.000/DV,13.875/DV,
+ 15.000/DV,16.125/DV,16.875/DV,17.625/DV,
+ 18.000/DV,18.750/DV,19.125/DV,19.500/DV,
+ 19.875/DV,20.250/DV,20.625/DV,21.000/DV
+};
+#undef DV
+
+/* sustain level table (3db per step) */
+/* 0 - 15: 0, 3, 6, 9,12,15,18,21,24,27,30,33,36,39,42,93 (dB)*/
+#define SC(db) (db*((3/EG_STEP)*(1<<ENV_BITS)))+EG_DST
+static const INT32 SL_TABLE[16]={
+ SC( 0),SC( 1),SC( 2),SC(3 ),SC(4 ),SC(5 ),SC(6 ),SC( 7),
+ SC( 8),SC( 9),SC(10),SC(11),SC(12),SC(13),SC(14),SC(31)
+};
+#undef SC
+
+#define TL_MAX (EG_ENT*2) /* limit(tl + ksr + envelope) + sinwave */
+/* TotalLevel : 48 24 12 6 3 1.5 0.75 (dB) */
+/* TL_TABLE[ 0 to TL_MAX ] : plus section */
+/* TL_TABLE[ TL_MAX to TL_MAX+TL_MAX-1 ] : minus section */
+static INT32 *TL_TABLE;
+
+/* pointers to TL_TABLE with sinwave output offset */
+static INT32 **SIN_TABLE;
+
+/* LFO table */
+static INT32 *AMS_TABLE;
+static INT32 *VIB_TABLE;
+
+/* envelope output curve table */
+/* attack + decay + OFF */
+static INT32 ENV_CURVE[2*EG_ENT+1];
+
+/* multiple table */
+#define ML 2
+static const UINT32 MUL_TABLE[16]= {
+/* 1/2, 1, 2, 3, 4, 5, 6, 7, 8, 9,10,11,12,13,14,15 */
+ 0.50*ML, 1.00*ML, 2.00*ML, 3.00*ML, 4.00*ML, 5.00*ML, 6.00*ML, 7.00*ML,
+ 8.00*ML, 9.00*ML,10.00*ML,10.00*ML,12.00*ML,12.00*ML,15.00*ML,15.00*ML
+};
+#undef ML
+
+/* dummy attack / decay rate ( when rate == 0 ) */
+static INT32 RATE_0[16]=
+{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
+
+/* -------------------- static state --------------------- */
+
+/* lock level of common table */
+static int num_lock = 0;
+
+/* work table */
+static void *cur_chip = NULL; /* current chip point */
+/* currenct chip state */
+/* static OPLSAMPLE *bufL,*bufR; */
+static OPL_CH *S_CH;
+static OPL_CH *E_CH;
+OPL_SLOT *SLOT7_1,*SLOT7_2,*SLOT8_1,*SLOT8_2;
+
+static INT32 outd[1];
+static INT32 ams;
+static INT32 vib;
+INT32 *ams_table;
+INT32 *vib_table;
+static INT32 amsIncr;
+static INT32 vibIncr;
+static INT32 feedback2; /* connect for SLOT 2 */
+
+/* log output level */
+#define LOG_ERR 3 /* ERROR */
+#define LOG_WAR 2 /* WARNING */
+#define LOG_INF 1 /* INFORMATION */
+
+#define LOG_LEVEL LOG_INF
+
+#define LOG(n,x) if( (n)>=LOG_LEVEL ) logerror x
+
+/* --------------------- subroutines --------------------- */
+
+INLINE int Limit( int val, int max, int min ) {
+ if ( val > max )
+ val = max;
+ else if ( val < min )
+ val = min;
+
+ return val;
+}
+
+/* ----- key on ----- */
+INLINE void OPL_KEYON(OPL_SLOT *SLOT)
+{
+ /* sine wave restart */
+ SLOT->Cnt = 0;
+ /* set attack */
+ SLOT->evm = ENV_MOD_AR;
+ SLOT->evs = SLOT->evsa;
+ SLOT->evc = EG_AST;
+ SLOT->eve = EG_AED;
+}
+/* ----- key off ----- */
+INLINE void OPL_KEYOFF(OPL_SLOT *SLOT)
+{
+ if( SLOT->evm > ENV_MOD_RR)
+ {
+ /* set envelope counter from envleope output */
+ SLOT->evm = ENV_MOD_RR;
+ if( !(SLOT->evc&EG_DST) )
+ SLOT->evc = (ENV_CURVE[SLOT->evc>>ENV_BITS]<<ENV_BITS) + EG_DST;
+ SLOT->eve = EG_DED;
+ SLOT->evs = SLOT->evsr;
+ }
+}
+
+/* ---------- Envelope Generator & Phase Generator ---------- */
+/* return : envelope output */
+INLINE UINT32 OPL_CALC_SLOT( OPL_SLOT *SLOT )
+{
+ /* calculate envelope generator */
+ if( (SLOT->evc+=SLOT->evs) >= SLOT->eve )
+ {
+ switch( SLOT->evm ){
+ case ENV_MOD_AR: /* ATTACK -> DECAY1 */
+ /* next DR */
+ SLOT->evm = ENV_MOD_DR;
+ SLOT->evc = EG_DST;
+ SLOT->eve = SLOT->SL;
+ SLOT->evs = SLOT->evsd;
+ break;
+ case ENV_MOD_DR: /* DECAY -> SL or RR */
+ SLOT->evc = SLOT->SL;
+ SLOT->eve = EG_DED;
+ if(SLOT->eg_typ)
+ {
+ SLOT->evs = 0;
+ }
+ else
+ {
+ SLOT->evm = ENV_MOD_RR;
+ SLOT->evs = SLOT->evsr;
+ }
+ break;
+ case ENV_MOD_RR: /* RR -> OFF */
+ SLOT->evc = EG_OFF;
+ SLOT->eve = EG_OFF+1;
+ SLOT->evs = 0;
+ break;
+ }
+ }
+ /* calculate envelope */
+ return SLOT->TLL+ENV_CURVE[SLOT->evc>>ENV_BITS]+(SLOT->ams ? ams : 0);
+}
+
+/* set algorythm connection */
+static void set_algorythm( OPL_CH *CH)
+{
+ INT32 *carrier = &outd[0];
+ CH->connect1 = CH->CON ? carrier : &feedback2;
+ CH->connect2 = carrier;
+}
+
+/* ---------- frequency counter for operater update ---------- */
+INLINE void CALC_FCSLOT(OPL_CH *CH,OPL_SLOT *SLOT)
+{
+ int ksr;
+
+ /* frequency step counter */
+ SLOT->Incr = CH->fc * SLOT->mul;
+ ksr = CH->kcode >> SLOT->KSR;
+
+ if( SLOT->ksr != ksr )
+ {
+ SLOT->ksr = ksr;
+ /* attack , decay rate recalculation */
+ SLOT->evsa = SLOT->AR[ksr];
+ SLOT->evsd = SLOT->DR[ksr];
+ SLOT->evsr = SLOT->RR[ksr];
+ }
+ SLOT->TLL = SLOT->TL + (CH->ksl_base>>SLOT->ksl);
+}
+
+/* set multi,am,vib,EG-TYP,KSR,mul */
+INLINE void set_mul(FM_OPL *OPL,int slot,int v)
+{
+ OPL_CH *CH = &OPL->P_CH[slot/2];
+ OPL_SLOT *SLOT = &CH->SLOT[slot&1];
+
+ SLOT->mul = MUL_TABLE[v&0x0f];
+ SLOT->KSR = (v&0x10) ? 0 : 2;
+ SLOT->eg_typ = (v&0x20)>>5;
+ SLOT->vib = (v&0x40);
+ SLOT->ams = (v&0x80);
+ CALC_FCSLOT(CH,SLOT);
+}
+
+/* set ksl & tl */
+INLINE void set_ksl_tl(FM_OPL *OPL,int slot,int v)
+{
+ OPL_CH *CH = &OPL->P_CH[slot/2];
+ OPL_SLOT *SLOT = &CH->SLOT[slot&1];
+ int ksl = v>>6; /* 0 / 1.5 / 3 / 6 db/OCT */
+
+ SLOT->ksl = ksl ? 3-ksl : 31;
+ SLOT->TL = (v&0x3f)*(0.75/EG_STEP); /* 0.75db step */
+
+ if( !(OPL->mode&0x80) )
+ { /* not CSM latch total level */
+ SLOT->TLL = SLOT->TL + (CH->ksl_base>>SLOT->ksl);
+ }
+}
+
+/* set attack rate & decay rate */
+INLINE void set_ar_dr(FM_OPL *OPL,int slot,int v)
+{
+ OPL_CH *CH = &OPL->P_CH[slot/2];
+ OPL_SLOT *SLOT = &CH->SLOT[slot&1];
+ int ar = v>>4;
+ int dr = v&0x0f;
+
+ SLOT->AR = ar ? &OPL->AR_TABLE[ar<<2] : RATE_0;
+ SLOT->evsa = SLOT->AR[SLOT->ksr];
+ if( SLOT->evm == ENV_MOD_AR ) SLOT->evs = SLOT->evsa;
+
+ SLOT->DR = dr ? &OPL->DR_TABLE[dr<<2] : RATE_0;
+ SLOT->evsd = SLOT->DR[SLOT->ksr];
+ if( SLOT->evm == ENV_MOD_DR ) SLOT->evs = SLOT->evsd;
+}
+
+/* set sustain level & release rate */
+INLINE void set_sl_rr(FM_OPL *OPL,int slot,int v)
+{
+ OPL_CH *CH = &OPL->P_CH[slot/2];
+ OPL_SLOT *SLOT = &CH->SLOT[slot&1];
+ int sl = v>>4;
+ int rr = v & 0x0f;
+
+ SLOT->SL = SL_TABLE[sl];
+ if( SLOT->evm == ENV_MOD_DR ) SLOT->eve = SLOT->SL;
+ SLOT->RR = &OPL->DR_TABLE[rr<<2];
+ SLOT->evsr = SLOT->RR[SLOT->ksr];
+ if( SLOT->evm == ENV_MOD_RR ) SLOT->evs = SLOT->evsr;
+}
+
+/* operator output calculator */
+#define OP_OUT(slot,env,con) slot->wavetable[((slot->Cnt+con)/(0x1000000/SIN_ENT))&(SIN_ENT-1)][env]
+/* ---------- calculate channel ---------- */
+INLINE void OPL_CALC_CH( OPL_CH *CH )
+{
+ UINT32 env_out;
+ OPL_SLOT *SLOT;
+
+ feedback2 = 0;
+ /* SLOT 1 */
+ SLOT = &CH->SLOT[SLOT1];
+ env_out=OPL_CALC_SLOT(SLOT);
+ if( env_out < EG_ENT-1 )
+ {
+ /* PG */
+ if(SLOT->vib) SLOT->Cnt += (SLOT->Incr*vib/VIB_RATE);
+ else SLOT->Cnt += SLOT->Incr;
+ /* connection */
+ if(CH->FB)
+ {
+ int feedback1 = (CH->op1_out[0]+CH->op1_out[1])>>CH->FB;
+ CH->op1_out[1] = CH->op1_out[0];
+ *CH->connect1 += CH->op1_out[0] = OP_OUT(SLOT,env_out,feedback1);
+ }
+ else
+ {
+ *CH->connect1 += OP_OUT(SLOT,env_out,0);
+ }
+ }else
+ {
+ CH->op1_out[1] = CH->op1_out[0];
+ CH->op1_out[0] = 0;
+ }
+ /* SLOT 2 */
+ SLOT = &CH->SLOT[SLOT2];
+ env_out=OPL_CALC_SLOT(SLOT);
+ if( env_out < EG_ENT-1 )
+ {
+ /* PG */
+ if(SLOT->vib) SLOT->Cnt += (SLOT->Incr*vib/VIB_RATE);
+ else SLOT->Cnt += SLOT->Incr;
+ /* connection */
+ outd[0] += OP_OUT(SLOT,env_out, feedback2);
+ }
+}
+
+/* ---------- calculate rythm block ---------- */
+#define WHITE_NOISE_db 6.0
+INLINE void OPL_CALC_RH( OPL_CH *CH )
+{
+ UINT32 env_tam,env_sd,env_top,env_hh;
+ int whitenoise = (rand()&1)*(WHITE_NOISE_db/EG_STEP);
+ INT32 tone8;
+
+ OPL_SLOT *SLOT;
+ int env_out;
+
+ /* BD : same as FM serial mode and output level is large */
+ feedback2 = 0;
+ /* SLOT 1 */
+ SLOT = &CH[6].SLOT[SLOT1];
+ env_out=OPL_CALC_SLOT(SLOT);
+ if( env_out < EG_ENT-1 )
+ {
+ /* PG */
+ if(SLOT->vib) SLOT->Cnt += (SLOT->Incr*vib/VIB_RATE);
+ else SLOT->Cnt += SLOT->Incr;
+ /* connectoion */
+ if(CH[6].FB)
+ {
+ int feedback1 = (CH[6].op1_out[0]+CH[6].op1_out[1])>>CH[6].FB;
+ CH[6].op1_out[1] = CH[6].op1_out[0];
+ feedback2 = CH[6].op1_out[0] = OP_OUT(SLOT,env_out,feedback1);
+ }
+ else
+ {
+ feedback2 = OP_OUT(SLOT,env_out,0);
+ }
+ }else
+ {
+ feedback2 = 0;
+ CH[6].op1_out[1] = CH[6].op1_out[0];
+ CH[6].op1_out[0] = 0;
+ }
+ /* SLOT 2 */
+ SLOT = &CH[6].SLOT[SLOT2];
+ env_out=OPL_CALC_SLOT(SLOT);
+ if( env_out < EG_ENT-1 )
+ {
+ /* PG */
+ if(SLOT->vib) SLOT->Cnt += (SLOT->Incr*vib/VIB_RATE);
+ else SLOT->Cnt += SLOT->Incr;
+ /* connectoion */
+ outd[0] += OP_OUT(SLOT,env_out, feedback2)*2;
+ }
+
+ // SD (17) = mul14[fnum7] + white noise
+ // TAM (15) = mul15[fnum8]
+ // TOP (18) = fnum6(mul18[fnum8]+whitenoise)
+ // HH (14) = fnum7(mul18[fnum8]+whitenoise) + white noise
+ env_sd =OPL_CALC_SLOT(SLOT7_2) + whitenoise;
+ env_tam=OPL_CALC_SLOT(SLOT8_1);
+ env_top=OPL_CALC_SLOT(SLOT8_2);
+ env_hh =OPL_CALC_SLOT(SLOT7_1) + whitenoise;
+
+ /* PG */
+ if(SLOT7_1->vib) SLOT7_1->Cnt += (2*SLOT7_1->Incr*vib/VIB_RATE);
+ else SLOT7_1->Cnt += 2*SLOT7_1->Incr;
+ if(SLOT7_2->vib) SLOT7_2->Cnt += ((CH[7].fc*8)*vib/VIB_RATE);
+ else SLOT7_2->Cnt += (CH[7].fc*8);
+ if(SLOT8_1->vib) SLOT8_1->Cnt += (SLOT8_1->Incr*vib/VIB_RATE);
+ else SLOT8_1->Cnt += SLOT8_1->Incr;
+ if(SLOT8_2->vib) SLOT8_2->Cnt += ((CH[8].fc*48)*vib/VIB_RATE);
+ else SLOT8_2->Cnt += (CH[8].fc*48);
+
+ tone8 = OP_OUT(SLOT8_2,whitenoise,0 );
+
+ /* SD */
+ if( env_sd < EG_ENT-1 )
+ outd[0] += OP_OUT(SLOT7_1,env_sd, 0)*8;
+ /* TAM */
+ if( env_tam < EG_ENT-1 )
+ outd[0] += OP_OUT(SLOT8_1,env_tam, 0)*2;
+ /* TOP-CY */
+ if( env_top < EG_ENT-1 )
+ outd[0] += OP_OUT(SLOT7_2,env_top,tone8)*2;
+ /* HH */
+ if( env_hh < EG_ENT-1 )
+ outd[0] += OP_OUT(SLOT7_2,env_hh,tone8)*2;
+}
+
+/* ----------- initialize time tabls ----------- */
+static void init_timetables( FM_OPL *OPL , int ARRATE , int DRRATE )
+{
+ int i;
+ double rate;
+
+ /* make attack rate & decay rate tables */
+ for (i = 0;i < 4;i++) OPL->AR_TABLE[i] = OPL->DR_TABLE[i] = 0;
+ for (i = 4;i <= 60;i++){
+ rate = OPL->freqbase; /* frequency rate */
+ if( i < 60 ) rate *= 1.0+(i&3)*0.25; /* b0-1 : x1 , x1.25 , x1.5 , x1.75 */
+ rate *= 1<<((i>>2)-1); /* b2-5 : shift bit */
+ rate *= (double)(EG_ENT<<ENV_BITS);
+ OPL->AR_TABLE[i] = rate / ARRATE;
+ OPL->DR_TABLE[i] = rate / DRRATE;
+ }
+ for (i = 60;i < 76;i++)
+ {
+ OPL->AR_TABLE[i] = EG_AED-1;
+ OPL->DR_TABLE[i] = OPL->DR_TABLE[60];
+ }
+#if 0
+ for (i = 0;i < 64 ;i++){ /* make for overflow area */
+ LOG(LOG_WAR,("rate %2d , ar %f ms , dr %f ms \n",i,
+ ((double)(EG_ENT<<ENV_BITS) / OPL->AR_TABLE[i]) * (1000.0 / OPL->rate),
+ ((double)(EG_ENT<<ENV_BITS) / OPL->DR_TABLE[i]) * (1000.0 / OPL->rate) ));
+ }
+#endif
+}
+
+/* ---------- generic table initialize ---------- */
+static int OPLOpenTable( void )
+{
+ int s,t;
+ double rate;
+ int i,j;
+ double pom;
+
+ /* allocate dynamic tables */
+ if( (TL_TABLE = malloc(TL_MAX*2*sizeof(INT32))) == NULL)
+ return 0;
+ if( (SIN_TABLE = malloc(SIN_ENT*4 *sizeof(INT32 *))) == NULL)
+ {
+ free(TL_TABLE);
+ return 0;
+ }
+ if( (AMS_TABLE = malloc(AMS_ENT*2 *sizeof(INT32))) == NULL)
+ {
+ free(TL_TABLE);
+ free(SIN_TABLE);
+ return 0;
+ }
+ if( (VIB_TABLE = malloc(VIB_ENT*2 *sizeof(INT32))) == NULL)
+ {
+ free(TL_TABLE);
+ free(SIN_TABLE);
+ free(AMS_TABLE);
+ return 0;
+ }
+ /* make total level table */
+ for (t = 0;t < EG_ENT-1 ;t++){
+ rate = ((1<<TL_BITS)-1)/pow(10,EG_STEP*t/20); /* dB -> voltage */
+ TL_TABLE[ t] = (int)rate;
+ TL_TABLE[TL_MAX+t] = -TL_TABLE[t];
+/* LOG(LOG_INF,("TotalLevel(%3d) = %x\n",t,TL_TABLE[t]));*/
+ }
+ /* fill volume off area */
+ for ( t = EG_ENT-1; t < TL_MAX ;t++){
+ TL_TABLE[t] = TL_TABLE[TL_MAX+t] = 0;
+ }
+
+ /* make sinwave table (total level offet) */
+ /* degree 0 = degree 180 = off */
+ SIN_TABLE[0] = SIN_TABLE[SIN_ENT/2] = &TL_TABLE[EG_ENT-1];
+ for (s = 1;s <= SIN_ENT/4;s++){
+ pom = sin(2*PI*s/SIN_ENT); /* sin */
+ pom = 20*log10(1/pom); /* decibel */
+ j = pom / EG_STEP; /* TL_TABLE steps */
+
+ /* degree 0 - 90 , degree 180 - 90 : plus section */
+ SIN_TABLE[ s] = SIN_TABLE[SIN_ENT/2-s] = &TL_TABLE[j];
+ /* degree 180 - 270 , degree 360 - 270 : minus section */
+ SIN_TABLE[SIN_ENT/2+s] = SIN_TABLE[SIN_ENT -s] = &TL_TABLE[TL_MAX+j];
+/* LOG(LOG_INF,("sin(%3d) = %f:%f db\n",s,pom,(double)j * EG_STEP));*/
+ }
+ for (s = 0;s < SIN_ENT;s++)
+ {
+ SIN_TABLE[SIN_ENT*1+s] = s<(SIN_ENT/2) ? SIN_TABLE[s] : &TL_TABLE[EG_ENT];
+ SIN_TABLE[SIN_ENT*2+s] = SIN_TABLE[s % (SIN_ENT/2)];
+ SIN_TABLE[SIN_ENT*3+s] = (s/(SIN_ENT/4))&1 ? &TL_TABLE[EG_ENT] : SIN_TABLE[SIN_ENT*2+s];
+ }
+
+ /* envelope counter -> envelope output table */
+ for (i=0; i<EG_ENT; i++)
+ {
+ /* ATTACK curve */
+ pom = pow( ((double)(EG_ENT-1-i)/EG_ENT) , 8 ) * EG_ENT;
+ /* if( pom >= EG_ENT ) pom = EG_ENT-1; */
+ ENV_CURVE[i] = (int)pom;
+ /* DECAY ,RELEASE curve */
+ ENV_CURVE[(EG_DST>>ENV_BITS)+i]= i;
+ }
+ /* off */
+ ENV_CURVE[EG_OFF>>ENV_BITS]= EG_ENT-1;
+ /* make LFO ams table */
+ for (i=0; i<AMS_ENT; i++)
+ {
+ pom = (1.0+sin(2*PI*i/AMS_ENT))/2; /* sin */
+ AMS_TABLE[i] = (1.0/EG_STEP)*pom; /* 1dB */
+ AMS_TABLE[AMS_ENT+i] = (4.8/EG_STEP)*pom; /* 4.8dB */
+ }
+ /* make LFO vibrate table */
+ for (i=0; i<VIB_ENT; i++)
+ {
+ /* 100cent = 1seminote = 6% ?? */
+ pom = (double)VIB_RATE*0.06*sin(2*PI*i/VIB_ENT); /* +-100sect step */
+ VIB_TABLE[i] = VIB_RATE + (pom*0.07); /* +- 7cent */
+ VIB_TABLE[VIB_ENT+i] = VIB_RATE + (pom*0.14); /* +-14cent */
+ /* LOG(LOG_INF,("vib %d=%d\n",i,VIB_TABLE[VIB_ENT+i])); */
+ }
+ return 1;
+}
+
+
+static void OPLCloseTable()
+{
+ free(TL_TABLE);
+ free(SIN_TABLE);
+ free(AMS_TABLE);
+ free(VIB_TABLE);
+}
+
+/* ---------- opl initialize ---------- */
+static void OPL_initalize(FM_OPL *OPL)
+{
+ int fn;
+
+ /* frequency base */
+ OPL->freqbase = (OPL->rate) ? ((double)OPL->clock / OPL->rate) / 72 : 0;
+
+ /* make time tables */
+ init_timetables( OPL , OPL_ARRATE , OPL_DRRATE );
+ /* make fnumber -> increment counter table */
+ for( fn=0 ; fn < 1024 ; fn++ )
+ {
+ OPL->FN_TABLE[fn] = OPL->freqbase * fn * FREQ_RATE * (1<<7) / 2;
+ }
+ /* LFO freq.table */
+ OPL->amsIncr = OPL->rate ? (double)AMS_ENT*(1<<AMS_SHIFT) / OPL->rate * 3.7 * ((double)OPL->clock/3600000) : 0;
+ OPL->vibIncr = OPL->rate ? (double)VIB_ENT*(1<<VIB_SHIFT) / OPL->rate * 6.4 * ((double)OPL->clock/3600000) : 0;
+}
+
+/* ---------- write to OPL registers ---------- */
+void OPLWrite(FM_OPL *OPL, int r, int v)
+{
+ OPL_CH *CH;
+ int slot;
+ int block_fnum;
+
+ switch(r&0xe0)
+ {
+ case 0x00: /* 00-1f:controll */
+ switch(r&0x1f)
+ {
+ case 0x01:
+ /* wave selector enable */
+ OPL->wavesel = v&0x20;
+ if(!OPL->wavesel)
+ {
+ /* preset compatible mode */
+ int c;
+ for(c=0;c<OPL->max_ch;c++)
+ {
+ OPL->P_CH[c].SLOT[SLOT1].wavetable = &SIN_TABLE[0];
+ OPL->P_CH[c].SLOT[SLOT2].wavetable = &SIN_TABLE[0];
+ }
+ }
+ return;
+ case 0x02: /* Timer 1 */
+ break;
+ case 0x03: /* Timer 2 */
+ return;
+ case 0x04: /* IRQ clear / mask and Timer enable */
+ return;
+ case 0x08: /* MODE,DELTA-T : CSM,NOTESEL,x,x,smpl,da/ad,64k,rom */
+ OPL->mode = v;
+ return;
+ }
+ break;
+ case 0x20: /* am,vib,ksr,eg type,mul */
+ slot = slot_array[r&0x1f];
+ if(slot == -1) return;
+ set_mul(OPL,slot,v);
+ return;
+ case 0x40:
+ slot = slot_array[r&0x1f];
+ if(slot == -1) return;
+ set_ksl_tl(OPL,slot,v);
+ return;
+ case 0x60:
+ slot = slot_array[r&0x1f];
+ if(slot == -1) return;
+ set_ar_dr(OPL,slot,v);
+ return;
+ case 0x80:
+ slot = slot_array[r&0x1f];
+ if(slot == -1) return;
+ set_sl_rr(OPL,slot,v);
+ return;
+ case 0xa0:
+ switch(r)
+ {
+ case 0xbd:
+ /* amsep,vibdep,r,bd,sd,tom,tc,hh */
+ {
+ UINT8 rkey = OPL->rythm^v;
+ OPL->ams_table = &AMS_TABLE[v&0x80 ? AMS_ENT : 0];
+ OPL->vib_table = &VIB_TABLE[v&0x40 ? VIB_ENT : 0];
+ OPL->rythm = v&0x3f;
+ if(OPL->rythm&0x20)
+ {
+#if 0
+ usrintf_showmessage("OPL Rythm mode select");
+#endif
+ /* BD key on/off */
+ if(rkey&0x10)
+ {
+ if(v&0x10)
+ {
+ OPL->P_CH[6].op1_out[0] = OPL->P_CH[6].op1_out[1] = 0;
+ OPL_KEYON(&OPL->P_CH[6].SLOT[SLOT1]);
+ OPL_KEYON(&OPL->P_CH[6].SLOT[SLOT2]);
+ }
+ else
+ {
+ OPL_KEYOFF(&OPL->P_CH[6].SLOT[SLOT1]);
+ OPL_KEYOFF(&OPL->P_CH[6].SLOT[SLOT2]);
+ }
+ }
+ /* SD key on/off */
+ if(rkey&0x08)
+ {
+ if(v&0x08) OPL_KEYON(&OPL->P_CH[7].SLOT[SLOT2]);
+ else OPL_KEYOFF(&OPL->P_CH[7].SLOT[SLOT2]);
+ }/* TAM key on/off */
+ if(rkey&0x04)
+ {
+ if(v&0x04) OPL_KEYON(&OPL->P_CH[8].SLOT[SLOT1]);
+ else OPL_KEYOFF(&OPL->P_CH[8].SLOT[SLOT1]);
+ }
+ /* TOP-CY key on/off */
+ if(rkey&0x02)
+ {
+ if(v&0x02) OPL_KEYON(&OPL->P_CH[8].SLOT[SLOT2]);
+ else OPL_KEYOFF(&OPL->P_CH[8].SLOT[SLOT2]);
+ }
+ /* HH key on/off */
+ if(rkey&0x01)
+ {
+ if(v&0x01) OPL_KEYON(&OPL->P_CH[7].SLOT[SLOT1]);
+ else OPL_KEYOFF(&OPL->P_CH[7].SLOT[SLOT1]);
+ }
+ }
+ }
+ return;
+ }
+ /* keyon,block,fnum */
+ if( (r&0x0f) > 8) return;
+ CH = &OPL->P_CH[r&0x0f];
+ if(!(r&0x10))
+ { /* a0-a8 */
+ block_fnum = (CH->block_fnum&0x1f00) | v;
+ }
+ else
+ { /* b0-b8 */
+ int keyon = (v>>5)&1;
+ block_fnum = ((v&0x1f)<<8) | (CH->block_fnum&0xff);
+ if(CH->keyon != keyon)
+ {
+ if( (CH->keyon=keyon) )
+ {
+ CH->op1_out[0] = CH->op1_out[1] = 0;
+ OPL_KEYON(&CH->SLOT[SLOT1]);
+ OPL_KEYON(&CH->SLOT[SLOT2]);
+ }
+ else
+ {
+ OPL_KEYOFF(&CH->SLOT[SLOT1]);
+ OPL_KEYOFF(&CH->SLOT[SLOT2]);
+ }
+ }
+ }
+ /* update */
+ if(CH->block_fnum != block_fnum)
+ {
+ int blockRv = 7-(block_fnum>>10);
+ int fnum = block_fnum&0x3ff;
+ CH->block_fnum = block_fnum;
+
+ CH->ksl_base = KSL_TABLE[block_fnum>>6];
+ CH->fc = OPL->FN_TABLE[fnum]>>blockRv;
+ CH->kcode = CH->block_fnum>>9;
+ if( (OPL->mode&0x40) && CH->block_fnum&0x100) CH->kcode |=1;
+ CALC_FCSLOT(CH,&CH->SLOT[SLOT1]);
+ CALC_FCSLOT(CH,&CH->SLOT[SLOT2]);
+ }
+ return;
+ case 0xc0:
+ /* FB,C */
+ if( (r&0x0f) > 8) return;
+ CH = &OPL->P_CH[r&0x0f];
+ {
+ int feedback = (v>>1)&7;
+ CH->FB = feedback ? (8+1) - feedback : 0;
+ CH->CON = v&1;
+ set_algorythm(CH);
+ }
+ return;
+ case 0xe0: /* wave type */
+ slot = slot_array[r&0x1f];
+ if(slot == -1) return;
+ CH = &OPL->P_CH[slot/2];
+ if(OPL->wavesel)
+ {
+ /* LOG(LOG_INF,("OPL SLOT %d wave select %d\n",slot,v&3)); */
+ CH->SLOT[slot&1].wavetable = &SIN_TABLE[(v&0x03)*SIN_ENT];
+ }
+ return;
+ }
+}
+
+/* lock/unlock for common table */
+static int OPL_LockTable(void)
+{
+ num_lock++;
+ if(num_lock>1) return 0;
+ /* first time */
+ cur_chip = NULL;
+ /* allocate total level table (128kb space) */
+ if( !OPLOpenTable() )
+ {
+ num_lock--;
+ return -1;
+ }
+ return 0;
+}
+
+static void OPL_UnLockTable(void)
+{
+ if(num_lock) num_lock--;
+ if(num_lock) return;
+ /* last time */
+ cur_chip = NULL;
+ OPLCloseTable();
+}
+
+/* ---------- update chip ----------- */
+void YM3812UpdateOne(FM_OPL *OPL, INT16 *buffer, int length)
+{
+ int i;
+ int data;
+ OPLSAMPLE *buf = buffer;
+ UINT32 amsCnt = OPL->amsCnt;
+ UINT32 vibCnt = OPL->vibCnt;
+ UINT8 rythm = OPL->rythm&0x20;
+ OPL_CH *CH,*R_CH;
+
+ if( (void *)OPL != cur_chip ){
+ cur_chip = (void *)OPL;
+ /* channel pointers */
+ S_CH = OPL->P_CH;
+ E_CH = &S_CH[9];
+ /* rythm slot */
+ SLOT7_1 = &S_CH[7].SLOT[SLOT1];
+ SLOT7_2 = &S_CH[7].SLOT[SLOT2];
+ SLOT8_1 = &S_CH[8].SLOT[SLOT1];
+ SLOT8_2 = &S_CH[8].SLOT[SLOT2];
+ /* LFO state */
+ amsIncr = OPL->amsIncr;
+ vibIncr = OPL->vibIncr;
+ ams_table = OPL->ams_table;
+ vib_table = OPL->vib_table;
+ }
+ R_CH = rythm ? &S_CH[6] : E_CH;
+ for( i=0; i < length ; i++ )
+ {
+ /* channel A channel B channel C */
+ /* LFO */
+ ams = ams_table[(amsCnt+=amsIncr)>>AMS_SHIFT];
+ vib = vib_table[(vibCnt+=vibIncr)>>VIB_SHIFT];
+ outd[0] = 0;
+ /* FM part */
+ for(CH=S_CH ; CH < R_CH ; CH++)
+ OPL_CALC_CH(CH);
+ /* Rythn part */
+ if(rythm)
+ OPL_CALC_RH(S_CH);
+ /* limit check */
+ data = Limit( outd[0] , OPL_MAXOUT, OPL_MINOUT );
+ /* store to sound buffer */
+ buf[i] = data >> OPL_OUTSB;
+ }
+
+ OPL->amsCnt = amsCnt;
+ OPL->vibCnt = vibCnt;
+#ifdef OPL_OUTPUT_LOG
+ if(opl_dbg_fp)
+ {
+ for(opl_dbg_chip=0;opl_dbg_chip<opl_dbg_maxchip;opl_dbg_chip++)
+ if( opl_dbg_opl[opl_dbg_chip] == OPL) break;
+ fprintf(opl_dbg_fp,"%c%c%c",0x20+opl_dbg_chip,length&0xff,length/256);
+ }
+#endif
+}
+
+/* ---------- reset chip ---------- */
+void OPLResetChip(FM_OPL *OPL)
+{
+ int c,s;
+ int i;
+
+ /* reset chip */
+ OPL->mode = 0; /* normal mode */
+ /* reset with register write */
+ OPLWrite(OPL,0x01,0); /* wavesel disable */
+ OPLWrite(OPL,0x02,0); /* Timer1 */
+ OPLWrite(OPL,0x03,0); /* Timer2 */
+ OPLWrite(OPL,0x04,0); /* IRQ mask clear */
+ for(i = 0xff ; i >= 0x20 ; i-- ) OPLWrite(OPL,i,0);
+ /* reset OPerator paramater */
+ for( c = 0 ; c < OPL->max_ch ; c++ )
+ {
+ OPL_CH *CH = &OPL->P_CH[c];
+ /* OPL->P_CH[c].PAN = OPN_CENTER; */
+ for(s = 0 ; s < 2 ; s++ )
+ {
+ /* wave table */
+ CH->SLOT[s].wavetable = &SIN_TABLE[0];
+ /* CH->SLOT[s].evm = ENV_MOD_RR; */
+ CH->SLOT[s].evc = EG_OFF;
+ CH->SLOT[s].eve = EG_OFF+1;
+ CH->SLOT[s].evs = 0;
+ }
+ }
+}
+
+/* ---------- Create a virtual YM3812 ---------- */
+FM_OPL *OPLCreate(int type, int clock, int rate)
+{
+ char *ptr;
+ FM_OPL *OPL;
+ int state_size;
+ int max_ch = 9; /* normaly 9 channels */
+
+ if( OPL_LockTable() ==-1) return NULL;
+ /* allocate OPL state space */
+ state_size = sizeof(FM_OPL);
+ state_size += sizeof(OPL_CH)*max_ch;
+
+ /* allocate memory block */
+ ptr = malloc(state_size);
+ if(ptr==NULL) return NULL;
+ /* clear */
+ memset(ptr,0,state_size);
+
+ OPL = (FM_OPL *)ptr; ptr+=sizeof(FM_OPL);
+ OPL->P_CH = (OPL_CH *)ptr; ptr+=sizeof(OPL_CH)*max_ch;
+
+ /* set channel state pointer */
+ OPL->type = type;
+ OPL->clock = clock;
+ OPL->rate = rate;
+ OPL->max_ch = max_ch;
+ /* init grobal tables */
+ OPL_initalize(OPL);
+ /* reset chip */
+ OPLResetChip(OPL);
+#ifdef OPL_OUTPUT_LOG
+ if(!opl_dbg_fp)
+ {
+ opl_dbg_fp = fopen("opllog.opl","wb");
+ opl_dbg_maxchip = 0;
+ }
+ if(opl_dbg_fp)
+ {
+ opl_dbg_opl[opl_dbg_maxchip] = OPL;
+ fprintf(opl_dbg_fp,"%c%c%c%c%c%c",0x00+opl_dbg_maxchip,
+ type,
+ clock&0xff,
+ (clock/0x100)&0xff,
+ (clock/0x10000)&0xff,
+ (clock/0x1000000)&0xff);
+ opl_dbg_maxchip++;
+ }
+#endif
+ return OPL;
+}
+
+/* ---------- Destroy a virtual YM3812 ---------- */
+void OPLDestroy(FM_OPL *OPL)
+{
+#ifdef OPL_OUTPUT_LOG
+ if(opl_dbg_fp)
+ {
+ fclose(opl_dbg_fp);
+ opl_dbg_fp = NULL;
+ }
+#endif
+ OPL_UnLockTable();
+ free(OPL);
+}
Added: trunk/target/demos/wolfenstein3d/fmopl.h
===================================================================
--- trunk/target/demos/wolfenstein3d/fmopl.h (rev 0)
+++ trunk/target/demos/wolfenstein3d/fmopl.h 2007-02-25 11:17:37 UTC (rev 572)
@@ -0,0 +1,108 @@
+#ifndef __FMOPL_H_
+#define __FMOPL_H_
+
+/* --- system optimize --- */
+/* select bit size of output : 8 or 16 */
+#define OPL_OUTPUT_BIT 16
+
+typedef unsigned char UINT8; /* unsigned 8bit */
+typedef unsigned short UINT16; /* unsigned 16bit */
+typedef unsigned int UINT32; /* unsigned 32bit */
+typedef signed char INT8; /* signed 8bit */
+typedef signed short INT16; /* signed 16bit */
+typedef signed int INT32; /* signed 32bit */
+
+#if (OPL_OUTPUT_BIT==16)
+typedef INT16 OPLSAMPLE;
+#endif
+#if (OPL_OUTPUT_BIT==8)
+typedef unsigned char OPLSAMPLE;
+#endif
+
+/* ---------- OPL one of slot ---------- */
+typedef struct fm_opl_slot {
+ INT32 TL; /* total level :TL << 8 */
+ INT32 TLL; /* adjusted now TL ...
[truncated message content] |