org 0x8000
   ULA EQU 254

   ATTR    EQU #5800

   ; SET All Pixels
   LD  HL, #4000
   LD  DE, #4001
   LD  BC, 32*192 -1
   LD  A, #FF
   LD  (HL), A
   LDIR

   LD DE, ATTR
   LD HL, 32*24
   LD BC, #0000
   LD  A, 0

band_fill

   ;LD  A, R

   INC A
   ADD A, E

   AND #07
   OR  #40

   LD (DE), A
   INC DE

   SCF
   SBC HL, BC
   JP NZ, band_fill

   ;DJNZ band_fill


   LD HL, ATTR +5*32
       CALL attrLineRight

   LD HL, ATTR +6*32
       CALL attrLineRight
   LD HL, ATTR +6*32
       CALL attrLineRight

   LD HL, ATTR +7*32
       CALL attrLineRight
   LD HL, ATTR +7*32
       CALL attrLineRight
   LD HL, ATTR +7*32
       CALL attrLineRight

   LD HL, ATTR +8*32
       CALL attrLineRight
   LD HL, ATTR +8*32
       CALL attrLineRight
   LD HL, ATTR +8*32
       CALL attrLineRight
   LD HL, ATTR +8*32
       CALL attrLineRight

   LD HL, ATTR +9*32
       CALL attrLineRight
   LD HL, ATTR +9*32
       CALL attrLineRight
   LD HL, ATTR +9*32
       CALL attrLineRight
   LD HL, ATTR +9*32
       CALL attrLineRight
   LD HL, ATTR +9*32
       CALL attrLineRight


   LD HL, ATTR +15*32
       CALL attrLineLeft

   LD HL, ATTR +16*32
       CALL attrLineLeft
   LD HL, ATTR +16*32
       CALL attrLineLeft

   LD HL, ATTR +17*32
       CALL attrLineLeft
   LD HL, ATTR +17*32
       CALL attrLineLeft
   LD HL, ATTR +17*32
       CALL attrLineLeft

   LD HL, ATTR +18*32
       CALL attrLineLeft
   LD HL, ATTR +18*32
       CALL attrLineLeft
   LD HL, ATTR +18*32
       CALL attrLineLeft
   LD HL, ATTR +18*32
       CALL attrLineLeft

   LD HL, ATTR +19*32
       CALL attrLineLeft
   LD HL, ATTR +19*32
       CALL attrLineLeft
   LD HL, ATTR +19*32
       CALL attrLineLeft
   LD HL, ATTR +19*32
       CALL attrLineLeft
   LD HL, ATTR +19*32
       CALL attrLineLeft


loop

   HALT

   LD  A, R
   LD  B, 0
   LD  C, A
   LD  HL, ATTR
   ADD HL,BC
   CALL attrLineLeft

   CALL    scrollTopBand

   LD  A, R
   LD  B, 0
   LD  C, A
   LD  HL, ATTR + 10*32
   ADD HL,BC
   CALL attrLineRight

   CALL    scrollBottomBand

   LD  A, R
   LD  B, 0
   LD  C, A
   LD  HL, ATTR + 20*32
   ADD HL, BC
   CALL attrLineLeft

   CALL borderCycle

   jr loop


TopBand     DW  ATTR +  9*32 ; 4*32
BottomBand  DW  ATTR + 19*32 ;14*32


scrollBottomBand
   LD HL, (BottomBand)

   LD  DE, ATTR +19*32 + 32
   LD  BC, 32
   ADD HL, BC

   LD  A, H
   CP  D
   JP  NZ, scrollBottomBand_skip

   LD  A, L
   CP  E
   JP  NZ, scrollBottomBand_skip
       LD  HL, ATTR + 14*32
scrollBottomBand_skip

   LD  (BottomBand), HL
   ;JP attrLineLeft


attrLineLeft
; INPUT: HL Line pointer

   LD  A, L
   AND %11100000
   LD  L, A

   LD  D, H
   LD  E, L

   LD  B, 31
   INC HL
   LD  C, (HL)

attrLineLeft_loop

   LD  A,(HL)
   LD  (DE), A
   INC HL
   INC DE

   DJNZ attrLineLeft_loop

   LD  A, C
   LD  (DE), A

   RET



scrollTopBand
   LD HL, (TopBand)

   LD  DE, ATTR +9*32 + 32
   LD  BC, 32
   ADD HL, BC

   LD  A, H
   CP  D
   JP  NZ, scrollTopBand_skip

   LD  A, L
   CP  E
   JP  NZ, scrollTopBand_skip
       LD  HL, ATTR + 4*32

scrollTopBand_skip

   LD  (TopBand), HL
   ;JP attrLineRight

attrLineRight
; INPUT: HL Line pointer

   LD  A, L
   OR  %00011111
   LD  L, A

   LD  D, H
   LD  E, L

   LD  B, 31
   DEC HL
   LD  C, (HL)

attrLineRight_1
   LD  A,(HL)
   LD  (DE), A
   DEC HL
   DEC DE

   DJNZ attrLineRight_1

   LD  A, C
   LD  (DE), A

   RET

Border DB 00

borderCycle
   LD  HL, Border
   INC (HL)
   LD  A, (HL)
   CP  8
   JP  NZ, borderCycle_skip
       XOR A
       LD  (HL), A

borderCycle_skip

   OUT (ULA), A

   RET


;----------------------------------------
; Snippets:
;  down_hl
;  up_hl
;  hl_to_scr
;  scr_to_attrs
;  set_point
;  rnd16
;  gen_sin
;----------------------------------------

;----------------------------------------
; Next screen line address in HL
;----------------------------------------
down_hl
   inc h
   ld a, h
   and #07
   ret nz
   ld a, l
   sub #e0
   ld l, a
   sbc a, a
   and #f8
   add a, h
   ld h, a
   ret

;----------------------------------------
; Previous screen line address in HL
;----------------------------------------
up_hl
   dec h
   ld a, h
   cpl
   and #07
   ret nz
   ld a, l
   sub #20
   ld l, a
   ret c
   ld a, h
   add a, #08
   ld h, a
   ret

;----------------------------------------
; in:  L = x [0..255]
;      H = y [0..191]
; out: HL = addr in screen [4000..57FF]
;      C = pixel number [0..7]
;----------------------------------------
hl_to_scr
   ld   c, l
   ld   a, l
   rlca : rlca : rlca
   xor  h
   and  #c7
   xor  h
   rlca : rlca
   ld   l, a
   ld   a, h
   and  #c0
   inc  a
   rra : rra : rra
   xor  h
   and  #f8
   xor  h
   ld   h, a
   ld   a, c
   and 7
   ret

;----------------------------------------
; in:  HL = addr in screen [4000..57FF]
; out: HL = addr in attrs [5800..5AFF]
;----------------------------------------
scr_to_attrs
   ld   a, h
   rrca : rrca : rrca
   and  #03
   or   #58
   ld   h, a
   ret

;----------------------------------------
; in:  L = x [0..255]
;      H = y [0..191]
;----------------------------------------
set_point
   call hl_to_scr
   ld   de, pixel_tbl
   add  a, e
   ld   e, a
   ld   a, (de)
   ld   (hl), a
   ret

   align 8
pixel_tbl
   db   #80,#40,#20,#10,#08,#04,#02,#01

;----------------------------------------
; in:  none
; out: HL = random 16bit value
;----------------------------------------
rnd16
sd equ  $+1
   ld   de, 0
   ld   a, d
   ld   h, e
   ld   l, 253
   or   a
   sbc  hl, de
   sbc  a, 0
   sbc  hl, de
   ld   d, 0
   sbc  a, d
   ld   e, a
   sbc  hl, de
   jr   nc, .st
   inc  hl
st ld  (.sd), hl
   ret

;----------------------------------------
; in:  IX = addr of 256b buffer
; out: generated sin table
;----------------------------------------
gen_sin
   ld   de, #7fbc
   ld   hl, #ff7f
g0 ld   a, d
   xor  #80 ; uncomment for unsigned
   ld   (ix), a
   xor  #80 ; uncomment for unsigned
   rla
   sbc  a, a
   ld   b, a
   ld   c, d
   adc  hl, bc
   rr   c
   rrca
   rr   c
   add  hl, bc
   ld   b, h
   ld   a, l
   ex   de, hl
   sra b : rra
   sra b : rra
   sra b : rra
   ld   c, a
   ;or   a
   sbc  hl, bc
   ex   de, hl
   inc  ixl
   jr   nz, .g0
   ret