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.

// predefined symbols
//   A: Address Register.
//   D: Data Register.
//   M: Refers to the register in Main Memory whose address is currently stored in A.
//   SP: RAM address 0.
//   LCL: RAM address 1.
//   ARG: RAM address 2.
//   THIS: RAM address 3.
//   THAT: RAM address 4.
//   R0-R15: Addresses of 16 RAM Registers, mapped from 0 to 15.
//   SCREEN: Base address of the Screen Map in Main Memory, which is equal to 16384.
//   KBD: Keyboard Register address in Main Memory, which is equal to 24576.
//
// set the maximum value to which the sequence has to go  
@10000
D=A
@R15
M=D
// init
@R1
M=0
@R2
M=1
(START_L)
// start loop phase 1
D=0
@R1
D=D+M
@R2
D=D+M
@R3
M=D
// check if MAX is reached
@R15
D=D-M
@INFINITE_LOOP
D;JGE
// start loop phase 2
D=0
@R2
D=D+M
@R3
D=D+M
@R1
M=D
// check if MAX is reached
@R15
D=D-M
@INFINITE_LOOP
D;JGE
// start loop phase 3
D=0
@R3
D=D+M
@R1
D=D+M
@R2
M=D
// check if MAX is reached
@R15
D=D-M
@INFINITE_LOOP
D;JGE
@START_L
0;JMP
// infinite loop to catch end
(INFINITE_LOOP)
@INFINITE_LOOP
0;JMP
0010011100010000 - 0x2710
1110110000010000 - 0xEC10
0000000000001111 - 0x000F
1110001100001000 - 0xE308
0000000000000001 - 0x0001
1110101010001000 - 0xEA88
0000000000000010 - 0x0002
1110111111001000 - 0xEFC8
1110101010010000 - 0xEA90
0000000000000001 - 0x0001
1111000010010000 - 0xF090
0000000000000010 - 0x0002
1111000010010000 - 0xF090
0000000000000011 - 0x0003
1110001100001000 - 0xE308
0000000000001111 - 0x000F
1111010011010000 - 0xF4D0
0000000000101011 - 0x002B
1110001100000011 - 0xE303
1110101010010000 - 0xEA90
0000000000000010 - 0x0002
1111000010010000 - 0xF090
0000000000000011 - 0x0003
1111000010010000 - 0xF090
0000000000000001 - 0x0001
1110001100001000 - 0xE308
0000000000001111 - 0x000F
1111010011010000 - 0xF4D0
0000000000101011 - 0x002B
1110001100000011 - 0xE303
1110101010010000 - 0xEA90
0000000000000011 - 0x0003
1111000010010000 - 0xF090
0000000000000001 - 0x0001
1111000010010000 - 0xF090
0000000000000010 - 0x0002
1110001100001000 - 0xE308
0000000000001111 - 0x000F
1111010011010000 - 0xF4D0
0000000000101011 - 0x002B
1110001100000011 - 0xE303
0000000000001000 - 0x0008
1110101010000111 - 0xEA87
0000000000101011 - 0x002B
1110101010000111 - 0xEA87