From: <pa...@us...> - 2008-05-28 09:19:27
|
Revision: 3634 http://fuse-emulator.svn.sourceforge.net/fuse-emulator/?rev=3634&view=rev Author: pak21 Date: 2008-05-28 02:19:17 -0700 (Wed, 28 May 2008) Log Message: ----------- Emulate C, H and P/V on repeated I/O instructions. Modified Paths: -------------- trunk/fuse/hacking/ChangeLog trunk/fuse/z80/z80.pl Modified: trunk/fuse/hacking/ChangeLog =================================================================== --- trunk/fuse/hacking/ChangeLog 2008-05-27 08:49:28 UTC (rev 3633) +++ trunk/fuse/hacking/ChangeLog 2008-05-28 09:19:17 UTC (rev 3634) @@ -2663,3 +2663,4 @@ playing" implemented. 20080527 debugger/{breakpoint.c,debugger_internals.h,event.c}: allow event breakpoints to be set only if the appropriate event is registered. +20080528 z80/z80.pl: emulate C, H and P/V on repeated I/O instructions. Modified: trunk/fuse/z80/z80.pl =================================================================== --- trunk/fuse/z80/z80.pl 2008-05-27 08:49:28 UTC (rev 3633) +++ trunk/fuse/z80/z80.pl 2008-05-28 09:19:17 UTC (rev 3634) @@ -227,19 +227,22 @@ my( $opcode ) = @_; - my $modifier = ( $opcode eq 'INI' ? '++' : '--' ); + my $modifier = ( $opcode eq 'INI' ? '+' : '-' ); print << "CODE"; { - libspectrum_word initemp; + libspectrum_byte initemp, initemp2; contend_read_no_mreq( IR, 1 ); initemp = readport( BC ); writebyte( HL, initemp ); - B--; HL$modifier; - F = ( initemp & 0x80 ? FLAG_N : 0 ) | sz53_table[B]; - /* C,H and P/V flags not implemented */ + B--; HL$modifier$modifier; + initemp2 = initemp + C $modifier 1; + F = ( initemp & 0x80 ? FLAG_N : 0 ) | + ( ( initemp2 < initemp ) ? FLAG_H | FLAG_C : 0 ) | + ( parity_table[ ( initemp2 & 0x07 ) ^ B ] ? FLAG_P : 0 ) | + sz53_table[B]; } CODE } @@ -248,19 +251,22 @@ my( $opcode ) = @_; - my $modifier = ( $opcode eq 'INIR' ? '++' : '--' ); + my $modifier = ( $opcode eq 'INIR' ? '+' : '-' ); print << "CODE"; { - libspectrum_word initemp; + libspectrum_byte initemp, initemp2; contend_read_no_mreq( IR, 1 ); initemp = readport( BC ); writebyte( HL, initemp ); - B--; - F = ( initemp & 0x80 ? FLAG_N : 0 ) | sz53_table[B]; - /* C,H and P/V flags not implemented */ + B--; HL$modifier$modifier; + initemp2 = initemp + C $modifier 1; + F = ( initemp & 0x80 ? FLAG_N : 0 ) | + ( ( initemp2 < initemp ) ? FLAG_H | FLAG_C : 0 ) | + ( parity_table[ ( initemp2 & 0x07 ) ^ B ] ? FLAG_P : 0 ) | + sz53_table[B]; if( B ) { contend_write_no_mreq( HL, 1 ); contend_write_no_mreq( HL, 1 ); @@ -268,7 +274,6 @@ contend_write_no_mreq( HL, 1 ); PC -= 2; } - HL$modifier; } CODE } @@ -328,7 +333,7 @@ print << "CODE"; { - libspectrum_word outitemp; + libspectrum_byte outitemp, outitemp2; contend_read_no_mreq( IR, 1 ); outitemp = readbyte( HL ); @@ -336,8 +341,11 @@ writeport(BC,outitemp); HL$modifier; - F = (outitemp & 0x80 ? FLAG_N : 0 ) | sz53_table[B]; - /* C,H and P/V flags not implemented */ + outitemp2 = outitemp + L; + F = ( outitemp & 0x80 ? FLAG_N : 0 ) | + ( ( outitemp2 < outitemp ) ? FLAG_H | FLAG_C : 0 ) | + ( parity_table[ ( outitemp2 & 0x07 ) ^ B ] ? FLAG_P : 0 ) | + sz53_table[B]; if( B ) { contend_read_no_mreq( BC, 1 ); contend_read_no_mreq( BC, 1 ); @@ -357,7 +365,7 @@ print << "CODE"; { - libspectrum_word outitemp; + libspectrum_byte outitemp, outitemp2; contend_read_no_mreq( IR, 1 ); outitemp = readbyte( HL ); @@ -365,8 +373,11 @@ writeport(BC,outitemp); HL$modifier; - F = (outitemp & 0x80 ? FLAG_N : 0 ) | sz53_table[B]; - /* C,H and P/V flags not implemented */ + outitemp2 = outitemp + L; + F = ( outitemp & 0x80 ? FLAG_N : 0 ) | + ( ( outitemp2 < outitemp ) ? FLAG_H | FLAG_C : 0 ) | + ( parity_table[ ( outitemp2 & 0x07 ) ^ B ] ? FLAG_P : 0 ) | + sz53_table[B]; } CODE } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |