[Scummvm-git-logs] scummvm master -> 23278f7f3b93fb693868dcf579591ade48528165
dreammaster
noreply at scummvm.org
Tue Dec 26 09:06:27 UTC 2023
This automated email contains information about 1 new commit which have been
pushed to the 'scummvm' repo located at https://github.com/scummvm/scummvm .
Summary:
23278f7f3b M4: Work around pointers > 4 bytes screwing up convs
Commit: 23278f7f3b93fb693868dcf579591ade48528165
https://github.com/scummvm/scummvm/commit/23278f7f3b93fb693868dcf579591ade48528165
Author: Paul Gilbert (dreammaster at scummvm.org)
Date: 2023-12-25T23:06:11-10:00
Commit Message:
M4: Work around pointers > 4 bytes screwing up convs
This solution adds an array of pointers into Conv,
and decl_chunk now has a 32-bit array index rather
than a pointer
Changed paths:
engines/m4/adv_r/conv.cpp
engines/m4/adv_r/conv.h
engines/m4/adv_r/conv_io.cpp
engines/m4/adv_r/conv_io.h
diff --git a/engines/m4/adv_r/conv.cpp b/engines/m4/adv_r/conv.cpp
index 5d5debd71f3..a0fd63fce14 100644
--- a/engines/m4/adv_r/conv.cpp
+++ b/engines/m4/adv_r/conv.cpp
@@ -78,18 +78,18 @@ static void conv_exec_entry(int32 offset, Conv *c) {
c_asgn = get_c_asgn(c, i);
decl = get_decl(c, c_asgn->c_op_l);
- l_op = conv_get_decl_val(decl);
+ l_op = conv_get_decl_val(c, decl);
if (conv_ops_cond_successful(l_op, c_asgn->c_op, c_asgn->c_op_r)) {
decl = get_decl(c, c_asgn->index);
- conv_set_decl_val(decl, conv_ops_process_asgn(conv_get_decl_val(decl), c_asgn->op, c_asgn->opnd1));
+ conv_set_decl_val(c, decl, conv_ops_process_asgn(conv_get_decl_val(c, decl), c_asgn->op, c_asgn->opnd1));
}
break;
case ASGN_CHUNK:
asgn = get_asgn(c, i);
decl = get_decl(c, asgn->index);
- conv_set_decl_val(decl, conv_ops_process_asgn(conv_get_decl_val(decl), asgn->op, asgn->opnd1));
+ conv_set_decl_val(c, decl, conv_ops_process_asgn(conv_get_decl_val(c, decl), asgn->op, asgn->opnd1));
break;
case HIDE_CHUNK:
@@ -105,7 +105,7 @@ static void conv_exec_entry(int32 offset, Conv *c) {
entry = get_hash_entry(c, c_misc->index);
decl = get_decl(c, c_misc->c_op_l);
- l_op = conv_get_decl_val(decl);
+ l_op = conv_get_decl_val(c, decl);
if (conv_ops_cond_successful(l_op, c_misc->c_op, c_misc->c_op_r)) {
if (!(entry->status & DESTROYED))
@@ -127,7 +127,7 @@ static void conv_exec_entry(int32 offset, Conv *c) {
entry = get_hash_entry(c, c_misc->index);
decl = get_decl(c, c_misc->c_op_l);
- l_op = conv_get_decl_val(decl);
+ l_op = conv_get_decl_val(c, decl);
if (conv_ops_cond_successful(l_op, c_misc->c_op, c_misc->c_op_r)) {
if (!(entry->status & DESTROYED)) {
@@ -148,7 +148,7 @@ static void conv_exec_entry(int32 offset, Conv *c) {
entry = get_hash_entry(c, c_misc->index);
decl = get_decl(c, c_misc->c_op_l);
- l_op = conv_get_decl_val(decl);
+ l_op = conv_get_decl_val(c, decl);
if (conv_ops_cond_successful(l_op, c_misc->c_op, c_misc->c_op_r))
entry->status |= DESTROYED;
@@ -158,7 +158,7 @@ static void conv_exec_entry(int32 offset, Conv *c) {
c_goto = get_c_goto(c, i);
decl = get_decl(c, c_goto->opnd1);
- l_op = conv_get_decl_val(decl);
+ l_op = conv_get_decl_val(c, decl);
r_op = c_goto->opnd2; //val
if (conv_ops_cond_successful(l_op, c_goto->op, r_op)) {
@@ -171,7 +171,7 @@ static void conv_exec_entry(int32 offset, Conv *c) {
c_goto = get_c_goto(c, i);
decl = get_decl(c, c_goto->opnd1);
- l_op = conv_get_decl_val(decl);
+ l_op = conv_get_decl_val(c, decl);
r_op = c_goto->opnd2; //val
if (conv_ops_cond_successful(l_op, c_goto->op, r_op)) {
@@ -325,7 +325,7 @@ static int conv_get_mesg(int32 offset, int32 is_valid, Conv *c) {
c_reply = get_c_reply(c, i);
decl = get_decl(c, c_reply->op_l);
- l_op = conv_get_decl_val(decl);
+ l_op = conv_get_decl_val(c, decl);
r_op = c_reply->op_r; //val
if (is_valid && conv_ops_cond_successful(l_op, c_reply->op, r_op)) {
diff --git a/engines/m4/adv_r/conv.h b/engines/m4/adv_r/conv.h
index cfffe1c9c39..0c82cf41bd7 100644
--- a/engines/m4/adv_r/conv.h
+++ b/engines/m4/adv_r/conv.h
@@ -23,6 +23,7 @@
#ifndef M4_ADV_R_CONV_H
#define M4_ADV_R_CONV_H
+#include "common/array.h"
#include "m4/m4_types.h"
namespace M4 {
@@ -84,14 +85,15 @@ namespace M4 {
struct Conv {
- int32 chunkSize;
- char *conv;
- int32 myCNode;
- int32 exit_now;
- int32 node_hash;
-
- int32 mode;
- int32 c_entry_num;
+ int32 chunkSize = 0;
+ char *conv = nullptr;
+ int32 myCNode = 0;
+ int32 exit_now = 0;
+ int32 node_hash = 0;
+
+ int32 mode = 0;
+ int32 c_entry_num = 0;
+ Common::Array<int32 *> _pointers;
};
struct ConvDisplayData {
@@ -115,7 +117,7 @@ struct decl_chunk {
int32 tag;
int32 val;
int32 flags;
- int32 *addr;
+ int32 addrIndex; // Index into Conv::_pointers array
} PACKED_STRUCT;
struct fall_chunk {
diff --git a/engines/m4/adv_r/conv_io.cpp b/engines/m4/adv_r/conv_io.cpp
index 8f5df9137cc..4c563c1c3fa 100644
--- a/engines/m4/adv_r/conv_io.cpp
+++ b/engines/m4/adv_r/conv_io.cpp
@@ -174,21 +174,21 @@ int conv_toggle_flags(entry_chunk *entry) {
return entry->status;
}
-int32 conv_get_decl_val(decl_chunk *decl) {
+int32 conv_get_decl_val(Conv *c, decl_chunk *decl) {
switch (decl->flags) {
case DECL_POINTER:
- return *decl->addr;
+ return *c->_pointers[decl->addrIndex];
default:
return decl->val;
}
}
-void conv_set_decl_val(decl_chunk *decl, int32 val) {
+void conv_set_decl_val(Conv *c, decl_chunk *decl, int32 val) {
switch (decl->flags) {
case DECL_POINTER:
decl->val = val;
- *decl->addr = val;
+ *c->_pointers[decl->addrIndex] = val;
break;
default:
@@ -217,7 +217,7 @@ void conv_export_value(Conv *c, int32 val, int index) {
case DECL_CHUNK:
if (i == index) {
decl = get_decl(c, ent);
- conv_set_decl_val(decl, val);
+ conv_set_decl_val(c, decl, val);
}
i++;
break;
@@ -254,7 +254,9 @@ void conv_export_pointer(Conv *c, int32 *val, int index) {
case DECL_CHUNK:
if (i == index) {
decl = get_decl(c, ent);
- decl->addr = val;
+
+ c->_pointers.push_back(val);
+ decl->addrIndex = c->_pointers.size() - 1;
decl->flags = DECL_POINTER;
}
i++;
@@ -476,15 +478,14 @@ static void conv_save_state(Conv *c) {
int32 val = 0;
entry_chunk *entry = nullptr;
- while (ent < c->chunkSize)
- {
+ while (ent < c->chunkSize) {
conv_ops_get_entry(ent, &next, &tag, c);
decl_chunk *decl; // declared here for the benefit of Watcom 10.0 not liking to scope things into switches
switch (tag) {
case DECL_CHUNK:
decl = get_decl(c, ent);
- val = conv_get_decl_val(decl);
+ val = conv_get_decl_val(c, decl);
memcpy(&conv_save_buff[offset], &val, sizeof(int32));
offset += sizeof(int32);
@@ -617,7 +618,7 @@ static Conv *conv_restore_state(Conv *c) {
offset += sizeof(int32);
decl = get_decl(c, ent);
- conv_set_decl_val(decl, val);
+ conv_set_decl_val(c, decl, val);
break;
default:
@@ -771,7 +772,7 @@ Conv *conv_load(const char *filename, int x1, int y1, int32 myTrigger, bool want
conv_unload();
}
- convers = (Conv *)mem_alloc(sizeof(Conv), "Conv struct");
+ convers = new Conv();
if (!convers) {
conv_set_handle(nullptr);
@@ -857,7 +858,7 @@ void conv_unload(Conv *c) {
if (c) {
if (c->conv)
mem_free(c->conv);
- mem_free(c);
+ delete c;
}
_GC(globConv) = c = nullptr;
diff --git a/engines/m4/adv_r/conv_io.h b/engines/m4/adv_r/conv_io.h
index e5e72dd96c4..c672dcd54cd 100644
--- a/engines/m4/adv_r/conv_io.h
+++ b/engines/m4/adv_r/conv_io.h
@@ -89,10 +89,6 @@ struct Converstation_Globals {
void syncGame(Common::Serializer &s);
void conv_reset_all();
- void conv_reset(const char *filename);
-
- void conv_play(Conv *c);
- void conv_go(Conv *c);
};
Conv *conv_load(const char *filename, int x1, int y1, int32 myTrigger, bool want_box = true);
@@ -117,8 +113,8 @@ const char *get_conv_name();
const char *conv_sound_to_play();
int32 conv_whos_talking();
-int32 conv_get_decl_val(decl_chunk *decl);
-void conv_set_decl_val(decl_chunk *decl, int32 val);
+int32 conv_get_decl_val(Conv *c, decl_chunk *decl);
+void conv_set_decl_val(Conv *c, decl_chunk *decl, int32 val);
void conv_export_value(Conv *c, int32 val, int index);
void conv_export_value_curr(int32 val, int index);
void conv_export_pointer(Conv *c, int32 *val, int index);
More information about the Scummvm-git-logs
mailing list