Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <string.h>
- #include <stdio.h>
- #include <stdlib.h>
- #include <unistd.h>
- #include <errno.h>
- #include <sys/types.h>
- #include <sys/stat.h>
- #include <fcntl.h>
- /*These variables are associated with the implementation of the VM*/
- int fp ;
- char *ptr ;
- int i ;
- int j, k ;
- char input_line [7] ;
- /*These are variables representing the VM itself*/
- char IR[6] ;
- int PC = 0 ;
- int P0 ; //these are the pointer registers
- int P1 ;
- int P2 ;
- int P3 ;
- int R0 ; //GP regs
- int R1 ;
- int R2 ;
- int R3 ;
- int ACC ;
- char PSW[2] ;
- char memory [100][6] ; //this is the program memory for first program
- int opcode ; //nice to know what we are doing
- int program_line = 0 ;
- void LoadPointerImmediate() {
- printf("Load pointer immediate, register P%s, value %s%s",
- IR[3], IR[4], IR[5]);
- if (IR[3] == "0") {
- P0 = (int) (IR[4]-48) * 10;
- P0 += (int) (IR[5] -48);
- }
- else if (IR[3] == "1") {
- P1 = (int) (IR[4]-48) * 10;
- P1 += (int) (IR[5] -48);
- }
- else if (IR[3] == "2") {
- P2 = (int) (IR[4]-48) * 10;
- P2 += (int) (IR[5] -48);
- }
- else if(IR[3] == "3") {
- P3 = (int) (IR[4]-48) * 10;
- P3 += (int) (IR[5] -48);
- }
- else
- printf("Read error on line %d", PC);
- }
- void AddToPointerImmediate() {
- printf("Add to pointer immediate, register P%s, value %s%s",
- IR[3], IR[4], IR[5]);
- if (IR[3] == "0") {
- P0 += (int) (IR[4]-48) * 10;
- P0 += (int) (IR[5] -48);
- }
- else if (IR[3] == "1") {
- P1 += (int) (IR[4]-48) * 10;
- P1 += (int) (IR[5] -48);
- }
- else if (IR[3] == "2") {
- P2 += (int) (IR[4]-48) * 10;
- P2 += (int) (IR[5] -48);
- }
- else if (IR[3] == "3") {
- P3 += (int) (IR[4]-48) * 10;
- P3 += (int) (IR[5] -48);
- }
- else
- printf("Read error on line %d", PC);
- }
- void SubtractFromPointerImmediate() {
- printf("Subtract from pointer immediate, register P%s, value %s%s",
- IR[3], IR[4], IR[5]);
- if (IR[3] == "0") {
- P0 -= (int) (IR[4]-48) * 10;
- P0 -= (int) (IR[5] -48);
- }
- else if (IR[3] == "1") {
- P1 -= (int) (IR[4]-48) * 10;
- P1 -= (int) (IR[5] -48);
- }
- else if (IR[3] == "2") {
- P2 -= (int) (IR[4]-48) * 10;
- P2 -= (int) (IR[5] -48);
- }
- else if (IR[3] == "3") {
- P3 -= (int) (IR[4]-48) * 10;
- P3 -= (int) (IR[5] -48);
- }
- else
- printf("Invalid Pointer, Read error on line %d", PC);
- }
- void LoadAccumulatorImmediate() {
- printf("Load Accumulator Immediate, value %c%c%c%c \n",
- IR[2], IR[3], IR[4],IR[5]);
- ACC = (int) (IR[2]-48) * 1000;
- ACC += (int) (IR[3]-48) * 100;
- ACC += (int) (IR[4]-48) * 10;
- ACC += (int) (IR[5]-48);
- }
- void LoadAccumulatorRegister() {
- printf("Load Accumulator Register, register P%c \n", IR[3]);
- if (IR[3] == "0") {
- ACC = (int) (memory[P0][2]-48) * 1000;
- ACC += (int) (memory[P0][3]-48) * 100;
- ACC += (int) (memory[P0][4]-48) * 10;
- ACC += (int) (memory[P0][5]-48);
- }
- else if (IR[3] == "1") {
- ACC = (int) (memory[P1][2]-48) * 1000;
- ACC += (int) (memory[P1][3]-48) * 100;
- ACC += (int) (memory[P1][4]-48) * 10;
- ACC += (int) (memory[P1][5]-48);
- }
- else if (IR[3] == "2") {
- ACC = (int) (memory[P2][2]-48) * 1000;
- ACC += (int) (memory[P2][3]-48) * 100;
- ACC += (int) (memory[P2][4]-48) * 10;
- ACC += (int) (memory[P2][5]-48);
- }
- else if (IR[3] == "3") {
- ACC = (int) (memory[P3][2]-48) * 1000;
- ACC += (int) (memory[P3][3]-48) * 100;
- ACC += (int) (memory[P3][4]-48) * 10;
- ACC += (int) (memory[P3][5]-48);
- }
- else
- printf("Invalid Pointer, Read error on line %d", PC);
- }
- void LoadAccumulatorDirect() {
- printf("Load Accumulator Direct, Memory Location %c%c \n", IR[2], IR[3]);
- ACC = (int) (memory[(((int) (IR[2]-48) * 10) + (int) (IR[3]-48))]
- [2]-48) * 1000;
- ACC += (int) (memory[(((int) (IR[2]-48) * 10) + (int) (IR[3]-48))]
- [3]-48) * 100;
- ACC += (int) (memory[(((int) (IR[2]-48) * 10) + (int) (IR[3]-48))]
- [4]-48) * 10;
- ACC += (int) (memory[(((int) (IR[2]-48) * 10) + (int) (IR[3]-48))]
- [5]-48);
- }
- void StoreAccumulatorRegister() {
- printf("Store Accumulator Register, register P%c \n", IR[3]);
- if (IR[3] == "0") {
- memory[P0][5] = (char) ((ACC % 10) + 48);
- memory[P0][4] = (char) (((ACC % 100)/10) + 48);
- memory[P0][3] = (char) (((ACC % 1000)/100) + 48);
- memory[P0][2] = (char) ((ACC /1000) + 48);
- }
- else if (IR[3] == "1") {
- memory[P1][5] = (char) ((ACC % 10) + 48);
- memory[P1][4] = (char) (((ACC % 100)/10) + 48);
- memory[P1][3] = (char) (((ACC % 1000)/100) + 48);
- memory[P1][2] = (char) ((ACC /1000) + 48);
- }
- else if (IR[3] == "2") {
- memory[P2][5] = (char) ((ACC % 10) + 48);
- memory[P2][4] = (char) (((ACC % 100)/10) + 48);
- memory[P2][3] = (char) (((ACC % 1000)/100) + 48);
- memory[P2][2] = (char) ((ACC /1000) + 48);
- }
- else if (IR[3] == "3") {
- memory[P3][5] = (char) ((ACC % 10) + 48);
- memory[P3][4] = (char) (((ACC % 100)/10) + 48);
- memory[P3][3] = (char) (((ACC % 1000)/100) + 48);
- memory[P3][2] = (char) ((ACC /1000) + 48);
- }
- }
- void StoreAccumulatorDirect() {
- printf("Store Accumulator Register, memory[%c%c] \n", IR[2], IR[3]);
- memory[(((int) (IR[2]-48) * 10) + (int) (IR[3]-48))]
- [5] = (char) ((ACC % 10) + 48);
- memory[(((int) (IR[2]-48) * 10) + (int) (IR[3]-48))]
- [4] = (char) (((ACC % 100)/10) + 48);
- memory[(((int) (IR[2]-48) * 10) + (int) (IR[3]-48))]
- [3] = (char) (((ACC % 1000)/100) + 48);
- memory[(((int) (IR[2]-48) * 10) + (int) (IR[3]-48))]
- [2] = (char) ((ACC /1000) + 48);
- }
- void StoreRegisterToMemoryRegister() {
- printf("Store Register to Memory: Register Adressing, register"
- " R%c to memory[P%c] \n", IR[3], IR[5]);
- if (IR[3] == "0" && IR[5] == "0"){
- memory[P0][5] = (char) ((R0 % 10) + 48);
- memory[P0][4] = (char) (((R0 % 100)/10) + 48);
- memory[P0][3] = (char) (((R0 % 1000)/100) + 48);
- memory[P0][2] = (char) ((R0 /1000) + 48);
- }
- else if (IR[3] == "1" && IR[5] == "0"){
- memory[P0][5] = (char) ((R1 % 10) + 48);
- memory[P0][4] = (char) (((R1 % 100)/10) + 48);
- memory[P0][3] = (char) (((R1 % 1000)/100) + 48);
- memory[P0][2] = (char) ((R1 /1000) + 48);
- }
- else if (IR[3] == "2" && IR[5] == "0"){
- memory[P0][5] = (char) ((R2 % 10) + 48);
- memory[P0][4] = (char) (((R2 % 100)/10) + 48);
- memory[P0][3] = (char) (((R2 % 1000)/100) + 48);
- memory[P0][2] = (char) ((R2 /1000) + 48);
- }
- else if (IR[3] == "3" && IR[5] == "0"){
- memory[P0][5] = (char) ((R3 % 10) + 48);
- memory[P0][4] = (char) (((R3 % 100)/10) + 48);
- memory[P0][3] = (char) (((R3 % 1000)/100) + 48);
- memory[P0][2] = (char) ((R3 /1000) + 48);
- }
- else if (IR[3] == "0" && IR[5] == "1"){
- memory[P1][5] = (char) ((R0 % 10) + 48);
- memory[P1][4] = (char) (((R0 % 100)/10) + 48);
- memory[P1][3] = (char) (((R0 % 1000)/100) + 48);
- memory[P1][2] = (char) ((R0 /1000) + 48);
- }
- else if (IR[3] == "1" && IR[5] == "1"){
- memory[P1][5] = (char) ((R1 % 10) + 48);
- memory[P1][4] = (char) (((R1 % 100)/10) + 48);
- memory[P1][3] = (char) (((R1 % 1000)/100) + 48);
- memory[P1][2] = (char) ((R1 /1000) + 48);
- }
- else if (IR[3] == "2" && IR[5] == "1"){
- memory[P1][5] = (char) ((R2 % 10) + 48);
- memory[P1][4] = (char) (((R2 % 100)/10) + 48);
- memory[P1][3] = (char) (((R2 % 1000)/100) + 48);
- memory[P1][2] = (char) ((R2 /1000) + 48);
- }
- else if (IR[3] == "3" && IR[5] == "1"){
- memory[P1][5] = (char) ((R3 % 10) + 48);
- memory[P1][4] = (char) (((R3 % 100)/10) + 48);
- memory[P1][3] = (char) (((R3 % 1000)/100) + 48);
- memory[P1][2] = (char) ((R3 /1000) + 48);
- }
- else if (IR[3] == "0" && IR[5] == "2"){
- memory[P2][5] = (char) ((R0 % 10) + 48);
- memory[P2][4] = (char) (((R0 % 100)/10) + 48);
- memory[P2][3] = (char) (((R0 % 1000)/100) + 48);
- memory[P2][2] = (char) ((R0 /1000) + 48);
- }
- else if (IR[3] == "1" && IR[5] == "2"){
- memory[P2][5] = (char) ((R1 % 10) + 48);
- memory[P2][4] = (char) (((R1 % 100)/10) + 48);
- memory[P2][3] = (char) (((R1 % 1000)/100) + 48);
- memory[P2][2] = (char) ((R1 /1000) + 48);
- }
- else if (IR[3] == "2" && IR[5] == "2"){
- memory[P2][5] = (char) ((R2 % 10) + 48);
- memory[P2][4] = (char) (((R2 % 100)/10) + 48);
- memory[P2][3] = (char) (((R2 % 1000)/100) + 48);
- memory[P2][2] = (char) ((R2 /1000) + 48);
- }
- else if (IR[3] == "3" && IR[5] == "2"){
- memory[P2][5] = (char) ((R3 % 10) + 48);
- memory[P2][4] = (char) (((R3 % 100)/10) + 48);
- memory[P2][3] = (char) (((R3 % 1000)/100) + 48);
- memory[P2][2] = (char) ((R3 /1000) + 48);
- }
- else if (IR[3] == "0" && IR[5] == "3"){
- memory[P3][5] = (char) ((R0 % 10) + 48);
- memory[P3][4] = (char) (((R0 % 100)/10) + 48);
- memory[P3][3] = (char) (((R0 % 1000)/100) + 48);
- memory[P3][2] = (char) ((R0 /1000) + 48);
- }
- else if (IR[3] == "1" && IR[5] == "3"){
- memory[P3][5] = (char) ((R1 % 10) + 48);
- memory[P3][4] = (char) (((R1 % 100)/10) + 48);
- memory[P3][3] = (char) (((R1 % 1000)/100) + 48);
- memory[P3][2] = (char) ((R1 /1000) + 48);
- }
- else if (IR[3] == "2" && IR[5] == "3"){
- memory[P3][5] = (char) ((R2 % 10) + 48);
- memory[P3][4] = (char) (((R2 % 100)/10) + 48);
- memory[P3][3] = (char) (((R2 % 1000)/100) + 48);
- memory[P3][2] = (char) ((R2 /1000) + 48);
- }
- else if (IR[3] == "3" && IR[5] == "3"){
- memory[P3][5] = (char) ((R3 % 10) + 48);
- memory[P3][4] = (char) (((R3 % 100)/10) + 48);
- memory[P3][3] = (char) (((R3 % 1000)/100) + 48);
- memory[P3][2] = (char) ((R3 /1000) + 48);
- }
- }
- void StoreRegisterToMemoryDirect() {
- printf("Store Register To Memory: Direct Addressing, "
- "register R%c to memory[%c%c] \n", IR[3], IR[4], IR[5]);
- if (IR[3] == "0") {
- memory[(((int) (IR[4]-48) * 10) + (int) (IR[5]-48))]
- [5] = (char) ((R0 % 10) + 48);
- memory[(((int) (IR[4]-48) * 10) + (int) (IR[5]-48))]
- [4] = (char) (((R0 % 100)/10) + 48);
- memory[(((int) (IR[4]-48) * 10) + (int) (IR[5]-48))]
- [3] = (char) (((R0 % 1000)/100) + 48);
- memory[(((int) (IR[4]-48) * 10) + (int) (IR[5]-48))]
- [2] = (char) ((R0 /1000) + 48);
- }
- else if (IR[3] == "1") {
- memory[(((int) (IR[4]-48) * 10) + (int) (IR[5]-48))]
- [5] = (char) ((R1 % 10) + 48);
- memory[(((int) (IR[4]-48) * 10) + (int) (IR[5]-48))]
- [4] = (char) (((R1 % 100)/10) + 48);
- memory[(((int) (IR[4]-48) * 10) + (int) (IR[5]-48))]
- [3] = (char) (((R1 % 1000)/100) + 48);
- memory[(((int) (IR[4]-48) * 10) + (int) (IR[5]-48))]
- [2] = (char) ((R1 /1000) + 48);
- }
- else if (IR[3] == "2") {
- memory[(((int) (IR[4]-48) * 10) + (int) (IR[5]-48))]
- [5] = (char) ((R2 % 10) + 48);
- memory[(((int) (IR[4]-48) * 10) + (int) (IR[5]-48))]
- [4] = (char) (((R2 % 100)/10) + 48);
- memory[(((int) (IR[4]-48) * 10) + (int) (IR[5]-48))]
- [3] = (char) (((R2 % 1000)/100) + 48);
- memory[(((int) (IR[4]-48) * 10) + (int) (IR[5]-48))]
- [2] = (char) ((R2 /1000) + 48);
- }
- else if (IR[3] == "3") {
- memory[(((int) (IR[4]-48) * 10) + (int) (IR[5]-48))]
- [5] = (char) ((R3 % 10) + 48);
- memory[(((int) (IR[4]-48) * 10) + (int) (IR[5]-48))]
- [4] = (char) (((R3 % 100)/10) + 48);
- memory[(((int) (IR[4]-48) * 10) + (int) (IR[5]-48))]
- [3] = (char) (((R3 % 1000)/100) + 48);
- memory[(((int) (IR[4]-48) * 10) + (int) (IR[5]-48))]
- [2] = (char) ((R3 /1000) + 48);
- }
- }
- void LoadRegisterFromMemoryRegister() {
- printf("Load Register from Memory: Register Addressing,"
- " memory[P%c] to register R%c \n", IR[5], IR[3]);
- if (IR [3] == "0" && IR[5] == "0") {
- R0 = (int) (memory[P0][2]-48) * 1000;
- R0 += (int) (memory[P0][3]-48) * 100;
- R0 += (int) (memory[P0][4]-48) * 10;
- R0 += (int) (memory[P0][5]-48);
- }
- else if (IR [3] == "1" && IR[5] == "0") {
- R1 = (int) (memory[P0][2]-48) * 1000;
- R1 += (int) (memory[P0][3]-48) * 100;
- R1 += (int) (memory[P0][4]-48) * 10;
- R1 += (int) (memory[P0][5]-48);
- }
- else if (IR [3] == "2" && IR[5] == "0") {
- R2 = (int) (memory[P0][2]-48) * 1000;
- R2 += (int) (memory[P0][3]-48) * 100;
- R2 += (int) (memory[P0][4]-48) * 10;
- R2 += (int) (memory[P0][5]-48);
- }
- else if (IR [3] == "3" && IR[5] == "0") {
- R3 = (int) (memory[P0][2]-48) * 1000;
- R3 += (int) (memory[P0][3]-48) * 100;
- R3 += (int) (memory[P0][4]-48) * 10;
- R3 += (int) (memory[P0][5]-48);
- }
- else if (IR [3] == "0" && IR[5] == "1") {
- R0 = (int) (memory[P1][2]-48) * 1000;
- R0 += (int) (memory[P1][3]-48) * 100;
- R0 += (int) (memory[P1][4]-48) * 10;
- R0 += (int) (memory[P1][5]-48);
- }
- else if (IR [3] == "1" && IR[5] == "1") {
- R1 = (int) (memory[P1][2]-48) * 1000;
- R1 += (int) (memory[P1][3]-48) * 100;
- R1 += (int) (memory[P1][4]-48) * 10;
- R1 += (int) (memory[P1][5]-48);
- }
- else if (IR [3] == "2" && IR[5] == "1") {
- R2 = (int) (memory[P1][2]-48) * 1000;
- R2 += (int) (memory[P1][3]-48) * 100;
- R2 += (int) (memory[P1][4]-48) * 10;
- R2 += (int) (memory[P1][5]-48);
- }
- else if (IR [3] == "3" && IR[5] == "1") {
- R3 = (int) (memory[P1][2]-48) * 1000;
- R3 += (int) (memory[P1][3]-48) * 100;
- R3 += (int) (memory[P1][4]-48) * 10;
- R3 += (int) (memory[P1][5]-48);
- }
- else if (IR [3] == "0" && IR[5] == "2") {
- R0 = (int) (memory[P2][2]-48) * 1000;
- R0 += (int) (memory[P2][3]-48) * 100;
- R0 += (int) (memory[P2][4]-48) * 10;
- R0 += (int) (memory[P2][5]-48);
- }
- else if (IR [3] == "1" && IR[5] == "2") {
- R1 = (int) (memory[P3][2]-48) * 1000;
- R1 += (int) (memory[P3][3]-48) * 100;
- R1 += (int) (memory[P3][4]-48) * 10;
- R1 += (int) (memory[P3][5]-48);
- }
- else if (IR [3] == "2" && IR[5] == "2") {
- R2 = (int) (memory[P2][2]-48) * 1000;
- R2 += (int) (memory[P2][3]-48) * 100;
- R2 += (int) (memory[P2][4]-48) * 10;
- R2 += (int) (memory[P2][5]-48);
- }
- else if (IR [3] == "3" && IR[5] == "2") {
- R3 = (int) (memory[P2][2]-48) * 1000;
- R3 += (int) (memory[P2][3]-48) * 100;
- R3 += (int) (memory[P2][4]-48) * 10;
- R3 += (int) (memory[P2][5]-48);
- }
- else if (IR [3] == "0" && IR[5] == "3") {
- R0 = (int) (memory[P3][2]-48) * 1000;
- R0 += (int) (memory[P3][3]-48) * 100;
- R0 += (int) (memory[P3][4]-48) * 10;
- R0 += (int) (memory[P3][5]-48);
- }
- else if (IR [3] == "1" && IR[5] == "3") {
- R1 = (int) (memory[P3][2]-48) * 1000;
- R1 += (int) (memory[P3][3]-48) * 100;
- R1 += (int) (memory[P3][4]-48) * 10;
- R1 += (int) (memory[P3][5]-48);
- }
- else if (IR [3] == "2" && IR[5] == "3") {
- R2 = (int) (memory[P3][2]-48) * 1000;
- R2 += (int) (memory[P3][3]-48) * 100;
- R2 += (int) (memory[P3][4]-48) * 10;
- R2 += (int) (memory[P3][5]-48);
- }
- else if (IR [3] == "3" && IR[5] == "3") {
- R3 = (int) (memory[P3][2]-48) * 1000;
- R3 += (int) (memory[P3][3]-48) * 100;
- R3 += (int) (memory[P3][4]-48) * 10;
- R3 += (int) (memory[P3][5]-48);
- }
- }
- void LoadRegisterFromMemoryDirect() {
- printf("Load Register from Memory: Direct Addressing,"
- " memory[%c%c] to register R%c \n",IR[4], IR[5], IR[3]);
- if (IR [3] == "0") {
- R0 = (int) (memory[(((int) (IR[4]-48) * 10) + (int) (IR[5]-48))]
- [2]-48) * 1000;
- R0 += (int) (memory[(((int) (IR[4]-48) * 10) + (int) (IR[5]-48))]
- [3]-48) * 100;
- R0 += (int) (memory[(((int) (IR[4]-48) * 10) + (int) (IR[5]-48))]
- [4]-48) * 10;
- R0 += (int) (memory[(((int) (IR[4]-48) * 10) + (int) (IR[5]-48))]
- [5]-48);
- }
- else if (IR [3] == "1") {
- R1 = (int) (memory[(((int) (IR[4]-48) * 10) + (int) (IR[5]-48))]
- [2]-48) * 1000;
- R1 += (int) (memory[(((int) (IR[4]-48) * 10) + (int) (IR[5]-48))]
- [3]-48) * 100;
- R1 += (int) (memory[(((int) (IR[4]-48) * 10) + (int) (IR[5]-48))]
- [4]-48) * 10;
- R1 += (int) (memory[(((int) (IR[4]-48) * 10) + (int) (IR[5]-48))]
- [5]-48);
- }
- else if (IR [3] == "2") {
- R2 = (int) (memory[(((int) (IR[4]-48) * 10) + (int) (IR[5]-48))]
- [2]-48) * 1000;
- R2 += (int) (memory[(((int) (IR[4]-48) * 10) + (int) (IR[5]-48))]
- [3]-48) * 100;
- R2 += (int) (memory[(((int) (IR[4]-48) * 10) + (int) (IR[5]-48))]
- [4]-48) * 10;
- R2 += (int) (memory[(((int) (IR[4]-48) * 10) + (int) (IR[5]-48))]
- [5]-48);
- }
- else if (IR [3] == "3") {
- R3 = (int) (memory[(((int) (IR[4]-48) * 10) + (int) (IR[5]-48))]
- [2]-48) * 1000;
- R3 += (int) (memory[(((int) (IR[4]-48) * 10) + (int) (IR[5]-48))]
- [3]-48) * 100;
- R3 += (int) (memory[(((int) (IR[4]-48) * 10) + (int) (IR[5]-48))]
- [4]-48) * 10;
- R3 += (int) (memory[(((int) (IR[4]-48) * 10) + (int) (IR[5]-48))]
- [5]-48);
- }
- }
- void AddAccumulatorImmediate() {
- printf("Add Accumulator Immediate, value %c%c%c%c \n",
- IR[2], IR[3], IR[4], IR[5]);
- ACC += (int) (IR[2]-48) * 1000;
- ACC += (int) (IR[3]-48) * 100;
- ACC += (int) (IR[4]-48) * 10;
- ACC += (int) (IR[5]-48);
- }
- void SubtractAccumulatorImmediate() {
- printf("Subtract Accumulator Immediate, value %c%c%c%c \n",
- IR[2],IR[3],IR[4],IR[5]);
- ACC -= (int) (IR[2]-48) * 1000;
- ACC -= (int) (IR[3]-48) * 100;
- ACC -= (int) (IR[4]-48) * 10;
- ACC -= (int) (IR[5]-48);
- }
- void AddContentsOfRegisterToAccumulator() {
- printf("Add Contents of Register to Accumulator, register R%c", IR[3]);
- if (IR[3] == "0")
- ACC += R0;
- else if (IR[3] == "1")
- ACC += R1;
- else if (IR[3] == "2")
- ACC += R2;
- else if (IR[3] == "3")
- ACC += R3;
- }
- void SubtractContentsOfRegisterToAccumulator() {
- printf("Subtract Contents of Register to Accumulator, register R%c \n",
- IR[3]);
- if (IR[3] == "0")
- ACC -= R0;
- else if (IR[3] == "1")
- ACC -= R1;
- else if (IR[3] == "2")
- ACC -= R2;
- else if (IR[3] == "3")
- ACC -= R3;
- }
- void AddAccumulatorRegister() {
- printf("Add to Accumulator: Register Addressing, memory[P%c] \n", IR[3]);
- if (IR[3] == "0") {
- ACC += (int) (memory[P0][2]-48) *1000;
- ACC += (int) (memory[P0][3]-48) *100;
- ACC += (int) (memory[P0][4]-48) *10;
- ACC += (int) (memory[P0][5]-48);
- }
- else if (IR[3] == "1") {
- ACC += (int) (memory[P1][2]-48) *1000;
- ACC += (int) (memory[P1][3]-48) *100;
- ACC += (int) (memory[P1][4]-48) *10;
- ACC += (int) (memory[P1][5]-48);
- }
- else if (IR[3] == "2") {
- ACC += (int) (memory[P2][2]-48) *1000;
- ACC += (int) (memory[P2][3]-48) *100;
- ACC += (int) (memory[P2][4]-48) *10;
- ACC += (int) (memory[P2][5]-48);
- }
- else if (IR[3] == "3") {
- ACC += (int) (memory[P3][2]-48) *1000;
- ACC += (int) (memory[P3][3]-48) *100;
- ACC += (int) (memory[P3][4]-48) *10;
- ACC += (int) (memory[P3][5]-48);
- }
- }
- void AddAccumulatorDirect() {
- printf("Add to Accumulator: Direct Addressing, memory[%c%c] \n",
- IR[2], IR[3]);
- ACC += (int) (memory[(((int) (IR[2]-48) * 10) + (int) (IR[3]-48))]
- [2]-48) *1000;
- ACC += (int) (memory[(((int) (IR[2]-48) * 10) + (int) (IR[3]-48))]
- [3]-48) *100;
- ACC += (int) (memory[(((int) (IR[2]-48) * 10) + (int) (IR[3]-48))]
- [4]-48) *10;
- ACC += (int) (memory[(((int) (IR[2]-48) * 10) + (int) (IR[3]-48))]
- [5]-48);
- }
- void SubtractFromAccumulatorRegister() {
- printf("Subtract from Accumulator: Register Addressing, memory[P%c] \n",
- IR[3]);
- if (IR[3] == "0") {
- ACC -= (int) (memory[P0][2]-48) *1000;
- ACC -= (int) (memory[P0][3]-48) *100;
- ACC -= (int) (memory[P0][4]-48) *10;
- ACC -= (int) (memory[P0][5]-48);
- }
- else if (IR[3] == "1") {
- ACC -= (int) (memory[P1][2]-48) *1000;
- ACC -= (int) (memory[P1][3]-48) *100;
- ACC -= (int) (memory[P1][4]-48) *10;
- ACC -= (int) (memory[P1][5]-48);
- }
- else if (IR[3] == "2") {
- ACC -= (int) (memory[P2][2]-48) *1000;
- ACC -= (int) (memory[P2][3]-48) *100;
- ACC -= (int) (memory[P2][4]-48) *10;
- ACC -= (int) (memory[P2][5]-48);
- }
- else if (IR[3] == "3") {
- ACC -= (int) (memory[P3][2]-48) *1000;
- ACC -= (int) (memory[P3][3]-48) *100;
- ACC -= (int) (memory[P3][4]-48) *10;
- ACC -= (int) (memory[P3][5]-48);
- }
- }
- void SubtractFromAccumulatorDirect() {
- printf("Subtract from Accumulator: Direct Addressing, memory[%c%c] \n",
- IR[2], IR[3]);
- ACC -= (int) (memory[(((int) (IR[2]-48) * 10) + (int) (IR[3]-48))]
- [2]-48) *1000;
- ACC -= (int) (memory[(((int) (IR[2]-48) * 10) + (int) (IR[3]-48))]
- [3]-48) *100;
- ACC -= (int) (memory[(((int) (IR[2]-48) * 10) + (int) (IR[3]-48))]
- [4]-48) *10;
- ACC -= (int) (memory[(((int) (IR[2]-48) * 10) + (int) (IR[3]-48))]
- [5]-48);
- }
- void CompareEqualRegister() {
- printf("Compare Equal: Register Addressing, compare to memory[P%c] \n",
- IR[3]);
- if (IR[3] == "0") {
- if (ACC == (((int) (memory[P0][2]-48) *1000) +
- ((int) (memory[P0][3]-48) *100) +
- ((int) (memory[P0][4]-48) *10) +
- ((int) (memory[P0][5]-48))))
- PSW[1] != "0";
- else
- PSW[1] = "0";
- }
- else if (IR[3] == "1") {
- if (ACC == (((int) (memory[P1][2]-48) *1000) +
- ((int) (memory[P1][3]-48) *100) +
- ((int) (memory[P1][4]-48) *10) +
- ((int) (memory[P1][5]-48))))
- PSW[1] != "0";
- else
- PSW[1] = "0";
- }
- else if (IR[3] == "0") {
- if (ACC == (((int) (memory[P2][2]-48) *1000) +
- ((int) (memory[P2][3]-48) *100) +
- ((int) (memory[P2][4]-48) *10) +
- ((int) (memory[P2][5]-48))))
- PSW[1] != "0";
- else
- PSW[1] = "0";
- }
- else if (IR[3] == "0") {
- if (ACC == (((int) (memory[P3][2]-48) *1000) +
- ((int) (memory[P3][3]-48) *100) +
- ((int) (memory[P3][4]-48) *10) +
- ((int) (memory[P3][5]-48))))
- PSW[1] != "0";
- else
- PSW[1] = "0";
- }
- else
- PSW[1] = "0";
- }
- void CompareLessRegister() {
- printf("Compare Less Than: Register Addressing, compare to memory[P%c] \n",
- IR[3]);
- if (IR[3] == "0") {
- if (ACC < (((int) (memory[P0][2]-48) *1000) +
- ((int) (memory[P0][3]-48) *100) +
- ((int) (memory[P0][4]-48) *10) +
- ((int) (memory[P0][5]-48))))
- PSW[1] != "0";
- else
- PSW[1] = "0";
- }
- else if (IR[3] == "1") {
- if (ACC < (((int) (memory[P1][2]-48) *1000) +
- ((int) (memory[P1][3]-48) *100) +
- ((int) (memory[P1][4]-48) *10) +
- ((int) (memory[P1][5]-48))))
- PSW[1] != "0";
- else
- PSW[1] = "0";
- }
- else if (IR[3] == "0") {
- if (ACC < (((int) (memory[P2][2]-48) *1000) +
- ((int) (memory[P2][3]-48) *100) +
- ((int) (memory[P2][4]-48) *10) +
- ((int) (memory[P2][5]-48))))
- PSW[1] != "0";
- else
- PSW[1] = "0";
- }
- else if (IR[3] == "0") {
- if (ACC < (((int) (memory[P3][2]-48) *1000) +
- ((int) (memory[P3][3]-48) *100) +
- ((int) (memory[P3][4]-48) *10) +
- ((int) (memory[P3][5]-48))))
- PSW[1] != "0";
- else
- PSW[1] = "0";
- }
- else
- PSW[1] = "0";
- }
- void CompareGreaterRegister() {
- printf("Compare Greater Than: Register Addressing, compare to memory[P%c] \n",
- IR[3]);
- if (IR[3] == "0") {
- if (ACC > (((int) (memory[P0][2]-48) *1000) +
- ((int) (memory[P0][3]-48) *100) +
- ((int) (memory[P0][4]-48) *10) +
- ((int) (memory[P0][5]-48))))
- PSW[1] != "0";
- else
- PSW[1] = "0";
- }
- else if (IR[3] == "1") {
- if (ACC > (((int) (memory[P1][2]-48) *1000) +
- ((int) (memory[P1][3]-48) *100) +
- ((int) (memory[P1][4]-48) *10) +
- ((int) (memory[P1][5]-48))))
- PSW[1] != "0";
- else
- PSW[1] = "0";
- }
- else if (IR[3] == "0") {
- if (ACC > (((int) (memory[P2][2]-48) *1000) +
- ((int) (memory[P2][3]-48) *100) +
- ((int) (memory[P2][4]-48) *10) +
- ((int) (memory[P2][5]-48))))
- PSW[1] != "0";
- else
- PSW[1] = "0";
- }
- else if (IR[3] == "0") {
- if (ACC > (((int) (memory[P3][2]-48) *1000) +
- ((int) (memory[P3][3]-48) *100) +
- ((int) (memory[P3][4]-48) *10) +
- ((int) (memory[P3][5]-48))))
- PSW[1] != "0";
- else
- PSW[1] = "0";
- }
- else
- PSW[1] = "0";
- }
- void CompareGreaterImmediate() {
- printf("Compare ACC Greater: Immediate Addressing, to memory[%c%c] \n",
- IR[2], IR[3]);
- if (ACC > (((int) (memory[(((int) (IR[2]-48) * 10)+ (int) (IR[3]-48))]
- [2]-48) *1000) +
- ((int) (memory[(((int) (IR[2]-48) * 10) + (int) (IR[3]-48))]
- [3]-48) *100) +
- ((int) (memory[(((int) (IR[2]-48) * 10) + (int) (IR[3]-48))]
- [4]-48) *10) +
- ((int) (memory[(((int) (IR[2]-48) * 10) + (int) (IR[3]-48))]
- [5]-48))))
- PSW[1] != "0";
- else
- PSW[1] = "0";
- }
- void CompareEqualImmediate() {
- printf("Compare ACC Equal: Immediate Addressing, to memory[%c%c] \n",
- IR[2], IR[3]);
- if (ACC == (((int) (memory[(((int) (IR[2]-48) * 10)+ (int) (IR[3]-48))]
- [2]-48) *1000) +
- ((int) (memory[(((int) (IR[2]-48) * 10) + (int) (IR[3]-48))]
- [3]-48) *100) +
- ((int) (memory[(((int) (IR[2]-48) * 10) + (int) (IR[3]-48))]
- [4]-48) *10) +
- ((int) (memory[(((int) (IR[2]-48) * 10) + (int) (IR[3]-48))]
- [5]-48))))
- PSW[1] != "0";
- else
- PSW[1] = "0";
- }
- void CompareLessImmediate() {
- printf("Compare ACC Greater: Immediate Addressing, to memory[%c%c] \n",
- IR[2], IR[3]);
- if (ACC < (((int) (memory[(((int) (IR[2]-48) * 10)+ (int) (IR[3]-48))]
- [2]-48) *1000) +
- ((int) (memory[(((int) (IR[2]-48) * 10) + (int) (IR[3]-48))]
- [3]-48) *100) +
- ((int) (memory[(((int) (IR[2]-48) * 10) + (int) (IR[3]-48))]
- [4]-48) *10) +
- ((int) (memory[(((int) (IR[2]-48) * 10) + (int) (IR[3]-48))]
- [5]-48))))
- PSW[1] != "0";
- else
- PSW[1] = "0";
- }
- void BranchConditionalTrue() {
- printf("Branch Conditional True, PC to %c%c \n", IR[2], IR[3]);
- if (PSW[1] != "0")
- PC = ((int) (IR[2]-48) * 10) + (int) (IR[3]-48);
- }
- void BranchConditionalFalse() {
- printf("Branch Conditional False, PC to %c%c \n", IR[2], IR[3]);
- if (PSW[1] == "0")
- PC = ((int) (IR[2]-48) * 10) + (int) (IR[3]-48);
- }
- void BranchUnconnditional() {
- printf("Branch Unconditional, PC to %c%c \n", IR[2], IR[3]);
- PC = ((int) (IR[2]-48) * 10) + (int) (IR[3]-48);
- }
- void LoadRegisterFromAccumulator() {
- printf("Load Register From Accumulator, ACC to R%c", IR[3]);
- }
- void StoreRegisterToAccumulator() {
- printf("Load Register From Accumulator, ACC to R%c", IR[3]);
- if (IR[3] == "0")
- R0 = ACC;
- else if (IR[3] == "1")
- R1 = ACC;
- else if (IR[3] == "2")
- R2 = ACC;
- else if (IR[3] == "3")
- R3 = ACC;
- }
- void Halt(){
- return 0;
- }
- main(int argc, char *argv[]) {
- char *ptr ;
- fp = open("program", O_RDONLY) ; //always check the return value.
- printf("Open is %d\n", fp) ;
- if (fp < 0) //error in read or EOF
- {printf("Bus Error 22\n") ;
- exit(0) ;
- }
- //iterate through the source code to and load it into memory
- int ret = read (fp, input_line, 7 ) ; //returns number of characters read
- while (1) {
- if (ret <= 0) //indicates end of file or
- break ; //breaks out of loop
- ptr = input_line ; //base address of array
- //write into Program_memory
- for (i = 0; i < 6 ; i++)
- memory[program_line][i] = input_line[i] ;
- //read in next line of code
- ret = read (fp, input_line, 7 ) ;
- program_line++ ; //now at a new line in the program
- }
- /*We have read in the entire PBRAIN12 program.
- Now time to execute the code.
- First, we copy the current line of the program code
- into the Instruction Register (IR)
- */
- for (i = 0 ; i< program_line; i++) {
- for (j = 0 ; j < 6 ; j++)
- IR[j] = memory[i] [j] ;
- printf("Working on Program line %d\n", i) ;
- //easy way to calc integer equivalent of chars
- opcode = (int) (IR[0] -48) * 10 ;
- opcode += (int) (IR[1] -48);
- /* Now we know the opcode for the instruction. This
- provides all the information we need to parse the
- operands.
- */
- printf("Opcode is %d\n", opcode) ;
- switch(IR[0,1]) {
- case 0: {LoadPointerImmediate(); break;}
- case 1: {AddToPointerImmediate(); break;}
- case 2: {SubtractFromPointerImmediate(); break;}
- case 3: {LoadAccumulatorImmediate(); break;}
- case 4: {LoadAccumulatorRegister(); break;}
- case 5: {LoadAccumulatorDirect(); break;}
- case 6: {StoreAccumulatorRegister(); break;}
- case 7: {StoreAccumulatorDirect(); break;}
- case 8: {StoreRegisterToMemoryRegister(); break;}
- case 9: {StoreRegisterToMemoryDirect(); break;}
- case 10: {LoadRegisterFromMemoryRegister(); break;}
- case 11: {LoadRegisterFromMemoryDirect(); break;}
- case 12: {AddAccumulatorImmediate(); break;}
- case 13: {SubtractAccumulatorImmediate(); break;}
- case 14: {AddContentsOfRegisterToAccumulator(); break;}
- case 15: {SubtractContentsOfRegisterToAccumulator(); break;}
- case 16: {AddAccumulatorRegister(); break;}
- case 17: {AddAccumulatorDirect(); break;}
- case 18: {SubtractFromAccumulatorRegister(); break;}
- case 19: {SubtractFromAccumulatorDirect(); break;}
- case 20: {CompareEqualRegister(); break;}
- case 21: {CompareLessRegister(); break;}
- case 22: {CompareGreaterRegister(); break;}
- case 23: {CompareGreaterImmediate(); break;}
- case 24: {CompareEqualImmediate(); break;}
- case 25: {CompareLessImmediate(); break;}
- case 26: {BranchConditionalTrue(); break;}
- case 27: {BranchConditionalFalse(); break;}
- case 28: {BranchUnconnditional(); break;}
- case 29: {LoadRegisterFromAccumulator(); break;}
- case 30: {StoreRegisterToAccumulator(); break;}
- case 99: {Halt(); break;}
- }
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement