CCCPaste

Z80 Test


#include 
#include   // для usleep, если нужны реальные задержки

// Имитация порта вывода (для тестирования на ПК)
unsigned char output_port = 0;

// Функция задержки (имитация циклов Z80)
void delay() {
    // Имитация вложенных циклов декремента на Z80
    // В реальной системе нужно использовать точные временные задержки
    volatile int i, j;
    for (i = 0; i < 255; i++) {
        for (j = 0; j < 255; j++) {
            // Пустой цикл для задержки
        }
    }
}

// Функция задержки с двойным циклом (вдвое дольше)
void long_delay() {
    volatile int i, j;
    for (i = 0; i < 255; i++) {
        for (j = 0; j < 255; j++) {
            // Пустой цикл
        }
    }
    // Второй такой же цикл
    for (i = 0; i < 255; i++) {
        for (j = 0; j < 255; j++) {
            // Пустой цикл
        }
    }
}

int main() {
    unsigned char l = 0;  // Регистр L
    unsigned char a;      // Аккумулятор
    
    // Начальная секция - мигание светодиодами
    // -----------------
    a = 0;
    a = ~a;  // CPL - инвертировать аккумулятор (0xFF)
    output_port = a;  // OUT (#0001),a - включить все светодиоды
    
    long_delay();  // Длинная задержка
    
    a = 0;
    output_port = a;  // Выключить все светодиоды
    
    delay();  // Короткая задержка
    
    // Нестандартная команда Z80 - OUT (C),0
    // На CMOS Z80 работает как OUT (C),FF
    output_port = 0xFF;  // Эмуляция undocumented команды
    
    delay();  // Задержка
    
    a = 0;
    output_port = a;  // Выключить светодиоды
    
    delay();  // Задержка
    
    // Основной цикл тестирования с прогрессирующими адресами
start:
    l = 0;
    a = 0x01;  // Первый бит
    output_port = a;  // Включить первый светодиод
    
    delay();  // Задержка
    
    // Переход к следующей секции с заполнением памяти
    // (пропускаем 238 байт заполненных 0xFF)

next_512:
    a = 0x02;  // Второй бит
    output_port = a;  // Включить второй светодиод
    
    delay();  // Задержка
    
    // Проверка значения регистра L
    if (l != 0) {
        goto start;  // Если L != 0, вернуться к началу
    }
    // Иначе перейти к следующей секции
    // (пропускаем 235+256 байт заполненных 0xFF)

next_1024:
    a = 0x04;  // Третий бит
    output_port = a;  // Включить третий светодиод
    
    delay();  // Задержка
    
    if (l != 0) {
        goto next_512;  // Вернуться к предыдущей секции
    }
    // Переход к следующей с заполнением памяти
    // (пропускаем 235+256+512 байт)

next_2048:
    a = 0x08;  // Четвертый бит
    output_port = a;  // Включить четвертый светодиод
    
    delay();  // Задержка
    
    if (l != 0) {
        goto next_1024;
    }
    // Переход дальше с заполнением
    // (пропускаем 235+256+512+1024 байт)

next_4096:
    a = 0x10;  // Пятый бит
    output_port = a;  // Включить пятый светодиод
    
    delay();  // Задержка
    
    if (l != 0) {
        goto next_2048;
    }
    // Переход дальше с заполнением
    // (пропускаем 235+256+512+1024+2048 байт)

next_8192:
    a = 0x20;  // Шестой бит
    output_port = a;  // Включить шестой светодиод
    
    delay();  // Задержка
    
    if (l != 0) {
        goto next_4096;
    }
    // Переход дальше с заполнением
    // (пропускаем 235+256+512+1024+2048+4096 байт)

next_16384:
    a = 0x40;  // Седьмой бит
    output_port = a;  // Включить седьмой светодиод
    
    delay();  // Задержка
    
    if (l != 0) {
        goto next_8192;
    }
    // Переход дальше с заполнением
    // (пропускаем 235+256+512+1024+2048+4096+8192 байт)

next_32768:
    a = 0x80;  // Восьмой бит
    output_port = a;  // Включить восьмой светодиод
    
    delay();  // Задержка
    
    l = 0xFF;  // Установить L в 0xFF для изменения логики переходов
    goto next_16384;  // Бесконечный цикл

    return 0;  // На практике сюда выполнение не дойдет
}


/////////////////////////////////

   org  0
;-----------------
    xor a
    cpl
    out (#0001),a ; turn on all LEDs
;-----------------
    ld b, 255
    ld c, b
delay0:
    dec c
    jr nz, delay0
    dec b
    jr nz, delay0
    ld b, 255
    ld c, b
delay00:
    dec c
    jr nz, delay00
    dec b
    jr nz, delay00
;-----------------  
    xor a
    out (#0001),a ; turn off all LEDs
;-----------------   
    ld b, 255
    ld c, b
delay1:
    dec c
    jr nz, delay1
    dec b
    jr nz, delay1
;-----------------  
    defb #ed, #71   ; undocumented "out (c),0" works as out (c), FF on CMOS z80
;-----------------   
    ld b, 255
    ld c, b
delay2:
    dec c
    jr nz, delay2
    dec b
    jr nz, delay2
;-----------------  
    xor a
    out (#0001),a ; turn off all LEDs
;-----------------
    ld b, 255
    ld c, b
delay3:
    dec c
    jr nz, delay3
    dec b
    jr nz, delay3
;-----------------
    jp start
    defs 196,#ff
;-----------------





;-----------------   
start:
    ld l,0
    ld a, #01
    out (#0001),a
;-----------------   
    ld b, 255
    ld c, b
delay4:
    dec c
    jr nz, delay4
    dec b
    jr nz, delay4
;-----------------  
    jp next_512
    defs 238,#ff
;-----------------
next_512:
    ld a, #02
    out (#0001),a
;-----------------   
    ld b, 255
    ld c, b
delay5:
    dec c
    jr nz, delay5
    dec b
    jr nz, delay5
;-----------------  
    ld a,l    
    or l
    jp nz,start
    jp next_1024
    defs 235+256,#FF
;-----------------
next_1024:
    ld a, #04
    out (#0001),a
;-----------------   
    ld b, 255
    ld c, b
delay6:
    dec c
    jr nz, delay6
    dec b
    jr nz, delay6
;-----------------   
    ld a,l    
    or l
    jp nz,next_512
    jp next_2048
    defs 235+256+512,#ff
;-----------------
next_2048:
    ld a, #08
    out (#0001),a
;-----------------   
    ld b, 255
    ld c, b
delay7:
    dec c
    jr nz, delay7
    dec b
    jr nz, delay7
;-----------------  
    ld a,l    
    or l
    jp nz,next_1024
    jp next_4096
    defs 235+256+512+1024,#ff
;-----------------
next_4096:
    ld a, #10
    out (#0001),a
;-----------------   
    ld b, 255
    ld c, b
delay8:
    dec c
    jr nz, delay8
    dec b
    jr nz, delay8
;-----------------  
    ld a,l    
    or l
    jp nz,next_2048
    jp next_8192
    defs 235+256+512+1024+2048,#ff
;-----------------
next_8192:
    ld a, #20
    out (#0001),a
;-----------------   
    ld b, 255
    ld c, b
delay9:
    dec c
    jr nz, delay9
    dec b
    jr nz, delay9
;-----------------  
    ld a,l    
    or l
    jp nz,next_4096
    jp next_16384
    defs 235+256+512+1024+2048+4096,#ff
;-----------------
next_16384:
    ld a, #40
    out (#0001),a
;-----------------   
    ld b, 255
    ld c, b
delay10:
    dec c
    jr nz, delay10
    dec b
    jr nz, delay10
;-----------------  
    ld a,l    
    or l
    jp nz,next_8192
    jp next_32768
    defs 235+256+512+1024+2048+4096+8192,#ff
;-----------------
next_32768:
    ld a, #80
    out (#0001),a
;-----------------   
    ld b, 255
    ld c, b
delay11:
    dec c
    jr nz, delay11
    dec b
    jr nz, delay11
;-----------------  
    ld l,#ff    
    jp next_16384
;-----------------