Estimados, como están?
Después de muchos años de retrasarlo, me puse a aprender ASM para Z80. La idea es ir aprendiendo de a poco como programar un juego en una MSX 1.
Como programador, pero de lenguajes de alto nivel, entiendo que el tema de la optimización es aprendizaje y un poco de arte.
Por eso quería saber, si alguno de ustedes, con su tiempo, podrían darme algunos tips en este programa MUY chiquito que hice. El objetivo del programa es mover un sprite en ocho direcciones con las teclas del cursor.
Cualquier consejo de optimización básicas son mas que bienvenidos! Seguramente hice muchas cosas manera que se podría hacer muchísimo mas eficiente o que se debían de hacer de otra manera.
A continuación pego el código, tiene muchos comentarios, algunos obvios porque estoy aprendiendo los modos de direccionamiento, saltos y otras cosas.
No se si suma, pero uso SJASM para compilar y el programa es para cargar desde el BASIC.
Muchas gracias todos los que se tomaron su tiempo en leer este mensaje!
Saludos!
Saintdboy
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;Mueve un personaje por la pantalla en base a la tecla direccional presionada ; ;Incluye una rutina para esperar el V_BLANK y movimiento en ocho direcciones ; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;https://konamiman.github.io/MSX2-Technical-Handbook/md/Chapter5a.html#3-keyboard-interface ;LDIRVM Address : #005C ;Function : Block transfer to VRAM from memory ;Input : BC - Block length ; DE - Start address of VRAM ; HL - Start address of memory ;-------------------------------------- ;CHGMOD Address : #005F ;Function : Switches to given screen mode ;Input : A - Screen mode ;-------------------------------------- ;WRTVDP Address : #0047 ;Function : Write data in the VDP-register ;Input : B - Data to write ; C - Number of the register ;Registers: AF, BC ;-------------------------------------- ;SNSMAT Address : #0141 ;Function : Returns the value of the specified line from the keyboard matrix ;Input : A - For the specified line ;Output : A - For data (the bit corresponding to the pressed key will be 0) ;Registers: AF ;------------------------------------- VRAM_SPRITE_PATTERN equ #3800 ;144336 VRAM_SPRITE_ATTRIBUTE equ #1B00 ;6912 CHGMOD equ #005F LDIRVM equ #005C WRTVDP equ #0047; Escribe en los registros del VDP RG15AV equ #F3E0; alamcena el valor del registro 1 de escritura del VDP, hay unas rutinas de la bios que guardan es entas direcciones valores globals del sistema SNSMAT equ #0141 JIFFY equ #FC9E KB_RIGHT equ 7 KB_DOWN equ 6 KB_UP equ 5 KB_LEFT equ 4 MOV_SPEED equ 3 ; <a href="https://www.faq.msxnet.org/suffix.html" title="https://www.faq.msxnet.org/suffix.html">https://www.faq.msxnet.org/suffix.html</a> db #fe dw INICIO dw FINAL dw MAIN org #8200 INICIO: MAIN: call SET_SCREEN_MODE call SET_SPRITE_PATTERN call MAIN_LOOP ret MAIN_LOOP: LD A, (JIFFY_TEMP) ;Cargamos el valor anterior del jiffy LD HL, (JIFFY) ;Cargamos el valor actual del jiffy CP (HL) ;Son iguales? JP Z, MAIN_LOOP ;Si son iguales, vuelvo a verificar LD A,(HL) ;Si no son iguales, entonces guardo el nuevo valor LD (JIFFY_TEMP), A call MANAGE_INPUT call UPDATE_SPRITE_ATTRIBUTE jp MAIN_LOOP ;Y escapamos al main loop MANAGE_INPUT: LD A, 0 LD (CHAR_SPEED_X), A LD (CHAR_SPEED_Y), A ld a, 8 call SNSMAT BIT KB_UP, a ; La tecla presionada es UP? JP NZ, CHECK_KB_DOWN ; Sino es asi, continuamos viendo si toco DOWN PUSH AF ; Guardamos el valor de A, que es donde esta la lectura del teclado LD A, -MOV_SPEED LD (CHAR_SPEED_Y), A POP AF CHECK_KB_DOWN: BIT KB_DOWN, a ; La tecla presionada es DOWN? JP NZ, CHECK_KB_LEFT ; Sino es DOWN, continuamos con otra parte PUSH AF ; Guardamos el valor de A, que es donde esta la lectura del teclado LD A, MOV_SPEED LD (CHAR_SPEED_Y), A ; Actualizamos la velocidad del personaje POP AF CHECK_KB_LEFT: BIT KB_LEFT, a ; La tecla presionada es DOWN? JP NZ, CHECK_KB_RIGHT ; Sino es DOWN, continuamos con otra parte PUSH AF ; Guardamos el valor de A, que es donde esta la lectura del teclado LD A, -MOV_SPEED LD (CHAR_SPEED_X), A ; Actualizamos la velocidad del personaje POP AF CHECK_KB_RIGHT: BIT KB_RIGHT, a ; La tecla presionada es DOWN? JP NZ, UPDATE_MOVEMENT ; Sino es DOWN, continuamos con otra parte LD A, MOV_SPEED LD (CHAR_SPEED_X), A ; Actualizamos la velocidad del personaje UPDATE_MOVEMENT LD A, (CHAR_Y) LD HL, (CHAR_SPEED_Y) LD B, L ADD B ; Actualizamos la posicion en base a la velocidad LD (CHAR_Y), A LD A, (CHAR_X) LD HL, (CHAR_SPEED_X) LD B, L ADD B ; Actualizamos la posicion en base a la velocidad LD (CHAR_X), A ret SET_SCREEN_MODE: ;Cambiamos el modo de pantalla ld a,2 ; La rutina CHGMOD nos obliga a poner en el registro a el modo de pantalla que queremos call CHGMOD ld a,(RG15AV) ; esta direcciónd e memoria alamcena el valor el registro de lectura del VDP or 00000011b ; con or poniendo un 0 siempre respetamos los bits que hay y poniendo 1 1 obligamos a que sea 1 ld b,a ; carga en b el valor de a ld c,1 ; La rutina WRTVDP necesta que le carguemos previamente el entero en C del z80 del registro que queroms modificar call WRTVDP ; Escribe en los registros del VDP ret SET_SPRITE_PATTERN: ld bc, 8*4 ld de, VRAM_SPRITE_PATTERN ld hl, SPRITES_DATA call LDIRVM ret UPDATE_SPRITE_ATTRIBUTE: ld bc,4 ld de, VRAM_SPRITE_ATTRIBUTE ld hl, CHAR_ATTRIBUTE call LDIRVM SPRITES_DATA: ; sprite 1 (16x16) DB $03,$03,$03,$1F,$17,$17,$17,$17 DB $17,$07,$04,$04,$04,$04,$04,$0C DB $00,$00,$00,$E0,$A0,$A0,$A0,$A0 DB $A0,$80,$80,$80,$80,$80,$80,$C0 ;Definición de stributos sprite, a esto se le llama plano y cada plano tiene 4 bytes, solo nos caben 32 planos en el espacio de la VRAM CHAR_ATTRIBUTE: CHAR_Y DB $64 CHAR_X DB $64 SPRITE_NUMBER DB $00 COLOR DB $07; aqui se defien el color y el early clock (que es para desparecer el sprite) JIFFY_TEMP DB $00 CHAR_SPEED_X DB $00 CHAR_SPEED_Y DB $00 FINAL: ; 7 6 5 4 3 2 1 0 ; ----------------------------------------------------------------- ; 0 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | ; |-------+-------+-------+-------+-------+-------+-------+-------| ; 1 | ; | ] | [ | \ | = | - | 9 | 8 | ; |-------+-------+-------+-------+-------+-------+-------+-------| ; 2 | B | A | accent| / | . | , | ` | ' | ; |-------+-------+-------+-------+-------+-------+-------+-------| ; 3 | J | I | H | G | F | E | D | C | ; |-------+-------+-------+-------+-------+-------+-------+-------| ; 4 | R | Q | P | O | N | M | L | K | ; |-------+-------+-------+-------+-------+-------+-------+-------| ; 5 | Z | Y | X | W | V | U | T | S | ; |-------+-------+-------+-------+-------+-------+-------+-------| ; 6 | F3 | F2 | F1 | CODE | CAPS | GRAPH | CTRL | SHIFT | ; |-------+-------+-------+-------+-------+-------+-------+-------| ; 7 | RETURN| SELECT| BS | STOP | TAB | ESC | F5 | F4 | ; |-------+-------+-------+-------+-------+-------+-------+-------| ; 8 | RIGHT | DOWN | UP | LEFT | DEL | INS | HOME | SPACE | ; -----------------------------------------------------------------