27#ifndef LIBWS_MEMORY_H_
28#define LIBWS_MEMORY_H_
43#define WS_IRAM_SEGMENT 0x0000
44#define WS_SRAM_SEGMENT 0x1000
45#define WS_ROM0_SEGMENT 0x2000
46#define WS_ROM1_SEGMENT 0x3000
55#define ws_iram __wf_iram
62#define ws_sram __wf_sram
71#define ws_rom __wf_rom
81#define ws_ptr_offset(x) ((uint16_t) (x))
86#define ws_ptr_segment(x) FP_SEG(x)
91#define ws_ptr_far(seg, ofs) MK_FP(seg, ofs)
97 return ((((uint32_t) src) >> 12) & 0xFFFF0) + ((uint16_t) ((uint32_t) src));
110#define WS_IRAM_MEM ((uint8_t ws_iram*) 0x00000000)
114#define WS_SRAM_MEM ((uint8_t ws_sram*) 0x10000000)
118#define WS_ROM0_MEM ((uint8_t __far*) 0x20000000)
122#define WS_ROM1_MEM ((uint8_t __far*) 0x30000000)
124#ifdef LIBWS_USE_EXTBANK
129 asm volatile(
"" :::
"memory");
130 volatile ws_bank_t old_bank = inportw(port);
131 outportw(port, new_bank);
132 asm volatile(
"" :::
"memory");
136static inline void _ws_bank_set(uint8_t port,
ws_bank_t new_bank) {
137 asm volatile(
"" :::
"memory");
138 outportw(port, new_bank);
139 asm volatile(
"" :::
"memory");
142#define _ws_bank_ram_port WS_CART_EXTBANK_RAM_PORT
143#define _ws_bank_rom0_port WS_CART_EXTBANK_ROM0_PORT
144#define _ws_bank_rom1_port WS_CART_EXTBANK_ROM1_PORT
145#define _ws_bank_roml_port WS_CART_EXTBANK_ROML_PORT
152 asm volatile(
"" :::
"memory");
153 volatile ws_bank_t old_bank = inportb(port);
154 outportb(port, new_bank);
155 asm volatile(
"" :::
"memory");
159static inline void _ws_bank_set(uint8_t port,
ws_bank_t new_bank) {
160 asm volatile(
"" :::
"memory");
161 outportb(port, new_bank);
162 asm volatile(
"" :::
"memory");
165#define _ws_bank_ram_port WS_CART_BANK_RAM_PORT
166#define _ws_bank_rom0_port WS_CART_BANK_ROM0_PORT
167#define _ws_bank_rom1_port WS_CART_BANK_ROM1_PORT
168#define _ws_bank_roml_port WS_CART_BANK_ROML_PORT
173#define ws_bank_within_(var, loc, prev_bank, ...) \
175 extern const void __bank_ ## var; \
176 __attribute__((cleanup(ws_bank_ ## loc ## _cleanup_))) \
177 ws_bank_t prev_bank = ws_bank_ ## loc ## _save((unsigned int) (&__bank_ ## var)); \
181#define ws_bank_with_(var, loc, prev_bank, ...) \
183 __attribute__((cleanup(ws_bank_ ## loc ## _cleanup_))) \
184 ws_bank_t prev_bank = ws_bank_ ## loc ## _save((unsigned int) var); \
195#define ws_bank_ram_save(new_bank) _ws_bank_save(_ws_bank_ram_port, (new_bank))
202#define ws_bank_ram_set(new_bank) _ws_bank_set(_ws_bank_ram_port, (new_bank))
203#define ws_bank_ram_restore ws_bank_ram_set
222#define ws_bank_within_ram(var, ...) ws_bank_within_(var, ram WF_MACRO_CONCAT(_wf_bank_, __COUNTER__), __VA_ARGS__)
237#define ws_bank_with_ram(bank, ...) ws_bank_with_(bank, ram, WF_MACRO_CONCAT(_wf_bank_, __COUNTER__), __VA_ARGS__)
245#define ws_bank_rom0_save(new_bank) _ws_bank_save(_ws_bank_rom0_port, (new_bank))
252#define ws_bank_rom0_set(new_bank) _ws_bank_set(_ws_bank_rom0_port, (new_bank))
253#define ws_bank_rom0_restore ws_bank_rom0_set
272#define ws_bank_within_rom0(var, ...) ws_bank_within_(var, rom0, WF_MACRO_CONCAT(_wf_bank_, __COUNTER__), __VA_ARGS__)
287#define ws_bank_with_rom0(bank, ...) ws_bank_with_(bank, rom0, WF_MACRO_CONCAT(_wf_bank_, __COUNTER__), __VA_ARGS__)
295#define ws_bank_rom1_save(new_bank) _ws_bank_save(_ws_bank_rom1_port, (new_bank))
302#define ws_bank_rom1_set(new_bank) _ws_bank_set(_ws_bank_rom1_port, (new_bank))
303#define ws_bank_rom1_restore ws_bank_rom1_set
322#define ws_bank_within_rom1(var, ...) ws_bank_within_(var, rom1, WF_MACRO_CONCAT(_wf_bank_, __COUNTER__), __VA_ARGS__)
337#define ws_bank_with_rom1(bank, ...) ws_bank_with_(bank, rom1, WF_MACRO_CONCAT(_wf_bank_, __COUNTER__), __VA_ARGS__)
345#define ws_bank_roml_save(new_bank) _ws_bank_save(_ws_bank_roml_port, (new_bank))
352#define ws_bank_roml_set(new_bank) _ws_bank_set(_ws_bank_roml_port, (new_bank))
353#define ws_bank_roml_restore ws_bank_roml_set
372#define ws_bank_within_roml(var, ...) ws_bank_within_(var, roml, WF_MACRO_CONCAT(_wf_bank_, __COUNTER__), __VA_ARGS__)
387#define ws_bank_with_roml(bank, ...) ws_bank_with_(bank, roml, WF_MACRO_CONCAT(_wf_bank_, __COUNTER__), __VA_ARGS__)
static const void ws_far * ws_ptr_from_linear(uint32_t src)
#define ws_bank_ram_restore
uint8_t ws_bank_t
Type indicating a bank index.
#define ws_bank_rom0_restore
static uint32_t ws_ptr_to_linear(const void ws_far *src)
#define ws_ptr_far(seg, ofs)
#define ws_bank_rom1_restore
#define ws_bank_roml_restore