Opdracht - firmware

Ten slotte zijn hier nog enkele voorbeelden waarmee het instructie geheugen geïnitialiseerd kan worden. Let er op dat je de generic map zo aanpast dat de simulator een geldig pad heeft naar deze files op jouw computer/laptop.

Het is een goed idee om, net zoals bij de ALU, eerst enkele specifieke instructies te testen. Bijvoorbeeld:

  • Laad de waarde 314 in register A
    • Het is een A-instructie: 0--- ---- ---- ----
    • 314, binair genoteerd met 15 digits is:
      • (000 000)1 0011 1010
    • Machine code: 0000 0001 0011 1010
      • of 0x013A in hex
  • Stel D gelijk aan A
    • Het is een C-instructie: 111- ---- ---- ----
    • De compute doet D=A
      • de a-bit is 0
      • de c-bits zijn 110000
    • De destination is D
      • de d-bits zijn 010
    • Er is géén jump nodig
      • de j-bits zijn 000
    • Machine code: 111 0 110000 010 000
      • of 0xEC10 in hex

Een simpel programmaatje kan zijn:

  • instructie 1: A = 314 (0x013A)
  • instructie 2: D = A (0xEC10)
  • instructie 3: A = 6 (0x0006)
  • instructie 4: D = D+A (0xE090) 111 0 000010 010 000
  • instructie 5: A = 4 (0x0004)
    • A wordt geladen omdat dit in de volgende instructie gebruikt wordt
  • instructie 6: Mem[A] = D (0xE308) 111 0 001100 001 000
  • instructie 7: A = 0 (0x0000)
    • A wordt geladen omdat dit in de volgende instructie gebruikt wordt
  • instructie 8: 0; JMP (0xEA87) 111 0 101010 000 111

Het resultaat van het “simpel programmaatje” moet er ongeveer als volgt uitzien.

simpel

Als een degelijk klein programma werkt, kan je proberen om een iets complexer stukje software te runnen.

Er bestaan websites, zoals deze die hulp kunnen bieden bij het assembleren.

Fibonacci

Het programma hieronder produceert de getallen van de Fibonacci reeks, kleiner dan 10'000. De firmware kan je hier downloaden.

// set the maximum value to which the sequence has to go  
@10000
D=A
@4
M=D
// initialize the registers
@1
M=0
@2
M=1
// start loop phase 1
@1               
D=M
@2
D=D+M
@3
M=D
// check if 1000 is reached
@4               
D=D-M
@41
D=D, jgt
// start loop phase 2
@2               
D=M
@3
D=D+M
@1
M=D
// check if 1000 is reached
@4               
D=D-M
@41
D=D, jgt
// start loop phase 3
@3
D=M
@1
D=D+M
@2
M=D
// check if 1000 is reached
@4               
D=D-M
@41
D=D, jgt
// jump back to loop phase 1
@8
0;JMP
// infinite loop to catch end       (INFINITE_LOOP)
@41
0;JMP
0010011100010000 - @10000           // set the maximum value to which the sequence has to go  
1110110000010000 - D=A
0000000000000100 - @4
1110001100001000 - M=D
0000000000000001 - @1               // init
1110101010001000 - M=0
0000000000000010 - @2
1110111111001000 - M=1
0000000000000001 - @1               // start loop phase 1               (START_L)
1111110000010000 - D=M
0000000000000010 - @2
1111000010010000 - D=D+M
0000000000000011 - @3
1110001100001000 - M=D
0000000000000100 - @4               // check if 1000 is reached
1111010011010000 - D=D-M
0000000000101001 - @41
1110001100010001 - D=D, jgt
0000000000000010 - @2               // start loop phase 2
1111110000010000 - D=M
0000000000000011 - @3
1111000010010000 - D=D+M
0000000000000001 - @1
1110001100001000 - M=D
0000000000000100 - @4               // check if 1000 is reached
1111010011010000 - D=D-M
0000000000101001 - @41
1110001100010001 - D=D, jgt
0000000000000011 - @3               // start loop phase 3
1111110000010000 - D=M
0000000000000001 - @1
1111000010010000 - D=D+M
0000000000000010 - @2
1110001100001000 - M=D
0000000000000100 - @4               // check if 1000 is reached
1111010011010000 - D=D-M
0000000000101001 - @41
1110001100010001 - D=D, jgt
0000000000001000 - @8
1110000000000111 - 0;JMP
0000000000101001 - @41              // infinite loop to catch end       (INFINITE_LOOP)
1110000000000111 - 0;JMP

Het resultaat van het “Fibonacci programma” moet er ongeveer als volgt uitzien.

simpel