Skip to content
paurea edited this page Dec 18, 2017 · 26 revisions

ISA

BICHO es de 8 bits

Registros

  • R0, R1, R2 : De propósito general, el valor de retorno en R0, como hay pocos registros seguramente haya que guardarlo en la pila

  • SW (R9)

    • Status XXXXXXVZ
      • bit 0 es Z (ult. op es cero)
      • bit 1 es V (overflow)
  • PC (R10)

  • SP (R11)

Instrucciones

Instrucciones generales

  • IO RN #(saca por los leds los bits de RN, incluye SW, PC y SP, para depurar)
  • NOP
  • HALT
  • WAIT RN #(espera RN ms)

Memoria/control de flujo

  • LD (RN), RM #(incluye SW, PC y SP, no hace falta BR)
  • LD imm, RM
  • MOV RN, RM ---sería -> LD 0x0, RM; ADD RN, RM #(incluye SW, PC y SP), el PC que se lee es el de la siguiente instr.
  • #-> BR RN ---sería-> MOV RN, R10
  • #-> BR PC+N ---sería-> ADD N, R10
  • ST RN, (RM) #(incluye SW, PC y SP, no hace CALL)
  • #-> PUSH RN ---sería-> ST RN, (R11); LD 1, R0; ADD R0 R11
  • #-> CALL RN ---sería-> MOV R10, R0; LD 5, R1; ADD R1, R0; ST R0, (R11); LD 1, R0; ADD R0 R11; LD 0x0, RN; ADD RN, R10;
  • #Reescrito -> se puede reescribir MOV R10, R0; LD 5, R1; ADD R1, R0; PUSH R0; MOV RN, R10; --> MOV R10, R0; LD 5, R1; ADD R1, R0; PUSH R0; BR RN
  • #-> POP RN ---sería-> LD (R11), RN; LD 0xff, R0; ADD R0 R11

Aritméticas

  • ADD RN, RM # RN+RM -> RM (incluye PC y SP),
    • pone Z si RM es 0,
    • pone V si el resultado es mayor que 01111111 (127)
    • o menor que 10000000 (-128)
  • LESS RN, RM # RN < RM
    • Z= 0 si RN >= RM, en compl a 2, así que A= XYYYYYYY, B = RBBBBBBB, A >= B que es:
      • Si X = 0 y R =0 -> Si YYYYYYY >= BBBBBBB Z = 0
      • Si X = 1 y R =1 -> Si YYYYYYY <= BBBBBBB Z = 0
      • Si X = 0 y R =1 -> Z = 0
      • Si X = 1 y R =0 -> Z = 1
  • #--> SHL SHR y MUL son bucles de ADD (hay que programarlos para asegurarse)

Lógicas

  • AND RN, RM # RN & RM ->RM bit a bit (incluye PC y SP), pone Z si RM es 0
  • OR RN, RM # RN | RM ->RM bit a bit (incluye PC y SP), pone Z si RM es 0
  • XOR RN, RM # RN ^ RM ->RM bit a bit (incluye PC y SP), pone Z si RM es 0
  • #-> EQ RN, RM N ---sería -> XOR RN, RM y Z dice si son iguales
  • #-> NOT RN ---sería -> LD 0xff, R0; XOR R0, RN y Z dice si el resultado es 0

Mapa de memoria

De momento la ROM que empieza en 0x10 y que es donde salta y donde está el "cargador".Quizás RAM en otro sitio más adelante

Es importante que de 0 a 0x10 no esté mapeado en memoria y que si alguien pone el PC ahí, pase algo, por ejemplo se pare la máquina y se quede el led parpadeando o algo identificable.

Codificación de instrucciones.

El ancho es fijo, pero puede contener un inmediato que es del mismo ancho que la instrucción. Las instrucciones son de 16 bits, BBBBXXXXYYYYPPPP. En memoria van en big endian:

  • [0] BBBBXXXX -> opcode

  • [1] YYYYPPPP -> operandos

  • Los 4 bits menores del primer byte son las descripción de la instrucción (los X) BBBBXXXXYYYYPPPP los B se dejan para futuras extensiones, de momento se ignoran

  • Los 8 bits menores son registros/operandos (los Y y P) BBBBXXXXYYYYPPPP

  • Las instrucciones 00XX Son de generales BBBB00XXYYYYPPPP

  • Las instrucciones 01XX Son de memoria BBBB01XXYYYYPPPP

  • Las instrucciones 10XX Son aritméticas BBBB10XXYYYYPPPP

  • Las instrucciones 11XX Son lógicas BBBB11XXYYYYPPPP

Operandos (hay una pareja por instrucción en el segundo byte, los Y y los P)

  • 0YYY ---- Registros normales
    • 0000 R0
    • 0001 R1
    • 0010 R2
  • 1YYY ---- Registros especiales e inmediatos
    • 1001 SW -> R9
    • 1010 PC -> R10
    • 1011 SP -> R11
  • 11YY ---- Inmediatos y direc. especial
    • 1100 Indirecto
    • 1110 IMM
    • 1111 no operand

Cuando el operador es inmediato (LD, se lee la siguiente palabra de la memoria).

Instrucciones:

  • NOP BBBB0000

  • IO BBBB0001

  • HALT BBBB0010

  • WAIT BBBB0011

  • LD BBBB0100

  • ST BBBB0101

  • ADD BBBB1000

  • LESS BBBB1001

  • AND BBBB1100

  • OR BBBB1101

  • XOR BBBB1110