Hola,
Bueno, pues yo sigo probando cosas en ensamblador C y Basic (todo terreno
) y hoy estaba probando con asm, concretamente quería pasar el ejemplo de disparos que colge el otro día a ASM a ver como se me daba.
Pues me encuentro con un pequeño problema (seguro que una chorrada como la copa de un pino) que creo no debe ser muy complicado de solucionar, pero la cuestión es que no se donde esta el fallo.
Utilizo parte de uno de los listados de robsy para inicializar el video, concretamente el del Pong, en el mismo listado se inicializan los sprites a 16x16 o por lo menos eso parece.
la cuestión es que cuando muestro el sprite este aparece en 8x8
vamos, que solo veo una parte de 8x8, el modo de video me queda como screen 1,1 cuando lo que necesito es 1,2
ale, aquí pego el código para ver si alguien me puede ayudar:
;---------------------------------------------------------
; TEST
;---------------------------------------------------------
; CONSTANTES
SPRTBL equ 3800h
SPRATR equ 1b00h
; Variables del sistema
CLIKSW equ 0f3dbh ; click
FORCLR equ 0f3e9h ; color fondo
;---------------------------------------------------------
; ASMSX
;---------------------------------------------------------
.bios
.page 2 ; 8000h
.rom
.start INIT
;---------------------------------------------------------
INIT:
;---------------------------------------------------------
CALL INITIALISATION
CALL INIT_GRAPHICS
BUC1:
CALL MOVNAVE
CALL IMPNAVE
JP BUC1
LOADSPR:
LD HL,SPRNAVE ;define sprite
LD DE,3800H
LD BC,32
CALL LDIRVM
LD HL,POS_NAVE ;inicializa x e y
LD [HL],10
LD HL,POS_NAVE+1
LD [HL],10
RET
MOVNAVE:
XOR A ; A=0
call GTSTCK ; A=STICK(1)
CP 3
JP NZ,@@IZQ ; IF A<>3 THEN GOTO @@IZQ
@@DERE: LD HL,POS_NAVE+1; HL=DIS_POSNAVE_X
LD A,[HL] ; A=POSNAVE_X
CP 250 ; IF A=0 RETURN
RET Z
INC A
LD [HL],A
@@IZQ: CP 7 ; IF A<>7 THEN RETURN
RET NZ
LD HL,POS_NAVE+1; HL=DIS_POSNAVE_X
LD A,[HL] ; A=POSNAVE_X
CP 0 ; IF A=0 RETURN
RET Z
DEC A
LD [HL],A
RET
IMPNAVE:
LD HL,POS_NAVE
LD A,[HL]
LD HL,SPRATR
CALL WRTVRM ; Y=SPR0Y
LD HL,POS_NAVE+1
LD A,[HL]
LD HL,SPRATR+1
CALL WRTVRM ; Y=SPR0X
LD A,1
LD HL,SPRATR+2
CALL WRTVRM ; SPR Nº=SPR0X
LD A,15
LD HL,SPRATR+3
CALL WRTVRM ; CLR=SPR0X
RET
;---------------------------------------------------------
INIT_GRAPHICS:
; Initialise the graphic mode and define graphic elements
;---------------------------------------------------------
; Set proper colours
; BASIC: COLOR 15,0,0
ld hl,FORCLR
ld [hl],15
inc hl
ld [hl],0
inc hl
ld [hl],0
; Set text mode II
; BASIC: SCREEN 1
call INIT32
;call INIGRP
; Erase all sprite data
call CLRSPR
; 16x16 Sprite mode
; BASIC: SCREEN ,2
; ld bc,0e201h
; call WRTVDP
; Hide screen
call DISSCR
; Define sprites
CALL LOADSPR
; Recover screen
call ENASCR
; Return to main program
ret
;---------------------------------------------------------
;---------------------------------------------------------
INITIALISATION:
; One-time initialisation
;---------------------------------------------------------
; desactiva el click del teclado
; BASIC: SCREEN ,,0
xor a
ld [CLIKSW],a
; inicializa el psg
call GICINI
; Init memory refreshment register R - [0-127]
xor a
ld r,a
; Hide function keys
; BASIC: KEY OFF
call ERAFNK
; Return to main program
ret
;---------------------------------------------------------
; CONSTANTES
;---------------------------------------------------------
SPRNAVE:
; --- Slot 0
; color 1
DB 00000000b
DB 00000000b
DB 00000000b
DB 00100000b
DB 01000000b
DB 11000111b
DB 11001100b
DB 11001100b
DB 11001100b
DB 11001111b
DB 11001111b
DB 11001111b
DB 11000111b
DB 01000000b
DB 00100000b
DB 00000000b
DB 00000000b
DB 00000000b
DB 00000000b
DB 00000100b
DB 00000010b
DB 11100011b
DB 00110011b
DB 00110011b
DB 00110011b
DB 11110011b
DB 11110011b
DB 11110011b
DB 11100011b
DB 00000010b
DB 00000100b
DB 00000000b
;---------------------------------------------------------
; VARIABLES
;---------------------------------------------------------
.page 3
POS_NAVE:
DS 2
POS_DISP:
DS 20 // MAX 10 DISPAROS
Gracias.
Gobblin