#include "crash82.inc" position = TEXT_MEM+67 BKX = TEXT_MEM+2 BKY = TEXT_MEM+3 COUNTER1 = TEXT_MEM+4 manposition = TEXT_MEM+6 ANIMATOR = TEXT_MEM+8 backup = TEXT_MEM+9 TempLine = TEXT_MEM2+1 PicCoor = TEXT_MEM2+20 offset = TEXT_MEM2+22 NASR_Status = TEXT_MEM2+23 .db "Xenocide",0 ld a,%10001100 ;Needed for FIND_PIXEL ($4116) out (2),a set 7,(IY+$14) ld a,1 ld (NASR_Status),a ld hl,map ld (position),hl ;; your starting position ld hl,map+183 ;(6*30+3) ld (manposition),hl ld a,(hl) ld (backup),a call mymap2 ld bc,$180F ld hl,MAN call drawit2 startloop: ld hl,(COUNTER1) inc hl ld (COUNTER1),hl ld a,l AND 15 call Z,REALTIME ld hl,MAN call drawit ld a,$3E out (1),a in a,(1) bit 2,a jr z,RIGHT bit 1,a jr z,LEFT bit 0,a jr z,DOWN bit 3,a jp z,UP call GET_KEY cp G_CLEAR ret z jr startloop RIGHT: ld hl,(manposition) inc hl ld a,(hl) cp 4 jp nc,startloop ld (manposition),hl ld a,(BKY) cp 88 jp z,scrollright call SAVEIT ld b,8 right_loop: push bc call REDISP ld a,(BKY) inc a ld (BKY),a ld hl,MAN call drawit pop bc djnz right_loop jr startloop LEFT: ld hl,(manposition) dec hl ld a,(hl) cp 4 jp nc,startloop ld (manposition),hl ld a,(BKY) or a jp z,scrolleft call SAVEIT ld b,8 left_loop: push bc call REDISP ld a,(BKY) dec a ld (BKY),a ld hl,MAN call drawit pop bc djnz left_loop jp startloop DOWN: ld hl,(manposition) ld de,30 add hl,de ld a,(hl) cp 4 jp nc,startloop ld (manposition),hl ld a,(BKX) cp 7 jp z,scrolldown call SAVEIT ld b,8 down_loop: push bc call REDISP ld a,(BKX) dec a ld (BKX),a ld hl,MAN call drawit pop bc djnz down_loop jp startloop UP: ld hl,(manposition) ld de,-30 add hl,de ld a,(hl) cp 4 jp nc,startloop ld (manposition),hl ld a,(BKX) cp 63 jp z,scrollup call SAVEIT ld b,8 up_loop: push bc call REDISP ld a,(BKX) inc a ld (BKX),a ld hl,MAN call drawit pop bc djnz up_loop jp startloop scrollright: ld b,12 scr_loop: push bc ld hl,(position) inc hl ld (position),hl call mymap2 pop bc HALT HALT djnz scr_loop xor a ld (BKY),a ld hl,MAN call drawit jp startloop scrolleft: ld b,12 scl_loop: push bc ld hl,(position) dec hl ld (position),hl call mymap2 pop bc HALT HALT djnz scl_loop ld a,88 ld (BKY),a ld hl,MAN call drawit jp startloop scrolldown: ld b,8 scd_loop: push bc ld hl,(position) ld de,30 add hl,de ld (position),hl call mymap2 pop bc HALT HALT djnz scd_loop ld a,63 ld (BKX),a ld hl,MAN call drawit jp startloop scrollup: ld b,8 scu_loop: push bc ld hl,(position) ld de,-30 add hl,de ld (position),hl call mymap2 pop bc HALT HALT djnz scu_loop ld a,7 ld (BKX),a ld hl,MAN call drawit jp startloop REALTIME: ld a,(ANIMATOR) or a jr nz,animation inc a ld (ANIMATOR),a jp mymap2 animation: ld hl,(position) ld de,GRAPH_MEM ld b,8 ;; 7 down animateloop2: push bc ld b,12 ;; 8 accross animateloop: push bc push de ld a,(hl) push hl cp 8 jr z,draw8animate cp 9 jr z,draw9animate jr noanimate ANIMATEMEBABY: call drawblock noanimate: pop hl inc hl pop de inc de pop bc djnz animateloop newanimate: ld bc,18 add hl,bc push hl ld hl,84 ; -11 for each dec of b add hl,de ex de,hl pop hl pop bc djnz animateloop2 xor a ld (ANIMATOR),a jp CR_GRBCopy draw8animate: ld hl,staranimate8 jr ANIMATEMEBABY draw9animate: ld hl,staranimate9 jr ANIMATEMEBABY WaitKey: call GET_KEY cp G_ENTER ret z cp G_2ND jr nz,WaitKey RET mymap2: ld hl,(position) mymap: ld de,GRAPH_MEM ld b,8 ;; 8 down maploop2: push bc ld b,12 ;; 12 accross maploop: push bc ld a,(hl) push hl LD L,A LD H,0 ADD HL,HL ADD HL,HL ADD HL,HL ld bc,STARTBITMAPS add hl,bc DRAWMEBABY: call drawblock pop hl inc hl inc de pop bc djnz maploop newrow: ld bc,18 add hl,bc push hl ld hl,84 ; -11 for each dec of b add hl,de ex de,hl pop hl pop bc djnz maploop2 jp CR_GRBCopy drawblock: push bc push de ld b,8 ; my GREAT sprite routine block_loop: push bc push hl ld a,(hl) ld (de),a ld hl,12 add hl,de ex de,hl pop hl inc hl pop bc djnz block_loop pop de pop bc ret drawit2: ld (BKX),bc drawit: ld bc,(BKX) NASRWARP: ld de,$0000 add hl,de push bc ex de,hl call $4166 ld bc,$88B8 add hl,bc ld (PicCoor),hl ex de,hl ld b,$ff Patch: rla inc b jr nc,Patch ld a,(hl) ld c,a inc hl ld a,(hl) ld (offset),a ld a,b ld e,c cp (hl) jr c,DS1 inc e DS1: inc hl ld a,(hl) ld d,a inc hl YLoop: push bc push de ld b,8 ex de,hl ld hl,TempLine InitTempLineLoop: ld (hl),$ff inc hl djnz InitTempLineLoop ex de,hl ld a,(NASR_Status) or a jr z,NASRErase NASRDraw: ld b,0 ld de,TempLine ldir jr NASRDrawFin NASRErase: ld b,c ld hl,TempLine LoadEmpty: ld (hl),0 inc hl djnz LoadEmpty NASRDrawFin: pop de pop bc push hl push bc push de ld d,b ld a,b or a jr z,skipshift SpriLoop1: ld a,b ld HL,TempLine ld b,e scf SpriLoop2: rr (HL) inc HL djnz SpriLoop2 ld b,a djnz SpriLoop1 ld b,d skipshift: ld a,$ff ;fill accumulator inc b mask1: srl a ;make the mask djnz mask1 ;something like scf ;00001111 -> rl a ld hl,(PicCoor) ;implement the mask or (hl) ;this preserve the 0 bits ld hl,TempLine ;become xxxx1111 and (hl) ;when anded, become ld (hl),a ;xxxxyyyy ld b,d ;retrieve b ld a,(offset) dec a sub b jr nc,skip sub 248 skip: ld b,a inc b ld a,$ff mask2: sla a djnz mask2 scf rr a dec e ld hl,(PicCoor) ld d,0 add hl,de or (hl) ld hl,TempLine add hl,de and (hl) ld (hl),a inc e ld c,e ld hl,(PicCoor) ld de,12 push hl add hl,de ld (PicCoor),hl pop hl ld de,TempLine ex de,hl ld b,0 ldir pop de pop bc pop hl dec d jp nz,YLoop pop bc jp CR_GRBCopy DISPHL: DM_HL_DECI: ld ($8215),de ;Since DE is a word, it overlaps into 8216 ld b,48 ; 48 -> b ld c,4 ; 4 -> c ld a,h ; h -> a or l ; If a=0 and l=0, then return zero jr z,DM_HL_3 ; If zero, then jump to DM_HL_3 ld c,-1 ; -1 -> c ld b,46 ; 46 -> b jr DM_HL_NEXT2 ; Jump to DM_HL_NEXT2 DM_HL_INIT: call CP_HL_DE ; cp hl,de jr c,DM_HL_NEXT2 ; If carry, then jump to DM_HL_NEXT2 dec c ; c = c - 1 DM_HL_NEXT: ld b,47 ; 47 -> b DM_HL_NEXT2: inc c ; c = c + 1 ld a,c ; c -> a or a ; If a=0, then return zero ld de,10000 ; 10000 -> de jr z,DM_HL_2a ; If zero, then jump to DM_HL_2a cp 1 ; If a=1, then return zero ld de,1000 ; 1000 -> de jr z,DM_HL_2a ; If zero, then jump to DM_HL_2a cp 2 ; If a=2, then return zero ld de,100 ; 100 -> de jr z,DM_HL_2a ; If zero, then jump to DM_HL_2a cp 3 ; If a=3, then return zero ld de,10 ; 10 -> de jr z,DM_HL_2a ; If zero, then jump to DM_HL_2a ld de,1 ; 1 -> de DM_HL_2a: ld a,b ; b -> a cp 46 ; If a=46, then return zero jr z,DM_HL_INIT ; If zero, then jump to DM_HL_INIT DM_HL_2b: inc b ; b = b + 1 call CP_HL_DE ; cp hl,de jr c,DM_HL_3 ; If carry, then jump to DM_HL_3 or a ; Reset carry flag sbc hl,de ; hl = hl - de jr DM_HL_2b ; Jump to DM_HL_2b DM_HL_3: ld a,b ; b -> a ROM_CALL(M_CHARPUT) ; Display the character ld a,c ; c -> a cp 4 ; If a=4, then return zero jr nz,DM_HL_NEXT ; If not zero, then jump to DM_HL_NEXT jp CR_GRBCopy SAVEIT: ld hl,GRAPH_MEM ld de,APD_BUF ld bc,768 ldir ret REDISP: ld de,GRAPH_MEM ld hl,APD_BUF ld bc,768 ldir ret map: .db 04,04,04,04,04,04,04,04,04,03,06,07,12,12,12,12,12,12,12,12,12,12,12,12,00,00,00,00,00,00 .db 04,05,05,05,05,05,05,05,04,02,03,01,01,01,02,02,02,02,02,02,02,01,01,12,00,00,00,00,00,00 .db 04,09,00,00,09,00,00,00,04,03,06,01,01,01,01,04,04,04,06,06,06,01,01,12,00,00,00,00,00,00 .db 04,00,00,08,00,08,08,00,04,02,03,01,01,01,01,04,05,04,03,03,03,01,12,12,00,00,00,00,00,00 .db 04,00,00,00,00,00,00,00,04,03,06,01,01,01,01,04,09,04,01,01,01,01,01,01,00,00,00,00,00,00 .db 04,04,04,00,00,00,04,04,04,02,03,01,01,01,01,05,00,05,01,10,01,01,01,01,00,00,00,00,00,00 .db 05,05,05,00,00,00,05,05,05,03,03,01,00,00,00,00,00,00,03,11,03,01,01,01,00,00,00,00,00,00 .db 12,01,01,01,01,01,01,01,01,01,01,01,01,01,01,01,01,01,03,03,03,01,01,01,00,00,00,00,00,00 .db 00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00 .db 00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00 .db 00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00 .db 00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00 .db 00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00 .db 00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00 .db 00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00 .db 00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00 .db 00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00 .db 00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00 .db 00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00 .db 00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00 .db 00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00 .db 00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00 .db 00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00 .db 00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00 .db 00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00 .db 00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00 .db 00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00 .db 00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00 .db 00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00 .db 00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00 .db 00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00 .db 00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00 .db 00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00 .db 00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00 .db 00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00 .db 00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00 .db 00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00 STARTBITMAPS: star0: ;; blank .db %00000000 .db %00000000 .db %00000000 .db %00000000 .db %00000000 .db %00000000 .db %00000000 .db %00000000 star1: .db %00000000 .db %00000100 .db %00000000 .db %10001000 .db %00000000 .db %00100000 .db %00000010 .db %00000000 star2: ;; tree .db %00111000 .db %01110100 .db %01111100 .db %01111100 .db %00111000 .db %00010000 .db %00111000 .db %00111000 star3: ;; flowers .db %01000000 .db %10100100 .db %01001010 .db %00010100 .db %01000001 .db %10100100 .db %01001010 .db %00010100 star4 ;; roof .db %11111111 .db %10100101 .db %11011011 .db %10100101 .db %11011011 .db %10100101 .db %11011011 .db %11111111 star5: ;; wall .db %00000001 .db %00100010 .db %10000110 .db %00111000 .db %00110001 .db %01001101 .db %11000010 .db %11111111 star6: ;; gravestone .db %00000000 .db %00111100 .db %01000010 .db %01011010 .db %01000010 .db %01011010 .db %01000010 .db %11000011 star7: .db %11111111 .db %10000001 .db %10111101 .db %10000001 .db %11111111 .db %00011000 .db %00011000 .db %00011000 star8: .db %01110110 .db %11111111 .db %10000101 .db %10110111 .db %10110101 .db %10110111 .db %10000101 .db %11111111 star9 .db %00011100 .db %00101010 .db %00010100 .db %00111110 .db %01111111 .db %01011101 .db %00001000 .db %00110110 star10: .db %10001000 .db %01101110 .db %00110101 .db %11001101 .db %00110100 .db %01010110 .db %10101001 .db %01110101 star11: .db %00101000 .db %00111100 .db %00011010 .db %00101100 .db %00110100 .db %01001000 .db %01100110 .db %11010011 star12: .db %00000000 .db %00000000 .db %00011000 .db %01110100 .db %01001110 .db %11011010 .db %11000111 .db %10110001 staranimate8: .db %01110110 .db %11111111 .db %11111101 .db %11001111 .db %11001101 .db %11001111 .db %11111101 .db %11111111 staranimate9: .db %00011100 .db %00111110 .db %00010100 .db %00111110 .db %01111111 .db %01011101 .db %00001000 .db %00110110 MAN: .db 1,1,8 .db %00111100 .db %01101010 .db %11011101 .db %10100011 .db %11001101 .db %10100101 .db %01010010 .db %00111100 .end END