- switch( memory_id ) {
- case SFR_MEM_ID:
- if( address < SFR_MEM_SIZE ) {
- return sfr_mem[address];
- }
- else {
- return 0;
- }
- break;
- case PGM_MEM_ID:
- if( address < PGM_MEM_SIZE ) {
- return pgm_mem[address];
- }
- else {
- return 0;
- }
- break;
- case INT_MEM_ID:
- if( address < INT_MEM_SIZE ) {
- return int_mem[address];
- }
- else {
- return 0;
- }
- break;
- case EXT_MEM_ID:
- if( address < EXT_MEM_SIZE ) {
- return ext_mem[address];
- }
- else {
- return 0;
- }
- break;
- default:
- /* Error. */
- return 0;
- break;
- }
+ uint8_t sp;
+ uint8_t value;
+
+ sp = memory_read8(INT_MEM_ID, _SP_);
+
+ value = memory_read8(INT_MEM_ID, sp--);
+ memory_write8(INT_MEM_ID, _SP_, sp); /* Save new stack pointer */
+
+ return value;
+}
+
+uint16_t
+stack_pop16(void)
+{
+ uint8_t sp;
+ uint16_t value;
+
+ sp = memory_read8(INT_MEM_ID, _SP_);
+
+ value = memory_read8(INT_MEM_ID, sp--) << 8; /* Read MSB */
+ value |= memory_read8(INT_MEM_ID, sp--); /* Read LSB */
+ memory_write8(INT_MEM_ID, _SP_, sp); /* Save new stack pointer */
+
+ return value;
+}
+
+/* Read a 16-bit address from PGM memory, starting at <base> offset */
+uint16_t
+pgm_read_addr16(uint16_t base)
+{
+ uint16_t addr;
+
+ addr = memory_read8(PGM_MEM_ID, base) << 8; /* MSB */
+ addr |= memory_read8(PGM_MEM_ID, base + 1); /* LSB */
+
+ return addr;
+}
+
+/* Dump memory */
+void
+DumpMem(char *Address, char *Asize, int memory_id)
+{
+ unsigned int MemAddress;
+ int size;
+ int Offset, Column;
+
+ if (strlen(Address) != 0) {
+ if (STREQ(Address, "PC"))
+ MemAddress = cpu8051.pc;
+ else
+ MemAddress = Ascii2Hex(Address, strlen(Address));
+ } else {
+ MemAddress = 0;
+ }
+
+ if (strlen(Asize) != 0) {
+ size = Ascii2Hex(Asize, strlen(Asize));
+ } else {
+ size = 256; /* Default size if not specified. */
+ }
+
+ for (Offset = 0; Offset < size; Offset += 16) {
+ unsigned char data[16];
+
+ printf("%.4X ", MemAddress + Offset);
+
+ for (Column = 0; Column < 16; Column++) {
+ data[Column] = memory_read8(memory_id, MemAddress +
+ Offset + Column);
+ printf(" %.2X", (int) data[Column]);
+ }
+ printf(" ");
+
+ /* Display any ASCII characters */
+ for (Column = 0; Column < 16; Column++) {
+ if ((int) data[Column] >= 32 &&
+ (int) data[Column] <= 126) {
+ printf("%c", data[Column]);
+ } else
+ printf(".");
+ }
+ printf("\n");
+ }