;Display flags ; Bits 6-7: zoom mode ; Bit 0: grayscale enable ; Bits 1-2: monochrome palette select render: ld a,$FF out (1),a ld a,$BF out (1),a ex (sp),hl ex (sp),hl in a,(1) rla jr c,_ ld a,3 ld (framecount),a _ ld a,(LY) cp 144 jr z,_ ld a,(framecount) dec a ret nz ld a,(LY) or a jr nz,++_ ld hl,(offsetYFake) ld (offsetY),hl ld a,l ld (myLY),a ld hl,displayFlagsFake ld b,(hl) dec l ld a,(hl) ld (hl),b xor b and %11000001 call nz,update_zoom_vars xor a out (5),a jr ++_ _ call getAllMyKeys ld hl,framecount dec (hl) jp nz,intermediateFrame ld a,(frameskip) ld (hl),a _ ld a,(LCDC_backup) rla ret nc exx push bc push de push hl ld a,2 out (5),a start_raster: ld a,(LCDC_backup) rra jp nc,clip_bottom ld a,(LY) cp (ix-vars+myLY) jp c,clip_top ld a,(windowLine) or a jr nz,_ bit 5,(ix-vars+LCDC_backup) jr z,_ ld a,(myLY) sub (ix-vars+WY_backup) jr c,_ ld (windowLine),a _ ld hl,(SCY_backup) ld a,(offsetX) add a,h ld h,a ld (mySCY),hl call preparetilemap jr nc,clip_bottom ld a,(LCDC_backup) bit 3,a jr z,_ set 2,d _ bit 4,a ld a,$24 ;inc h jr nz,$+3 inc a ;dec h ld (rastersmc1),a exx ld b,(ix-vars+screenWidth) ;Is window on? bit 5,(ix-vars+LCDC_backup) jr z,raster_no_window ;Is window Y below the last LY? ld a,(myLY) sub (ix-vars+WY_backup) jr nc,_ ;Does window start in the current slice? exx add a,c exx jr nc,raster_no_window exx sbc a,c ;CARRY WAS SET cpl ld c,a add a,(ix-vars+myLY) ld (myLY),a call rasterlines jr start_raster _ ;Make it draw only as far as the window (or the screen width, whichever is less). ld a,(WX_backup) sub (ix-vars+offsetX) jr c,raster_window rra rra rra and $1F cp b jr nc,raster_no_window ld b,a inc b exx call rasterlines raster_window: call preparewindow jr nc,clip_bottom ld a,(LCDC_backup) bit 6,a jr z,_ set 2,d _ bit 4,a ld a,$24 ;inc h jr nz,$+3 inc a ;dec h ld (rastersmc1),a call rasterlines jr clip_bottom raster_no_window: exx call rasterlines clip_bottom: ld a,(LY) ld (myLY),a cp 144 jr nz,clip_top push iy call draw_sprites pop iy call screenCopy xor a ld (windowLine),a clip_top: pop hl pop de pop bc exx xor a out (5),a ret safecopy_mono_0: ld hl,bufferBase ld e,$20 _ in a,($10) rla jr c,-_ ld a,e out ($10),a ld bc,64*256+$11 _ in a,($10) rla jr c,-_ outi jr nz,-_ ld c,15 add hl,bc inc e ld a,e cp $2c jr nz,--_ safecopy_mono_0_intermediate: ret safecopy_gray_0_intermediate: bit 0,(hl) ret nz ld a,2 out (5),a call safecopy_gray_0 xor a out (5),a ret safecopy_gray_0: ld hl,dithercount dec (hl) jr nz,_ ld (hl),3 _ ld bc,30 ld hl,bufferBase - 30 ld e,$1F call advancecolumn ld a,(dithercount) dec a jr z,gray0loop3 dec a jr z,gray0loop2 gray0loop1: in a,($10) rla jr c,gray0loop1 ld a,(hl) inc l xor (hl) and %10110110 xor (hl) inc hl out ($11),a dec b call z,advancecolumn gray0loop2: in a,($10) rla jr c,gray0loop2 ld a,(hl) inc l xor (hl) and %11011011 xor (hl) inc hl out ($11),a dec b call z,advancecolumn gray0loop3: in a,($10) rla jr c,gray0loop3 ld a,(hl) inc l xor (hl) and %01101101 xor (hl) inc hl out ($11),a dec b call z,advancecolumn jp gray0loop1 advancecolumn: add hl,bc ld b,64 inc e ld a,e cp $2c jr z,++_ _ in a,($10) rla jr c,-_ ld a,e out ($10),a ret _ pop hl ret safecopy_mono_1_intermediate: ld a,2 out (5),a call safecopy_mono_1 xor a out (5),a ret safecopy_mono_1: push ix ld hl,dithercount dec (hl) ld a,(hl) jr nz,_ ld (hl),6 _ srl a inc a ld ixh,a ld d,bit6LUT0 >> 8 jr nc,_ inc d _ ld hl,bufferBase ld c,$20 mono1loop0: push hl push ix _ in a,($10) rla jr c,-_ ld a,c out ($10),a ld b,64 mono1loop1: ld e,(hl) inc hl dec ixh jr nz,_ ld ixh,3 inc hl _ ld a,d xor (bit6LUT0^bit6LUT1)>>8 ld d,a _ in a,($10) rla jr c,-_ ld a,(de) out ($11),a djnz mono1loop1 ld a,c pop ix pop hl ld c,86 + 15 add hl,bc inc a ld c,a cp $30 jr nz,mono1loop0 pop ix ret safecopy_gray_1_intermediate: bit 0,(hl) ret nz ld a,2 out (5),a call safecopy_gray_1 xor a out (5),a ret safecopy_gray_1: push ix ld hl,dithercount dec (hl) jr nz,_ ld (hl),3 _ ld a,(hl) ld hl,bufferBase - ((86+15)*2) push hl ld c,$1F ld d,bit6LUT0 >> 8 dec a ld ix,gray1loop3 jr z,advancecolumn1 dec a ld ix,gray1loop2 jr z,advancecolumn1 ld ix,gray1loop1 advancecolumn1: pop hl ld a,c inc a ld bc,(86+15)*2 add hl,bc ld c,a ld b,64 cp $30 jr z,++_ _ in a,($10) rla jr c,-_ ld a,c out ($10),a push hl jp (ix) _ pop ix ret gray1loop1: in a,($10) rla jr c,gray1loop1 ld a,(hl) inc l xor (hl) and %10011001 xor (hl) ld e,a ld a,(de) inc hl out ($11),a inc l inc hl dec b jp z,advancecolumn1 gray1loop2: in a,($10) rla jr c,gray1loop2 ld a,(hl) inc l xor (hl) and %10101010 xor (hl) ld e,a ld a,(de) inc hl out ($11),a dec b jp z,advancecolumn1 gray1loop3: in a,($10) rla jr c,gray1loop3 ld a,(hl) inc l xor (hl) and %00110011 xor (hl) ld e,a ld a,(de) inc hl out ($11),a dec b jp z,advancecolumn1 jp gray1loop1 safecopy_mono_2_intermediate: ;bit 0,(hl) ;ret nz ld a,2 out (5),a call safecopy_mono_2 xor a out (5),a ret safecopy_mono_2: push ix push iy ld hl,dithercount dec (hl) ld a,(hl) jr nz,_ ld (hl),6 _ srl a ld h,bit5LUT0 >> 8 jr nc,_ inc h _ inc a ld iyl,a ld ix,bufferBase ld bc,64*256 + $20 mono2loop0: push bc _ in a,($10) rla jr c,-_ ld a,c out ($10),a ld iyh,iyl push ix mono2loop1: ld a,h xor (bit5LUT0^bit5LUT1)>>8 ld h,a ld l,(ix) ld a,(hl) add a,a add a,a add a,a ld c,a ld l,(ix+107+15) ld a,(hl) rra srl a or c ld c,a _ in a,($10) rla jr c,-_ ld a,c out ($11),a inc ix inc ix dec iyh jr nz,_ ld iyh,3 dec ix _ djnz mono2loop1 pop ix ld de,(107+15)*2 add ix,de pop bc inc c _ in a,($10) rla jr c,-_ ld a,c out ($10),a push bc push ix ld iyh,iyl mono2loop2: ld a,h xor (bit5LUT0^bit5LUT1)>>8 ld h,a add a,(bit4LUT0-bit5LUT0)>>8 ld d,a ld l,(ix-107-15) ld a,(hl) rrca rrca and %11000000 ld c,a ld l,(ix+107+15) ld a,(hl) rrca rrca rrca and %00000011 or c ld c,a ld e,(ix) ld a,(de) add a,a add a,a or c ld c,a _ in a,($10) rla jr c,-_ ld a,c out ($11),a inc ix inc ix dec iyh jr nz,_ ld iyh,3 dec ix _ djnz mono2loop2 pop ix ld de,(107+15)*2 add ix,de pop bc inc c _ in a,($10) rla jr c,-_ ld a,c out ($10),a push bc push ix ld iyh,iyl mono2loop3: ld a,h xor (bit5LUT0^bit5LUT1)>>8 ld h,a ld l,(ix-107-15) ld a,(hl) rrca rrca rrca and %11100000 ld l,(ix) or (hl) ld c,a _ in a,($10) rla jr c,-_ ld a,c out ($11),a inc ix inc ix dec iyh jr nz,_ ld iyh,3 dec ix _ djnz mono2loop3 pop ix ld de,107+15 add ix,de pop bc inc c ld a,c cp $2c jp nz,mono2loop0 pop iy pop ix ret safecopy_gray_2_intermediate: bit 0,(hl) ret nz ld a,2 out (5),a call safecopy_gray_2 xor a out (5),a ret safecopy_gray_2: push ix ld a,7 out ($10),a ld hl,dithercount dec (hl) ld a,(hl) jr nz,_ ld (hl),3 _ cpl ld ixl,a ld ixh,(graydithers >> 8) - 1 ld d,bit5LUT0 >> 8 ld hl,bufferBase ld c,$80 gray2loop0: push af _ in a,($10) rla jr c,-_ ld a,c out ($10),a push hl ld b,4 inc c _ in a,($10) rla jr c,-_ ld a,$20 out ($10),a gray2loop1: push bc ld a,(hl) inc l xor (hl) ;Scaler pulls from *_*_**_* and (ix-5) xor (hl) ld e,a ld a,(de) add a,a add a,a add a,a ld bc,(107+15)*2-1 add hl,bc ld c,a ld a,(hl) inc l xor (hl) ;Scaler pulls from *_*_**_* and (ix-4) xor (hl) ld e,a ld a,(de) rrca rrca ld e,a and 7 or c out ($11),a ld bc,(107+15)*2-1 add hl,bc ld a,(hl) inc l xor (hl) ;Scaler pulls from _*_*_*_* and (ix) xor (hl) ld b,bit4LUT0 >> 8 ld c,a ld a,(bc) add a,a add a,a xor e and %00111111 xor e ld bc,(107+15)*2-1 add hl,bc ld c,a ld a,(hl) inc l xor (hl) ;Scaler pulls from *_*_**_* and (ix-4) xor (hl) ld e,a ld a,(de) rrca rrca rrca ld e,a and 3 or c out ($11),a ld bc,(107+15)*2-1 add hl,bc ld a,(hl) inc l xor (hl) ;Scaler pulls from *_*_**_* and (ix-3) xor (hl) ld b,d ld c,a ld a,(bc) xor e and $1f xor e ld bc,(107+15)*2-1 add hl,bc pop bc ld e,a _ in a,($10) rla jr c,-_ ld a,e out ($11),a djnz gray2loop1 pop hl pop af inc ixl jr nz,_ ld ixl,-3 _ cp ixl jr z,_ inc l inc hl _ inc l inc hl bit 6,c jp z,gray2loop0 pop ix _ in a,($10) rla jr c,-_ ld a,5 out ($10),a _ in a,($10) rla jr c,-_ ld a,$80 out ($10),a ret safecopy_mono_3_intermediate: ld a,2 out (5),a call safecopy_mono_3 xor a out (5),a ret safecopy_mono_3: ld hl,dithercount dec (hl) ld a,(hl) jr nz,_ ld (hl),4 _ ld d,bufferBase >> 8 ld e,a srl e and 1 add a,bit4LUT0 >> 8 ld c,a ld a,$21 out ($10),a _ push de push af ld b,64 _ ld a,c xor 1 ld c,a ld a,(de) ld l,a ld h,c ld a,(hl) add a,a add a,a add a,a add a,a ld hl,(bufferHeight) add hl,de ld l,(hl) ld h,c add a,(hl) inc de inc de ld l,a _ in a,($10) rla jr c,-_ ld a,l out ($11),a djnz --_ _ in a,($10) rla jr c,-_ pop af inc a out ($10),a ld hl,(bufferHeight) add hl,hl pop de add hl,de ex de,hl cp $2b jr nz,----_ ret safecopy_gray_3_intermediate: bit 0,(hl) ret nz ld a,2 out (5),a exx push hl exx call safecopy_gray_3 exx pop hl exx xor a out (5),a ret safecopy_gray_3: ld hl,dithercount dec (hl) jr nz,_ ld (hl),6 _ ld a,(hl) cp 4 jr c,_ sub 3 _ exx ld h,graydithers >> 8 ld l,a exx ld de,bufferBase ld a,e jr nc,_ ld e,2 _ adc a,bit4LUT0 >> 8 ld c,a ld a,$21 out ($10),a gray3loop0: push de push af ld b,64 gray3loop1: ld a,(de) ld l,a ld h,c ld a,(hl) add a,a add a,a add a,a add a,a ld hl,(bufferHeight) add hl,de ld l,(hl) ld h,c add a,(hl) push af inc e ld a,(de) ld l,a ld h,c ld a,(hl) add a,a add a,a add a,a add a,a ld hl,(bufferHeight) add hl,de ld l,(hl) ld h,c add a,(hl) ld l,a pop af xor l exx and (hl) dec l jr nz,$+4 ld l,3 exx xor l inc de inc e inc de out ($11),a djnz gray3loop1 _ in a,($10) rla jr c,-_ pop af inc a out ($10),a ld hl,(bufferHeight) add hl,hl pop de add hl,de ex de,hl cp $2b jr nz,gray3loop0 ret clear_screen_edges: in a,($10) rla jr c,clear_screen_edges ld a,$80 out ($10),a _ in a,($10) rla jr c,-_ ld a,$20 out ($10),a ld b,64 _ in a,($10) rla jr c,-_ xor a out ($11),a djnz -_ _ in a,($10) rla jr c,-_ ld a,$2B out ($10),a ld b,64 _ in a,($10) rla jr c,-_ xor a out ($11),a djnz -_ ret rastercolumnend: exx pop de dec b exx pop hl pop bc ret z inc l ld a,l and $1f jp nz,rasterloop0 ld a,l sub $20 ld l,a jp rasterloop0 preparewindow: ;Generate the optimized rastering code ld a,(WX_backup) sub (ix-vars+offsetX) cpl ld e,a push af call prepareraster ;Get the drawing mask pop af and 7 ld b,a ld a,$ff jr z,++_ _ add a,a djnz -_ _ cpl exx ld c,a exx ld a,(windowLine) ld l,a ;Put the tile row in B and 7 ld b,a ;Get the pointer to the start of row in DE xor l ld d,$98 >> 2 add a,a rl d add a,a rl d ld e,a ;Add the number of lines displayed to the windowLine counter ld a,(LY) sub (ix-vars+myLY) add a,l ld (windowLine),a ;Clip, or else get the row to display on and return the pointer in DE and rows to draw in C ld a,(screenheight) add a,(ix-vars+offsetY) ld c,a ld a,(myLY) ld h,a sub c ret nc add a,(ix-vars+screenHeight) ld l,a ld a,(LY) cp c jr c,_ ld a,c _ sub h ret z ld c,a ld a,(displayFlags) rra ld a,l exx ld h,bufferBase >> 8 jr nc,_ add a,a jr nc,_ inc h or a _ ld l,a ld de,(bufferHeight) sbc hl,de ;Now get the window X offset (slightly complicated by the fact that the view window can be scrolled) ld b,(ix-vars+screenWidth) ld a,(WX_backup) sub (ix-vars+offsetX) jr c,shift_window ;If the offset is positive, then we just add an offset times the bufferHeight to DE. Also get the display width in B. sub 8 jr c,++_ _ add hl,de dec b ret z sub 8 jr nc,-_ _ ex de,hl exx ret shift_window: ;If the window starts to the left of the screen, we add an offset to the starting tile. ex de,hl cpl rra rra rra and $1F inc a exx add a,e ld e,a jr nc,_ inc d _ scf ret preparetilemap: ;Generate the optimized rastering code ld e,(ix-vars+mySCX) call prepareraster ;Get the drawing mask ld hl,(mySCY) ld a,h and 7 ld b,a ld a,$ff jr z,++_ _ add a,a djnz -_ _ cpl exx ld c,a exx ;Divide X position by 8 srl h srl h srl h ;Add the line number to the Y position ld a,(myLY) add a,l ld l,a ;Put the tile row in B and 7 ld b,a ;Get the tile pointer in DE xor l ld d,$98 >> 2 add a,a rl d add a,a rl d add a,h ld e,a ;Clip, or else get the row to display on and return the pointer in DE and rows to draw in C ld a,(screenheight) add a,(ix-vars+offsetY) ld c,a ld a,(myLY) ld h,a sub c ret nc add a,(ix-vars+screenHeight) ld l,a ld a,(LY) cp c jr c,_ ld a,c _ sub h ret z ld c,a ld a,(displayFlags) rra ld a,l exx ld h,bufferBase >> 8 jr nc,_ add a,a jr nc,_ inc h or a _ ld l,a ld de,(bufferHeight) sbc hl,de ex de,hl exx scf ret ;Input: E = x position of tilemap (for rotation mod) prepareraster: ld a,(BGP_backup) ld l,a bit 1,(ix-vars+displayFlags) jr z,_ rla or l ld l,a _ bit 2,(ix-vars+displayFlags) jr z,_ rla and l ld l,a _ ld h,bit4LUT1 >> 8 ld a,(hl) inc a ld hl,tmpalettes ld b,0 _ ld c,(hl) inc hl dec a jr z,_ add hl,bc jr -_ _ ld a,e push af ld de,rasterloop2 ldir ex de,hl and 7 jr z,++_ bit 2,a jr z,_ or $f8 ld (hl),$0f ;rrca inc hl inc a jr nz,$-4 jr ++_ _ ld b,a ld (hl),$07 ;rlca inc hl djnz $-3 _ ld a,(displayFlags) rra jr nc,no_gray_raster ex de,hl ld hl,rastercodegray ld bc,rastercodegraysize ldir ld hl,(BGP_backup) ld h,bit4LUT0 >> 8 ld a,(hl) inc a ld hl,tmpalettes ld b,0 _ ld c,(hl) inc hl dec a jr z,_ add hl,bc jr -_ _ ldir ex de,hl pop af and 7 jr z,++_ bit 2,a jr z,_ or $f8 ld (hl),$0f ;rrca inc hl inc a jr nz,$-4 jr ++_ _ ld b,a ld (hl),$07 ;rlca inc hl djnz $-3 _ push af no_gray_raster: pop af ex de,hl ld hl,rastercode1 ld bc,rastercode1size ldir ld a,rasterloop2-1 & $ff sub e ld (de),a inc de ;ld hl,rastercode2 ld bc,rastercode2size ldir ret rastercode1: inc l exx ld (de),a xor (hl) and c xor (hl) ld (hl),a inc de inc hl exx .db $10 ;djnz rasterloop2 rastercode1size = $-rastercode1 rastercode2: ld a,e add a,$20 ld l,a ld a,d jr nc,_ inc a xor d and %00000011 xor d _ ld h,a ld b,8 xor a cp c jp nz,rasterloop1 jp rastercolumnend rastercode2size = $-rastercode2 rastercodegray: dec l exx ld (de),a xor (hl) and c xor (hl) ld (hl),a inc e inc l exx rastercodegraysize = $-rastercodegray tmpalettes: #comment .db 1 xor a .db 3 ld a,l or h cpl .db 3 ld a,h cpl and l .db 2 ld a,h cpl .db 3 ld a,l cpl and h .db 2 ld a,l cpl .db 2 ld a,l xor h .db 3 ld a,l and h cpl .db 2 ld a,l and h .db 3 ld a,l xor h cpl .db 1 ld a,l .db 3 ld a,h cpl or l .db 1 ld a,h .db 3 ld a,l cpl or h .db 2 ld a,l or h .db 2 ld a,$FF #endcomment ;#comment .db 2 xor a inc l .db 4 ld a,(hl) inc l or (hl) cpl .db 5 ld a,(hl) inc l cpl or (hl) cpl .db 3 inc l ld a,(hl) cpl .db 4 ld a,(hl) inc l cpl and (hl) .db 3 ld a,(hl) inc l cpl .db 3 ld a,(hl) inc l xor (hl) .db 4 ld a,(hl) inc l and (hl) cpl .db 3 ld a,(hl) inc l and (hl) .db 4 ld a,(hl) inc l xor (hl) cpl .db 2 ld a,(hl) inc l .db 5 ld a,(hl) inc l cpl and (hl) cpl .db 2 inc l ld a,(hl) .db 4 ld a,(hl) inc l cpl or (hl) .db 3 ld a,(hl) inc l or (hl) .db 3 ld a,$ff inc l ;#endcomment draw_sprites: ld a,(sprite_detect) and 2 ret z xor a ld (sprite_detect),a ld hl,$FE9C ld a,(screenHeight) add a,16 ld c,a ld a,(screenWidth) add a,a add a,a add a,a ld b,a jr ++_ draw_next_sprite: pop bc draw_next_sprite_1: pop hl draw_next_sprite_2: ld a,l cp $A0 jr nz,_ pop af _ sub 4 ld l,a ret c _ ld a,(hl) sub (ix-vars+offsetY) cp c jr nc,draw_next_sprite_2 ld d,9 bit 2,(ix-vars+LCDC_backup) jr z,_ ld d,1 _ sub d jr c,draw_next_sprite_2 push hl inc hl ld d,bufferBase >> 8 bit 0,(ix-vars+displayFlags) jr z,_ scf adc a,a jr nc,_ inc d _ ld e,a ld a,(hl) sub (ix-vars+offsetX) jr z,draw_next_sprite_1 cp b jr nc,draw_next_sprite_1 push bc inc hl push hl ld hl,(bufferHeight) ex de,hl sub 8 jr c,++_ _ add hl,de sub 8 jr nc,-_ _ ex de,hl ld c,a exx add a,(rotLUT >> 8) + 8 ld b,a xor 7 inc a and %11110111 ld d,a exx ld a,$FF _ add a,a inc c jr nz,-_ ld iyh,a cpl ld iyl,a pop hl ld a,(hl) exx ld h,tileLUT >> 8 ld l,a ld a,(LCDC_backup) bit 2,a jr z,_ res 0,l _ bit 4,a ld a,(hl) jr nz,_ exx ld a,l exx cp $A0 ld a,(hl) jr c,_ dec h dec h _ inc h ld h,(hl) ld l,a exx inc hl ld a,(LCDC_backup) add a,a and 8 add a,8 ld b,a ld a,$2c ;inc l bit 6,(hl) jr nz,_ ld a,b dec a add a,a exx add a,l ld l,a exx ld a,$2d ;dec l _ ld (sprite_flip_smc),a ld (sprite_flip_smc+1),a bit 7,(hl) jr z,_ ld a,sprite_priority_start & $FF ld (sprite_next_smc),a ld a,sprite_priority_start >> 8 ld (sprite_next_smc+1),a _ bit 5,(hl) jr z,_ exx res 4,b ld d,b set 3,d exx _ bit 4,(hl) ld a,l ld hl,(OBP0) jr z,_ ld hl,(OBP1) _ cp $A0 jr c,_ ld hl,(BGP) _ sub 3 cp (ix-vars+sprite_to_track) jr nz,_ ld a,(sprite_track_count) dec a jr z,_ ld (sprite_track_count),a rra rra jr c,_ ld a,l cpl ld l,a _ bit 1,(ix-vars+displayFlags) jr z,_ ld a,l rla or l ld l,a _ bit 2,(ix-vars+displayFlags) jr z,_ ld a,l rla and l ld l,a _ ld h,bit4LUT1 >> 8 push hl ld a,(hl) ld hl,spritepaletteLUT and $0E add a,l ld l,a jr nc,_ inc h _ ld a,(hl) inc hl ld h,(hl) ld l,a ld (sprite_palette_smc),hl pop hl ld a,(displayFlags) rra jr c,_ ld hl,(bufferHeight) xor a sub l ld l,a sbc a,a sub h ld h,a add hl,de ld a,spriteloop - (sprite_loop_smc + 1) ld (sprite_loop_smc),a jp spriteloop _ dec h ld a,(hl) ld hl,spritepaletteLUT and $0E add a,l ld l,a jr nc,_ inc h _ ld a,(hl) inc hl ld h,(hl) ld l,a ld (sprite_palette_smc_gray),hl ld hl,(bufferHeight) xor a sub l ld l,a sbc a,a sub h ld h,a add hl,de ld a,spriteloop_gray - (sprite_loop_smc + 1) ld (sprite_loop_smc),a jp spriteloop_gray sprite_priority_start: pop hl pop de ld a,e push af push hl ld a,(de) add a,(ix-vars+SCY_backup) or 7 inc a ld c,a inc e ld a,(de) add a,(ix-vars+SCX_backup) or 7 inc a ld b,a ld de,$FEA0 sprite_priority_loop: ld a,c sub (ix-vars+SCY_backup) ld (de),a inc e ld a,b sub (ix-vars+SCX_backup) ld (de),a inc e ld a,c sub 16 ld l,a ld h,$98 >> 2 bit 3,(ix-vars+LCDC_backup) jr z,$+3 inc h add hl,hl add hl,hl ld a,b sub 8 rrca rrca rrca or l ld l,a ld a,(hl) ld (de),a inc e xor a ld (de),a inc e ld a,c sub (ix-vars+SCY_backup) ld (de),a inc e ld a,b sub (ix-vars+SCX_backup) sub 8 ld (de),a inc e ld a,l dec a xor l and %00011111 xor l ld l,a ld a,(hl) ld (de),a inc e xor a ld (de),a inc e ld a,c sub 8 ld c,a bit 2,(ix-vars+LCDC_backup) ld a,$B0 jr z,_ ld a,$B8 _ cp e jr nz,sprite_priority_loop ex de,hl ex (sp),hl push hl ld hl,draw_next_sprite ld (sprite_next_smc),hl jp (hl) spritepalette000: ld c,a ld a,(hl) inc l or (hl) dec l cpl and c ret spritepalette001: or (hl) cpl inc l or (hl) dec l cpl ret spritepalette010: inc l or (hl) dec l cpl or (hl) cpl ret spritepalette011: ld c,a ld a,(hl) inc l or (hl) cpl and c xor (hl) dec l xor (hl) ret spritepalette100: or (hl) inc l or (hl) xor (hl) dec l xor (hl) ret spritepalette101: ld c,a inc l ld a,(hl) dec l cpl and c or (hl) ret spritepalette110: ld c,a ld a,(hl) cpl and c inc l or (hl) dec l ret spritepalette111: or (hl) inc l or (hl) dec l ret spritepaletteLUT: .dw spritepalette000 .dw spritepalette001 .dw spritepalette010 .dw spritepalette011 .dw spritepalette100 .dw spritepalette101 .dw spritepalette110 .dw spritepalette111 set_frameskip: ld b,3+1 rra jr nc,frameskip_set ld b,6+1 rra jr nc,frameskip_set ld b,9+1 rra jr nc,frameskip_set ld a,$F7 out (1),a ex (sp),hl ex (sp),hl in a,(1) ld b,2+1 rra rra jr nc,frameskip_set ld b,5+1 rra jr nc,frameskip_set ld b,8+1 rra jr nc,frameskip_set ld a,$EF out (1),a ex (sp),hl ex (sp),hl in a,(1) ld b,0+1 rra jr nc,frameskip_set inc b ;ld b,1+1 rra jr nc,frameskip_set ld b,4+1 rra jr nc,frameskip_set ld b,7+1 rra ret c frameskip_set: ld a,b ld (frameskip),a ret move_view: ld a,$FF out (1),a ld a,$FB out (1),a ex (sp),hl ex (sp),hl in a,(1) rra jr nc,set_frameskip ld a,$FF out (1),a ld a,$F7 out (1),a ex (sp),hl ex (sp),hl ld a,(decimalSave) ld b,a in a,(1) ld (decimalSave),a bit 2,a jr z,++_ cpl and b rra jr nc,+++_ _ ld a,(sprite_to_track) add a,4 ld (sprite_to_track),a cp $A0 jr z,trackingOff ld h,$FE ld l,a ld a,(hl) dec a cp 144 + 7 jr nc,-_ inc l ld a,(hl) dec a cp 160 + 7 jr nc,-_ ld (ix-vars+sprite_track_count),20 _ ld a,(screenheight) srl a add a,8 ld (trackoffsetY),a ld a,(screenwidth) dec a add a,a add a,a ld (trackoffsetX),a _ ld a,$FF out (1),a ld a,$EF out (1),a ex (sp),hl ex (sp),hl in a,(1) rra jr c,_ trackingOff: ld a,-4 ld (sprite_to_track),a _ ld a,(sprite_to_track) cp -4 jp z,not_tracking ld h,$FE ld l,a ld a,(hl) dec a cp 144 + 7 jr nc,not_tracking inc l ld a,(hl) dec a cp 160 + 7 jr nc,not_tracking ld a,$FF out (1),a ld a,$E3 out (1),a ex (sp),hl ex (sp),hl in a,(1) ld h,a ld a,(trackoffsetY) bit 1,h jr nz,_ sub 2 _ bit 3,h jr nz,_ add a,2 _ ld (trackoffsetY),a ld a,$FF out (1),a ld a,$FB out (1),a ex (sp),hl ex (sp),hl in a,(1) cpl and %00001110 jr z,_ ld a,(trackoffsetX) sub 2 ld (trackoffsetX),a _ ld a,$FF out (1),a ld a,$EF out (1),a ex (sp),hl ex (sp),hl in a,(1) cpl and %00001110 jr z,_ ld a,(trackoffsetX) add a,2 ld (trackoffsetX),a _ ld hl,(sprite_to_track) ld h,$FE ld a,(hl) ld b,(ix-vars+trackoffsetY) sub b bit 7,b jr nz,_ jr nc,_ xor a _ ld (offsetYFake),a inc l ld a,(hl) ld b,(ix-vars+trackoffsetX) sub b bit 7,b jr nz,_ jr nc,_ xor a _ ld (offsetXFake),a jp bound_view not_tracking: ld b,1 ld a,$FF out (1),a ld a,$E3 out (1),a ex (sp),hl ex (sp),hl in a,(1) ld h,a bit 1,h call z,move_view_down bit 3,h call z,move_view_up ld a,$FF out (1),a ld a,$FB out (1),a ex (sp),hl ex (sp),hl in a,(1) cpl and %00001110 call nz,move_view_right ld a,$FF out (1),a ld a,$EF out (1),a ex (sp),hl ex (sp),hl in a,(1) cpl and %00001110 call nz,move_view_left ret move_view_up: ld a,(offsetYFake) sub b jr nc,_ xor a _ ld (offsetYFake),a ret move_view_left: ld a,(offsetXFake) sub b jr nc,_ xor a _ ld (offsetXFake),a ret move_view_down: ld a,144 sub (ix-vars+screenheight) ld c,a ld a,(offsetYFake) add a,b cp c jr c,_ ld a,c _ ld (offsetYFake),a ret move_view_right: ld a,(screenwidth) add a,a add a,a add a,a cpl add a,169 ld c,a ld a,(offsetXFake) add a,b cp c jr c,_ ld a,c _ ld (offsetXFake),a ret bound_view: ld a,(displayFlagsFake) rlca rlca rlca and 6 ld hl,view_bounds add a,l ld l,a jr nc,$+3 inc h ;ld a,(screenwidth) ;add a,a ;add a,a ;add a,a ;cpl ;add a,169 ld a,(hl) cp (ix-vars+offsetXFake) jr nc,_ ld (offsetXFake),a _ ;ld a,144 ;sub (ix-vars+screenheight) inc hl ld a,(hl) cp (ix-vars+offsetYFake) ret nc ld (offsetYFake),a ret view_bounds: .db 160 - 96, 144 - 64 .db 160 - 128, 144 - 86 .db 160 - 160, 144 - 107 .db 160 - 160, 144 - 128 getAllMyKeys: call set_zoom call move_view ld hl,$FFFF ld a,l out (1),a ;Get arrow keys dec a out (1),a ex (sp),hl ex (sp),hl in a,(1) rra jr c,$+4 res 3,l rra jr c,$+4 res 1,l rra jr c,$+11 bit 1,l jr nz,$+6 set 1,l jr $+3 dec l rra jr c,$+12 bit 3,l jr nz,$+6 set 3,l jr $+4 res 2,l ;Get A,B,SELECT,START ;Aka 2ND,ALPHA,XT0n,MODE ld a,$BF out (1),a ex (sp),hl ex (sp),hl in a,(1) rla rla ;START/MODE jr c,$+4 res 3,h rla ;A/2ND jr c,$+4 res 0,h ld a,$FF out (1),a ld a,$EF out (1),a ex (sp),hl ex (sp),hl in a,(1) rla ;SELECT/XT0n jr c,$+4 res 2,h ld a,$FF out (1),a ld a,$DF out (1),a ex (sp),hl ex (sp),hl in a,(1) ;B/ALPHA rla jr c,$+4 res 1,h ld (keys),hl ld a,$FF out (1),a ld a,$F7 out (1),a ex (sp),hl ex (sp),hl in a,(1) rla jp nc,toggleSound ret set_zoom: ld a,$FF out (1),a ld a,$FD out (1),a ex (sp),hl ex (sp),hl in a,(1) ld b,(ix-vars+keySave) ld (keySave),a cpl and b ld b,a ld hl,mycontrast ld a,(hl) bit 3,(ix-vars+keySave) jr nz,_ inc a ret z ld (hl),a out ($10),a ret _ bit 4,(ix-vars+keysave) jr nz,_ dec a cp $D8 ret c ld (hl),a out ($10),a ret _ push bc bit 6,b call nz,go_sleep pop bc ; bit 5,b ; jr z,_ ; ld a,(gpu_delay_smc) ; xor 5^2 ; ld (gpu_delay_smc),a ;_ ld hl,displayFlagsFake ld a,(hl) bit 1,b jr z,_ sub %01000000 ret c ld (hl),a rlca rlca rlca and 6 ld hl,trackzoomoffsets add a,l ld l,a jr nc,$+3 inc h ld a,(trackoffsetX) sub (hl) ld (trackoffsetX),a ld a,(offsetXFake) add a,(hl) ld (offsetXFake),a inc hl ld a,(trackoffsetY) sub (hl) ld (trackoffsetY),a ld a,(offsetYFake) add a,(hl) ld (offsetYFake),a jp bound_view _ bit 2,b jr z,_ add a,%01000000 ret c ld (hl),a rlca rlca rlca and 6 ld hl,trackzoomoffsets-2 add a,l ld l,a jr nc,$+3 inc h ld a,(trackoffsetX) add a,(hl) ld (trackoffsetX),a ld a,(offsetXFake) sub (hl) jr nc,$+3 xor a ld (offsetXFake),a inc hl ld a,(trackoffsetY) add a,(hl) ld (trackoffsetY),a ld a,(offsetYFake) sub (hl) jr nc,$+3 xor a ld (offsetYFake),a jp bound_view _ ld a,$FF out (1),a ld a,$BF out (1),a ex (sp),hl ex (sp),hl in a,(1) rra jr c,_ ld a,(hl) and %11111000 inc a ld (hl),a ret _ rra jr c,_ ld a,(hl) and %11111000 or %00000010 ld (hl),a ret _ rra jr c,_ ld a,(hl) and %11111000 ld (hl),a ret _ rra ret c ld a,(hl) and %11111000 or %00000100 ld (hl),a ret trackzoomoffsets: .db (128-96)/2, (86-64)/2 .db (160-128)/2, (107-86)/2 .db (160-160)/2, (128-107)/2 ;Input: B=(displayFlags) update_zoom_vars: ld a,2 out (5),a dec a out ($10),a ld (ditherCount),a ld a,b rlca rlca and 7 ld b,a jr nz,_ ;Zoom 0 mono ld hl,13*256 + 64 ld (screenHeight),hl ld hl,64 + 15 ld (bufferHeight),hl ld hl,safecopy_mono_0 ld (screenCopy+1),hl ld hl,safecopy_mono_0_intermediate ld (intermediateFrame+1),hl ret _ djnz _ ;Zoom 1 mono ld hl,17*256 + 86 ld (screenHeight),hl ld hl,86 + 15 ld (bufferHeight),hl ld hl,safecopy_mono_1 ld (screenCopy+1),hl ld hl,safecopy_mono_1_intermediate ld (intermediateFrame+1),hl in a,($10) rla jr c,$-3 xor a out ($10),a ret _ djnz _ ;Zoom 2 mono ld hl,21*256 + 107 ld (screenHeight),hl ld hl,107 + 15 ld (bufferHeight),hl ld hl,safecopy_mono_2 ld (screenCopy+1),hl ld hl,safecopy_mono_2_intermediate ld (intermediateFrame+1),hl ret _ djnz _ ;Zoom 3 mono ld hl,21*256 + 128 ld (screenHeight),hl ld hl,128 + 15 ld (bufferHeight),hl ld hl,safecopy_mono_3 ld (screenCopy+1),hl ld hl,safecopy_mono_3_intermediate ld (intermediateFrame+1),hl jp clear_screen_edges _ djnz _ ;Zoom 0 gray ld hl,13*256 + 64 ld (screenHeight),hl ld hl,(64 + 15) * 2 ld (bufferHeight),hl ld hl,safecopy_gray_0 ld (screenCopy+1),hl ld hl,safecopy_gray_0_intermediate ld (intermediateFrame+1),hl ret _ djnz _ ;Zoom 1 gray ld hl,17*256 + 86 ld (screenHeight),hl ld hl,(86 + 15) * 2 ld (bufferHeight),hl ld hl,safecopy_gray_1 ld (screenCopy+1),hl ld hl,safecopy_gray_1_intermediate ld (intermediateFrame+1),hl in a,($10) rla jr c,$-3 xor a out ($10),a ret _ djnz _ ;Zoom 2 gray ld hl,21*256 + 107 ld (screenHeight),hl ld hl,(107 + 15) * 2 ld (bufferHeight),hl ld hl,safecopy_gray_2 ld (screenCopy+1),hl ld hl,safecopy_gray_2_intermediate ld (intermediateFrame+1),hl ret _ ;Zoom 3 gray ld hl,21*256 + 128 ld (screenHeight),hl ld hl,(128 + 15)*2 ld (bufferHeight),hl ld hl,safecopy_gray_3 ld (screenCopy+1),hl ld hl,safecopy_gray_3_intermediate ld (intermediateFrame+1),hl jp clear_screen_edges