# KULT (Atari ST, Exxos/ERE 1989) — mapa de nombres para Ghidra.
# Ghidra address = image offset + 0x10000.
# Formato:  fn <addr> <nombre>   |   var <addr> <nombre>   |   cmt <addr> <texto>
# Solo nombres con evidencia; el resto queda como FUN_xxxx.

# ==== entrada / crt0 ====
fn 0x10000 _start                    # Mshrink (trap#1), carga PRES.PI1, DRAP.PI1, seleccion de idioma D/E/F
fn 0x135e2 crt0_init                 # XBIOS physbase, instala vectores, guarda base de pantalla
fn 0x3a556 init_hardware             # XBIOS + BIOS + MFP: init de interrupciones/timers
fn 0x3a604 mfp_setup                 # escribe $FFFA13/$FFFA07/$FFFA19/$FFFA1F y vector $0134

# ==== E/S de ficheros ====
fn 0x1076a load_resource             # fopen+fread+fclose de DAT_0001a55a -> DAT_0001a55e (len DAT_0001a562)
fn 0x1077e save_clear_bin            # crea/escribe "A:CLEAR.BIN" (0x291c bytes)
fn 0x107a2 write_named_file          # fcreate+fwrite+fclose

# ==== pantalla ====
fn 0x10fec screen_address            # direccion planar de (x,y) sobre screen_ptr_a (d0<<2)
fn 0x10fee screen_address_raw        # idem sin lsl.w #2 (d0 ya escalado)
fn 0x10ff4 screen_offset             # cuerpo comun: suma el offset a A0; d7 = d0 & 0xf
fn 0x121c4 copy_screen_a6            # addq.l #1,a6 + copy_screen
fn 0x121c6 copy_screen               # copia 8000 longs (32000 B) DAT_0001a462 -> DAT_0001a45e
fn 0x121de swap_screens              # intercambia los dos buffers de pantalla
fn 0x13572 load_named_screen         # prepara buffer (len 0x7d22) y llama a load_resource
fn 0x135da set_palette               # xbios_setpalette

# ==== bucle principal + VM de comandos ====
fn 0x101be game_loop                 # do{ ... } while: update subsistemas + comando pendiente + repintado
fn 0x1031c handle_frame_input        # gestiona botones/hints y comandos pendientes por frame
fn 0x103a8 run_command               # despacha por (the_command & 0xf000); tabla en cmd_jump_table
fn 0x103ae run_command_keep_sp_a6    # variante C que devuelve el A6 final (tail-call 0x1592e)
fn 0x103ae run_command_keep_sp       # variante de run_command (equivalente a runCommandKeepSp de ScummVM)
fn 0x1042c draw_text_box             # calcula geometria de caja de texto y la dibuja
fn 0x10440 draw_text_box_variant     # idem (otra ruta de entrada)
fn 0x12292 prompt_wait               # espera tecla/click tras mostrar un mensaje
fn 0x13698 wait_frame                # sincronizacion de frame (VBL) + sondeo de input


# ==== subsistemas por frame ====
fn 0x17e3c script_step              # ctx: avanza PTR_DAT_0001a822 y compara codigos de script 0x38/0x0c/0x0a
fn 0x16556 draw_hint_icons          # ctx: itera 16 entradas (DAT_0001a776) llamando FUN_000124f8
fn 0x16582 update_icon_list         # ctx: recorre la lista DAT_0001a7ca..DAT_0001a7ce

# ==== texto / fuente ====
fn 0x10838 print_char                # font = &DAT_0001d202 + c*6; dibuja 6 filas rotando nibbles
fn 0x10f8e advance_text_entry        # avanza D4 entradas [word len] desde A1 y fija cur_str_end
fn 0x108a2 print_word                # bucle con flags 0x40/0x80/0xc0 (equivale a printWord de ScummVM)
fn 0x10fc4 position_text             # salta (D4-4) entradas [u8 len] desde A5 y fija cur_str_end

# ==== recursos embebidos (offset de imagen + 0x10000) ====

# ==== input / objetos ====
fn 0x14886 hit_test_objects          # recorre object_list (8 B/entrada) y fija the_command si acierta

# ==== blit de sprites (planar) ====
fn 0x124f8 blit_sprite               # ctx: escribe grupos de 4 bytes con mascara 0xf0f0f0f0 y rotacion (shift/flip)

# ==== sonido (YM2149 + timer MFP) ====
fn 0x1929a ym_write                  # escribe registro/dato en $FF8800/$FF8802 (reg 7 = mixer)
fn 0x18fc4 sound_timer_start         # MFP $FFFA13/07/19/1F + vector $134; arranca reproduccion
fn 0x19084 sound_timer_stop          # limpia los registros MFP del timer de sonido

# ==== carga de salas ====
fn 0x13568 load_fond                 # carga FOND.PI1 (fondo de sala) en screen_ptr_b
fn 0x106f8 load_resource_list        # ctx: recorre entradas terminadas en '$' y llama load_resource
fn 0x1682a reset_clear               # ctx: bucle A:CLEAR.BIN + the_command=0x918e

# ==== F4: nucleos C verificados byte a byte (harness diferencial) ====
# Los nombres del prefijo `g_` viven en projects/kult/recreate/src/.
fn 0x16300 xbios_setpalette          # XBIOS Setpalette(*(0x1a466))
fn 0x14138 run_text_entry            # lee entrada de script A6, calcula pantalla y blitea texto
fn 0x11050 text_blit_fwd             # blit de texto directo (A0/A1/A3/D2/D3/D7)
fn 0x11102 text_blit_rev             # idem con palabra invertida por FUN_00011196
fn 0x11196 bit_reverse_word          # permutacion de palabra (resultado en D0/D1)
fn 0x13f56 run_text_table            # fija 0x1a49e, walk_entry(ARPLA) y recorre FUN_00014138
fn 0x13f4c text_table_entry          # D0=0, D1=A6[1] -> FUN_00013f56
fn 0x141ea run_text_entry_1          # FUN_00014138 sobre A6+1
fn 0x162e2 set_palette_entry         # copia 5 words indexados + Setpalette
fn 0x162da set_palette_current       # idem con indice de 0x1acf4
fn 0x162ce set_palette_from_entry    # idem con indice de A6[1]
fn 0x162d8 set_palette_advance       # addq.l #1,a6 + set_palette_current
fn 0x11014 noop_11014                # `rts` (stub sin efecto)
fn 0x106e2 load_resource_list_a      # A5=0x1a3aa -> load_resource_list
fn 0x106ea load_resource_list_b      # A5=0x1a3e4 -> load_resource_list
fn 0x106f2 load_resource_list_c      # A5=0x1a2c8 -> load_resource_list (lista C)

# ==== fichas por subsistema (docs/mapa/, 2026-09-15) ====
# --- bucle / pacing ---
fn 0x13594 wait_vbl                  # espera a que cambie el contador de VBL $1acd4 (38 llamantes)
fn 0x16d1e wait_vbl_even             # VBL + contador par (paso de los wipes de texto)
fn 0x10522 wait_frame_cursor         # wait_frame + dibujo del cursor (cola del bucle)

# --- input / cursor ---
fn 0x10526 cursor_draw               # guarda 16x16 bajo el cursor y pinta el sprite
fn 0x1060a cursor_restore            # restaura el area guardada por 0x10526
fn 0x13686 ikbd_packet_copy          # copia 5 bytes del paquete IKBD a $1a44f (Kbdvbase+0x10)

# --- salas / modo de escena ---
fn 0x14496 scene_mode_load           # camina 0x1ad38 y publica cabecera/objetos del modo
fn 0x1443e scene_mode_set            # fija A_MODE_FLAG + marcador 0x1a695 y carga el modo
fn 0x14588 command_state_reset       # reinicia globals de comando (0xa01c/0xf7/0x9048/...)
fn 0x1460a scene_mode_apply          # procesa el modo tras input (formulario, objeto, overlays)
fn 0x146d0 scene_mode_draw           # cuerpo: cursores, transicion, formulario, iconos
fn 0x1842c prepare_room              # prepara sala: fondos, reveal, FOND.PI1, paleta, CLEAR
fn 0x16ed8 load_scena                # carga SCENA.BIN (hints + 2 x 32000 B)
fn 0x16fb4 save_scena                # guarda SCENA.BIN (inverso de 0x16ed8)
fn 0x16f90 hint_table_relocate       # suma 0x101a8 a los punteros de la tabla de hints
fn 0x10682 load_eche_bank            # fija el digito ECHE<n>.BIN y recarga su lista
fn 0x1066e load_eche_bank_wrap       # 0x10682 con d1 = 0x64c8e
fn 0x10668 load_eche_bank_cmd        # d0 = a6[1]; 0x1066e; A6 += 2

# --- texto / UI ---
fn 0x10e66 text_box_body             # marco + palabras + borde inferior de la caja de texto
fn 0x10b6c text_window               # ventana de texto con adorno/flecha (bits 0xe0)
fn 0x1090e print_words_fit           # imprime desde A5 las palabras que caben en la linea
fn 0x10946 measure_word              # mide una palabra del banco de texto
fn 0x10998 measure_words             # cuenta palabras y ancho maximo hasta cur_str_end
fn 0x109bc wrap_line                 # word-wrap greedy al ancho de A_TEXT_BOX_W
fn 0x10aee print_line_center         # centra la linea de A5 y la imprime
fn 0x10b24 print_line                # mide/crece el ancho, imprime y rellena con espacios
fn 0x10b46 print_spaces              # imprime D6+1 espacios
fn 0x10fb4 text_index_arg            # position_text tomando el indice de A6[1] si D4 < 4
fn 0x109fe overlay_a_draw            # dibuja el overlay de texto A (banco 0x41b76)
fn 0x10a54 overlay_a_frame           # marco del overlay de texto A
fn 0x10a88 overlay_b_draw            # dibuja el overlay de texto B (banco 0x41586)
fn 0x10acc overlay_b_frame           # marco del overlay de texto B
fn 0x142cc textform_build            # prepara la lista de 3 blits del formulario
fn 0x143e2 textform_draw             # dibuja la lista con VBL por linea
fn 0x141f4 textform_fwd_entry        # entrada: 0x141fa con D0 = A6[1]
fn 0x141fa textform_fwd              # revelado hacia delante con sample 0x1d
fn 0x14246 textform_rev_entry        # entrada: 0x1424c con D0 = A6[1]
fn 0x1424c textform_rev              # revelado hacia atras con sample 0x1e
fn 0x13f86 scene_text_box            # caja/overlay autodimensionado de la escena

# --- animacion / frames ---
fn 0x15a90 anim_bank_select          # elige banco de sprites (0xd8f0 + bits 7/6)
fn 0x15d7e anim_restore              # restaura la zona bajo el elemento (0x1215e)
fn 0x15cd8 anim_counter              # ajusta contador de pasos/recorte del elemento
fn 0x15abe anim_bank_build           # construye el banco desde 0x27fe2/0x28ad2 por bloques
fn 0x15f6c script_arg                # lee un argumento del script (directo/indirecto/texto)
fn 0x15fd4 script_alu                # ALU/comparacion de palabras de D6/D0 segun D7
fn 0x1606e script_expr               # evalua una expresion del script
fn 0x16088 script_store              # guarda word/byte en la direccion evaluada
fn 0x160aa script_jump_zero          # salta a plantilla (0x1350c) o avanza 2 si D6 != 0
fn 0x12e2e reveal_region             # reveal por puntos de un rect (paso $1a577)
fn 0x12ef6 reveal_dot                # pinta un punto del reveal (mascara D4 rotada por D7)
fn 0x12f28 reveal_pixel              # reveal pixelado del elemento (dbf 0x64 / skip $1a570)

# --- overlay del juego ---
fn 0x1215e mask_restore_rows         # restaura D3 filas desde A0-0x8000 con mascara
fn 0x12ce4 view_mode_cycle           # ciclo de modo/vista $1acca (overlays del retrato)
fn 0x18d28 draw_selection_frame      # marco del objeto/hint seleccionado (0x1a81e)
fn 0x16dec object_info_card          # ficha/descripcion de objeto (tabla 0x246e6)
fn 0x189aa object_info_wait          # ficha interactiva: 0x16dec hasta clic (bit 2)
fn 0x185e6 track_name_print          # nombre de pista/seccion (banco 0x3c534) + espera
fn 0x14966 action_bar_hit_test       # hit-test de 0x1a6ae -> the_command + overlay B

# ==== escalado C: cursor / input / estado / stubs ====
fn 0x135e0 noop_135e0                # `rts` (stub sin efecto)
fn 0x160c0 noop_160c0                # `rts` (stub sin efecto)
fn 0x16dba noop_16dba                # `rts` (stub sin efecto)
fn 0x19312 noop_19312                # `rts` (stub sin efecto; FDC fuera de alcance)
fn 0x172ba clear_flag                # limpia el byte indirecto *(0x1a806) y la word 0x1acaa
fn 0x15192 clear_object_flags        # limpia bit7 del byte1 de 41 entradas de 0x1aa72 + 0x1acd3
fn 0x14a98 set_cursor_clip           # clip $19700/$19702 y sprite de cursor desde tablas por D0
fn 0x14bdc fix_sample_flag           # cambia 0x81 -> 0x80 en las 0x3f entradas de 0x1a8f0

# ==== dibujo de la caja de texto (runs de pixeles, boxdraw.c) ====
fn 0x12ffa box_hline                 # corre horizontal D3+1 px en (D0,D1) color D2 (base 0)
fn 0x13216 box_vline                 # corre vertical (a0 += 0xa0 por px; base 0)
fn 0x130a4 box_hline_copy            # copia el run horizontal de screen_ptr_b a screen_ptr_a
fn 0x13162 box_vline_copy            # idem vertical
fn 0x12fee box_hline_back            # box_hline con draw base fijo 0x8000
fn 0x1320a box_vline_back            # box_vline con draw base fijo 0x8000

# ==== revelado por linea / caja (line.c) ====
fn 0x13d0e reveal_line               # trazo Bresenham trasero->delantero (mascara 0x80808080 rotada)
fn 0x13e14 reveal_lines_h            # dos tandas de trazos + VBL (x0/x1 y luego y0/y1)
fn 0x13eae reveal_lines_v            # tres tandas de trazos + VBL (alto, ancho<<2, 0x1a52c)

# ==== blit de filas enmascarado + tabla de hints (maskblit.c) ====
fn 0x12698 blit_mask_setup           # precalcula mascaras de borde (0x1a538/0x1a53a/0x1a53c)
fn 0x123c0 blit_mask_row             # blitea una fila enmascarada de A1 a A0
fn 0x12466 blit_mask_rows            # D3 filas desde 0x1a534 con mascaras + VBL
fn 0x120a8 hint_slot_alloc           # busca hueco en 0x1a850 y guarda el registro del icono
fn 0x120dc hint_select_on            # selecciona el icono d0-esimo (D1=2)
fn 0x120e4 hint_select_off           # selecciona el icono d0-esimo (D1=0)
fn 0x1213a hint_find                 # busca el word d0 en 0x1a850 y lo desactiva; d5=0/1
fn 0x1222e hint_blit_entry           # selecciona el icono A6[1] y lo blitea; A6 += 2
fn 0x1232e hint_blit_stroke          # blitea los iconos 1 y un trazo 2x15
fn 0x12368 hint_blit_2               # blitea los iconos 2
fn 0x12384 hint_blit_3               # blitea los iconos 3

# ==== blitter de sprites y save/restore de rect (sprite.c) ====
fn 0x12590 save_rect_body            # empaqueta un rect de pantalla en un descriptor (A1)
fn 0x1258a save_rect                 # save_rect_body con A1 = 0xd8f0; devuelve A4 (fin)
fn 0x124f2 restore_rect              # blit_sprite desde el descriptor 0xd8f0
fn 0x12510 blit_rect                 # bucle del blit de sprite (A0/A1/D2/D3/D7/A3)
fn 0x124da blit_rect_vbl             # blit_rect con stride 0x1a534 + espera de VBL
fn 0x123a0 copy_scratch_rows         # copia filas de 0xd8f0 a A0 (stride 0xa0)

# ==== blitters de planos de overlay (overlay.c) ====
fn 0x111b6 overlay_compose_planes    # compone 1..4 planos de A1 en 0xd8f0 (shift D0/D1) + VBL
fn 0x111ac overlay_compose_planes_wrap # 0x111b6 con D3-=1, D2=5, D1=(D1<<2)-1
fn 0x114ba overlay_compose_planes32  # variante 32 bits (acarreo en D6)
fn 0x114b0 overlay_compose_planes32_wrap # 0x114ba con D3-=1, D2=5, D1=(D1<<2)-1
fn 0x117fe overlay_compose_masked    # dos fuentes (A0 mascara, A1 dato) con ror32(0x80000000,D0)
fn 0x117de overlay_compose_masked_wrap # 0x117fe con 0x1a53e=1
fn 0x11afa overlay_compose_shift     # variante roxl (flag 0x1a53e)
fn 0x11ada overlay_compose_shift_wrap # 0x11afa con 0x1a53e=1

# ==== globales (direcciones de datos, base de carga 0x10000) ====
# ---- screen buffers (crt0_init @ 0x135e2) ----
var 0x1a45e screen_ptr_a    # buffer de pantalla A
var 0x1a462 screen_ptr_b    # buffer de pantalla B
# ---- input / cursor (wait_frame @ 0x13698) ----
var 0x1a456 input_buttons    # bitmask de botones/teclas (bit2 = click/fuego)
var 0x1a450 cursor_x    # cursor x (pixeles)
var 0x1a452 cursor_y    # cursor y
# ---- text bank cursor (FUN_00010f8e @ 0x10f8e) ----
var 0x1a4dc cur_str_end    # fin de la cadena en curso
# ---- text rendering (print_char @ 0x10838) ----
var 0x1a50a cursor_text_x    # text cursor x (columns)
var 0x1a50c cursor_text_y    # text cursor y (rows)
var 0x1a46a screen_draw_base    # logical-vs-draw buffer offset subtracted by print_char
var 0x1a4d8 color_table    # pointer to the font colour-expansion table
var 0x1d202 font_data    # CARAC.BIN (fuente)
var 0x1a508 text_end_flag    # set to 0xff when print_word reaches cur_str_end
var 0x1a512 text_box_w    # text-box width (columns) measured by 0x10998
var 0x1a514 text_box_h    # text-box height (rows) computed by the 0x9000 handler
var 0x1a52e text_box_span    # box frame width in pixels (set by 0x10e66)
var 0x1a530 text_box_y    # box top-left row in text cells
var 0x1a532 text_box_x    # box top-left column in text cells
# ---- overlay de texto (0x109fe / 0x10a88, modo alternativo del cursor) ----
var 0x1acc6 mode_flag    # == 0x87 desactiva el overlay de texto
var 0x1aa6a overlay_x    # posición X del overlay de texto
var 0x1aa6c overlay_y    # posición Y del overlay de texto
var 0x1a513 text_row    # fila/altura del overlay
var 0x1ab45 text_sel_a    # selector de entrada del overlay A (0x41b76)
var 0x1ab46 text_sel_b    # selector de entrada del overlay B (0x41586)
var 0x1ab49 text_col    # ancho del overlay
# ---- video / palette (set_palette @ 0x135da -> 0x16300) ----
var 0x1a466 palette_ptr    # pointer to the 16-word colour table (XBIOS Setpalette arg)
# ---- sprite blitter (blit_sprite @ 0x124f8) ----
var 0x55b02 blit_scratch    # 4-byte nibble-expansion scratch buffer (image-visible)
var 0xd8f0 save_desc    # screen save/restore descriptor (save @ 0x1258a, blit @ 0x124f2)
# ---- resource loader (load_resource @ 0x1076a) ----
var 0x1a55a cur_filename    # nombre del fichero a cargar en load_resource
var 0x1a55e load_buffer    # destino de load_resource
var 0x1a562 load_length    # longitud para load_resource
var 0x1a47e file_handle    # last GEMDOS file handle (word)
var 0x1a482 text_index    # text index stored by position_text (0x10fc4)
# ---- cursor save/restore (FUN_0001060a @ 0x1060a, FUN_00010526 @ 0x10526) ----
var 0x19ace cursor_save_dest    # dest pointer for the 16x16 restore
var 0x199ce cursor_save_buf    # 16 rows x 16 bytes saved buffer
var 0x199ca cursor_sprite_ptr    # pointer to the 16x16 cursor sprite
var 0x19700 clip_x    # screen origin x (cursor coords are relative)
var 0x19702 clip_y    # screen origin y
var 0x1a48a cursor_hotspot    # nonzero enables the 4th word of the cursor
var 0x1a44f ikbd_packet    # 5-byte IKBD packet copied by the handler
var 0x1a570 skip_transition    # 0xff en wait_frame cuando el paquete pide botón
var 0x1a752 clear_buf    # source buffer written to A:CLEAR.BIN
var 0x1a439 clear_name    # "A:CLEAR.BIN" string
# ---- FUN_000172ba: limpiar flag indirecto ----
var 0x1a806 ptr_1a806    # puntero a un byte que se pone a 0
var 0x1acaa w_1acaa    # word que se pone a 0
# ---- script-VM text entry (FUN_00014138 @ 0x14138) ----
var 0x41fb0 text_table    # tabla de entradas de texto (imagen 0x31fb0)
var 0x1a49e dat_1a49e    # bit-LSB consumido por el efecto 'S'
var 0x1a534 dat_1a534    # stride de fila del blit de texto
var 0x1a4b2 dat_1a4b2    # fin de la lista de entradas de 3 bytes
var 0x1a10a pal_table    # tabla de paletas (5 words por entrada)
var 0x1acf4 pal_index_cur    # indice de paleta actual (byte)
# ---- masked row blitter (FUN_00012698 @ 0x12698, FUN_000123c0 @ 0x123c0) ----
var 0x1a538 blit_mask_first    # mascara de la primera palabra (calculada por 0x12698)
var 0x1a53a blit_mask_last    # mascara de la ultima palabra
var 0x1a53c blit_groups    # numero de grupos de 4 palabras del blit
var 0xd8ea blit_d8ea    # byte de TOS comparado con 0x41 por FUN_0001215e
var 0x1d402 TEMPL_data    # TEMPL.BIN (plantillas de script)
# ---- interprete de animacion (FUN_000159d2 @ 0x159d2) ----
var 0x23ee8 anim_table    # tabla de entradas de animacion (imagen 0x13ee8)
var 0x1a4b6 anim_end    # puntero (long) al fin de la entrada actual
var 0x1a472 anim_1a472    # word: A6[2] (parametro d0 del script)
var 0x1a474 anim_1a474    # word: A6[3] (parametro d2 del script)
var 0x1a476 anim_1a476    # word: se pone a 0
var 0x1a478 anim_1a478    # word: se pone a 0
var 0x1a47a anim_1a47a    # word: sign-ext de A6[1] del opcode 0xfe
var 0x1a47c anim_1a47c    # word: sign-ext de A6[2] del opcode 0xfe
# ---- despacho de comandos (run_command_keep_sp @ 0x103ae, FUN_00010630 @ 0x10630) ----
var 0x1a50e the_command    # opcode/command actual
var 0x1a4e0 templ_ptr    # puntero actual dentro de TEMPL
var 0x1a7d6 call_stack    # pila de llamadas de script (0x13522/0x13552)
var 0x1a826 run_stack    # A7 guardado por run_command (0x103a8)
# ---- reveal pixelado (FUN_00012e2e @ 0x12e2e, FUN_00012ef6 @ 0x12ef6) ----
var 0x1a532 rev_x0    # word: d0 (x) << 2
var 0x1a530 rev_y0    # word: d1 (y)
var 0x1a52e rev_w    # word: d2 (ancho) << 2
var 0x1a49c rev_total    # word: d2 * d3 (total de pixels)
# ---- motor de sprites de animacion (handlers de 0x159d2, engine 0x15bde) ----
var 0x1a4c6 anim_spr_ptr    # puntero al sprite/descriptor activo (lo fija 0x15a90)
var 0x27fe2 anim_tbl_27fe2    # tabla de entradas (walk_entry) del handler 0x15abe
var 0x28ad2 anim_tbl_28ad2    # tabla de bitmaps indexada por 0x10f8e (handler 0x15abe)
var 0x1a574 anim_1a574    # byte de flags del elemento (bits 0..2 significativos)
var 0x1a46e anim_1a46e    # word: contador de pasos del elemento
var 0x1a470 anim_1a470    # word: ancho (A6[1] & 0xfff8 >> 2)
var 0x1a577 anim_1a577    # byte: A6[1] & 0x7f >> 1 (ancho/2)
var 0x1a56a anim_1a56a    # word: 0x1f4 (retardo)
var 0x1a578 anim_1a578    # byte: flag "primer frame"
var 0x1a4a0 anim_1a4a0    # word: filas del blit de 0x15da6
var 0x3b1ac anim_backup    # buffer de respaldo de 0x15da6
# ---- seleccion de objeto bajo el cursor (FUN_00018d28 @ 0x18d28) ----
var 0x1a81a selected_object    # entrada de objeto bajo el cursor
var 0x1a81e selected_icon_ptr    # puntero al icono/hint seleccionado
var 0x1a7d2 sel_1a7d2    # long: objeto seleccionado
var 0x1ab4a sel_1ab4a    # byte: copia de 0x1acc9 - 1
var 0x1acc9 sel_1acc9    # byte origen del contador
# ---- lista de objetos y busqueda por clase (0x1778e/0x177bc, 0x166da/0x166ec) ----
var 0x1a7ca object_list_begin    # inicio de la lista de objetos/spots
var 0x1a7ce object_list_end    # fin de la lista
var 0x1aa72 obj_tbl    # tabla de clases (byte/entrada)
var 0x1a776 command_hints_list    # lista de 16 hints/comandos
var 0x1ab48 1ab48    # byte: selector A por defecto
var 0x1ad0f cur_class    # byte: clase del objeto bajo el cursor
var 0x1ace6 class_idx    # byte: indice de clase en 0x1aa72
var 0x1acd9 hit_mask    # byte: mascara de hit-test
var 0x1acda hit_value    # byte: valor de hit-test
var 0x1ace9 dat_1ace9    # byte: indice de la entrada del overlay (0x14966)
var 0x1a75e dat_1a75e    # long: puntero a la entrada 6 B de 0x1a8f0 (0x14966)
var 0x1a6ae tbl_1a6ae    # tabla de rects/acciones de 10 B (0x14966)
var 0x1a74e dat_1a74e    # byte: mascara de hit-test guardada (0x167be/0x122ee)
var 0x1a74f dat_1a74f    # byte: valor de hit-test guardado (0x167be)
var 0x1ad20 dat_1ad20    # byte: contador del umbral de la animacion (0x14f24)
var 0x1acec dat_1acec    # byte: fase/estado de la musica
var 0x1acfd dat_1acfd    # byte: sub-estado
var 0x1ad14 dat_1ad14    # byte: flag de transicion
var 0x1ac06 dat_1ac06    # word: comando pendiente
# ---- bucle principal (game_loop @ 0x101be) ----
var 0x1acf2 dat_1acf2    # byte: umbral de comandos por frame
var 0x1ace7 dat_1ace7    # byte: comandos ejecutados
var 0x1abf8 dat_1abf8    # word: comando pendiente de objeto
var 0x1ad0b dat_1ad0b    # byte: pausa del bucle
var 0x1acac dat_1acac    # word: temporizador A
var 0x1acaa dat_1acaa    # word: comando temporizador A
var 0x1acb0 dat_1acb0    # word: temporizador B
var 0x1acae dat_1acae    # word: comando temporizador B
var 0x1acd3 dat_1acd3    # byte: flag de accion de objeto
var 0x1ace8 dat_1ace8    # byte: contador de accion de objeto
var 0x1ad0d dat_1ad0d    # byte: flag de carga/guardado de sala en curso
var 0x1a750 dat_1a750    # byte: estado de la carga/guardado de sala
var 0x1ad1d dat_1ad1d    # byte: flag de animacion de script (0x188ce)
var 0x1aaf9 dat_1aaf9    # byte: comparado con $1acd2 en 0x188ce
var 0x1ab08 dat_1ab08    # byte: habilita la segunda animacion de 0x188ce
var 0x1ad00 dat_1ad00    # byte: indice rotatorio de 0x17480 (+5, tope 0x18)
var 0x1a572 dat_1a572    # byte: flag de formulario/transicion de 0x1460a
var 0x1ad0f dat_1ad0f    # byte: flags de entrada de 0x1460a (bit3 = formulario)
var 0x1acc8 dat_1acc8    # byte: indice de objeto guardado por 0x1460a
var 0x1acfe dat_1acfe    # byte: copia de $1acd2 guardada por 0x1460a
var 0x1ad25 dat_1ad25    # byte: indice de tabla de texto pendiente (0x1460a)
var 0x1acd8 dat_1acd8    # byte: flag puesto por 0x1682a tras cargar CLEAR.BIN
var 0x1ad2c dat_1ad2c    # byte: contador de entradas de sample (0x18538)
var 0x1a4d2 dat_1a4d2    # word: flag de fin del juego
# ---- script_step (0x17e3c): punteros de guion y estado de overlay ----
var 0x1a822 script_ptr    # long: puntero al byte actual del guion
var 0x1aae0 ovl_entry    # base de la entrada de overlay [0..3]
var 0x1aab3 1aab3    # byte: caracter actual
var 0x1aab4 1aab4    # byte: flags de entrada
var 0x1aab6 1aab6    # byte: atributo
var 0x1aae1 1aae1    # byte: flags (bit5/bit6)
var 0x1aad6 1aad6    # byte: eco del caracter
var 0x1aadb 1aadb    # byte: eco del caracter
var 0x1ad05 dat_1ad05    # byte: comando actual del guion
var 0x1ad06 dat_1ad06    # byte: siguiente comando
var 0x1ad07 dat_1ad07    # byte: flag de dos bytes
var 0x1acf6 dat_1acf6    # byte: flags de modo
var 0x1acf7 dat_1acf7    # byte: flag de fin de secuencia
var 0x1acb2 dat_1acb2    # word: proximo umbral del guion
# ---- comando de elemento / icono (FUN_000128a4, 0x1285a, 0x1296c, 0x129c8) ----
var 0x1a772 elem_class    # puntero al descriptor; [3]&0xf8 es la clase buscada
var 0x19e19 elem_tbl_19e19    # tabla de 6 bytes por clase (0x19e19..0x19ea9)
var 0x19ea9 elem_tbl_19ea9    # fin de la tabla anterior
var 0x1ab4c elem_1ab4c    # byte copiado de la entrada encontrada
var 0x1ab4d elem_1ab4d    # byte copiado de la entrada encontrada
var 0x1a252 elem_tbl_1a252    # tabla de patrones de 10 bytes (0x1296c)
var 0x3b1ae elem_build    # bitmap construido por 0x1296c
var 0x1a528 elem_1a528    # puntero guardado por 0x128a4
var 0x1a52c elem_1a52c    # byte (alto) leido de 0x3b1ae
var 0x1a52e elem_1a52e    # byte (ancho) leido de 0x3b1af
var 0x1ab4e elem_1ab4e    # byte: clase del elemento
var 0x1a532 elem_1a532    # word: x del elemento
var 0x1a530 elem_1a530    # word: y del elemento
var 0x2751e elem_tbl_2751e    # lista de entradas de elemento recorrida por 0x129c8
var 0x31072 elem_tbl_31072    # tabla de texto referida por 0x129c8
var 0x1ad0a dat_1ad0a    # copia de 0x1a851 usada por 0x128a4/0x120a8
var 0x23e9c elem_tbl_23e9c    # lista de elementos de 0x12a4a (walk_entry)
var 0x3b1ac elem_build2    # bitmap construido/leido por 0x12a4a
var 0x1a484 dat_1a484    # word limpiada por 0x121fa
# ---- save enmascarado (FUN_000127fa) ----
var 0x1a4a2 save_1a4a2    # word: mascara de la ultima palabra
var 0x1a4a4 save_1a4a4    # word: filas del save
# ---- handlers de revelado por caja (FUN_00012ea2/12e08) ----
var 0x1ab40 dat_1ab40    # byte: x0 de la caja
var 0x1ab41 dat_1ab41    # byte: x1 de la caja
var 0x1ab42 dat_1ab42    # byte: y0 de la caja
var 0x1ab43 dat_1ab43    # byte: y1 de la caja
# ---- input por frame / seleccion por cursor (0x1031c, 0x1478a/14798/147ce) ----
var 0x1ab4f frame_1ab4f    # byte: si != 0 espera con el cursor bajo
var 0x1ab44 1ab44    # byte: selector A pintado (0x1ab45 eco)
var 0x1ab47 1ab47    # byte: selector B pintado (0x1ab46 eco)
var 0x1a48a 1ab48a    # byte: flag de hotspot del cursor
# ---- fila/paleta helpers (FUN_000159bc, FUN_00016210/230/27a) ----
var 0x1a579 dat_1a579    # indice incremental de la tabla 0x2741e
var 0x1acd7 dat_1acd7    # byte leido de la tabla 0x2741e por 0x16210
var 0x2741e tbl_2741e    # tabla de bytes indexada por 0x1a579
var 0x1ab60 dat_1ab60    # contador comparado en FUN_0001627a
var 0x1a526 dat_1a526    # marca del ultimo umbral de FUN_0001627a
var 0x1a8f0 list_1a8f0    # lista de entradas de 6 bytes (0x1627a, 0x178cc)
var 0x1acd2 dat_1acd2    # byte comparado con el campo 1 de cada entrada
var 0x1acd4 dat_1acd4    # contador de VBL (lo incrementa el handler de VBL)
# ---- modo de escena / lista de objetos (0x1442c/0x1443e/0x14496/0x14588) ----
var 0x1acc7 dat_1acc7    # byte: valor de modo que 0x1442c salva y restaura
var 0x1accb dat_1accb    # byte: copia del modo anterior (0x1443e)
var 0x1ad32 dat_1ad32    # byte: si != 0 fuerza el marcador 0xe5 en 0x1a695
var 0x1a695 dat_1a695    # buffer de 8 bytes del marcador de modo (0x1443e)
var 0x1ad38 mode_table    # tabla de entradas [len][datos] indexada por 0x1acc6 (1-based)
var 0x1ab4b dat_1ab4b    # byte: nº de objetos empaquetados de la entrada de modo
var 0x1ab62 dat_1ab62    # tabla de 5 words por objeto (0x14496)
var 0x1a762 dat_1a762    # long: copia de object_list_begin
var 0x1aceb dat_1aceb    # byte: contador de objetos (lo limpia 0x14496)
var 0x1abfa dat_1abfa    # word: comando de 0x163a8 (lo limpia 0x14588)
var 0x1ab5c dat_1ab5c    # word: comando 0xa01c (0x14588)
var 0x1ab5e dat_1ab5e    # word: 0 (0x14588)
var 0x1ab56 dat_1ab56    # word: 0xf7 (0x14588)
var 0x1ab50 dat_1ab50    # word: 0x9048 (0x14588)
var 0x1ab52 dat_1ab52    # word: 0xa01d (0x14588)
var 0x1ab54 dat_1ab54    # word: 0 (0x14588)
var 0x1ab58 dat_1ab58    # word: 0x9048 (0x14588)
var 0x1ab5a dat_1ab5a    # word: 0x9048 (0x14588)
var 0x1ad09 dat_1ad09    # byte: lo limpia 0x14588
var 0x1ad11 dat_1ad11    # byte: lo limpia 0x14588
var 0x1ad27 dat_1ad27    # byte: lo limpia 0x14588
var 0x1acd1 dat_1acd1    # byte: lo limpia 0x14588
var 0x1acf9 dat_1acf9    # byte: lo limpia 0x14588
var 0x1acfa dat_1acfa    # byte: lo limpia 0x14588
var 0x1acce dat_1acce    # byte: lo limpia 0x14588
var 0x1acff dat_1acff    # byte: lo limpia 0x14588
var 0x1acfc dat_1acfc    # byte: flags de objeto (bit7) y fin de secuencia
var 0x1acf1 dat_1acf1    # byte: indice de color de la tabla de texto (0x13f2a)
var 0xd8eb dat_d8eb    # byte: 0x52 permite a 0x14496 salir del reintento
# ---- otros globales con nombre ----
var 0x19eca cmd_jump_table    # tabla de punteros a manejadores de comando (indexada por opcode&0x3ff)
var 0x192c2 sound_sample_ptr    # puntero/estado del sample en curso
var 0x134 sound_timer_vector    # vector de interrupcion del timer B (sonido)


# ==== importados del C viejo (func_XXXX + alias) ====
fn 0x128a4 elem_command
fn 0x128a4 elem_command_ex
fn 0x14138 run_text_entry_ex
fn 0x12950 walk_entry
fn 0x10390 dispatch_a6
fn 0x104f4 inline_cmd_walk
fn 0x10630 vm_run
fn 0x10768 text_end
fn 0x10b52 text_window_entry
fn 0x10dfa text_box_icon
fn 0x11016 text_blit_ovl_a
fn 0x11020 text_blit_ovl_b
fn 0x11026 text_blit_entry
fn 0x11030 text_blit_body_a
fn 0x1103e text_blit_setup
fn 0x1104a text_blit_fwd_a3
fn 0x110da text_blit_rev_entry
fn 0x11dee scroll_up
fn 0x11e5e scroll_down
fn 0x11ece row_blit_a
fn 0x11ee8 row_blit_b
fn 0x11f02 blit_dispatch_a
fn 0x11f2e blit_dispatch_b
fn 0x11f64 overlay_dispatch_1
fn 0x11f98 overlay_dispatch_2
fn 0x11fd8 overlay_dispatch_3
fn 0x1200a overlay_dispatch_4
fn 0x12044 overlay_dispatch_5
fn 0x12076 overlay_dispatch_6
fn 0x12190 mask_row_blit
fn 0x121b6 copy_screen_rev
fn 0x121fa icon_blit_handler
fn 0x12240 wait_button_a
fn 0x1224e wait_button_b
fn 0x1228a prompt_wait_entry
fn 0x122ee prompt
fn 0x12324 gemdos_cnecin
fn 0x12436 mask_rows_handler
fn 0x126e0 grid_fill
fn 0x1276c pattern_fill
fn 0x127e0 masked_save
fn 0x127f0 masked_save_blit
fn 0x127fa masked_save_row
fn 0x1285a elem_class_find
fn 0x128a4 elem_command_wrap
fn 0x128a4 elem_command_wrap_ex
fn 0x1296c elem_bitmap_build
fn 0x129c8 elem_list_build
fn 0x129d6 text_block_build
fn 0x12a4a elem_bitmap_build2
fn 0x12ad6 elem_blit
fn 0x12b04 elem_blit_rev
fn 0x12b40 bit_permute_byte
fn 0x12d96 elem_blit_pair
fn 0x12dd8 elem_blit_pair_vbl
fn 0x12e08 reveal_box_a
fn 0x12ea2 reveal_box_b
fn 0x12fb6 masked_word4
fn 0x12fea hint_blit_entry_b
fn 0x132aa reveal_box_build
fn 0x132ec reveal_box_wait_a
fn 0x1332e reveal_box_wait_b
fn 0x13370 reveal_diamond
fn 0x13474 icon_reveal
fn 0x13490 icon_reveal_h
fn 0x134b2 icon_reveal_v
fn 0x134da elem_blit_vbl
fn 0x134e4 copy_grid
fn 0x1350c script_push
fn 0x13522 script_pop
fn 0x13552 script_call
fn 0x13702 scale_prep
fn 0x13740 scale_loop
fn 0x138a6 scale_anim
fn 0x1398e scale_list_build
fn 0x13a18 scale_16_16
fn 0x13bc2 scale_blit
fn 0x13f2a text_table_paint
fn 0x141dc text_entry_blit
fn 0x1442c cmd74_wrap
fn 0x14602 scene_mode_draw_wrap
fn 0x14748 elem_mode_blit
fn 0x1478a rect_hit_test_a
fn 0x14798 rect_hit_test
fn 0x147c2 cursor_select_a
fn 0x147ce cursor_select_b
fn 0x14832 hit_test
fn 0x14926 class_find
fn 0x149da action_menu
fn 0x14ac6 sample_menu_a
fn 0x14bfa sample_menu_b
fn 0x14d76 sample_menu_entry_a
fn 0x14d90 sample_menu_entry_b
fn 0x14db2 sample_menu
fn 0x14e66 overlay_menu
fn 0x14ee8 cmd135
fn 0x14f24 anim_threshold
fn 0x14f5e anim_threshold2
fn 0x14f74 grid_wait
fn 0x15052 obj_action_select
fn 0x150ae obj_action
fn 0x151b0 row_transition
fn 0x152ee cursor_anim_wait
fn 0x15382 palette_cmd
fn 0x15428 name_prompt
fn 0x15492 sample_select
fn 0x15510 sample_select2
fn 0x15530 mode_queue
fn 0x15588 mode_flag_wrap
fn 0x15594 load_room
fn 0x155b8 mode_queue_wrap
fn 0x155c4 save_room
fn 0x155dc clock
fn 0x1566a icon_ring
fn 0x15888 icon_ring_loop_ex    # variante con salida de tail-call (0x1592e)
fn 0x15888 icon_ring_loop
fn 0x15934 copy_rows_a
fn 0x15944 copy_rows
fn 0x159bc row_palette
fn 0x159d2 anim_entry_a
fn 0x159e2 anim_entry_b
fn 0x15ac8 anim_bank
fn 0x15b94 anim_h7
fn 0x15ba6 anim_h6
fn 0x15bb2 anim_h2
fn 0x15bbc anim_h4
fn 0x15bcc anim_h1
fn 0x15da6 anim_engine_entry
fn 0x16210 pal_next_byte
fn 0x16230 pal_next_word
fn 0x16250 hint_color
fn 0x1627a pal_threshold
fn 0x16310 palette_cycle
fn 0x16460 icon_table
fn 0x164a4 icon_table_entry
fn 0x164d4 icon_state_a
fn 0x164f6 icon_state_b
fn 0x16512 hint_icons_wrap
fn 0x16514 hint_icons
fn 0x1652e icon_apply
fn 0x16554 draw_hint_icons_wrap
fn 0x16576 update_icon_list_wrap
fn 0x16636 obj_list_iter
fn 0x166da obj_list_a
fn 0x166ec obj_list_b
fn 0x167aa obj_wait
fn 0x167be obj_wait_hit
fn 0x1680c obj_wait_a0
fn 0x1687e obj_name
fn 0x168a0 obj_name_snd
fn 0x168d4 obj_name_clean
fn 0x16902 obj_name_track
fn 0x1695a obj_name_table
fn 0x1699c obj_wait_cmd_a
fn 0x169a4 obj_wait_cmd_b
fn 0x169ac obj_wait_cmd_snd
fn 0x169b4 obj_wait_cmd
fn 0x16a20 portrait_intro
fn 0x16ab6 sample_entry
fn 0x16abe grid_bands
fn 0x16b2e or_rows
fn 0x16b76 row_blit
fn 0x16b9c wipe_72
fn 0x16c00 wipe_a
fn 0x16c48 wipe_b
fn 0x16c6c wipe_rows
fn 0x16ca6 wipe_c
fn 0x16ce2 wipe_d
fn 0x16d3c wipe_e
fn 0x16d78 wipe_f
fn 0x16dbc text_transition
fn 0x17094 hint_state_a
fn 0x171b4 sel_timer_a
fn 0x171fa track_select_a
fn 0x172ca hint_state_b
fn 0x173ae sel_timer_b
fn 0x173f2 track_select_b
fn 0x17472 clear_globals
fn 0x17480 rot_action
fn 0x175f6 obj_seal
fn 0x17678 obj_clear_anim
fn 0x176c0 track_icon_anim
fn 0x1778e obj_find
fn 0x17792 obj_find_masked
fn 0x177bc obj_find_class
fn 0x177e4 obj_find_setup
fn 0x1780c obj_find_or_exit
fn 0x17856 obj_anim
fn 0x178cc obj_consume
fn 0x17930 obj_text_box
fn 0x179a2 class30_apply
fn 0x17a1a view_change
fn 0x17c42 obj_refresh
fn 0x17ca4 use_object
fn 0x18128 class30_dispatch
fn 0x1816e track5_apply
fn 0x1817a obj_mark
fn 0x18192 track5_body
fn 0x181f0 room_reset
fn 0x182f0 icon_list_reset
fn 0x18316 icon_list_build
fn 0x18334 icon_scale
fn 0x1834a icon_scale_loop
fn 0x184cc sample_mark_a
fn 0x184d6 sample_mark_b
fn 0x1851a sample_mark_c
fn 0x18538 sample_walk
fn 0x1857a sample_find_wrap
fn 0x1857c sample_find_body
fn 0x186b6 sample_find
fn 0x186ee dispatch_cmd
fn 0x1870a track_walk
fn 0x18740 anim_step
fn 0x1881e copy_rows_vbl
fn 0x18888 bank_blit_a
fn 0x18890 bank_blit_b
fn 0x188ce anim_mode
fn 0x18944 icon_repeat
fn 0x18a10 track_advance
fn 0x18a30 screen_clean
fn 0x18a98 attract
fn 0x18a98 attract_once
fn 0x18c80 attract_loop
fn 0x18c8e icon_anim_a
fn 0x18cb2 icon_anim_b
fn 0x18ce0 icon_anim_c
fn 0x18cfc obj_dec
fn 0x18d26 draw_selection_frame_wrap
fn 0x18dc0 sound_path
fn 0x18e06 sample_pair_a
fn 0x18e12 sample_list
fn 0x18f0c sample_queue
fn 0x18f6e supexec_wrap
fn 0x18f7a supexec_b
fn 0x18f84 sound_stop_supexec
fn 0x18f8e sound_play_a
fn 0x18f98 sound_play_b
fn 0x18fa2 supexec_a
fn 0x18fa4 sound_stop
fn 0x18fc6 sound_timer_start_body
fn 0x1906a sound_vector
fn 0x1909e sound_off
fn 0x190b8 sound_isr_load
fn 0x190f6 sound_isr_back
fn 0x1910e sound_isr_fwd
fn 0x19282 ym_reset
fn 0x3a57c music_cmd_table
fn 0x3a5c2 music_install
fn 0x3a62e music_load
fn 0x3a6f4 music_stop
fn 0x3a712 music_stop2
fn 0x3a734 music_cmd
fn 0x3a85e music_silence
fn 0x3a992 music_note
fn 0x3aa38 psg_trap3
fn 0x3aa7c psg_write_verify
fn 0x3aa8a psg_shadow
fn 0x3aab6 music_tick
fn 0x3ad5a music_h1
fn 0x3ad6a music_h2
fn 0x3adb4 music_h3
fn 0x3ae00 music_h4
fn 0x3ae68 music_h5

# ==== E/S GEMDOS y formulario de texto (importados) ====
fn 0x107b6 gemdos_fopen
fn 0x107d0 gemdos_fcreate
fn 0x107e8 gemdos_fread
fn 0x10808 gemdos_fwrite
fn 0x10828 gemdos_fclose
var 0x1a7b6 text_form_table
var 0xd8f0 text_form_mode
var 0xd8f2 text_form_list
var 0xd900 text_form_0
var 0xd902 text_form_1
var 0xd904 text_form_2
var 0x1a56c text_form_box
var 0x41fb0 text_entries
