    ; 🐟 для Радио-86РК
    .project move_pikachu_rk.rk 
    .tape rk-bin
    .org 0


;***********************
;*  MOVE YOUR PIKACHU  * v.01 РАДИО-86РК
;***********************

;------------------------------------------

key_line_port  equ  $8000
key_data_port  equ  $8001
key_tape_port  equ  $8002
key_line1      equ  $fd

crt_prm_port  equ  $c000
crt_cmd_port  equ  $c001
crt_reset     equ  $00
crt_start     equ  $27
crt_cursor    equ  $80
crt_preset    equ  $e0
crt_ir_flag   equ  $20

dma_ch2_addr  equ  $e004
dma_ch2_size  equ  $e005
dma_ch3_addr  equ  $e006
dma_ch3_size  equ  $e007
dma_mod_port  equ  $e008
dma_reset     equ  $80
dma_start     equ  $a4

h_back   equ  8
h_act    equ  64
h_front  equ  6
h_sync   equ  8
h_total  equ  h_back + h_act + h_front

v_back   equ  3
v_act    equ  33
v_front  equ  2
v_sync   equ  1
v_total  equ  v_back + v_act + v_front

spacedrow   equ  0
underline   equ  8
rowlines    equ  8
offsetline  equ  0
spacedatr   equ  1
cursormod   equ  1

;------------------------------------------

program_begin:

; --- начальные установки ---

  mvi  a, key_line1
  sta  key_line_port
  lxi  d, data_pack  ; адрес источника, откуда берётся запакованный байт
  lxi  h, screen_adr ; адрес получателя, куда отправляется распакованный байт

; --- распаковка экрана ---

unpack_proc:
  ldax d             ; читаем следующий байт,
  inx  d             ; увеличиваем счётчик источника
  cpi  $80           ; и сверяем считанный байт с константой
  jz   unpack_end    ; если обнаружен флаг конца файла, то выходим из процедуры
  jnc  unpack_begin  ; если обнаружен флаг массива, то переходим к распаковке
  mov  m, a          ; иначе выводим одиночный байт,
  inx  h             ; увеличиваем счётчик
  jmp  unpack_proc   ; и повторяем цикл
unpack_begin:
  ani  $7f           ; сбрасываем старший бит
  mov  c, a          ; загружаем счётчик повторений
  ldax d             ; читаем байт для вывода
  inx  d             ; увеличиваем счётчик источника
unpack_loop:
  mov  m, a          ; передаём байт по назначению
  inx  h             ; и увеличиваем адрес назначения
  dcr  c             ; уменьшаем счётчик повторений
  jp   unpack_loop   ; и если он не вышел за диапазон, то продолжаем цикл распаковки
  jmp  unpack_proc   ; иначе возвращаемся к проверке следующего байта
unpack_end:

; --- настройка контроллера элт ---

init_crt:

  lxi  h, crt_cmd_port
  mov  a, m
  mov  a, m
  ani  crt_ir_flag
  jz   .-3

  mvi  m, crt_reset
  dcr  l
  mvi  m, spacedrow*128 + h_total-1
  mvi  m, (v_sync-1)*64 + v_total-1
  mvi  m, (underline-1)*16 + rowlines-1
  mvi  m, offsetline*128 + spacedatr*64 + cursormod*16 + h_sync/2-1
  inr  l
  mvi  m, crt_cursor
  dcr  l
  mvi  m, $ff
  mvi  m, $ff
  inr  l
  mvi  m, crt_start

; --- настройка контроллера пдп ---

init_dma:

  lxi  h, crt_cmd_port
  mov  a, m
  mov  a, m
  ani  crt_ir_flag
  jz   .-3

  lxi  h, dma_mod_port
  mvi  m, dma_reset
  mvi  l, dma_ch2_addr & $ff
  mvi  m, screen_adr & $ff
  mvi  m, screen_adr >> 8
  inr  l
dma_size  equ  v_total*h_total-1
  mvi  m, dma_size & $ff
  mvi  m, $4000 + dma_size >> 8
  mvi  l, dma_mod_port & $ff
  mvi  m, dma_start

; --- опрос клавиатуры ---

key_scan:

  lda  key_data_port
  ori  00001111b

  cpi  01111111b
  jz   .+8
  cpi  00101111b
  jnz  .+9
  lxi  d, $4000 + dma_size+78
  jmp  set_dma

  cpi  00111111b
  jnz  .+9
  lxi  d, $4000 + dma_size+78+1
  jmp  set_dma

  cpi  10111111b
  jz   .+8
  cpi  00011111b
  jnz  .+9
  lxi  d, $4000 + dma_size+1
  jmp  set_dma

  cpi  10011111b
  jnz  .+9
  lxi  d, $4000 + dma_size-78+1
  jmp  set_dma

  cpi  11011111b
  jz   .+8
  cpi  10001111b
  jnz  .+9
  lxi  d, $4000 + dma_size-78
  jmp  set_dma

  cpi  11001111b
  jnz  .+9
  lxi  d, $4000 + dma_size-78-1
  jmp  set_dma

  cpi  11101111b
  jz   .+8
  cpi  01001111b
  jnz  .+9
  lxi  d, $4000 + dma_size-1
  jmp  set_dma

  cpi  01101111b
  jnz  .+9
  lxi  d, $4000 + dma_size+78-1
  jmp  set_dma


  lxi  d, $4000 + dma_size


set_dma:

  lxi  h, dma_ch3_size
  mov  m, e
  mov  m, d

  lxi  h, crt_cmd_port
  mov  a, m
  mov  a, m
  ani  crt_ir_flag
  jz   .-3

  jmp  key_scan


;------------------------------------------------------

data_pack:

db   $ff, $00, $f1, $00, $bf, $17, $8d, $00, $85, $17, $82, $00, $82, $03, $a3, $17, $82, $03, $82, $00, $89, $17, $8d, $00, $85, $17, $11, $82, $00, $04, $14, $10, $00, $02, $03, $07, $99, $17, $13, $03, $01, $00, $04, $14, $10, $82, $00, $06, $89, $17, $8d, $00, $86, $17, $82, $00, $02, $83, $17, $14, $10, $00, $03, $95, $17, $03, $00, $04, $14, $83, $17, $01, $82, $00, $8a, $17, $8d, $00, $86, $17, $15, $82, $00, $86, $17, $14, $10, $02, $07, $83, $17, $87, $03, $83, $17, $13, $01, $04, $14, $86, $17, $82, $00, $16, $8a, $17, $8d, $00, $87, $17, $10, $00, $00, $06, $87, $17, $15, $10, $02, $03, $00, $00, $87, $14, $00, $00, $03, $01, $04, $16, $87, $17, $11, $00, $00, $04, $8b, $17, $8d, $00, $88, $17, $10, $00, $00, $89, $17, $15, $14, $8b, $17, $14, $16, $89, $17, $00, $00, $04, $8c, $17, $8d, $00, $89, $17, $15, $00, $07, $a1, $17, $13, $00, $16, $8d, $17, $8d, $00, $8a, $17, $15, $00, $07, $9f, $17, $13, $00, $16, $8e, $17, $8d, $00, $8c, $17, $10, $03, $9d, $17, $03, $04, $90, $17, $8d, $00, $8d, $17, $14, $00, $03, $13, $97, $17, $07, $03, $00, $14, $88, $17, $13, $07, $86, $17, $8d, $00, $8f, $17, $10, $00, $82, $17, $13, $00, $14, $07, $89, $17, $13, $14, $00, $07, $82, $17, $00, $04, $89, $17, $13, $04, $00, $86, $17, $8d, $00, $90, $17, $00, $17, $17, $13, $00, $06, $17, $11, $07, $87, $17, $13, $06, $17, $11, $00, $07, $17, $17, $00, $89, $17, $03, $04, $17, $00, $86, $17, $8d, $00, $8f, $17, $13, $04, $17, $17, $11, $00, $00, $03, $00, $06, $87, $17, $11, $00, $03, $00, $00, $06, $17, $17, $10, $07, $87, $17, $01, $14, $17, $17, $00, $86, $17, $8d, $00, $8f, $17, $11, $06, $17, $17, $15, $04, $04, $00, $00, $16, $87, $17, $15, $00, $00, $10, $10, $16, $17, $17, $11, $06, $85, $17, $13, $01, $16, $82, $17, $10, $07, $85, $17, $8d, $00, $8f, $17, $01, $16, $82, $17, $15, $01, $01, $16, $83, $17, $10, $04, $83, $17, $15, $02, $02, $16, $82, $17, $15, $02, $84, $17, $13, $04, $16, $83, $17, $11, $06, $85, $17, $8d, $00, $8f, $17, $00, $99, $17, $00, $83, $17, $01, $04, $85, $17, $11, $06, $85, $17, $8d, $00, $8f, $17, $00, $88, $17, $03, $17, $17, $03, $03, $17, $17, $03, $88, $17, $00, $82, $17, $01, $16, $86, $17, $11, $06, $85, $17, $8d, $00, $8e, $17, $11, $06, $88, $17, $10, $02, $01, $14, $14, $02, $01, $04, $88, $17, $11, $06, $13, $00, $16, $88, $17, $00, $85, $17, $8d, $00, $8e, $17, $11, $06, $89, $17, $15, $06, $17, $17, $11, $16, $89, $17, $11, $00, $04, $8a, $17, $00, $85, $17, $8d, $00, $8e, $17, $11, $06, $8a, $17, $02, $17, $17, $01, $8a, $17, $11, $06, $8b, $17, $00, $85, $17, $8d, $00, $8a, $17, $03, $13, $07, $17, $17, $00, $8a, $17, $10, $17, $17, $04, $8a, $17, $00, $17, $17, $13, $07, $03, $85, $17, $13, $01, $04, $85, $17, $8d, $00, $89, $17, $01, $14, $00, $10, $03, $17, $00, $07, $89, $17, $11, $07, $13, $06, $89, $17, $13, $00, $17, $03, $04, $00, $14, $02, $82, $17, $13, $01, $04, $16, $86, $17, $8d, $00, $89, $17, $02, $82, $17, $14, $00, $00, $02, $8a, $17, $14, $14, $8a, $17, $01, $00, $00, $14, $82, $17, $01, $06, $13, $01, $04, $16, $88, $17, $8d, $00, $89, $17, $02, $84, $17, $14, $00, $02, $95, $17, $01, $00, $14, $84, $17, $01, $00, $04, $16, $8a, $17, $8d, $00, $89, $17, $02, $86, $17, $14, $02, $93, $17, $01, $14, $86, $17, $01, $16, $8c, $17, $8d, $00, $89, $17, $10, $06, $a3, $17, $11, $04, $8d, $17, $8d, $00, $8a, $17, $10, $07, $a1, $17, $13, $00, $16, $8d, $17, $8d, $00, $8a, $17, $15, $02, $a1, $17, $01, $00, $8e, $17, $8d, $00, $8b, $17, $15, $02, $9f, $17, $01, $16, $10, $06, $8d, $17, $8d, $00, $8c, $17, $15, $02, $07, $9b, $17, $13, $01, $16, $17, $15, $02, $8d, $17, $8d, $00, $8d, $17, $15, $00, $07, $99, $17, $13, $00, $16, $82, $17, $00, $8d, $17, $8d, $00, $8e, $17, $15, $00, $02, $97, $17, $01, $00, $16, $17, $17, $13, $00, $14, $8d, $17, $ff, $00, $f0, $00, $80  ; eof

;------------------------------

screen_adr:
