//setup subroutine call stack 254 rh 0 rl 0 rh,rl //vga setup ::xoff_high rh :xoff_high rl 0b00000011 a a io2 3 a rh,rl ::xoff_low rh :xoff_low rl 0b11011001 a a io2 2 a rh,rl ::yoff_high rh :yoff_high rl 0 a a io2 5 a rh,rl ::yoff_low rh :yoff_low rl 0 a a io2 4 a rh,rl branch :cls_skip 1 //clear screen buffer ::y_low rh :y_low rl 0 rh,rl 0 a a io2 1 .cls_loop 0 a a io2 0 1 a 1 b .cls_loop_sub 0 io 0 io 0 io 0 io 0 io 0 io 0 io 0 io 0 io 0 io 0 io 0 io 0 io 0 io 0 io 0 flags add a branch :cls_loop_sub a>b ::y_low rh rh,:y_low a 15 b 0 flags add a a rh,:y_low 127 b and io2 1 128 b branch :cls_loop ab b rh,:temp a branch :gamepad_right_skip or ::x_speed rh :x_speed rl 8 rh,rl .gamepad_right_skip //LEFT io a 0 0b00000010 b and a branch :gamepad_left a=b branch :gamepad_left_skip 1 .gamepad_left ::gamepad_has_rl rh :gamepad_has_rl rl 1 rh,rl ::x_speed rh rh,:x_speed a 255 b 0 flags add a a rh,:x_speed 9 b ::temp rh ab b rh,:temp a branch :gamepad_left_skip or ::x_speed rh :x_speed rl 0b11111000 rh,rl .gamepad_left_skip //if neither ::gamepad_has_rl rh branch :rl_skip rh,:gamepad_has_rl ::x_speed rh rh,:x_speed a 0 b branch :rl_skip a=b 9 b branch :rl_lower ab b rh,:temp a branch :ud_skip or :y_speed rl 8 rh,rl .ud_skip ::collide_last rh :collide_last rl 0 rh,rl //--- .skip_gamepad 0 a //--- ::x_high rh rh,:x_high a ::x_high_old rh a rh,:x_high_old ::x_low rh rh,:x_low a ::x_low_old rh a rh,:x_low_old //update x ::x_speed rh rh,:x_speed b ::x_low rh rh,:x_low a 0 flags add rh,:x_low bsr b bsr b bsr b bsr b bsr b bsr b ::x_high rh rh,:x_high a add rh,:x_high //check collision call :collide_check 255 rh branch :x_collide rh,0 //update xoff ::x_speed rh rh,:x_speed b ::xoff_low rh rh,:xoff_low a 0 flags add rh,:xoff_low bsr b bsr b bsr b bsr b bsr b bsr b ::xoff_high rh rh,:xoff_high a add rh,:xoff_high branch :x_done 1 .x_collide ::x_high_old rh rh,:x_high_old a ::x_high rh a rh,:x_high ::x_low_old rh rh,:x_low_old a ::x_low rh a rh,:x_low ::x_speed rh :x_speed rl 0 rh,rl .x_done ::y_high rh rh,:y_high a ::y_high_old rh a rh,:y_high_old ::y_low rh rh,:y_low a ::y_low_old rh a rh,:y_low_old //update y ::y_speed rh rh,:y_speed b ::y_low rh rh,:y_low a 0 flags add rh,:y_low bsr b bsr b bsr b bsr b bsr b bsr b ::y_high rh rh,:y_high a add rh,:y_high //check collision call :collide_check 255 rh branch :y_collide rh,0 //update yoff ::y_speed rh rh,:y_speed b ::yoff_low rh rh,:yoff_low a 0 flags add rh,:yoff_low bsr b bsr b bsr b bsr b bsr b bsr b ::yoff_high rh rh,:yoff_high a add rh,:yoff_high branch :y_done 1 .y_collide ::y_high_old rh rh,:y_high_old a ::y_high rh a rh,:y_high ::y_low_old rh rh,:y_low_old a ::y_low rh a rh,:y_low //collide_last (for jumping) ::y_speed rh rh,:y_speed a 0b10000000 b branch :y_was_not_falling a>b ::collide_last rh :collide_last rl 1 rh,rl .y_was_not_falling ::y_speed rh :y_speed rl 0 rh,rl .y_done //pre-calculate some stuff //x char ::x_low rh rh,:x_low b bsr b bsr b bsr b ::calc_x_char rh b rh,:calc_x_char ::x_high rh rh,:x_high a a b 0 flags add a a b 0 flags add a a b 0 flags add a a b 0 flags add a a b 0 flags add a 0b01100000 b and a ::calc_x_char rh rh,:calc_x_char b or rh,:calc_x_char //y char ::y_low rh rh,:y_low b bsr b bsr b bsr b ::calc_y_char rh b rh,:calc_y_char ::y_high rh rh,:y_high a a b 0 flags add a a b 0 flags add a a b 0 flags add a a b 0 flags add a a b 0 flags add a 0b01100000 b and a ::calc_y_char rh rh,:calc_y_char b or rh,:calc_y_char //x char (old) ::x_low_old rh rh,:x_low_old b bsr b bsr b bsr b ::calc_x_char_old rh b rh,:calc_x_char_old ::x_high_old rh rh,:x_high_old a a b 0 flags add a a b 0 flags add a a b 0 flags add a a b 0 flags add a a b 0 flags add a 0b01100000 b and a ::calc_x_char_old rh rh,:calc_x_char_old b or rh,:calc_x_char_old //y char (old) ::y_low_old rh rh,:y_low_old b bsr b bsr b bsr b ::calc_y_char_old rh b rh,:calc_y_char_old ::y_high_old rh rh,:y_high_old a a b 0 flags add a a b 0 flags add a a b 0 flags add a a b 0 flags add a a b 0 flags add a 0b01100000 b and a ::calc_y_char_old rh rh,:calc_y_char_old b or rh,:calc_y_char_old //wait for vblank .vblank_loop io a 1 0b00000001 b and a branch :vblank_loop ab .cc_skip_ylow branch :cc_end 1 .cc_end_collide 255 rh 0 rl 1 rh,rl .cc_end ret @section bss .xoff_high dw 0 .xoff_low dw 0 .yoff_high dw 0 .yoff_low dw 0 .x_high dw 0 .x_low dw 0 .y_high dw 0 .y_low dw 0 .x_high_old dw 0 .x_low_old dw 0 .y_high_old dw 0 .y_low_old dw 0 .x_speed dw 0 .y_speed dw 0 .calc_x_char dw 0 .calc_y_char dw 0 .calc_x_char_old dw 0 .calc_y_char_old dw 0 .gamepad_has_rl dw 0 .gamepad_has_ud dw 0 .temp dw 0 .collide_last dw 0 .frame_count dw 0