我是一名工程学院的学生,我在做项目时遇到了一个问题。在这个项目中,我正在设计一个微控制器。我选择使用 Z80 CPU 因为它简单且流行。然而,通过 RAM 地址控制引脚的概念出现了问题。虽然通过汇编代码控制 RAM 地址是可行的,但事实证明,过渡到使用 C 来管理微控制器的逻辑具有挑战性。
例如,在汇编代码中,我成功地将地址0x3FFF处的RAM值更改为0x02。
.org $0000 ; Set origin to 0000h
START:
LD HL, 0X3FFF ; Load HL with the address 0x3FFF
LD A, 0X02 ; Load register A with the value 0x02
LD (HL), A ; Store the value in register A at the address pointed to by HL
我使用复古汇编器生成二进制文件,然后将其用于模拟程序 Proteus 8 中的虚拟 EEPROM 中。
由于我的设置运行正常,我选择尝试使用 C 代码而不是汇编。我在网上找到了一个合适的C编译器(z88dk)并继续利用以下代码来控制RAM地址
int main(){
int *p = (int *)0x3FFF;
*p |= 0x02;
return 0;
}
https://github.com/z88dk/z88dk
我用这个命令生成了bin文件
zcc +cpm -subtype=z80pack -compiler=sdcc mem.c -o mem.bin
和
zcc +cpm mem.c -create-app -subtype=z80pack -compiler=sdcc
我能够使用带有 EEPROM 模拟的 bin 文件,但代码不起作用,我应该怎么做才能用 C 控制 ram 地址值?
我是否正确使用了它还是应该更改编译器?
请注意,
LD (HL),A
将一个字节写入内存,而不是一个整数。试试这个代码:
int main(){
unsigned char *p = (unsigned char *)0x3FFF;
*p = 0x02;
return 0;
}