#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
;-----------------