org 0x8000 jp main WAIT equ 355 START equ 140 org 0x8181 irq: push af push bc push de push hl call effect pop hl pop de pop bc pop af ei ret main: di ld hl,0x8000 ld a,0x81 ld b,0 imloop: ld (hl),a inc hl djnz imloop ld (hl),a dec a ld i,a im 2 ei ld hl,START ld (w1time),hl ; ld hl,0x5800+0x10a ld de,text ld c,7 text1: ld b,12 text2: ld a,(de) ld (hl),a inc hl inc de djnz text2 push bc ld bc, 20 add hl,bc pop bc dec c jr nz, text1 looping: halt jr looping w1time: dw 0 w2time: db 0 w1dir: db 0 effect: ld bc,(w1time) ld a,(w1dir) and a jr z, down up: dec bc ccf ld hl,START sbc hl,bc jr c, no_ovl ld bc,START xor a ld (w1dir),a jr no_ovl down: inc bc inc bc ccf ld hl,START+WAIT sbc hl,bc jr nc, no_ovl ld bc,START+WAIT ld a,1 ld (w1dir),a no_ovl: ld (w1time),bc w1: nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop dec bc ld a,b or c jr nz,w1 ;; ld d,16 ld hl,bar ld a,(barpos) ld b,a add a,l ld l,a ld a,b inc a and 15 ld (barpos),a lineloop: ld a,(hl) inc hl out (254),a ld bc,18 w2: nop dec bc ld a,b or c jr nz,w2 dec d jr nz, lineloop xor a out (254),a ret ld a,3 out (254),a loop jr loop bar: db 0,1,2,3,4,5,6,7,7,6,5,4,3,2,1,0 db 0,1,2,3,4,5,6,7,7,6,5,4,3,2,1,0 barpos: db 0 text: db 0,9,0,0,0,9,0,0,9,0,9,0 db 9,0,9,0,9,0,9,0,9,0,9,0 db 9,0,0,0,9,0,0,0,9,0,9,0 db 0,9,0,0,9,0,0,0,0,9,0,0 db 0,0,9,0,9,0,0,0,9,0,9,0 db 9,0,9,0,9,0,9,0,9,0,9,0 db 0,9,0,0,0,9,0,0,9,0,9,0 ;---------------------------------------- ; 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