Skip to content
paurea edited this page Dec 11, 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 (R11)

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

  • SP (R13)

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
  • #-> BR RN sería MOV RN, R12
  • ST RN, (RM) #(incluye SW, PC y SP, no hace CALL)
  • #-> PUSH RN --- sería -> ST RN, (R13); LD 1, R0; ADD R0 R13
  • #-> CALL RN--- sería -> ST R12, (R13); LD 1, R0; ADD R0 R13; LD 0x0, RN; ADD 0, RM;
  • #--> se puede reescribir PUSH R12; MOV RN, R12; --> PUSH R12; BR RN
  • #-> POP RN ---sería -> LD (R13), RN; LD 0xff, R0; ADD R0 R13

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
    • 1010 PC
    • 1011 SP
  • 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 0000YYYY

  • IO 0001YYYY

  • HALT 0010YYYY

  • WAIT 0001YYYY

  • LD 0100YYYY

  • ST 0101YYYY

  • ADD 1000YYYY

  • LESS 1001YYYY

  • AND 1100YYYY

  • OR 1101YYYY

  • XOR 1110YYYY

Clone this wiki locally