From 6c9e6f3b81c3daae1085654eeb822d1fb6c1db74 Mon Sep 17 00:00:00 2001 From: sparky4 Date: Tue, 4 Apr 2017 10:45:20 -0500 Subject: [PATCH] p16 is being worked on a bunch by me wwww [16_ca needs huge amounts of work and I should remember what needs to be done soon][OpenVGMFile needs to be ported to 16_snd.c]going to port rest of code to borland c some time so we can use the core components of id engine here [going to add 16_us.c eventually but the debug system and CA_ PM_ and MM_ usage is priority now]older zcroll renamed to xcroll][zcroll is now the pre menu game loop system with PROPER data usage with CAMMPM] --- EXMMTEST.LOG | 112 --------------------------- bcexmm.dsk | Bin 1884 -> 1900 bytes bcexmm.exe | Bin 146386 -> 146208 bytes bcexmm.prj | Bin 7632 -> 9979 bytes makefile | 8 +- src/bakapi.c | 31 +++++--- src/bakapi.h | 1 + src/exmmtest.c | 7 +- src/lib/16_dbg.h | 1 + src/lib/16_mm.c | 153 ++++++++++-------------------------- src/lib/16_mm.h | 4 +- src/lib/16_pm.c | 3 +- src/lib/16_spri.c | 8 +- src/lib/16_tail.c | 179 ++++++++++++++++++++++++++++++++++++++++++- src/lib/16_tail.h | 22 +++++- src/lib/16_tdef.h | 11 ++- src/lib/16_vl.c | 37 +-------- src/lib/16_vl.h | 8 -- src/lib/16_vl_1.c | 167 ++++++++++++++++++++++++++++++++++++++++ src/lib/bakapee.c | 1 + src/lib/hb/demo16.c | 0 src/lib/hb/demokd.c | 3 +- src/lib/scroll16.c | 2 +- src/xcroll.c | 2 + video.ofs.bufferofs | 0 video.ofs.displayofs | 0 26 files changed, 461 insertions(+), 299 deletions(-) delete mode 100755 EXMMTEST.LOG create mode 100755 src/lib/hb/demo16.c create mode 100755 video.ofs.bufferofs create mode 100755 video.ofs.displayofs diff --git a/EXMMTEST.LOG b/EXMMTEST.LOG deleted file mode 100755 index c0eeeaa8..00000000 --- a/EXMMTEST.LOG +++ /dev/null @@ -1,112 +0,0 @@ -======================================load===================================== -====================================load end=================================== -contents of the buffer -[ - - -] - -yay! -======================================read===================================== -====================================read end=================================== -contents of the buffer -[ -{ "backgroundcolor":"#000000", - "height":30, - "layers":[ - { - "data":[1, 2, 3, 4, 0, 3, 3, 3, 3, 3, 3, 3, 3, 4, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 1, 2, 3, 4, 5, 6, 7, 8, 0, 1, 0, 1, 0, 0, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 5, 6, 7, 8, 9, 10, 11, 12, 4, 1, 0, 1, 0, 0, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 9, 10, 11, 12, 13, 14, 15, 16, 0, 1, 1, 1, 5, 8, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 13, 14, 15, 16, 0, 0, 4, 0, 0, 0, 0, 0, 8, 8, 11, 11, 11, 3, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 0, 0, 0, 0, 8, 8, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 0, 0, 0, 0, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 0, 0, 0, 0, 11, 11, 11, 11, 11, 11, 11, 11, 3, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 39, 11, 11, 11, 11, 11, 11, 3, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 3, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 3, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 3, 3, 3, 3, 1, 2, 3, 4, 3, 3, 3, 3, 3, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 3, 11, 11, 11, 11, 5, 6, 7, 8, 6, 6, 6, 6, 6, 3, 3, 3, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 3, 3, 11, 11, 11, 11, 11, 9, 10, 11, 12, 6, 6, 6, 6, 6, 6, 6, 6, 3, 3, 3, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 3, 11, 11, 11, 11, 11, 11, 11, 13, 14, 15, 16, 3, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 3, 3, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 3, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 3, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 3, 3, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 3, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 3, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 3, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 3, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 3, 3, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 3, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 3, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 3, 3, 3, 3, 3, 6, 6, 6, 6, 6, 6, 6, 3, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 3, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 3, 3, 3, 3, 3, 3, 3, 3, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 3, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 3, 3, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 0, 0, 0, 0, 0, 0, 0, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 3, 3, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 0, 11, 11, 11, 11, 11, 0, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 3, 3, 3, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 0, 11, 0, 0, 0, 11, 0, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 3, 3, 3, 11, 11, 11, 11, 11, 11, 11, 11, 0, 11, 0, 11, 11, 11, 0, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 0, 11, 0, 0, 0, 0, 0, 11, 11, 11, 11, 11, 11, 1, 2, 3, 4, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 0, 11, 11, 11, 11, 11, 11, 11, 11, 1, 2, 3, 4, 5, 6, 7, 8, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 0, 0, 0, 0, 0, 0, 0, 0, 11, 5, 6, 7, 8, 9, 10, 11, 12, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 9, 10, 11, 12, 13, 14, 15, 16, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 13, 14, 15, 16], - "height":30, - "name":"bg", - "opacity":1, - "type":"tilelayer", - "visible":true, - "width":40, - "x":0, - "y":0 - }, - { - "data":[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 37, 38, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], - "height":30, - "name":"fg", - "opacity":1, - "type":"tilelayer", - "visible":true, - "width":40, - "x":0, - "y":0 - }, - { - "data":[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32, 33, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], - "height":30, - "name":"top", - "opacity":1, - "type":"tilelayer", - "visible":true, - "width":40, - "x":0, - "y":0 - }, - { - "height":30, - "name":"ob", - "objects":[ - { - "height":16, - "name":"trunk", - "properties": - { - "walkable":"0" - }, - "type":"nonc", - "visible":true, - "width":32, - "x":128, - "y":32 - }, - { - "height":16, - "name":"stump", - "properties": - { - "walkable":"0" - }, - "type":"nonc", - "visible":true, - "width":16, - "x":144, - "y":128 - }], - "opacity":1, - "type":"objectgroup", - "visible":true, - "width":40, - "x":0, - "y":0 - }], - "orientation":"orthogonal", - "properties": - { - - }, - "tileheight":16, - "tilesets":[ - { - "firstgid":1, - "image":"ed.png", - "imageheight":64, - "imagewidth":64, - "margin":0, - "name":"wwww", - "properties": - { - - }, - "spacing":0, - "tileheight":16, - "tilewidth":16 - }, - { - "firstgid":17, - "image":"forest.gif", - "imageheight": \ No newline at end of file diff --git a/bcexmm.dsk b/bcexmm.dsk index c7cdb89b86faf9d0baf791715c9f435e89141717..e6b4ad6396d2f1e1e6e1b64ee4652ff379b60c62 100755 GIT binary patch delta 101 zcmcb^_l9r7E=J)T1~vvBhA0LGAkD=f$DqUDHu*H8^du%8RxLdrPp8TGEYg!dFbZuJ xW71~gWCW^Xn5?!#WwRH{eI`*jmw`b+X0lp>5);FQg2{I55^Ng^{{LrS0040E7qI{U delta 75 zcmaFEcZYAoE=Iu^237_x1|J3n1~wqA!eBA^ETi<~2`pTbMVN#pzhdOtEW>2VG&z`E aaB~vNbufd438;FqAG-t_1H=FS3=9CEx)F2$ diff --git a/bcexmm.exe b/bcexmm.exe index f3389f41cfd5be134501721a4cfb49b121995f33..947c944109e78a0d5bd53db67255c84554d405e8 100755 GIT binary patch delta 26640 zcma%@2V4|a_xEp`JG0BObXbau6|ol-4fcjz(HMKz7{wA)ASO{)M5BnYt%@y*CB_y@ zFp9?Bu=n0IMnR1lC2G{L?{AhBc%J|N^SBEww1g~h4d(?M&+mLxqPFwog8Ne(q8$sY|#at=7>ktFwkfq;O0<|J7O zymU{JeL+=F-;^ZXz%HL8xeCkygFshM8K_{fcap3Kvb>UHEs*P(B*%g}Ak>D#!+<1t z68r*|gQ;K;XbCC;4LtBqk_W(#U=|n+nuAin9~eNcUy|$z?)suNKn55}n`tjeGwmq& z0R)1YYBOz<(oCBLY$I{#2u_M-+Db4FOa-5NG}C&Tn`vc15P0X_OnVHjfJ0!kS2N8A z_y@!qy@3D(eDIGoz6H791$YXw!2@s?+yqy_MR3+X)@D2j;V3u+_JLg>6Kn;W!3MAf ztODs^30MH;f>~fXmPJ*N05ZDKHflRO!Yz7;^8n6nagC$@Am0m0D1SWv7U<@#^zJ~j>uVDbF z1HyqnAmBMc7_s#=9Eb25SPGIsJm?16fGD11r~*QP2L5D8hI`-~*a1EVT|h%n36uZ< zzyMy;Bts6k4zj>+U<+6YW`Sf7Z^NM<_zcts6@V3};2lXaJObCjDX<1C0@K0QU?}JY zT7!D}w}L!CFnA}D48McRAOp++f3quwDfEirt-NB0SFRXZiYo^155c%sAQya9f{?+L zGCG{E&DqXaJ2UC;%8abA)cPf@Ne;qBYkLU`OQ~Pd9&f5*MbJL|#2T@$@(ekf?e!1c zArdQ``S5C8a{U?h{ic$1hW&x5jmWd^^|#k>uOR$G_xfiHaIZy6KMN|Jpkz|=BqY`P zENBb6@Ox^smfBgSOi4^gNsCW#$Y(+JJ?0Kk&w@Tia4d^YNUr}Zh$Q69GG|xLb68&n zLzt0=LquNkcu5lc++HVW4(sb+hxJ`>MoW*^)Nfa@X_NL8TafzViTj(|$$3?6IazX- zy_45%I?Ep6U8Q<%f+JC+MoYJ7EkT`rJ=0=+B2znS&~%J(B$^zFMr0qYCLhu|#$ zXGo(u<{8CC9ZhE;3u2J>g@3!b?MskJVI;)yZzf?eZzKsJEZ*5VEMi|w#J-60F&(X$ z$OzG|mQFroO80lB^~+BCnAo=05F2r5#WjPT$Z^fSA4YSK~#HMv{*6My454Qm1Anyd~1}PYmN6!hlXU= zc0e8BK(HP%q5fPePxR5h8jd#UUur>%uSnB_?OQ^8ZS$NF)%fC>{Bu{BFBv=XwJte9zCF~gcZ-zpp{W?9qc>EE-h zy$i>kb4=$6^{?B*N|kA^M^Q2zjwkMVJUT5}uDF2~=yf9h zzD{eWP1x^X=9#zwQaGkYJJ6;i+7SiKs1i};+19Uur{Pr2u#WPMlC$iKN(p42)l1TQLcu3YEAKfX0w)h;fd@AjxE}SY+W_e{(1R|)$l?aG9_M& z84sU$rC$HoBXqsWEDSEo3Rz3V*2v1Q%TIF6`m#r>!gIm14?Zt-AL>rQW1>n1-Ho%aax@wR82 ztZSnDc|el=M!iye7)!F#`j?#N*Xrjvzppna>C`(Kv}zI_I$f3z-AWwR@X(cEp;^(d z8F^xy+S`#8{T6j6$>ZPB_yI>`Kqv;m@X+P{p(%Ju>idV{f}By(E%xaRt)U^IdK`lu z2ai!o^t=CxbFASYXPMO-O)Y74#&y%<_Rf#yW6c~xF*bTT5Zjj)3k!KjLS`%@I8hkdq}g2R@A_NMjQfl9 zD?HWWwO+4`BQ1wgr%sVE#dqg&~||H`&iqj&hN~2Rh-|C z+kNKzZrnb}`F*7QZ_e*YF+-f+FJjK<-x&uw^vN%v^rusu0h>PU>ioXj#@BA`RNpE0 z=@jgYJg(Ch&d3>$KJ%l&H?8B^Su^L7m_ydvR^Iz{nByxJ=BTyk1dp%>bcrZ`(>nH- z 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 Ryr^Jp;l|>Qc@s!D_#aE!I?Dh6 delta 26649 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 L_LZcPc}f2PnXYu) diff --git a/bcexmm.prj b/bcexmm.prj index 10728db9afe0a292ba8aaae73d3c6eef754fe318..8e3d98de811878ffb3cfdcb3d94db9b5f2080d04 100755 GIT binary patch literal 9979 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 diff --git a/makefile b/makefile index 69486b5b..589d5ff0 100755 --- a/makefile +++ b/makefile @@ -188,8 +188,6 @@ EXTERNTESTEXEC = & db.exe TESTEXEC = & vidtest.exe & - tesuto.exe & - 0.exe & exmmtest.exe & vgmtest.exe & xcroll.exe & @@ -204,6 +202,8 @@ TESTEXEC2 = & fonttest.exe & fontgfx.exe & test0.exe & + tesuto.exe & + 0.exe & $(EXTERNTESTEXEC) TESTEXEC3= & pcxtest2.exe @@ -242,7 +242,7 @@ testexec: $(EXEC) $(TESTEXEC2) # game and bakapi executables # 16.exe: 16.$(OBJ) $(16LIB) gfx.lib $(DOSLIB) -bakapi.exe: bakapi.$(OBJ) gfx.lib $(DOSLIB) +bakapi.exe: bakapi.$(OBJ) gfx.lib $(DOSLIB) 16_wcpu.$(OBJ) # # Test Executables! @@ -347,7 +347,7 @@ joytest.exe: 16_vl.$(OBJ): $(SRCLIB)/16_vl.c $(SRCLIB)/16_vl.h 16_vl_1.$(OBJ): $(SRCLIB)/16_vl_1.c $(SRCLIB)/16_vl.h 16_vlpal.$(OBJ): $(SRCLIB)/16_vlpa_.c $(SRCLIB)/16_vlpal.c $(SRCLIB)/16_vlpal.h -bakapee.$(OBJ):$(SRCLIB)/bakapee.c $(SRCLIB)/bakapee.h +bakapee.$(OBJ): $(SRCLIB)/bakapee.c $(SRCLIB)/bakapee.h 16render.$(OBJ):$(SRCLIB)/16render.c $(SRCLIB)/16render.h 16planar.$(OBJ):$(MODEXLIB16)/16planar.c $(MODEXLIB16)/16planar.h 16_vrs.$(OBJ): $(SRCLIB)/16_vrs.c $(SRCLIB)/16_vrs.h $(DOSLIB) diff --git a/src/bakapi.c b/src/bakapi.c index f787933a..cc61dcc8 100755 --- a/src/bakapi.c +++ b/src/bakapi.c @@ -28,7 +28,7 @@ static bakapee_t bakapee; word key,d,xpos,ypos,xdir,ydir; sword vgamodex_mode = 1; // 320x240 default -int ch=0x0; +//int ch=0x0; void main(int argc, char *argvar[]) @@ -86,6 +86,7 @@ main(int argc, char *argvar[]) printf("This program requires VGA or higher graphics hardware\n"); return; } + textInit(); // main variables values d=4; // switch variable @@ -95,17 +96,15 @@ main(int argc, char *argvar[]) xdir=1; ydir=1; - VGAmodeX(vgamodex_mode, 1, &gvar); // TODO: Suggestion: Instead of magic numbers for the first param, might I suggest defining an enum or some #define constants that are easier to remember? --J.C. + VGAmodeX(vgamodex_mode, 0, &gvar); // TODO: Suggestion: Instead of magic numbers for the first param, might I suggest defining an enum or some #define constants that are easier to remember? --J.C. // this code is written around modex16 which so far is a better fit than using DOSLIB vga directly, so leave MXLIB code in. // we'll integrate DOSLIB vga into that part of the code instead for less disruption. -- J.C. bakapee.xx = rand()&0%gvar.video.page[0].width; bakapee.yy = rand()&0%gvar.video.page[0].height; bakapee.gq = 0; - bakapee.sx=0; - bakapee.sy=0; - bakapee.bakax=0; - bakapee.bakay=0; + bakapee.sx= bakapee.sy=0; + bakapee.bakax= bakapee.bakay=0; bakapee.coor=0; //once where #defines @@ -114,9 +113,18 @@ main(int argc, char *argvar[]) bakapee.lgq=32; bakapee.hgq=55; + switch(WCPU_detectcpu()) + { + case 0: + bakapee.tile=1; + break; + default: + bakapee.tile=0; + break; + } + /* setup camera and screen~ */ gvar.video.page[0] = modexDefaultPage(&gvar.video.page[0]); - textInit(); //modexPalUpdate(bmp.palette); //____ //modexDrawBmp(VGA, 0, 0, &bmp, 0); //____ @@ -125,7 +133,7 @@ main(int argc, char *argvar[]) VL_ShowPage(&gvar.video.page[0], 0, 0); // screen savers -#ifdef BOINK +//#ifdef BOINK while(d>0) // on! { int c; @@ -285,11 +293,12 @@ pee: break; default: key=0; - break; + break; } } } -#else // !defined(BOINK) +#if 0 +//#else // !defined(BOINK) // FIXME: Does not compile. Do you want to remove this? // INFO: This is a testing section for textrendering and panning for project 16 --sparky4 while(1) @@ -325,5 +334,7 @@ pee: // printf("page.width=%u ", gvar.video.page[0].width); printf("page.height=%u\n", gvar.video.page[0].height); printf("bakapi ver. 1.04.16.04\nis made by sparky4i†ƒÖ…j feel free to use it ^^\nLicence: GPL v3\n"); printf("compiled on 2016/04/04\n"); +// printf("[%u]%dx%d [%dx%d] %u %u %u\n[%u %u %u]", key, bakapee.bakax, bakapee.bakay, bakapee.xx, bakapee.yy, +//bakapee.coor, bakapee.tile, bakapee.gq, bakapee.bonk, bakapee.lgq, bakapee.hgq); } //pee! diff --git a/src/bakapi.h b/src/bakapi.h index 54af8984..cf9aa3fe 100755 --- a/src/bakapi.h +++ b/src/bakapi.h @@ -24,6 +24,7 @@ #define __BAKAPI_H_ #include "src/lib/bakapee.h" +#include "src/lib/wcpu/16_wcpu.h" //project 16 testing define switch for veiwing the contents of the video memory --sparky4 #define BOINK // what does this mean? --J.C. diff --git a/src/exmmtest.c b/src/exmmtest.c index c0d2bbd7..106ebab7 100755 --- a/src/exmmtest.c +++ b/src/exmmtest.c @@ -45,7 +45,8 @@ //#define EXMMVERBOSE__ // #define PRINTBBDUMP #define BUFFDUMP -//#define NOVID +#define NOVID + #define KEYP IN_Shutdown(&gvar); printf("\n\npress any key to continue!\n"); getch(); IN_Startup(&gvar); @@ -257,7 +258,7 @@ PRINTBB; KEYP switch (scan) { case sc_Space: - MM_ShowMemoryVidVer(&gvar); + MM_ShowMemory(&gvar); break; //#ifdef __WATCOMC__ case sc_O: @@ -353,7 +354,7 @@ PRINTBB; KEYP #endif printf("\n"); #endif - printf("old_mode=%u VL_Started=%u", gvar.video.old_mode, gvar.video.VL_Started); + //printf("old_mode=%u VL_Started=%u", gvar.video.old_mode, gvar.video.VL_Started); //printf("based core left: %lu\n", (dword)_basedcoreleft()); //printf("huge core left: %lu\n", (dword)_hugecoreleft()); } diff --git a/src/lib/16_dbg.h b/src/lib/16_dbg.h index 6903aa57..ede5c359 100755 --- a/src/lib/16_dbg.h +++ b/src/lib/16_dbg.h @@ -22,6 +22,7 @@ extern boolean dbg_debugmm; #endif #ifdef __DEBUG_PM__ +//#define __DEBUG_PM_MAIN__ extern boolean dbg_debugpm; #endif #ifdef __DEBUG_CA__ diff --git a/src/lib/16_mm.c b/src/lib/16_mm.c index a265e958..8fa8de5b 100755 --- a/src/lib/16_mm.c +++ b/src/lib/16_mm.c @@ -1260,31 +1260,34 @@ void MM_SortMem(global_game_variables_t *gvar) void MM_ShowMemory(global_game_variables_t *gvar) { mmblocktype far *scan; - //word temp; + unsigned color,temp,x,y,w; sdword end,owner; - //word chx,chy; - word w; - //dword wwww; - byte scratch[160],scratch0[4096],str[16];//[[[[scratch1[160], - //byte d = '#'; -//[[[[ VW_SetLineWidth(40); -//++++mh temp = bufferofs; -//++++mh bufferofs = 0; -//[[[[ VW_SetScreen (0,0); + byte scratch[160],scratch0[4096],str[16]; + + VL_SetLineWidth(40, &gvar->video.ofs); + temp = gvar->video.ofs.bufferofs; + gvar->video.ofs.bufferofs = gvar->video.ofs.displayofs; scan = gvar->mm.mmhead; - end = -1; + + end = -1; w = 0; CA_OpenDebug (gvar); - w=0; - while(scan) + while (scan) { strcpy(scratch, AARESET); if(scan->attributes & PURGEBITS) + { + color = 5; // dark purple = purgable strcpy(scratch0, AAMAGENTA); // dark purple = purgable - else + }else{ + color = 9; // medium blue = non purgable strcpy(scratch0, AABLUE); // medium blue = non purgable + } if(scan->attributes & LOCKBIT) + { + color = 12; // red = locked strcpy(scratch0, AARED); // red = locked + } if(scan->start<=end) { printf("\nend==%d\n\n", end); @@ -1296,50 +1299,38 @@ void MM_ShowMemory(global_game_variables_t *gvar) ultoa (scan->start,str,10); strcat (scratch,str); write(gvar->handle.debughandle,scratch,strlen(scratch)); - //modexprint(&page, chx, chy, 1, 0, 24, "\nMM_ShowMemory: Memory block order currupted!\n"); - break; + Quit (gvar, "MM_ShowMemory: Memory block order currupted!"); } - end = scan->start+(scan->length)-1; -//++++ chy = scan->start/320; -//++++ chx = scan->start%320; - //modexhlin(page, scan->start, (unsigned)end, chy, color); - //for(chx=scan->start;chx+4>=(word)end;chx+=4) - //{ -//++++ modexClearRegion(page, chx, chy, 4, 4, color); - //} -//++++ VW_Hlin(scan->start,(unsigned)end,0,color); + end = scan->length-1; + //end = scan->start+(scan->length)-1; + y = scan->start/320; + x = scan->start%320; + VW_Hlin(x,x+end,y,color, &gvar->video.ofs); + VL_Plot(x,y,15, &gvar->video.ofs); for(w=(scan->start)/80;w<=end/80;w++) { //printf("+ %u %lu\n", w, scan->length); strcat(scratch0, "+"); } - //++==++==optional strcat(scratch0, AARESET); strcat(scratch0, AAGREY); strcat(scratch0,"_"); -//++++ VW_Plot(scan->start,0,15); -//++++ modexClearRegion(page, chx, chy, 4, 4, 15); -//++++ VW_Hlin(end+1,scan->next->start,0,0); // black = free - - //wwww=(dword)(scan->next->start)-(dword)scan->start; - //wwww=(dword)scan->start+(dword)(scan->next->start); - if (scan->next && scan->next->start >= end+1) +//++==++==optional strcat(scratch0, AARESET); strcat(scratch0, AAGREY); strcat(scratch0,"_"); + if (scan->next && scan->next->start > end+1) + //if (scan->next && scan->next->start >= end+1) { + VW_Hlin(x+end+1,x+(scan->next->start-scan->start),y,0, &gvar->video.ofs); // black = free strcat(scratch0, AARESET); - //++==++==optional strcat(scratch0, "\n"); +//++==++==optional strcat(scratch0, "\n"); strcat(scratch0,AAGREEN); for(w=(end+1)/80;w<=((scan->next->start-scan->start)/80);w++) - //for(w=(wwww)/80;w<=((end+1)/80);w++) - //for(w=(end+1)/80;w<=((wwww)/80);w++) { //printf("0 %x %u %lu\n", scan->next->start, w, scan->length); strcat(scratch0,"0"); } //printf("==================\n"); - //printf("w=%u wwww=%lu start=%04x next=%04x end=%lu\n", w/80, wwww/80, scan->start, (scan->next->start), end+1); + //printf("w=%u start=%04x next=%04x end=%lu\n", w/80, scan->start, (scan->next->start), end+1); //printf("==================\n"); strcat(scratch0, "\n"); - //getch(); }/*else {//if(scan->next->start <= scan->start){ scan->next->start=scan->start+0x1000; - wwww=(dword)(scan->next->start)-(dword)scan->start; strcat(scratch0, AARESET); strcat(scratch0, "\n"); strcat(scratch0,AAGREEN); @@ -1349,23 +1340,12 @@ void MM_ShowMemory(global_game_variables_t *gvar) strcat(scratch0,"0"); } printf("================\n"); - printf("w=%x start=%x next=%x end=%u %lu\n", w, scan->start, (scan->next->start), end+1, wwww); + printf("w=%x start=%x next=%x end=%u\n", w, scan->start, (scan->next->start), end+1); printf("================\n"); getch(); }*/ strcat(scratch0, AARESET); //strcat(scratch0,"\n"); - //for(chx=scan->next->start;chx+4>=(word)end+1;chx+=4) - //{ -// chx+=scan->next->start; -// modexClearRegion(page, chx, chy, 4, 4, 2); - //} - //modexhlin(page, end+1,scan->next->start, chy, 0); -/* y = scan->start/320; - x = scan->start%320; - VW_Hlin(x,x+end,y,color); - VW_Plot(x,y,15);*/ -//++++ VW_Hlin(x+end+1,x+(scan->next->start-scan->start),y,0); // black = free strcat(scratch,"Seg:"); ultoa (scan->start,str,16); strcat (scratch,str); @@ -1379,76 +1359,19 @@ void MM_ShowMemory(global_game_variables_t *gvar) strcat (scratch,"\n"); write(gvar->handle.debughandle,scratch,strlen(scratch)); write(gvar->handle.debughandle,scratch0,strlen(scratch0)); -//modexprint(page, chx, chy, 1, 0, 24, &scratch); -//++++chy+=4; //fprintf(stdout, "%s", scratch); scan = scan->next; } - /*strcpy(scratch1, AARESET); - strcat(scratch1, "========================================\n"); - strcat(scratch1, "near= "); - ultoa (*(gvar->mm.nearheap),str,10); - strcat (scratch1,str); - strcat(scratch1, " far= "); - ultoa (*(gvar->mm.farheap),str,10); - strcat (scratch1,str); - strcat(scratch1, "\n"); - //strcat(scratch1, "&near= %Fp ", &(gvar->mm.nearheap)); - //strcat(scratch1, "&far= %Fp", &(gvar->mm.farheap)); - //strcat(scratch1, "\n"); - strcat(scratch1, "========================================\n"); - write(gvar->handle.debughandle,scratch1,strlen(scratch1));*/ - CA_CloseDebug (gvar); -//++++mh IN_Ack(); + IN_Ack(gvar); //**** VW_SetLineWidth(64); -//++++mh bufferofs = temp; + gvar->video.ofs.bufferofs = temp; } -void MM_ShowMemoryVidVer(global_game_variables_t *gvar) -{ - mmblocktype far *scan; - unsigned color,temp,x,y; - long end;//,owner; - //char scratch[80],str[10]; - temp = gvar->video.ofs.bufferofs; - gvar->video.ofs.bufferofs = gvar->video.ofs.displayofs; - scan = gvar->mm.mmhead; - - end = -1; - - while (scan) - { - if (scan->attributes & PURGEBITS) - color = 5; // dark purple = purgable - else - color = 9; // medium blue = non purgable - if (scan->attributes & LOCKBIT) - color = 12; // red = locked - if (scan->start<=end) - Quit (gvar, "MM_ShowMemory: Memory block order currupted!"); - //end = scan->length-1; - end = scan->start+(scan->length)-1; - y = scan->start/320; - x = scan->start%320; - VW_Hlin(x,x+end,y,color, &gvar->video.ofs); - VL_Plot(x,y,15, &gvar->video.ofs); - //if (scan->next && scan->next->start > end+1) - if (scan->next && scan->next->start >= end+1) - VW_Hlin(x+end+1,x+(scan->next->start-scan->start),y,0, &gvar->video.ofs); // black = free - - scan = scan->next; - } - - //----VL_FadeIn(0,255,&gvar->video.palette,10, &gvar->video); - IN_Ack(gvar); - - gvar->video.ofs.bufferofs = temp; -} //========================================================================== @@ -1610,7 +1533,7 @@ void MM_Report_(global_game_variables_t *gvar) printf(" %c%cEMM v%x.%x available\n", 0xC7, 0xC4, gvar->pm.emm.EMSVer>>4,gvar->pm.emm.EMSVer&0x0F); printf(" %c%ctotalEMSpages: %u ", 0xC7, 0xC4, gvar->pm.emm.totalEMSpages); printf("freeEMSpages: %u\n", gvar->pm.emm.freeEMSpages); printf(" %c%cEMSPageFrame: %04x\n", 0xC7, 0xC4, gvar->pm.emm.EMSPageFrame); - printf(" %c%cEMSmem: %lu\n", 0xD3, 0xC4, gvar->mmi.EMSmem); + printf(" %c%cEMSmem: %lu or %luk\n", 0xD3, 0xC4, gvar->mmi.EMSmem, gvar->mmi.EMSmem/1204); } if(MML_CheckForXMS()) { @@ -1618,7 +1541,7 @@ void MM_Report_(global_game_variables_t *gvar) printf(" %c%cXMS v%x.%x available\n", 0xC7, 0xC4, XMSVer>>8,XMSVer&0x0F); printf(" %c%cXMSDriver: %Fp\n", 0xC7, 0xC4, XMSDriver); printf(" %c%cXMSHandle: %04x\n", 0xC7, 0xC4, gvar->pm.xmm.XMSHandle); - printf(" %c%cXMSmem: %lu\n", 0xD3, 0xC4, gvar->mmi.XMSmem); + printf(" %c%cXMSmem: %lu or %lukb\n", 0xD3, 0xC4, gvar->mmi.XMSmem, gvar->mmi.XMSmem/1024); } printf(" %cConv. %u\n", 0xC9, gvar->pm.mm.MainPresent); DebugMemory_(gvar, 0); //printf("mainmem: %lu\n", gvar->mmi.mainmem); @@ -1773,7 +1696,8 @@ void MM_BombOnError(boolean bomb, global_game_variables_t *gvar) gvar->mm.bombonerror = bomb; } -/*void MM_GetNewBlock(global_game_variables_t *gvar) +#if 0 +void MM_GetNewBlock(global_game_variables_t *gvar) { if(!gvar->mm.mmfree) MML_ClearBlock(gvar); @@ -1792,7 +1716,8 @@ void MM_FreeBlock(mmblocktype *x, global_game_variables_t *gvar) x->useptr=NULL; x->next=gvar->mm.mmfree; gvar->mm.mmfree=x; -}*/ +} +#endif void xms_call(byte v, global_game_variables_t *gvar) { diff --git a/src/lib/16_mm.h b/src/lib/16_mm.h index bd529c03..f890a3bb 100755 --- a/src/lib/16_mm.h +++ b/src/lib/16_mm.h @@ -42,11 +42,10 @@ #define BUFFERSIZE 0x1000 // miscelanious, allways available buffer -//moved to typdefst +//moved to 16_tdef.h //#define MAXBLOCKS 1024 - //-------- #define EMS_INT 0x67 @@ -196,7 +195,6 @@ void MM_SetPurge(memptr *baseptr, int purge, global_game_variables_t *gvar); void MM_SetLock(memptr *baseptr, boolean locked, global_game_variables_t *gvar); void MM_SortMem(global_game_variables_t *gvar); void MM_ShowMemory(global_game_variables_t *gvar); -void MM_ShowMemoryVidVer(global_game_variables_t *gvar); void MM_DumpData(global_game_variables_t *gvar); dword MM_UnusedMemory(global_game_variables_t *gvar); dword MM_TotalFree(global_game_variables_t *gvar); diff --git a/src/lib/16_pm.c b/src/lib/16_pm.c index 9fabd9be..858bd4b9 100755 --- a/src/lib/16_pm.c +++ b/src/lib/16_pm.c @@ -507,7 +507,6 @@ PML_XMSCopy(boolean toxms,byte far *addr,word xmspage,word length, global_game_v if (!addr) { Quit (gvar, "PML_XMSCopy: zero address\n"); - //return; } xoffset = (dword)xmspage * PMPageSize; @@ -621,8 +620,10 @@ PM_SetMainMemPurge(int level, global_game_variables_t *gvar) for (i = 0;i < PMMaxMainMem;i++) { #ifdef __DEBUG_PM__ +#ifdef __DEBUG_PM_MAIN__ printf("PM_SetMainMemPurge() info of gvar->pm.mm.MainMemPages[i]\n"); printf("& %Fp, %Fp\n", &gvar->pm.mm.MainMemPages[i], &(gvar->pm.mm.MainMemPages[i])); +#endif #endif if (gvar->pm.mm.MainMemPages[i]) MM_SetPurge(&(gvar->pm.mm.MainMemPages[i]),level, gvar); diff --git a/src/lib/16_spri.c b/src/lib/16_spri.c index 251bad5b..5c24d89b 100755 --- a/src/lib/16_spri.c +++ b/src/lib/16_spri.c @@ -22,6 +22,8 @@ #include "src/lib/16_spri.h" +struct glob_game_vars *ggvv; + char* get_curr_anim_name(struct sprite *spri) { // Retrive animation name list @@ -197,7 +199,11 @@ void animate_spri(entity_t *enti, video_t *video) ); #endif #ifdef __DEBUG_SPRI__ - if(dbg_delayanimation) delay(250);//{ while(!IN_KeyDown(sc_Space)/* && !IN_KeyDown(sc_Escape)*/){} delay(250); } +// if(ggvv->player[0].enti.q<5) + if(dbg_delayanimation) + { + IN_Ack(ggvv);// delay(250);//{ while(!IN_KeyDown(sc_Space)/* && !IN_KeyDown(sc_Escape)*/){} delay(250); } + } #endif if(!video->vga_state.rss) { diff --git a/src/lib/16_tail.c b/src/lib/16_tail.c index daa9fadc..c0d6d89f 100755 --- a/src/lib/16_tail.c +++ b/src/lib/16_tail.c @@ -20,11 +20,14 @@ * */ /* - * 16 library + * 16 tail library */ #include "src/lib/16_tail.h" #include "src/lib/16text.h" + +static word far* clockw= (word far*) 0x046C; /* 18.2hz clock */ + /* ========================== = @@ -127,7 +130,7 @@ void TL_VidInit(global_game_variables_t *gvar) // get old video mode //in.h.ah = 0xf; //int86(0x10, &in, &out); - gvar->video.old_mode = vgaGetMode();//out.h.al; + if(!gvar->video.old_mode) gvar->video.old_mode = vgaGetMode();//out.h.al; #else gvar->video.old_mode = 3; #endif @@ -281,6 +284,176 @@ void TL_VidInit(global_game_variables_t *gvar) //=========================================================================== +/* +=================== += += FizzleFade += +=================== +*/ + +#define PIXPERFRAME 1600 + +void FizzleFade (unsigned source, unsigned dest, + unsigned width,unsigned height, boolean abortable, global_game_variables_t *gv) +{ + unsigned drawofs,pagedelta; + unsigned char maskb[8] = {1,2,4,8,16,32,64,128}; + unsigned x,y,p,frame; + long rndval; + word TimeCount = *clockw; + word screenseg = SCREENSEG; + + pagedelta = dest-source; +//++++ VL_SetScreen (dest,0); + rndval = 1; + x = y = 0; + + __asm { + mov es,[screenseg] + mov dx,SC_INDEX + mov al,SC_MAPMASK + out dx,al + } + + TimeCount=frame=0; + do // while (1) + { + if (abortable) + { + IN_ReadControl(0,gv); + if (gv->player[0].info.button0 || gv->player[0].info.button1 || gv->in.inst->Keyboard[sc_Space] + || gv->in.inst->Keyboard[sc_Enter]) + { +//++++ VW_ScreenToScreen (source,dest,width/8,height); + return; + } + } + + for (p=0;pwidth || y>height) + continue; + drawofs = source+gv->video.ofs.ylookup[y]; + + __asm { + mov cx,[x] + mov si,cx + and si,7 + mov dx,GC_INDEX + mov al,GC_BITMASK + mov ah,BYTE PTR [maskb+si] + out dx,ax + + mov si,[drawofs] + shr cx,1 + shr cx,1 + shr cx,1 + add si,cx + mov di,si + add di,[pagedelta] + + mov dx,GC_INDEX + mov al,GC_READMAP // leave GC_INDEX set to READMAP + out dx,al + + mov dx,SC_INDEX+1 + mov al,1 + out dx,al + mov dx,GC_INDEX+1 + mov al,0 + out dx,al + + mov bl,[es:si] + xchg [es:di],bl + + mov dx,SC_INDEX+1 + mov al,2 + out dx,al + mov dx,GC_INDEX+1 + mov al,1 + out dx,al + + mov bl,[es:si] + xchg [es:di],bl + + mov dx,SC_INDEX+1 + mov al,4 + out dx,al + mov dx,GC_INDEX+1 + mov al,2 + out dx,al + + mov bl,[es:si] + xchg [es:di],bl + + mov dx,SC_INDEX+1 + mov al,8 + out dx,al + mov dx,GC_INDEX+1 + mov al,3 + out dx,al + + mov bl,[es:si] + xchg [es:di],bl + } + + if (rndval == 1) // entire sequence has been completed + { +//++++ VGABITMASK(255); +//++++ VGAMAPMASK(15); + return; + } + } + frame++; +//++++ while (TimeCount +#include +#include +#include +#include +#endif + +//gvar.video.ofs.bufferofs,gvar.video.ofs.displayofs, +#define FIZZLEFADEFUNCTION \ + if(gvar.in.inst->Keyboard[sc_F]){ FizzleFade(\ + atoi(gvar.video.page[0].data),atoi(gvar.video.page[1].data),\ +320,240,true, &gvar); IN_UserInput(1, &gvar); } \ + #define TAIL_FUNCTIONKEYFUNCTIONS \ if(gvar.in.inst->Keyboard[88]){ panswitch=!panswitch; IN_UserInput(1, &gvar); } \ TAIL_FUNCTIONKEYFUNCTIONS0EXE @@ -55,14 +69,15 @@ #define TAIL_FUNCTIONKEYFUNCTIONS0EXE \ if(gvar.in.inst->Keyboard[sc_F4]){ turboXT(12); IN_UserInput(1, &gvar); } \ - if(gvar.in.inst->Keyboard[68/*sc_F10*/]){ gvar.kurokku.fpscap=!gvar.kurokku.fpscap; IN_UserInput(1, &gvar); } \ - if(gvar.in.inst->Keyboard[sc_F8]){ gvar.video.vga_state.bgps=!gvar.video.vga_state.bgps; IN_UserInput(1, &gvar); } \ + if(gvar.in.inst->Keyboard[68/*sc_F10*/]){ gvar.kurokku.fpscap=!gvar.kurokku.fpscap; IN_UserInput(1, &gvar); } \ + if(gvar.in.inst->Keyboard[sc_F8]){ gvar.video.vga_state.bgps=!gvar.video.vga_state.bgps; IN_UserInput(1, &gvar); } \ if(gvar.in.inst->Keyboard[sc_F7]){ ZC_ShowMV(&gvar.mv, 0, 1); IN_UserInput(1, &gvar); } \ if(gvar.in.inst->Keyboard[sc_F6]){ ZC_ShowMV(&gvar.mv, 0, 0); IN_UserInput(1, &gvar); } \ - if(gvar.in.inst->Keyboard[sc_T]){ gvar.video.vga_state.rss=!gvar.video.vga_state.rss; IN_UserInput(1, &gvar); } \ + if(gvar.in.inst->Keyboard[sc_T]){ gvar.video.vga_state.rss=!gvar.video.vga_state.rss; IN_UserInput(1, &gvar); } \ if(gvar.in.inst->Keyboard[sc_P]){ modexpdump(&gvar.video.page[0]); IN_UserInput(1, &gvar); } \ if(gvar.in.inst->Keyboard[sc_Y]){ dbg_delayanimation=!dbg_delayanimation; IN_UserInput(1, &gvar); } \ RFDEBUGFUNCTIONS +//FIZZLEFADEFUNCTION #define TAIL_PANKEYFUN \ TAIL_PANKEYFUNZC \ @@ -105,6 +120,7 @@ word modexPalOverscan(word col); void Shutdown16(global_game_variables_t *gvar); void Startup16(global_game_variables_t *gvar); void TL_VidInit(global_game_variables_t *gvar); +void FizzleFade (unsigned source, unsigned dest,unsigned width,unsigned height, boolean abortable, global_game_variables_t *gv); void DebugMemory_(global_game_variables_t *gvar, boolean q); void ClearMemory (global_game_variables_t *gvar); void Quit (global_game_variables_t *gvar, char *error); diff --git a/src/lib/16_tdef.h b/src/lib/16_tdef.h index a3ac0ae4..93a0d3e0 100755 --- a/src/lib/16_tdef.h +++ b/src/lib/16_tdef.h @@ -359,6 +359,12 @@ typedef struct #define MAXSCANLINES 240 // size of ylookup table //video +typedef struct +{ + word tileHeight, tileWidth; //defined by mapfile + word quadwh; //preproccessed quad size of tilewidth and tileheight +} tile_dimention_t; + typedef struct { unsigned int offscreen_ofs; @@ -396,6 +402,7 @@ typedef struct nibble sfip; //shinku_fps_indicator_page; // we're on page 1 now, shinku(). follow along please or it will not be visible. ofs_t ofs; //offset vars used for doslib word vh; //video combined height + tile_dimention_t td; //0000word startclk; float clk, tickclk; //timer //wolf3d vars boolean screenfaded; @@ -659,7 +666,9 @@ typedef struct { vidsw_t vsw; } sw_t;*/ -typedef struct + + +typedef struct glob_game_vars { video_t video; // video settings variable ca_t ca; // ca stuff diff --git a/src/lib/16_vl.c b/src/lib/16_vl.c index 833a75a6..514e7d4d 100755 --- a/src/lib/16_vl.c +++ b/src/lib/16_vl.c @@ -55,6 +55,10 @@ void VGAmodeX(sword vq, boolean cmem, global_game_variables_t *gv) default: // init the video if(gv->video.VL_Started) return; + // get old video mode + //in.h.ah = 0xf; + //int86(0x10, &in, &out); + gv->video.old_mode = vgaGetMode();//out.h.al; // enter mode modexEnter(vq, cmem, gv); break; @@ -175,39 +179,6 @@ modexLeave() { vgaSetMode(TEXT_MODE); } -/* -==================== -= -= VL_SetLineWidth -= -= Line witdh is in WORDS, 40 words is normal width for vgaplanegr -= -==================== -*/ - -void VL_SetLineWidth (unsigned width, ofs_t *ofs) -{ - int i,offset; - -// -// set wide virtual screen -// - outport (CRTC_INDEX,CRTC_OFFSET+width*256); - -// -// set up lookup tables -// - ofs->linewidth = width*2; - - offset = 0; - - for (i=0;iylookup[i]=offset; - offset += ofs->linewidth; - } -} - page_t modexDefaultPage(page_t *p) { diff --git a/src/lib/16_vl.h b/src/lib/16_vl.h index 00cd2238..af357b08 100755 --- a/src/lib/16_vl.h +++ b/src/lib/16_vl.h @@ -35,14 +35,6 @@ // #include "src/lib/modex16/192x144_.h" // #include "src/lib/modex16/160x120.h" -#ifdef __WATCOMC__ -#include -#include -#include -#include -#include -#endif - //320x240 = 20x15 //192x144 = 12x9 diff --git a/src/lib/16_vl_1.c b/src/lib/16_vl_1.c index a6928b27..31c9f38e 100755 --- a/src/lib/16_vl_1.c +++ b/src/lib/16_vl_1.c @@ -25,6 +25,173 @@ #include #include "src/lib/16_vl.h" +static word far* clockw= (word far*) 0x046C; /* 18.2hz clock */ + +//=========================================================================== + +//============== +// +// VL_SetScreen +// +//============== + +void VL_SetScreen (unsigned int crtc, int pelpan) +{ +// PROC VL_SetScreen crtc:WORD, pel:WORD +// PUBLIC VL_SetScreen + word TimeCount = *clockw; + __asm { + mov cx,[TimeCount] // if TimeCount goes up by two, the retrace + add cx,2 // period was missed (an interrupt covered it) + + mov dx,STATUS_REGISTER_1 + + // wait for a display signal to make sure the raster isn't in the middle + // of a sync + +#ifdef __BORLANDC__ + } +#endif +SetScreen_waitdisplay: +#ifdef __BORLANDC__ + __asm { +#endif + in al,dx + test al,1 //1 = display is disabled (HBL / VBL) + jnz SetScreen_waitdisplay + +#ifdef __BORLANDC__ + } +#endif +SetScreen_loop: +#ifdef __BORLANDC__ + __asm { +#endif + sti + jmp SetScreen_skip1 + cli +#ifdef __BORLANDC__ + } +#endif +SetScreen_skip1: +#ifdef __BORLANDC__ + __asm { +#endif + cmp [TimeCount],cx // will only happen if an interrupt is + jae SetScreen_setcrtc // straddling the entire retrace period + + // when several succesive display not enableds occur, + // the bottom of the screen has been hit + + in al,dx + test al,8 + jnz SetScreen_waitdisplay + test al,1 + jz SetScreen_loop + + in al,dx + test al,8 + jnz SetScreen_waitdisplay + test al,1 + jz SetScreen_loop + + in al,dx + test al,8 + jnz SetScreen_waitdisplay + test al,1 + jz SetScreen_loop + + in al,dx + test al,8 + jnz SetScreen_waitdisplay + test al,1 + jz SetScreen_loop + + in al,dx + test al,8 + jnz SetScreen_waitdisplay + test al,1 + jz SetScreen_loop + +#ifdef __BORLANDC__ + } +#endif +SetScreen_setcrtc: +#ifdef __BORLANDC__ + __asm { +#endif + // set CRTC start + // for some reason, my XT's EGA card doesn't like word outs to the CRTC index... + + mov cx,[crtc] + mov dx,CRTC_INDEX + mov al,0ch //start address high register + out dx,al + inc dx + mov al,ch + out dx,al + dec dx + mov al,0dh //start address low register + out dx,al + mov al,cl + inc dx + out dx,al + + + // set horizontal panning + + mov dx,ATR_INDEX +// mov al,ATR_PELPAN or 20h + out dx,al + jmp SetScreen_done + mov al,[BYTE PTR pelpan] //pel pan value + out dx,al +#ifdef __BORLANDC__ + } +#endif +SetScreen_done: +#ifdef __BORLANDC__ + __asm { +#endif +// sti + +// ret + } +} + +/* +==================== += += VL_SetLineWidth += += Line witdh is in WORDS, 40 words is normal width for vgaplanegr += +==================== +*/ + +void VL_SetLineWidth (unsigned width, ofs_t *ofs) +{ + int i,offset; + +// +// set wide virtual screen +// + outport (CRTC_INDEX,CRTC_OFFSET+width*256); + +// +// set up lookup tables +// + ofs->linewidth = width*2; + + offset = 0; + + for (i=0;iylookup[i]=offset; + offset += ofs->linewidth; + } +} + /* ============================================================================= diff --git a/src/lib/bakapee.c b/src/lib/bakapee.c index bab3eba7..389a8159 100755 --- a/src/lib/bakapee.c +++ b/src/lib/bakapee.c @@ -329,5 +329,6 @@ void ding(page_t *page, bakapee_t *pee, word q) default: break; } + //printf(" %dx%d %dx%d\n", pee->xx, pee->yy, tx, ty); //pee->coor++; } diff --git a/src/lib/hb/demo16.c b/src/lib/hb/demo16.c new file mode 100755 index 00000000..e69de29b diff --git a/src/lib/hb/demokd.c b/src/lib/hb/demokd.c index 1b19e369..1059af5b 100755 --- a/src/lib/hb/demokd.c +++ b/src/lib/hb/demokd.c @@ -6,8 +6,7 @@ ===================== */ -void -DemoLoop (void) +void DemoLoop (void) { char *s; word move; diff --git a/src/lib/scroll16.c b/src/lib/scroll16.c index 6f90915b..d6c33f34 100755 --- a/src/lib/scroll16.c +++ b/src/lib/scroll16.c @@ -753,7 +753,7 @@ void shinku(global_game_variables_t *gv) //modexCopyPageRegion(&video->page[0], &video->page[1], enti->x, enti->y, 0, 0, 24, 32); }*/ VL_ShowPage(&(gv->video.page[gv->video.sp]), gv->kurokku.fpscap, 0); - gv->video.dorender =!gv->video.dorender ; + gv->video.dorender =!gv->video.dorender; //0000gv->video.tickclk = ((*clockw)-gv->video.startclk)/18.2; } PM_NextFrame(gv); diff --git a/src/xcroll.c b/src/xcroll.c index 38516c99..fcc7778d 100755 --- a/src/xcroll.c +++ b/src/xcroll.c @@ -52,6 +52,7 @@ void main(int argc, char *argv[]) { static global_game_variables_t gvar; char *bakapee1,*bakapee1p; + struct glob_game_vars *ggvv; // sword bakapee; // if(argv[1]) bakapee = atoi(argv[1]); // else bakapee = 1; @@ -60,6 +61,7 @@ void main(int argc, char *argv[]) bakapee1=malloc(64); bakapee1p=malloc(64); + ggvv=&gvar; if (argc < 2) { //fprintf(stderr,"drawvrl \n palette file optional\n"); diff --git a/video.ofs.bufferofs b/video.ofs.bufferofs new file mode 100755 index 00000000..e69de29b diff --git a/video.ofs.displayofs b/video.ofs.displayofs new file mode 100755 index 00000000..e69de29b -- 2.39.2