# define EXIT_FAILURE 1
#endif
-typedef int bool;
-#ifndef FALSE
-# define FALSE 0
-# define TRUE 1
-#endif
-
-
/* Returns TRUE if the strings 'a' and 'b' are equal. */
#define STREQ(a, b) (strcasecmp((a), (b)) == 0)
inline void
-ErrorLocation( const char *file, int line );
+ErrorLocation(const char *file, int line);
-/*@out@*/ /*@only@*/
void *
-xmalloc( size_t size, const char *filename, int line_number );
-
+xmalloc(size_t size, const char *filename, int line_number);
#endif /* COMMON_H */
#define CPU8051_M 1
#include <stdio.h>
+#include <stdint.h>
#include "reg8051.h"
#include "cpu8051.h"
#include "disasm.h"
#include "instructions_8051.h"
+/* Check if the address is a breakpoint */
+int
+IsBreakpoint(unsigned int address)
+{
+ int k;
+
+ for (k = 0; k < cpu8051.bp_count; k++) {
+ if (cpu8051.bp[k] == address)
+ return 1;
+ }
+
+ /* The address was not found in the list of breakpoints */
+ return 0;
+}
+
+/* Show Breakpoints list */
+void
+ShowBreakpoints(void)
+{
+ int k;
+
+ for (k = 0; k < cpu8051.bp_count; k++)
+ printf("Breakpoint at address = %.4X\n", cpu8051.bp[k]);
+}
+
+/* Set Breakpoint at address at the end of the breakpoint list */
+void
+SetBreakpoint(unsigned int address)
+{
+ if (IsBreakpoint(address))
+ return; /* Already a breakpoint */
+
+ if (cpu8051.bp_count < MAXBP)
+ cpu8051.bp[cpu8051.bp_count++] = address;
+}
+
+/* Clear Breakpoint at Address from list */
+void
+ClearBreakpoint(unsigned int address)
+{
+ int k;
+
+ for (k = 0; k < cpu8051.bp_count; k++) {
+ if (cpu8051.bp[k] == address) {
+ /* Fill removed breakpoint slot with last entry */
+ cpu8051.bp[k] = cpu8051.bp[cpu8051.bp_count - 1];
+ cpu8051.bp_count--;
+ }
+ }
+}
+
+/* Toggle the breakpoint at Address. */
+void
+ToggleBreakpoint(unsigned int address)
+{
+ if (IsBreakpoint(address))
+ ClearBreakpoint(address);
+ else
+ SetBreakpoint(address);
+}
+
void
cpu8051_init(void)
{
cpu8051.pc = 0;
cpu8051.clock = 0;
cpu8051.active_priority = -1;
+ cpu8051.bp_count = 0;
}
/* Reset the registers and CPU state */
void
cpu8051_Reset(void)
{
+ int i;
+
cpu8051.pc = 0;
- cpu8051.clock= 0;
+ cpu8051.clock = 0;
cpu8051.active_priority = -1;
- // Reinitialisation des registres
- int i;
- for ( i = 0; i < 256; i++ ) {
+ /* Reset registers */
+
+ for (i = 0; i < 256; i++) {
/* Clear IRAM nad SFR */
- memory_write8( INT_MEM_ID, i, 0 );
+ memory_write8(INT_MEM_ID, i, 0);
}
- memory_write8( INT_MEM_ID, _P0_, 0xFF );
- memory_write8( INT_MEM_ID, _P1_, 0xFF );
- memory_write8( INT_MEM_ID, _P2_, 0xFF );
- memory_write8( INT_MEM_ID, _P3_, 0xFF );
- memory_write8( INT_MEM_ID, _SP_, 0x07 );
+ memory_write8(INT_MEM_ID, _P0_, 0xFF);
+ memory_write8(INT_MEM_ID, _P1_, 0xFF);
+ memory_write8(INT_MEM_ID, _P2_, 0xFF);
+ memory_write8(INT_MEM_ID, _P3_, 0xFF);
+ memory_write8(INT_MEM_ID, _SP_, 0x07);
+}
+
+static void
+cpu8051_convert_bit_address(uint8_t bit_address, uint8_t *byte_address,
+ uint8_t *bit_number)
+{
+ if (bit_address > 0x7F) {
+ /* SFR 80-FF */
+ *byte_address = bit_address & 0xF8;
+ *bit_number = bit_address & 0x07;
+ } else {
+ /* 20-2F */
+ *byte_address = (bit_address >> 3) + 0x20;
+ *bit_number = bit_address & 0x07;
+ }
}
/* Write with a direct addressing mode at Address the new Value */
void
-cpu8051_WriteD( unsigned int Address, unsigned char Value )
+cpu8051_WriteD(unsigned int Address, unsigned char Value)
{
- memory_write8( INT_MEM_ID, Address, Value );
+ memory_write8(INT_MEM_ID, Address, Value);
}
-// Write with an indirect addressing mode at Address the new Value
+/* Write with an indirect addressing mode at Address the new Value */
void
-cpu8051_WriteI( unsigned int Address, unsigned char Value )
+cpu8051_WriteI(unsigned int Address, unsigned char Value)
{
- if ( Address > 0x7F ) {
- memory_write8( EXT_MEM_ID, Address, Value );
+ if (Address > 0x7F) {
+ memory_write8(EXT_MEM_ID, Address, Value);
return;
}
- memory_write8( INT_MEM_ID, Address, Value );
+ memory_write8(INT_MEM_ID, Address, Value);
}
-// Write with a bit addressing mode at BitAddress the new Value
+/* Write with a bit addressing mode at BitAddress the new Value */
void
-cpu8051_WriteB( unsigned int BitAddress, unsigned char Value )
+cpu8051_WriteB(uint8_t bit_address, uint8_t value)
{
- unsigned int ByteAddress, BitNumber;
+ uint8_t byte_address;
+ uint8_t bit_number;
unsigned char ByteValue, ByteMask;
- if ( BitAddress > 0x7F ) {
- // SFR 80-FF
- ByteAddress = BitAddress & 0xF8;
- BitNumber = BitAddress & 0x07;
- }
- else {
- // 20-2F
- ByteAddress = ( BitAddress >> 3 ) + 0x20;
- BitNumber = BitAddress & 0x07;
- }
- ByteMask = ( ( 1 << BitNumber ) ^ 0xFF );
- ByteValue = cpu8051_ReadD( ByteAddress ) & ByteMask;
- ByteValue += Value << BitNumber;
- cpu8051_WriteD( ByteAddress, ByteValue );
+ cpu8051_convert_bit_address(bit_address, &byte_address, &bit_number);
+
+ ByteMask = ((1 << bit_number) ^ 0xFF);
+ ByteValue = cpu8051_ReadD(byte_address) & ByteMask;
+ ByteValue += value << bit_number;
+ cpu8051_WriteD(byte_address, ByteValue);
}
-// Read with a direct addressing mode at Address
+/* Read with a direct addressing mode at Address */
unsigned char
-cpu8051_ReadD( unsigned int Address )
+cpu8051_ReadD(unsigned int Address)
{
if (Address > 0xFF)
return memory_read8(EXT_MEM_ID, Address);
return memory_read8(INT_MEM_ID, Address);
}
-// Read with a indirect addressing mode at Address
+/* Read with a indirect addressing mode at Address */
unsigned char
-cpu8051_ReadI( unsigned int Address )
+cpu8051_ReadI(unsigned int Address)
{
- if (Address > 0x7F) {
+ if (Address > 0x7F)
return memory_read8(EXT_MEM_ID, Address);
- }
- else {
+ else
return memory_read8(INT_MEM_ID, Address);
- }
}
-// Read with a bit addressing mode at BitAddress
+/* Read with a bit addressing mode at BitAddress */
unsigned char
-cpu8051_ReadB( unsigned int BitAddress )
+cpu8051_ReadB(uint8_t bit_address)
{
- unsigned int ByteAddress, BitNumber;
+ uint8_t byte_address;
+ uint8_t bit_number;
unsigned char BitValue;
- if ( BitAddress > 0x7F ) {
- // SFR 80-FF
- ByteAddress = BitAddress & 0xF8;
- BitNumber = BitAddress & 0x07;
- }
- else {
- // 20-2F
- ByteAddress = ( BitAddress >> 3 ) + 0x20;
- BitNumber = BitAddress & 0x07;
- }
- BitValue = ( cpu8051_ReadD( ByteAddress ) >> BitNumber );
+ cpu8051_convert_bit_address(bit_address, &byte_address, &bit_number);
+
+ BitValue = (cpu8051_ReadD(byte_address) >> bit_number);
BitValue &= 1;
return BitValue;
}
-// Check interrupts state and process them as needed
static void
-cpu8051_CheckInterrupts()
+cpu8051_process_interrupt(int pc, int pri)
{
unsigned char SP;
+
+ SP = cpu8051_ReadD(_SP_);
+ cpu8051_WriteI(++SP, (cpu8051.pc & 0xFF));
+ cpu8051_WriteI(++SP, (cpu8051.pc >> 8));
+ cpu8051_WriteD(_SP_, SP);
+ cpu8051.pc = 0x0B;
+ cpu8051.active_priority = pri;
+}
+
+
+/* Check interrupts state and process them as needed */
+static void
+cpu8051_CheckInterrupts(void)
+{
int i;
- if ( cpu8051_ReadD( _IE_ ) & 0x80 ) {
- for ( i = 1; i >= 0; i-- )
- if ( cpu8051.active_priority < i ) {
- //------------------------- External interrupt 0 ----------------------------
- // if ( ( cpu8051_ReadD( _IE_ ) & 0x01 ) && ( ( cpu8051_ReadD( _IP_ ) & 0x01 ) ? i : !i ) && pin0 )
- //-------------------------- Interrupt timer 0 -------------------------------
- if ( ( cpu8051_ReadD( _IE_ ) & 0x02 ) && ( ( cpu8051_ReadD( _IP_ & 0x02 ) ? i : !i ) && ( cpu8051_ReadD( _TCON_ ) & 0x20 ) ) ){
- cpu8051_WriteD( _TCON_, cpu8051_ReadD( _TCON_ ) & 0xDF );
- SP = cpu8051_ReadD( _SP_ );
- cpu8051_WriteI( ++SP, ( cpu8051.pc & 0xFF ) );
- cpu8051_WriteI( ++SP, ( cpu8051.pc >> 8 ) );
- cpu8051_WriteD( _SP_, SP );
- cpu8051.pc = 0x0B;
- cpu8051.active_priority = i;
- return;
- }
- //-------------------------- External interrupt 1 ----------------------------
- // if ( ( cpu8051_ReadD( _IE_ ) & 0x04 ) && ( ( cpu8051_ReadD( _IP_ ) & 0x04 ) ? i : !i ) && pin1 )
- //-------------------------- Interrupt timer 1 -------------------------------
- if ( ( cpu8051_ReadD( _IE_ ) & 0x08 ) && ( ( cpu8051_ReadD( _IP_ ) & 0x08 ) ? i : !i ) && ( cpu8051_ReadD( _TCON_ ) & 0x80 ) ) {
- cpu8051_WriteD( _TCON_, cpu8051_ReadD( _TCON_ ) & 0x7F );
- SP = cpu8051_ReadD( _SP_ );
- cpu8051_WriteI( ++SP, ( cpu8051.pc & 0xFF ) );
- cpu8051_WriteI( ++SP, ( cpu8051.pc >> 8 ) );
- cpu8051_WriteD( _SP_, SP );
- cpu8051.pc = 0x1B;
- cpu8051.active_priority = i;
- return;
- }
- //-------------------------- Serial Interrupts -------------------------------
- if ( ( cpu8051_ReadD( _IE_ ) & 0x10 ) && ( ( cpu8051_ReadD( _IP_ ) & 0x10 ) ? i : !i ) && ( cpu8051_ReadD( _SCON_ ) & 0x03 ) ) {
- SP = cpu8051_ReadD( _SP_ );
- cpu8051_WriteI( ++SP, ( cpu8051.pc & 0xFF ) );
- cpu8051_WriteI( ++SP, ( cpu8051.pc >> 8 ) );
- cpu8051_WriteD( _SP_, SP );
- cpu8051.pc = 0x23;
- cpu8051.active_priority = i;
- return;
- }
- //-------------------------- Interrupt timer 2 -------------------------------
- if ( ( cpu8051_ReadD( _IE_ ) & 0x20 ) && ( ( cpu8051_ReadD( _IP_ ) & 0x20 ) ? i : !i ) && ( cpu8051_ReadD( _T2CON_ ) & 0x80 ) ) {
- SP = cpu8051_ReadD( _SP_ );
- cpu8051_WriteI( ++SP, ( cpu8051.pc & 0xFF ) );
- cpu8051_WriteI( ++SP, ( cpu8051.pc >> 8 ) );
- cpu8051_WriteD( _SP_, SP );
- cpu8051.pc = 0x2B;
- cpu8051.active_priority = i;
- return;
- }
+ if ((cpu8051_ReadD(_IE_) & 0x80) == 0)
+ return;
+
+ for (i = 1; i >= 0; i--) {
+ if (cpu8051.active_priority < i) {
+ /* Interrupt timer 0 */
+ if ((cpu8051_ReadD(_IE_) & 0x02) &&
+ ((cpu8051_ReadD(_IP_ & 0x02) ? i : !i) &&
+ (cpu8051_ReadD(_TCON_) & 0x20))) {
+ cpu8051_WriteD(_TCON_,
+ cpu8051_ReadD(_TCON_) & 0xDF);
+ cpu8051_process_interrupt(0x0B, i);
+ return;
+ }
+ /* Interrupt timer 1 */
+ if ((cpu8051_ReadD(_IE_) & 0x08) &&
+ ((cpu8051_ReadD(_IP_) & 0x08) ? i : !i) &&
+ (cpu8051_ReadD(_TCON_) & 0x80)) {
+ cpu8051_WriteD(_TCON_,
+ cpu8051_ReadD(_TCON_) & 0x7F);
+ cpu8051_process_interrupt(0x1B, i);
+ return;
}
+ /* Serial Interrupts */
+ if ((cpu8051_ReadD(_IE_) & 0x10) &&
+ ((cpu8051_ReadD(_IP_) & 0x10) ? i : !i) &&
+ (cpu8051_ReadD(_SCON_) & 0x03)) {
+ cpu8051_process_interrupt(0x23, i);
+ return;
+ }
+ /* Interrupt timer 2 */
+ if ((cpu8051_ReadD(_IE_) & 0x20) &&
+ ((cpu8051_ReadD(_IP_) & 0x20) ? i : !i) &&
+ (cpu8051_ReadD(_T2CON_) & 0x80)) {
+ cpu8051_process_interrupt(0x2B, i);
+ return;
+ }
+ }
}
}
-// Execute les timers
static void
-cpu8051_DoTimers( )
+process_timer(uint8_t tl, uint8_t th, uint8_t tf_mask, uint8_t TR, uint8_t mode,
+ uint8_t GATE, uint32_t TimerCounter)
{
unsigned int tmp;
- unsigned int TR;
- unsigned int MODE;
- unsigned int GATE;
- unsigned int TimerCounter;
- // ----- Timer 0
- TR = cpu8051_ReadD( _TCON_ ) & 0x10;
- MODE = cpu8051_ReadD( _TMOD_ ) & 0x03;
- GATE = cpu8051_ReadD( _TMOD_ ) & 0x08;
- TimerCounter = cpu8051_ReadD( _TMOD_ ) & 0x04;
-
- if ( ( TR && !GATE && !TimerCounter ) || ( MODE == 3 ) )
- switch( MODE ) {
- // Mode 0, compteur de 13 bits.
- case 0 :
- tmp = cpu8051_ReadD( _TH0_ ) * 0x100 + cpu8051_ReadD( _TL0_ );
-
- tmp++;
- tmp &= 0x1FFF; // On ne garde que 13 bits.
-
- if ( tmp == 0 ) // If overflow set TF0
- cpu8051_WriteD( _TCON_, cpu8051_ReadD( _TCON_ ) | 0x20 );
- cpu8051_WriteD( _TH0_, tmp / 0x100 );
- cpu8051_WriteD( _TL0_, tmp & 0xFF );
- break;
-
- // Mode 1, compteur de 16 bits.
- case 1 :
- tmp = cpu8051_ReadD( _TH0_ ) * 0x100 + cpu8051_ReadD( _TL0_ );
- tmp++;
- tmp &= 0xFFFF; // On ne garde que 16 bits.
- if ( tmp == 0 ) // If overflow set TF0
- cpu8051_WriteD( _TCON_, cpu8051_ReadD( _TCON_ ) | 0x20 );
- cpu8051_WriteD( _TH0_, ( tmp / 0x100 ) );
- cpu8051_WriteD( _TL0_, ( tmp & 0xFF ) );
- break;
-
- // Mode 2, Compteur de 8 bits avec Auto-Reload
- case 2 :
- tmp = cpu8051_ReadD( _TL0_ );
- tmp++;
- tmp &= 0xFF;
- if ( tmp == 0 ) { // If overflow -> reload et set TF0
- cpu8051_WriteD( _TCON_, cpu8051_ReadD( _TCON_ ) | 0x20 );
- cpu8051_WriteD( _TL0_, cpu8051_ReadD( _TH0_ ) );
- }
- else
- cpu8051_WriteD( _TL0_, tmp );
- break;
-
- // Mode 3 : TL0 et TH0 sont 2 Timers independants de 8 bits chacuns.
- case 3 :
- if ( TR && !GATE && !TimerCounter ) {
- tmp = cpu8051_ReadD( _TL0_ );
+ switch (mode) {
+ case 0:
+ /* Mode 0, 13-bits counter. */
+ tmp = cpu8051_ReadD(th) * 0x100 + cpu8051_ReadD(tl);
+ tmp++;
+ tmp &= 0x1FFF; /* We keep only 13 bits */
+
+ if (tmp == 0) /* If overflow set TF0 */
+ cpu8051_WriteD(_TCON_, cpu8051_ReadD(_TCON_) | tf_mask);
+ cpu8051_WriteD(_TH0_, tmp / 0x100);
+ cpu8051_WriteD(_TL0_, tmp & 0xFF);
+ break;
+ case 1:
+ /* Mode 1, 16-bits counter */
+ tmp = cpu8051_ReadD(th) * 0x100 + cpu8051_ReadD(tl);
+ tmp++;
+ tmp &= 0xFFFF; /* We keep only 16 bits */
+ if (tmp == 0) /* If overflow set TF0 */
+ cpu8051_WriteD(_TCON_, cpu8051_ReadD(_TCON_) | tf_mask);
+ cpu8051_WriteD(_TH0_, (tmp / 0x100));
+ cpu8051_WriteD(_TL0_, (tmp & 0xFF));
+ break;
+ case 2:
+ /* Mode 2, 8-bits counter with Auto-Reload */
+ tmp = cpu8051_ReadD(tl);
+ tmp++;
+ tmp &= 0xFF;
+ if (tmp == 0) {
+ /* If overflow -> reload and set TF0 */
+ cpu8051_WriteD(_TCON_, cpu8051_ReadD(_TCON_) | tf_mask);
+ cpu8051_WriteD(tl, cpu8051_ReadD(th));
+ } else
+ cpu8051_WriteD(tl, tmp);
+ break;
+ case 3:
+ /* Mode 3 : inactive mode for timer 1 */
+ if (tl == _TL0_) {
+ /* TL0 and TH0 are 2 independents 8-bits timers. */
+ if (TR && !GATE && !TimerCounter) {
+ tmp = cpu8051_ReadD(tl);
tmp++;
tmp &= 0xFF;
- if ( tmp == 0 ) // If TL0 overflow set TF0
- cpu8051_WriteD( _TCON_, cpu8051_ReadD( _TCON_ ) | 0x20 );
- cpu8051_WriteD( _TL0_, tmp );
- } // TH0 utilise TR1 et TF1.
- TR = cpu8051_ReadD( _TCON_ ) & 0x40;
- if ( TR ) {
- tmp = cpu8051_ReadD( _TH0_ );
+ if (tmp == 0) /* If TL0 overflow set TF0 */
+ cpu8051_WriteD(_TCON_,
+ cpu8051_ReadD(_TCON_) |
+ tf_mask);
+ cpu8051_WriteD(tl, tmp);
+ } /* TH0 utilise TR1 et TF1. */
+ TR = cpu8051_ReadD(_TCON_) & 0x40;
+ if (TR) {
+ tmp = cpu8051_ReadD(th);
tmp++;
tmp &= 0xFF;
- if ( tmp == 0 ) // If TH0 overflow set TF1
- cpu8051_WriteD( _TCON_, cpu8051_ReadD( _TCON_ ) | 0x80 ); // TF1 = 1.
- cpu8051_WriteD( _TH0_, tmp );
+ if (tmp == 0) /* If TH0 overflow set TF1 */
+ cpu8051_WriteD(_TCON_,
+ cpu8051_ReadD(_TCON_) |
+ 0x80);
+ cpu8051_WriteD(_TH0_, tmp);
}
- break;
- };
-
-
- // ----- Timer 1
- TR = cpu8051_ReadD( _TCON_ ) & 0x40;
- MODE = ( cpu8051_ReadD( _TMOD_ ) & 0x30 ) >> 4 ;
- GATE = cpu8051_ReadD( _TMOD_ ) & 0x80;
- TimerCounter = cpu8051_ReadD( _TMOD_ ) & 0x40;
-
- if ( TR && !GATE && !TimerCounter )
- switch( MODE ) {
- // Mode 0, compteur de 13 bits.
- case 0 :
- tmp = cpu8051_ReadD( _TH1_ ) * 0x100 + cpu8051_ReadD( _TL1_ );
- tmp++;
- tmp &= 0x1FFF; // On ne garde que 13 bits.
- if ( tmp == 0 ) // If overflow set TF1
- cpu8051_WriteD( _TCON_, cpu8051_ReadD( _TCON_ ) | 0x80 );
- cpu8051_WriteD( _TH1_, tmp / 0x100 );
- cpu8051_WriteD( _TL1_, tmp & 0xFF );
- break;
-
- // Mode 1, compteur de 16 bits.
- case 1 :
- tmp = cpu8051_ReadD( _TH1_ ) * 0x100 + cpu8051_ReadD( _TL1_ );
- tmp++;
- tmp &= 0xFFFF; // On ne garde que 16 bits.
- if ( tmp == 0 ) // If overflow set TF1
- cpu8051_WriteD( _TCON_, cpu8051_ReadD( _TCON_ ) | 0x80 );
- cpu8051_WriteD( _TH1_, ( tmp / 0x100 ) );
- cpu8051_WriteD( _TL1_, ( tmp & 0xFF ) );
- break;
-
- // Mode 2, Compteur de 8 bits avec Auto-Reload
- case 2 :
- tmp = cpu8051_ReadD( _TL1_ );
- tmp++;
- tmp &= 0xFF;
- if ( tmp == 0 ) { // If overflow -> reload et set TF1
- cpu8051_WriteD( _TCON_, cpu8051_ReadD( _TCON_ ) | 0x80 );
- cpu8051_WriteD( _TL1_, cpu8051_ReadD( _TH1_ ) );
- }
- else
- cpu8051_WriteD( _TL1_, tmp );
- break;
-
- // Mode 3 : mode inactif: retient la valeur de TH1 et TL1.
- // Equivalent a TR1 = 0.
- case 3 :
- break;
-
- };
+ }
+ break;
+ }
+}
+
+/* Run timers */
+static void
+cpu8051_DoTimers(void)
+{
+ unsigned int TR;
+ unsigned int MODE;
+ unsigned int GATE;
+ unsigned int TimerCounter;
+
+ /* Timer 0 */
+ TR = cpu8051_ReadD(_TCON_) & 0x10;
+ MODE = cpu8051_ReadD(_TMOD_) & 0x03;
+ GATE = cpu8051_ReadD(_TMOD_) & 0x08;
+ TimerCounter = cpu8051_ReadD(_TMOD_) & 0x04;
+
+ if ((TR && !GATE && !TimerCounter) || (MODE == 3))
+ process_timer(_TL0_, _TH0_, 0x20, TR, MODE, GATE, TimerCounter);
+
+ /* Timer 1 */
+ TR = cpu8051_ReadD(_TCON_) & 0x40;
+ MODE = (cpu8051_ReadD(_TMOD_) & 0x30) >> 4 ;
+ GATE = cpu8051_ReadD(_TMOD_) & 0x80;
+ TimerCounter = cpu8051_ReadD(_TMOD_) & 0x40;
+
+ if (TR && !GATE && !TimerCounter)
+ process_timer(_TL1_, _TH1_, 0x80, TR, MODE, GATE, TimerCounter);
}
/* Execute at address cpu8051.pc from PGMMem */
unsigned char opcode;
int insttiming;
- opcode = memory_read8( PGM_MEM_ID, cpu8051.pc );
+ opcode = memory_read8(PGM_MEM_ID, cpu8051.pc);
cpu8051.pc++;
insttiming = (*opcode_table[opcode])(); /* Function callback. */
-
- for( i = 0; i < insttiming; i++ ) {
+
+ for (i = 0; i < insttiming; i++) {
cpu8051_CheckInterrupts();
cpu8051_DoTimers();
cpu8051.clock++;
}
}
-// Addressing modes defined in the order as they appear in disasm.hpp
-// from table argstext[]
+/*
+ * Addressing modes defined in the order as they appear in disasm.hpp
+ * from table argstext[]
+ */
#define ADDR11 0
#define ADDR16 1
#define DIRECT 3
#define DATA16 22
#define CBITADDR 23
-// SFR Memory map [80h - FFh]
-// ---------------------------------------------------------------
-// F8 | | | | | | | | | FF
-// F0 | B | | | | | | | | F7
-// E8 | | | | | | | | | EF
-// E0 | ACC | | | | | | | | E7
-// D8 | | | | | | | | | DF
-// D0 | PSW | | | | | | | | D7
-// C8 | T2CON| |RCAP2L|RCAP2H| TL2 | TH2 | | | CF
-// C0 | | | | | | | | | C7
-// B8 | IP | | | | | | | | BF
-// B0 | P3 | | | | | | | | B7
-// A8 | IE | | | | | | | | AF
-// A0 | P2 | | | | | | | | A7
-// 98 | SCON | SBUF | | | | | | | 9F
-// 90 | P1 | | | | | | | | 97
-// 88 | TCON | TMOD | TL0 | TL1 | TH0 | TH1 | | | 8F
-// 80 | P0 | SP | DPL | DPH | | | | PCON | 87
-// ---------------------------------------------------------------
-
-// Return as Text the name of the SFR register at Address if any
+/*
+ * SFR Memory map [80h - FFh]
+ * ---------------------------------------------------------------
+ * F8 | | | | | | | | | FF
+ * F0 | B | | | | | | | | F7
+ * E8 | | | | | | | | | EF
+ * E0 | ACC | | | | | | | | E7
+ * D8 | | | | | | | | | DF
+ * D0 | PSW | | | | | | | | D7
+ * C8 | T2CON| |RCAP2L|RCAP2H| TL2 | TH2 | | | CF
+ * C0 | | | | | | | | | C7
+ * B8 | IP | | | | | | | | BF
+ * B0 | P3 | | | | | | | | B7
+ * A8 | IE | | | | | | | | AF
+ * A0 | P2 | | | | | | | | A7
+ * 98 | SCON | SBUF | | | | | | | 9F
+ * 90 | P1 | | | | | | | | 97
+ * 88 | TCON | TMOD | TL0 | TL1 | TH0 | TH1 | | | 8F
+ * 80 | P0 | SP | DPL | DPH | | | | PCON | 87
+ * ---------------------------------------------------------------
+ */
+
+/* Return as Text the name of the SFR register at Address if any */
static int
-cpu8051_SFRMemInfo( unsigned int Address, char *Text )
+cpu8051_SFRMemInfo(unsigned int Address, char *Text)
{
- switch( Address ) {
- case 0x80 : return sprintf( Text, "P0" );
- case 0x81 : return sprintf( Text, "SP" );
- case 0x82 : return sprintf( Text, "DPL" );
- case 0x83 : return sprintf( Text, "DPH" );
- case 0x87 : return sprintf( Text, "PCON" );
- case 0x88 : return sprintf( Text, "TCON" );
- case 0x89 : return sprintf( Text, "TMOD" );
- case 0x8A : return sprintf( Text, "TL0" );
- case 0x8B : return sprintf( Text, "TL1" );
- case 0x8C : return sprintf( Text, "TH0" );
- case 0x8D : return sprintf( Text, "TH1" );
- case 0x90 : return sprintf( Text, "P1" );
- case 0x98 : return sprintf( Text, "SCON" );
- case 0x99 : return sprintf( Text, "SBUF" );
- case 0xA0 : return sprintf( Text, "P2" );
- case 0xA8 : return sprintf( Text, "IE" );
- case 0xB0 : return sprintf( Text, "P3" );
- case 0xB8 : return sprintf( Text, "IP" );
- case 0xC8 : return sprintf( Text, "T2CON" );
- case 0xCA : return sprintf( Text, "RCAP2L" );
- case 0xCB : return sprintf( Text, "RCAP2H" );
- case 0xCC : return sprintf( Text, "TL2" );
- case 0xCD : return sprintf( Text, "TH2" );
- case 0xD0 : return sprintf( Text, "PSW" );
- case 0xE0 : return sprintf( Text, "ACC" );
- case 0xF0 : return sprintf( Text, "B" );
- default : return sprintf( Text, "%.2XH", Address );
+ switch (Address) {
+ case 0x80: return sprintf(Text, "P0");
+ case 0x81: return sprintf(Text, "SP");
+ case 0x82: return sprintf(Text, "DPL");
+ case 0x83: return sprintf(Text, "DPH");
+ case 0x87: return sprintf(Text, "PCON");
+ case 0x88: return sprintf(Text, "TCON");
+ case 0x89: return sprintf(Text, "TMOD");
+ case 0x8A: return sprintf(Text, "TL0");
+ case 0x8B: return sprintf(Text, "TL1");
+ case 0x8C: return sprintf(Text, "TH0");
+ case 0x8D: return sprintf(Text, "TH1");
+ case 0x90: return sprintf(Text, "P1");
+ case 0x98: return sprintf(Text, "SCON");
+ case 0x99: return sprintf(Text, "SBUF");
+ case 0xA0: return sprintf(Text, "P2");
+ case 0xA8: return sprintf(Text, "IE");
+ case 0xB0: return sprintf(Text, "P3");
+ case 0xB8: return sprintf(Text, "IP");
+ case 0xC8: return sprintf(Text, "T2CON");
+ case 0xCA: return sprintf(Text, "RCAP2L");
+ case 0xCB: return sprintf(Text, "RCAP2H");
+ case 0xCC: return sprintf(Text, "TL2");
+ case 0xCD: return sprintf(Text, "TH2");
+ case 0xD0: return sprintf(Text, "PSW");
+ case 0xE0: return sprintf(Text, "ACC");
+ case 0xF0: return sprintf(Text, "B");
+ default: return sprintf(Text, "%.2XH", Address);
}
}
-// Return as Text the decoded BitAddress
+/* Return as Text the decoded BitAddress */
static void
-cpu8051_IntMemBitInfo( unsigned int BitAddress, char *Text )
+cpu8051_IntMemBitInfo(uint8_t bit_address, char *text)
{
- unsigned int ByteAddress, BitNumber;
- int TextLength;
-
- if ( BitAddress > 0x7F ) {
- // SFR 80-FF
- ByteAddress = BitAddress & 0xF8;
- BitNumber = BitAddress & 0x07;
- }
- else {
- // 20-2F
- ByteAddress = ( BitAddress >> 3 ) + 0x20;
- BitNumber = BitAddress & 0x07;
- }
-
- TextLength = cpu8051_SFRMemInfo( ByteAddress, Text );
- // sprintf( &Text[ TextLength ], ".%X" );
- // Modified by Hugo Villeneuve to remove compilation warning
- sprintf( &Text[ TextLength ], ".%X", BitAddress );
+ uint8_t byte_address;
+ uint8_t bit_number;
+ int len;
+
+ cpu8051_convert_bit_address(bit_address, &byte_address, &bit_number);
+
+ len = cpu8051_SFRMemInfo(byte_address, text);
+ sprintf(&text[len], ".%X", bit_address);
}
-// Disasm one instruction at Address into a Text string
+/* Disasm one instruction at Address into a Text string */
int
-cpu8051_Disasm( unsigned int Address, char *Text )
+cpu8051_Disasm(unsigned int Address, char *Text)
{
- int TextLength=0;
+ int len = 0;
char TextTmp[20];
unsigned char OpCode;
int ArgTblOfs;
int InstSize;
int i;
-
- OpCode = memory_read8( PGM_MEM_ID, Address );
- InstSize = InstSizesTbl[ OpCode ];
- //printf("%.4X\n", Address);
-
- TextLength += sprintf( Text, " %.4X ", Address );
-
- for (i = 0; i < InstSize; i++ )
- TextLength += sprintf( &Text[TextLength], " %.2X", memory_read8( PGM_MEM_ID, Address + i ) );
-
+
+ OpCode = memory_read8(PGM_MEM_ID, Address);
+ InstSize = InstSizesTbl[OpCode];
+
+ len += sprintf(Text, " %.4X ", Address);
+
+ for (i = 0; i < InstSize; i++)
+ len += sprintf(&Text[len], " %.2X",
+ memory_read8(PGM_MEM_ID, Address + i));
+
Address++;
-
- for (; TextLength < 17; ) TextLength += sprintf( &Text[ TextLength ], " " );
-
- TextLength += sprintf( &Text[ TextLength ], "%s ", InstTextTbl[ InstTypesTbl[ OpCode ] ] );
+
+ for (; len < 17;)
+ len += sprintf(&Text[len], " ");
+
+ len += sprintf(&Text[len], "%s ",
+ InstTextTbl[InstTypesTbl[OpCode]]);
ArgTblOfs = OpCode << 2;
-
- for (; TextLength < 25; ) TextLength += sprintf( &Text[ TextLength ], " " );
-
- // MOV direct, direct (OpCode 85h) is peculiar, the operands are inverted
- if ( OpCode == 0x85 ) {
- cpu8051_SFRMemInfo( memory_read8( PGM_MEM_ID, Address + 1 ), TextTmp );
- TextLength += sprintf( &Text[ TextLength ], "%s,", TextTmp );
- cpu8051_SFRMemInfo( memory_read8( PGM_MEM_ID, Address ), TextTmp );
- TextLength += sprintf( &Text[ TextLength ], "%s", TextTmp );
+
+ for (; len < 25;)
+ len += sprintf(&Text[len], " ");
+
+ /*
+ * MOV direct, direct (OpCode 85h) is peculiar, the operands
+ * are inverted
+ */
+ if (OpCode == 0x85) {
+ cpu8051_SFRMemInfo(memory_read8(PGM_MEM_ID, Address + 1),
+ TextTmp);
+ len += sprintf(&Text[len], "%s,", TextTmp);
+ cpu8051_SFRMemInfo(memory_read8(PGM_MEM_ID, Address),
+ TextTmp);
+ len += sprintf(&Text[len], "%s", TextTmp);
Address += 2;
return InstSize;
}
-
- for ( i = 1; i <= InstArgTbl[ ArgTblOfs ]; i++ ) {
- switch( InstArgTbl[ ArgTblOfs + i ] ) {
- case ADDR11 : {
- TextLength += sprintf( &Text[ TextLength ], "%.4XH", ( ( OpCode << 3) & 0xF00 ) + ( memory_read8( PGM_MEM_ID, Address ) ) );
+
+ for (i = 1; i <= InstArgTbl[ArgTblOfs]; i++) {
+ switch (InstArgTbl[ArgTblOfs + i]) {
+ case ADDR11: {
+ len += sprintf(&Text[len],
+ "%.4XH", ((OpCode << 3) & 0xF00) +
+ (memory_read8(PGM_MEM_ID, Address)));
Address++;
break;
}
- case ADDR16 : {
- TextLength += sprintf( &Text[ TextLength ], "%.4XH", ( ( memory_read8( PGM_MEM_ID, Address ) << 8 ) + memory_read8( PGM_MEM_ID, Address + 1 ) ) );
+ case ADDR16: {
+ len += sprintf(
+ &Text[len], "%.4XH",
+ ((memory_read8(PGM_MEM_ID, Address) << 8) +
+ memory_read8(PGM_MEM_ID, Address + 1)));
Address += 2;
break;
}
- case DIRECT : {
- cpu8051_SFRMemInfo( memory_read8( PGM_MEM_ID, Address ), TextTmp );
- TextLength += sprintf( &Text[ TextLength ], "%s", TextTmp );
+ case DIRECT: {
+ cpu8051_SFRMemInfo(memory_read8(PGM_MEM_ID, Address),
+ TextTmp);
+ len += sprintf(&Text[len], "%s", TextTmp);
Address++;
break;
}
- case BITADDR : {
- cpu8051_IntMemBitInfo( ( memory_read8( PGM_MEM_ID, Address ) & 0xF8 ), TextTmp );
- TextLength += sprintf( &Text[ TextLength ], "%s.%X" , TextTmp, ( memory_read8( PGM_MEM_ID, Address ) & 7 ) );
+ case BITADDR: {
+ cpu8051_IntMemBitInfo(
+ (memory_read8(PGM_MEM_ID, Address) & 0xF8),
+ TextTmp);
+ len += sprintf(&Text[len], "%s.%X" , TextTmp,
+ (memory_read8(PGM_MEM_ID, Address) & 7));
Address++;
break;
}
- case RELADDR : {
+ case RELADDR: {
Address++;
- TextLength += sprintf( &Text[ TextLength ], "%.4XH", ( Address & 0xFF00 ) + ( ( ( Address & 0xFF ) + memory_read8( PGM_MEM_ID, Address - 1 ) ) & 0xFF ) );
+ len += sprintf(&Text[len], "%.4XH", (Address & 0xFF00) +
+ (((Address & 0xFF) +
+ memory_read8(PGM_MEM_ID,
+ Address - 1)) & 0xFF));
break;
}
- case DATAIMM : {
- TextLength += sprintf( &Text[ TextLength ], "#%.2XH", memory_read8( PGM_MEM_ID, Address ) );
+ case DATAIMM: {
+ len += sprintf(&Text[len], "#%.2XH",
+ memory_read8(PGM_MEM_ID, Address));
Address++;
break;
}
- case DATA16 : {
- TextLength += sprintf( &Text[ TextLength ],"#%.4XH", ( ( memory_read8( PGM_MEM_ID, Address ) << 8 ) + memory_read8( PGM_MEM_ID, Address+1 ) ) );
+ case DATA16: {
+ len += sprintf(&Text[len], "#%.4XH",
+ ((memory_read8(PGM_MEM_ID,
+ Address) << 8) +
+ memory_read8(PGM_MEM_ID, Address+1)));
Address += 2;
break;
}
- case CBITADDR : {
- cpu8051_IntMemBitInfo( ( memory_read8( PGM_MEM_ID, Address ) & 0xF8 ), TextTmp );
- TextLength += sprintf( &Text[ TextLength ], "/%s.%X", TextTmp, ( memory_read8( PGM_MEM_ID, Address ) & 7 ) );
+ case CBITADDR: {
+ cpu8051_IntMemBitInfo((memory_read8(PGM_MEM_ID,
+ Address) & 0xF8),
+ TextTmp);
+ len += sprintf(&Text[len], "/%s.%X", TextTmp,
+ (memory_read8(PGM_MEM_ID, Address) & 7));
Address++;
break;
}
- default : {
- TextLength += sprintf( &Text[ TextLength ],"%s", ArgsTextTbl[ InstArgTbl[ ArgTblOfs + i ] ] );
+ default: {
+ len += sprintf(&Text[len], "%s",
+ ArgsTextTbl[InstArgTbl[ArgTblOfs + i]]);
}
}
- if (i < InstArgTbl[ ArgTblOfs ]) { TextLength += sprintf( &Text[ TextLength ], "," ); }
+ if (i < InstArgTbl[ArgTblOfs])
+ len += sprintf(&Text[len], ",");
}
return InstSize;
#ifndef CPU8051_H
#define CPU8051_H 1
-typedef struct cpu8051_t
-{
- unsigned int pc;
- unsigned long clock;
- int active_priority;
-} cpu8051_t;
+#include <stdint.h>
+
+/* Maximum number of BreakPoints */
+#define MAXBP 32
+
+struct cpu8051_t {
+ unsigned int pc; /* Program counter */
+ unsigned long clock;
+ int active_priority;
+ int bp_count;
+ unsigned int bp[MAXBP]; /* List of breakpoints */
+};
/* Exported variables */
#undef _SCOPE_
# define _SCOPE_ extern
#endif
-_SCOPE_ cpu8051_t cpu8051;
+_SCOPE_ struct cpu8051_t cpu8051;
+
+int
+IsBreakpoint(unsigned int Address);
+
+void
+ShowBreakpoints(void);
+
+void
+SetBreakpoint(unsigned int Address);
+
+void
+ClearBreakpoint(unsigned int Address);
+
+void
+ToggleBreakpoint(unsigned int Address);
void
-cpu8051_init( void );
+cpu8051_init(void);
void
-cpu8051_Exec( void );
+cpu8051_Exec(void);
void
-cpu8051_Reset( void );
+cpu8051_Reset(void);
void
-cpu8051_WriteD( unsigned int Address, unsigned char Value );
+cpu8051_WriteD(unsigned int Address, unsigned char Value);
void
-cpu8051_WriteI( unsigned int Address, unsigned char Value );
+cpu8051_WriteI(unsigned int Address, unsigned char Value);
void
-cpu8051_WriteB( unsigned int BitAddress, unsigned char Value );
+cpu8051_WriteB(uint8_t bit_address, uint8_t value);
unsigned char
-cpu8051_ReadD( unsigned int Address );
+cpu8051_ReadD(unsigned int Address);
unsigned char
-cpu8051_ReadI( unsigned int Address );
+cpu8051_ReadI(unsigned int Address);
unsigned char
-cpu8051_ReadB( unsigned int BitAddress );
+cpu8051_ReadB(uint8_t bit_address);
int
-cpu8051_Disasm( unsigned int Address, char *Text );
+cpu8051_Disasm(unsigned int Address, char *Text);
#endif /* CPU8051_H */
#include "hexfile.h"
#include "keyboard.h"
-/* Maximum number of BreakPoints */
-#define MAXBP 32
-
-static int RunningState;
-static int NbBreakpoints;
-static unsigned int Breakpoints[MAXBP];
-
/* Capitalize all letters in buffer */
static void
Capitalize(char *buffer)
strcpy(buffer, &buffer[k]);
}
-/* Is the a breakpoint at Address */
-static int
-IsBreakpoint(unsigned int Address)
-{
- int Index = 0;
- while (Index < NbBreakpoints && (Breakpoints[Index] != Address))
- Index++;
-
- return ((Breakpoints[Index] == Address) && (Index < NbBreakpoints));
-}
-
-/* Show Breakpoints list */
-static void
-ShowBreakpoints(void)
-{
- int Index;
-
- for (Index = 0; Index < NbBreakpoints ; Index++)
- printf("Breakpoint at Address = %.4X\n", Breakpoints[Index]);
-}
-
-/* Clear Breakpoint at Address from list */
-static void
-ClearBreakpoint(unsigned int Address)
-{
- int Index = 0;
- while ((Index < NbBreakpoints) && (Breakpoints[Index] != Address))
- Index++;
- if (Breakpoints[Index] != Address)
- return;
- Breakpoints[Index] = Breakpoints[NbBreakpoints - 1];
- NbBreakpoints--;
-}
-
-/* Set Breakpoint at Address from list */
-static void
-SetBreakpoint(unsigned int Address)
-{
- if (IsBreakpoint(Address))
- return;
- if (NbBreakpoints < MAXBP)
- Breakpoints[NbBreakpoints++] = Address;
-}
-
/* CPU exec and Console UI update */
static void
console_exec(char *Address, char *NumberInst)
}
switch (Command[0]) {
- case 'D':
+ case 'D':
if (strlen(Parameter2) == 0) {
char buf[1024];
-
+
if (STREQ(Command, "DB") &&
(strlen(Parameter1) == 0))
ShowBreakpoints();
cpu8051_init();
- RunningState = 0;
- NbBreakpoints = 0;
-
hex_file = get_hex_filename();
if (hex_file != NULL)
/* Signal DestroyEvent */
static void
-WindowDestroyEvent( GtkWidget *widget, gpointer data )
+WindowDestroyEvent(GtkWidget *widget, gpointer data)
{
#ifdef EMU8051_DEBUG
- g_print( "emugtk_DestroyEvent(...)\n" );
+ g_print("emugtk_DestroyEvent(...)\n");
#endif
- gtk_main_quit();
+ gtk_main_quit();
}
/* Taken from the Gxine source code. */
static GtkWidget *
-AddPixButton( GtkWidget *box, gchar **pixmap_array )
+AddPixButton(GtkWidget *box, gchar **pixmap_array)
{
- GtkWidget *button, *icon;
- GdkPixmap *image;
- GdkBitmap *transparent;
+ GtkWidget *button, *icon;
+ GdkPixmap *image;
+ GdkBitmap *transparent;
- button = gtk_button_new();
- gtk_button_set_relief (GTK_BUTTON(button), GTK_RELIEF_NORMAL );
- image = gdk_pixmap_colormap_create_from_xpm_d(NULL, gdk_colormap_get_system(),
- &transparent, NULL, pixmap_array);
- icon = gtk_pixmap_new( image, transparent );
- gtk_container_add( GTK_CONTAINER(button), icon );
+ button = gtk_button_new();
+ gtk_button_set_relief(GTK_BUTTON(button), GTK_RELIEF_NORMAL);
+ image = gdk_pixmap_colormap_create_from_xpm_d(
+ NULL, gdk_colormap_get_system(),
+ &transparent, NULL, pixmap_array);
+ icon = gtk_pixmap_new(image, transparent);
+ gtk_container_add(GTK_CONTAINER(button), icon);
- gtk_box_pack_start( GTK_BOX(box), button, FALSE, FALSE, 0 );
+ gtk_box_pack_start(GTK_BOX(box), button, FALSE, FALSE, 0);
- return button;
+ return button;
}
/* Creates the Reset, Run, Stop and Step buttons. */
static GtkWidget *
-AddButtons( void )
+AddButtons(void)
{
- GtkWidget *button_hbox;
- GtkWidget *button;
-
- /* The buttons of the hbox are NOT given equal space in the box. */
- button_hbox = gtk_hbox_new( FALSE, 0 );
-
- /* Creating the RESET button. */
- button = AddPixButton( button_hbox, reset_xpm );
- gtk_signal_connect( GTK_OBJECT(button), "clicked",
- GTK_SIGNAL_FUNC(emugtk_ResetEvent),
- NULL );
-
- /* Creating the RUN button. */
- button = AddPixButton( button_hbox, run_xpm );
- gtk_signal_connect( GTK_OBJECT(button), "clicked",
- GTK_SIGNAL_FUNC(emugtk_RunEvent),
- NULL );
-
- /* Creating STOP button. */
- button = AddPixButton( button_hbox, stop_xpm );
- gtk_signal_connect( GTK_OBJECT(button), "clicked",
- GTK_SIGNAL_FUNC(emugtk_StopEvent),
- NULL );
-
- /* Creating STEP button. */
- button = AddPixButton( button_hbox, step_xpm );
- gtk_signal_connect( GTK_OBJECT(button), "clicked",
- GTK_SIGNAL_FUNC(emugtk_StepEvent),
- NULL );
-
- return button_hbox;
+ GtkWidget *button_hbox;
+ GtkWidget *button;
+
+ /* The buttons of the hbox are NOT given equal space in the box. */
+ button_hbox = gtk_hbox_new(FALSE, 0);
+
+ /* Creating the RESET button. */
+ button = AddPixButton(button_hbox, reset_xpm);
+ gtk_signal_connect(GTK_OBJECT(button), "clicked",
+ GTK_SIGNAL_FUNC(emugtk_ResetEvent),
+ NULL);
+
+ /* Creating the RUN button. */
+ button = AddPixButton(button_hbox, run_xpm);
+ gtk_signal_connect(GTK_OBJECT(button), "clicked",
+ GTK_SIGNAL_FUNC(emugtk_RunEvent),
+ NULL);
+
+ /* Creating STOP button. */
+ button = AddPixButton(button_hbox, stop_xpm);
+ gtk_signal_connect(GTK_OBJECT(button), "clicked",
+ GTK_SIGNAL_FUNC(emugtk_StopEvent),
+ NULL);
+
+ /* Creating STEP button. */
+ button = AddPixButton(button_hbox, step_xpm);
+ gtk_signal_connect(GTK_OBJECT(button), "clicked",
+ GTK_SIGNAL_FUNC(emugtk_StepEvent),
+ NULL);
+
+ return button_hbox;
}
GtkWidget *
-AddMenu( void )
+AddMenu(void)
{
- GtkWidget *menu_bar;
+ GtkWidget *menu_bar;
- /* Creating menu item. */
- menu_bar = gtk_menu_bar_new();
+ /* Creating menu item. */
+ menu_bar = gtk_menu_bar_new();
- /* Adding the 'File' submenu */
- FileAddMenu( menu_bar );
+ /* Adding the 'File' submenu */
+ FileAddMenu(menu_bar);
- /* Adding the 'View' submenu */
- ViewAddMenu( menu_bar );
-
- /* Adding the 'Help' submenu */
- HelpAddMenu( menu_bar );
+ /* Adding the 'View' submenu */
+ ViewAddMenu(menu_bar);
- gtk_widget_show_all( GTK_WIDGET( menu_bar ) );
-
- return menu_bar;
+ /* Adding the 'Help' submenu */
+ HelpAddMenu(menu_bar);
+
+ gtk_widget_show_all(GTK_WIDGET(menu_bar));
+
+ return menu_bar;
}
static void
-emugtk_window_init( void )
+emugtk_window_init(void)
{
- GtkWidget *main_vbox;
- GtkWidget *menu_bar;
- GtkWidget *buttons_bar;
- GtkWidget *emufixed;
- GtkWidget *fixed_frame;
-
- mainwin = gtk_window_new( GTK_WINDOW_TOPLEVEL );
- gtk_window_set_title( GTK_WINDOW(mainwin), PACKAGE );
- gtk_widget_set_usize( GTK_WIDGET(mainwin), MAIN_WIN_WIDTH, MAIN_WIN_HEIGHT );
- gtk_container_set_border_width( GTK_CONTAINER(mainwin), 0 );
-
- /* Window DESTROY event. */
- gtk_signal_connect( GTK_OBJECT(mainwin), "destroy", GTK_SIGNAL_FUNC(WindowDestroyEvent),
- NULL );
-
- /* Setting main window geometry based on command line options (if specified). */
- /*MainWindowSetGeometry();*/
-
- /* main_vbox contains the menu bar and body_vbox (for all remaining items). */
- main_vbox = gtk_vbox_new( FALSE, 1 );
-
- /* Creating the menu bar. */
- menu_bar = AddMenu();
- /* Adding menu bar to main_vbox */
- gtk_box_pack_start( GTK_BOX(main_vbox), menu_bar, FALSE, FALSE, 1 );
-
- /* Creating the buttons bar. */
- buttons_bar = AddButtons();
- /* Adding buttons bar to main_vbox */
- gtk_box_pack_start( GTK_BOX(main_vbox), buttons_bar, FALSE, FALSE, 1 );
-
- /* Emulator fixed window. */
- emufixed = gtk_fixed_new();
- gtk_widget_set_usize( GTK_WIDGET( emufixed ), MAIN_WIN_WIDTH,
- REG_WIN_HEIGHT + MEM_WIN_HEIGHT + 10 );
-
- /* 8051 registers frame. */
- fixed_frame = regwin_init( REG_WIN_WIDTH, REG_WIN_HEIGHT );
- gtk_fixed_put( GTK_FIXED( emufixed ), fixed_frame, 0, 0 );
-
- /* Program disassembly frame. */
- fixed_frame = pgmwin_init( PGM_WIN_WIDTH, PGM_WIN_HEIGHT );
- gtk_fixed_put( GTK_FIXED( emufixed ), fixed_frame, REG_WIN_WIDTH + 10, 0 );
-
- /* Memory dump frame. */
- fixed_frame = memwin_init( MEM_WIN_WIDTH, MEM_WIN_HEIGHT );
- gtk_fixed_put( GTK_FIXED( emufixed ), fixed_frame, 0, REG_WIN_HEIGHT );
-
- /* Adding fixed window to main_vbox */
- gtk_box_pack_start( GTK_BOX(main_vbox), emufixed, FALSE, FALSE, 1 );
-
- /* Adding the main_vbox to the main window. */
- gtk_container_add( GTK_CONTAINER(mainwin), main_vbox );
-
- gtk_widget_show_all( mainwin );
+ GtkWidget *main_vbox;
+ GtkWidget *menu_bar;
+ GtkWidget *buttons_bar;
+ GtkWidget *emufixed;
+ GtkWidget *fixed_frame;
+
+ mainwin = gtk_window_new(GTK_WINDOW_TOPLEVEL);
+ gtk_window_set_title(GTK_WINDOW(mainwin), PACKAGE);
+ gtk_widget_set_usize(GTK_WIDGET(mainwin),
+ MAIN_WIN_WIDTH, MAIN_WIN_HEIGHT);
+ gtk_container_set_border_width(GTK_CONTAINER(mainwin), 0);
+
+ /* Window DESTROY event. */
+ gtk_signal_connect(GTK_OBJECT(mainwin), "destroy",
+ GTK_SIGNAL_FUNC(WindowDestroyEvent), NULL);
+
+ /*
+ * Setting main window geometry based on command line options
+ * (if specified).
+ */
+ /*MainWindowSetGeometry();*/
+
+ /*
+ * main_vbox contains the menu bar and body_vbox (for all remaining
+ * items).
+ */
+ main_vbox = gtk_vbox_new(FALSE, 1);
+
+ /* Creating the menu bar. */
+ menu_bar = AddMenu();
+ /* Adding menu bar to main_vbox */
+ gtk_box_pack_start(GTK_BOX(main_vbox), menu_bar, FALSE, FALSE, 1);
+
+ /* Creating the buttons bar. */
+ buttons_bar = AddButtons();
+ /* Adding buttons bar to main_vbox */
+ gtk_box_pack_start(GTK_BOX(main_vbox), buttons_bar, FALSE, FALSE, 1);
+
+ /* Emulator fixed window. */
+ emufixed = gtk_fixed_new();
+ gtk_widget_set_usize(GTK_WIDGET(emufixed), MAIN_WIN_WIDTH,
+ REG_WIN_HEIGHT + MEM_WIN_HEIGHT + 10);
+
+ /* 8051 registers frame. */
+ fixed_frame = regwin_init(REG_WIN_WIDTH, REG_WIN_HEIGHT);
+ gtk_fixed_put(GTK_FIXED(emufixed), fixed_frame, 0, 0);
+
+ /* Program disassembly frame. */
+ fixed_frame = pgmwin_init(PGM_WIN_WIDTH, PGM_WIN_HEIGHT);
+ gtk_fixed_put(GTK_FIXED(emufixed), fixed_frame, REG_WIN_WIDTH + 10, 0);
+
+ /* Memory dump frame. */
+ fixed_frame = memwin_init(MEM_WIN_WIDTH, MEM_WIN_HEIGHT);
+ gtk_fixed_put(GTK_FIXED(emufixed), fixed_frame, 0, REG_WIN_HEIGHT);
+
+ /* Adding fixed window to main_vbox */
+ gtk_box_pack_start(GTK_BOX(main_vbox), emufixed, FALSE, FALSE, 1);
+
+ /* Adding the main_vbox to the main window. */
+ gtk_container_add(GTK_CONTAINER(mainwin), main_vbox);
+
+ gtk_widget_show_all(mainwin);
}
-
-int
-main( int argc, char **argv )
+void
+emugtk_new_file(char *file)
{
- char *hex_file;
+ emugtk_StopRunning();
- ParseCommandLineOptions( argc, argv );
+ LoadHexFile(file);
- cpu8051_init();
+ emugtk_Reset();
+ emugtk_UpdateDisplay();
+}
- RunningState = 0;
-
- gtk_init( &argc, &argv );
+int
+main(int argc, char **argv)
+{
+ char *hex_file;
- emugtk_window_init();
+ ParseCommandLineOptions(argc, argv);
- hex_file = get_hex_filename();
+ cpu8051_init();
- if( hex_file != NULL ) {
- emugtk_new_file( hex_file );
- }
+ RunningState = 0;
- /*emugtk_Reset();*/
+ gtk_init(&argc, &argv);
- gtk_main();
+ emugtk_window_init();
- printf( "End of program.\n" );
-
- return EXIT_SUCCESS;
-}
+ hex_file = get_hex_filename();
+ if (hex_file != NULL)
+ emugtk_new_file(hex_file);
-void
-emugtk_new_file( char *file )
-{
- emugtk_StopRunning();
-
- LoadHexFile( file );
-
- emugtk_Reset();
- emugtk_UpdateDisplay();
-}
-
+ gtk_main();
+ printf("End of program.\n");
+ return EXIT_SUCCESS;
+}
void
-AddMenuSeparator( GtkWidget *menu )
+AddMenuSeparator(GtkWidget *menu)
{
- GtkWidget *item;
-
- item = gtk_menu_item_new();
- gtk_menu_append( GTK_MENU(menu), item );
-}
+ GtkWidget *item;
+ item = gtk_menu_item_new();
+ gtk_menu_append(GTK_MENU(menu), item);
+}
void
-emugtk_UpdateDisplay( void )
+emugtk_UpdateDisplay(void)
{
#ifdef EMU8051_DEBUG
- g_print( "emugtk_UpdateDisplay()\n" );
+ g_print("emugtk_UpdateDisplay()\n");
#endif
- regwin_Show();
- pgmwin_Disasm();
- memwin_DumpD("0x00");
+ regwin_Show();
+ pgmwin_Disasm();
+ memwin_DumpD("0x00");
}
-
-
-
-
-
-
-
-
-
-
-
-
-//////////////////////////////////////////////////////////////////////////////
-// CPU reset and Gtk UI update
-//////////////////////////////////////////////////////////////////////////////
+/* CPU reset and Gtk UI update */
void
-emugtk_Reset( void )
+emugtk_Reset(void)
{
- cpu8051_Reset( );
- regwin_Show();
- pgmwin_Disasm();
- memwin_DumpD("0x00");
+ cpu8051_Reset();
+ regwin_Show();
+ pgmwin_Disasm();
+ memwin_DumpD("0x00");
}
-
-//////////////////////////////////////////////////////////////////////////////
-// CPU Step and Gtk UI update
-//////////////////////////////////////////////////////////////////////////////
+/* CPU Step and Gtk UI update */
void
-emugtk_Step( void )
+emugtk_Step(void)
{
- cpu8051_Exec();
- regwin_Show();
- pgmwin_Disasm();
- memwin_DumpD("0x00");
+ cpu8051_Exec();
+ regwin_Show();
+ pgmwin_Disasm();
+ memwin_DumpD("0x00");
}
-
-//////////////////////////////////////////////////////////////////////////////
-// Signal ResetEvent ( ResetButton )
-//////////////////////////////////////////////////////////////////////////////
+/* Signal ResetEvent (ResetButton) */
void
-emugtk_ResetEvent( GtkWidget *widget, GdkEvent *event, gpointer data )
+emugtk_ResetEvent(GtkWidget *widget, GdkEvent *event, gpointer data)
{
#ifdef EMU8051_DEBUG
- g_print( "emugtk_ResetEvent(...)\n" );
+ g_print("emugtk_ResetEvent(...)\n");
#endif
- emugtk_StopRunning( );
- emugtk_Reset( );
+ emugtk_StopRunning();
+ emugtk_Reset();
}
-
-//////////////////////////////////////////////////////////////////////////////
-// Signal RunEvent ( RunButton )
-//////////////////////////////////////////////////////////////////////////////
+/* Signal RunEvent (RunButton) */
void
-emugtk_RunEvent( GtkWidget *widget, GdkEvent *event, gpointer data )
+emugtk_RunEvent(GtkWidget *widget, GdkEvent *event, gpointer data)
{
#ifdef EMU8051_DEBUG
- g_print( "emugtk_RunEvent(...)\n" );
+ g_print("emugtk_RunEvent(...)\n");
#endif
- if ( RunningState ) {
- // g_print( "Getting out of RunningState! \n" );
- emugtk_StopRunning( );
- }
- else {
- // g_print( "Going In RunningState! \n" );
- emugtk_StartRunning( );
- }
+ if (RunningState)
+ emugtk_StopRunning();
+ else
+ emugtk_StartRunning();
}
-
-//////////////////////////////////////////////////////////////////////////////
-// Signal StopEvent ( StopButton )
-//////////////////////////////////////////////////////////////////////////////
+/* Signal StopEvent (StopButton) */
void
-emugtk_StopEvent( GtkWidget *widget, GdkEvent *event, gpointer data )
+emugtk_StopEvent(GtkWidget *widget, GdkEvent *event, gpointer data)
{
#ifdef EMU8051_DEBUG
- g_print( "emugtk_StopEvent(...)\n" );
+ g_print("emugtk_StopEvent(...)\n");
#endif
- emugtk_StopRunning( );
+ emugtk_StopRunning();
}
-
-//////////////////////////////////////////////////////////////////////////////
-// Signal StepEvent ( StepButton )
-//////////////////////////////////////////////////////////////////////////////
+/* Signal StepEvent (StepButton) */
void
-emugtk_StepEvent( GtkWidget *widget, GdkEvent *event, gpointer data )
+emugtk_StepEvent(GtkWidget *widget, GdkEvent *event, gpointer data)
{
#ifdef EMU8051_DEBUG
- g_print( "emugtk_StepEvent(...)\n" );
+ g_print("emugtk_StepEvent(...)\n");
#endif
- emugtk_StopRunning( );
- emugtk_Step();
+ emugtk_StopRunning();
+ emugtk_Step();
}
-
-//////////////////////////////////////////////////////////////////////////////
-// Running called by RunningFunction( )
-//////////////////////////////////////////////////////////////////////////////
+/* Running called by RunningFunction() */
void
-emugtk_Running( )
+emugtk_Running()
{
- cpu8051_Exec( );
- if( pgmwin_IsBreakpoint( cpu8051.pc ) ) {
+ cpu8051_Exec();
+ if (IsBreakpoint(cpu8051.pc)) {
#ifdef EMU8051_DEBUG
- g_print( "Breakpoint Hit, stopping!\n" );
+ g_print("Breakpoint Hit, stopping!\n");
#endif
- emugtk_StopRunning( );
- }
+ emugtk_StopRunning();
+ }
}
-
-//////////////////////////////////////////////////////////////////////////////
-// RunningFunction called when idle from gtk_main
-//////////////////////////////////////////////////////////////////////////////
+/* RunningFunction called when idle from gtk_main */
gboolean
-RunningFunction( gpointer data )
+RunningFunction(gpointer data)
{
- emugtk_Running( );
- return TRUE;
+ emugtk_Running();
+ return TRUE;
}
-
-//////////////////////////////////////////////////////////////////////////////
-// Get in the RunningState
-//////////////////////////////////////////////////////////////////////////////
+/* Get in the RunningState */
void
-emugtk_StartRunning( void )
+emugtk_StartRunning(void)
{
- if ( !RunningState ) {
+ if (!RunningState) {
#ifdef EMU8051_DEBUG
- printf( "emugtk_StartRunning( )\n" );
+ printf("emugtk_StartRunning()\n");
#endif
- RunFuncTag = gtk_idle_add( RunningFunction, 0 );
+ RunFuncTag = gtk_idle_add(RunningFunction, 0);
- RunningState = 1;
- }
+ RunningState = 1;
+ }
}
-
-//////////////////////////////////////////////////////////////////////////////
-// Step out of RunningState
-//////////////////////////////////////////////////////////////////////////////
+/* Step out of RunningState */
void
-emugtk_StopRunning( )
+emugtk_StopRunning()
{
- if (RunningState) {
+ if (RunningState) {
#ifdef EMU8051_DEBUG
- printf( "emugtk_StopRunning( )\n" );
+ printf("emugtk_StopRunning()\n");
#endif
- gtk_idle_remove( RunFuncTag );
- RunningState = 0;
- regwin_Show();
- pgmwin_Disasm();
- memwin_DumpD("0x00");
- }
+ gtk_idle_remove(RunFuncTag);
+ RunningState = 0;
+ regwin_Show();
+ pgmwin_Disasm();
+ memwin_DumpD("0x00");
+ }
}
#ifndef EMUGTK_H
#define EMUGTK_H 1
-
#include <gtk/gtk.h>
#include "gtksizes.h"
+void
+AddMenuSeparator(GtkWidget *menu);
void
-AddMenuSeparator( GtkWidget *menu );
+emugtk_new_file(char *file);
void
-emugtk_new_file( char *file );
+emugtk_StopRunning(void);
void
-emugtk_StopRunning( void );
+emugtk_Reset(void);
void
-emugtk_Reset( void );
+emugtk_UpdateDisplay(void);
+
+void emugtk_Step(void);
void
-emugtk_UpdateDisplay( void );
+emugtk_ResetEvent(GtkWidget *widget, GdkEvent *event, gpointer data);
-void emugtk_Step( );
+void
+emugtk_RunEvent(GtkWidget *widget, GdkEvent *event, gpointer data);
-void emugtk_ResetEvent( GtkWidget *widget, GdkEvent *event, gpointer data );
-void emugtk_RunEvent( GtkWidget *widget, GdkEvent *event, gpointer data );
-void emugtk_StopEvent( GtkWidget *widget, GdkEvent *event, gpointer data );
-void emugtk_StepEvent( GtkWidget *widget, GdkEvent *event, gpointer data );
+void
+emugtk_StopEvent(GtkWidget *widget, GdkEvent *event, gpointer data);
-void emugtk_StartRunning( );
+void
+emugtk_StepEvent(GtkWidget *widget, GdkEvent *event, gpointer data);
+
+void
+emugtk_StartRunning(void);
-void emugtk_Running( );
+void
+emugtk_Running(void);
#endif /* EMUGTK_H */
#include "messagebox.h"
#include "filemenu.h"
-
#define FILENAME_DESCRIPTION "Open Intel Hex file"
-
static void
-FileOpenDialog_OK( GtkWidget *widget, gpointer file_dialog )
+FileOpenDialog_OK(GtkWidget *widget, gpointer file_dialog)
{
- char *selected_file;
+ char *selected_file;
#if defined(DEBUG)
- g_print( "FileOpenDialog_OK()\n" );
+ g_print("FileOpenDialog_OK()\n");
#endif
-
- /* The cast to (char *) is to remove a warning in GTK2, because the return value of the
- gtk_file_selection_get_filename() function is 'G_CONST_RETURN gchar *'. */
- selected_file =
- (char *) gtk_file_selection_get_filename( GTK_FILE_SELECTION(file_dialog) );
- g_print( "emugtk_File = %s\n", selected_file );
+ /*
+ * The cast to (char *) is to remove a warning in GTK2, because the
+ * return value of the gtk_file_selection_get_filename() function is
+ * 'G_CONST_RETURN gchar *'.
+ */
+ selected_file = (char *) gtk_file_selection_get_filename(
+ GTK_FILE_SELECTION(file_dialog));
- emugtk_new_file( selected_file );
+ g_print("emugtk_File = %s\n", selected_file);
- gtk_widget_destroy( GTK_WIDGET(file_dialog) );
-}
+ emugtk_new_file(selected_file);
+ gtk_widget_destroy(GTK_WIDGET(file_dialog));
+}
void
-FileOpenEvent( GtkObject *object, gpointer data )
+FileOpenEvent(GtkObject *object, gpointer data)
{
- GtkWidget *file_dialog;
+ GtkWidget *file_dialog;
#if defined(DEBUG)
- g_print( "FileOpenEvent()\n" );
+ g_print("FileOpenEvent()\n");
#endif
- /* Create a new file selection widget. */
- file_dialog = gtk_file_selection_new( FILENAME_DESCRIPTION );
-
- /* Connect the file dialog's OK button up to a handler. */
- gtk_signal_connect( GTK_OBJECT( GTK_FILE_SELECTION(file_dialog)->ok_button ), "clicked",
- GTK_SIGNAL_FUNC(FileOpenDialog_OK), file_dialog );
-
- /* Ensure that the file selection dialog box is destroyed when the user clicks CANCEL. */
- gtk_signal_connect_object( GTK_OBJECT( GTK_FILE_SELECTION(file_dialog)->cancel_button),
- "clicked", GTK_SIGNAL_FUNC(gtk_widget_destroy),
- (gpointer) file_dialog );
-
- /* Set the 'File Open dialog' to show only Intel HEX files (.hex). */
- /* gtk_file_selection_complete( GTK_FILE_SELECTION( FileOpendialog ), "*.hex" ); */
-
- /* Show the dialog. */
- gtk_widget_show( GTK_WIDGET(file_dialog) );
-
- /* To have the main window of our application being unusable while using the dialog. */
- gtk_window_set_modal( GTK_WINDOW(file_dialog), TRUE );
+ /* Create a new file selection widget. */
+ file_dialog = gtk_file_selection_new(FILENAME_DESCRIPTION);
+
+ /* Connect the file dialog's OK button up to a handler. */
+ gtk_signal_connect(
+ GTK_OBJECT(GTK_FILE_SELECTION(file_dialog)->ok_button),
+ "clicked", GTK_SIGNAL_FUNC(FileOpenDialog_OK), file_dialog);
+
+ /*
+ * Ensure that the file selection dialog box is destroyed when the user
+ * clicks CANCEL.
+ */
+ gtk_signal_connect_object(
+ GTK_OBJECT(GTK_FILE_SELECTION(file_dialog)->cancel_button),
+ "clicked", GTK_SIGNAL_FUNC(gtk_widget_destroy),
+ (gpointer) file_dialog);
+
+ /* Show the dialog. */
+ gtk_widget_show(GTK_WIDGET(file_dialog));
+
+ /*
+ * To have the main window of our application being unusable while
+ * using the dialog.
+ */
+ gtk_window_set_modal(GTK_WINDOW(file_dialog), TRUE);
}
-
static void
-FileQuitEvent( gchar *string )
+FileQuitEvent(gchar *string)
{
#if defined(DEBUG)
- g_print( "%s\n", string );
+ g_print("%s\n", string);
#endif
- emugtk_StopRunning();
- gtk_main_quit();
+ emugtk_StopRunning();
+ gtk_main_quit();
}
-
void
-FileAddMenu( GtkWidget *menu_bar )
+FileAddMenu(GtkWidget *menu_bar)
{
- GtkWidget *item;
- GtkWidget *menu;
-
- menu = gtk_menu_new();
-
- /* Create the 'open' item. */
- item = gtk_menu_item_new_with_label( FILENAME_DESCRIPTION );
- gtk_menu_append( GTK_MENU(menu), item );
- /* Attach the callback functions to the activate signal. */
- gtk_signal_connect_object( GTK_OBJECT(item), "activate", GTK_SIGNAL_FUNC(FileOpenEvent),
- NULL );
-
- AddMenuSeparator(menu);
-
- item = gtk_menu_item_new_with_label("Exit");
- gtk_menu_append( GTK_MENU(menu), item );
- /* We can attach the Quit menu item to our exit function */
- gtk_signal_connect_object( GTK_OBJECT(item), "activate", GTK_SIGNAL_FUNC(FileQuitEvent),
- (gpointer) "file.quit" );
-
- /* Adding submenu title. */
- item = gtk_menu_item_new_with_label( "File" );
- gtk_menu_item_set_submenu( GTK_MENU_ITEM(item), menu );
- gtk_menu_bar_append( GTK_MENU_BAR( menu_bar ), item );
+ GtkWidget *item;
+ GtkWidget *menu;
+
+ menu = gtk_menu_new();
+
+ /* Create the 'open' item. */
+ item = gtk_menu_item_new_with_label(FILENAME_DESCRIPTION);
+ gtk_menu_append(GTK_MENU(menu), item);
+ /* Attach the callback functions to the activate signal. */
+ gtk_signal_connect_object(GTK_OBJECT(item), "activate",
+ GTK_SIGNAL_FUNC(FileOpenEvent), NULL);
+
+ AddMenuSeparator(menu);
+
+ item = gtk_menu_item_new_with_label("Exit");
+ gtk_menu_append(GTK_MENU(menu), item);
+ /* We can attach the Quit menu item to our exit function */
+ gtk_signal_connect_object(GTK_OBJECT(item), "activate",
+ GTK_SIGNAL_FUNC(FileQuitEvent),
+ (gpointer) "file.quit");
+
+ /* Adding submenu title. */
+ item = gtk_menu_item_new_with_label("File");
+ gtk_menu_item_set_submenu(GTK_MENU_ITEM(item), menu);
+ gtk_menu_bar_append(GTK_MENU_BAR(menu_bar), item);
}
#ifndef FILEMENU_H
#define FILEMENU_H 1
-
#include <gtk/gtk.h>
-
void
-FileOpenEvent( GtkObject *object, gpointer data );
+FileOpenEvent(GtkObject *object, gpointer data);
void
-FileResetEvent( GtkObject *object, gpointer data );
+FileResetEvent(GtkObject *object, gpointer data);
void
-FileAddMenu( GtkWidget *menu_bar );
-
+FileAddMenu(GtkWidget *menu_bar);
#endif /* FILEMENU_H */
#include "messagebox.h"
#include "helpmenu.h"
-
static void
-HelpCommandsEvent( gchar *string )
+HelpCommandsEvent(gchar *string)
{
- ShowMessage( "Command Line Options", COMMAND_LINE_OPTIONS, GTK_JUSTIFY_LEFT,
- MESSAGE_DIALOG_FIXED_FONT );
+ ShowMessage("Command Line Options", COMMAND_LINE_OPTIONS,
+ GTK_JUSTIFY_LEFT, MESSAGE_DIALOG_FIXED_FONT);
}
-
static void
-HelpAboutEvent( gchar *string )
+HelpAboutEvent(gchar *string)
{
- ShowMessage( "About", VERSION_STRING, GTK_JUSTIFY_CENTER, MESSAGE_DIALOG_NORMAL_FONT );
+ ShowMessage("About", VERSION_STRING, GTK_JUSTIFY_CENTER,
+ MESSAGE_DIALOG_NORMAL_FONT);
}
-
void
-HelpAddMenu( GtkWidget *menu_bar )
+HelpAddMenu(GtkWidget *menu_bar)
{
- GtkWidget *item;
- GtkWidget *menu;
-
- menu = gtk_menu_new();
+ GtkWidget *item;
+ GtkWidget *menu;
+
+ menu = gtk_menu_new();
+
+ /* Create the 'Help Command Line Options' item. */
+ item = gtk_menu_item_new_with_label("Command Line Options");
+ gtk_menu_append(GTK_MENU(menu), item);
+ /* Attach the callback functions to the activate signal. */
+ gtk_signal_connect_object(GTK_OBJECT(item), "activate",
+ GTK_SIGNAL_FUNC(HelpCommandsEvent),
+ NULL);
- /* Create the 'Help Command Line Options' item. */
- item = gtk_menu_item_new_with_label("Command Line Options");
- gtk_menu_append( GTK_MENU(menu), item );
- /* Attach the callback functions to the activate signal. */
- gtk_signal_connect_object( GTK_OBJECT(item), "activate",
- GTK_SIGNAL_FUNC(HelpCommandsEvent),
- NULL );
+ AddMenuSeparator(menu);
- AddMenuSeparator(menu);
+ /* Create the 'Help About' item. */
+ item = gtk_menu_item_new_with_label("About " PACKAGE);
+ gtk_menu_append(GTK_MENU(menu), item);
+ /* Attach the callback functions to the activate signal. */
+ gtk_signal_connect_object(GTK_OBJECT(item), "activate",
+ GTK_SIGNAL_FUNC(HelpAboutEvent),
+ NULL);
- /* Create the 'Help About' item. */
- item = gtk_menu_item_new_with_label( "About " PACKAGE );
- gtk_menu_append( GTK_MENU(menu), item );
- /* Attach the callback functions to the activate signal. */
- gtk_signal_connect_object( GTK_OBJECT(item), "activate",
- GTK_SIGNAL_FUNC(HelpAboutEvent),
- NULL );
-
- /* Adding submenu title. */
- item = gtk_menu_item_new_with_label( "Help" );
- gtk_menu_item_set_submenu( GTK_MENU_ITEM(item), menu );
- gtk_menu_bar_append( GTK_MENU_BAR( menu_bar ), item );
+ /* Adding submenu title. */
+ item = gtk_menu_item_new_with_label("Help");
+ gtk_menu_item_set_submenu(GTK_MENU_ITEM(item), menu);
+ gtk_menu_bar_append(GTK_MENU_BAR(menu_bar), item);
}
#include <gtk/gtk.h>
-
void
-HelpAddMenu( GtkWidget *menu_bar );
-
+HelpAddMenu(GtkWidget *menu_bar);
#endif /* HELPMENU_H */
/* Convert an ascii string to an hexadecimal number. */
unsigned int
-Ascii2Hex( char *istring, int length )
+Ascii2Hex(char *istring, int length)
{
unsigned int result = 0;
int i, ascii_code;
- if ( !length || ( length > (int) strlen(istring) ) ) {
+ if (!length || (length > (int) strlen(istring)))
length = strlen(istring);
- }
-
- for ( i = 0; i < length; i++ ) {
- ascii_code = istring[ i ];
- if ( ascii_code > 0x39 ) {
+
+ for (i = 0; i < length; i++) {
+ ascii_code = istring[i];
+ if (ascii_code > 0x39)
ascii_code &= 0xDF;
- }
- if ( ( ascii_code >= 0x30 && ascii_code <= 0x39 ) ||
- ( ascii_code >= 0x41 && ascii_code <= 0x46 ) ) {
+
+ if ((ascii_code >= 0x30 && ascii_code <= 0x39) ||
+ (ascii_code >= 0x41 && ascii_code <= 0x46)) {
ascii_code -= 0x30;
- if ( ascii_code > 9 ) {
+ if (ascii_code > 9)
ascii_code -= 7;
- }
+
result <<= 4;
result += ascii_code;
- }
- else {
- printf( "%s: In Ascii2Hex(), syntax error.\n", PACKAGE );
- }
+ } else
+ printf("%s: In Ascii2Hex(), syntax error.\n", PACKAGE);
}
return result;
}
-
void
-LoadHexFile( const char *filename )
+LoadHexFile(const char *filename)
{
int i, j, RecLength, LoadOffset, RecType, Data, Checksum;
-
+
#define LINE_BUFFER_LEN 256
FILE *fp;
int status;
}
/* Trying to open the file. */
- fp = fopen( filename, "r" );
- if( fp == NULL ) {
- perror( PACKAGE );
- /*ErrorLocation( __FILE__, __LINE__ );*/
- exit( EXIT_FAILURE );
+ fp = fopen(filename, "r");
+ if (fp == NULL) {
+ perror(PACKAGE);
+ /*ErrorLocation(__FILE__, __LINE__);*/
+ exit(EXIT_FAILURE);
}
-
+
/* Reading one line of data from the hex file. */
/* char *fgets(char *s, int size, FILE *stream);
- Reading stops after an EOF or a newline. If a newline is read, it is
- stored into the buffer. A '\0' is stored after the last character in
- the buffer. */
- while( fgets( line, LINE_BUFFER_LEN, fp ) != NULL ) {
+ Reading stops after an EOF or a newline. If a newline is read, it is
+ stored into the buffer. A '\0' is stored after the last character
+ in the buffer.
+ */
+ while (fgets(line, LINE_BUFFER_LEN, fp) != NULL) {
i = 0;
Checksum = 0;
- if ( line[ i++ ] != ':' ) {
- printf( "%s: line not beginning with \":\"\n", PACKAGE );
+ if (line[i++] != ':') {
+ printf("%s: line not beginning with \":\"\n", PACKAGE);
goto close_file;
}
-
- RecLength = Ascii2Hex( &line[ i ], 2 );
+
+ RecLength = Ascii2Hex(&line[i], 2);
i += 2;
Checksum += RecLength;
-
- LoadOffset = Ascii2Hex( &line[i], 4 );
+
+ LoadOffset = Ascii2Hex(&line[i], 4);
Checksum += LoadOffset / 256;
Checksum += LoadOffset % 256;
i += 4;
-
- RecType = Ascii2Hex( &line[i],2);
+
+ RecType = Ascii2Hex(&line[i], 2);
i += 2;
Checksum += RecType;
-
- if ( RecType == 1 ) {
- Checksum += Ascii2Hex( &line[ i ], 2 );
- if ( Checksum &= 0x000000FF ) {
+
+ if (RecType == 1) {
+ Checksum += Ascii2Hex(&line[i], 2);
+ Checksum &= 0x000000FF;
+
+ if (Checksum) {
/* Error. */
- printf( "%s: Invalid format\n", PACKAGE );
+ printf("%s: Invalid format\n", PACKAGE);
goto close_file;
- }
- else {
+ } else {
/* OK */
goto close_file;
}
- }
-
- for ( j = 0; j < RecLength; j++ ) {
- Data = Ascii2Hex( &line[ i ], 2 );
- memory_write8( PGM_MEM_ID, (unsigned int)(LoadOffset + j), (unsigned char)Data );
+ }
+
+ for (j = 0; j < RecLength; j++) {
+ Data = Ascii2Hex(&line[i], 2);
+ memory_write8(PGM_MEM_ID,
+ (unsigned int)(LoadOffset + j),
+ (unsigned char)Data);
i += 2;
Checksum += Data;
}
-
- RecType = Ascii2Hex( &line[ i ], 2 );
- Checksum += RecType;
-
- if ( Checksum &= 0x000000FF ) {
- printf( "%s: Invalid format\n", PACKAGE );
+
+ RecType = Ascii2Hex(&line[i], 2);
+ Checksum += RecType;
+ Checksum &= 0x000000FF;
+
+ if (Checksum) {
+ printf("%s: Invalid format\n", PACKAGE);
goto close_file;
}
}
-
+
close_file:
- status = fclose( fp );
- if( status != EXIT_SUCCESS ) {
- fprintf( stderr, "%s: Error closing hex file.\n", PACKAGE );
- /*ErrorLocation( __FILE__, __LINE__ );*/
- exit( EXIT_FAILURE );
+ status = fclose(fp);
+ if (status != EXIT_SUCCESS) {
+ fprintf(stderr, "%s: Error closing hex file.\n", PACKAGE);
+ /*ErrorLocation(__FILE__, __LINE__);*/
+ exit(EXIT_FAILURE);
}
}
Ascii2Hex(char *istring, int length);
void
-LoadHexFile( const char *filename );
+LoadHexFile(const char *filename);
#endif /* HEXFILE_H */
{
char ch;
int nread;
- if(peek != -1) return 1;
- newtio.c_cc[VMIN]=0;
+ if (peek != -1)
+ return 1;
+ newtio.c_cc[VMIN] = 0;
tcsetattr(0, TCSANOW, &newtio);
- nread = read(0,&ch,1);
- newtio.c_cc[VMIN]=1;
+ nread = read(0, &ch, 1);
+ newtio.c_cc[VMIN] = 1;
tcsetattr(0, TCSANOW, &newtio);
- if(nread == 1) {
+ if (nread == 1) {
peek = ch;
return 1;
}
getch(void)
{
char ch;
- if(peek != -1) {
+ if (peek != -1) {
ch = peek;
peek = -1;
return ch;
}
- read(0,&ch,1);
+ read(0, &ch, 1);
return ch;
}
void
ResetUnixKB(void)
{
- tcsetattr(0,TCSANOW, &orig);
+ tcsetattr(0, TCSANOW, &orig);
}
static u_int8_t ext_mem[EXT_MEM_SIZE];
void
-memory_write8( int memory_id, unsigned long address, u_int8_t value )
+memory_write8(int memory_id, unsigned long address, u_int8_t value)
{
- switch( memory_id ) {
+ switch (memory_id) {
case PGM_MEM_ID:
- if( address >= PGM_MEM_SIZE ) {
+ if (address >= PGM_MEM_SIZE) {
printf("Address is greater than PGM_MEM_SIZE\n");
return;
- }
- else {
+ } else
pgm_mem[address] = value;
- }
break;
case INT_MEM_ID:
- if( address >= INT_MEM_SIZE) {
+ if (address >= INT_MEM_SIZE) {
printf("Address is greater than INT_MEM_SIZE\n");
return;
- }
- else {
+ } else
int_mem[address] = value;
- }
break;
case EXT_MEM_ID:
- if( address >= EXT_MEM_SIZE ) {
+ if (address >= EXT_MEM_SIZE) {
printf("Address is greater than EXT_MEM_SIZE\n");
return;
- }
- else {
+ } else
ext_mem[address] = value;
- }
- break;
+ break;
default:
/* Error. */
break;
}
u_int8_t
-memory_read8( int memory_id, unsigned long address )
+memory_read8(int memory_id, unsigned long address)
{
- switch( memory_id ) {
+ switch (memory_id) {
case PGM_MEM_ID:
- if( address < PGM_MEM_SIZE ) {
+ if (address < PGM_MEM_SIZE)
return pgm_mem[address];
- }
else {
printf("Address is greater than PGM_MEM_SIZE\n");
return 0;
}
break;
case INT_MEM_ID:
- if( address < INT_MEM_SIZE ) {
+ if (address < INT_MEM_SIZE)
return int_mem[address];
- }
else {
printf("Address is greater than INT_MEM_SIZE\n");
return 0;
}
break;
case EXT_MEM_ID:
- if( address < EXT_MEM_SIZE ) {
+ if (address < EXT_MEM_SIZE)
return ext_mem[address];
- }
else {
printf("Address is greater than EXT_MEM_SIZE\n");
return 0;
}
- break;
+ break;
default:
/* Error. */
return 0;
};
void
-memory_write8( int memory_id, unsigned long address, u_int8_t value );
+memory_write8(int memory_id, unsigned long address, u_int8_t value);
u_int8_t
-memory_read8( int memory_id, unsigned long address );
+memory_read8(int memory_id, unsigned long address);
void
DumpMem(char *buf, char *Address, int memory_id);
static GtkWidget *memclist;
GtkWidget *
-memwin_init( int width, int height )
+memwin_init(int width, int height)
{
- int i;
- GtkWidget *fixed_frame;
-
- fixed_frame = gtk_frame_new(0);
- gtk_frame_set_shadow_type( GTK_FRAME( fixed_frame ), GTK_SHADOW_ETCHED_OUT );
- gtk_widget_set_usize( GTK_WIDGET( fixed_frame ), width, height );
-
- memclist = gtk_clist_new( 18 );
- gtk_clist_set_selection_mode( GTK_CLIST( memclist ), GTK_SELECTION_SINGLE );
- gtk_widget_set_usize( GTK_WIDGET( memclist ), 620, 250 );
-
- for( i = 0; i < 18; i++ ) {
- gtk_clist_set_column_justification( GTK_CLIST( memclist ), i, GTK_JUSTIFY_LEFT );
- }
-
- gtk_clist_set_column_width( GTK_CLIST( memclist ), 0, 5*8 );
-
- for( i = 1; i < 17; i++ ) {
- gtk_clist_set_column_width( GTK_CLIST( memclist ), i, 2*8 );
- }
-
- gtk_clist_set_column_width( GTK_CLIST( memclist ), 17, 16*8 );
-
-#if ( GTK_MAJOR_VERSION == 2)
- PangoFontDescription *pango_font;
- pango_font = pango_font_description_from_string( FIXED_FONT );
- gtk_widget_modify_font( memclist, pango_font );
-#else
- {
- GtkStyle *style;
- /* Setting font for the widget. */
- style = gtk_style_new();
- gdk_font_unref( style->font );
-
- /* Load a fixed font */
- style->font = gdk_font_load( FIXED_FONT );
- gtk_widget_set_style( GTK_WIDGET( memclist ), style );
- }
-#endif
+ int i;
+ GtkWidget *fixed_frame;
+ PangoFontDescription *pango_font;
+ char *memdummy[] = { 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0 };
- char *memdummy[] = { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 };
- for( i = 0; i < 16; i++ ) {
- gtk_clist_append( GTK_CLIST( memclist ), memdummy );
- }
+ fixed_frame = gtk_frame_new(0);
+ gtk_frame_set_shadow_type(GTK_FRAME(fixed_frame),
+ GTK_SHADOW_ETCHED_OUT);
+ gtk_widget_set_usize(GTK_WIDGET(fixed_frame), width, height);
- gtk_container_add( GTK_CONTAINER( fixed_frame ), memclist );
+ memclist = gtk_clist_new(18);
+ gtk_clist_set_selection_mode(GTK_CLIST(memclist), GTK_SELECTION_SINGLE);
+ gtk_widget_set_usize(GTK_WIDGET(memclist), 620, 250);
- return fixed_frame;
-}
+ for (i = 0; i < 18; i++) {
+ gtk_clist_set_column_justification(
+ GTK_CLIST(memclist), i, GTK_JUSTIFY_LEFT);
+ }
+
+ gtk_clist_set_column_width(GTK_CLIST(memclist), 0, 5*8);
+
+ for (i = 1; i < 17; i++)
+ gtk_clist_set_column_width(GTK_CLIST(memclist), i, 2 * 8);
+
+ gtk_clist_set_column_width(GTK_CLIST(memclist), 17, 16 * 8);
+ pango_font = pango_font_description_from_string(FIXED_FONT);
+ gtk_widget_modify_font(memclist, pango_font);
+
+ for (i = 0; i < 16; i++)
+ gtk_clist_append(GTK_CLIST(memclist), memdummy);
+
+ gtk_container_add(GTK_CONTAINER(fixed_frame), memclist);
+
+ return fixed_frame;
+}
+
/* Dump 16 rows of 16 bytes from Address in Memory (direct addressing) */
void
memwin_DumpD(char *MemAddress)
{
- char TextTmp[1024];
- int row, column, TextLength;
- unsigned int Address;
-
- if (strlen(MemAddress) != 0) {
- if (STREQ(MemAddress, "PC"))
- Address = cpu8051.pc;
- else
- Address = Ascii2Hex(MemAddress, strlen(MemAddress));
- } else {
- Address = 0;
- }
-
- gtk_clist_freeze( GTK_CLIST( memclist ) );
-
- for ( row = 0; row < 16; row++ ) {
- sprintf( TextTmp, "%.4X", Address );
- gtk_clist_set_text( GTK_CLIST( memclist ), row, 0, TextTmp );
-
- for ( column = 0; column < 16; column++ ) {
- sprintf( TextTmp, "%.2X", ( int ) cpu8051_ReadD( Address + column ) );
- gtk_clist_set_text( GTK_CLIST( memclist ), row, column + 1, TextTmp );
- }
-
- TextLength = 0;
- for ( column = 0; column < 16; column++ ) {
- if ( ( ( int ) cpu8051_ReadD( Address + column ) >= 32 ) && ( ( int ) cpu8051_ReadD( Address + column ) <= 126 ) )
- TextLength += sprintf( &TextTmp[ TextLength ], "%c", cpu8051_ReadD( Address + column ) );
- else TextLength += sprintf( &TextTmp[ TextLength ], "." );
- }
- gtk_clist_set_text( GTK_CLIST( memclist ), row, 17, TextTmp );
-
- Address += 16;
- }
-
- gtk_clist_select_row( GTK_CLIST( memclist ), 0, 0 );
- gtk_clist_thaw( GTK_CLIST( memclist ) );
+ char TextTmp[1024];
+ int row, column, TextLength;
+ unsigned int Address;
+
+ if (strlen(MemAddress) != 0) {
+ if (STREQ(MemAddress, "PC"))
+ Address = cpu8051.pc;
+ else
+ Address = Ascii2Hex(MemAddress, strlen(MemAddress));
+ } else {
+ Address = 0;
+ }
+
+ gtk_clist_freeze(GTK_CLIST(memclist));
+
+ for (row = 0; row < 16; row++) {
+ sprintf(TextTmp, "%.4X", Address);
+ gtk_clist_set_text(GTK_CLIST(memclist), row, 0, TextTmp);
+
+ for (column = 0; column < 16; column++) {
+ sprintf(TextTmp, "%.2X",
+ (int) cpu8051_ReadD(Address + column));
+ gtk_clist_set_text(GTK_CLIST(memclist), row,
+ column + 1, TextTmp);
+ }
+
+ TextLength = 0;
+ for (column = 0; column < 16; column++) {
+ if (((int) cpu8051_ReadD(Address + column) >= 32) &&
+ ((int) cpu8051_ReadD(Address + column) <= 126))
+ TextLength += sprintf(
+ &TextTmp[TextLength],
+ "%c", cpu8051_ReadD(Address + column));
+ else
+ TextLength +=
+ sprintf(&TextTmp[TextLength], ".");
+ }
+ gtk_clist_set_text(GTK_CLIST(memclist), row, 17, TextTmp);
+
+ Address += 16;
+ }
+
+ gtk_clist_select_row(GTK_CLIST(memclist), 0, 0);
+ gtk_clist_thaw(GTK_CLIST(memclist));
}
#include "common.h"
#include "messagebox.h"
-
#define MESSAGE_DIALOG_BORDER 25
#define BUTTON_TEXT_BORDER 3
-
/* This function is used to adjust the border around the text in a button. */
static GtkWidget *
-AddTextButton( gchar *button_text )
+AddTextButton(gchar *button_text)
{
- GtkWidget *button;
- GtkWidget *label;
- GtkWidget *label_window;
-
- /* The GtkLabel widget is one of a few GTK+ widgets that don't create their own window to
- render themselves into. Instead, they draw themselves directly onto their parents
- window. This means that in order to set a property for a GtkLabel widget, you need to
- change the property of its parent, i.e. the object that you pack it into.
- Another solution (short term workaround) is to put the label widget inside another
- widget that does get its own window, like the 'ViewPort' or 'EventBox' widget. */
-
- /* Using workaround described above to set the border width of 'label' widget. */
- label_window = gtk_event_box_new();
-
- /* Creating our label. */
- label = gtk_label_new(button_text);
-
- /* Adding label widget to label_window widget. */
- gtk_container_add( GTK_CONTAINER(label_window), label );
-
- /* Changing border width of the label widget by way of label_window widget. */
- gtk_container_set_border_width( GTK_CONTAINER(label_window), BUTTON_TEXT_BORDER );
-
- /* Create the button. */
- button = gtk_button_new();
-
- /* Adding label to button. */
- gtk_container_add( GTK_CONTAINER(button), label_window );
-
- return button;
+ GtkWidget *button;
+ GtkWidget *label;
+ GtkWidget *label_window;
+
+ /*
+ * The GtkLabel widget is one of a few GTK+ widgets that don't create
+ * their own window to render themselves into. Instead, they draw
+ * themselves directly onto their parents window. This means that in
+ * order to set a property for a GtkLabel widget, you need to change the
+ * property of its parent, i.e. the object that you pack it into.
+ * Another solution (short term workaround) is to put the label widget
+ * inside another widget that does get its own window, like the
+ * 'ViewPort' or 'EventBox' widget.
+ */
+
+ /*
+ * Using workaround described above to set the border width of 'label'
+ * widget.
+ */
+ label_window = gtk_event_box_new();
+
+ /* Creating our label. */
+ label = gtk_label_new(button_text);
+
+ /* Adding label widget to label_window widget. */
+ gtk_container_add(GTK_CONTAINER(label_window), label);
+
+ /*
+ * Changing border width of the label widget by way of label_window
+ * widget.
+ */
+ gtk_container_set_border_width(GTK_CONTAINER(label_window),
+ BUTTON_TEXT_BORDER);
+
+ /* Create the button. */
+ button = gtk_button_new();
+
+ /* Adding label to button. */
+ gtk_container_add(GTK_CONTAINER(button), label_window);
+
+ return button;
}
-
void
-ShowMessage( gchar *title, gchar *message, int justification, int font_style )
+ShowMessage(gchar *title, gchar *message, int justification, int font_style)
{
- GtkWidget *dialog;
- GtkWidget *label;
- GtkWidget *okay_button;
- GtkWidget *label_window;
- GtkWidget *center;
-
- /* Set-up a dialog window, centered on the screen. */
- dialog = gtk_dialog_new();
- gtk_window_set_title( GTK_WINDOW(dialog), title );
- gtk_window_set_position( GTK_WINDOW(dialog), GTK_WIN_POS_CENTER );
-
- /* To have the main window of our application being unusable while using the dialog. */
- gtk_window_set_modal( GTK_WINDOW(dialog), TRUE );
-
- /* The GtkLabel widget is one of a few GTK+ widgets that don't create their own window to
- render themselves into. Instead, they draw themselves directly onto their parents
- window. This means that in order to set a property for a GtkLabel widget, you need to
- change the property of its parent, i.e. the object that you pack it into.
- Another solution (short term workaround) is to put the label widget inside another
- widget that does get its own window, like the 'ViewPort' or 'EventBox' widget. */
-
- /* Using workaround described above to set the border width of 'label' widget. */
- label_window = gtk_event_box_new();
-
- /* Creating our label. */
- label = gtk_label_new(message);
- gtk_label_set_justify( GTK_LABEL(label), justification );
-
- if( font_style == MESSAGE_DIALOG_FIXED_FONT ) {
-#if ( GTK_MAJOR_VERSION == 2)
- PangoFontDescription *pango_font;
-
- pango_font = pango_font_description_from_string( FIXED_FONT );
-
- gtk_widget_modify_font( label, pango_font );
-#else
- GtkStyle *style;
-
- /* Setting font for the label. */
- style = gtk_style_new();
- gdk_font_unref( style->font );
-
- /* Load a fixed font */
- style->font = gdk_font_load( FIXED_FONT );
- gtk_widget_set_style( label, style );
-#endif
- }
-
- /* Adding label widget to label_window widget. */
- gtk_container_add( GTK_CONTAINER(label_window), label );
-
- /* Changing border width of the label widget by way of label_window widget. */
- gtk_container_set_border_width( GTK_CONTAINER(label_window), MESSAGE_DIALOG_BORDER );
-
- /* xalign, yalign, xscale, yscale */
- center = gtk_alignment_new( 0.5, 0.5, 0.0, 0.0 );
-
- /* Create the OK button. */
- okay_button = AddTextButton( "OK" );
-
- /* Ensure that the dialog box is destroyed when the user clicks ok. */
- gtk_signal_connect_object( GTK_OBJECT(okay_button), "clicked",
- GTK_SIGNAL_FUNC(gtk_widget_destroy), (gpointer) dialog );
-
- /* Add the OK button to the alignment widget. */
- gtk_container_add( GTK_CONTAINER(center), okay_button );
- /* Add the alignment widget to the dialog window. */
- gtk_container_add( GTK_CONTAINER( GTK_DIALOG(dialog)->action_area ), center );
-
- /* Add the label_window to the dialog window. */
- gtk_container_add( GTK_CONTAINER( GTK_DIALOG(dialog)->vbox ), label_window );
-
- /* Show everything we've added to the dialog. */
- gtk_widget_show_all(dialog);
+ GtkWidget *dialog;
+ GtkWidget *label;
+ GtkWidget *okay_button;
+ GtkWidget *label_window;
+ GtkWidget *center;
+
+ /* Set-up a dialog window, centered on the screen. */
+ dialog = gtk_dialog_new();
+ gtk_window_set_title(GTK_WINDOW(dialog), title);
+ gtk_window_set_position(GTK_WINDOW(dialog), GTK_WIN_POS_CENTER);
+
+ /*
+ * To have the main window of our application being unusable while using
+ * the dialog.
+ */
+ gtk_window_set_modal(GTK_WINDOW(dialog), TRUE);
+
+ /*
+ * The GtkLabel widget is one of a few GTK+ widgets that don't create
+ * their own window to render themselves into. Instead, they draw
+ * themselves directly onto their parents window. This means that in
+ * order to set a property for a GtkLabel widget, you need to change the
+ * property of its parent, i.e. the object that you pack it into.
+ * Another solution (short term workaround) is to put the label widget
+ * inside another widget that does get its own window, like the
+ * 'ViewPort' or 'EventBox' widget.
+ */
+
+ /*
+ * Using workaround described above to set the border width of 'label'
+ * widget.
+ */
+ label_window = gtk_event_box_new();
+
+ /* Creating our label. */
+ label = gtk_label_new(message);
+ gtk_label_set_justify(GTK_LABEL(label), justification);
+
+ if (font_style == MESSAGE_DIALOG_FIXED_FONT) {
+ PangoFontDescription *pango_font;
+
+ pango_font = pango_font_description_from_string(FIXED_FONT);
+ gtk_widget_modify_font(label, pango_font);
+ }
+
+ /* Adding label widget to label_window widget. */
+ gtk_container_add(GTK_CONTAINER(label_window), label);
+
+ /*
+ * Changing border width of the label widget by way of label_window
+ * widget.
+ */
+ gtk_container_set_border_width(GTK_CONTAINER(label_window),
+ MESSAGE_DIALOG_BORDER);
+
+ /* xalign, yalign, xscale, yscale */
+ center = gtk_alignment_new(0.5, 0.5, 0.0, 0.0);
+
+ /* Create the OK button. */
+ okay_button = AddTextButton("OK");
+
+ /* Ensure that the dialog box is destroyed when the user clicks ok. */
+ gtk_signal_connect_object(GTK_OBJECT(okay_button), "clicked",
+ GTK_SIGNAL_FUNC(gtk_widget_destroy),
+ (gpointer) dialog);
+
+ /* Add the OK button to the alignment widget. */
+ gtk_container_add(GTK_CONTAINER(center), okay_button);
+ /* Add the alignment widget to the dialog window. */
+ gtk_container_add(GTK_CONTAINER(GTK_DIALOG(dialog)->action_area),
+ center);
+
+ /* Add the label_window to the dialog window. */
+ gtk_container_add(GTK_CONTAINER(GTK_DIALOG(dialog)->vbox),
+ label_window);
+
+ /* Show everything we've added to the dialog. */
+ gtk_widget_show_all(dialog);
}
#include <gtk/gtk.h>
-
#define MESSAGE_DIALOG_NORMAL_FONT 0
#define MESSAGE_DIALOG_FIXED_FONT 1
-
void
-ShowMessage( gchar *title, gchar *message, int justification, int font_style );
-
+ShowMessage(gchar *title, gchar *message, int justification, int font_style);
#endif /* MESSAGEBOX_H */
print DISASM_H " * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA.\n";
print DISASM_H "*/\n\n";
print DISASM_H "#ifndef DISASM_H\n";
-print DISASM_H "#define DISASM_H 1\n\n\n";
+print DISASM_H "#define DISASM_H 1\n\n";
$nbinst=0;
$nbaddr=0;
$instnumb++;
}
# ------------------------------------------------------------------------------
-print DISASM_H "// For all 256 opcodes, the value in this table gives the instruction type\n";
-print DISASM_H "// ex.: MOV, INC, CLR, CPL,...\n";
-print DISASM_H "// To know what is the instruction type, use the number as an offset in the InstTextTbl[]\n";
+print DISASM_H "/*\n";
+print DISASM_H " * For all 256 opcodes, the value in this table gives the instruction type\n";
+print DISASM_H " * ex.: MOV, INC, CLR, CPL,...\n";
+print DISASM_H " * To know what is the instruction type, use\n";
+print DISASM_H " * the number as an offset in the InstTextTbl[]\n";
+print DISASM_H " */\n";
print DISASM_H "static int InstTypesTbl[] = {\n";
for($i=0;$i<256;$i++) {
print DISASM_H " $insttype[$i]";
if (($i+1) % 16 == 0) { print DISASM_H "\n"; }
}
print DISASM_H "};\n";
-print DISASM_H "\n\n";
+print DISASM_H "\n";
# ------------------------------------------------------------------------------
-print DISASM_H "// Size(in bytes) of each instruction (offset in table is instruction opcode)\n";
+print DISASM_H "/* Size(in bytes) of each instruction (offset in table is instruction opcode) */\n";
print DISASM_H "static int InstSizesTbl[] = {\n";
for($i=0;$i<256;$i++) {
print DISASM_H " $nbbytes[$i]";
if (($i+1) % 16 == 0) { print DISASM_H "\n"; }
}
print DISASM_H "};\n";
-print DISASM_H "\n\n";
+print DISASM_H "\n";
# ------------------------------------------------------------------------------
-print DISASM_H "// List of instructions types referenced by InstTypesTbl[]\n";
+print DISASM_H "/* List of instructions types referenced by InstTypesTbl[] */\n";
$nbelement=@insttext;
print DISASM_H "\#define InstTextTblLength $nbelement\n";
$elementnb=0;
print DISASM_H "\n";
}
print DISASM_H "};\n";
-print DISASM_H "\n\n";
+print DISASM_H "\n";
# ------------------------------------------------------------------------------
-print DISASM_H "// Table describing all arguments types of an instruction\n";
-print DISASM_H "// The table is indexed InstArgTbl[ opcode * 4]\n";
-print DISASM_H "// InstArgTbl[opcode*4 + 1] gives the number of arguments the instruction has\n";
-print DISASM_H "// InstArgTbl[opcode*4 + i] for i=1,2 and 3 give the type of each argument\n";
-print DISASM_H "// for most instructions, the 3rd argument isn't used\n";
-print DISASM_H "// the argument type is referecing to ArgsTextTbl[]\n";
+print DISASM_H "/*\n";
+print DISASM_H " * Table describing all arguments types of an instruction\n";
+print DISASM_H " * The table is indexed InstArgTbl[ opcode * 4]\n";
+print DISASM_H " * InstArgTbl[opcode*4 + 1] gives the number of arguments the instruction has\n";
+print DISASM_H " * InstArgTbl[opcode*4 + i] for i=1,2 and 3 give the type of each argument\n";
+print DISASM_H " * for most instructions, the 3rd argument isn't used\n";
+print DISASM_H " * the argument type is referecing to ArgsTextTbl[]\n";
+print DISASM_H " */\n";
print DISASM_H "\#define InstArgTblLength 256\n";
print DISASM_H "static int InstArgTbl[] = {\n";
for($i=0;$i<1024;$i++) {
if (($i+1) % 16 == 0) { print DISASM_H "\n"; }
}
print DISASM_H "};\n";
-print DISASM_H "\n\n";
+print DISASM_H "\n";
# ------------------------------------------------------------------------------
-print DISASM_H "// List all types of arguments available to instructions\n";
-print DISASM_H "// Referenced by InstArgsTbl[]\n";
+print DISASM_H "/*\n";
+print DISASM_H " * List all types of arguments available to instructions\n";
+print DISASM_H " * Referenced by InstArgsTbl[]\n";
+print DISASM_H " */\n";
$nbelement=@argstypes;
print DISASM_H "\#define ArgsTextTblLength $nbelement\n";
$elementnb=0;
print DISASM_H "\n";
}
print DISASM_H "};\n";
-print DISASM_H "\n\n";
+print DISASM_H "\n";
# ------------------------------------------------------------------------------
for ($i=0 ; $i< 256; $i++) {
print INST_IMP " * Instruction \"$a_instruction[$i]\" takes $a_cycles[$i] cycle(s) and $a_bytes[$i] byte(s).\n";
print INST_IMP " ","*"x76,"/\n";
print INST_IMP "int\n";
- print INST_IMP "cpu8051_OP_$a_opcodehex[$i]( void )\n";
+ print INST_IMP "cpu8051_OP_$a_opcodehex[$i](void)\n";
# TEST hugo new...
# print INST_DEF "int OP_$a_opcodehex[$i]( );\n";
print INST_IMP "{\n";
print INST_DEF "#ifndef INSTRUCTIONS_8051_H\n";
print INST_DEF "#define INSTRUCTIONS_8051_H 1\n\n\n";
-print INST_DEF "#define BANKPSW ( cpu8051_ReadD( _PSW_ ) & 0x18 )\n\n";
-print INST_DEF "typedef int (*OPCODE_FP)( void );\n\n\n";
+print INST_DEF "#define BANKPSW (cpu8051_ReadD(_PSW_) & 0x18)\n\n";
+print INST_DEF "typedef int (*OPCODE_FP)(void);\n\n\n";
for( $i=0; $i<256; $i++ ) {
print INST_DEF "int\n";
- print INST_DEF "cpu8051_OP_$a_opcodehex[$i]( void );\n\n";
+ print INST_DEF "cpu8051_OP_$a_opcodehex[$i](void);\n\n";
}
print INST_DEF "\n";
print INST_DEF "/* Exported variables. */\n";
print INST_DEF "#endif /* INSTRUCTIONS_8051_H */\n";
-
-
-
-
-
-print DISASM_H "\n\n#endif /* DISASM_H */\n";
+print DISASM_H "#endif /* DISASM_H */\n";
close DISASM_H;
close OPCODELST;
* Display the help message and exit
******************************************************************************/
static void
-DisplayUsage( void )
+DisplayUsage(void)
{
- printf( COMMAND_LINE_OPTIONS );
+ printf(COMMAND_LINE_OPTIONS);
}
-
/*******************************************************************************
* Display version information and exit
******************************************************************************/
static void
-DisplayVersion( void )
+DisplayVersion(void)
{
- printf( "\n" );
- printf( " %s, version %s\n", PACKAGE, VERSION );
- printf( " Written by Jonathan St-André, Pascal Fecteau and Hugo Villeneuve\n\n" );
+ printf("\n");
+ printf(" %s, version %s\n", PACKAGE, VERSION);
+ printf(" Written by Jonathan St-André, Pascal Fecteau and Hugo Villeneuve\n\n");
}
-
static void
-InvalidOption( const char *message, /*@null@*/ const char *string )
+InvalidOption(const char *message, /*@null@*/ const char *string)
{
- if( string == NULL ) {
- fprintf(stderr, "%s: %s\n", PACKAGE, message );
- }
- else {
- fprintf(stderr, "%s: %s %s\n", PACKAGE, message, string );
- }
+ if (string == NULL)
+ fprintf(stderr, "%s: %s\n", PACKAGE, message);
+ else
+ fprintf(stderr, "%s: %s %s\n", PACKAGE, message, string);
- fprintf(stderr, "Try `%s -h' for more information.\n", PACKAGE );
+ fprintf(stderr, "Try `%s -h' for more information.\n", PACKAGE);
- exit( EXIT_FAILURE );
+ exit(EXIT_FAILURE);
}
* Initializes the different options passed as arguments on the command line.
******************************************************************************/
void
-ParseCommandLineOptions( int argc, char *argv[] )
+ParseCommandLineOptions(int argc, char *argv[])
{
- int i;
- char *token;
-
- for( i = 1; i < argc; i++ ) {
- token = argv[i];
- switch( token[0] ) {
- case '-':
- /* Processing options names */
- switch( token[1] ) {
- case 'h':
- if( strlen( &token[1] ) == 1 ) {
- DisplayUsage();
- exit( EXIT_SUCCESS );
- }
- InvalidOption( "invalid option", token );
- break;
- case 'v' :
- if( STREQ( "version", &token[1] ) ) {
- DisplayVersion();
- exit( EXIT_SUCCESS );
- }
- else {
- InvalidOption( "invalid option", token );
- }
- break;
- default:
- InvalidOption( "invalid option", token );
- break;
- } /* end switch( token[1] ) */
- break;
- default:
- /* Processing options arguments */
- /* Must be the filename... */
- hex_file = token;
- break;
- } /* end switch( token[0] ) */
- } /* end for */
-
+ int i;
+ char *token;
+
+ for (i = 1; i < argc; i++) {
+ token = argv[i];
+ switch (token[0]) {
+ case '-':
+ /* Processing options names */
+ switch (token[1]) {
+ case 'h':
+ if (strlen(&token[1]) == 1) {
+ DisplayUsage();
+ exit(EXIT_SUCCESS);
+ }
+ InvalidOption("invalid option", token);
+ break;
+ case 'v':
+ if (STREQ("version", &token[1])) {
+ DisplayVersion();
+ exit(EXIT_SUCCESS);
+ } else
+ InvalidOption("invalid option", token);
+ break;
+ default:
+ InvalidOption("invalid option", token);
+ break;
+ } /* end switch(token[1]) */
+ break;
+ default:
+ /* Processing options arguments */
+ /* Must be the filename... */
+ hex_file = token;
+ break;
+ } /* end switch(token[0]) */
+ } /* end for */
}
#include "cpu8051.h"
#include "pgmwin.h"
-
static GtkWidget *pgmclist;
-static int NbBreakpoints;
-static unsigned int Breakpoints[ MAXBP ];
-static unsigned int DisasmAddresses[ 24 ];
-
+static unsigned int DisasmAddresses[24];
/* Disasm 24 lines from CPU */
void
-pgmwin_Disasm( )
-{
- char TextTmp[255];
- int row;
- int InstSize;
- unsigned int Address;
-
- Address = cpu8051.pc;
-
- gtk_clist_freeze( GTK_CLIST( pgmclist ) );
- for ( row = 0; row < 24; row++ ) {
- InstSize = cpu8051_Disasm( Address, TextTmp );
- if ( pgmwin_IsBreakpoint( Address ) ) TextTmp[0] = '*';
- gtk_clist_set_text( GTK_CLIST( pgmclist ), row, 0, TextTmp );
- DisasmAddresses[ row ] = Address;
- Address += InstSize;
- }
- gtk_clist_select_row( GTK_CLIST( pgmclist ), 0, 0 );
- gtk_clist_thaw( GTK_CLIST( pgmclist ) );
-}
-
-
-/* Clear Breakpoint at Address from list */
-static void
-pgmwin_ClearBreakpoint( unsigned int Address )
-{
- int Index = 0;
-
- while( Index < NbBreakpoints && Breakpoints[ Index ] != Address ) {
- Index++;
- }
- if( Breakpoints[ Index ] != Address ) {
- return;
- }
- Breakpoints[ Index ] = Breakpoints[ NbBreakpoints - 1 ];
- NbBreakpoints--;
-}
-
-
-/* Set Breakpoint at Address from list. */
-static void
-pgmwin_SetBreakpoint( unsigned int Address )
-{
- if( pgmwin_IsBreakpoint( Address ) ) {
- return;
- }
- if( NbBreakpoints < MAXBP ) {
- Breakpoints[ NbBreakpoints++ ] = Address;
- }
-}
-
-/* Toggle the breakpoint at Address. */
-static void
-pgmwin_ToggleBreakpoint( unsigned int Address )
-{
- if( pgmwin_IsBreakpoint( Address ) ) {
- pgmwin_ClearBreakpoint( Address );
- }
- else {
- pgmwin_SetBreakpoint( Address );
- }
-}
-
-
-#ifdef dsfdsfs
-/* Show Breakpoints list. */
-static void
-pgmwin_ShowBreakpoints( )
-{
- int Index;
-
- for ( Index = 0; Index < NbBreakpoints ; Index++ ) {
- printf( "Breakpoint at Address = %.4X\n", Breakpoints[ Index ] );
- }
-}
-#endif
-
-
-/* Is the a breakpoint at Address. */
-int
-pgmwin_IsBreakpoint( unsigned int Address )
+pgmwin_Disasm(void)
{
- int Index = 0;
- while( Index < NbBreakpoints && Breakpoints[ Index ] != Address ) {
- Index++;
- }
-
- return ( Breakpoints[ Index ] == Address && Index < NbBreakpoints );
+ char TextTmp[255];
+ int row;
+ int InstSize;
+ unsigned int Address;
+
+ Address = cpu8051.pc;
+
+ gtk_clist_freeze(GTK_CLIST(pgmclist));
+ for (row = 0; row < 24; row++) {
+ InstSize = cpu8051_Disasm(Address, TextTmp);
+ if (IsBreakpoint(Address))
+ TextTmp[0] = '*';
+ gtk_clist_set_text(GTK_CLIST(pgmclist), row, 0, TextTmp);
+ DisasmAddresses[row] = Address;
+ Address += InstSize;
+ }
+ gtk_clist_select_row(GTK_CLIST(pgmclist), 0, 0);
+ gtk_clist_thaw(GTK_CLIST(pgmclist));
}
-
/* Mouse button pressed in the window. */
static gint
-pgmwin_ButtonPressEvent( GtkWidget *widget, GdkEvent *event, gpointer data )
+pgmwin_ButtonPressEvent(GtkWidget *widget, GdkEvent *event, gpointer data)
{
- gint row, column;
- char TextTmp[ 255 ];
-
- //g_print( "pgmwin_ButtonPressEvent(...)\n" );
-
- gtk_clist_get_selection_info( GTK_CLIST( pgmclist ), ( int )event->button.x ,( int )event->button.y, &row, &column );
- if (row >= 24 || row < 0)
- return TRUE;
- if (column >= 1 || column < 0)
- return TRUE;
- sprintf( TextTmp, "pgmwin_ButtonPressEvent( ) at %d,%d\n", column, row );
- g_print( TextTmp );
- pgmwin_ToggleBreakpoint( DisasmAddresses[ row ] );
- pgmwin_Disasm();
-
- return FALSE;
+ gint row, column;
+ char TextTmp[255];
+
+ gtk_clist_get_selection_info(GTK_CLIST(pgmclist),
+ (int) event->button.x,
+ (int) event->button.y, &row, &column);
+ if (row >= 24 || row < 0)
+ return TRUE;
+ if (column >= 1 || column < 0)
+ return TRUE;
+ sprintf(TextTmp, "pgmwin_ButtonPressEvent() at %d,%d\n", column, row);
+ g_print(TextTmp);
+ ToggleBreakpoint(DisasmAddresses[row]);
+ pgmwin_Disasm();
+
+ return FALSE;
}
GtkWidget *
-pgmwin_init( int width, int height )
+pgmwin_init(int width, int height)
{
- int i;
- GtkWidget *fixed_frame;
-
- fixed_frame = gtk_frame_new(0);
- gtk_frame_set_shadow_type( GTK_FRAME( fixed_frame ), GTK_SHADOW_ETCHED_OUT );
- gtk_widget_set_usize( GTK_WIDGET( fixed_frame ), width, height );
-
- pgmclist = gtk_clist_new( 1 );
- gtk_clist_set_selection_mode( GTK_CLIST( pgmclist ), GTK_SELECTION_SINGLE );
- gtk_widget_set_usize( GTK_WIDGET( pgmclist ), width, height );
- gtk_clist_set_column_justification( GTK_CLIST( pgmclist ), 0, GTK_JUSTIFY_LEFT );
- gtk_clist_set_column_width( GTK_CLIST( pgmclist ), 0, width-10 );
-
-#if ( GTK_MAJOR_VERSION == 2)
- PangoFontDescription *pango_font;
- pango_font = pango_font_description_from_string( FIXED_FONT );
- gtk_widget_modify_font( pgmclist, pango_font );
-#else
- {
- GtkStyle *style;
- /* Setting font for the widget. */
- style = gtk_style_new();
- gdk_font_unref( style->font );
-
- /* Load a fixed font */
- style->font = gdk_font_load( FIXED_FONT );
- gtk_widget_set_style( GTK_WIDGET( pgmclist ), style );
- }
-#endif
+ int i;
+ GtkWidget *fixed_frame;
+
+ fixed_frame = gtk_frame_new(0);
+ gtk_frame_set_shadow_type(GTK_FRAME(fixed_frame),
+ GTK_SHADOW_ETCHED_OUT);
+ gtk_widget_set_usize(GTK_WIDGET(fixed_frame), width, height);
+
+ pgmclist = gtk_clist_new(1);
+ gtk_clist_set_selection_mode(GTK_CLIST(pgmclist), GTK_SELECTION_SINGLE);
+ gtk_widget_set_usize(GTK_WIDGET(pgmclist), width, height);
+ gtk_clist_set_column_justification(GTK_CLIST(pgmclist), 0,
+ GTK_JUSTIFY_LEFT);
+ gtk_clist_set_column_width(GTK_CLIST(pgmclist), 0, width-10);
- char *pgmdummy[] = { 0 };
- for( i = 0; i < 24; i++ ) {
- gtk_clist_append( GTK_CLIST( pgmclist ), pgmdummy );
- }
+ PangoFontDescription *pango_font;
+ pango_font = pango_font_description_from_string(FIXED_FONT);
+ gtk_widget_modify_font(pgmclist, pango_font);
- gtk_container_add( GTK_CONTAINER( fixed_frame ), pgmclist );
+ char *pgmdummy[] = { 0 };
+ for (i = 0; i < 24; i++)
+ gtk_clist_append(GTK_CLIST(pgmclist), pgmdummy);
- NbBreakpoints = 0;
+ gtk_container_add(GTK_CONTAINER(fixed_frame), pgmclist);
- gtk_signal_connect( GTK_OBJECT( pgmclist ), "button-press-event",
- GTK_SIGNAL_FUNC( pgmwin_ButtonPressEvent ), NULL );
+ gtk_signal_connect(GTK_OBJECT(pgmclist), "button-press-event",
+ GTK_SIGNAL_FUNC(pgmwin_ButtonPressEvent), NULL);
- return fixed_frame;
+ return fixed_frame;
}
#ifndef PGMWIN_H
#define PGMWIN_H 1
-
#include <gtk/gtk.h>
#include "gtksizes.h"
-
-#define MAXBP 32
-
-
GtkWidget *
-pgmwin_init( int width, int height );
+pgmwin_init(int width, int height);
void
-pgmwin_Disasm( void );
+pgmwin_Disasm(void);
int
-pgmwin_IsBreakpoint( unsigned int Address );
-
+pgmwin_IsBreakpoint(unsigned int address);
#endif /* PGMWIN_H */
#ifndef REG8051_H
#define REG8051_H 1
-
/* SFR Registers ( $80 - $FF ) */
#define _ACC_ 0xE0
#define _B_ 0xF0
#define _BANK2_ 0x10
#define _BANK3_ 0x18
-
#endif /* REG8051_H */
#include "cpu8051.h"
#include "regwin.h"
-
static GtkWidget *regclist;
-
GtkWidget *
-regwin_init( int width, int height )
+regwin_init(int width, int height)
{
- int i;
- GtkWidget *fixed_frame;
-
- fixed_frame = gtk_frame_new(0);
- gtk_frame_set_shadow_type( GTK_FRAME( fixed_frame ), GTK_SHADOW_ETCHED_OUT );
- gtk_widget_set_usize( GTK_WIDGET( fixed_frame ), width, height );
-
- regclist = gtk_clist_new( 1 );
- gtk_clist_set_selection_mode( GTK_CLIST( regclist ), GTK_SELECTION_SINGLE );
- gtk_widget_set_usize( GTK_WIDGET( regclist ), width, height );
- gtk_clist_set_column_justification( GTK_CLIST( regclist ), 0, GTK_JUSTIFY_LEFT );
- gtk_clist_set_column_width( GTK_CLIST( regclist ), 0, width );
-
-#if ( GTK_MAJOR_VERSION == 2)
- PangoFontDescription *pango_font;
- pango_font = pango_font_description_from_string( FIXED_FONT );
- gtk_widget_modify_font( regclist, pango_font );
-#else
- {
- GtkStyle *style;
- /* Setting font for the widget. */
- style = gtk_style_new();
- gdk_font_unref( style->font );
-
- /* Load a fixed font */
- style->font = gdk_font_load( FIXED_FONT );
- gtk_widget_set_style( GTK_WIDGET( regclist ), style );
- }
-#endif
+ int i;
+ GtkWidget *fixed_frame;
+ PangoFontDescription *pango_font;
+ char *regdummy[] = { 0 };
+
+ fixed_frame = gtk_frame_new(0);
+ gtk_frame_set_shadow_type(GTK_FRAME(fixed_frame),
+ GTK_SHADOW_ETCHED_OUT);
+ gtk_widget_set_usize(GTK_WIDGET(fixed_frame), width, height);
+
+ regclist = gtk_clist_new(1);
+ gtk_clist_set_selection_mode(GTK_CLIST(regclist), GTK_SELECTION_SINGLE);
+ gtk_widget_set_usize(GTK_WIDGET(regclist), width, height);
+ gtk_clist_set_column_justification(GTK_CLIST(regclist), 0,
+ GTK_JUSTIFY_LEFT);
+ gtk_clist_set_column_width(GTK_CLIST(regclist), 0, width);
+
+
+ pango_font = pango_font_description_from_string(FIXED_FONT);
+ gtk_widget_modify_font(regclist, pango_font);
+
+ for (i = 0; i < 24; i++)
+ gtk_clist_append(GTK_CLIST(regclist), regdummy);
- char *regdummy[] = { 0 };
- for ( i = 0; i < 24; i++ ) {
- gtk_clist_append( GTK_CLIST( regclist ), regdummy );
- }
-
- gtk_container_add( GTK_CONTAINER( fixed_frame ), regclist );
+ gtk_container_add(GTK_CONTAINER(fixed_frame), regclist);
- return fixed_frame;
+ return fixed_frame;
}
/* Show registers. */
void
-regwin_Show( void )
+regwin_Show(void)
{
- char TextTmp[255];
- int row = 0;
- unsigned char PSW = cpu8051_ReadD( _PSW_ );
- unsigned char Rbank;
-
- gtk_clist_freeze( GTK_CLIST( regclist ) );
-
- // Main registers
- sprintf( TextTmp , "PC = %.4X", cpu8051.pc );
- gtk_clist_set_text( GTK_CLIST( regclist ), row++, 0, TextTmp );
- sprintf( TextTmp , "SP = %.2X", cpu8051_ReadD( _SP_ ) );
- gtk_clist_set_text( GTK_CLIST( regclist ), row++, 0, TextTmp );
- sprintf( TextTmp , "A = %.2X", cpu8051_ReadD( _ACC_ ) );
- gtk_clist_set_text( GTK_CLIST( regclist ), row++, 0, TextTmp );
- sprintf( TextTmp , "B = %.2X", cpu8051_ReadD( _B_ ) );
- gtk_clist_set_text( GTK_CLIST( regclist ), row++, 0, TextTmp );
- sprintf( TextTmp , "DPTR = %.4X", ( cpu8051_ReadD( _DPTRHIGH_ ) << 8 ) + cpu8051_ReadD( _DPTRLOW_ ) );
- gtk_clist_set_text( GTK_CLIST( regclist ), row++, 0, TextTmp );
-
- // Program Status Word
- sprintf( TextTmp , "PSW = %.2X",PSW);
- gtk_clist_set_text( GTK_CLIST( regclist ), row++, 0, TextTmp );
-
- // Ports registers
- sprintf( TextTmp , "P0 = %.2X", cpu8051_ReadD( _P0_ ) );
- gtk_clist_set_text( GTK_CLIST( regclist ), row++, 0, TextTmp );
- sprintf( TextTmp , "P1 = %.2X", cpu8051_ReadD( _P1_ ) );
- gtk_clist_set_text( GTK_CLIST( regclist ), row++, 0, TextTmp );
- sprintf( TextTmp , "P2 = %.2X", cpu8051_ReadD( _P2_ ) );
- gtk_clist_set_text( GTK_CLIST( regclist ), row++, 0, TextTmp );
- sprintf( TextTmp , "P3 = %.2X", cpu8051_ReadD( _P3_ ) );
- gtk_clist_set_text( GTK_CLIST( regclist ), row++, 0, TextTmp );
-
- // Misc Registers
- sprintf( TextTmp , "TCON = %.2X", cpu8051_ReadD( _TCON_ ) );
- gtk_clist_set_text( GTK_CLIST( regclist ), row++, 0, TextTmp );
- sprintf( TextTmp , "TMOD = %.2X", cpu8051_ReadD( _TMOD_ ) );
- gtk_clist_set_text( GTK_CLIST( regclist ), row++, 0, TextTmp );
- sprintf( TextTmp , "SCON = %.2X", cpu8051_ReadD( _SCON_ ) );
- gtk_clist_set_text( GTK_CLIST( regclist ), row++, 0, TextTmp );
- sprintf( TextTmp , "IE = %.2X", cpu8051_ReadD( _IE_ ) );
- gtk_clist_set_text( GTK_CLIST( regclist ), row++, 0, TextTmp );
- sprintf( TextTmp , "IP = %.2X", cpu8051_ReadD( _IP_ ) );
- gtk_clist_set_text( GTK_CLIST( regclist ), row++, 0, TextTmp );
-
- // R0-R7 Registers in current Bank
- Rbank = cpu8051_ReadD( _PSW_ ) & 0x18;
- sprintf( TextTmp , "Bank = %.2X", Rbank);
- gtk_clist_set_text( GTK_CLIST( regclist ), row++, 0, TextTmp );
- sprintf( TextTmp , "R0 = %.2X", cpu8051_ReadD( _R0_ + Rbank ) );
- gtk_clist_set_text( GTK_CLIST( regclist ), row++, 0, TextTmp );
- sprintf( TextTmp , "R1 = %.2X", cpu8051_ReadD( _R1_ + Rbank ) );
- gtk_clist_set_text( GTK_CLIST( regclist ), row++, 0, TextTmp );
- sprintf( TextTmp , "R2 = %.2X", cpu8051_ReadD( _R2_ + Rbank ) );
- gtk_clist_set_text( GTK_CLIST( regclist ), row++, 0, TextTmp );
- sprintf( TextTmp , "R3 = %.2X", cpu8051_ReadD( _R3_ + Rbank ) );
- gtk_clist_set_text( GTK_CLIST( regclist ), row++, 0, TextTmp );
- sprintf( TextTmp , "R4 = %.2X", cpu8051_ReadD( _R4_ + Rbank ) );
- gtk_clist_set_text( GTK_CLIST( regclist ), row++, 0, TextTmp );
- sprintf( TextTmp , "R5 = %.2X", cpu8051_ReadD( _R5_ + Rbank ) );
- gtk_clist_set_text( GTK_CLIST( regclist ), row++, 0, TextTmp );
- sprintf( TextTmp , "R6 = %.2X", cpu8051_ReadD( _R6_ + Rbank ) );
- gtk_clist_set_text( GTK_CLIST( regclist ), row++, 0, TextTmp );
- sprintf( TextTmp , "R7 = %.2X", cpu8051_ReadD( _R7_ + Rbank ) );
- gtk_clist_set_text( GTK_CLIST( regclist ), row++, 0, TextTmp );
-
- gtk_clist_select_row(GTK_CLIST(regclist),0,0);
- gtk_clist_thaw( GTK_CLIST( regclist ) );
+ char TextTmp[255];
+ int row = 0;
+ unsigned char PSW = cpu8051_ReadD(_PSW_);
+ unsigned char Rbank;
+
+ gtk_clist_freeze(GTK_CLIST(regclist));
+
+ /* Main registers */
+ sprintf(TextTmp , "PC = %.4X", cpu8051.pc);
+ gtk_clist_set_text(GTK_CLIST(regclist), row++, 0, TextTmp);
+ sprintf(TextTmp , "SP = %.2X", cpu8051_ReadD(_SP_));
+ gtk_clist_set_text(GTK_CLIST(regclist), row++, 0, TextTmp);
+ sprintf(TextTmp , "A = %.2X", cpu8051_ReadD(_ACC_));
+ gtk_clist_set_text(GTK_CLIST(regclist), row++, 0, TextTmp);
+ sprintf(TextTmp , "B = %.2X", cpu8051_ReadD(_B_));
+ gtk_clist_set_text(GTK_CLIST(regclist), row++, 0, TextTmp);
+ sprintf(TextTmp , "DPTR = %.4X", (cpu8051_ReadD(_DPTRHIGH_) << 8) +
+ cpu8051_ReadD(_DPTRLOW_));
+ gtk_clist_set_text(GTK_CLIST(regclist), row++, 0, TextTmp);
+
+ /* Program Status Word */
+ sprintf(TextTmp, "PSW = %.2X", PSW);
+ gtk_clist_set_text(GTK_CLIST(regclist), row++, 0, TextTmp);
+
+ /* Ports registers */
+ sprintf(TextTmp , "P0 = %.2X", cpu8051_ReadD(_P0_));
+ gtk_clist_set_text(GTK_CLIST(regclist), row++, 0, TextTmp);
+ sprintf(TextTmp , "P1 = %.2X", cpu8051_ReadD(_P1_));
+ gtk_clist_set_text(GTK_CLIST(regclist), row++, 0, TextTmp);
+ sprintf(TextTmp , "P2 = %.2X", cpu8051_ReadD(_P2_));
+ gtk_clist_set_text(GTK_CLIST(regclist), row++, 0, TextTmp);
+ sprintf(TextTmp , "P3 = %.2X", cpu8051_ReadD(_P3_));
+ gtk_clist_set_text(GTK_CLIST(regclist), row++, 0, TextTmp);
+
+ /* Misc Registers */
+ sprintf(TextTmp , "TCON = %.2X", cpu8051_ReadD(_TCON_));
+ gtk_clist_set_text(GTK_CLIST(regclist), row++, 0, TextTmp);
+ sprintf(TextTmp , "TMOD = %.2X", cpu8051_ReadD(_TMOD_));
+ gtk_clist_set_text(GTK_CLIST(regclist), row++, 0, TextTmp);
+ sprintf(TextTmp , "SCON = %.2X", cpu8051_ReadD(_SCON_));
+ gtk_clist_set_text(GTK_CLIST(regclist), row++, 0, TextTmp);
+ sprintf(TextTmp , "IE = %.2X", cpu8051_ReadD(_IE_));
+ gtk_clist_set_text(GTK_CLIST(regclist), row++, 0, TextTmp);
+ sprintf(TextTmp , "IP = %.2X", cpu8051_ReadD(_IP_));
+ gtk_clist_set_text(GTK_CLIST(regclist), row++, 0, TextTmp);
+
+ /* R0-R7 Registers in current Bank */
+ Rbank = cpu8051_ReadD(_PSW_) & 0x18;
+ sprintf(TextTmp , "Bank = %.2X", Rbank);
+ gtk_clist_set_text(GTK_CLIST(regclist), row++, 0, TextTmp);
+ sprintf(TextTmp , "R0 = %.2X", cpu8051_ReadD(_R0_ + Rbank));
+ gtk_clist_set_text(GTK_CLIST(regclist), row++, 0, TextTmp);
+ sprintf(TextTmp , "R1 = %.2X", cpu8051_ReadD(_R1_ + Rbank));
+ gtk_clist_set_text(GTK_CLIST(regclist), row++, 0, TextTmp);
+ sprintf(TextTmp , "R2 = %.2X", cpu8051_ReadD(_R2_ + Rbank));
+ gtk_clist_set_text(GTK_CLIST(regclist), row++, 0, TextTmp);
+ sprintf(TextTmp , "R3 = %.2X", cpu8051_ReadD(_R3_ + Rbank));
+ gtk_clist_set_text(GTK_CLIST(regclist), row++, 0, TextTmp);
+ sprintf(TextTmp , "R4 = %.2X", cpu8051_ReadD(_R4_ + Rbank));
+ gtk_clist_set_text(GTK_CLIST(regclist), row++, 0, TextTmp);
+ sprintf(TextTmp , "R5 = %.2X", cpu8051_ReadD(_R5_ + Rbank));
+ gtk_clist_set_text(GTK_CLIST(regclist), row++, 0, TextTmp);
+ sprintf(TextTmp , "R6 = %.2X", cpu8051_ReadD(_R6_ + Rbank));
+ gtk_clist_set_text(GTK_CLIST(regclist), row++, 0, TextTmp);
+ sprintf(TextTmp , "R7 = %.2X", cpu8051_ReadD(_R7_ + Rbank));
+ gtk_clist_set_text(GTK_CLIST(regclist), row++, 0, TextTmp);
+
+ gtk_clist_select_row(GTK_CLIST(regclist), 0, 0);
+ gtk_clist_thaw(GTK_CLIST(regclist));
}
#ifndef REGWIN_H
#define REGWIN_H 1
-
#include <gtk/gtk.h>
#include "gtksizes.h"
-
GtkWidget *
-regwin_init( int width, int height );
+regwin_init(int width, int height);
void
-regwin_Show( void );
-
+regwin_Show(void);
#endif /* REGWIN_H */
#include "messagebox.h"
#include "viewmenu.h"
-
static void
-ViewMenuExternalDump( gchar *string )
+ViewMenuExternalDump(gchar *string)
{
- ShowMessage( "External Memory Dump", "Not implemented yet!", GTK_JUSTIFY_CENTER,
- MESSAGE_DIALOG_NORMAL_FONT );
+ ShowMessage("External Memory Dump", "Not implemented yet!",
+ GTK_JUSTIFY_CENTER, MESSAGE_DIALOG_NORMAL_FONT);
}
-
static void
-ViewMenuInternalDump( gchar *string )
+ViewMenuInternalDump(gchar *string)
{
- ShowMessage( "Internal Memory Dump", "Not implemented yet!", GTK_JUSTIFY_CENTER,
- MESSAGE_DIALOG_NORMAL_FONT );
+ ShowMessage("Internal Memory Dump", "Not implemented yet!",
+ GTK_JUSTIFY_CENTER, MESSAGE_DIALOG_NORMAL_FONT);
}
-
void
-ViewAddMenu( GtkWidget *menu_bar )
+ViewAddMenu(GtkWidget *menu_bar)
{
- GtkWidget *item;
- GtkWidget *menu;
-
- menu = gtk_menu_new();
+ GtkWidget *item;
+ GtkWidget *menu;
+
+ menu = gtk_menu_new();
+
+ /* Create the 'Viewmenu External Memory Dump' item. */
+ item = gtk_menu_item_new_with_label("External Memory Dump");
+ gtk_menu_append(GTK_MENU(menu), item);
+ /* Attach the callback functions to the activate signal. */
+ gtk_signal_connect_object(GTK_OBJECT(item), "activate",
+ GTK_SIGNAL_FUNC(ViewMenuExternalDump),
+ NULL);
- /* Create the 'Viewmenu External Memory Dump' item. */
- item = gtk_menu_item_new_with_label("External Memory Dump");
- gtk_menu_append( GTK_MENU(menu), item );
- /* Attach the callback functions to the activate signal. */
- gtk_signal_connect_object( GTK_OBJECT(item), "activate",
- GTK_SIGNAL_FUNC(ViewMenuExternalDump),
- NULL );
+ AddMenuSeparator(menu);
- AddMenuSeparator(menu);
+ /* Create the 'Viewmenu Internal Memory Dump' item. */
+ item = gtk_menu_item_new_with_label("Internal Memory Dump");
+ gtk_menu_append(GTK_MENU(menu), item);
+ /* Attach the callback functions to the activate signal. */
+ gtk_signal_connect_object(GTK_OBJECT(item), "activate",
+ GTK_SIGNAL_FUNC(ViewMenuInternalDump),
+ NULL);
- /* Create the 'Viewmenu Internal Memory Dump' item. */
- item = gtk_menu_item_new_with_label( "Internal Memory Dump" );
- gtk_menu_append( GTK_MENU(menu), item );
- /* Attach the callback functions to the activate signal. */
- gtk_signal_connect_object( GTK_OBJECT(item), "activate",
- GTK_SIGNAL_FUNC(ViewMenuInternalDump),
- NULL );
-
- /* Adding submenu title. */
- item = gtk_menu_item_new_with_label( "View" );
- gtk_menu_item_set_submenu( GTK_MENU_ITEM(item), menu );
- gtk_menu_bar_append( GTK_MENU_BAR( menu_bar ), item );
+ /* Adding submenu title. */
+ item = gtk_menu_item_new_with_label("View");
+ gtk_menu_item_set_submenu(GTK_MENU_ITEM(item), menu);
+ gtk_menu_bar_append(GTK_MENU_BAR(menu_bar), item);
}
#include <gtk/gtk.h>
-
void
-ViewAddMenu( GtkWidget *menu_bar );
-
+ViewAddMenu(GtkWidget *menu_bar);
#endif /* VIEWMENU_H */