# HG changeset patch # User Michael Pavone # Date 1548732244 28800 # Node ID 49a52c737bf0b87d6333d00cc6bc09d4965eabbe # Parent 73ac2e59fa3f0cd9ec804b8d499aded5dbbf22ae Fix zero flag calculation in CPU DSL diff -r 73ac2e59fa3f -r 49a52c737bf0 Makefile --- a/Makefile Sun Jan 27 14:37:37 2019 -0800 +++ b/Makefile Mon Jan 28 19:24:04 2019 -0800 @@ -159,7 +159,12 @@ endif endif +ifdef NEW_CORE +Z80OBJS=z80.o +CFLAGS+= -DNEW_CORE +else Z80OBJS=z80inst.o z80_to_x86.o +endif AUDIOOBJS=ym2612.o psg.o wave.o CONFIGOBJS=config.o tern.o util.o paths.o NUKLEAROBJS=$(FONT) nuklear_ui/blastem_nuklear.o nuklear_ui/sfnt.o controller_info.o @@ -295,6 +300,9 @@ vos_prog_info : vos_prog_info.o vos_program_module.o $(CC) -o vos_prog_info vos_prog_info.o vos_program_module.o + +%.c : %.cpu + ./cpu_dsl.py $< > $@ %.o : %.S $(CC) -c -o $@ $< diff -r 73ac2e59fa3f -r 49a52c737bf0 backend.c --- a/backend.c Sun Jan 27 14:37:37 2019 -0800 +++ b/backend.c Mon Jan 28 19:24:04 2019 -0800 @@ -129,6 +129,73 @@ return 0xFFFF; } +uint8_t read_byte(uint32_t address, void **mem_pointers, cpu_options *opts, void *context) +{ + memmap_chunk const *chunk = find_map_chunk(address, opts, 0, NULL); + if (!chunk) { + return 0xFF; + } + uint32_t offset = address & chunk->mask; + if (chunk->flags & MMAP_READ) { + uint8_t *base; + if (chunk->flags & MMAP_PTR_IDX) { + base = mem_pointers[chunk->ptr_index]; + } else { + base = chunk->buffer; + } + if (base) { + if ((chunk->flags & MMAP_ONLY_ODD) || (chunk->flags & MMAP_ONLY_EVEN)) { + if (address & 1) { + if (chunk->flags & MMAP_ONLY_EVEN) { + return 0xFF; + } + } else if (chunk->flags & MMAP_ONLY_ODD) { + return 0xFF; + } + offset /= 2; + } + return base[offset]; + } + } + if ((!(chunk->flags & MMAP_READ) || (chunk->flags & MMAP_FUNC_NULL)) && chunk->read_8) { + return chunk->read_8(offset, context); + } + return 0xFF; +} + +void write_byte(uint32_t address, uint8_t value, void **mem_pointers, cpu_options *opts, void *context) +{ + memmap_chunk const *chunk = find_map_chunk(address, opts, 0, NULL); + if (!chunk) { + return; + } + uint32_t offset = address & chunk->mask; + if (chunk->flags & MMAP_WRITE) { + uint8_t *base; + if (chunk->flags & MMAP_PTR_IDX) { + base = mem_pointers[chunk->ptr_index]; + } else { + base = chunk->buffer; + } + if (base) { + if ((chunk->flags & MMAP_ONLY_ODD) || (chunk->flags & MMAP_ONLY_EVEN)) { + if (address & 1) { + if (chunk->flags & MMAP_ONLY_EVEN) { + return; + } + } else if (chunk->flags & MMAP_ONLY_ODD) { + return; + } + offset /= 2; + } + base[offset] = value; + } + } + if ((!(chunk->flags & MMAP_WRITE) || (chunk->flags & MMAP_FUNC_NULL)) && chunk->write_8) { + chunk->write_8(offset, context, value); + } +} + uint32_t chunk_size(cpu_options *opts, memmap_chunk const *chunk) { if (chunk->mask == opts->address_mask) { diff -r 73ac2e59fa3f -r 49a52c737bf0 backend.h --- a/backend.h Sun Jan 27 14:37:37 2019 -0800 +++ b/backend.h Mon Jan 28 19:24:04 2019 -0800 @@ -96,6 +96,8 @@ code_ptr gen_mem_fun(cpu_options * opts, memmap_chunk const * memmap, uint32_t num_chunks, ftype fun_type, code_ptr *after_inc); void * get_native_pointer(uint32_t address, void ** mem_pointers, cpu_options * opts); uint16_t read_word(uint32_t address, void **mem_pointers, cpu_options *opts, void *context); +uint8_t read_byte(uint32_t address, void **mem_pointers, cpu_options *opts, void *context); +void write_byte(uint32_t address, uint8_t value, void **mem_pointers, cpu_options *opts, void *context); memmap_chunk const *find_map_chunk(uint32_t address, cpu_options *opts, uint16_t flags, uint32_t *size_sum); uint32_t chunk_size(cpu_options *opts, memmap_chunk const *chunk); uint32_t ram_size(cpu_options *opts); diff -r 73ac2e59fa3f -r 49a52c737bf0 cpu_dsl.py --- a/cpu_dsl.py Sun Jan 27 14:37:37 2019 -0800 +++ b/cpu_dsl.py Mon Jan 28 19:24:04 2019 -0800 @@ -324,14 +324,11 @@ output.append('\n\t{reg} = {res} ? ({reg} & {mask}U) : ({reg} | {bit}U);'.format( reg = reg, mask = ~(1 << storageBit), res = lastDst, bit = 1 << storageBit )) - elif prog.paramSize(prog.lastDst) > prog.paramSize(storage): + else: reg = prog.resolveParam(storage, None, {}) - output.append('\n\t{reg} = {res} != 0;'.format( + output.append('\n\t{reg} = {res} == 0;'.format( reg = reg, res = lastDst )) - else: - reg = prog.resolveParam(storage, None, {}) - output.append('\n\t{reg} = {res};'.format(reg = reg, res = lastDst)) elif calc == 'half-carry': pass elif calc == 'carry': @@ -978,6 +975,7 @@ self.regs.writeHeader(otype, hFile) hFile.write('\n}} {0}context;'.format(self.prefix)) hFile.write('\n') + hFile.write('\nvoid {pre}execute({type} *context, uint32_t target_cycle);'.format(pre = self.prefix, type = self.context_type)) hFile.write('\n#endif //{0}_'.format(macro)) hFile.write('\n') hFile.close() diff -r 73ac2e59fa3f -r 49a52c737bf0 ztestrun.c --- a/ztestrun.c Sun Jan 27 14:37:37 2019 -0800 +++ b/ztestrun.c Mon Jan 28 19:24:04 2019 -0800 @@ -4,7 +4,12 @@ BlastEm is free software distributed under the terms of the GNU General Public License version 3 or greater. See COPYING for full license text. */ #include "z80inst.h" +#ifdef NEW_CORE +#include "z80.h" +#include +#else #include "z80_to_x86.h" +#endif #include "mem.h" #include "vdp.h" #include @@ -42,10 +47,12 @@ { 0x0000, 0x100, 0xFF, 0, 0, 0, NULL, NULL, NULL, z80_unmapped_read, z80_unmapped_write} }; +#ifndef NEW_CORE void z80_next_int_pulse(z80_context * context) { context->int_pulse_start = context->int_pulse_end = CYCLE_NEVER; } +#endif int main(int argc, char ** argv) { @@ -89,6 +96,34 @@ exit(1); } fclose(f); +#ifdef NEW_CORE + memset(&opts, 0, sizeof(opts)); + opts.gen.memmap = z80_map; + opts.gen.memmap_chunks = 2; + opts.gen.address_mask = 0xFFFF; + opts.gen.max_address = 0xFFFF; + opts.gen.clock_divider = 1; + context = calloc(1, sizeof(z80_context)); + context->opts = &opts; + z80_execute(context, 1000); + printf("A: %X\nB: %X\nC: %X\nD: %X\nE: %X\nHL: %X\nIX: %X\nIY: %X\nSP: %X\n\nIM: %d, IFF1: %d, IFF2: %d\n", + context->main[7], context->main[0], context->main[1], + context->main[2], context->main[3], + (context->main[4] << 8) | context->main[5], + context->ix, + context->iy, + context->sp, context->imode, context->iff1, context->iff2); + printf("Flags: SZYHXVNC\n" + " %d%d%d%d%d%d%d%d\n", + context->last_flag_result >> 7, context->zflag != 0, context->last_flag_result >> 5 & 1, context->chflags >> 3 & 1, + context->last_flag_result >> 3 & 1, context->pvflag != 0, context->nflag, context->chflags >> 7 & 1 + ); + puts("--Alternate Regs--"); + printf("A: %X\nB: %X\nC: %X\nD: %X\nE: %X\nHL: %X\n", + context->alt[7], context->alt[0], context->alt[1], + context->alt[2], context->alt[3], + (context->alt[4] << 8) | context->alt[5]); +#else init_z80_opts(&opts, z80_map, 2, port_map, 1, 1, 0xFF); context = init_z80_context(&opts); //Z80 RAM @@ -122,5 +157,6 @@ context->alt_regs[Z80_A], context->alt_regs[Z80_B], context->alt_regs[Z80_C], context->alt_regs[Z80_D], context->alt_regs[Z80_E], (context->alt_regs[Z80_H] << 8) | context->alt_regs[Z80_L]); +#endif return 0; }