mvbg

VM_MEMSET

VM_MEMSET is a GBVM instruction used to fill a block of data (variables) with a specified value within the GBVM’s memory space.

Purpose: This instruction is the GBVM equivalent of the memset function in C/C++. It is highly useful for:

VM_MEMSET takes a starting memory address (DEST), a VALUE to fill with, and a COUNT of how many variables to fill.

Syntax:

VM_MEMSET DEST, VALUE, COUNT

Usage Example: Initializing an Inventory Array

Imagine you have an inventory system where VAR_INVENTORY_SLOT_0 through VAR_INVENTORY_SLOT_9 represent 10 inventory slots. When starting a new game, you want to clear all these slots by setting their values to 0 (representing empty).

; In your game initialization script:

; Inventory slot variables (must be contiguous in memory)
VAR_INVENTORY_SLOT_0:
  .R_INT8 0
VAR_INVENTORY_SLOT_1:
  .R_INT8 0
; ... up to VAR_INVENTORY_SLOT_9
VAR_INVENTORY_SLOT_9:
  .R_INT8 0

; Variable to hold the value to fill with (e.g., 0 for empty)
VAR_EMPTY_SLOT_VALUE:
  .R_INT8 0

; Clear all 10 inventory slots by setting them to 0
VM_MEMSET VAR_INVENTORY_SLOT_0, VAR_EMPTY_SLOT_VALUE, 10
; DEST: VAR_INVENTORY_SLOT_0 (start filling from here)
; VALUE: VAR_EMPTY_SLOT_VALUE (fill with the value 0)
; COUNT: 10 (fill 10 variables)

; Now all VAR_INVENTORY_SLOT_0 to VAR_INVENTORY_SLOT_9 will contain 0.

; You could also use a direct constant value if allowed by the GBVM version:
; VM_MEMSET VAR_INVENTORY_SLOT_0, 0, 10

; ... rest of game initialization ...

In this example, VM_MEMSET VAR_INVENTORY_SLOT_0, VAR_EMPTY_SLOT_VALUE, 10 efficiently sets the values of 10 contiguous inventory variables to 0. This is much more concise than setting each variable individually.

Important Note on Variable Contiguity: Similar to VM_MEMCPY, for VM_MEMSET to work correctly with COUNT > 1, the variables starting from DEST and extending for COUNT variables must be defined contiguously in your GBVM variable declaration section.

Analogy to other programming languages: This is directly analogous to memset() in C/C++: memset(&inventory_slot_0, 0, sizeof(uint8_t) * 10);

Or, in higher-level languages, initializing an array:

It’s about efficiently setting a block of memory to a uniform value.