Archives
Trending
Support
Login
clear text
XML
Django
JavaScript
MATLAB
C
C++
C#
Python
SQL
Shell
Bash
Markdown
YAML
JSON
HTML
CSS
PHP
Java
Ruby
Go
Rust
Swift
Kotlin
Arduino
TypeScript
Perl
Autohotkey
Lua
SQF
R
Scala
Haskell
Groovy
Dart
Clojure
VB.NET
Objective-C
PowerShell
Bash
CoffeeScript
Verilog
#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 ;-----------------
Mark as private (unlisted)
for 30 minutes
for 6 hours
for 1 day
for 1 week
for 1 month
for 1 year
everlasting (like CCCP)