Updating pattern table and name table at the same time?

صفحة 2/3
1 | | 3

بواسطة Metalion

Paragon (1625)

صورة Metalion

17-10-2022, 20:29

ro wrote:

ld bc,-7 ;c=-7, b=0

Nope ... ld bc,-7 gives c=-7,b=255 (FFF9h)
Wink

بواسطة ro

Scribe (4963)

صورة ro

18-10-2022, 07:46

Ah dang it haha yer right

To be frank, a better -readable- solution would be
LD BC,7
SUB A,C

#cleancode

بواسطة thegeps

Paragon (1189)

صورة thegeps

18-10-2022, 12:32

ro wrote:

Ah dang it haha yer right

To be frank, a better -readable- solution would be
LD BC,7
SUB A,C

#cleancode

LoL

Ld bc,f9h
Add a,c

#obscurecode

بواسطة theNestruo

Champion (421)

صورة theNestruo

18-10-2022, 12:39

thegeps wrote:
ro wrote:

Ah dang it haha yer right

To be frank, a better -readable- solution would be
LD BC,7
SUB A,C

#cleancode

LoL

Ld bc,f9h
Add a,c

#obscurecode

ld bc, +((-7 << 8) and $ff00) +(0 and $00ff)
add c

#middlegroundcode Smile

بواسطة ro

Scribe (4963)

صورة ro

18-10-2022, 13:53

Well, we can go further. cuz what is this magic number 7?
A label to that would be great!

ScrollOffset: EQU 7
LD C,ScrollOffset
SUB A,C

Now #cleancode is done.

/backontopic

بواسطة pizzapower

Master (165)

صورة pizzapower

19-10-2022, 04:54

Here, I made a video of my demo inspired by Atari 2600's Entombed using the same maze generation algorithm.

بواسطة thegeps

Paragon (1189)

صورة thegeps

19-10-2022, 06:38

I see no flickering. So you fixed it?

بواسطة Chilly Willy

Expert (103)

صورة Chilly Willy

19-10-2022, 07:38

LD BC,0000H ; REG 0: MODE 1
CALL WRITE_REGISTER
LD BC,01C2H ; REG 1: MODE 1, 16K, NO INTERRUPTS, C0=8X8 C2=16X16 C1=ENLARGED C3=NORMAL
CALL WRITE_REGISTER
LD BC,0201H ; REG 2: NAME TABLE 0400H
CALL WRITE_REGISTER
LD BC,0380H ; REG 3: COLOR TABLE $2000
CALL WRITE_REGISTER
LD BC,0400H ; REG 4: PATTERN TABLE 0000H
CALL WRITE_REGISTER
LD BC,053CH ; REG 5: SPRITE ATTRIBUTE TABLE 1B00H
CALL WRITE_REGISTER
LD BC,0607H ; REG 6: SRITE PATTERN TABLE 3800H
CALL WRITE_REGISTER
LD BC,0700H ; REG 7: BACKGROUND COLOR (BLACK)
CALL WRITE_REGISTER

VRAM_PATTERNS: EQU $0000
VRAM_NAME_TABLE: EQU $0400 ; RELOCATED FOR SCROLLING VRAM_SPRITE_ATTR: EQU $1800
VRAM_SPRITE_ATTR: EQU $1E00
VRAM_COLOR_TABLE: EQU $2000
VRAM_SPRITE_PATTENS: EQU $3800

I know this is vague but after I set this up and my patterns all I had to do is change register 4
1, 2, 3, 4 or 4, 3, 2, 1

Graphics mode 0 I believe on the MSX?

INITIALIZE_GAME: ; LOAD TILES TO VRAM. USEING MODE 1. SET PATTERNS AT VDP ADDRESS THEN ACCESED WITH REGISTER 4.
LD BC,01C2H ; DISABLE NMI
CALL WRITE_REGISTER

LD HL, VRAM_PATTERNS+$0000 ; SCROLL SET 0
LD DE, SCROLL_SET
LD BC, TILE_COUNT*8
CALL LDIRVM

LD HL, VRAM_PATTERNS+$0000+TILE_COUNT*8 ; NUMBER + LETTERS SET 0
LD DE, NUMBERS
LD BC, 14*8
CALL LDIRVM

LD HL, VRAM_PATTERNS+$0800 ; SCROLL SET 1
LD DE, SCROLL_SET
LD BC, TILE_COUNT*8
CALL LDIRVM

LD HL, VRAM_PATTERNS+$0800+$08
LD DE, SCROLL_SET+03*8
LD BC, 2*8
CALL LDIRVM

LD HL, VRAM_PATTERNS+$0800+TILE_COUNT*8 ; NUMBER + LETTERS SET 1
LD DE, NUMBERS
LD BC, 14*8
CALL LDIRVM

LD HL, VRAM_PATTERNS+$1000 ; SCROLL SET 3
LD DE, SCROLL_SET
LD BC, TILE_COUNT*8
CALL LDIRVM

LD HL, VRAM_PATTERNS+$1000+$08
LD DE, SCROLL_SET+05*8
LD BC, 2*8
CALL LDIRVM

LD HL, VRAM_PATTERNS+$1000+TILE_COUNT*8 ; NUMBER + LETTERS SET 3
LD DE, NUMBERS
LD BC, 14*8
CALL LDIRVM

LD HL, VRAM_PATTERNS+$1800 ; SCROLL SET 4
LD DE, SCROLL_SET
LD BC, TILE_COUNT*8
CALL LDIRVM

LD HL, VRAM_PATTERNS+$1800+$08
LD DE, SCROLL_SET+07*8
LD BC, 2*8
CALL LDIRVM

LD HL, VRAM_PATTERNS+$1800+TILE_COUNT*8 ; NUMBER + LETTERS SET 4
LD DE, NUMBERS
LD BC, 14*8
CALL LDIRVM

LD HL, VRAM_SPRITE_PATTENS ; UPLOAD SPRITE PATTERNS TO THE VDP
LD DE, EYES_FORWARD_SP
LD BC, 32*SPRITE_COUNT
CALL LDIRVM

LD DE, TEMP_HUD
LD HL, VRAM_NAME_TABLE+640
LD BC, 128
CALL LDIRVM

LD BC,01E2H ; ENABLE NMI
CALL WRITE_REGISTER

This loaded in the patterns at the proper addresses and use register 4 as indicated.

بواسطة pizzapower

Master (165)

صورة pizzapower

19-10-2022, 14:30

thegeps wrote:

I see no flickering. So you fixed it?

Yes, it's fixed. I change the tile layout in memory so I could copy them in a single operation (like you suggested) to this:

The green tiles at the beginning is where I copy the other tiles from RAM into VRAM. In groups of three per frame.

I also added halt just before update_tile() to smooth things out a bit (thanks, geijoenr). Most of the game loop is still in C so I am happy with the results.

#include 
#include 

extern const uint8_t map_data[MAP_WIDTH*MAP_HEIGHT];
uint8_t *map_data_p = map_data;

void run_loop() {
    int8_t frame = -1;
    bool game_running = true;

    while (game_running) {
        frame++;
        __asm halt __endasm; // wait for vsync
        update_tiles(); // move the maze up pixel by pixel by changing the pattern table
        if (frame == 7) {
            frame = -1; // reset frame counter
            map_data_p += 32;     // update map pointer by width size (point to the next line)
            update_map();         // move the maze up tile by tile by changing the name table
        }
        // process user input and update sprites
        // ...
        wait();  // wait the allotted frame time to finish
    }

بواسطة pizzapower

Master (165)

صورة pizzapower

20-10-2022, 13:11

Finally, here is what my code does: Following this paper at https://arxiv.org/abs/1811.02035 (Entombed: An archaeological examination of an Atari 2600 game) I implemented a version of the maze generator from Atari 2600's Entombed on the MSX1. And added smooth scroll to make it more interesting.

Here is a new video with bgm from the Goonies added just for the mood.

صفحة 2/3
1 | | 3