Fixed virtual keyboard bug, fixed CPIR and CPDR instructions

This commit is contained in:
fabio.olimpieri 2012-05-25 18:22:35 +00:00
parent dd1edcde76
commit a93b567fda
5 changed files with 1056 additions and 1032 deletions

View File

@ -791,6 +791,11 @@ inline void read_keyboard () {
ordenador.keyboard_buffer[0][ordenador.kbd_buffer_pointer+1] = 0; ordenador.keyboard_buffer[0][ordenador.kbd_buffer_pointer+1] = 0;
ordenador.keyboard_buffer[1][ordenador.kbd_buffer_pointer+1] = 0; ordenador.keyboard_buffer[1][ordenador.kbd_buffer_pointer+1] = 0;
} }
else
{
joybutton_matrix[0][(ordenador.keyboard_buffer[0][ordenador.kbd_buffer_pointer+1])]=1;
joybutton_matrix[0][(ordenador.keyboard_buffer[1][ordenador.kbd_buffer_pointer+1])]=1;
}
countdown--; countdown--;
} }
else if (ordenador.kbd_buffer_pointer) else if (ordenador.kbd_buffer_pointer)
@ -1275,16 +1280,18 @@ void Z80free_Out (register word Port, register byte Value) {
register word maskport; register word maskport;
if (((Port&0x0001)==0)||((Port>=0x4000)&&(Port<0x8000))||Port == 0xBF3B||Port == 0xFF3B) { if (((Port&0x0001)==0)||((Port>=0x4000)&&(Port<0x8000))) {
do_contention(); do_contention();
} }
// ULAPlus // ULAPlus
if (Port == 0xBF3B) { if (Port == 0xBF3B) {
do_contention();
ordenador.ulaplus_reg = Value; ordenador.ulaplus_reg = Value;
return; return;
} }
if (Port == 0xFF3B) { if (Port == 0xFF3B) {
do_contention();
if (ordenador.ulaplus_reg==0x40) { // mode if (ordenador.ulaplus_reg==0x40) { // mode
ordenador.ulaplus=Value&0x01; ordenador.ulaplus=Value&0x01;
return; return;
@ -1348,13 +1355,14 @@ byte Z80free_In (register word Port) {
static unsigned int temporal_io; static unsigned int temporal_io;
byte pines; byte pines;
if (((Port&0x0001)==0)||((Port>=0x4000)&&(Port<0x8000))||Port == 0xFF3B) { if (((Port&0x0001)==0)||((Port>=0x4000)&&(Port<0x8000))) {
do_contention(); do_contention();
} }
temporal_io = (unsigned int) Port; temporal_io = (unsigned int) Port;
if (Port == 0xFF3B) { if (Port == 0xFF3B) {
do_contention();
if (ordenador.ulaplus_reg==0x40) { // mode if (ordenador.ulaplus_reg==0x40) { // mode
return(ordenador.ulaplus&0x01); return(ordenador.ulaplus&0x01);
} }

View File

@ -1,5 +1,5 @@
CC = gcc -c -O1 -Wall CC = gcc -c -O1 -Wall -DBYTE_ORDER=LITTLE_ENDIAN
CCo = gcc -O1 -Wall CCo = gcc -O1 -Wall -DBYTE_ORDER=LITTLE_ENDIAN
z80free_tester: z80free_tester.o Z80free.o Z80free_codes.o Z80free_codesCB.o Z80free_codesED.o Z80free_codesDD.o Z80free_codesFD.o Z80free_codesDDCB.o Z80free_codesFDCB.o z80free_tester: z80free_tester.o Z80free.o Z80free_codes.o Z80free_codesCB.o Z80free_codesED.o Z80free_codesDD.o Z80free_codesFD.o Z80free_codesDDCB.o Z80free_codesFDCB.o
$(CCo) -o z80free_tester z80free_tester.o Z80free.o Z80free_codes.o Z80free_codesCB.o Z80free_codesED.o Z80free_codesDD.o Z80free_codesFD.o Z80free_codesDDCB.o Z80free_codesFDCB.o $(CCo) -o z80free_tester z80free_tester.o Z80free.o Z80free_codes.o Z80free_codesCB.o Z80free_codesED.o Z80free_codesDD.o Z80free_codesFD.o Z80free_codesDDCB.o Z80free_codesFDCB.o

View File

@ -22,7 +22,10 @@
#ifndef Z80FREE_H #ifndef Z80FREE_H
#define Z80FREE_H #define Z80FREE_H
#ifdef GEKKO
#include <machine/endian.h> #include <machine/endian.h>
#endif
#ifndef Z80_H #ifndef Z80_H
typedef unsigned short int word; typedef unsigned short int word;
typedef unsigned char byte; typedef unsigned char byte;

View File

@ -279,8 +279,8 @@ int Z80free_codesED (Z80FREE *processor,byte opcode) {
processor->PC=Z80free_doPop(processor); processor->PC=Z80free_doPop(processor);
return (10); return (10);
break; break;
case 78: // IM 1 case 78: // IM 0
processor->IM=1; processor->IM=0;
return (4); return (4);
break; break;
case 79: // LD R,A case 79: // LD R,A
@ -724,11 +724,14 @@ int Z80free_codesED (Z80FREE *processor,byte opcode) {
processor->Rm.wr.BC--; processor->Rm.wr.BC--;
if ((processor->Rm.wr.BC)&&(!(processor->Rm.br.F&F_Z))) { if ((processor->Rm.wr.BC)&&(!(processor->Rm.br.F&F_Z))) {
processor->PC-=2; processor->PC-=2;
Z80free_valFlag(processor,F_C,tmp2);
return (17); return (17);
} else { } else {
Z80free_resFlag(processor,F_H|F_N|F_PV|F_3|F_5); Z80free_resFlag(processor,F_H|F_PV|F_3|F_5);
Z80free_setFlag(processor,F_N);
Z80free_valFlag(processor,F_C,tmp2); Z80free_valFlag(processor,F_C,tmp2);
return (12); if (processor->Rm.wr.BC)
Z80free_setFlag(processor,F_PV); return (12);
} }
break; break;
case 178: // INIR case 178: // INIR
@ -786,11 +789,14 @@ int Z80free_codesED (Z80FREE *processor,byte opcode) {
processor->Rm.wr.BC--; processor->Rm.wr.BC--;
if ((processor->Rm.wr.BC)&&(!(processor->Rm.br.F&F_Z))) { if ((processor->Rm.wr.BC)&&(!(processor->Rm.br.F&F_Z))) {
processor->PC-=2; processor->PC-=2;
Z80free_valFlag(processor,F_C,tmp2);
return (17); return (17);
} else { } else {
Z80free_resFlag(processor,F_H|F_N|F_PV|F_3|F_5); Z80free_resFlag(processor,F_H|F_PV|F_3|F_5);
Z80free_setFlag(processor,F_N);
Z80free_valFlag(processor,F_C,tmp2); Z80free_valFlag(processor,F_C,tmp2);
return (12); if (processor->Rm.wr.BC)
Z80free_setFlag(processor,F_PV); return (12);
} }
break; break;
case 186: // INDR case 186: // INDR

View File

@ -838,7 +838,7 @@ class z80_parser(generic_parser):
return False return False
if opcode=="OUTI": if opcode=="OUTI":
self.file_out.write("\t\t/*OUTI, OUTD, OTIR and OTDR first decrements B and then uses it*/\n") self.file_out.write("\t\t/*OUTI, OUTD, OTIR and OTDR first decrement B and then uses it*/\n")
self.file_out.write("\t\tprocessor->Rm.br.B=Z80free_doIncDec(processor,processor->Rm.br.B,1);\n") self.file_out.write("\t\tprocessor->Rm.br.B=Z80free_doIncDec(processor,processor->Rm.br.B,1);\n")
self.file_out.write("\t\tZ80free_Out(processor->Rm.wr.BC,Z80free_Rd(processor->Rm.wr.HL));\n") self.file_out.write("\t\tZ80free_Out(processor->Rm.wr.BC,Z80free_Rd(processor->Rm.wr.HL));\n")
self.file_out.write("\t\tprocessor->Rm.wr.HL++;\n") self.file_out.write("\t\tprocessor->Rm.wr.HL++;\n")
@ -910,8 +910,11 @@ class z80_parser(generic_parser):
self.file_out.write("\t\t\tprocessor->PC-=2;\n") self.file_out.write("\t\t\tprocessor->PC-=2;\n")
self.file_out.write("\t\t\treturn ("+str(tst1)+");\n") self.file_out.write("\t\t\treturn ("+str(tst1)+");\n")
self.file_out.write("\t\t} else {\n") self.file_out.write("\t\t} else {\n")
self.file_out.write("\t\t\tZ80free_resFlag(processor,F_H|F_N|F_PV|F_3|F_5);\n") self.file_out.write("\t\t\tZ80free_resFlag(processor,F_H|F_PV|F_3|F_5);\n")
self.file_out.write("\t\t\tZ80free_setFlag(processor,F_N);\n")
self.file_out.write("\t\tZ80free_valFlag(processor,F_C,tmp2);\n") self.file_out.write("\t\tZ80free_valFlag(processor,F_C,tmp2);\n")
self.file_out.write("\t\tif (processor->Rm.wr.BC)\n")
self.file_out.write("\t\t\tZ80free_setFlag(processor,F_PV);")
self.file_out.write("\t\t\treturn ("+str(tst2)+");\n") self.file_out.write("\t\t\treturn ("+str(tst2)+");\n")
self.file_out.write("\t\t}\n") self.file_out.write("\t\t}\n")
return True return True
@ -964,8 +967,11 @@ class z80_parser(generic_parser):
self.file_out.write("\t\t\tprocessor->PC-=2;\n") self.file_out.write("\t\t\tprocessor->PC-=2;\n")
self.file_out.write("\t\t\treturn ("+str(tst1)+");\n") self.file_out.write("\t\t\treturn ("+str(tst1)+");\n")
self.file_out.write("\t\t} else {\n") self.file_out.write("\t\t} else {\n")
self.file_out.write("\t\t\tZ80free_resFlag(processor,F_H|F_N|F_PV|F_3|F_5);\n") self.file_out.write("\t\t\tZ80free_resFlag(processor,F_H|F_PV|F_3|F_5);\n")
self.file_out.write("\t\t\tZ80free_setFlag(processor,F_N);\n")
self.file_out.write("\t\tZ80free_valFlag(processor,F_C,tmp2);\n") self.file_out.write("\t\tZ80free_valFlag(processor,F_C,tmp2);\n")
self.file_out.write("\t\tif (processor->Rm.wr.BC)\n")
self.file_out.write("\t\t\tZ80free_setFlag(processor,F_PV);")
self.file_out.write("\t\t\treturn ("+str(tst2)+");\n") self.file_out.write("\t\t\treturn ("+str(tst2)+");\n")
self.file_out.write("\t\t}\n") self.file_out.write("\t\t}\n")
return True return True
@ -1306,3 +1312,4 @@ aparser=parser_ED("Z80free_codesED")
aparser=parser_FD("Z80free_codesFD") aparser=parser_FD("Z80free_codesFD")
aparser=parser_FDCB("Z80free_codesFDCB") aparser=parser_FDCB("Z80free_codesFDCB")