martes, 8 de diciembre de 2020

creacion de entidades con un ECS usando CPCTelera

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


domingo, 6 de diciembre de 2020

Dibujo cuadrado

rutina para dibujar unos sencillos cuadrados, incrementando x e y en 1 a cada paso

 ;;

;; 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

;;declaracion de etiquetas,constantes

x: .db #20

y: .db #12

;;principal

_main::

   ;; Disable firmware to prevent it from interfering with string drawing

   call cpct_disableFirmware_asm

;;dibujado de cuadrados en pantalla, incrementando x e y a cada paso

loop:

ld de,#0xc000 ;;principio memoria video

ld hl,#x ;;carga en hl el valor de x

ld b,(hl) ;;pasa a b

inc (hl) ;;el valor de hl, HL=HL+1

inc HL ;;hl=hl+1

ld c,(hl) ;;pasa a c

inc (hl) ;;valor de hl +1

call cpct_getScreenPtr_asm ;;funcio9n para localizar x e y en pantalla

ex de,HL ;;intercambia de y hl


ld a,#0xff ;;color cuadrado

ld bc,#0x0804 ;;tamaño cuadrado

call cpct_drawSolidBox_asm ;;funcion dibujado cuadrado

    call cpct_waitVSYNC_asm ;;funcion espera a retrazado

    ;; Loop forever

jr    loop ;;salta a bucle loop