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



                              1 .include "entity_manager.h.s"
                              1 ; --------------------------------------
                              2 ;; ARCHIVO DE CABECERA DEL ENTITY MANAGER
                              3 ;; --------------------------------------
                              4 
                              5 ;; FUNCIONES PUBLICAS
                              6 .globl entity_manager_create 
                              7 .globl entity_manager_getEntityArray
                              8 .globl entity_manager_destroy_entity
                              9 .globl entity_manager_update
                             10 .globl entity_manager_forall_matching
                             11 
                             12 ;; CONSTANTES
                     0007    13 max_entities = 7
                     0011    14 sizeof_e = 17
                             15 
                             16 
                             17 ;; Macro que define una entidad con todos sus componentes
                             18 .macro DefineEntity _name, _x, _y, _w, _h, _vx, _vy, _sprite_pointer, _cmp, _ai_st
                             19 _name::
                             20     .db     _x                  ;; Posición x de la entidad
                             21     .db     _y                  ;; Posición y de la entidad
                             22     .db     _w                  ;; Ancho de la entidad
                             23     .db     _h                  ;; Altura de la entidad
                             24     .db     _vx                 ;; Velocidad en el eje x
                             25     .db     _vy                 ;; Velocidad en el eje y
                             26     .dw     _sprite_pointer     ;; Puntero a la zona de memoria donde empieza el sprite
                             27     .dw     0x0000
                             28     .db     0x00, 0x00          ;; AI-aim  (AI apunta a x) (AI apunta a y)
                             29     .db     _cmp                ;; Componentes de la entidad
                             30     .db     _ai_st              ;; AI (estado)
                             31     .db     _ai_st              ;; AI (estado anterior)
                             32     .dw     0x0000              ;; Next AI  patrol-step ()
                             33 .endm
                             34 
                             35 ;; Variables auxiliares para mayor legibilidad
                             36 ;; del código al usar el registro puntero IX
                     0000    37 e_x  = 0
                     0001    38 e_y  = 1
                     0002    39 e_w  = 2
                     0003    40 e_h  = 3
                     0004    41 e_vx = 4
                     0005    42 e_vy = 5
                     0006    43 e_sprite_pointer_l = 6
                     0007    44 e_sprite_pointer_h = 7
                     0008    45 e_last_sprite_pointer_position_l = 8
                     0009    46 e_last_sprite_pointer_position_h = 9
                     000A    47 e_ai_aim_x = 10
                     000B    48 e_ai_aim_y = 11
                     000C    49 e_cmp = 12
                     000D    50 e_ai = 13
                     000E    51 e_ai_pre = 14
                     000F    52 e_ai_patrol_step_l = 15
                     0010    53 e_ai_patrol_step_h = 16
                             54 
ASxxxx Assembler V02.00 + NoICE + SDCC mods  (Zilog Z80 / Hitachi HD64180), page 2.
Hexadecimal [16-Bits]



                             55 ;;ENTITY COMPONENTS
                     0000    56 e_cmp_invalid = 0x00
                     0001    57 e_cmp_alive = 0x01
                     0002    58 e_cmp_physics = 0x02
                     0004    59 e_cmp_render = 0x04
                     0008    60 e_cmp_colision = 0x08
                     000F    61 e_cmp_default = e_cmp_render | e_cmp_physics | e_cmp_alive | e_cmp_colision
                             62 
                             63 ;;AI ESTADO
                     0000    64 e_ai_st_noAI = 0x00
                     0001    65 e_ai_st_stand_by = 0x01
                     0002    66 e_ai_st_move_to = 0x02
                     0003    67 e_ai_st_patrol = 0x03
ASxxxx Assembler V02.00 + NoICE + SDCC mods  (Zilog Z80 / Hitachi HD64180), page 3.
Hexadecimal [16-Bits]



                              2 
                              3 
   4505 00                    4 _num_entities:: .db 0
   4506 08 45                 5 _last_elem_ptr:: .dw _entity_array
   4508                       6 _entity_array::
   4508                       7     .ds max_entities*sizeof_e
                              8 
   457F 03                    9 _player_lives:: .db 3
   4580 10                   10 _player_invuln_sec:: .db 10000 ; nº ciclos para volver a tener colisiones
                             11 
   4581                      12 entity_manager_getEntityArray:
   4581 DD 21 08 45   [14]   13     ld      ix, #_entity_array
   4585 3A 05 45      [13]   14     ld      a, (_num_entities)
   4588 C9            [10]   15     ret
                             16 
                             17 
                             18 ;;=========================================================================
                             19 ;; Crea una nueva entidad
                             20 ;; Input:
                             21 ;;      HL : Puntero a la zona de memoria donde se encuentran los datos de la nueva entidad
                             22 ;; Destroy:
                             23 ;;      AF, BC, HL, DE
                             24 ;; Return:
                             25 ;;      
                             26 ;;=========================================================================
   4589                      27 entity_manager_create::
   4589 ED 5B 06 45   [20]   28     ld      de, (_last_elem_ptr)
   458D 01 11 00      [10]   29     ld      bc, #sizeof_e
   4590 ED B0         [21]   30     ldir
                             31 
                             32     ;; Incrementamos el número de entidades
   4592 3A 05 45      [13]   33     ld      a, (_num_entities)
   4595 3C            [ 4]   34     inc     a
                             35 
                             36     ;; Comprobar el num max de entidades
   4596 FE 07         [ 7]   37     cp  #max_entities
   4598 C8            [11]   38     ret z ; salimos si ha alcanzado el num max de entidades
                             39 
   4599 32 05 45      [13]   40     ld      (_num_entities), a
                             41 
                             42     ;; Incrementamos el puntero al último elemento
   459C 2A 06 45      [16]   43     ld      hl, (_last_elem_ptr) ;; Cargamos en hl el valor contenido por _last_elem_ptr
   459F 01 11 00      [10]   44     ld      bc, #sizeof_e
   45A2 09            [11]   45     add     hl, bc
   45A3 22 06 45      [16]   46     ld      (_last_elem_ptr), hl
                             47 
   45A6 C9            [10]   48     ret 
                             49 
                             50 
                             51 ;;===========================================================
                             52 ;; Marca las entidades como invalidas
                             53 ;; Input:
                             54 ;;      IX : Puntero a la zona de memoria donde se encuentra la entidad a destruir
                             55 ;; Destroy:
                             56 ;;      
ASxxxx Assembler V02.00 + NoICE + SDCC mods  (Zilog Z80 / Hitachi HD64180), page 4.
Hexadecimal [16-Bits]



                             57 ;; Return:
                             58 ;;      
                             59 ;;===========================================================
   45A7                      60 entity_manager_destroy_entity::
                             61 
   45A7 DD 36 0C 00   [19]   62     ld e_cmp(ix), #e_cmp_invalid
                             63     ; Decrementar num entidades
                             64     ;ld a, (_num_entities)
                             65     ;dec a
                             66     ;ld (_num_entities),a
                             67 
                             68     ; Decrementar last element
                             69 
   45AB C9            [10]   70     ret
                             71 
                             72 
                             73 ;;===========================================================
                             74 ;; Actualiza vector entidades y mueve los asteroides que están 
                             75 ;; arriba de la pantalla delante
                             76 ;; Input:
                             77 ;;      IX : Puntero al vector de entidades
                             78 ;;       A : numero de entidades
                             79 ;; Destroy:
                             80 ;;      AF, B, DE, IX
                             81 ;; Return:
                             82 ;;      
                             83 ;;===========================================================
   45AC                      84 entity_manager_update::
                             85     
                             86     ; Pasa el primer elemento (player)
   45AC 11 11 00      [10]   87     ld      de, #sizeof_e
   45AF DD 19         [15]   88     add     ix, de
                             89 
                             90     ; Carga nª entidades
   45B1 47            [ 4]   91     ld b, a
                             92 
                             93     ; Recorrer el vector ordenando los asteroides
   45B2                      94     _loop_update:
                             95         ; Comprueba num entidades
   45B2 05            [ 4]   96         dec b
   45B3 C8            [11]   97         ret z
                             98 
                             99 
                            100         ; Es invalido?
   45B4 DD 7E 0C      [19]  101         ld a, e_cmp(ix)
   45B7 E6 00         [ 7]  102         and #e_cmp_invalid
   45B9 28 00         [12]  103         jr  z, _next_e
                            104 
                            105         ; Haz cosas
                            106         ; Intercambiar por el último
                            107         
                            108 
   45BB                     109         _next_e:
                            110             ;ld      de, #sizeof_e
   45BB DD 19         [15]  111             add     ix, de
ASxxxx Assembler V02.00 + NoICE + SDCC mods  (Zilog Z80 / Hitachi HD64180), page 5.
Hexadecimal [16-Bits]



   45BD 18 F3         [12]  112             jr      _loop_update
                            113 
                            114 
                            115 ;;=========================================================================
                            116 ;; Ejecuta la funcion dada para todas las entidades con los bits indicados
                            117 ;; Input:
                            118 ;;      HL : Puntero a la función a ejecutar
                            119 ;;       B : Máscara de bits
                            120 ;; Destroy:
                            121 ;;      AF, C, DE
                            122 ;; Return:
                            123 ;;      
                            124 ;;=========================================================================
   45BF                     125 entity_manager_forall_matching::
   45BF CD 81 45      [17]  126     call    entity_manager_getEntityArray
   45C2 4F            [ 4]  127     ld c, a
                            128 
                            129     ; Recorrer vector
   45C3                     130     _loop:
   45C3 DD 7E 0C      [19]  131         ld a, e_cmp(ix)
   45C6 A0            [ 4]  132         and b       ; comprobamos si es valida la máscara de bits
   45C7 28 07         [12]  133         jr z, _cond_parada  ; si no valida vamos al siguiente
                            134         
                            135         ; Llamar a la fn
   45C9 C5            [11]  136         push bc
   45CA E5            [11]  137         push hl
   45CB CD D9 45      [17]  138         call JP_HL
   45CE E1            [10]  139         pop hl
   45CF C1            [10]  140         pop bc
                            141     
                            142 
   45D0                     143     _cond_parada:
                            144         ; Comprobar si quedan entidades
   45D0 0D            [ 4]  145         dec c
   45D1 C8            [11]  146         ret z ; sale si no hay más elem
                            147 
                            148         ; Aumentamos iterador
   45D2 11 11 00      [10]  149         ld      de, #sizeof_e
   45D5 DD 19         [15]  150         add     ix, de
                            151         
   45D7 18 EA         [12]  152         jr      _loop
                            153 
                            154 ; Funcion para hacer call de una funcion en registro hl
   45D9                     155 JP_HL:
   45D9 E9            [ 4]  156         jp (hl)
