DCPU-16包括8个名为A, B, C, X, Y, Z, I和的通用寄存器J.这是一个程序员"比喻"使用I和J循环计数器.在DCPU-16,是I和J专业化的寄存器,只应在循环使用-或者他们都最终到底相同的颜色?
我正在研究各种OS设计,希望为DCPU-16编写简单的多任务操作系统.但是,我读到的关于抢先式多任务处理的所有内容都以中断为中心.听起来在16位硬件和软件时代,协作式多任务处理更为常见,但这需要考虑每个程序的多任务处理.
有没有办法在无中断架构上实现抢占式多任务处理?我能想到的只是一个可以动态切换任务的解释器,但这会产生巨大的性能损失(如果它必须解析每个操作并且不让任何东西本地运行,可能会大约10-20x +,我是想象).
如果我理解正确的话,DCPU-16规格为0x10c描述了一个16位的地址空间,每个偏移地址的16位字,而不是字节,与许多其他存储架构.这有一些奇怪的后果,例如我想象sizeof(char)并且sizeof(short)都会回归1.
在这种不同的内存寻址方案之间保持C代码可移植是否可行?要记住的问题是什么?
编辑:也许我应该给出一个更具体的例子.假设您有一些处理字节流的网络代码.你是通过在每个地址只放一个字节来丢弃你的一半内存,这样代码可以保持不变,或者你是否通过位移来推广所有内容以处理每个偏移的N个字节?
edit2:答案似乎集中在数据类型大小的问题上,这不是重点 - 我甚至不应该提到它.问题是如何应对失去用指针解决内存中任何字节的能力.期望代码对此不可知是否合理?
我试图理解规范,但未能理解给出的示例的第一行:
SET A, 0x30 ; 7c01 0030
Run Code Online (Sandbox Code Playgroud)
以下是我从规格中理解的内容:
SET a, b所以我理解指令为SET A,0x3C
任何人都可以建议我哪里出错了?
我是球拍/方案的新手,所以我决定通过为DCPU-16(一个简单的16位处理器)实现仿真器来学习.
我的问题是:实施我的解决方案的更好方法是什么?
这是我一起攻击控制cpu寄存器的解决方案.重点是允许修改寄存器的函数链接在一起.例如:
; Increment value stored in register r-id
; returns the updated register
;
; Reg - the register structure
; (reg-inc Reg 'SP)
(define (reg-inc reg r-id)
(reg-write reg r-id (+ (reg-read reg r-id) 1 )))
; chain them together
;(reg-inc (reg-inc Reg 'SP)
; 'PC)
;
; returns structure with both 'SP and 'PC incremented
Run Code Online (Sandbox Code Playgroud)
我的注册解决方案的全文如下.我的完整程序也在github上.有这么多重复的逻辑,我知道必须有一个更简单的方法:
(struct registers (A B C X Y Z I J SP PC O Pa Pb Paadr …Run Code Online (Sandbox Code Playgroud) 根据DCPU规范,SET指令失败的唯一时间是a值是文字.
那么下面的工作呢?
SET [PC],0x1000
Run Code Online (Sandbox Code Playgroud)
一个更有用的版本是设置偏移量PC,所以一个相当奇怪的无限循环将是:
SET [PC+0x2],0x89C3 ; = SUB PC,0x2
Run Code Online (Sandbox Code Playgroud) 我不清楚是否
dat "Hello"
应该生成5个字或3个(填充一个字节)
我正在为游戏0x10c 实现16位DCPU的一个assemblinker.
有人向我建议的一种技术是使用"叠加,就像在当天回来的Turbo Pascal",以便在运行时交换代码.
我得到了基本的想法(链接覆盖符号到同一个内存,在ref之前交换),但是它们的实现是什么?
这是编译器在引用之前插入的函数吗?这是陷阱吗?叠加层的数据是存储在叠加层的位置,还是存放在某个大表中?它运作良好,还是经常破裂?是否有用于组装的接口与覆盖的Pascal链接(反之亦然),还是不兼容?
谷歌基本上没有给我任何信息(除了它是现代Pascal编译器的禁止).而且,我只是,就像,五年太年轻,以至于他们当前都不需要它们.
我正在查看DCPU-16 的规范,我无法通过DIV指令理解溢出值的用途:
DIV a,b - 将a设置为a/b,将O设置为((a << 16)/ b)&0xffff.
任何人都可以在这里解释O的语义,它对什么有用?