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



                              1 .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 2.
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 3.
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 4.
Hexadecimal [16-Bits]



                              2 .include "man/animations.h.s"
                              1 .globl player1_wait_down
                              2 .globl player2_wait_down
                              3 .globl zombie_walk_down
                              4 .globl pato_walk_down
                              5 .globl topo_walk_down
                              6 .globl cangrejo_walk_down
                              7 .globl fantasma_wait_down
                              8 .globl canion2_walk_down
                              9 .globl shot_muere
                             10 .globl vida_objeto
                             11 .globl arcoiris_objeto
                             12 .globl boss_walk
                             13 
                             14 .globl animations_zombie_array
                             15 .globl animations_player1_array
                             16 .globl animations_player2_array
                             17 .globl animations_getAnimHL
                             18 .globl animations_shot_array
                             19 .globl animations_pato_array
                             20 .globl animations_topo_array
                             21 .globl animations_canion2_array
                             22 .globl animations_cangrejo_array
                             23 .globl animations_fantasma_array
                             24 .globl animations_vida_array
                             25 .globl animations_arcoiris_array
                             26 .globl animations_boss_array
ASxxxx Assembler V02.00 + NoICE + SDCC mods  (Zilog Z80 / Hitachi HD64180), page 5.
Hexadecimal [16-Bits]



                              3 
                              4 ;; 0000 -- muerte
                              5 ;; 0001 -- down
                              6 ;; 0010 -- up
                              7 ;; 0011 -- left
                              8 ;; 0100 -- right
                              9 ;; 0101 -- s. down
                             10 ;; 0110 -- s. down 
                             11 ;; 0111 -- s. left 
                             12 ;; 1000 -- s. right 
                             13 ;; 1001 -- ataque down
                             14 ;; 1010 -- ataque up
                             15 ;; 1011 -- ataque left
                             16 ;; 1100 -- ataque right
                             17 ;; 1101 -- invencible
   A26A                      18 animations_calculate_status:
   A26A 06 01         [ 7]   19     ld b, #0x01        ;; estado base
                             20 
                             21     ;; MUERTA O MURIENDO
   A26C DD 7E 00      [19]   22     ld a, e_tipo(ix)
   A26F FE 80         [ 7]   23     cp #e_type_dead
   A271 20 03         [12]   24     jr nz, noMuerta
   A273 06 00         [ 7]   25         ld b, #0x00
   A275 C9            [10]   26         ret
   A276                      27     noMuerta:
                             28 
                             29     ;; INVENCIBLE
   A276 DD 7E 1E      [19]   30     ld a, e_invencibilidad(ix)
   A279 FE 01         [ 7]   31     cp #1
   A27B 20 03         [12]   32     jr nz, noInvencible
   A27D 06 0D         [ 7]   33         ld b, #0x0D
   A27F C9            [10]   34         ret
   A280                      35     noInvencible:
                             36 
                             37     ;; VELOCIDADES
   A280 DD 7E 05      [19]   38     ld a, e_vy(ix)   ;; cargo la velocidad de y
   A283 FE 00         [ 7]   39     cp #0
   A285 28 1F         [12]   40     jr z, vyzero    ;; miro si es 0
   A287                      41     vynozero:
   A287 FA 98 A2      [10]   42         jp m, vynegative ;; comrpuebo el signo
   A28A                      43     vypositive: ;; si es positiva
   A28A DD 7E 1F      [19]   44         ld a, e_atacando(ix)
   A28D FE 00         [ 7]   45         cp #0
   A28F CA 95 A2      [10]   46         jp z, sinataquevyp
   A292                      47         conataquevyp:
   A292 06 09         [ 7]   48             ld b, #0x09
   A294 C9            [10]   49             ret
   A295                      50         sinataquevyp:
   A295 06 01         [ 7]   51         ld b, #0x01
   A297 C9            [10]   52         ret
   A298                      53     vynegative: ;; si es negativa
   A298 DD 7E 1F      [19]   54         ld a, e_atacando(ix)
   A29B FE 00         [ 7]   55         cp #0
   A29D CA A3 A2      [10]   56         jp z, sinataquevyn
   A2A0                      57         conataquevyn:
ASxxxx Assembler V02.00 + NoICE + SDCC mods  (Zilog Z80 / Hitachi HD64180), page 6.
Hexadecimal [16-Bits]



   A2A0 06 0A         [ 7]   58             ld b, #0x0A
   A2A2 C9            [10]   59             ret
   A2A3                      60         sinataquevyn:
   A2A3 06 02         [ 7]   61         ld b, #0x02
   A2A5 C9            [10]   62         ret
   A2A6                      63     vyzero:
                             64 
                             65     ;; compruebo las velocidad en x si no hay en y
   A2A6 DD 7E 04      [19]   66     ld a, e_vx(ix) ;; cargo la direccion en x
   A2A9 FE 00         [ 7]   67     cp #0
   A2AB 28 1F         [12]   68     jr z, vxzero    ;; miro si es 0
   A2AD                      69     vxnozero: 
   A2AD FA BE A2      [10]   70         jp m, vxnegative ;; comrpuebo el signo
   A2B0                      71     vxpositive:     ;; si es positiva
   A2B0 DD 7E 1F      [19]   72         ld a, e_atacando(ix)
   A2B3 FE 00         [ 7]   73         cp #0
   A2B5 CA BB A2      [10]   74         jp z, sinataquevxp
   A2B8                      75         conataquevxp:
   A2B8 06 0C         [ 7]   76             ld b, #0x0C
   A2BA C9            [10]   77             ret
   A2BB                      78         sinataquevxp:
   A2BB 06 04         [ 7]   79         ld b, #0x04
   A2BD C9            [10]   80         ret
   A2BE                      81     vxnegative:     ;; si es negativa
   A2BE DD 7E 1F      [19]   82         ld a, e_atacando(ix)
   A2C1 FE 00         [ 7]   83         cp #0
   A2C3 CA C9 A2      [10]   84         jp z, sinataquevxn
   A2C6                      85         conataquevxn:
   A2C6 06 0B         [ 7]   86             ld b, #0x0B
   A2C8 C9            [10]   87             ret
   A2C9                      88         sinataquevxn:
   A2C9 06 03         [ 7]   89         ld b, #0x03
   A2CB C9            [10]   90         ret
   A2CC                      91     vxzero:
                             92 
                             93 
                             94     ;;DIRECCIONES
   A2CC DD 7E 12      [19]   95     ld a, e_last_dirY(ix)   ;; cargo la velocidad de y
   A2CF FE 00         [ 7]   96     cp #0
   A2D1 28 19         [12]   97     jr z, dyzero    ;; miro si es 0
   A2D3                      98     dynozero:
   A2D3 FA E1 A2      [10]   99         jp m, dynegative ;; comrpuebo el signo
   A2D6                     100     dypositive: ;; si es positiva
   A2D6 DD 7E 1F      [19]  101         ld a, e_atacando(ix)
   A2D9 FE 00         [ 7]  102         cp #0
   A2DB C2 92 A2      [10]  103         jp nz, conataquevyp
                            104 
   A2DE 06 05         [ 7]  105         ld b, #0x05
   A2E0 C9            [10]  106         ret
   A2E1                     107     dynegative: ;; si es negativa
   A2E1 DD 7E 1F      [19]  108         ld a, e_atacando(ix)
   A2E4 FE 00         [ 7]  109         cp #0
   A2E6 C2 A0 A2      [10]  110         jp nz, conataquevyn
                            111 
   A2E9 06 06         [ 7]  112         ld b, #0x06
ASxxxx Assembler V02.00 + NoICE + SDCC mods  (Zilog Z80 / Hitachi HD64180), page 7.
Hexadecimal [16-Bits]



   A2EB C9            [10]  113         ret
   A2EC                     114     dyzero:
                            115 
                            116     ;; compruebo las direcciones para ver su orientacion en x si no hay en y
   A2EC DD 7E 11      [19]  117     ld a, e_last_dir(ix) ;; cargo la direccion en x
   A2EF FE 00         [ 7]  118     cp #0
   A2F1 28 18         [12]  119     jr z, dxzero    ;; miro si es 0
   A2F3                     120     dxnozero: 
   A2F3 FA 01 A3      [10]  121         jp m, dxnegative ;; comrpuebo el signo
   A2F6                     122     dxpositive:     ;; si es positiva
   A2F6 DD 7E 1F      [19]  123         ld a, e_atacando(ix)
   A2F9 FE 00         [ 7]  124         cp #0
   A2FB C2 B8 A2      [10]  125         jp nz, conataquevxp
                            126 
   A2FE 06 08         [ 7]  127         ld b, #0x08
   A300 C9            [10]  128         ret
   A301                     129     dxnegative:     ;; si es negativa
   A301 DD 7E 1F      [19]  130         ld a, e_atacando(ix)
   A304 FE 00         [ 7]  131         cp #0
   A306 C2 C6 A2      [10]  132         jp nz, conataquevxn
                            133 
   A309 06 07         [ 7]  134         ld b, #0x07
   A30B                     135     dxzero:
   A30B C9            [10]  136 ret
                            137 
   A30C                     138 animations_update_one:
   A30C CD 6A A2      [17]  139     call animations_calculate_status ;; devuelve en b el estado de la animacion
                            140 
   A30F DD 7E 0E      [19]  141     ld a, e_anim_st(ix)
   A312 B8            [ 4]  142     cp b
   A313 28 23         [12]  143     jr z, continuoAnim  ;; si los estados son iguales continuo, sino cambio la animacion de la entidad
   A315                     144     newAnimationStatus:
   A315 DD 7E 1D      [19]  145         ld a, e_anim_especial(ix) ;; miro si es animacion especial (muerte, ataque o invencible)
   A318 FE 00         [ 7]  146         cp #0
   A31A C2 38 A3      [10]  147         jp nz, continuoAnim ;; si es 1, es especial y no la cambio
                            148 
   A31D DD 70 0E      [19]  149         ld e_anim_st(ix),b ;; actualizo estado
   A320 CD C0 8C      [17]  150         call animations_getAnimHL ;; devuelve en hl el puntero a la animacion que toca
                            151 
   A323 DD 75 0C      [19]  152         ld e_animL(ix), l   ;; guardo el puntero de animacion segun el estado
   A326 DD 74 0D      [19]  153         ld e_animH(ix), h
                            154 
                            155         ;;si el nuevo estado es especial pongo el anim especial a 1 (muerte, ataque o invencible)
   A329 78            [ 4]  156         ld a, b
   A32A FE 00         [ 7]  157         cp #0 ;;muerte
   A32C CA 34 A3      [10]  158         jp z, newEspecial
   A32F                     159         noMuerte:
   A32F FE 09         [ 7]  160             cp #0x09 ;; a partir del 9 son ataque e invencible
   A331 FA 38 A3      [10]  161             jp m, continuoAnim ;; si el resultado es negativo es una animacion normal
   A334                     162         newEspecial:
   A334 DD 36 1D 01   [19]  163             ld e_anim_especial(ix), #1 ;; actualizo valor especial si el estado es mayor que 8
                            164 
   A338                     165     continuoAnim:
   A338 DD 7E 0F      [19]  166     ld a, e_animCounter(ix) ;; compruebo si toca pasar de frame o todavia no
   A33B 3D            [ 4]  167     dec a
ASxxxx Assembler V02.00 + NoICE + SDCC mods  (Zilog Z80 / Hitachi HD64180), page 8.
Hexadecimal [16-Bits]



   A33C FE 00         [ 7]  168     cp #0
   A33E C2 72 A3      [10]  169     jp nz, noCambioFrame
   A341                     170         cambioFrame:
   A341 DD 36 0F 0C   [19]  171         ld e_animCounter(ix), #0x0C ;; reseteo contador de animacion
                            172 
   A345 DD 6E 0C      [19]  173         ld l, e_animL(ix) ;;paso actual en la animacion
   A348 DD 66 0D      [19]  174         ld h, e_animH(ix)
                            175 
   A34B                     176         returnAnim:
   A34B 4E            [ 7]  177             ld c, (hl)  ;;  
   A34C 23            [ 6]  178             inc hl      ;; bc = actual sprite
   A34D 46            [ 7]  179             ld b, (hl)  ;; 
   A34E 23            [ 6]  180             inc hl      ;; hl +=2 puntero al siguiemte paso de la animacion
                            181 
   A34F 79            [ 4]  182             ld a, c         ;; si el sprite actual es null reseteo animacion
   A350 B0            [ 4]  183             or b
   A351 28 0D         [12]  184             jr z, resetAnim
   A353 DD 75 0C      [19]  185                 ld e_animL(ix), l   ;; guardo puntero a la siguiente animacion
   A356 DD 74 0D      [19]  186                 ld e_animH(ix), h
                            187 
   A359 DD 71 08      [19]  188                 ld e_spriteL(ix), c ;; guardo puntero al siguiente sprite
   A35C DD 70 09      [19]  189                 ld e_spriteH(ix), b
                            190 
   A35F C9            [10]  191                 ret
                            192 
   A360                     193             resetAnim:
   A360 DD 36 1F 00   [19]  194                 ld e_atacando(ix), #0
   A364 DD 36 1D 00   [19]  195                 ld e_anim_especial(ix), #0 ;; al terminar la animacion ya puede cambiar a otra
   A368 DD 36 1E 00   [19]  196                 ld e_invencibilidad(ix), #0 ;; al terminar la animacion ya puede cambiar a otra
                            197 
   A36C 7E            [ 7]  198                 ld a, (hl)  ;; cargo en hl donde apuntaba hl
   A36D 23            [ 6]  199                 inc hl
   A36E 66            [ 7]  200                 ld h, (hl)
   A36F 6F            [ 4]  201                 ld l, a
   A370 18 D9         [12]  202                 jr returnAnim
   A372                     203     noCambioFrame:
   A372 DD 77 0F      [19]  204         ld e_animCounter(ix), a ;; modifico contador de animacion
                            205 
   A375 C9            [10]  206 ret
                            207 
   A376                     208 animations_update:
   A376 21 0C A3      [10]  209     ld hl, #animations_update_one
   A379 06 10         [ 7]  210     ld b, #e_cmp_animated
   A37B CD 4F 92      [17]  211     call entity_doForAll_matching
   A37E C9            [10]  212 ret
