Penerapan pembaruan firmware ROM pada arsitektur berbasis Z80 seperti Zeal 8-bit Computer memiliki risiko tinggi. Kesalahan pemetaan register memory-mapped I/O (MMIO) atau kegagalan inisialisasi chip UART langsung menghentikan eksekusi kode tanpa jejak log standar. Artikel ini menguraikan arsitektur deployment dual-bank EEPROM, deteksi kegagalan I/O mismatch, dan mekanisme pemulihan otomatis (rollback).

Arsitektur Memori Dual-Bank dan Validasi Checksum

Zeal 8-bit menggunakan Memory Management Unit (MMU) diskret yang membagi ruang alamat linear Z80 64 KB menjadi empat halaman 16 KB. Untuk mencegah risiko unit tidak dapat melakukan proses boot (brick), EEPROM (misalnya SST39SF040 atau AT28C256) dibagi menjadi minimal dua bank boot terpisah: Bank A (Primary/Golden) dan Bank B (Canary/Staging).

Sebelum proses flashing dijalankan lewat target runner atau bootloader internal, integritas binary wajib divalidasi menggunakan skema hashing atau CRC32 tersemat pada header ROM.

; Header biner Zeal 8-bit ROM (16 bytes)
    ORG $0000
    JP  boot_entry        ; 3 bytes: reset vector jump
    DEFB "ZEAL"          ; 4 bytes: Magic identifier
    DEFW $0102            ; 2 bytes: Version v1.2
    DEFL $4A2F90C1        ; 4 bytes: CRC32 checksum payload
    DEFB $00, $00, $00    ; 3 bytes: Reserved alignment

Prosedur flashing menulis citra baru khusus ke ruang Bank B. Target MMU kemudian mengonfigurasi halaman 0 ($0000-$3FFF) untuk mengarah ke alamat fisik Bank B hanya pada siklus soft boot berikutnya.

Deteksi I/O Mismatch saat Booting

Zeal 8-bit mengandalkan IO request line (/IORQ) dan decoders chip select (seperti 74HCT138) untuk memetakan port UART, PIO, dan timer. Masalah umum pasca pembaruan meliputi:

  • Baud Rate Clock Divisor Mismatch: Clock oscillator UART salah dihitung pada konfigurasi firmware baru, menghasilkan keluaran karakter acak pada serial terminal.
  • Address Bus Offset Error: Driver menulis ke port kontrol yang salah (misalnya alamat UART Control Register tertukar dengan Data Register), mengakibatkan operasi read/write memicu bus hang atau infinite wait loop.
  • Status Bit Polling Hang: Menunggu flag TX_READY yang tidak pernah aktif akibat pin interrupt tidak terkonfigurasi.
; Polling TX dengan batas timeout siklus register
uart_write_byte:
    LD   B, $FF           ; Inisialisasi timeout counter outer
.outer_loop:
    LD   C, $FF           ; Inisialisasi timeout counter inner
.check_status:
    IN   A, (UART_STATUS) ; Baca port status
    BIT  0, A             ; Cek bit TX_READY
    JR   NZ, .send        ; Siap kirim jika bit aktif
    DEC  C
    JR   NZ, .check_status
    DJNZ .outer_loop
    SCF                   ; Set carry flag = Error I/O hang
    RET
.send:
    LD   A, D             ; Muat data dari D
    OUT  (UART_DATA), A   ; Tulis ke transmitter
    OR   A                ; Clear carry flag = Sukses
    RET

Otomasi Rollback Berbasis Hardware Watchdog

Sistem operasi retro tidak dapat mengandalkan software exception handler jika bus I/O terkunci total. Diperlukan rangkaian eksternal, seperti chip supervisor hardware (misalnya MAX690 atau monostable multivibrator berbasis 74HC123), yang terhubung ke pin /RESET Z80 dan pin pemilih bank EEPROM.

Alur rollback beroperasi sebagai berikut:

  1. Bootloader mengaktifkan watchdog timer (misal: 1500 ms) sebelum melompat ke Bank B.
  2. Firmware Bank B harus menginisialisasi bus, menjalankan self-test dasar, dan mengirim sinyal heartbeat/kick ke port watchdog khusus: OUT (WDT_PORT), A.
  3. Jika terjadi crash, I/O mismatch hang, atau stack pointer korup sebelum heartbeat pertama, counter timer habis.
  4. Hardware supervisor menarik pin /RESET ke logika LOW dan membalik flip-flop hardware latch untuk mengalihkan rute chip select ROM kembali ke Bank A (Golden Image).
Pengalihan latch memori ke Bank A harus dilakukan oleh hardware diskret saat sinyal timeout terjadi, bukan oleh instruksi Z80, guna memastikan eksekusi pulih meski CPU dalam status HALT atau looping tak terbatas.

Postmortem Analisis Kegagalan ROM

Ketika sistem pulih ke Bank A pasca kegagalan rollback, bootloader membaca status register latch untuk membedakan apakah siklus restart terjadi akibat Cold Boot (power on normal) atau Watchdog Fallback. Jika fallback terdeteksi, lakukan langkah observasi berikut via serial console Bank A:

  • Periksa byte status yang tersisa di memory RAM non-volatile (SRAM yang tidak terhapus pada reset warm) untuk mengetahui alamat instruction pointer terakhir sebelum hang.
  • Bandingkan peta alamat port I/O firmware baru terhadap skema hardware decoders Zeal 8-bit PCB revision aktif.
  • Uji binary baru di emulator (seperti Zeal-8-bit-OS-Emulator) dengan log penulisan port I/O aktif sebelum melakukan flashing ulang.