diff --git a/Makefile.mak b/Makefile.mak index 7fcfaf50..fe5d334d 100644 --- a/Makefile.mak +++ b/Makefile.mak @@ -133,7 +133,7 @@ bin\th04\res_huma.com: th04\res_huma.cpp $** | masters.lib -bin\th04\op.exe: bin\th04\op.obj th04\m_char.cpp bin\th04\bgimager.obj bin\th04\cdg_load.obj th04\frmdely2.c +bin\th04\op.exe: bin\th04\op.obj th04\m_char.cpp bin\th04\bgimage.obj bin\th04\bgimager.obj bin\th04\cdg_load.obj th04\frmdely2.c $(CC) $(CFLAGS) $(LARGE_LFLAGS) -DGAME=4 -DBINARY='O' -3 -Z -d -nbin\th04\ -eOP.EXE @&&| $** | @@ -143,7 +143,7 @@ bin\th04\main.exe: bin\th04\main.obj bin\th04\scoreupd.obj th04\main011.cpp bin\ $** | -bin\th04\maine.exe: bin\th04\maine.obj th04\maine011.cpp bin\th04\bgimager.obj bin\th03\pi_load.obj bin\th03\pi_put_q.obj bin\th04\cdg_load.obj bin\hfliplut.obj +bin\th04\maine.exe: bin\th04\maine.obj th04\maine011.cpp bin\th04\bgimage.obj bin\th04\bgimager.obj bin\th03\pi_load.obj bin\th03\pi_put_q.obj bin\th04\cdg_load.obj bin\hfliplut.obj $(CC) $(CFLAGS) $(LARGE_LFLAGS) -DGAME=4 -DBINARY='E' -Z -nbin\th04\ -eMAINE.EXE @&&| $** | @@ -156,7 +156,7 @@ bin\th05\res_kso.com: th05\res_kso.cpp $** | masters.lib -bin\th05\op.exe: th05\op010.cpp bin\th05\op.obj th05\op011.cpp th05\m_char.cpp bin\th05\cdg_put.obj bin\th04\exit.obj bin\th05\vector.obj bin\th05\musicp_c.obj bin\th05\musicp_a.obj bin\th05\bgimager.obj bin\th05\snd_load.obj bin\th05\snd_kaja.obj bin\th05\pi_cpp_1.obj bin\th05\pi_asm_1.obj bin\th05\pi_cpp_2.obj bin\th05\pi_asm_2.obj bin\th05\initop.obj bin\th05\input_s.obj bin\th05\inp_h_w.obj bin\th05\snd_dlym.obj th05\cdg_p_nc.cpp bin\th05\frmdelay.obj bin\th04\cdg_load.obj bin\th05\egcrect.obj bin\hfliplut.obj +bin\th05\op.exe: th05\op010.cpp bin\th05\op.obj th05\op011.cpp th05\m_char.cpp bin\th04\bgimage.obj bin\th05\cdg_put.obj bin\th04\exit.obj bin\th05\vector.obj bin\th05\musicp_c.obj bin\th05\musicp_a.obj bin\th05\bgimager.obj bin\th05\snd_load.obj bin\th05\snd_kaja.obj bin\th05\pi_cpp_1.obj bin\th05\pi_asm_1.obj bin\th05\pi_cpp_2.obj bin\th05\pi_asm_2.obj bin\th05\initop.obj bin\th05\input_s.obj bin\th05\inp_h_w.obj bin\th05\snd_dlym.obj th05\cdg_p_nc.cpp bin\th05\frmdelay.obj bin\th04\cdg_load.obj bin\th05\egcrect.obj bin\hfliplut.obj $(CC) $(CFLAGS) $(LARGE_LFLAGS) -DGAME=5 -DBINARY='O' -3 -Z -nbin\th05\ -eOP.EXE @&&| $** | @@ -166,7 +166,7 @@ bin\th05\main.exe: bin\th05\main.obj th05\main010.cpp th05\main011.cpp th05\p_co $** | -bin\th05\maine.exe: bin\th05\maine.obj th05\maine011.cpp th05\regist.cpp th05\staff.cpp bin\th04\exit.obj bin\th05\vector.obj bin\th05\bgimager.obj bin\th05\snd_load.obj bin\th05\snd_kaja.obj bin\th05\pi_cpp_1.obj bin\th05\pi_asm_1.obj bin\th05\pi_cpp_2.obj bin\th05\pi_asm_2.obj bin\th05\initmain.obj bin\th05\input_s.obj bin\th05\inp_h_w.obj bin\th05\snd_dlym.obj bin\th05\frmdelay.obj bin\th04\cdg_load.obj bin\th05\egcrect.obj bin\hfliplut.obj +bin\th05\maine.exe: bin\th05\maine.obj th05\maine011.cpp th05\regist.cpp th05\staff.cpp bin\th04\bgimage.obj bin\th04\exit.obj bin\th05\vector.obj bin\th05\bgimager.obj bin\th05\snd_load.obj bin\th05\snd_kaja.obj bin\th05\pi_cpp_1.obj bin\th05\pi_asm_1.obj bin\th05\pi_cpp_2.obj bin\th05\pi_asm_2.obj bin\th05\initmain.obj bin\th05\input_s.obj bin\th05\inp_h_w.obj bin\th05\snd_dlym.obj bin\th05\frmdelay.obj bin\th04\cdg_load.obj bin\th05\egcrect.obj bin\hfliplut.obj $(CC) $(CFLAGS) $(LARGE_LFLAGS) -DGAME=5 -DBINARY='E' -Z -nbin\th05\ -eMAINE.EXE @&&| $** | diff --git a/th04/bgimage.cpp b/th04/bgimage.cpp new file mode 100644 index 00000000..2105a01a --- /dev/null +++ b/th04/bgimage.cpp @@ -0,0 +1 @@ +#include "th04/hardware/bgimage.cpp" diff --git a/th04/hardware/bgimage.asm b/th04/hardware/bgimage.asm deleted file mode 100644 index c2d96730..00000000 --- a/th04/hardware/bgimage.asm +++ /dev/null @@ -1,88 +0,0 @@ -public BGIMAGE_SNAP -bgimage_snap proc far - push si - push di - cmp bgimage_PL_B, 0 - jnz short @@already_allocated - call hmem_allocbyte pascal, PLANE_SIZE - mov bgimage_PL_B, ax - call hmem_allocbyte pascal, PLANE_SIZE - mov bgimage_PL_R, ax - call hmem_allocbyte pascal, PLANE_SIZE - mov bgimage_PL_G, ax - call hmem_allocbyte pascal, PLANE_SIZE - mov bgimage_PL_E, ax - -@@already_allocated: - mov dl, 4 - push ds - push 0E000h - push bgimage_PL_E - push 0B800h - push bgimage_PL_G - push 0B000h - push bgimage_PL_R - push 0A800h - push bgimage_PL_B - -@@next_plane: - pop es - pop ds - xor si, si - xor di, di - mov cx, (PLANE_SIZE / 4) - rep movsd - dec dl - jnz short @@next_plane - pop ds - pop di - pop si - retf -bgimage_snap endp - - -public BGIMAGE_PUT -bgimage_put proc far - push si - push di - mov dl, 4 - push ds - push 0E000h - push bgimage_PL_E - push 0B800h - push bgimage_PL_G - push 0B000h - push bgimage_PL_R - push 0A800h - push bgimage_PL_B - -@@next_plane: - pop ds - pop es - xor si, si - xor di, di - mov cx, (PLANE_SIZE / 4) - rep movsd - dec dl - jnz short @@next_plane - pop ds - pop di - pop si - retf -bgimage_put endp - even - - -public BGIMAGE_FREE -bgimage_free proc far - cmp bgimage_PL_B, 0 - jz short @@ret - call hmem_free pascal, bgimage_PL_B - call hmem_free pascal, bgimage_PL_R - call hmem_free pascal, bgimage_PL_G - call hmem_free pascal, bgimage_PL_E - mov bgimage_PL_B, 0 - -@@ret: - retf -bgimage_free endp diff --git a/th04/hardware/bgimage.cpp b/th04/hardware/bgimage.cpp new file mode 100644 index 00000000..d0c312cf --- /dev/null +++ b/th04/hardware/bgimage.cpp @@ -0,0 +1,82 @@ +#pragma codeseg SHARED_ +#pragma option -k- + +extern "C" { +#include +#include +#include "platform.h" +#include "x86real.h" +#include "pc98.h" +#include "planar.h" +#include "decomp.hpp" +#include "master.hpp" +#include "th04/hardware/bgimage.hpp" + +inline void memcpy_movsd( + uint16_t, uint16_t dst_off, uint16_t, uint16_t src_off, size_t size +) { + _SI = src_off; + _DI = dst_off; + _CX = (size / sizeof(uint32_t)); + REP MOVSD; +} + +#define bgimage_push() __asm { \ + push SEG_PLANE_E; \ + push word ptr [bgimage.E]; \ + push SEG_PLANE_G; \ + push word ptr [bgimage.G]; \ + push SEG_PLANE_R; \ + push word ptr [bgimage.R]; \ + push SEG_PLANE_B; \ + push word ptr [bgimage.B]; \ +} + +void bgimage_snap(void) +{ + if(bgimage.B == NULL) { + bgimage.B = reinterpret_cast(hmem_allocbyte(PLANE_SIZE)); + bgimage.R = reinterpret_cast(hmem_allocbyte(PLANE_SIZE)); + bgimage.G = reinterpret_cast(hmem_allocbyte(PLANE_SIZE)); + bgimage.E = reinterpret_cast(hmem_allocbyte(PLANE_SIZE)); + } + + _DL = PLANE_COUNT; + __asm { push ds; } + bgimage_push(); + do { + __asm { pop es; } + __asm { pop ds; } + memcpy_movsd(_ES, 0, _DS, 0, PLANE_SIZE); + _DL--; + } while(!FLAGS_ZERO); + __asm { pop ds; } +} + +void bgimage_put(void) +{ + _DL = PLANE_COUNT; + __asm { push ds; } + bgimage_push(); + do { + __asm { pop ds; } + __asm { pop es; } + memcpy_movsd(_ES, 0, _DS, 0, PLANE_SIZE); + _DL--; + } while(!FLAGS_ZERO); + __asm { pop ds; } +} +#pragma codestring "\x90" + +void bgimage_free(void) +{ + if(bgimage.B != NULL) { + hmem_free(FP_SEG(bgimage.B)); + hmem_free(FP_SEG(bgimage.R)); + hmem_free(FP_SEG(bgimage.G)); + hmem_free(FP_SEG(bgimage.E)); + bgimage.B = NULL; + } +} + +} diff --git a/th04/hardware/bgimage.h b/th04/hardware/bgimage.hpp similarity index 69% rename from th04/hardware/bgimage.h rename to th04/hardware/bgimage.hpp index bc6e94ef..00a0617c 100644 --- a/th04/hardware/bgimage.h +++ b/th04/hardware/bgimage.hpp @@ -1,9 +1,12 @@ // Additional 640×400 4-plane background image buffer. extern Planar bgimage; -void pascal bgimage_snap(void); -void pascal bgimage_put(void); -void pascal bgimage_free(void); +void bgimage_snap(void); + +// Blits garbage data if bgimage_snap() wasn't called before. +void bgimage_put(void); + +void bgimage_free(void); // Blits the rectangle from (⌊x/16⌋*16, y) to (⌈((x + w)/16)*16⌉, (y + h)) // on the [bgimage] to the same position in VRAM. void pascal bgimage_put_rect( diff --git a/th04/zunsoft.asm b/th04/zunsoft.asm index c2dd358e..c201f91f 100644 --- a/th04/zunsoft.asm +++ b/th04/zunsoft.asm @@ -263,7 +263,7 @@ else endif push 0 call graph_copy_page - call bgimage_snap + call _bgimage_snap graph_accesspage 1 call graph_clear graph_accesspage 0 @@ -420,7 +420,7 @@ frame_68: ; case 68 call zunsoft_pyro_new @@no_new_pyro_this_frame: - call bgimage_put ; default + call _bgimage_put ; default call zunsoft_update_and_render if GAME eq 4 call _input_reset_sense @@ -475,7 +475,7 @@ endif @@ret: call super_free - call bgimage_free + call _bgimage_free pop di pop si leave diff --git a/th04_maine.asm b/th04_maine.asm index e2f999f0..5a6ffdae 100644 --- a/th04_maine.asm +++ b/th04_maine.asm @@ -2344,7 +2344,7 @@ sub_B44D proc near call pi_put_8 pascal, large 0, 0 freePISlotLarge 0 call graph_copy_page pascal, 0 - call bgimage_snap + call _bgimage_snap kajacall KAJA_SONG_STOP call snd_load pascal, ds, offset aStaff, SND_LOAD_SONG kajacall KAJA_SONG_PLAY @@ -2392,7 +2392,7 @@ sub_B44D proc near call pi_put_8 pascal, large 0, 0 freePISlotLarge 0 call graph_copy_page pascal, 0 - call bgimage_snap + call _bgimage_snap push 4 call palette_black_in call cdg_load_single pascal, 2, ds, offset aSff4_cdg, 0 @@ -2455,7 +2455,7 @@ sub_B44D proc near call sub_B291 push 3000A0h call snd_delay_until_measure - call bgimage_free + call _bgimage_free call cdg_free_all push 4 call palette_black_out @@ -4615,7 +4615,8 @@ include th02/initmain.asm db 0 include th04/hardware/input_s.asm include th04/snd/se.asm -include th04/hardware/bgimage.asm + extern _bgimage_snap:proc + extern _bgimage_free:proc extern BGIMAGE_PUT_RECT:proc extern CDG_LOAD_SINGLE_NOALPHA:proc extern CDG_LOAD_SINGLE:proc diff --git a/th04_op.asm b/th04_op.asm index 3c2a572e..eb79c6b3 100644 --- a/th04_op.asm +++ b/th04_op.asm @@ -1811,7 +1811,7 @@ _musicroom proc near mov _music_sel, al call draw_tracks pascal, word ptr _music_sel call graph_copy_page pascal, 0 - call bgimage_snap + call _bgimage_snap graph_accesspage 1 graph_showpage 0 call screen_back_B_snap @@ -1917,7 +1917,7 @@ loc_C544: graph_accesspage al push 1 call palette_black_out - call bgimage_free + call _bgimage_free call snd_load pascal, ds, offset aOp_2, SND_LOAD_SONG kajacall KAJA_SONG_PLAY pop bp @@ -2667,10 +2667,12 @@ include th04/formats/cdg_put_noalpha.asm include th04/hardware/input_s.asm include th04/snd/se.asm include th04/hardware/egcrect.asm -include th04/hardware/bgimage.asm SHARED ends SHARED_ segment word public 'CODE' use16 + extern _bgimage_snap:proc + extern _bgimage_put:proc + extern _bgimage_free:proc extern BGIMAGE_PUT_RECT:proc extern CDG_LOAD_ALL_NOALPHA:proc extern CDG_LOAD_ALL:proc diff --git a/th05/m_char.cpp b/th05/m_char.cpp index 46915397..2c018d47 100644 --- a/th05/m_char.cpp +++ b/th05/m_char.cpp @@ -14,7 +14,7 @@ extern "C" { #include "th01/ranks.h" #include "th02/hardware/frmdelay.h" #include "th04/formats/cdg.h" -#include "th04/hardware/bgimage.h" +#include "th04/hardware/bgimage.hpp" #include "th04/score.h" #include "th04/common.h" #include "th05/chars.h" diff --git a/th05_maine.asm b/th05_maine.asm index 35eadfa8..bc318716 100644 --- a/th05_maine.asm +++ b/th05_maine.asm @@ -980,7 +980,7 @@ loc_ACAA: call graph_clear graph_accesspage 0 call graph_clear - call bgimage_snap + call _bgimage_snap jmp loc_AF8F ; default ; --------------------------------------------------------------------------- @@ -1004,7 +1004,7 @@ loc_ACF4: call pi_put_8 pascal, large 0, 0 call graph_copy_page pascal, 0 graph_accesspage 0 - call bgimage_snap + call _bgimage_snap jmp loc_AF8F ; default ; --------------------------------------------------------------------------- @@ -1492,7 +1492,7 @@ loc_B18D: ; --------------------------------------------------------------------------- loc_B196: - call bgimage_free + call _bgimage_free call pi_free pascal, 0 pop si leave @@ -3465,7 +3465,7 @@ loc_C2BB: call graph_putsa_fx pascal, (120 shl 16) or 192, 2, ds, offset aGxgnbGvbGhvV_0 loc_C2EB: - call bgimage_snap + call _bgimage_snap les bx, _resident cmp es:[bx+resident_t.end_sequence], ES_EXTRA jb short loc_C307 @@ -3475,7 +3475,7 @@ loc_C2EB: loc_C307: call graph_copy_page pascal, 1 - call bgimage_snap + call _bgimage_snap kajacall KAJA_SONG_STOP call snd_load pascal, ds, offset aName, SND_LOAD_SONG kajacall KAJA_SONG_PLAY @@ -3779,7 +3779,7 @@ loc_C5C3: call input_wait_for_change pascal, 0 loc_C5CD: - call bgimage_free + call _bgimage_free call super_free call text_clear push 1 @@ -7531,7 +7531,8 @@ include th04/snd/detmodes.asm include th04/hardware/grppsafx.asm include th04/formats/cdg_put_noalpha.asm include th04/snd/se.asm -include th04/hardware/bgimage.asm + extern _bgimage_snap:proc + extern _bgimage_free:proc extern _game_exit:proc extern VECTOR2_AT:proc extern BGIMAGE_PUT_RECT:proc diff --git a/th05_op.asm b/th05_op.asm index 27f6d4f6..8cc7aadc 100644 --- a/th05_op.asm +++ b/th05_op.asm @@ -1926,7 +1926,7 @@ _musicroom proc near call pi_free pascal, 0 call _piano_setup_and_put_initial call screen_back_B_snap - call bgimage_snap + call _bgimage_snap call draw_tracks pascal, word ptr _music_sel call graph_copy_page pascal, 0 graph_accesspage 1 @@ -2138,7 +2138,7 @@ loc_C790: graph_accesspage al push 1 call palette_black_out - call bgimage_free + call _bgimage_free call snd_load pascal, ds, offset aH_op+2, SND_LOAD_SONG kajacall KAJA_SONG_PLAY pop si @@ -2532,7 +2532,9 @@ include th02/exit_dos.asm include th04/hardware/grppsafx.asm include th04/formats/cdg_put_noalpha.asm include th04/snd/se.asm -include th04/hardware/bgimage.asm + extern _bgimage_snap:proc + extern _bgimage_put:proc + extern _bgimage_free:proc extern CDG_PUT_8:proc extern _game_exit:proc extern VECTOR1_AT:proc