qiaobaaa / response3

0 stars 0 forks source link

2812 #24

Open qiaobaaa opened 4 months ago

qiaobaaa commented 4 months ago

int num[13] = { 0 }; int b[4] = { 6,3,7,1 }; int t[4] = { 1,2,4,8 }; for (int x = 0; x < 4; x++) { if (x == 0 || x == 2) { for (int i = 0; i < 4; i++) { if ((b[x] & t[i]) != 0) { printf("第 %d 位为1 \n", i + 1); num[j] = 1; j++; } else { printf("第 %d 位为0 \n", i + 1); num[j] = 0; j++; } } } else if (x==1) { for (int i = 0; i < 3; i++) { if ((b[x] & t[i]) != 0) { printf("第 %d 位为1 \n", i + 1); num[j] = 1; j++; } else { printf("第 %d 位为0 \n", i + 1); num[j] = 0; j++; } } } else { for (int i = 0; i < 2; i++) { if ((b[x] & t[i]) != 0) { printf("第 %d 位为1 \n", i + 1); num[j] = 1; j++; } else { printf("第 %d 位为0 \n", i + 1); num[j] = 0; j++; } } } }

for (int i = 0; i < 13; i++)
{
    printf("...num 第几位 %d  为  %d\n", i, num[i]);
}
qiaobaaa commented 3 months ago

main.c

include

include

include

include

include "nes.h"

include "emulator.h"

int main(void) { //注意文件路径格式,不然会出现找不到文件 char game_name[] = "D:\mario.nes"; int tmp; tmp = nes_loadrom(game_name); if (tmp != 0) { printf("NES rom load failed, error code: %d\n", tmp); exit(tmp); }

return 0;

}

qiaobaaa commented 3 months ago

nes.h

pragma once

ifndef NES_H

define NES_H

include

define FPS 60

define WIDTH 256

define HEIGHT 240

define FILE_NOT_EXIST 1

define FILE_HEADER_READ_FAILED 2

define NOT_IS_NES_FORMAT 3

define MEMORY_ALLOCATE_FAILED 4

define PRG_ROM_LOAD_FAILED 5

define CHR_ROM_LOAD_FAILED 6

int nes_loadrom(char* rom);

endif

qiaobaaa commented 3 months ago

nes.c

define _CRT_SECURE_NO_WARNINGS

include

include

include "nes.h"

include "cartridge.h"

cartridge_t cartridge;

int nes_loadrom(char rom) { FILE file;

file = fopen(rom, "rb+");
if (file == NULL)
{
    return FILE_NOT_EXIST;
}

if (fread(cartridge.header,sizeof(uint8_t),16,file)!=16)
{
    return FILE_HEADER_READ_FAILED;
}
else if (cartridge.header[0] != 0x4e || cartridge.header[1] != 0x45 || cartridge.header[2] != 0x53 || cartridge.header[3] != 0x1a)
{
    return NOT_IS_NES_FORMAT;
}
else
{

    /* 读取 ROM 信息 */
    cartridge.prg_rom_size = 16 * 1024 * cartridge.header[4];
    cartridge.chr_rom_size = 8 * 1024 * cartridge.header[5];
    cartridge.prg_ram_size = 8 * 1024 * cartridge.header[8];
    if (cartridge.chr_rom_size == 0)
    {
        cartridge.chr_rom_size = 8 * 1024;
    }
    if (cartridge.prg_ram_size == 0)
    {
        cartridge.prg_ram_size = 8 * 1024;
    }
}

return 0;

}

qiaobaaa commented 3 months ago

cartridge.h

pragma once

include

typedef struct Cartridge { /**

qiaobaaa commented 2 months ago

//CPU复位 void cpu_resrt() { cpu.reg_sp -= 3; cpu.reg_p |= FLAG_INTERRUPT; memory_write_byte(0x4015, 0); cpu.reg_pc = memory_read_word(0xfffc); }

//检查并设置zero flag与negative flag void cpu_checknz(uint8_t n) { if ((n >> 7) & 1) { cpu.reg_p |= FLAG_NEGATIVE; } else { cpu.reg_p &= ~FLAG_NEGATIVE; } if (n == 0) { cpu.reg_p = FLAG_ZERO; } else { cpu.reg_p &= ~FLAG_ZERO; } }

//修改flag void cpu_modify_flag(uint8_t flag, int value) { if (value) { cpu.reg_p |= flag; } else { cpu.reg_p &= ~flag; } }

//栈操作 void cpu_stack_push_byte(uint8_t data) { memory_write_byte(0x100 + cpu.reg_sp, data); cpu.reg_sp -= 1; } void cpu_stack_push_word(uint16_t data) { memory_write_word(0x0ff + cpu.reg_sp, data); cpu.reg_sp -= 2; } uint8_t cpu_stack_pop_byte() { cpu.reg_sp += 1; return memory_read_byte(0x100 + cpu.reg_sp); } uint16_t cpu_stack_pop_word() { cpu.reg_sp += 2; return memory_read_word(0x0ff + cpu.reg_sp); }

/ 存储 CPU 经过寻址后得到的地址和该地址对应的值 / uint16_t op_address; uint8_t op_value; uint8_t additional_cycles; // 对于某些寻址方式, 如果跨页访问, 需要多使用一个 CPU Cycle

/* implied (1 字节)

void cpu_addressing_implied() { additional_cycles = 0; }

/* accumulator (1 字节)

/* immediate (2 字节)

/* zeropage (2 字节)

/* zeropage, X-indexed (2 字节)

/* zeropage, Y-indexed (2 字节)

/* absolute (3 字节)

/* absolute, X-indexed (3 字节)

/* absolute, Y-indexed (3 字节)

/* relative (2 字节)

/* indirect (3 字节)

/* indirect, X-indexed (2 字节)

/* indirect, Y-indexed (2 字节)

//56种常规指令集 //ALU: 算术逻辑单元

void cpu_ora() { cpu.reg_a |= op_value; cpu_checknz(cpu.reg_a); }