comparison backend_x86.c @ 604:39d7d463ed5b

Get Z80 banked access sort of working again
author Michael Pavone <pavone@retrodev.com>
date Fri, 26 Dec 2014 19:37:59 -0800
parents f0061e3d2ad9
children 9d6fed6501ba
comparison
equal deleted inserted replaced
603:8c7b63f9fab8 604:39d7d463ed5b
82 cfun = memmap[chunk].write_8; 82 cfun = memmap[chunk].write_8;
83 break; 83 break;
84 default: 84 default:
85 cfun = NULL; 85 cfun = NULL;
86 } 86 }
87 if(memmap[chunk].buffer && memmap[chunk].flags & access_flag) { 87 if(memmap[chunk].flags & access_flag) {
88 if (memmap[chunk].flags & MMAP_PTR_IDX) { 88 if (memmap[chunk].flags & MMAP_PTR_IDX) {
89 if (memmap[chunk].flags & MMAP_FUNC_NULL) { 89 if (memmap[chunk].flags & MMAP_FUNC_NULL) {
90 cmp_irdisp(code, 0, opts->context_reg, opts->mem_ptr_off + sizeof(void*) * memmap[chunk].ptr_index, SZ_PTR); 90 cmp_irdisp(code, 0, opts->context_reg, opts->mem_ptr_off + sizeof(void*) * memmap[chunk].ptr_index, SZ_PTR);
91 code_ptr not_null = code->cur + 1; 91 code_ptr not_null = code->cur + 1;
92 jcc(code, CC_NZ, code->cur + 2); 92 jcc(code, CC_NZ, code->cur + 2);
131 } 131 }
132 jmp(code, opts->load_context); 132 jmp(code, opts->load_context);
133 133
134 *not_null = code->cur - (not_null + 1); 134 *not_null = code->cur - (not_null + 1);
135 } 135 }
136 if (opts->byte_swap && size == SZ_B) { 136 if ((opts->byte_swap || memmap[chunk].flags & MMAP_BYTESWAP) && size == SZ_B) {
137 xor_ir(code, 1, adr_reg, opts->address_size); 137 xor_ir(code, 1, adr_reg, opts->address_size);
138 } 138 }
139 if (opts->address_size != SZ_D) { 139 if (opts->address_size != SZ_D) {
140 movzx_rr(code, adr_reg, adr_reg, opts->address_size, SZ_D); 140 movzx_rr(code, adr_reg, adr_reg, opts->address_size, SZ_D);
141 } 141 }
157 mov_ir(code, 0xFF, opts->scratch1, SZ_B); 157 mov_ir(code, 0xFF, opts->scratch1, SZ_B);
158 } 158 }
159 retn(code); 159 retn(code);
160 *good_addr = code->cur - (good_addr + 1); 160 *good_addr = code->cur - (good_addr + 1);
161 shr_ir(code, 1, adr_reg, opts->address_size); 161 shr_ir(code, 1, adr_reg, opts->address_size);
162 } else if (opts->byte_swap) { 162 } else if (opts->byte_swap || memmap[chunk].flags & MMAP_BYTESWAP) {
163 xor_ir(code, 1, adr_reg, opts->address_size); 163 xor_ir(code, 1, adr_reg, opts->address_size);
164 } 164 }
165 } else if ((memmap[chunk].flags & MMAP_ONLY_ODD) || (memmap[chunk].flags & MMAP_ONLY_EVEN)) { 165 } else if ((memmap[chunk].flags & MMAP_ONLY_ODD) || (memmap[chunk].flags & MMAP_ONLY_EVEN)) {
166 tmp_size = SZ_B; 166 tmp_size = SZ_B;
167 shr_ir(code, 1, adr_reg, opts->address_size); 167 shr_ir(code, 1, adr_reg, opts->address_size);