dllbridge

Z80 Test

Oct 2nd, 2025
94
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 8.58 KB | None | 0 0
  1.  
  2. #include <stdio.h>
  3. #include <unistd.h>  // для usleep, если нужны реальные задержки
  4.  
  5. // Имитация порта вывода (для тестирования на ПК)
  6. unsigned char output_port = 0;
  7.  
  8. // Функция задержки (имитация циклов Z80)
  9. void delay() {
  10.     // Имитация вложенных циклов декремента на Z80
  11.     // В реальной системе нужно использовать точные временные задержки
  12.     volatile int i, j;
  13.     for (i = 0; i < 255; i++) {
  14.         for (j = 0; j < 255; j++) {
  15.             // Пустой цикл для задержки
  16.         }
  17.     }
  18. }
  19.  
  20. // Функция задержки с двойным циклом (вдвое дольше)
  21. void long_delay() {
  22.     volatile int i, j;
  23.     for (i = 0; i < 255; i++) {
  24.         for (j = 0; j < 255; j++) {
  25.             // Пустой цикл
  26.         }
  27.     }
  28.     // Второй такой же цикл
  29.     for (i = 0; i < 255; i++) {
  30.         for (j = 0; j < 255; j++) {
  31.             // Пустой цикл
  32.         }
  33.     }
  34. }
  35.  
  36. int main() {
  37.     unsigned char l = 0;  // Регистр L
  38.     unsigned char a;      // Аккумулятор
  39.    
  40.     // Начальная секция - мигание светодиодами
  41.     // -----------------
  42.     a = 0;
  43.     a = ~a;  // CPL - инвертировать аккумулятор (0xFF)
  44.     output_port = a;  // OUT (#0001),a - включить все светодиоды
  45.    
  46.     long_delay();  // Длинная задержка
  47.    
  48.     a = 0;
  49.     output_port = a;  // Выключить все светодиоды
  50.    
  51.     delay();  // Короткая задержка
  52.    
  53.     // Нестандартная команда Z80 - OUT (C),0
  54.     // На CMOS Z80 работает как OUT (C),FF
  55.     output_port = 0xFF;  // Эмуляция undocumented команды
  56.    
  57.     delay();  // Задержка
  58.    
  59.     a = 0;
  60.     output_port = a;  // Выключить светодиоды
  61.    
  62.     delay();  // Задержка
  63.    
  64.     // Основной цикл тестирования с прогрессирующими адресами
  65. start:
  66.     l = 0;
  67.     a = 0x01;  // Первый бит
  68.     output_port = a;  // Включить первый светодиод
  69.    
  70.     delay();  // Задержка
  71.    
  72.     // Переход к следующей секции с заполнением памяти
  73.     // (пропускаем 238 байт заполненных 0xFF)
  74.  
  75. next_512:
  76.     a = 0x02;  // Второй бит
  77.     output_port = a;  // Включить второй светодиод
  78.    
  79.     delay();  // Задержка
  80.    
  81.     // Проверка значения регистра L
  82.     if (l != 0) {
  83.         goto start;  // Если L != 0, вернуться к началу
  84.     }
  85.     // Иначе перейти к следующей секции
  86.     // (пропускаем 235+256 байт заполненных 0xFF)
  87.  
  88. next_1024:
  89.     a = 0x04;  // Третий бит
  90.     output_port = a;  // Включить третий светодиод
  91.    
  92.     delay();  // Задержка
  93.    
  94.     if (l != 0) {
  95.         goto next_512;  // Вернуться к предыдущей секции
  96.     }
  97.     // Переход к следующей с заполнением памяти
  98.     // (пропускаем 235+256+512 байт)
  99.  
  100. next_2048:
  101.     a = 0x08;  // Четвертый бит
  102.     output_port = a;  // Включить четвертый светодиод
  103.    
  104.     delay();  // Задержка
  105.    
  106.     if (l != 0) {
  107.         goto next_1024;
  108.     }
  109.     // Переход дальше с заполнением
  110.     // (пропускаем 235+256+512+1024 байт)
  111.  
  112. next_4096:
  113.     a = 0x10;  // Пятый бит
  114.     output_port = a;  // Включить пятый светодиод
  115.    
  116.     delay();  // Задержка
  117.    
  118.     if (l != 0) {
  119.         goto next_2048;
  120.     }
  121.     // Переход дальше с заполнением
  122.     // (пропускаем 235+256+512+1024+2048 байт)
  123.  
  124. next_8192:
  125.     a = 0x20;  // Шестой бит
  126.     output_port = a;  // Включить шестой светодиод
  127.    
  128.     delay();  // Задержка
  129.    
  130.     if (l != 0) {
  131.         goto next_4096;
  132.     }
  133.     // Переход дальше с заполнением
  134.     // (пропускаем 235+256+512+1024+2048+4096 байт)
  135.  
  136. next_16384:
  137.     a = 0x40;  // Седьмой бит
  138.     output_port = a;  // Включить седьмой светодиод
  139.    
  140.     delay();  // Задержка
  141.    
  142.     if (l != 0) {
  143.         goto next_8192;
  144.     }
  145.     // Переход дальше с заполнением
  146.     // (пропускаем 235+256+512+1024+2048+4096+8192 байт)
  147.  
  148. next_32768:
  149.     a = 0x80;  // Восьмой бит
  150.     output_port = a;  // Включить восьмой светодиод
  151.    
  152.     delay();  // Задержка
  153.    
  154.     l = 0xFF;  // Установить L в 0xFF для изменения логики переходов
  155.     goto next_16384;  // Бесконечный цикл
  156.  
  157.     return 0;  // На практике сюда выполнение не дойдет
  158. }
  159.  
  160.  
  161. /////////////////////////////////
  162.  
  163.    org  0
  164. ;-----------------
  165.     xor a
  166.     cpl
  167.     out (#0001),a ; turn on all LEDs
  168. ;-----------------
  169.     ld b, 255
  170.     ld c, b
  171. delay0:
  172.     dec c
  173.     jr nz, delay0
  174.     dec b
  175.     jr nz, delay0
  176.     ld b, 255
  177.     ld c, b
  178. delay00:
  179.     dec c
  180.     jr nz, delay00
  181.     dec b
  182.     jr nz, delay00
  183. ;-----------------  
  184.     xor a
  185.     out (#0001),a ; turn off all LEDs
  186. ;-----------------  
  187.     ld b, 255
  188.     ld c, b
  189. delay1:
  190.     dec c
  191.     jr nz, delay1
  192.     dec b
  193.     jr nz, delay1
  194. ;-----------------  
  195.     defb #ed, #71   ; undocumented "out (c),0" works as out (c), FF on CMOS z80
  196. ;-----------------  
  197.     ld b, 255
  198.     ld c, b
  199. delay2:
  200.     dec c
  201.     jr nz, delay2
  202.     dec b
  203.     jr nz, delay2
  204. ;-----------------  
  205.     xor a
  206.     out (#0001),a ; turn off all LEDs
  207. ;-----------------
  208.     ld b, 255
  209.     ld c, b
  210. delay3:
  211.     dec c
  212.     jr nz, delay3
  213.     dec b
  214.     jr nz, delay3
  215. ;-----------------
  216.     jp start
  217.     defs 196,#ff
  218. ;-----------------
  219.  
  220.  
  221.  
  222.  
  223.  
  224. ;-----------------  
  225. start:
  226.     ld l,0
  227.     ld a, #01
  228.     out (#0001),a
  229. ;-----------------  
  230.     ld b, 255
  231.     ld c, b
  232. delay4:
  233.     dec c
  234.     jr nz, delay4
  235.     dec b
  236.     jr nz, delay4
  237. ;-----------------  
  238.     jp next_512
  239.     defs 238,#ff
  240. ;-----------------
  241. next_512:
  242.     ld a, #02
  243.     out (#0001),a
  244. ;-----------------  
  245.     ld b, 255
  246.     ld c, b
  247. delay5:
  248.     dec c
  249.     jr nz, delay5
  250.     dec b
  251.     jr nz, delay5
  252. ;-----------------  
  253.     ld a,l    
  254.     or l
  255.     jp nz,start
  256.     jp next_1024
  257.     defs 235+256,#FF
  258. ;-----------------
  259. next_1024:
  260.     ld a, #04
  261.     out (#0001),a
  262. ;-----------------  
  263.     ld b, 255
  264.     ld c, b
  265. delay6:
  266.     dec c
  267.     jr nz, delay6
  268.     dec b
  269.     jr nz, delay6
  270. ;-----------------  
  271.     ld a,l    
  272.     or l
  273.     jp nz,next_512
  274.     jp next_2048
  275.     defs 235+256+512,#ff
  276. ;-----------------
  277. next_2048:
  278.     ld a, #08
  279.     out (#0001),a
  280. ;-----------------  
  281.     ld b, 255
  282.     ld c, b
  283. delay7:
  284.     dec c
  285.     jr nz, delay7
  286.     dec b
  287.     jr nz, delay7
  288. ;-----------------  
  289.     ld a,l    
  290.     or l
  291.     jp nz,next_1024
  292.     jp next_4096
  293.     defs 235+256+512+1024,#ff
  294. ;-----------------
  295. next_4096:
  296.     ld a, #10
  297.     out (#0001),a
  298. ;-----------------  
  299.     ld b, 255
  300.     ld c, b
  301. delay8:
  302.     dec c
  303.     jr nz, delay8
  304.     dec b
  305.     jr nz, delay8
  306. ;-----------------  
  307.     ld a,l    
  308.     or l
  309.     jp nz,next_2048
  310.     jp next_8192
  311.     defs 235+256+512+1024+2048,#ff
  312. ;-----------------
  313. next_8192:
  314.     ld a, #20
  315.     out (#0001),a
  316. ;-----------------  
  317.     ld b, 255
  318.     ld c, b
  319. delay9:
  320.     dec c
  321.     jr nz, delay9
  322.     dec b
  323.     jr nz, delay9
  324. ;-----------------  
  325.     ld a,l    
  326.     or l
  327.     jp nz,next_4096
  328.     jp next_16384
  329.     defs 235+256+512+1024+2048+4096,#ff
  330. ;-----------------
  331. next_16384:
  332.     ld a, #40
  333.     out (#0001),a
  334. ;-----------------  
  335.     ld b, 255
  336.     ld c, b
  337. delay10:
  338.     dec c
  339.     jr nz, delay10
  340.     dec b
  341.     jr nz, delay10
  342. ;-----------------  
  343.     ld a,l    
  344.     or l
  345.     jp nz,next_8192
  346.     jp next_32768
  347.     defs 235+256+512+1024+2048+4096+8192,#ff
  348. ;-----------------
  349. next_32768:
  350.     ld a, #80
  351.     out (#0001),a
  352. ;-----------------  
  353.     ld b, 255
  354.     ld c, b
  355. delay11:
  356.     dec c
  357.     jr nz, delay11
  358.     dec b
  359.     jr nz, delay11
  360. ;-----------------  
  361.     ld l,#ff    
  362.     jp next_16384
  363. ;-----------------  
Advertisement
Add Comment
Please, Sign In to add comment