home *** CD-ROM | disk | FTP | other *** search
- /* Misc.c: Z80 misc arithmetic & CPU control instructions.
- *
- * Copyright 1996 Rui Fernando Ferreira Ribeiro.
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
- */
-
- #include "env.h"
-
- /*=========================================================================*
- * daa *
- *=========================================================================*/
- void daa()
- {
- T(4);
- if(flags._H = (((A & (UCHAR)0xF) > (UCHAR)9) || flags._H ))
- A += (flags._N) ? (UCHAR)(-6) : (UCHAR)6;
- if(flags._C = ((A > (UCHAR)0x9F) || flags._C ))
- A += (flags._N) ? (UCHAR)(-0x60) : (UCHAR)0x60;
- flags._S = ( A & (UCHAR)BIT_7);
- flags._Z = !A;
- flags._P = parity(A);
- flags._X = A & (UCHAR)BIT_5;
- flags._Y = A & (UCHAR)BIT_3;
- }
-
- /*=========================================================================*
- * cpl *
- *=========================================================================*/
- void cpl()
- {
- T(4);
- A = (UCHAR)~A;
- flags._H = flags._N = 1;
- flags._X = A & (UCHAR)BIT_5;
- flags._Y = A & (UCHAR)BIT_3;
- }
-
- /*=========================================================================*
- * neg *
- *=========================================================================*/
- void neg()
- {
- T(8);
- flags._H = !(A & (UCHAR)0xF);
- flags._C = !A;
- flags._P = (A == (UCHAR)BIT_7);
- flags._S = ((A =(UCHAR)(~A + 1)) & (UCHAR)BIT_7);
- flags._Z = !A;
- flags._N = 1;
- flags._X = A & (UCHAR)BIT_5;
- flags._Y = A & (UCHAR)BIT_3;
- }
-
- /*=========================================================================*
- * ccf *
- *=========================================================================*/
- void ccf()
- {
- T(4);
- flags._C = !(flags._H = flags._C);
- flags._N = 0;
- }
-
- /*=========================================================================*
- * scf *
- *=========================================================================*/
- void scf()
- {
- T(4);
- flags._C = 1;
- flags._H = flags._N = 0;
- }
-
- /*=========================================================================*
- * nop *
- *=========================================================================*/
- void nop()
- {
- T(4);
- }
-
- /*=========================================================================*
- * halt *
- *=========================================================================*/
- void halt()
- {
- if(!IFF1)
- {
- Panic("HALT with interrupts disabled!");
- }
-
- /* This loop is cutted because timing software is already
- working
- */
- /*while(!int_time())
- {
- nop();
- } */
- clock_ticks = INT_TIME + (clock_ticks % 4 );
- }
-
- /*=========================================================================*
- * di *
- *=========================================================================*/
- void di()
- {
- T(4);
- IFF1 = IFF2 = 0;
- }
-
- /*=========================================================================*
- * ei *
- *=========================================================================*/
- void ei()
- {
- T(4);
- if(int_time())
- clock_ticks = INT_TIME - 1;
-
- IFF1 = IFF2 = 1;
- }
-
- /*=========================================================================*
- * im_0 *
- *=========================================================================*/
- void im_0()
- {
- T(8);
- _IM = 0;
- }
-
- /*=========================================================================*
- * im_1 *
- *=========================================================================*/
- void im_1()
- {
- T(8);
- _IM = 1;
- }
-
- /*=========================================================================*
- * im_2 *
- *=========================================================================*/
- void im_2()
- {
- T(8);
- _IM = 2;
- }
-
-
- /*** auxiliary routines ***/
-
- /*=========================================================================*
- * dummyED *
- *=========================================================================*/
- void dummyED()
- {
- T(8);
- /* invalid opcode (non existant) */
- }
-
- void dummyIX()
- {
- T(4);
- PC--;
- }
-
- void dummyIY()
- {
- T(4);
- PC--;
- }
-
- /* No longer used! --- replace by an array
- */
-
- /*=========================================================================*
- * parity *
- *=========================================================================*/
- /* parity -- in Z80 parity is even */
- /* USHORT parity(num)
- UCHAR num;
- {
- LOCAL UCHAR parit;
- LOCAL UCHAR number;
-
- number = num;
- parit = 1;
- while(number)
- {
- if((UCHAR)0x01 & number)
- parit ^= (UCHAR)1;
- number >>= 1;
- }
- return((USHORT)parit);
- }
- */
- /* Misc.c */
-