Ld a,#5;;1
Ld (valor), a
Ld a,#6;;2
Ld (valor),a
Valor=.+1
Ld a,#0
;; En primer caso, valor es 1
;;En segundo caso, valor es 2
Ld a,#5;;1
Ld (valor), a
Ld a,#6;;2
Ld (valor),a
Valor=.+1
Ld a,#0
;; En primer caso, valor es 1
;;En segundo caso, valor es 2
Intento tener el programa o juego en GitHub. Es lo más fácil que conozco para intercambiarlo.
Me pregunto , supongamos el caso de una entidad, con posición x, igual a 4.
Le vamos restando una unidad. Cuando llegue a 0, impedimos que se reste más, antes o en esta comprobación.
Si x llega a -1, se pone a 0. En un número U8(sin signo), esto no es posible.
En tal caso, en ensamblador¿ sería más óptimo comparar con 0(jz) o con Carry(JC).?
Esta vez pongo un pequeño programa, como base para le expansion de un ECS. Esta creado en ensamblador. tiene pocos comentarios, espero os sirva.
.module cpct_functions.h.s
.globl cpct_disableFirmware_asm
.globl cpct_waitVSYNC_asm
.globl cpct_scanKeyboard_f_asm
.globl cpct_isKeyPressed_asm
.globl cpct_setVideoMode_asm
.globl cpct_drawSolidBox_asm
.globl cpct_getScreenPtr_asm
.globl cpct_drawSprite_asm
.module main.s
.include "cpctelera.h.s"
.include "cpct_functions.h.s"
.include "man/game.h.s"
.area _DATA
.area _CODE
_main::
;;desactiva firmware
call cpct_disableFirmware_asm
;;init game manager
call man_game_init
;loop forever
loop:
call man_game_update
;waitNVsyncs 2
call cpct_waitVSYNC_asm
call man_game_render
jr loop
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
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