ASxxxx Assembler V02.00 + NoICE + SDCC mods  (Zilog Z80 / Hitachi HD64180), page 1.
Hexadecimal [16-Bits]



                              1 ;;------------------------------------------------LICENSE NOTICE------------------------------------------------------------------------------
                              2 ;;  This file is part of Amstrad CPC videogame "Redsea"
                              3 ;;  Copyright (C) 2021 Crab Party / Elena López (AneleSplats in itch.io) / Iván Tortosa (Pluvs in itch.io, @IvanTortosaBer1 on Twitter) / Antonio Gosálvez (BalgroHub in itch.io)
                              4 ;;  Copyright (C) 2015 ronaldo / Fremos / Cheesetea / ByteRealms (@FranGallegoBR)
                              5 ;;
                              6 ;;  This program is free software: you can redistribute it and/or modify
                              7 ;;  it under the terms of the GNU Lesser General Public License as published by
                              8 ;;  the Free Software Foundation, either version 3 of the License, or
                              9 ;;  (at your option) any later version.
                             10 ;;
                             11 ;;  This program is distributed in the hope that it will be useful,
                             12 ;;  but WITHOUT ANY WARRANTY; without even the implied warranty of
                             13 ;;  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
                             14 ;;  GNU Lesser General Public License for more details.
                             15 ;;
                             16 ;;  You should have received a copy of the GNU Lesser General Public License
                             17 ;;  along with this program.  If not, see <http://www.gnu.org/licenses/>.
                             18 ;;------------------------------------------------LICENSE NOTICE-------------------------------------------------------------------------
                             19 ;Declaraciones globales
                             20 .globl cpct_memset_asm
                             21 .globl cpct_memcpy_asm
                             22 
                             23 ;Tipos de entidades
                             24 ; e_type_invalid = #0x00 ; invalid entity type
                             25 ; e_type_render = #0x01 ; renderable entity
                             26 ; e_type_movable = #0x02 ; movable entity
                             27 ; e_type_input = #0x04 ; Entity controllable by input
                             28 ; e_type_ai = #0x08 ; Entity with ai
                             29 ; e_type_animated = #0x10 ; Entity with animation
                             30 ; e_type_collision = #0x20 ; Entity with collision
                             31 ; e_type_non_loopable = #0x40 ; Entity with non loopable animations
                     0080    32 e_type_dead = #0x80 ; upper bit signals dead entity
                     007F    33 e_type_default = #0x7F ; default entity (all bits = 1)
                             34 
                             35 ;;chocarse con
                     0001    36 e_type_player = #0x01 
                     0002    37 e_type_pared = #0x02
                     0004    38 e_type_spawner = #0x04
                     0008    39 e_type_deadly = #0x08
                     0010    40 e_type_goal = #0x10
                     0020    41 e_type_arbol = #0x20
                     0040    42 e_type_llave = #0x40
                     0080    43 e_type_puerta = #0x80
                             44 
                             45 
                             46 
                             47 
                             48 
                             49 
                             50 
                             51 ;Variables en memoria
   7D79                      52 Invercosa: .ds 2
   7D7B                      53 posAct: .ds 2
   7D7D 00                   54 libres:: .db #0x00
                             55 
ASxxxx Assembler V02.00 + NoICE + SDCC mods  (Zilog Z80 / Hitachi HD64180), page 2.
Hexadecimal [16-Bits]



                     0007    56 MAX_ENTITIES = 7
                     0012    57 entity_size = 18
                             58 
                             59 
                     007E    60 Tam_ent = MAX_ENTITIES*entity_size
                             61 
                             62 ;m_num_entities:: .db 0
                             63 ;entity_sizee:: .db #15
   7D7E 80 7D                64 m_next_free_entity:: .dw m_entities
                             65 
   7D80                      66 m_entities:: .ds Tam_ent
   7DFE 00                   67 m_zero_type_at_the_end: .db #0x00
                             68 
   7DFF 00                   69 matching_type::  .db #0x00
                             70 
                             71 
                             72 ;Se pone toda la memoria de las entidades a 0
                             73 ;Se asigna m_next_free_entity y libres a su valor por defecto
   7E00                      74 man_entity_init::
   7E00 01 7E 00      [10]   75     ld bc, #Tam_ent
   7E03 3E 00         [ 7]   76     ld a, #0
   7E05 11 80 7D      [10]   77     ld de, #m_entities
   7E08 CD 82 99      [17]   78     call cpct_memset_asm
                             79 
   7E0B 21 80 7D      [10]   80     ld hl, #m_entities
   7E0E 22 7E 7D      [16]   81     ld (m_next_free_entity), hl
                             82 
   7E11 3E 07         [ 7]   83     ld a, #MAX_ENTITIES
   7E13 32 7D 7D      [13]   84     ld (#libres), a
   7E16 C9            [10]   85 ret
                             86 
                             87 
                             88 ;Se le asigna a la siguiente entidad su tipo por defecto
                             89 ;Se actualiza m_next_free_entity y libres
                             90 ; OUTPUT:   ix es la dir de la entidad creada
   7E17                      91 man_entity_create::
   7E17 ED 4B 7E 7D   [20]   92     ld bc, (m_next_free_entity)
   7E1B 3E 7F         [ 7]   93     ld a, #e_type_default
   7E1D 02            [ 7]   94     ld (bc), a
   7E1E 21 12 00      [10]   95     ld hl, #0d18
                             96 
   7E21 09            [11]   97     add hl, bc
   7E22 22 7E 7D      [16]   98     ld (m_next_free_entity), hl
   7E25 69            [ 4]   99     ld l, c
   7E26 60            [ 4]  100     ld h, b
                            101 
   7E27 E5            [11]  102     push hl
   7E28 3A 7D 7D      [13]  103     ld a, (#libres)
   7E2B D6 01         [ 7]  104     sub #1
   7E2D 32 7D 7D      [13]  105     ld (#libres), a
                            106 
   7E30 DD E1         [14]  107     pop ix
   7E32 C9            [10]  108 ret
                            109 
                            110 
ASxxxx Assembler V02.00 + NoICE + SDCC mods  (Zilog Z80 / Hitachi HD64180), page 3.
Hexadecimal [16-Bits]



                            111 ; Elimina todas las entidades
   7E33                     112 man_entity_deleteAll::
                            113 
   7E33 21 80 7D      [10]  114     ld hl, #m_entities
                            115 
   7E36                     116     siguiente_ent32:
   7E36 7E            [ 7]  117         ld a, (hl)
   7E37 B7            [ 4]  118         or a
   7E38 28 0C         [12]  119         jr z, salir32
                            120 
   7E3A E5            [11]  121         push hl
   7E3B DD E1         [14]  122         pop ix
   7E3D CD 0C 7F      [17]  123         call man_entity_set4destruction
                            124 
   7E40 01 12 00      [10]  125         ld bc, #entity_size
   7E43 09            [11]  126         add hl, bc
   7E44 18 F0         [12]  127         jr siguiente_ent32
   7E46                     128     salir32:
                            129 
   7E46 C9            [10]  130 ret
                            131 
                            132 
                            133 ;;Recibe por ix la dir de la funcion y en matching_type la signature
   7E47                     134 man_entity_forall_matching_pairing::
                            135 
                            136 ;;Guardamos la dir de la funcion para luego saltar a ella
   7E47 DD 22 79 7D   [20]  137 ld (Invercosa), ix
                            138 
                            139     ;;ix primera entidad
   7E4B DD 21 80 7D   [14]  140     ld ix, #m_entities
                            141 
                            142     ;;Comprobamos que la primera entidad sea valida, y recorre todas hasta que no lo sea
                            143     ;;Dentro de cada iteracion tenemos que:
                            144     ;;-Cojer la siguiente entidad y si es valida y coincide, se hace la funcion
                            145     ;;-Tanto si lo hace como si no lo hace, se pasa a la siguiente entidad
                            146 
   7E4F                     147 siguiente_ent3:
                            148 
                            149     ;;Si no es válida, se sale de la funcion
   7E4F DD 7E 00      [19]  150     ld a, (ix)
   7E52 B7            [ 4]  151     or a
   7E53 28 36         [12]  152     jr z, salir3
                            153 
                            154     ;;Si cumple la signature, se busca la segunda entidad, si no sigue con el bucle
   7E55 3A FF 7D      [13]  155     ld a, (#matching_type)
   7E58 57            [ 4]  156     ld d, a
   7E59 DD 7E 00      [19]  157     ld a, (ix)
   7E5C A2            [ 4]  158     and d
   7E5D BA            [ 4]  159     cp d    
   7E5E 20 2B         [12]  160     jr nz, salir3       ; Cambiado saltito3 a salir3
                            161 
   7E60 DD E5         [15]  162     push ix
   7E62 FD E1         [14]  163     pop iy
                            164 
                            165     ;;Si la cumple, se busca la segunda entidad
ASxxxx Assembler V02.00 + NoICE + SDCC mods  (Zilog Z80 / Hitachi HD64180), page 4.
Hexadecimal [16-Bits]



   7E64                     166 saltito3_2:
                            167 
                            168     ;;iy segunda entidad
   7E64 01 12 00      [10]  169     ld bc, #entity_size
   7E67 FD 09         [15]  170     add iy, bc
                            171 
                            172     ;;Si no es válida, se sale del bucle
   7E69 FD 7E 00      [19]  173     ld a, (iy)
   7E6C B7            [ 4]  174     or a
   7E6D 28 1C         [12]  175     jr z, salir3    ;ambiado saltito3 a salir3
                            176 
                            177     ;;Si cumple la signature, se hace la funcion, si no sigue con el bucle
   7E6F 3A FF 7D      [13]  178     ld a, (#matching_type)
   7E72 57            [ 4]  179     ld d, a
   7E73 FD 7E 00      [19]  180     ld a, (iy)
   7E76 A2            [ 4]  181     and d
   7E77 BA            [ 4]  182     cp d
   7E78 20 EA         [12]  183 jr nz, saltito3_2
                            184 
                            185     ;;Si la cumple hace el código y sigue a la siguiente entidad
   7E7A 01 64 7E      [10]  186     ld bc, #saltito3_2
   7E7D C5            [11]  187     push bc
   7E7E 2A 79 7D      [16]  188     ld hl, (#Invercosa)
   7E81 E9            [ 4]  189     jp (hl)
                            190 
   7E82 18 E0         [12]  191     jr saltito3_2
                            192 
                            193 
                            194     
   7E84                     195 saltito3:
   7E84 01 12 00      [10]  196     ld bc, #entity_size
   7E87 DD 09         [15]  197     add ix, bc
   7E89 18 C4         [12]  198     jr siguiente_ent3
                            199 
   7E8B                     200 salir3:
                            201 
   7E8B C9            [10]  202 ret
                            203 
                            204 
                            205 
                            206 
                            207 
                            208 ;Se le pasa por ix la direccion de memoria de una funcion
                            209 ;Esa funcion se le aplica a todas las entidades vivas que sean tengan todos los tipos de matching_type
   7E8C                     210 man_entity_forall_matching::
   7E8C DD 22 79 7D   [20]  211     ld (Invercosa), ix
   7E90 DD 21 80 7D   [14]  212     ld ix, #m_entities
                            213 
   7E94                     214 siguiente_ent2:
                            215 
   7E94 3A FF 7D      [13]  216     ld a, (#matching_type)
   7E97 57            [ 4]  217     ld d, a
   7E98 DD 7E 00      [19]  218     ld a, (ix)
   7E9B B7            [ 4]  219     or a
   7E9C 28 16         [12]  220     jr z, salir2
ASxxxx Assembler V02.00 + NoICE + SDCC mods  (Zilog Z80 / Hitachi HD64180), page 5.
Hexadecimal [16-Bits]



                            221 
   7E9E DD 7E 00      [19]  222     ld a, (ix)
   7EA1 A2            [ 4]  223     and d
   7EA2 BA            [ 4]  224     cp d
   7EA3 20 08         [12]  225     jr nz, saltito2 ;Si no cumple todos los bites de d, se lleva a saltito
                            226 
                            227 
   7EA5 01 AD 7E      [10]  228     ld bc, #saltito2
   7EA8 C5            [11]  229     push bc
                            230     
                            231     ;push hl
   7EA9 2A 79 7D      [16]  232     ld hl, (#Invercosa)
                            233 
   7EAC E9            [ 4]  234     jp (hl)
                            235     
   7EAD                     236 saltito2:
   7EAD 01 12 00      [10]  237     ld bc, #entity_size
   7EB0 DD 09         [15]  238     add ix, bc
   7EB2 18 E0         [12]  239     jr siguiente_ent2
   7EB4                     240 salir2:
                            241 
   7EB4 C9            [10]  242 ret
                            243 
                            244 
                            245 
                            246 ;Se le pasa por hl la direccion de memoria de una funcion
                            247 ;Esa funcion es aplicada a todas las entidades vivas
   7EB5                     248 man_entity_forall::
   7EB5 22 79 7D      [16]  249     ld (Invercosa), hl
   7EB8 21 80 7D      [10]  250     ld hl, #m_entities
                            251 
   7EBB                     252 siguiente_ent:
   7EBB 7E            [ 7]  253     ld a, (hl)
   7EBC B7            [ 4]  254     or a
   7EBD 28 0F         [12]  255     jr z, salir
                            256 
   7EBF 01 C8 7E      [10]  257     ld bc, #saltito
   7EC2 C5            [11]  258     push bc
                            259     
   7EC3 E5            [11]  260     push hl
   7EC4 2A 79 7D      [16]  261     ld hl, (#Invercosa)
                            262 
   7EC7 E9            [ 4]  263     jp (hl)
                            264     
   7EC8                     265 saltito:
   7EC8 01 12 00      [10]  266     ld bc, #entity_size
   7ECB 09            [11]  267     add hl, bc
   7ECC 18 ED         [12]  268     jr siguiente_ent
   7ECE                     269 salir:
                            270 
   7ECE C9            [10]  271 ret
                            272 
                            273 
                            274 ;Destruye una entidad, cogiendo la última válida y colocandola en su posición
   7ECF                     275 man_entity_destroy::
ASxxxx Assembler V02.00 + NoICE + SDCC mods  (Zilog Z80 / Hitachi HD64180), page 6.
Hexadecimal [16-Bits]



                            276 ;push hl
                            277 
   7ECF 3A 7D 7D      [13]  278    ld a, (#libres) ;pones en hl temporal por el push, el numero de entidades libres que quedan
   7ED2 C6 01         [ 7]  279    add #1 ;le añades a hl temporal el bc
   7ED4 32 7D 7D      [13]  280    ld (#libres), a ;metes dentro de libres el contenido de libres (dentro de hl temporal) + bc
                            281 
                            282    ;pop hl ;usas hl normal a partir de ahora
                            283 
                            284    ;ld bc, #11 ;le pones a bc donde esta el prevPos de la entidad
                            285    ;add hl, bc  ;;prevPos1
                            286 
   7ED7 DD 5E 0B      [19]  287    ld e, 11(ix) ;le metes a e el contenido de hl
   7EDA 23            [ 6]  288    inc hl      ;;prevPos2
   7EDB DD 56 0C      [19]  289    ld d, 12(ix) ; le metes a d el contenido de hl+1
                            290 
                            291 ;    dec hl  ;;prevPos1
                            292 ;    dec hl  ;;color
                            293 ;    dec hl  ;;vx
                            294 ;    dec hl  ;;y
                            295 ;    dec hl  ;;x
                            296 ;    dec hl  ;;tipo
                            297 
                            298    ;push hl
                            299 
   7EDE 62            [ 4]  300    ld h, d
   7EDF 6B            [ 4]  301    ld l, e
   7EE0 36 00         [10]  302    ld (hl), #0
                            303 
                            304    ;pop hl
                            305 
   7EE2 01 EE FF      [10]  306    ld bc, #0xFFEE
   7EE5 DD 22 7B 7D   [20]  307    ld (posAct), ix
   7EE9 54            [ 4]  308    ld d, h
   7EEA 5D            [ 4]  309    ld e, l
   7EEB DD 2A 7E 7D   [20]  310    ld ix, (#m_next_free_entity)
                            311 
   7EEF DD 09         [15]  312    add ix, bc
                            313 
   7EF1 DD 22 7E 7D   [20]  314    ld (m_next_free_entity), ix
                            315 
   7EF5 01 12 00      [10]  316    ld bc, #18
                            317 
   7EF8 CD 8A 99      [17]  318    call cpct_memcpy_asm
                            319 
   7EFB 01 12 00      [10]  320    ld bc, #18;; size
                            321 
   7EFE 3E 00         [ 7]  322    ld a, #0 ;; value
                            323 
   7F00 ED 5B 7E 7D   [20]  324    ld de, (#m_next_free_entity) ;; puntero al array, primer valor
                            325 
   7F04 CD 82 99      [17]  326    call cpct_memset_asm
                            327 
   7F07 DD 2A 7B 7D   [20]  328    ld ix, (#posAct)
   7F0B C9            [10]  329 ret
                            330 
ASxxxx Assembler V02.00 + NoICE + SDCC mods  (Zilog Z80 / Hitachi HD64180), page 7.
Hexadecimal [16-Bits]



                            331 
                            332 ;Cambia el tipo de la entidad pasada por ix a entidad_muerta
   7F0C                     333 man_entity_set4destruction::
   7F0C DD 7E 00      [19]  334     ld a, (ix)
   7F0F F6 80         [ 7]  335     or #e_type_dead
   7F11 DD 77 00      [19]  336     ld (ix), a
   7F14 C9            [10]  337 ret
                            338 
                            339 
                            340 ;Recorre todas las entidades, y borra las que están marcadas para morir
   7F15                     341 man_entity_update::
   7F15 DD 21 80 7D   [14]  342     ld ix, #m_entities
   7F19 18 03         [12]  343     jr siguiento
                            344 
   7F1B                     345 destruir_ent:
   7F1B CD CF 7E      [17]  346     call man_entity_destroy
   7F1E                     347 siguiento:
   7F1E DD 7E 00      [19]  348     ld a, (ix)
   7F21 B7            [ 4]  349     or a
   7F22 C8            [11]  350     ret z
                            351 
   7F23 3E 80         [ 7]  352     ld a, #e_type_dead
   7F25 47            [ 4]  353     ld b, a
   7F26 DD 7E 00      [19]  354     ld a, (ix)
   7F29 A0            [ 4]  355    and b
   7F2A 20 EF         [12]  356    jr nz, destruir_ent ;nz era como estaba y explota
   7F2C                     357 no_destruir_ent:
   7F2C 01 12 00      [10]  358     ld bc, #entity_size
   7F2F DD 09         [15]  359     add ix, bc
   7F31 18 EB         [12]  360     jr siguiento
   7F33 C9            [10]  361 ret
                            362 
                            363 
                            364 ;Devuelve por a el número entidades libres que quedan
   7F34                     365 man_entity_freeSpace::
   7F34 3A 7D 7D      [13]  366     ld a, (#libres)
   7F37 C9            [10]  367 ret
                            368 
   7F38                     369 man_entity_get_from_idx::
   7F38 DD 21 80 7D   [14]  370     ld ix, #m_entities
   7F3C C9            [10]  371 ret
                            372 
                            373 ; Cambia la posicion de la entidad pasada
                            374 ; Input: ix es la dir de la entidad / b es la x deseada y c es la y deseada
   7F3D                     375 man_entity_moverEntidad::
                            376 
   7F3D DD 70 01      [19]  377     ld 1(ix), b
   7F40 DD 71 02      [19]  378     ld 2(ix), c
                            379 
   7F43 C9            [10]  380 ret
                            381 ;CAMBIAR HL POR IX EN UPDATE ONE Y FORALL
