Thanks, I like it here
I'm now going to experiment with some scrolling on screen 1. Using name and pattern tables.
Ok, I've got my first scrolling example working: a scrolling wall with smooth pixel perfect scrolling: https://msxpen.com/codes/-M_KdvrvCxl8fZIJHe2E
I also bought a real MSX today (Philips VG-8020). I can only connect it to an old tv, so I decided dump my code as hexadecimal characters and enter these in my real machine using a little basic program (a loop with read data, poke, etc.). Oldskool listing typing ;)
After entering the defusr and usr commands to start it up it actually worked! Really cool, after more then 35 years after I owned my first MSX I now run my first machine code program on a real MSX :D
Looks great, nice job! Also congrats on the MSX!
great!
Thanks, I'm going to order a MegaFlashRom at https://www.msxcartridgeshop.com/ to transfer my programs to the real MSX. I also found a second hand Arcade joystick from Suzo to make my setup complete.
Thanks, I'm going to order a MegaFlashRom at https://www.msxcartridgeshop.com/ to transfer my programs to the real MSX.
You won’t regret it! I use it all the time. Be sure to get the version with 512K memory.
Hi PbK71
this section of your code could be optimized as you have done at displaysprite:
Try setting the VRAM start address using SETWRT and use out and the self increment of the VRAM pointer in the VDP
; --- UPDATE Y AND X COORDINATE in VRAM ---
ld HL,SPRITEAT ; VRAM address to write attributes of sprite 0
ld a,(y+1) ; y-coordinate = high byte of word y
call WRTVRM ; write to VRAM
INC HL
ld a,(x) ; x-coordinate
call WRTVRM ; write to VRAM
ld HL,SPRITEAT+4 ; VRAM address to write attributes of sprite 1
ld a,(y+1) ; y-coordinate = high byte of word y
call WRTVRM ; write to VRAM
INC HL
ld a,(x) ; x-coordinate
call WRTVRM ; write to VRAM
ld HL,SPRITEAT+8 ; VRAM address to write attributes of sprite 2
ld a,(y+1) ; y-coordinate = high byte of word y
call WRTVRM ; write to VRAM
INC HL
ld a,(x) ; x-coordinate
call WRTVRM ; write to VRAM
ld HL,SPRITEAT+12 ; VRAM address to write attributes of sprite 3
ld a,(y+1) ; y-coordinate = high byte of word y
call WRTVRM ; write to VRAM
INC HL
ld a,(x) ; x-coordinate
call WRTVRM ; write to VRAM
Agreed! Something that is very useful for fast transfers to the VDP is to setup the variables you are using to store x/y of your objects in exactly the same order and layout as they will be when transferred to the VDP to control the sprites. In that way, you can just copy them all in a block, saving a lot of CPU time.
Hello ARTRAG,
Thanks for the advice. I tried this, but ran into the problem that after writing the x and y coordinate of a sprite I either have to skip 2 bytes (sprite pattern and color) or 'rewrite' those values again. My attempt on skipping them was this:
; --- UPDATE Y AND X COORDINATE in VRAM --- ld HL,SPRITEAT ; VRAM address to write attributes of sprite 0 call SETWRT ; enable VDP to write ld c,0x98 ; load port 0x98 to write to in c ld a,(y+1) ; y-coordinate = high byte of word y out(c),a ; write to VRAM ld a,(x) ; x-coordinate out(c),a ; write to VRAM ld HL,SPRITEAT+4 ; VRAM address to write attributes of sprite 1 call SETWRT ; enable VDP to write ld a,(y+1) ; y-coordinate = high byte of word y out(c),a ; write to VRAM ld a,(x) ; x-coordinate out(c),a ; write to VRAM ld HL,SPRITEAT+8 ; VRAM address to write attributes of sprite 2 call SETWRT ; enable VDP to write ld a,(y+1) ; y-coordinate = high byte of word y out(c),a ; write to VRAM ld a,(x) ; x-coordinate out(c),a ; write to VRAM ld HL,SPRITEAT+12 ; VRAM address to write attributes of sprite 3 call SETWRT ; enable VDP to write ld a,(y+1) ; y-coordinate = high byte of word y out(c),a ; write to VRAM ld a,(x) ; x-coordinate out(c),a ; write to VRAM
I could adjust it to rewriting sprite pattern and color. So, something lik this I gues:
; --- UPDATE Y AND X COORDINATE in VRAM --- ld HL,SPRITEAT ; VRAM address to write attributes of sprite 0 call SETWRT ; enable VDP to write ld c,0x98 ; load port 0x98 to write to in c ld a,(y+1) ; y-coordinate = high byte of word y out(c),a ; write to VRAM ld a,(x) ; x-coordinate out(c),a ; write to VRAM ld a,0 ; sprite pattern 0 out(c),a ; write to VRAM ld a,1 ; color 1 out(c),a ; write to VRAM ld a,(y+1) ; y-coordinate = high byte of word y out(c),a ; write to VRAM ld a,(x) ; x-coordinate out(c),a ; write to VRAM ld a,4 ; sprite pattern 1 (starts at 4) out(c),a ; write to VRAM ld a,10 ; color out(c),a ; write to VRAM ... and so on ....
Which one is preferred? Or is there another solution?
@santiontanon: If I would your solution I would have to update the x and y coordinate 4 times when thay change? Because then I would have to store it 4 each sprite separate.
Reserve 128 bytes of RAM (or ROM) area for sprites attributes then move them to VRAM simply doing:
Ld hl,RAMSAT ;your reserved 128 bytes start address Ld c,98h Ld b,128 Sprite_to_vram: Outi Jp nz,Sprite_to_vram
Ti modify your values in RAM you can address them easily in this way:
Ld hl,RAMSAT ;point to sprite0 byte (y coord) Ld (hl),whatever value you need Ld hl,RAMSAT+1 ; sprite0 x coord Ld hl,RAMSAT+4 ; sprite1 y coord
And so on.
And if your RAMSAT is 256 aligned you can do this faster:
Ramsat: equ 0c000h Ld hl,ramsat ;set this address as start point (sprite0 y coord) Ld (hl),your value Ld l,1 ;sprite0 x coord Ld (hl),your value Ld l,4 ;sprite1 y coord Ld (hl),your value Ld l,5 ;sprite1 x coord Ld (hl),your value
And so on...