SirCmpwn

Untitled

Apr 25th, 2012
119
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 9.34 KB | None | 0 0
  1. DCPU-16 Specification
  2. Copyright 1985 Mojang
  3. Version 1.3
  4.  
  5.  
  6.  
  7. === SUMMARY ====================================================================
  8.  
  9. * 16 bit words
  10. * 0x10000 words of ram
  11. * 8 registers (A, B, C, X, Y, Z, I, J)
  12. * program counter (PC)
  13. * stack pointer (SP)
  14. * extra/excess (EX)
  15. * interrupt address (IA)
  16.  
  17. In this document, anything within [brackets] is shorthand for "the value of the
  18. RAM at the location of the value inside the brackets". For example, SP means
  19. stack pointer, but [SP] means the value of the RAM at the location the stack
  20. pointer is pointing at.
  21.  
  22. Whenever the CPU needs to read a word, it reads [PC], then increases PC by one.
  23. Shorthand for this is [PC++]. In some cases, the CPU will modify a value before
  24. reading it, in this case the shorthand is [++PC].
  25.  
  26. For stability and to reduce bugs, it's strongly suggested all multi-word
  27. operations use little endian in all DCPU-16 programs, wherever possible.
  28.  
  29.  
  30.  
  31. === INSTRUCTIONS ===============================================================
  32.  
  33. Instructions are 1-3 words long and are fully defined by the first word.
  34. In a basic instruction, the lower five bits of the first word of the instruction
  35. are the opcode, and the remaining eleven bits are split into a five bit value b
  36. and a six bit value a.
  37. b is always handled by the processor after a, and is the lower five bits.
  38. In bits (in LSB-0 format), a basic instruction has the format: aaaaaabbbbbooooo
  39.  
  40. In the tables below, C is the time required in cycles to look up the value, or
  41. perform the opcode, VALUE is the numerical value, NAME is the mnemonic, and
  42. DESCRIPTION is a short text that describes the opcode or value.
  43.  
  44.  
  45.  
  46. --- Values: (5/6 bits) ---------------------------------------------------------
  47. C | VALUE | DESCRIPTION
  48. ---+-----------+----------------------------------------------------------------
  49. 0 | 0x00-0x07 | register (A, B, C, X, Y, Z, I or J, in that order)
  50. 0 | 0x08-0x0f | [register]
  51. 1 | 0x10-0x17 | [register + next word]
  52. 0 | 0x18 | (PUSH / [--SP]) if in b, or (POP / [SP++]) if in a
  53. 0 | 0x19 | [SP] / PEEK
  54. 1 | 0x1a | [SP + next word] / PICK n
  55. 0 | 0x1b | SP
  56. 0 | 0x1c | PC
  57. 0 | 0x1d | EX
  58. 1 | 0x1e | [next word]
  59. 1 | 0x1f | next word (literal)
  60. 0 | 0x20-0x3f | literal value 0xffff-0x1e (-1..30) (literal) (only for a)
  61. --+-----------+----------------------------------------------------------------
  62.  
  63. * "next word" means "[PC++]". Increases the word length of the instruction by 1.
  64. * By using 0x18, 0x19, 0x1a as PEEK, POP/PUSH, and PICK there's a reverse stack
  65. starting at memory location 0xffff. Example: "SET PUSH, 10", "SET X, POP"
  66.  
  67.  
  68.  
  69. --- Basic opcodes (5 bits) ----------------------------------------------------
  70. C | VAL | NAME | DESCRIPTION
  71. ---+------+----------+--------------------------------------------------------
  72. - | 0x00 | n/a | special instruction - see below
  73. 1 | 0x01 | SET b, a | sets b to a
  74. 2 | 0x02 | ADD b, a | sets b to b+a, sets EX to 0x0001 if there's an overflow,
  75. | | | 0x0 otherwise
  76. 2 | 0x03 | SUB b, a | sets b to b-a, sets EX to 0xffff if there's an underflow,
  77. | | | 0x0 otherwise
  78. 2 | 0x04 | MUL b, a | sets b to b*a, sets EX to ((b*a)>>16)&0xffff (treats b,
  79. | | | a as unsigned)
  80. 2 | 0x05 | MLI b, a | like MUL, but treat b, a as signed
  81. 3 | 0x06 | DIV b, a | sets b to b/a, sets EX to ((b<<16)/a)&0xffff. if a==0,
  82. | | | sets b and EX to 0 instead. (treats b, a as unsigned)
  83. 3 | 0x07 | DVI b, a | like DIV, but treat b, a as signed
  84. 3 | 0x08 | MOD b, a | sets b to b%a. if a==0, sets b to 0 instead.
  85. 1 | 0x09 | AND b, a | sets b to b&a
  86. 1 | 0x0a | BOR b, a | sets b to b|a
  87. 1 | 0x0b | XOR b, a | sets b to b^a
  88. 2 | 0x0c | SHR b, a | sets b to b>>>a, sets EX to ((b<<16)>>a)&0xffff
  89. | | | (logical shift)
  90. 2 | 0x0d | ASR b, a | sets b to b>>a, sets EX to ((b<<16)>>>a)&0xffff
  91. | | | (arithmetic shift) (treats b as signed)
  92. 2 | 0x0e | SHL b, a | sets b to b<<a, sets EX to ((b<<a)>>16)&0xffff
  93. 2 | 0x0f | MVI b, a | sets b to a, then increases I and J by 1
  94. 2+| 0x10 | IFB b, a | performs next instruction only if (b&a)!=0
  95. 2+| 0x11 | IFC b, a | performs next instruction only if (b&a)==0
  96. 2+| 0x12 | IFE b, a | performs next instruction only if b==a
  97. 2+| 0x13 | IFN b, a | performs next instruction only if b!=a
  98. 2+| 0x14 | IFG b, a | performs next instruction only if b>a
  99. 2+| 0x15 | IFA b, a | performs next instruction only if b>a (signed)
  100. 2+| 0x16 | IFL b, a | performs next instruction only if b<a
  101. 2+| 0x17 | IFU b, a | performs next instruction only if b<a (signed)
  102. - | 0x18 | - |
  103. - | 0x19 | - |
  104. 3 | 0x1a | ADX b, a | sets b to b+a+EX, sets EX to 0x0001 if there is an over-
  105. | | | flow, 0x0 otherwise
  106. 3 | 0x1b | SUX b, a | sets b to b-a+EX, sets EX to 0xFFFF if there is an under-
  107. | | | flow, 0x0 otherwise
  108. - | 0x1c | - |
  109. - | 0x1d | - |
  110. - | 0x1e | - |
  111. 2 | 0x1f | SMP b, a | sets the address range b-a to be read-only. This is a
  112. | | | NOP unless executed from read-only memory or PC < 0x1000.
  113. ---+------+----------+----------------------------------------------------------
  114.  
  115. * The branching opcodes take one cycle longer to perform if the test fails
  116. * Signed numbers are represented using two's complement.
  117.  
  118.  
  119.  
  120. Special opcodes always have their lower five bits unset, have one value and a
  121. five bit opcode. In binary, they have the format: aaaaaaooooo00000
  122. The value (a) is in the same six bit format as defined earlier.
  123.  
  124. --- Special opcodes: (6 bits) --------------------------------------------------
  125. C | VAL | NAME | DESCRIPTION
  126. ---+------+-------+-------------------------------------------------------------
  127. - | 0x00 | n/a | reserved for future expansion
  128. 3 | 0x01 | JSR a | pushes the address of the next instruction to the stack,
  129. | | | then sets PC to a
  130. - | 0x02 | - |
  131. - | 0x03 | - |
  132. - | 0x04 | - |
  133. - | 0x05 | - |
  134. - | 0x06 | - |
  135. - | 0x07 | - |
  136. 4 | 0x08 | INT a | triggers a software interrupt with message a
  137. 1 | 0x09 | IAG a | sets a to IA
  138. 1 | 0x0a | IAS a | sets IA to a
  139. - | 0x0b | - |
  140. - | 0x0c | - |
  141. - | 0x0d | - |
  142. - | 0x0e | - |
  143. - | 0x0f | - |
  144. 2 | 0x10 | HWN a | sets a to number of connected hardware devices
  145. 4 | 0x11 | HWQ a | sets A, B, C, X, Y registers to information about hardware a
  146. | | | a+b is a 32 bit word identifying the hardware type
  147. | | | c is the hardware revision
  148. | | | x+y is a 32 bit word identifying the manufacturer
  149. 4+| 0x12 | HWI a | sends an interrupt to hardware a
  150. 2 | 0x13 | HWP a | adds hardware protection to hardware a. This is a NOP unless
  151. | | | executed from read-only memory or PC < 0x1000.
  152. 2 | 0x14 | HWU a | removes hardware protection from hardware a. This is a NOP
  153. | | | unless executed from read-only memory or PC < 0x1000.
  154. - | 0x15 | - |
  155. - | 0x16 | - |
  156. - | 0x17 | - |
  157. - | 0x18 | - |
  158. - | 0x19 | - |
  159. - | 0x1a | - |
  160. - | 0x1b | - |
  161. - | 0x1c | - |
  162. - | 0x1d | - |
  163. - | 0x1e | - |
  164. - | 0x1f | - |
  165. ---+------+-------+-------------------------------------------------------------
  166.  
  167.  
  168.  
  169. === INTERRUPTS =================================================================
  170.  
  171. The DCPU-16 will perform at most one interrupt between each instruction.
  172.  
  173. When IA is set to something other than 0, interrupts triggered on the DCPU-16
  174. will push PC to the stack, followed by pushing A to the stack, then set the PC
  175. to IA, and A to the interrupt message. A well formed interrupt handler must pop
  176. A from the stack before returning (popping PC from the stack)
  177.  
  178. If IA is set to 0, a triggered interrupt does nothing. Software interrupts still
  179. take up two clock cycles, but immediately return, hardware interrupts are
  180. ignored, with the hardware being notified of this. Some hardware may choose to
  181. attempt to trigger the interrupt again at a later point.
  182.  
  183. The DCPU-16 has no way of knowing when an interrupt handler has finished, so if
  184. an interrupt is triggered while an interrupt is being handled, the handler will
  185. get called twice. Calling IAS 0 immediately at the start of the handler will
  186. reliably prevent multiple concurrent interrupts.
  187.  
  188.  
  189.  
  190. === HARDWARE ===================================================================
  191.  
  192. The DCPU-16 supports up to 65536 connected hardware devices. These devices can
  193. be anything from additional storage, sensors, monitors or speakers.
  194. How to control the hardware is specified per hardware device, but the DCPU-16
  195. supports a standard enumeration method for detecting connected hardware via
  196. the HWN, HWQ and HWI instructions.
  197.  
  198. Interrupts sent to hardware can't contain messages, can take additional cycles,
  199. and can read or modify any registers or memory adresses on the DCPU-16. This
  200. behavior changes per hardware device and is described in the hardware's
  201. documentation.
  202.  
  203. Hardware must NOT start modifying registers or ram on the DCPU-16 before at
  204. least one HWI call has been made to the hardware.
  205.  
  206. The DPCU-16 does not support hot swapping hardware. The behavior of connecting
  207. or disconnecting hardware while the DCPU-16 is running is undefined.
  208.  
  209. Hardware that is "protected" may only have interrupts triggered from read-only
  210. memory.
Advertisement
Add Comment
Please, Sign In to add comment