/*
Praktikum: Simulasi Register & Flag - Versi Interaktif
Dosen: Muhammad Ikhwan Fathulloh
Tujuan:
- Memahami fungsi register umum (R0–R31)
- Melihat status bit flag (C, Z, N, V, S) secara visual
- Menampilkan flag aktif secara bergantian berdasarkan kondisi tertentu
*/
#define LED_C 2
#define LED_Z 3
#define LED_N 4
#define LED_V 5
#define LED_S 6
byte R0, R1, R2;
bool C, Z, N, V, S;
int mode = 0; // 0 = Simulasi acak, 1 = Demo flag bergantian
unsigned long lastChange = 0;
void setup() {
Serial.begin(9600);
pinMode(LED_C, OUTPUT);
pinMode(LED_Z, OUTPUT);
pinMode(LED_N, OUTPUT);
pinMode(LED_V, OUTPUT);
pinMode(LED_S, OUTPUT);
Serial.println("=== Simulasi Register dan Flag ===");
Serial.println("Menyalakan semua LED (tes rangkaian)...");
testAllLED();
Serial.println("Masuk ke mode simulasi...");
}
void loop() {
if (mode == 0) {
// Mode Simulasi Acak
simulateRandomOperation();
} else {
// Mode Demo Flag Bergantian
demoFlagSequence();
}
// Ubah mode setiap 20 detik
if (millis() - lastChange > 20000) {
mode = 1 - mode;
lastChange = millis();
Serial.println(mode == 0 ? "\nKembali ke mode Simulasi Acak\n" : "\nMasuk ke mode Demo Flag Bergantian\n");
}
delay(1500);
}
void testAllLED() {
digitalWrite(LED_C, HIGH);
digitalWrite(LED_Z, HIGH);
digitalWrite(LED_N, HIGH);
digitalWrite(LED_V, HIGH);
digitalWrite(LED_S, HIGH);
delay(2000);
digitalWrite(LED_C, LOW);
digitalWrite(LED_Z, LOW);
digitalWrite(LED_N, LOW);
digitalWrite(LED_V, LOW);
digitalWrite(LED_S, LOW);
}
void simulateRandomOperation() {
R0 = random(0, 200);
R1 = random(0, 200);
int sum = R0 + R1;
R2 = sum & 0xFF;
// Flag logic
C = (sum > 255);
Z = (R2 == 0);
N = (R2 & 0x80);
V = ((R0 & 0x80) == (R1 & 0x80)) && ((R0 & 0x80) != (R2 & 0x80));
S = N ^ V;
printFlags();
updateLEDs();
}
void demoFlagSequence() {
static int step = 0;
step = (step + 1) % 5;
// Matikan semua LED dulu
digitalWrite(LED_C, LOW);
digitalWrite(LED_Z, LOW);
digitalWrite(LED_N, LOW);
digitalWrite(LED_V, LOW);
digitalWrite(LED_S, LOW);
switch (step) {
case 0:
Serial.println("🟢 Demo Carry (C=1): Overflow 8-bit");
C = 1; Z = N = V = S = 0;
break;
case 1:
Serial.println("🟢 Demo Zero (Z=1): Hasil 0");
Z = 1; C = N = V = S = 0;
break;
case 2:
Serial.println("🟢 Demo Negative (N=1): Bit ke-7 aktif");
N = 1; C = Z = V = S = 0;
break;
case 3:
Serial.println("🟢 Demo Overflow (V=1): Overflow signed");
V = 1; C = Z = N = S = 0;
break;
case 4:
Serial.println("🟢 Demo Sign (S=1): Kombinasi N dan V");
S = 1; C = Z = N = V = 0;
break;
}
updateLEDs();
}
void updateLEDs() {
digitalWrite(LED_C, C);
digitalWrite(LED_Z, Z);
digitalWrite(LED_N, N);
digitalWrite(LED_V, V);
digitalWrite(LED_S, S);
}
void printFlags() {
Serial.println("----------------------");
Serial.print("R0: "); Serial.println(R0);
Serial.print("R1: "); Serial.println(R1);
Serial.print("R2: "); Serial.println(R2);
Serial.print("Flags -> ");
Serial.print("C: "); Serial.print(C);
Serial.print(" | Z: "); Serial.print(Z);
Serial.print(" | N: "); Serial.print(N);
Serial.print(" | V: "); Serial.print(V);
Serial.print(" | S: "); Serial.println(S);
}