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