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



                              1 .include "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 "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 5.
Hexadecimal [16-Bits]



                              3 .include "hud.h.s"
                              1 .globl hud_init
                              2 .globl hud_update
                              3 .globl hud_actualiza_bajas
                              4 .globl hud_actualiza_num_max_enemigos_ronda
                              5 .globl hud_reinicia_enemigos_maximo
                              6 .globl cpct_setDrawCharM0_asm
                              7 .globl cpct_drawStringM0_asm
                              8 .globl cpct_drawSprite_asm
ASxxxx Assembler V02.00 + NoICE + SDCC mods  (Zilog Z80 / Hitachi HD64180), page 6.
Hexadecimal [16-Bits]



                              4 
                              5 .globl bool_multijugador
                              6 
   9C28 33                    7 string_vidas_player:   .ascii '3'
   9C29 00                    8                        .ascii '\0'
                              9 
   9C2A 30                   10 string_bajas_enemigos_decenas:      .ascii '0'
   9C2B 00                   11                                     .ascii '\0'
   9C2C 30                   12 string_bajas_enemigos_unidades:     .ascii '0'
   9C2D 2F 00                13                                     .ascii '/\0'
                             14 
   9C2F 30                   15 string_max_enemigo_ronda_decenas:   .ascii '0'
   9C30 00                   16                                     .ascii '\0'
   9C31 38                   17 string_max_enemigo_ronda_unidades:  .ascii '8'
   9C32 00                   18                                     .ascii '\0'                    
                             19 
   9C33 33                   20 string_vidas_player2:  .ascii '3'
   9C34 00                   21                        .ascii '\0'
                             22 
                             23 .globl _spr_vida2
   9C35                      24 hud_init:
   9C35 2E 0F         [ 7]   25     ld l, #15  ;; color letra
   9C37 26 02         [ 7]   26     ld h, #2  ;; color fondo
   9C39 CD 85 B6      [17]   27     call cpct_setDrawCharM0_asm
                             28 
   9C3C 3E 33         [ 7]   29     ld a, #0x33 ;; 3 vidas + (30ascii)
   9C3E 32 28 9C      [13]   30     ld (string_vidas_player), a
   9C41 FD 21 28 9C   [14]   31     ld iy, #string_vidas_player
   9C45 21 0D C0      [10]   32     ld hl, #0xC00D	
   9C48 CD 58 B3      [17]   33     call  cpct_drawStringM0_asm
                             34 
   9C4B 3A BE 96      [13]   35     ld a, (bool_multijugador)
   9C4E FE 00         [ 7]   36     cp #0
   9C50 28 1B         [12]   37     jr z, no_player2
                             38         ;; VIDAS PLAYER 2
                             39         ;;pinto corazon
   9C52 11 12 C0      [10]   40         ld de, #0xC012
   9C55 21 D0 15      [10]   41         ld hl, #_spr_vida2
   9C58 01 04 08      [10]   42         ld bc, #0x0804
   9C5B CD E2 B3      [17]   43         call cpct_drawSprite_asm
                             44 
   9C5E 3E 33         [ 7]   45         ld a, #0x33 ;; 3 vidas + (30ascii)
   9C60 32 33 9C      [13]   46         ld (string_vidas_player2), a
   9C63 FD 21 28 9C   [14]   47         ld iy, #string_vidas_player
   9C67 21 16 C0      [10]   48         ld hl, #0xC016
   9C6A CD 58 B3      [17]   49         call  cpct_drawStringM0_asm
   9C6D                      50     no_player2:
                             51 
                             52     ; Ejemplo 08/23
                             53     ;; Decenas (0) --> 4 BYTES
   9C6D 3E 30         [ 7]   54     ld a, #0x30
   9C6F 32 2A 9C      [13]   55     ld (string_bajas_enemigos_decenas), a
   9C72 CD 48 9D      [17]   56     call dibuja_string_bajas_enemigos_decenas
                             57 
                             58     ;; Unidades (8/) --> 4 BYTES + 4 BYTES
ASxxxx Assembler V02.00 + NoICE + SDCC mods  (Zilog Z80 / Hitachi HD64180), page 7.
Hexadecimal [16-Bits]



   9C75 3E 30         [ 7]   59     ld a, #0x30
   9C77 32 2C 9C      [13]   60     ld (string_bajas_enemigos_unidades), a
   9C7A CD 53 9D      [17]   61     call dibuja_string_bajas_enemigos_unidades
                             62 
                             63     ;; Decenas (2) --> 4 BYTES
                             64     ;ld a, #0x30
                             65     ;ld (string_max_enemigo_ronda_decenas), a
   9C7D FD 21 2F 9C   [14]   66     ld iy, #string_max_enemigo_ronda_decenas
   9C81 21 3E C0      [10]   67     ld hl, #0xC03E	
   9C84 CD 58 B3      [17]   68     call  cpct_drawStringM0_asm
                             69     
                             70     ;; Unidades (3) --> 4 BYTES
                             71     ;ld a, #0x34
                             72     ;ld (string_max_enemigo_ronda_unidades), a
   9C87 FD 21 31 9C   [14]   73     ld iy, #string_max_enemigo_ronda_unidades
   9C8B 21 42 C0      [10]   74     ld hl, #0xC042	
   9C8E CD 58 B3      [17]   75     call  cpct_drawStringM0_asm
   9C91 C9            [10]   76 ret
                             77 
   9C92                      78 hud_reinicia_enemigos_maximo:
   9C92 3E 30         [ 7]   79     ld a, #0x30
   9C94 32 2F 9C      [13]   80     ld (string_max_enemigo_ronda_decenas), a
   9C97 3E 38         [ 7]   81     ld a, #0x38
   9C99 32 31 9C      [13]   82     ld (string_max_enemigo_ronda_unidades), a
   9C9C C9            [10]   83 ret
                             84 
                             85 
   9C9D                      86 hud_update:
                             87     ; Actualizamos variable string VIDAS
   9C9D DD 21 F6 8F   [14]   88     ld ix, #entity_vector
   9CA1 DD 7E 18      [19]   89     ld a, e_hp(ix)  ;; A = Vidas_player
   9CA4 C6 30         [ 7]   90     add #0x30       ;; A = A + 30  (30 es donde empieza el 0 en ASCII)
   9CA6 32 28 9C      [13]   91     ld (string_vidas_player), a
                             92 
                             93     ; Dibujamos en el HUD el texto VIDAS
   9CA9 FD 21 28 9C   [14]   94     ld iy, #string_vidas_player
   9CAD 21 0D C0      [10]   95     ld hl, #0xC00D	
   9CB0 CD 58 B3      [17]   96     call  cpct_drawStringM0_asm
                             97 
                             98 
                             99 
   9CB3 3A BE 96      [13]  100     ld a, (bool_multijugador)
   9CB6 FE 00         [ 7]  101     cp #0
   9CB8 28 15         [12]  102     jr z, no_second_player
                            103         ;; Si hay player2
                            104         ; Actualizamos variable string VIDAS
   9CBA CD E8 93      [17]  105         call getEntity2
   9CBD DD 7E 18      [19]  106         ld a, e_hp(ix)  ;; A = Vidas_player
   9CC0 C6 30         [ 7]  107         add #0x30       ;; A = A + 30  (30 es donde empieza el 0 en ASCII)
   9CC2 32 33 9C      [13]  108         ld (string_vidas_player2), a
                            109 
                            110         ; Dibujamos en el HUD el texto VIDAS
   9CC5 FD 21 33 9C   [14]  111         ld iy, #string_vidas_player2
   9CC9 21 16 C0      [10]  112         ld hl, #0xC016	
   9CCC CD 58 B3      [17]  113         call  cpct_drawStringM0_asm
ASxxxx Assembler V02.00 + NoICE + SDCC mods  (Zilog Z80 / Hitachi HD64180), page 8.
Hexadecimal [16-Bits]



                            114         
   9CCF                     115     no_second_player:
                            116 
   9CCF C9            [10]  117 ret
                            118 
                            119 
                            120 
                            121 
   9CD0                     122 hud_actualiza_bajas:
   9CD0 3A 2C 9C      [13]  123     ld a, (string_bajas_enemigos_unidades) ;; A = num_enemigos(ascii)
   9CD3 D6 30         [ 7]  124     sub #0x30                              ;; A = num_enemigos(hex)
   9CD5 C6 01         [ 7]  125     add #01                                ;; A = A + 1 
   9CD7 FE 0A         [ 7]  126     cp #0x0A
   9CD9 20 15         [12]  127     jr nz, no_acarreo
                            128         ;; Si hemos llegado a (10)dec = (0A)hex
   9CDB 3E 00         [ 7]  129         ld a, #0
   9CDD C6 30         [ 7]  130         add #0x30                              ;; A = num_enemigos(ascii)
   9CDF 32 2C 9C      [13]  131         ld (string_bajas_enemigos_unidades), a
                            132 
                            133         ;; Sumamos uno a las decenas
   9CE2 3A 2A 9C      [13]  134         ld a, (string_bajas_enemigos_decenas)
   9CE5 D6 30         [ 7]  135         sub #0x30
   9CE7 C6 01         [ 7]  136         add #0x01
   9CE9 C6 30         [ 7]  137         add #0x30
   9CEB 32 2A 9C      [13]  138         ld (string_bajas_enemigos_decenas), a
                            139 
   9CEE 18 05         [12]  140         jr ya_hemos_sumado_bajas
                            141 
   9CF0                     142     no_acarreo:
   9CF0 C6 30         [ 7]  143     add #0x30                              ;; A = num_enemigos(ascii)
   9CF2 32 2C 9C      [13]  144     ld (string_bajas_enemigos_unidades), a
                            145     
                            146 
   9CF5                     147     ya_hemos_sumado_bajas:
                            148 
                            149     ;; Actualizamos numero de enemigos derrotados en el HUD (UNIDADES)
   9CF5 FD 21 2C 9C   [14]  150     ld iy, #string_bajas_enemigos_unidades
   9CF9 21 36 C0      [10]  151     ld hl, #0xC036	
   9CFC CD 58 B3      [17]  152     call  cpct_drawStringM0_asm
                            153 
                            154     ;; Actualizamos numero de enemigos derrotados en el HUD (DECENAS)
   9CFF FD 21 2A 9C   [14]  155     ld iy, #string_bajas_enemigos_decenas
   9D03 21 32 C0      [10]  156     ld hl, #0xC032	
   9D06 CD 58 B3      [17]  157     call  cpct_drawStringM0_asm
                            158 
   9D09 C9            [10]  159 ret
                            160 
                            161 
                            162 ;; ===========================================
                            163 ;;  Input: HL => ptr_num_enemigos_por_ronda
                            164 ;; ===========================================
   9D0A                     165 hud_actualiza_num_max_enemigos_ronda:
                            166     ;; Dibujar en el HUD el número de enemigos de la ronda siguiente
   9D0A 7E            [ 7]  167     ld a, (hl)  ;; a = num_enemigos(hex)  => 5A por ejemplo =  26 
   9D0B 06 00         [ 7]  168     ld b, #0x00
ASxxxx Assembler V02.00 + NoICE + SDCC mods  (Zilog Z80 / Hitachi HD64180), page 9.
Hexadecimal [16-Bits]



                            169 
   9D0D                     170     bucle_resta:
   9D0D 04            [ 4]  171         inc b
   9D0E D6 0A         [ 7]  172         sub #0x0A
   9D10 F2 0D 9D      [10]  173     jp p, bucle_resta
   9D13 C6 0A         [ 7]  174     add a, #0x0A
   9D15 05            [ 4]  175     dec b
                            176 
   9D16 F5            [11]  177     push af  ;; 
                            178 
   9D17 78            [ 4]  179     ld a, b
   9D18 C6 30         [ 7]  180     add #0x30
   9D1A 32 2F 9C      [13]  181     ld (string_max_enemigo_ronda_decenas), a
                            182 
                            183     ;; Decenas (2) --> 4 BYTES
   9D1D FD 21 2F 9C   [14]  184     ld iy, #string_max_enemigo_ronda_decenas
   9D21 21 3E C0      [10]  185     ld hl, #0xC03E	
   9D24 CD 58 B3      [17]  186     call  cpct_drawStringM0_asm
                            187 
                            188     ;; Recupero el numero para las unidades
   9D27 F1            [10]  189     pop af
                            190 
   9D28 C6 30         [ 7]  191     add #0x30
   9D2A 32 31 9C      [13]  192     ld (string_max_enemigo_ronda_unidades), a
                            193 
                            194     ;; Unidades (2) --> 4 BYTES
   9D2D FD 21 31 9C   [14]  195     ld iy, #string_max_enemigo_ronda_unidades
   9D31 21 42 C0      [10]  196     ld hl, #0xC042	
   9D34 CD 58 B3      [17]  197     call  cpct_drawStringM0_asm
                            198 
                            199     ;; El contador lo ponemos a 00
   9D37 3E 30         [ 7]  200     ld a, #0x30
   9D39 32 2A 9C      [13]  201     ld (string_bajas_enemigos_decenas), a
   9D3C CD 48 9D      [17]  202     call dibuja_string_bajas_enemigos_decenas
                            203 
   9D3F 3E 30         [ 7]  204     ld a, #0x30
   9D41 32 2C 9C      [13]  205     ld (string_bajas_enemigos_unidades), a
   9D44 CD 53 9D      [17]  206     call dibuja_string_bajas_enemigos_unidades
                            207     
   9D47 C9            [10]  208 ret
                            209 
                            210 
                            211 
   9D48                     212 dibuja_string_bajas_enemigos_decenas:
                            213     ;; Decenas (0) --> 4 BYTES
   9D48 FD 21 2A 9C   [14]  214     ld iy, #string_bajas_enemigos_decenas
   9D4C 21 32 C0      [10]  215     ld hl, #0xC032	
   9D4F CD 58 B3      [17]  216     call  cpct_drawStringM0_asm
   9D52 C9            [10]  217 ret
                            218 
   9D53                     219 dibuja_string_bajas_enemigos_unidades:
                            220     ;; Unidades (8/) --> 4 BYTES + 4 BYTES
   9D53 FD 21 2C 9C   [14]  221     ld iy, #string_bajas_enemigos_unidades
   9D57 21 36 C0      [10]  222     ld hl, #0xC036	
   9D5A CD 58 B3      [17]  223     call  cpct_drawStringM0_asm
ASxxxx Assembler V02.00 + NoICE + SDCC mods  (Zilog Z80 / Hitachi HD64180), page 10.
Hexadecimal [16-Bits]



   9D5D C9            [10]  224 ret
