
    .project split_screen_scroll_demo_(apogej).rka
    .tape rk-bin ; формат ленты 
    .org 0
    
; *****************************************
; * Split Screen Scroll Demo (Апогей) *
; *****************************************

crt_prm_port  equ  $ef00
crt_cmd_port  equ  $ef01
crt_cursor    equ  $80
crt_ir_flag   equ  $20

dma_adr2_port  equ  $f004
dma_cnt2_port  equ  $f005
dma_adr3_port  equ  $f006
dma_cnt3_port  equ  $f007
dma_mode_port  equ  $f008

print_text  equ  $f818
print_dump  equ  $f9c5
copy_data   equ  $f76d

full_screen   equ  78*30
half_screen   equ  78*15
screen_data   equ  $4000 + (half_screen - 1)
screen_adr    equ  $e1d0
screen_end    equ  screen_adr + (full_screen - 1)

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

program_begin:
  
  lxi  h, text_1      ;
  call print_text     ;
  lxi  h, 0           ;
  lxi  d, $9f         ;  выводим дамп
  call print_dump     ;
  lxi  h, text_2      ;
  call print_text     ;
  
  mvi  a, crt_cursor  ;
  sta  crt_cmd_port   ;
  mvi  a, $ff         ;  убираем курсор
  sta  crt_prm_port   ;
  sta  crt_prm_port   ;
  
  lxi  b, new_screen  ;
  lxi  d, screen_end  ;
  lxi  h, screen_adr  ;
  call copy_data      ;  копируем экран
  lxi  h, screen_adr  ;
  call copy_data      ;
  
  call set_dma
  

main_loop:
  
  call stop_stop
  call stop_up
  call stop_stop
  call up_stop
  call stop_stop
  call stop_down
  call stop_stop
  call down_stop
  
  call stop_stop
  call stop_up
  call stop_stop
  call down_stop
  call stop_stop
  call stop_down
  call stop_stop
  call up_stop
  
  call stop_stop
  call down_up
  call stop_stop
  call up_down
  call stop_stop
  call up_up
  call stop_stop
  call down_down
  
  jmp  main_loop
  
stop_stop:
  mvi  a, 20
  sta  counter
  lxi  b, new_screen
  lxi  d, new_screen + half_screen
stop_stop_1:
  call vsync
  lda  counter
  dcr  a
  sta  counter
  jnz  stop_stop_1
  ret
  
stop_up:
  mvi  a, 30
  sta  counter
  lxi  b, new_screen
  lxi  d, new_screen + half_screen
stop_up_1:
  call vsync
  mov  a, e
  adi  78
  mov  e, a
  mov  a, d
  aci  0
  mov  d, a
  lda  counter
  dcr  a
  sta  counter
  jnz  stop_up_1
  ret
  
up_stop:
  mvi  a, 30
  sta  counter
  lxi  b, new_screen
  lxi  d, new_screen + half_screen
up_stop_1:
  call vsync
  mov  a, c
  adi  78
  mov  c, a
  mov  a, b
  aci  0
  mov  b, a
  lda  counter
  dcr  a
  sta  counter
  jnz  up_stop_1
  ret
  
stop_down:
  mvi  a, 30
  sta  counter
  lxi  b, new_screen
  lxi  d, new_screen + full_screen + half_screen
stop_down_1:
  call vsync
  mov  a, e
  sui  78
  mov  e, a
  mov  a, d
  sbi  0
  mov  d, a
  lda  counter
  dcr  a
  sta  counter
  jnz  stop_down_1
  ret
  
down_stop:
  mvi  a, 30
  sta  counter
  lxi  b, new_screen + full_screen
  lxi  d, new_screen + half_screen
down_stop_1:
  call vsync
  mov  a, c
  sui  78
  mov  c, a
  mov  a, b
  sbi  0
  mov  b, a
  lda  counter
  dcr  a
  sta  counter
  jnz  down_stop_1
  ret
  
down_up:
  mvi  a, 30
  sta  counter
  lxi  b, new_screen + full_screen
  lxi  d, new_screen + half_screen
down_up_1:
  call vsync
  mov  a, c
  sui  78
  mov  c, a
  mov  a, b
  sbi  0
  mov  b, a
  mov  a, e
  adi  78
  mov  e, a
  mov  a, d
  aci  0
  mov  d, a
  lda  counter
  dcr  a
  sta  counter
  jnz  down_up_1
  ret
  
up_down:
  mvi  a, 30
  sta  counter
  lxi  b, new_screen
  lxi  d, new_screen + full_screen + half_screen
up_down_1:
  call vsync
  mov  a, c
  adi  78
  mov  c, a
  mov  a, b
  aci  0
  mov  b, a
  mov  a, e
  sui  78
  mov  e, a
  mov  a, d
  sbi  0
  mov  d, a
  lda  counter
  dcr  a
  sta  counter
  jnz  up_down_1
  ret
  
up_up:
  mvi  a, 30
  sta  counter
  lxi  b, new_screen
  lxi  d, new_screen + half_screen
up_up_1:
  call vsync
  mov  a, c
  adi  78
  mov  c, a
  mov  a, b
  aci  0
  mov  b, a
  mov  a, e
  adi  78
  mov  e, a
  mov  a, d
  aci  0
  mov  d, a
  lda  counter
  dcr  a
  sta  counter
  jnz  up_up_1
  ret
  
down_down:
  mvi  a, 30
  sta  counter
  lxi  b, new_screen + full_screen
  lxi  d, new_screen + full_screen + half_screen
down_down_1:
  call vsync
  mov  a, c
  sui  78
  mov  c, a
  mov  a, b
  sbi  0
  mov  b, a
  mov  a, e
  sui  78
  mov  e, a
  mov  a, d
  sbi  0
  mov  d, a
  lda  counter
  dcr  a
  sta  counter
  jnz  down_down_1
  ret

set_dma:
  
  lxi  b, new_screen
  lxi  d, new_screen + half_screen
  lxi  h, screen_data
  lda  crt_cmd_port
  
vsync:
  
  lda  crt_cmd_port
  ani  crt_ir_flag
  jz   vsync
  
  mvi  a, 0
  sta  dma_mode_port
  
  mov  a, c
  sta  dma_adr2_port
  mov  a, b
  sta  dma_adr2_port
  mov  a, l
  sta  dma_cnt2_port
  mov  a, h
  sta  dma_cnt2_port
  
  mov  a, e
  sta  dma_adr3_port
  mov  a, d
  sta  dma_adr3_port
  mov  a, l
  sta  dma_cnt3_port
  mov  a, h
  sta  dma_cnt3_port
  
  mvi  a, $a4
  sta  dma_mode_port
  
  ret

;------------------------------
  
text_1:
db 10, 13, 10, 13
db '   SPLIT SCREEN SCROLL DEMO                  2022 SEGABOY       '
db 0
text_2:
db 10, 13, 10, 13, 10, 13
db '    *** ***  *    * *****    ***  *** ***  **** **** *   *      '
db '   *    *  * *    *   *     *    *    *  * *    *    **  *      '
db '    **  ***  *    *   *      **  *    ***  ***  ***  * * *      '
db '      * *    *    *   *        * *    *  * *    *    *  **      '
db '   ***  *    **** *   *     ***   *** *  * **** **** *   *      '
db 10, 13
db '          ***  *** ***   **  *    *      ***  **** *   *  **    '
db '         *    *    *  * *  * *    *      *  * *    ** ** *  *   '
db '          **  *    ***  *  * *    *      *  * ***  * * * *  *   '
db '            * *    *  * *  * *    *      *  * *    *   * *  *   '
db '         ***   *** *  *  **  **** ****   ***  **** *   *  **   '
db 0

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

counter: db 0

new_screen:
