Magic-1是一位名叫Bill Buzbee的朋友采用74系列TTL集成电路和普通电线以纯手工制造的CPU,该CPU使用了200余块74系列集成电路。
Magic-1的基本架构是单地址,8位和16位操作数。每个进程可以得到128K的地址空间,其中包括32个2K的代码页和32个2K的数据页。每个进程有一个具有64个16位入口的页表,存放在专有的存储区中,并通过一个预处理页表的基指针进行定位。I/O通过内存影射来实现,并且支持现有的外部中断和DMA。位和字节顺序采用大尾数法。
为了兼容现有的各种语言,Magic-1中存在一组丰富的地址模型和地址生成指令。另外因为作者非常喜欢“比较分支”和“测试分支”,因此它们也占了很大的操作码空间。为了将操作码压缩到8位,Magic-1放弃了清晰的编码,而是使用了大量的微代码。
可见的寄存器
- A - 累加器。可以定址为8位或16位。这意味着它可以用于很多操作,包括一般的基于寄存器的load/store和内存操作等。
- B - 通用load/store基址寄存器,在ALU或内存操作中用作源操作数寄存器,在load等操作中用作目标寄存器。
- C - 技术寄存器,用于块传送和变量移位操作。
- MSW - ALU标志,包括进位(C)、结果为零(Z)、符号(S)和溢出(V);控制标志,包括模式(M)(0位特权模式,1为用户模式)、允许分页(P)和中断允许(EI)。另外,当出现内存错误时,还会出现一个状态位——数据(D),用来描述错误地址是指向数据页还是指向代码页。
- DP - 全局数据指针,用于大部分数据引用的基指针。
- SP - 堆栈指针,每次压入和弹出16位数据。
- SSP - 特权级堆栈指针,用在特权模式中。
- PC - 程序计数器
- PTB - 用户模式中当前进程的页表基指针。特权模式的页表基指针被硬编码为0x0000,当然是相对于特定的页面,而不是物理内存。
控制线路
- IRQ0、IRQ1、IRQ2、IRQ3、IRQ4、IRQ5 - 外部中断请求,IRQ0具有最高优先级,IRQ5具有最低的优先级。
- DMA_REQ - 当需要对地址和数据总线进行控制时,向该线路发送该请求,并等待DMA_ACK。这时你可以对总线进行控制,但必须保持DMA_REQ电位,直到完成控制。
- DMA_ACK - 参见上一条。
- RESET - 该线路能导致:
- 内部的内存地址寄存器(MAR)被清零,同时PC被置为0x0000
- SP清零
- 进入特权模式
- 关闭分页
- 禁用中断
- 条件标志(C、S、V、Z)被复位
- IRQ0-IRQ5被复位
- UARTS复位
- IDE接口复位
地址模式
忽略一些特殊目的的指令,累加器(寄存器A)是几乎所有一元操作的源寄存器和目的寄存器,在二元指令中寄存器B被用作第二源寄存器。在内存操作和内存地址生成操作中,寄存器A和寄存器B均可用于源寄存器或目标寄存器。
Magic-1支持的地址模式包括:
- Register Indirect with offset
- Frame local with offset
- Global with offset
- Immediate
- Push
- Pop
分页
Magic-1拥有22位物理地址,其中高5位用于选择一个内存页,因此可以有32个内存页;每个内存页的大小固定为2K,因此地址中的低11位用于指定页面中的逻辑地址。因为采用了独立的数据页和代码页,每个进程可以同时拥有32个数据页和32个代码页。
页表的每个入口都是16位宽,其中低11位用于选择页面,高3位表示页面的属性,其他2位保留。页面的标志包括:
- P - 页面存在
- W - 页面可写
- M - 指出该页是RAM页还是设备页
指令集
Magic-1指令格式为1字节操作码后跟至多3字节操作数,因此共有256条指令。这些指令包括加载/存储、地址操作、特殊寄存器访问、算术运算、控制流程和系统操作等几类。
此外,Magic-1还提供了256个微代码,范围从100~1FF,存放在PROM中。