1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112
|
uint32_t BASE_TEMPLATE[256][16] = {
{ INSRIN|PSTPCT|PINSTO, HALT|MICRST|SELPGM|PGMSTI|UIHIOU, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, // 0000 0000 - 01 HALT + LOAD PGM
{ INSRIN|PSTPCT|PINST HALT|AREGIN|LDASHD|LDASHU|UIHIOU, MICRST|BREGIN|LDBSHU|LDBSHD|UILOOU, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, // 0000 0001 - 02 HALT + LOAD A+B
{ INSRIN|PSTPCT|PINSTO, HALT|MICRST|BREGIN|LDBSHU|LDBSHD|UIHIOU, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, // 0000 0010 - 03 HALT + LOAD B ONLY
{ INSRIN|PSTPCT|PINSTO, HALT|MEMADI|UIHIOU, MICRST|MEMLD|MEMWRT|UILOOU, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, // 0000 0011 - 04 HALT + LOAD MEM
{ INSRIN|PSTPCT|PINSTO|MEMADI, MICRST|AREGIN|LDASHD|LDASHU|MEMLD, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, // 0000 0100 - 05 LOAD A FROM MEM
{ INSRIN|PSTPCT|PINSTO, MEMADI|MEMCTO, MICRST|MEMLD|AREGIN|LDASHD|LDASHU|MEMCTU, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, // 0000 0101 - 06 LOAD A FROM STACK
{ INSRIN|PSTPCT|PINSTO|MEMADI, MEMLD|BREGIN|LDBSHU|LDBSHD|MICRST, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, // 0000 0110 - 07 LOAD B FROM MEM
{ INSRIN|PSTPCT|PINSTO, MEMADI|MEMCTO, MICRST|MEMLD|BREGIN|LDBSHU|LDBSHD|MEMCTU, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, // 0000 0111 - 08 LOAD B FROM STACK
{ INSRIN|PSTPCT|PINSTO, MICRST|SUMOUT|AREGIN|LDASHD|LDASHU|DSPRIN, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, // 0000 1000 - 09 DISPLAY SUM+LD TO A
{ INSRIN|PSTPCT|PINSTO, MICRST|MEMLD|MEMCTI, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, // 0000 1001 - 10 SET RAM COUNTER
{ INSRIN|PSTPCT|PINSTO|MEMADI, MICRST|MEMLD|MEMWRT|SUMOUT, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, // 0000 1010 - 11 SAVE SUM TO MEM
{ INSRIN|PSTPCT|PINSTO, MEMCTO|MEMADI, MICRST|MEMLD|MEMWRT|MEMCTU|SUMOUT, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, // 0000 1011 - 12 SAVE SUM TO STACK
{ INSRIN|PSTPCT|PINSTO|MEMADI, MICRST|MEMLD|PGMSTI, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, // 0000 1100 - 13 JUMP FROM MEMORY
{ INSRIN|PSTPCT|PINSTO, MICRST|PINSTO|PGMSTI, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, // 0000 1101 - 14 JUMP DIRECT
{ INSRIN|PSTPCT|PINSTO, MICRST|MEMLD|SELPGM|PGMSTI, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, // 0000 1110 - 15 JUMP TO PGM+STEP
{ INSRIN|PSTPCT|PINSTO, MICRST|SUMOUT|SUBINV|DSPRIN|AREGIN|LDASHD|LDASHU, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, // 0000 1111 - 16 DISPLAY DIFF+LD TO A
{ INSRIN|PSTPCT|PINSTO|MEMADI, MICRST|SUMOUT|SUBINV|MEMLD|MEMWRT, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, // 0001 0000 - 17 SAVE DIFF. TO MEM
{ INSRIN|PSTPCT|PINSTO, MEMCTO|MEMADI, MICRST|MEMLD|MEMWRT|SUBINV|MEMCTU|SUMOUT, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, // 0001 0001 - 18 SAVE DIFF. TO STACK
{ INSRIN|PSTPCT|PINSTO|MEMADI, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, // 0001 0010 - 19
//'' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' ''' ' ' '
{ INSRIN|PSTPCT|PINSTO|MEMADI, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, // 0000 0000 - 255
{ INSRIN|PSTPCT|PINSTO|MEMADI, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, // 0000 0000 - 256
};
uint32_t ucode [16][256][16];
void initucode() { // Flag Conditions
(ucode[FLAGS_U0N0Z0C0], BASE_TEMPLATE, sizeof(BASE_TEMPLATE));
//00. No Flags, No Modifications
(ucode[FLAGS_U0N0Z0C1], BASE_TEMPLATE, sizeof(BASE_TEMPLATE));
//01. ALU Carry Flag Set, Jump If
// Example code: ucode[FLAGS_U0N0Z0C1][jumpIfCarry][Step#] = MicIns1|MicIns2|Ect.
(ucode[FLAGS_U0N0Z1C0], BASE_TEMPLATE, sizeof(BASE_TEMPLATE));
//02. ALU Zero Flag Set, Jump If
(ucode[FLAGS_U0N0Z1C1], BASE_TEMPLATE, sizeof(BASE_TEMPLATE));
//03. No Configuration, Error
(ucode[FLAGS_U0N1Z0C0], BASE_TEMPLATE, sizeof(BASE_TEMPLATE));
//04. Negative Flag Set, Jump If
// " " " " " " " " " "
(ucode[FLAGS_U1N1Z1C1], BASE_TEMPLATE, sizeof(BASE_TEMPLATE));
//15. No Configuration, Error
}
int main()
{
//Program data bytes
initucode();
cout <<"Writing Binary File";
fstream outputFile("Rom1.bin", ios::binary | ios::in | ios::out | ios::trunc);
outputFile.open;
if (outputFile.is_open()){
for ( int address = 0; address < 65536; address += 1) {
int flags = (address & 0b1111000000000000) >> 12;
int instr = (address & 0b0000111111110000) >> 4;
int step = (address & 0b0000000000001111) >> 0;
outputFile.write((int *)&address, ucode[flags][instr][step] >> 0);} // set 24, 16, 8, 0 to shift bytes for rom order
ouputFile.close();
}
else {
cout << endl<< "Could not create file" + filename;
}
if (address % 64 ==0){
cout << ".";
}
}
cout << "done"<< endl;
return 0;
}
|