文曲星大量使用了INT中断来实现系统调用,但6502并没有INT指令。
文曲星的INT指令的指令码是0x00,这是BRK指令的指令码,INT指令长度是3个字节,一个操作码+2字节绝对地址码,而BRK指令是隐含寻址,指令长度是1字节。
6502只有3个中断向量,一个是RESET,一个是IRQ,一个是NMI,BRK指令触发的IRQ中断,W65C02会给标志寄存器bit4、bit2置1,bit3置0,R65C02则没有标示给bit3置0,因为IRQ和NMI中断服务程序都是通过RTI返回的,此时的PC+1->S,而INT指令长度是3字节,所以需要在中断服务程序里把PC出栈+2再入栈,需要弄清楚,IRQ产生是,硬件将哪些寄存器按什么顺序入栈,然后再获取栈顶指针,将指向PC在栈中的值取出,+2->S
但是JSR只支持绝对寻址,即,地址必须跟在JSR后面,所以不可能在中断服务程序中,使用JSR去实现系统调用,但可以用JMP去跳转到系统调用的入口,然后直接在系统调用程序执行完之后直接RTI,另外一种方式就是把系统调用整个程序搬到SRAM上固定的地址,这样就能在中断服务中直接JSR,然后在中断服务中RTI。
要区分是哪种方式实现INT的,只需要找到对应系统调用真正的入口,然后JSR一下这段程序,如果出错,就是JMP实现的,如果能够正常运行,就是搬运实现的。
文曲星的INT指令的指令码是0x00,这是BRK指令的指令码,INT指令长度是3个字节,一个操作码+2字节绝对地址码,而BRK指令是隐含寻址,指令长度是1字节。
6502只有3个中断向量,一个是RESET,一个是IRQ,一个是NMI,BRK指令触发的IRQ中断,W65C02会给标志寄存器bit4、bit2置1,bit3置0,R65C02则没有标示给bit3置0,因为IRQ和NMI中断服务程序都是通过RTI返回的,此时的PC+1->S,而INT指令长度是3字节,所以需要在中断服务程序里把PC出栈+2再入栈,需要弄清楚,IRQ产生是,硬件将哪些寄存器按什么顺序入栈,然后再获取栈顶指针,将指向PC在栈中的值取出,+2->S
但是JSR只支持绝对寻址,即,地址必须跟在JSR后面,所以不可能在中断服务程序中,使用JSR去实现系统调用,但可以用JMP去跳转到系统调用的入口,然后直接在系统调用程序执行完之后直接RTI,另外一种方式就是把系统调用整个程序搬到SRAM上固定的地址,这样就能在中断服务中直接JSR,然后在中断服务中RTI。
要区分是哪种方式实现INT的,只需要找到对应系统调用真正的入口,然后JSR一下这段程序,如果出错,就是JMP实现的,如果能够正常运行,就是搬运实现的。