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



                              1 .include "collision.h.s"
                              1 .globl sys_collision_update
                              2 .globl cpct_drawSolidBox_asm
                              3 .globl cpct_getRandom_mxor_u8_asm
ASxxxx Assembler V02.00 + NoICE + SDCC mods  (Zilog Z80 / Hitachi HD64180), page 2.
Hexadecimal [16-Bits]



                              2 .include "man/entity.h.s"
                              1 .globl entity_create
                              2 .globl entity_copy
                              3 .globl entity_doForAll
                              4 .globl entity_doForAll_matching
                              5 .globl entity_doForAll_pairs_matching
                              6 .globl entity_update
                              7 .globl entity_vector
                              8 .globl entity_set4destruction
                              9 .globl entity_set4creation
                             10 .globl entity_register
                             11 .globl num_entities
                             12 .globl getEntity2
                             13 
                             14 
                             15 ; Constantes
                     0000    16 e_tipo            = 0
                     0001    17 e_cmps            = 1
                     0002    18 e_x               = 2
                     0003    19 e_y               = 3
                     0004    20 e_vx              = 4
                     0005    21 e_vy              = 5
                     0006    22 e_w               = 6
                     0007    23 e_h               = 7
                     0008    24 e_spriteL         = 8
                     0009    25 e_spriteH         = 9
                     000A    26 e_iaL             = 10
                     000B    27 e_iaH             = 11
                     000C    28 e_animL           = 12
                     000D    29 e_animH           = 13
                     000E    30 e_anim_st         = 14
                     000F    31 e_animCounter     = 15
                     0010    32 e_collidesAgainst = 16
                     0011    33 e_last_dir        = 17
                     0012    34 e_last_dirY       = 18
                     0013    35 e_player_shot     = 19
                     0014    36 e_actualizaMove   = 20
                     0015    37 e_contMove        = 21
                     0016    38 e_aim_X           = 22
                     0017    39 e_aim_Y           = 23
                     0018    40 e_hp              = 24
                     0019    41 e_perteneceL      = 25
                     001A    42 e_perteneceH      = 26
                     001B    43 e_tablaAnimL      = 27
                     001C    44 e_tablaAnimH      = 28
                     001D    45 e_anim_especial   = 29
                     001E    46 e_invencibilidad  = 30
                     001F    47 e_atacando        = 31
                             48 
                             49 
                             50 ;; Tipos
                     0000    51 e_type_invalid  = 0x00 
                     0001    52 e_type_player   = 0x01
                     0002    53 e_type_zombie   = 0x02  ;; realmente no es para el zombie, es para todos los enemigos
                     0004    54 e_type_shot     = 0x04
ASxxxx Assembler V02.00 + NoICE + SDCC mods  (Zilog Z80 / Hitachi HD64180), page 3.
Hexadecimal [16-Bits]



                     0008    55 e_type_arcoiris = 0x08
                     0010    56 e_type_vida     = 0x10
                     0080    57 e_type_dead     = 0x80
                     007F    58 e_type_default  = 0x7F
                             59 
                             60 ;; Components
                     0001    61 e_cmp_render   = 0x01
                     0002    62 e_cmp_movable  = 0x02
                     0004    63 e_cmp_input    = 0x04
                     0008    64 e_cmp_ia       = 0x08
                     0010    65 e_cmp_animated = 0x10
                     0020    66 e_cmp_collider = 0x20
                     0040    67 e_cmp_vidaextra = 0x40
                             68 
                     0010    69 k_max_num_entities = 16
                     0020    70 k_size_entity      = 32
                             71 
                             72 
                             73 
                             74 ;; Define an entity 
                             75 .macro DefineEntity _name, _tipo, _cmps, _x, _y, _vx, _vy, _w, _h, _sprite, _ia, _anim, _anim_st,_animCounter, _collides, _lastdir, _lastdirY , _playerShot, _actualizaMove, _contMove, _aimX, _aimY, _hp, _pertenece, _tablaAnim, _animEspecial, _invencible, _atacando
                             76    _name:
                             77       .db _tipo      ;; (Invalid 00, Player 01, Enemigo 02, Dead 80, Default 7F)
                             78       .db _cmps      ;; ()
                             79       .db _x,  _y    ;; x, y
                             80       .db _vx, _vy   ;; Vx, Vy
                             81       .db _w, _h     ;; Width, Height
                             82       .dw _sprite    ;; sprite (puntero al sprite)
                             83       .dw _ia        ;; IA     (puntero a funcion)
                             84       .dw _anim      ;; puntero a la animacion
                             85       .db _anim_st
                             86       .db _animCounter  ;; contador de animacion
                             87       .db _collides  ;; Collides Against
                             88       .db _lastdir, _lastdirY   ;; Ultima direccion a la que apunta la entidad (solo para ver hacia donde dispara el player)
                             89       .db _playerShot ;; 1 si la entidad ya ha disparado, 0 si no
                             90       .db _actualizaMove
                             91       .db _contMove
                             92       .db _aimX, _aimY
                             93       .db _hp
                             94       .dw _pertenece
                             95       .dw _tablaAnim    ;; puntero a la tabla que le corresponde de animaciones
                             96       .db _animEspecial ;; indica si es normal (0) o especial (1)
                             97       .db _invencible
                             98       .db _atacando
                             99 .endm
                            100 
                            101 ;; Define an entity with default values
                            102 .macro DefineEntityDefault _name, _suf
                            103                         ;;  Tipo  cmps  x     y      vx   vy   width height  sprite   ia     anim  status counter  collides  last_dir last_dir  player_shot actualizaMove contMove aimX, aimY    HP   pertenece tablaAnim especial invencibile atacando
                            104    DefineEntity _name'_suf, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0000, 0x0000, 0x0000, 0x00, 0x00,    0x00,    0x00,    0x00,       0x00,       0x00,       0x00,     0x00, 0x00,  0x00,  0x0000,  0x0000,   0x00,        0xDE,     0xAD;;
                            105 .endm
                            106 
                            107 ;; Define N default entities (changing the names)
                            108 .macro DefineNEntities _name, _n
                            109    _c = 0
ASxxxx Assembler V02.00 + NoICE + SDCC mods  (Zilog Z80 / Hitachi HD64180), page 4.
Hexadecimal [16-Bits]



                            110    .rept _n
                            111       DefineEntityDefault _name, \_c
                            112       _c = _c + 1 
                            113    .endm
                            114 .endm
ASxxxx Assembler V02.00 + NoICE + SDCC mods  (Zilog Z80 / Hitachi HD64180), page 5.
Hexadecimal [16-Bits]



                              3 .include "man/game.h.s"
                              1 .globl game_init 
                              2 .globl game_play 
                              3 .globl game_menu
                              4 .globl render_init
                              5 .globl cpct_waitVSYNC_asm
                              6 .globl game_create_template
                              7 .globl cpct_drawStringM0_asm
                              8 .globl cpct_akp_musicPlay_asm
                              9 .globl cpct_akp_musicInit_asm
                             10 .globl cpct_zx7b_decrunch_s_asm
                             11 .globl cpct_akp_stop_asm
                             12 .globl set_int_handler
                             13 .globl cpct_akp_SFXInit_asm
                             14 .globl cpct_akp_SFXPlay_asm
                             15 .globl cpct_akp_SFXStop_asm
                             16 
                             17 .globl bool_final_juego
                             18 .globl bool_game_over
                             19 .globl bool_final_ronda
                             20 .globl cont_bajas_enemigos
                             21 .globl incrementa_cont_bajas_enemigos
                             22 
                             23 .globl cpct_setPALColour_asm
ASxxxx Assembler V02.00 + NoICE + SDCC mods  (Zilog Z80 / Hitachi HD64180), page 6.
Hexadecimal [16-Bits]



                              4 .include "man/entity_templates.h.s"
                              1 .globl player1
                              2 .globl player2
                              3 .globl zombie
                              4 .globl arquero
                              5 .globl arcoiris
                              6 .globl shot1
                              7 .globl vida
                              8 .globl shot_arquero
                              9 .globl ghostX
                             10 .globl ghostY
                             11 .globl monster
                             12 .globl semiseguidor
                             13 .globl cangrejo
                             14 .globl topo
                             15 .globl muriendo_tmp_cmps
                             16 .globl zBoss
ASxxxx Assembler V02.00 + NoICE + SDCC mods  (Zilog Z80 / Hitachi HD64180), page 7.
Hexadecimal [16-Bits]



                              5 
                              6 
   A37F 00 00                 7 registro_hl:  .dw 0x000
   A381 00 00                 8 registro_aux: .dw 0x000
                              9 
                             10 .globl bool_muerte
                             11 .globl bool_vida
                             12 .globl bool_arcoiris
                             13 .globl _gameover1
                             14 
                             15 ;;  Para hacer las colisiones tenemos en
                             16 ;;  IX -> Entidad1 
                             17 ;;  IY -> Entidad2
                             18 
                             19 ;; Colision Enemigo choca contra el Player
   A383                      20 enemy_player:
                             21 
   A383 DD E5         [15]   22     push ix
   A385 FD E5         [15]   23     push iy
                             24 
   A387 3E 01         [ 7]   25     ld a, #0x01
   A389 32 D5 95      [13]   26     ld (bool_muerte), a
                             27 
   A38C DD 7E 18      [19]   28     ld a, e_hp(ix) ;Cargamos la vida
   A38F 3D            [ 4]   29     dec a 
   A390 DD 77 18      [19]   30     ld e_hp(ix), a ;Actualizamos la variable
                             31 
   A393 FE 00         [ 7]   32     cp #0
   A395 C2 AB A3      [10]   33     jp nz, vivo ;Si no es cero, estoy vivo
                             34         ;Si vale 0, me han matado y destruyo ix, es decir, el player
                             35 
                             36         ;; Musica gameover
   A398 11 06 02      [10]   37         ld de, #_gameover1
   A39B CD 3B B2      [17]   38         call cpct_akp_musicInit_asm
                             39 
   A39E CD D4 92      [17]   40         call entity_set4destruction
                             41 
   A3A1 3E 01         [ 7]   42         ld a, #1
   A3A3 32 BF 96      [13]   43         ld (bool_game_over), a
                             44 
   A3A6 FD E1         [14]   45         pop iy
   A3A8 DD E1         [14]   46         pop ix 
   A3AA C9            [10]   47         ret
   A3AB                      48     vivo:
   A3AB DD 36 1E 01   [19]   49     ld e_invencibilidad(ix), #1
   A3AF CD F7 A3      [17]   50     call cambia_variables_IX_IY ;Metemos en ix el enemigo y en iy el player
                             51 
                             52    
   A3B2 DD 7E 18      [19]   53     ld a, e_hp(ix) ;Cargamos la vida
   A3B5 FE 01         [ 7]   54     cp #1
   A3B7 C2 C2 A3      [10]   55     jp nz, vivoEnemy ;Si se muere de un golpe, eliminamos
   A3BA CD D4 92      [17]   56         call entity_set4destruction ;Borramos ix, es decir, el enemigo
   A3BD CD B2 9B      [17]   57         call incrementa_cont_bajas_enemigos ;; enemigos_muertos ++
   A3C0 18 00         [12]   58         jr fin_funcion_colision
   A3C2                      59     vivoEnemy:
ASxxxx Assembler V02.00 + NoICE + SDCC mods  (Zilog Z80 / Hitachi HD64180), page 8.
Hexadecimal [16-Bits]



                             60         ;; QUITAMOS UNA VIDA AL ENEMIGO (boss final)
                             61         ;dec a 
                             62         ;ld e_hp(ix), a ;Actualizamos la variable
                             63         ;ld e_invencibilidad(ix), #1
   A3C2                      64     fin_funcion_colision:
                             65 
   A3C2 FD E1         [14]   66     pop iy
   A3C4 DD E1         [14]   67     pop ix
   A3C6 C9            [10]   68 ret
                             69 
                             70 
   A3C7                      71 shotArcher_player:
                             72 
   A3C7 DD E5         [15]   73     push ix
   A3C9 FD E5         [15]   74     push iy
                             75 
   A3CB 3E 01         [ 7]   76     ld a, #0x01
   A3CD 32 D5 95      [13]   77     ld (bool_muerte), a
                             78 
   A3D0 DD 7E 18      [19]   79     ld a, e_hp(ix) ;Cargamos la vida
   A3D3 3D            [ 4]   80     dec a 
   A3D4 DD 77 18      [19]   81     ld e_hp(ix), a ;Actualizamos la variable
                             82 
   A3D7 FE 00         [ 7]   83     cp #0
   A3D9 C2 E9 A3      [10]   84     jp nz, vivo2 ;Si no es cero, estoy vivo
                             85         ;Si vale 0, me han matado y destruyo ix, es decir, el player
   A3DC CD D4 92      [17]   86         call entity_set4destruction
                             87 
   A3DF 3E 01         [ 7]   88         ld a, #1
   A3E1 32 BF 96      [13]   89         ld (bool_game_over), a
   A3E4 FD E1         [14]   90         pop iy
   A3E6 DD E1         [14]   91         pop ix 
   A3E8 C9            [10]   92         ret
                             93 
   A3E9                      94     vivo2:
   A3E9 CD F7 A3      [17]   95     call cambia_variables_IX_IY ;Metemos en ix la bala y en iy el player
                             96 
                             97     ;; Le ponemos player_shot=1 a su arquero
   A3EC CD 49 A4      [17]   98     call suma_player_shot_al_que_dispare
                             99    
   A3EF CD D4 92      [17]  100     call entity_set4destruction ;Borramos ix, es decir, el enemigo
                            101 
                            102     ;; No aumentamos enemigos_muertos++ (porque choca con la bala)
                            103 
   A3F2                     104     salgo_decrementa:
   A3F2 FD E1         [14]  105     pop iy
   A3F4 DD E1         [14]  106     pop ix
   A3F6 C9            [10]  107 ret
                            108 
                            109 
   A3F7                     110 cambia_variables_IX_IY:
   A3F7 DD 22 7F A3   [20]  111     ld (registro_hl), ix
   A3FB FD 22 81 A3   [20]  112     ld (registro_aux), iy
   A3FF DD 2A 81 A3   [20]  113     ld ix, (registro_aux)
   A403 FD 2A 7F A3   [20]  114     ld iy, (registro_hl)
ASxxxx Assembler V02.00 + NoICE + SDCC mods  (Zilog Z80 / Hitachi HD64180), page 9.
Hexadecimal [16-Bits]



   A407 C9            [10]  115 ret
                            116 
                            117 
                            118 ;; Colision Player arcoiris
   A408                     119 player_arcoiris:
                            120 
   A408 3E 01         [ 7]  121     ld a, #0x01
   A40A 32 D7 95      [13]  122     ld (bool_arcoiris), a
                            123 
   A40D DD E5         [15]  124     push ix
                            125 
   A40F CD F7 A3      [17]  126     call cambia_variables_IX_IY
   A412 CD D4 92      [17]  127     call entity_set4destruction
                            128 
                            129     ;; Creamos 4 disparos
   A415 11 52 95      [10]  130     ld de, #shot1
                            131 
   A418 DD 7E 03      [19]  132     ld a, e_y(ix)   ;; /
   A41B C6 08         [ 7]  133     add #0x08       ;; | La Y del disparo será, X_arcoiris + (Height_arcoiris / 2) 
   A41D 47            [ 4]  134     ld b, a         ;; \    
                            135 
   A41E DD 7E 02      [19]  136     ld a, e_x(ix)   ;; / La X del disparo será, X_arcoiris + (Width_arcoiris / 2) 
   A421 C6 03         [ 7]  137     add #0x03       ;; \
                            138 
   A423 0E 01         [ 7]  139     ld c, #1        ;; Velocidad en X del primer disparo
   A425 26 00         [ 7]  140     ld h, #0        ;; Velocidad en Y del primer disparo
                            141 
   A427 2E 04         [ 7]  142     ld l, #4        ;; Numero de entidades a crear (4)
   A429 CD DD 92      [17]  143     call entity_set4creation
                            144 
   A42C DD E1         [14]  145     pop ix
                            146     
   A42E C9            [10]  147 ret
                            148 
                            149 
                            150 ;; Colision Player Vida
   A42F                     151 player_vida:
                            152 
   A42F 3E 01         [ 7]  153     ld a, #0x01
   A431 32 D6 95      [13]  154     ld (bool_vida), a
                            155 
   A434 DD E5         [15]  156     push ix
                            157 
   A436 CD F7 A3      [17]  158     call cambia_variables_IX_IY ; IX => Vida  y   IY => Player
   A439 CD D4 92      [17]  159     call entity_set4destruction ; Borramos vida
   A43C FD 7E 18      [19]  160     ld a, e_hp(iy)
   A43F FE 09         [ 7]  161     cp #9
   A441 28 03         [12]  162     jr z, maximo_alcanzado
   A443 FD 34 18      [23]  163         inc e_hp(iy) ;Incrementa la vida del player
   A446                     164     maximo_alcanzado:
                            165 
   A446 DD E1         [14]  166     pop ix
                            167     
   A448 C9            [10]  168 ret
                            169 
ASxxxx Assembler V02.00 + NoICE + SDCC mods  (Zilog Z80 / Hitachi HD64180), page 10.
Hexadecimal [16-Bits]



   A449                     170 suma_player_shot_al_que_dispare:
   A449 DD E5         [15]  171     push ix
   A44B DD 6E 19      [19]  172     ld l, e_perteneceL(ix)
   A44E DD 66 1A      [19]  173     ld h, e_perteneceH(ix)
   A451 22 81 A3      [16]  174     ld (registro_aux), hl
   A454 DD 2A 81 A3   [20]  175     ld ix, (registro_aux)
                            176     ;; Tenemos en IX el arquero
   A458 DD 36 13 00   [19]  177     ld e_player_shot(ix), #0x00
   A45C DD E1         [14]  178     pop ix
   A45E C9            [10]  179 ret
                            180 
   A45F                     181 shot_zombie:
                            182 
                            183     ; Comprobamos si IX=Zombie y IY=disparo
   A45F DD 7E 00      [19]  184     ld a, e_tipo(ix)
   A462 FE 02         [ 7]  185     cp #e_type_zombie
   A464 28 03         [12]  186     jr z, no_cambies_variables_IX_IY
                            187         ;; Si no es zombie
   A466 CD F7 A3      [17]  188         call cambia_variables_IX_IY
   A469                     189     no_cambies_variables_IX_IY:
                            190 
                            191     ;; IX => ZOMBIE
                            192     ;; IY => DISPARO
                            193 
   A469 3E 01         [ 7]  194     ld a, #0x01
   A46B 32 D5 95      [13]  195     ld (bool_muerte), a
                            196 
   A46E DD 7E 18      [19]  197     ld a, e_hp(ix)
   A471 FE 01         [ 7]  198     cp #1
   A473 C2 89 A4      [10]  199     jp nz, resta_vida_zombie
                            200         ;Si al restar la vida al zombie, esta muerto
   A476 CD D4 92      [17]  201         call entity_set4destruction
   A479 DD E5         [15]  202         push ix
   A47B FD E5         [15]  203         push iy
   A47D CD B2 9B      [17]  204         call incrementa_cont_bajas_enemigos ;; enemigos_muertos ++
   A480 FD E1         [14]  205         pop iy
   A482 DD E1         [14]  206         pop ix
   A484 CD 9B A4      [17]  207         call dropObject
   A487 18 08         [12]  208         jr zombie_vivo
                            209 
   A489                     210     resta_vida_zombie:
   A489 3D            [ 4]  211         dec a
   A48A DD 77 18      [19]  212         ld e_hp(ix), a
   A48D DD 36 1E 01   [19]  213         ld e_invencibilidad(ix), #1
                            214 
   A491                     215     zombie_vivo:
                            216     ;Si el zombie sigue vivo
   A491 CD F7 A3      [17]  217     call cambia_variables_IX_IY
   A494 CD D4 92      [17]  218     call entity_set4destruction
   A497 CD 49 A4      [17]  219     call suma_player_shot_al_que_dispare
                            220 
                            221 
   A49A C9            [10]  222 ret
                            223 
                            224 
ASxxxx Assembler V02.00 + NoICE + SDCC mods  (Zilog Z80 / Hitachi HD64180), page 11.
Hexadecimal [16-Bits]



   A49B                     225 dropObject:
                            226     ;; Creamos un arcoiris o vida con probabilidad
   A49B CD 5F B6      [17]  227     call cpct_getRandom_mxor_u8_asm ;; Destroys AF, BC, DE, HL
   A49E 7D            [ 4]  228     ld a, l
                            229   
   A49F F5            [11]  230     push af
   A4A0 FE 0A         [ 7]  231     cp #0x0A
   A4A2 D2 BD A4      [10]  232     jp nc, no_creamos_arco
                            233         ;; a = (0, 10) --> creamos arcoiris
   A4A5 11 72 95      [10]  234         ld de, #arcoiris
   A4A8 CD D0 96      [17]  235         call game_create_template ;; IX => Arcoiris
   A4AB FD 7E 02      [19]  236         ld a, e_x(iy)
   A4AE 3D            [ 4]  237         dec a
   A4AF 3D            [ 4]  238         dec a
   A4B0 DD 77 02      [19]  239         ld e_x(ix), a
                            240 
   A4B3 FD 7E 03      [19]  241         ld a, e_y(iy)
   A4B6 3D            [ 4]  242         dec a
   A4B7 3D            [ 4]  243         dec a
   A4B8 3D            [ 4]  244         dec a
   A4B9 3D            [ 4]  245         dec a
   A4BA DD 77 03      [19]  246         ld e_y(ix), a
                            247 
                            248         ;ld a, #0x08
                            249         ;ld e_x(ix), a
                            250         ;ld a, #0x94
                            251         ;ld e_y(ix), a
                            252 
                            253         ;; Actualizamos las posiciones del arcoiris (las ponemos a las del enemigo)
                            254          
   A4BD                     255     no_creamos_arco:
                            256 
   A4BD F1            [10]  257     pop af
   A4BE FE F7         [ 7]  258     cp #0xF7
   A4C0 DA D5 A4      [10]  259     jp c, no_creamos_vida
                            260         ;; a = (0, 10) --> creamos vida
   A4C3 11 92 95      [10]  261          ld de, #vida
   A4C6 CD D0 96      [17]  262         call game_create_template ;; IX => Vida
   A4C9 FD 7E 02      [19]  263         ld a, e_x(iy)
   A4CC DD 77 02      [19]  264         ld e_x(ix), a
   A4CF FD 7E 03      [19]  265         ld a, e_y(iy)
   A4D2 DD 77 03      [19]  266         ld e_y(ix), a
                            267         ;; Actualizamos las posiciones de la vida (las ponemos a las del enemigo)
                            268         
   A4D5                     269     no_creamos_vida:
   A4D5 C9            [10]  270 ret
                            271 
                            272 ;; Tabla de colisiones
   A4D6                     273 colisiones:
   A4D6 02 01               274     .db e_type_zombie, e_type_player   ;; OJO IX=player IY=Zombie (player siempre va antes en el bucle de la funcion ForAllPairs) 
   A4D8 83 A3               275         .dw enemy_player
                            276 
   A4DA 08 01               277     .db e_type_arcoiris, e_type_player ;; OJO IX=player IY=Arcoiris (player siempre va antes en el bucle de la funcion ForAllPairs) 
   A4DC 08 A4               278         .dw player_arcoiris
                            279 
ASxxxx Assembler V02.00 + NoICE + SDCC mods  (Zilog Z80 / Hitachi HD64180), page 12.
Hexadecimal [16-Bits]



   A4DE 04 02               280     .db e_type_shot, e_type_zombie
   A4E0 5F A4               281         .dw shot_zombie
                            282 
   A4E2 02 04               283     .db e_type_zombie, e_type_shot
   A4E4 5F A4               284         .dw shot_zombie
                            285 
   A4E6 10 01               286     .db e_type_vida, e_type_player 
   A4E8 2F A4               287         .dw player_vida
                            288 
   A4EA 04 01               289     .db e_type_shot, e_type_player
   A4EC C7 A3               290         .dw shotArcher_player
                            291 
   A4EE 00 00               292     .dw 0
                            293 
                            294 ;; ======================================
                            295 ;; COLISION ENTRE DOS ENTIDADES
                            296 ;; Input: IX => Entidad Colisionable n1
                            297 ;;        IY => Entidad Colisionable n2
                            298 ;; ======================================
   A4F0                     299 sys_collision_update_one_entity:
                            300     
                            301     ;; Comprobamos si E1 colisiona con E2 o al reves
   A4F0 DD 7E 10      [19]  302     ld a, e_collidesAgainst(ix)
   A4F3 FD A6 00      [19]  303     and e_tipo(iy)
   A4F6 47            [ 4]  304     ld b, a         ;; B = e1_col_e2
                            305 
   A4F7 FD 7E 10      [19]  306     ld a, e_collidesAgainst(iy)
   A4FA DD A6 00      [19]  307     and e_tipo(ix)  ; A = e2_col_e1
                            308 
   A4FD B0            [ 4]  309     or b            ;; e1_col_e2 | e2_col_e1
   A4FE FE 00         [ 7]  310     cp #0
   A500 C8            [11]  311     ret z  
                            312         
                            313 
                            314     ;; if (obs_x + obs_w <= player_x) --> no collision
                            315     ;; if (obs_x + obs_w - player_x <= 0
   A501 FD 7E 02      [19]  316     ld  a, e_x(iy)      ;; a = obs_X
   A504 FD 86 06      [19]  317     add e_w(iy)         ;; a = obs_X + obs_W
   A507 DD 96 02      [19]  318     sub e_x(ix)         ;; a = obs_X + obs_W - player_x
   A50A D6 01         [ 7]  319     sub #0x01
   A50C FA 9E A5      [10]  320     jp m, no_collision  ;; salto si es menor que cero
   A50F CA 9E A5      [10]  321     jp z, no_collision  ;; salto si es = 0 ( no modifica flags )
                            322 
                            323 
                            324     ;; if (obsY + obsH <= PlayerY) --> no collision
                            325     ;; if (obsY + obsH - PlayerY <= 0) --> no collision
   A512 FD 7E 03      [19]  326     ld a, e_y(iy)
   A515 FD 86 07      [19]  327     add e_h(iy)
   A518 DD 96 03      [19]  328     sub e_y(ix)
   A51B D6 04         [ 7]  329     sub #0x04
   A51D FA 9E A5      [10]  330     jp m, no_collision  ;; salto si es menor que cero
   A520 28 7C         [12]  331     jr z, no_collision  ;; salto si es = 0 ( no modifica flags )
                            332 
                            333 
                            334     ; if (playerX + playerW <= obs_x) --> no collision
ASxxxx Assembler V02.00 + NoICE + SDCC mods  (Zilog Z80 / Hitachi HD64180), page 13.
Hexadecimal [16-Bits]



                            335     ; playerX + playerW - obsX <= 0
   A522 DD 7E 02      [19]  336     ld a, e_x(ix)           ; a = playerX
   A525 DD 86 06      [19]  337     add a, e_w(ix)          ; a = playerX +  playeW
   A528 FD 96 02      [19]  338     sub e_x(iy)
   A52B D6 01         [ 7]  339     sub #0x01
   A52D FA 9E A5      [10]  340     jp m, no_collision
   A530 28 6C         [12]  341     jr z, no_collision
                            342 
                            343 
                            344     ; if (playerY + playerH <= obs_y) --> no collision
                            345     ; playerY + playerH - obs_y <= 0
   A532 DD 7E 03      [19]  346     ld a, e_y(ix)
   A535 DD 86 07      [19]  347     add a, e_h(ix)
   A538 FD 96 03      [19]  348     sub e_y(iy)
   A53B D6 04         [ 7]  349     sub #0x04
   A53D FA 9E A5      [10]  350     jp m, no_collision
   A540 28 5C         [12]  351     jr z, no_collision
                            352 
                            353 
                            354     ;; Si IX == IY no hago nada
   A542 FD 22 81 A3   [20]  355     ld (registro_aux), iy
   A546 DD 22 7F A3   [20]  356     ld (registro_hl), ix
   A54A 3A 02 00      [13]  357     ld a, (#registro_aux-#registro_hl)
   A54D FE 00         [ 7]  358     cp #0
   A54F C8            [11]  359     ret z
                            360 
                            361     ;; Si alguna de las 2 entidades en invencible (acaba de spawnear), no habrá colisiones entre ellas
   A550 DD 7E 1E      [19]  362     ld a, e_invencibilidad(ix)
   A553 FE 01         [ 7]  363     cp #1
   A555 C8            [11]  364     ret z
                            365 
   A556 FD 7E 1E      [19]  366     ld a, e_invencibilidad(iy)
   A559 FE 01         [ 7]  367     cp #1
   A55B C8            [11]  368     ret z
                            369 
                            370     ;; Collision
   A55C 21 D2 A4      [10]  371     ld hl, #colisiones-4
                            372 
   A55F                     373     recorrer_tabla:
                            374 
                            375         ;; HL += 4 (direccion de memoria)
   A55F 01 04 00      [10]  376         ld bc, #4
   A562 09            [11]  377         add hl, bc
                            378 
                            379         ; registro_hl => HL (direccion de memoria de TablaColisiones[i])
   A563 22 7F A3      [16]  380         ld (registro_hl), hl
                            381 
                            382         ; DE => (el valor de ColisionTabla[i])
   A566 DD E5         [15]  383         push ix
   A568 DD 2A 7F A3   [20]  384         ld ix, (registro_hl)
   A56C DD 56 00      [19]  385         ld d, 0(ix)
   A56F DD 5E 01      [19]  386         ld e, 1(ix)
   A572 DD E1         [14]  387         pop ix 
                            388 
                            389     
ASxxxx Assembler V02.00 + NoICE + SDCC mods  (Zilog Z80 / Hitachi HD64180), page 14.
Hexadecimal [16-Bits]



                            390         ;; Comprobamos si hemos llegado al final de la tabla de colisiones (con el valor)
   A574 7A            [ 4]  391         ld a, d     ; A = L
   A575 B3            [ 4]  392         or e        ; A = L | H 
   A576 C8            [11]  393         ret z       ; if (key=NULL) ret
                            394         
                            395         ; Si todavia queda por mirar alguna fila,
   A577 DD 7E 00      [19]  396         ld a, e_tipo(ix)    ;; / if( e_tipo(ix) == D )
   A57A BB            [ 4]  397         cp e                ;; \
   A57B 20 E2         [12]  398         jr nz, recorrer_tabla
                            399 
                            400         ;; e_tipo(ix) = D --> Ahora comprobamos si ¿e_tipo(iy) == E?
   A57D FD 7E 00      [19]  401         ld a, e_tipo(iy)    ;; / if( e_tipo(iy) == E )
   A580 BA            [ 4]  402         cp d                ;; \
   A581 20 DC         [12]  403         jr nz, recorrer_tabla
                            404 
                            405 
                            406         ;; Mis 2 entidades de IX e IY coinciden con la fila de la tabla de colisiones
                            407         ;; Ahora ejecutamos la funcion asociada
                            408         ;; El puntero HL debe apuntar a la direccion de memoria siguiente (+= 2)
                            409         ;inc hl
                            410         ;inc hl
   A583 01 02 00      [10]  411         ld bc, #2
   A586 09            [11]  412         add hl, bc
                            413 
                            414         ;; HL => PtrFuncion, pero queremos tener en HL SOLO la funcion (no el puntero). Entonces...
   A587 DD E5         [15]  415         push ix
   A589 22 7F A3      [16]  416         ld (registro_hl), hl
   A58C DD 2A 7F A3   [20]  417         ld ix, (registro_hl)    ; IX => HL
   A590 DD 6E 00      [19]  418         ld l, 0(ix)             ; / HL => Funcion
   A593 DD 66 01      [19]  419         ld h, 1(ix)             ; \
   A596 DD E1         [14]  420         pop ix                  ; IX => Entidad1 (como antes)
                            421 
   A598 11 9E A5      [10]  422         ld de, #funcion_colision_ya_ejecutada   ;; /  Meto en la pila la dirección a la que quiero que vuelva despues de que
   A59B D5            [11]  423         push de  
                            424 
   A59C E9            [ 4]  425         jp (hl)     ;; Saltamps a la funcion
                            426      
   A59D C9            [10]  427     ret
                            428 
   A59E                     429     no_collision:
                            430      
                            431     
   A59E                     432     funcion_colision_ya_ejecutada:
   A59E C9            [10]  433 ret
                            434 
                            435 
   A59F                     436 sys_collision_update:
   A59F 21 F0 A4      [10]  437     ld hl, #sys_collision_update_one_entity
   A5A2 06 20         [ 7]  438     ld b, #e_cmp_collider
   A5A4 CD 7E 92      [17]  439     call entity_doForAll_pairs_matching
   A5A7 C9            [10]  440 ret 
                            441 
