pequeñito ejemplo de como, usndo en entity component system (ECS), se crean dos entidades distintas, y se pintan en pantalla.
;;main.s
;; ejemplo de dibujado simple de cuadrados
.module main.s
.include "cpctelera.h.s"
.area _DATA
.area _CODE
;;declaracion de globales
.globl cpct_disableFirmware_asm
.globl cpct_getScreenPtr_asm
.globl cpct_drawSolidBox_asm
.globl cpct_waitVSYNC_asm
.globl entityman_create
.globl rendersys_update
.globl _entity_array
.globl _num_entities
.globl entityman_getEntityArray_IX
.globl rendersys_init
.globl entityman_getNumEntities_A
;;declaracion de etiquetas,constantes
;;x,y,ancho,alto,color,velocidad x,vy
player: .db 20,20,04,16,0xff,0,0
enemy: .db 30,30,06,16,0xf0,0,0
;;principal
_main::
;; Disable firmware to prevent it from interfering with string drawing
call cpct_disableFirmware_asm
;;INIT SYSTEMS
call rendersys_init
ld hl,#player
call entityman_create
ld hl,#enemy
call entityman_create
loop:
call entityman_getEntityArray_IX
call entityman_getNumEntities_A
call rendersys_update
jr loop
parate:
jp parate
;;
;;render system
.module render_system.s
.globl cpct_getScreenPtr_asm
.globl cpct_drawSolidBox_asm
.globl entity_size
rendersys_init::
ret
;;input registro ix puntero a entidad
;;a numero de entidades a render
rendersys_update::
;;dibujado de cuadrados en pantalla, incrementando x e y a cada paso
render_loop:
push af
ld de,#0xc000 ;;principio memoria video
ld b,1(ix) ;;carga x
ld c,0(ix) ;;carga y
call cpct_getScreenPtr_asm ;;funcio9n para localizar x e y en pantalla
ex de,HL ;;intercambia de y hl
ld a,4(ix) ;;color cuadrado
ld b,3(ix) ;;tamaño cuadrado; call cpct_drawSolidBox_asm ;;funcion dibujado cuadrado
ld c,2(ix) ;; c alto, b ancho
call cpct_drawSolidBox_asm
pop af
dec a
ret z
ld bc,#entity_size
add ix,bc
jr render_loop
ret
.module entity_manager.s
entity_size == 7 ;;tamaño de cada entidad
max_entities == 3 ;;numero maximo de entidades
_num_entities:: .db 0 ;;entidades creadas al principio,0
_last_element_ptr:: .dw _entity_array
_entity_array::
.ds entity_size*max_entities ;;creacion de espacio para entidades,tamaño por numero
entityman_getEntityArray_IX::
ld ix,#_entity_array
ret
entityman_getNumEntities_A::
ld a,(_num_entities)
ret
;;input
;;hl->puntero a entidad ejemplo
entityman_create::
ld de,(_last_element_ptr) ;;creacion de nueva entidad,
ld bc,#entity_size ;;de a puntero de ultima entidad
ldir ;;bc tamaño de la entidad
ld a,(_num_entities) ;;incrementa en uno el numero de entidades
inc a
ld (_num_entities),a
ld hl,(_last_element_ptr)
ld bc,#entity_size
add hl,bc
ld (_last_element_ptr),hl
ret