目錄
        1. User Interface

        'Code' 區塊 :
          按鈕 :
            (1) 'Run'   : 按下即開始執行程式,執行中的程式無法修改。
            (2) 'Pause' : 按下按鈕,執行中的程式將會暫停,此時可以修改程式;若要繼續執行,
            按'Run'。
            (3) 'Reset' : 重置按鈕,按下即重置CPU內暫存器、Memory、及Output,Input則重
            置成上一次按下'Run'按鈕的狀態。
          程式輸入區 : 使用者編輯程式的區域。

        'CPU' 區塊 :
          'SPEED' : 選擇程式執行速度,1x 速度以下會有動畫,以上則無。
          按鈕 :
            'Clear' : 重置暫存器至初始值。
          暫存器 :
            (1) 'PC' : Program Counter,永遠指向下一個將要執行的指令的位址。
            (2) 'SW' : Status Word,存放指令'CMP'的比較結果。
            (3) 'A'  : 一般暫存器,無特殊用途。
            (4) 'B'  : 一般暫存器,無特殊用途。
            (5) 'C'  : 一般暫存器,無特殊用途。
            (6) 'D'  : 一般暫存器,無特殊用途。

        'Memory' 區塊 :
          三列,每列有10格,共30格,編號從0開始至29結束;可以直接輸入memory給值。
          按鈕 :
            'Clear' : 清除'Memory'內所有值。

        'Input' 區塊 :
          每個輸入的數值以空格相間,須在程式開始執行前輸入。
          按鈕 :
            'Clear' : 清除'Input'區塊。

        'Output' 區塊 :
          每個輸出數值以空格相間。
          按鈕 :
            'Clear' : 清除'Output'區塊。
    
      2. Program

        編輯主程式必須從行號0開始,主程式內部不能有空白行,否則在程式執行中,抓取到空白行會被
        判定錯誤;主程式必須以'end'結尾,告訴電腦程式已經結束。

        主程式中,可運用指令,跳到副程式執行再返回主程式繼續執行;主程式與副程式間可以以空白行
        隔開做區隔,只要不執行到空白行即可。

            0   - .
            1  |  .
            2  |  .
      Main  3  |  .
            4  |  .
            5  |  .
            6   - end
            7
            8   - .
            9  |  .
            10 |  .
      Subr  11 |  .
      outi  12 |  .
      ne    13 |  .
            14  - .
    
      3. Instruction Set

        Arithmetic :

          (1) ADD
            Format :
              - add register1 register2
                ex : add a b
                -> a <= (a) + (b)
              - add register  number
                ex : add c 23
                -> c <= (c) + 23

          (2) SUB
            Format :
              - add register1 register2
                ex : sub d b
                -> d <= (d) - (b)
              - add register number
                ex : sub a 11
                -> a <= (a) - 11

          (3) MUL
            Format :
              - mul register1 register2
                ex : mul c b
                -> c <= (c) x (b)
              - mul register  number
                ex : mul b 2
                -> b <= (b) x 23

          (4) DIV
            Format :
              - div register1 register2
                ex : div a c
                -> a <= (a) / (c)
              - div register  number
                ex : div d 9
                -> d <= (d) / 23

        I/O :

          (1) IN
            Format :
              - in register
                ex : in b
                -> b <= (one value of input stream)

          (2) OUT
            Format :
              - out register
                ex : out a
                -> output stream <= (a)

        Memory Access :

          (1) ST
            Format :
              - st memory_number register
                ex : st 12 a
                -> mem(12) <= (a)
              - st memory_number number
                ex : st 3 51
                -> mem(3) <= 51
              - st memory_number(register) register
                ex : st 7(b) c
                -> mem(7+(b)) <= (c)
              - st memory_number(register) number
                ex : st 5(d) 19
                -> mem(5+(d)) <= 19

          (2) LD
            Format :
              - ld register memory_number
                ex : ld c 28
                -> c <= (mem(28))
              - ld register memory_number(register)
                ex : ld a 13(c)
                -> a <= (mem(13+(c)))

        Condition & Jump :

          (1) CMP
            Format :
              - cmp register1 register2
                ex : cmp a b
                -> sw <= (a) ? (b)
              - cmp register number
                ex : cmp c 90
                -> sw <= (c) ? 90
              - cmp number register
                ex : cmp 54 a
                -> sw <= 54 ? (a)
              - cmp number1 number2
                ex : cmp 23 17
                -> sw <= 23 ? 17

          (2) JMP
            Format :
              - jmp line_number
                ex : jmp 19
                -> PC <= 19

          (3) JLT
            Format :
              - jlt line_number
                ex : jlt 21
                -> if ((sw) == '<'), PC <= 21

          (4) JEQ
            Format :
              - jeq line_number
                ex : jeq 15
                -> if ((sw) == '='), PC <= 15

          (5) JGT
            Format :
              - jgt line_number
                ex : jgt 17
                -> if ((sw) == '>'), PC <= 17

          (6) BCK
            Format :
              - bck
                -> return to the last jump instruction

        Others :

          (1) MOV
            Format :
              - mov register1 register2
                ex : mov b a
                -> b <= (a)
              - mov register number
                ex : mov c 10
                -> c <= 10
    
      4. Sample Code

        (1) 讀入 n 個數字,輸出各個數字的平方 :
          0  in d     將input第一個數字——表示接下來將輸入多少個data,儲存到暫存器D。
          1  in a     -
          2  mul a a   | 迴圈,以暫存器B儲存的數值表示目前輸入了多少data,判斷是否繼
          3  out a     | 續輸入data,如果暫存器B的值小於暫存器D的值,代表輸入尚未結
          4  add b 1   | 束,則跳回行號1的地方繼續輸入,反之則程式結束。輸出暫存器A的
          5  cmp b d   | 值的平方。
          6  jlt 1    -
          7  end

          範例輸入 : 6 1 2 3 4 5 6
          //第一個數字表示接下來要讀入多少數字,接著輸入對應數目的數字。

          範例輸出 : 1 4 9 16 25 36

        (2) 讀入 n 個數字,輸出前後兩數字的平方相加 :
          0  in d     將input第一個數字——表示接下來將輸入多少個data,儲存到暫存器D。
          1  in c     輸入一個data至暫存器C。
          2  in a     -
          3  st 0 a    |
          4  mul a a   |
          5  mul c c   | 迴圈,輸入一個data至暫存A,將暫存器A的值存到記憶體0的位置,
          6  add c a   | 接著將暫存器C的值平方加上暫存器A的值平方,存回暫存器C,然後
          7  out c     | 輸出暫存器C的值,接著將記憶體0的值,載入至暫存器C,以暫存器
          8  ld c 0    | B的值判斷是否輸入結束,如果尚未結束,跳回行號2繼續執行,反之
          9  add b 1   | 則程式結束。
          10 cmp b d   |
          11 jlt 2    -
          12 end

          範例輸入 : 6 1 2 3 4 5 6
          //第一個數字表示接下來要讀入多少數字,接著輸入對應數目的數字。

          範例輸出 : 5 13 25 41 61

        (3) 讀入 n 個數字,輸出其中最大的數 :
          0  in d       將input第一個數字——表示接下來將輸入多少個data,儲存到暫存器D。
          1  in a       輸入一個data至暫存器A。
          2  add c 1    暫存器C的值加一,表示目前載入幾個data。
          3  in b       -
          4  add c 1     | 迴圈,將所有data,先輸入至暫存器B,比較暫存器A和B的值,如
          5  cmp a b     | 果暫存器B的值較大,則跳至行號12的地方,將暫存器B的值存到暫
          6  jlt 12      | 存器A的值,反之則比較暫存器C和D的值檢查是否所有data都被載
          7  cmp c d     | 入過,若還沒則跳回行號3繼續執行。
          8  jlt 3      -
          9  out a      將結果輸出。
          10 end
          11
          12 mov a b    將暫存器B的值存到暫存器A的值。
          13 bck

          範例輸入 : 7 21 32 99 124 6 9090 0
          //第一個數字表示接下來要讀入多少數字,接著輸入對應數目的數字。

          範例輸出 : 9090

        (4) 讀入 n 個數字,將數字排序後輸出 :
          0  in d       將input第一個數字——表示接下來將輸入多少個data,儲存到暫存器D。
          1  st 29 d    將暫存器D的值存至記憶體29的位置。
          2  in a       -
          3  st 0(b) a   | 迴圈,將所有data,先輸入至暫存器A,接著從記憶體0的位置,將暫
          4  add b 1     | 存器A的值存入。
          5  cmp b d     |
          6  jlt 2      -
          7  mov b 0    初始化暫存器B的值為0
          8  ld a 0(b)  將記憶體0的值載入至暫存器A
          9  add b 1    暫存器B的值加一,表示目前載入多少data
          10 ld c 0(b)  -
          11 cmp a c     |
          12 jlt 23      |
          13 sub b 1     | 迴圈,載入data至暫存器C,比較暫存器A和C的值,如果暫存器C的
          14 st 0(b) c   | 值較大,則跳至行號23的地方,將暫存器C的值存到暫存器A,反之則
          15 add b 1     | 將兩data在記憶體的位置互換,較大的數值往右排序,位置交換完畢再
          16 st 10(b) a  | 跳回行號10繼續載入下一個data作比較。
          17 add b 1     |
          18 cmp b d     |
          19 jeq 29      |
          20 jmp 10     -
          21 end
          22
          23 mov a c    -
          24 add b 1     | 副程式,將暫存器C的值存到暫存器A的值,暫存器B加一,
          25 cmp b d     | 判斷是否載入結束,是則跳至行號29繼續執行程式,否則跳回
          26 jeq 29      | 行號10繼續執行程式。
          27 jmp 10     -
          28
          29 mov b 0    -
          30 sub d 1     | 副程式,初始化暫存器B的值為0,將暫存器D的值減一,表示
          31 cmp d 1     | 結束第一輪排序(最大的數值排在最右邊),接著排序剩下的數
          32 jeq 35      | 字,如果暫存器D值為一,表示剩下一個數字排序,則不需要排
          33 jmp 8      -  序,跳至行號35繼續執行程式,否則跳至行號8繼續執行程式。
          34
          35 mov b 0    -
          36 ld d 29     |
          37 ld 0(b) a   | 副程式,輸出排序後的結果,從記憶體0位置開始,將data載入
          38 add b 1     | 至暫存器A,接著輸出A,直到所有data都輸出完畢,則結束跳
          39 out a       | 至行號21處結束程式。
          40 cmp b d     |
          41 jlt 36      |
          42 jmp 21     -

          範例輸入 : 5 20 3 9999 67 773
          //第一個數字表示接下來要讀入多少數字,接著輸入對應數目的數字。

          範例輸出 : 3 20 67 773 9999