.nolist #include "tse.inc" .list .org saferam1-3 .db $BB,$6D ret ; Task block details flags_base .equ 89F0h flags_size .equ 60 sp_size .equ 2 task_sp .equ 0 task_flags .equ task_sp + sp_size task_end .equ task_flags + flags_size ; Block size maxblocksize .equ 100h start: jr startkrnl jp verinfo ; Library function 0, Get version/functions supported jp chkprog ; Library function 1, Check program jp exitshell ; Library function 2, Exit from shell jp taskswitch ; Library function 3, Switch task jp starttask ; Library function 4, Start task jp endtask ; Library function 5, End task jp forceyield ; Library function 6, Force yield verinfo ld hl, %0000000001111111 majorver .equ 1 minorver .equ 6 ld bc, (majorver*256)+minorver ret startkrnl: ; Disable run indicator bcall(_runIndicOff) ; Preserve flags ld bc, flags_size ld hl, flags_base ld de, sysflags ldir ; Set active program ld hl, shellprog ld de, cprogram bcall(_mov9b) ; Look up the shell in the symbol table ld hl, cprogram rst 20h ;rMOV9TOOP1 call starttask cp 0 ret nz ; Check to see if enough free RAM for block copy buffer call chkEnoughForBuffer ; Preserve stack ld (sysstack), sp ; Exec jp taskenter exitshell: ; Restore stack ld hl, (sysstack) ld sp, hl ; Copy out of active memory call cpy_prgm_out ; End task ld hl, shellprog rst 20h ;rMOV9TOOP1 call endtask ; Clear screen bcall(_clrScrnFull) ; Display exit message ld hl, 0 ld (currow), hl ld hl, msg bcall(_puts) ; Disable ON flag res onInterrupt, (iy+onFlags) ret ; Force the program to yield ; ; Inputs - ; None ; ; Returns - ; Nothing ; forceyield: ld hl, shellprog rst 20h ;rMOV9TOOP1 call taskswitch ret ; Load a program into active memory and run it ; ; Inputs - ; OP1 should contain a program variable ; ; Returns - ; Nothing ; taskswitch: ; Preserve sp ld (tempword), sp ld hl, (pptr_preserve) push hl ld de, (tempword) ld (hl), e inc hl ld (hl), d ; Preserve var ld hl, op1 ld de, tprogram bcall(_mov9b) ; Preserve flags pop hl inc hl inc hl ex de, hl ld bc, flags_size ld hl, flags_base ldir ; Display message ld hl, 0 ld (currow), hl set textInverse, (iy+textflags) ld hl, plswait bcall(_puts) ; Borrow system stack ld hl, (sysstack) ld sp, hl ; Check to see if enough RAM for block copy buffer call chkEnoughForBuffer ; Copy current program out of memory call cpy_prgm_out ; Copy program name to cprogram ld hl, tprogram ld de, cprogram bcall(_mov9b) taskenter: ; Check to see if enough RAM for block copy buffer call chkEnoughForBuffer ; Load new program in call cpy_prgm_in ; Restore flags ld hl, (pptr_preserve) inc hl inc hl ld bc, flags_size ld de, flags_base ldir ; Restore sp ld hl, (pptr_preserve) bcall(_ldHLind) ld sp, hl ; Exec program ret ; Remove a task block from the end of a program variable and update its ; status. ; ; Inputs - ; OP1 should contain a program variable ; ; Returns - ; A will equal 0 on sucess otherwise it's an error code endtask: ; Find the program and set PTR_'s call chkprog cp 0 ret nz ; Check to see if task block doesn't exist ld hl, (fptr_prgtitle) ld a, (hl) cp ' ' ld a, 4 ; Load error code 4 - Task block doesn't exist ret z ; Calculate task block size ld hl, (fptr_memreq) bcall(_ldHLind) ex de, hl ld hl, task_end add hl, de push hl push hl ; Find start of task block ex de, hl ld hl, (fptr_end) or a sbc hl, de ; Delete task block pop de bcall(_delmem) ; Update variable size field ld hl, (fptr_varsize) bcall(_ldHLind) pop bc or a sbc hl, bc ex de, hl ld hl, (fptr_varsize) ld (hl), e inc hl ld (hl), d ; Modify status byte and return ld hl, (fptr_prgtitle) ld a, ' ' ld (hl), a ; Success xor a ret ; Add a task block onto the end of a program variable and update its ; status. ; ; Inputs - ; OP1 should contain a program variable ; ; Returns - ; A will equal 0 on sucess otherwise it's an error code starttask: ; Find the program and set PTR_'s call chkprog cp 0 ret nz ; Check to see if task block already exists ld hl, (fptr_prgtitle) ld a, (hl) cp '*' ld a, 4 ; Load error code 4 - Task block already exists ret z ; Check available memory ld hl, (fptr_memreq) bcall(_ldHLind) ld bc, task_end add hl, bc push hl push hl bcall(_enoughmem) ld a, 5 ; Load error code 5 - Insufficient memory ret c ; Insert memory ld de, (fptr_end) pop hl bcall(_insertmem) ; Update variable size field ld hl, (fptr_varsize) bcall(_ldHLind) pop bc add hl, bc ex de, hl ld hl, (fptr_varsize) ld (hl), e inc hl ld (hl), d ; Get address of taskblock ld hl, (fptr_memreq) bcall(_ldHLind) ld bc, (fptr_end) add hl, bc push hl push hl push hl ; Set start address ld de, userMem + 4 ld hl, (fptr_prgtitle) findcodeaddr: ld a, (hl) cp 0 inc hl inc de jr nz, findcodeaddr inc de inc de pop hl dec hl ld (hl), d dec hl ld (hl), e ; Set sp ld hl, (fptr_varsize) bcall(_ldHLind) ld bc, userMem - (3 + task_end + 2) add hl, bc ex de, hl pop hl ld (hl), e inc hl ld (hl), d ; Save flags into taskblock pop hl inc hl inc hl ex de, hl ld bc, flags_size ld hl, sysflags ldir ; Update status bytes ld hl, (fptr_prgtitle) ld a, '*' ld (hl), a ; Success xor a ret ; Locate a TSE program in memory and set pointers. ; ; Inputs - ; OP1 should contain a program variable ; ; Returns - ; A will equal 0 on sucess otherwise it's an error code ; HL points to prgtitle ; (fptr_varsize), (fptr_code) and (fptr_end) set point to program ; chkprog: ; Check to see if variable exists bcall(_ChkFindSym) ex de, hl ld a, 1 ; Load error code 1 - Variable does not exist ret c ; Return if error ; Check to see if variable is in RAM ld a, b cp 0 ;OLD: ld a, 2 ; Load error code 2 - Variable is stored in FLASH-ROM ;OLD: ret nz ; Return if error jr z, notFlash ld de, saferam5 ld bc, 256 bcall(_FlashToRam) ld hl, saferam5 + 9 ld c, (hl) ld b, 0 inc bc add hl, bc call notFlash cp 0 ret nz ld a, 2 ; Load error code 2 - Variable is stored in FLASH-ROM ret notFlash: ; Get pointer to "variable size field" ld (fptr_varsize), hl ; Get pointer to "end of variable" push hl bcall(_ldHLind) ld de, (fptr_varsize) inc de inc de add hl, de ld (fptr_end), hl pop hl ; Check that the TSE header is valid ld b, 4 ld de, 5 add hl, de ld de, tsevalid cmpStr: ld a, (de) ld c, (hl) cp c ; Compare strings ld a, 3 ; Load error code 3 - Not a valid TSE program ret nz ; Return if error inc hl ; Next byte of header inc de ; Next byte of tsevalid djnz cmpStr ; Get pointer to "program title" ld (fptr_prgtitle), hl ; Get pointer to "mem required" call skipstr ld (fptr_memreq), hl ; Load HL with program title ld hl, (fptr_prgtitle) ; All done xor a ; Load error code 0 - Sucess ret ; Moves the active program into a variable ; ; Inputs - ; (cprogram) should contain the name of the program to load in ; ; Returns - ; Program is moved into variable ; cpy_prgm_out: ; Load prgm name into OP1 ld hl, cprogram rst 20h ;rMOV9TOOP1 ; Get src ld hl, userMem ld (cpysrc), hl ; Clear tempword ld hl, 5 ld (tempword), hl ; Get program size ld hl, (progsize) ld (bytes2go), hl ; Update size field of var push hl bcall(_chkfindsym) ex de, hl pop de inc de inc de inc de ld (hl), e inc hl ld (hl), d cpyout_loop: ; Get copy block size call calcblock ; Calculate cpydest bcall(_chkfindsym) ex de, hl ld bc, (tempword) add hl, bc ex de, hl ; Increase size of dest ld hl, (blocksize) bcall(_insertmem) ; Copy data ld hl, (cpysrc) ld bc, (blocksize) ldir ; Increase tempword ld hl, (tempword) ld bc, (blocksize) add hl, bc ld (tempword), hl ; Decrease size of src ld hl, (cpysrc) ld de, (blocksize) bcall(_delmem) ; Loop if not finished ld hl, (bytes2go) xor a cp h jr nz, cpyout_loop cp l jr nz, cpyout_loop ret ; Moves the selected variable into the active program ; ; Inputs - ; (cprogram) should contain the name of the program to load in ; ; Returns - ; Program is moved into variable ; cpy_prgm_in: ; Load prgm name into OP1 ld hl, cprogram rst 20h ;rMOV9TOOP1 ; Get program size bcall(_chkfindsym) ex de, hl push hl bcall(_ldhlind) dec hl dec hl dec hl ld (bytes2go), hl ld (progsize), hl ; Update size field of var pop hl ld de, 3 ld (hl), e inc hl ld (hl), d ; Get dest ld hl, userMem ld (cpydest), hl cpyin_loop: ; Get copy block size call calcblock ; Increase size of dest ld hl, (blocksize) ld de, (cpydest) bcall(_insertmem) ; Calculate cpysrc bcall(_chkfindsym) ex de, hl ld bc, 5 add hl, bc push hl ; Copy data ld bc, (blocksize) ld de, (cpydest) ldir ld (cpydest), de ; Decrease size of src pop hl ld de, (blocksize) bcall(_delmem) ; Loop if not finished ld hl, (bytes2go) xor a cp h jr nz, cpyin_loop cp l jr nz, cpyin_loop ; Set pptr_code ld hl, userMem + 4 call skipstr inc hl inc hl ld (pptr_code), hl ; Set pptr_preserve ld hl, (progsize) ld bc, userMem - task_end add hl, bc ld (pptr_preserve), hl ret ; Copy block size calulating routine ; calcblock: ld bc, maxblocksize smaller: dec bc ld hl, (bytes2go) or a sbc hl, bc jr c, smaller ld (bytes2go), hl ld (blocksize), bc ret ; Skip string routine ; skipstr: ld a, (hl) cp 0 inc hl jr nz, skipstr ret ; Check to see if enough free RAM for block copy buffer chkEnoughForBuffer: ld hl, maxblocksize bcall(_EnoughMem) ret nc pop hl ; Get return address off stack ret ; Please Wait ; plswait: .db "",0 ; Exit Message ; msg: .db "TSE v1.6",0 ; The 4 byte TSE header for use by the validation code ; tsevalid: .db "TSE", 1 ; Name of program to load as shell ; shellprog: .db ProtProgObj, "UTOPIA",0,0 ; Memory equates ; data: ; Memory equates (Temporary) bytes2go .equ saferam2 + 400 blocksize .equ bytes2go + 2 cpysrc .equ blocksize + 2 cpydest .equ cpysrc + 2 tempword .equ cpydest + 2 tprogram .equ tempword + 2 .end .nolist #ifdef VTI .echo "\nAssembling VTI version\n\n" #else .echo "\nAssembling Real version\n\n" #endif #include "csx.inc" .list #ifdef VTI #define VERSION "CSX 0.27 beta - VTI" #define MODEL "TI-83 Plus" #define DATE "08-27-2004" #define AUTHOR "Sean McLaughlin" #define ORG "United-TI" #define CONT1 "sigma_zk@yahoo.com" #define CONT2 "www.unitedti.org" #else #define VERSION "CSX 0.27 beta" #define MODEL "TI-83 Plus" #define DATE "08-27-2004" #define AUTHOR "Sean McLaughlin" #define ORG "United-TI" #define CONT1 "sigma_zk@yahoo.com" #define CONT2 "www.unitedti.org" #endif LIBS = 54 .module _page00 ; RST 00 - Reset .org $0000 jp init zp.deref_hl_alt: .export zp.deref_hl_alt ld e, (hl) inc hl ld d, (hl) inc hl ret ; RST 08 - Load HL indirect #if $ > $0008 !!! .echo "OH NOES!!!111\n\n" #endif .org $0008 push af ld a, (hl) inc hl ld h, (hl) ld l, a pop af ret ; RST 10 - Compare HL and DE (destroys A) #if $ > $0010 !!! .echo "OH NOES!!!111\n\n" #endif .org $0010 ld a, h cp d ret nz ld a, l cp e ret zp.call_ix: .export zp.call_ix jp (ix) ; RST 18 - Read keypad port #if $ > $0018 !!! .echo "OH NOES!!!111\n\n" #endif .org $0018 out (key_port), a inc hl dec hl in a, (key_port) ret zp.call_hl .export zp.call_hl jp (hl) ; RST 20 - Add accumulator to HL #if $ > $0020 !!! .echo "OH NOES!!!111\n\n" #endif .org $0020 add a, l ld l, a adc a, h sub l ld h, a ret zp.call_iy: .export zp.call_iy jp (iy) ; RST 28 - Invoke user-defined SWI #if $ > $0028 !!! .echo "OH NOES!!!111\n\n" #endif .org $0028 push hl ld hl, (psp.restart) ex (sp), hl ret ; RST 30 - Off-page call (dead weight) #if $ > $0030 !!! .echo "OH NOES!!!111\n\n" #endif .org $0030 push hl ; for ROM page push hl ; for return push hl push de push af jp os_func_cont ; RST 38 - ISR #if $ > $0038 !!! .echo "OH NOES!!!111\n\n" #endif .org $0038 ex af, af' exx ld hl, os.status_flags in a, (irq_stat_port) and $08 jp nz, isr.on_raised jp isr.continue ; Boot code comes here #if $ > $0053 !!! .echo "OH NOES!!!111\n\n" #endif .org $0053 jp init ; Validated OS .dw $A55A ; Non-destructive compare of HL and DE zp.cmp_hlde_nd: .export zp.cmp_hlde_nd push hl or a sbc hl, de pop hl ret ; Non-destructive compare of HL and BC zp.cmp_hlbc_nd: .export zp.cmp_hlbc_nd push hl or a sbc hl, bc pop hl ret ; Version number string #if $ > $0064 !!! .echo "OH NOES!!!111\n\n" #endif os.version: .db VERSION, 0 .db MODEL, 0 ; Compare HL and BC (destroys A) zp.cmp_hlbc: .export zp.cmp_hlbc ld a, h cp b ret nz ld a, l cp c ret ; Continuation of RST 30 os_func_cont: ld hl, 11 ; get return address add hl, sp ld e, (hl) dec hl ld d, (hl) in a, (flash_pageA_port) ; save the ROM page dec hl dec hl ld (hl), a dec hl ; set return address ld (hl), os_func_exit & $FF dec hl ld (hl), os_func_exit >> 8 ex de, hl ; get vector address ld a, (hl) inc hl ld h, (hl) ld l, a ld a, 1 out (flash_pageA_port), a ld a, (hl) ; get routine page inc hl ld d, (hl) ; get routine address inc hl ld h, (hl) ld l, d out (flash_pageA_port), a ; restore inputs and transfer pop af pop de ex (sp), hl ret os_func_exit: ex (sp), hl ; restore ROM page push af ld a, h out (flash_pageA_port), a pop af pop hl ex (sp), hl ; advance return by 2 inc hl inc hl ex (sp), hl ret ; Continuation of RST 38 isr.continue: ; ON key has been pressed bit calc_on, (hl) jr nz, isr.power_on set calc_on, (hl) pop af ld hl, APS_TIME ld (os.aps_timer), hl lcd_busy ld a, $03 out (lcd_cmd_port), a lcd_busy ld a, $18 out (lcd_cmd_port), a isr.wait_on: in a, (irq_stat_port) and $08 jr z, isr.wait_on isr.on_raised: ; Look for timer interrupt in a, (irq_stat_port) and $02 jr z, isr.timer_end bit calc_on, (hl) jr z, isr.timer_end bit aps_on, (hl) jr z, isr.timer_end ld hl, (os.aps_timer) dec hl ld a, h or l ld (os.aps_timer), hl call z, isr.force_off isr.timer_end: ld a, (os.status_flags) and bitmask(prgm_running) jr z, isr.end ld hl, (psp.interrupt) ld a, (hl) cp $C7 inc hl call z, zp.call_hl isr.end: xor a out (irq_mask_port), a ld a, $0B out (irq_mask_port), a exx ex af, af' ei ret isr.power_on: ld a, kg_func rowread cp invmask(kb_2nd) jr nz, isr.2nd_raised res calc_on, (hl) ld hl, isr.shut_down push hl jr isr.wait_on isr.force_off: ld hl, os.status_flags res calc_on, (hl) isr.shut_down: di push af lcd_busy ld a, $02 out (lcd_cmd_port), a pop af isr.off_loop: push af ld a, $36 out (irq_stat_port), a ld a, $01 out (irq_mask_port), a pop af ei halt jr isr.off_loop isr.2nd_raised: ld hl, os.contrast ld a, kg_arrows rowread bit kb_up, a jr nz, isr.up_raised isr.wait_up: ld a, kg_arrows rowread bit kb_up, a jr z, isr.wait_up ld a, (hl) inc a jr z, isr.contrast_max out (lcd_cmd_port), a ld (hl), a isr.contrast_max: ld a, sk_up ld (os.prev_key), a jr isr.end isr.up_raised: bit kb_down, a jr nz, isr.end isr.wait_down: ld a, kg_arrows rowread bit kb_down, a jr z, isr.wait_down ld a, (hl) cp $C0 jr z, isr.contrast_min dec a out (lcd_cmd_port), a ld (hl), a isr.contrast_min: ld a, sk_down ld (os.prev_key), a jr isr.end init: di im 1 in a, (hw_port) or a and $80 jp nz, init.basic ; Silver edition ld a, $81 out ($07), a dec a out ($08), a xor a out ($08), a out ($05), a out ($20), a out ($30), a out ($33), a out ($36), a ld a, $14 out ($29), a init.basic: ; BE and SE xor a out (link_port), a ld a, $01 out (irq_mask_port), a ld a, $76 out (irq_stat_port), a ld a, $41 out ($07), a ld sp, $0000 ld hl, init.lcd_out ld b, 5 init.lcd_loop: lcd_busy ld a, (hl) inc hl out (lcd_cmd_port), a djnz init.lcd_loop ld hl, $8000 ld de, $8001 ld bc, $8000 ld (hl), 0 ldir ld a, $F0 ld (os.contrast), a ld a, bitmask(calc_on) | bitmask(aps_on) ld (os.status_flags), a ld hl, APS_TIME ld (os.aps_timer), hl ld hl, user_ram ld (os.free_mem_ptr), hl ld hl, $0000 ld (os.temp_num), hl in a, (irq_stat_port) and $08 jr nz, $-4 call isr.force_off call zp.cclear call zp.credraw call zp.vbufdisp ld hl, init.str_clear call zp.cputs call zp.cdisp jp init.all_good init.lcd_out .db $18, $01, $F0, $40, $05 init.str_clear .db "Mem Cleared", 0 #include "libsrc\\string\\tokenize.z80" .echo "\n" init.all_good: ei zp.CONSOLE: .export zp.CONSOLE ld hl, zp.CONSOLE push hl ld hl, os.arg_ptrs ld de, os.arg_ptrs + 1 ld (hl), 0 ld bc, 127 ldir call zp.cgets ld hl, os.buffer ld d, h ld e, l ld ix, os.arg_ptrs call zp.tokenize ld a, c ld (os.arg_count), a ld hl, (arg(0)) call zp.strupr call zp.strlen ld b, c xor a Hash: add a, (hl) inc hl djnz Hash and 15 ; A = HASH(x) ld hl, hash_table add a, a offset_hl deref_hl ld a, (hl) ; # of strings or a jp z, err_syntax ld b, a inc hl ld de, (arg(0)) Find_String: call zp.strcmp jr z, _Found_String call zp.strnext inc hl inc hl djnz Find_String jp err_syntax _Found_String: call zp.strnext deref_hl ; HL = address ld (os.estack), sp jp (hl) err_syntax: ld hl, str_esyntax1 ld de, os.scrap call zp.strcpy ld hl, os.scrap ld de, (arg(0)) call zp.strcat ld hl, os.scrap ld de, str_esyntax2 call zp.strcat ld hl, os.scrap call zp.cputs jp zp.cdisp str_esyntax1 .text "Unknown: \"\000" str_esyntax2 .text "\"\000" hash_table: .dw hash0, hash1, hash2, hash3, hash4, hash5, hash6, hash7 .dw hash8, hash9, hashA, hashB, hashC, hashD, hashE, hashF ; (byte) Commands hashing to this value ; (zstr) String1 ; (word) Vector1 ; (zstr) String2 ; (word) Vector2 ; etc. hash0 hash1 hash3 hash4 hash6 hash7 hash8 hash9 hashA hashB hashD .db 0 hash2 .db 1 .db "CLS", 0 .dw cmd_CLS hash5 .db 2 .db "HEX", 0 .dw cmd_HEX .db "RUN", 0 .dw cmd_RUN hashC .db 3 .db "LIST", 0 .dw cmd_LIST .db "INFO", 0 .dw cmd_INFO .db "KILL", 0 .dw cmd_KILL hashE .db 1 .db "LINK", 0 .dw cmd_LINK hashF .db 1 .db "MEM", 0 .dw cmd_MEM #include "commands\\cls.z80" #include "commands\\hex.z80" #include "commands\\info.z80" #include "commands\\kill.z80" #include "commands\\link.z80" #include "commands\\list.z80" #include "commands\\mem.z80" #include "commands\\run.z80" gen_error: ld hl, os.status_flags bit prgm_running, (hl) jr z, _system_error ld hl, (psp.ehandler) ld a, (hl) cp $C7 jr nz, _bad_handler inc hl ld sp, (psp.stack) ld a, (os.exception_num) jp (hl) _bad_handler: ld hl, str_eunhandled call zp.cputs _system_error: ld hl, str_exception call zp.cputs ld de, os.console + (1*24) + 2 ld a, (os.exception_num) ld b, a call zp.htoa_b ld a, b add a, a ld hl, err_strings offset_hl deref_hl inc de call zp.strcpy dec de ld a, ' ' ld (de), a ; Dump values of AF - IY ld de, os.console + (2*24) + 3 ld b, 6 _Dump_Regs: pop hl call zp.htoa_w inc de inc de inc de inc de djnz _Dump_Regs ; Dump PC - 3 pop hl dec hl dec hl dec hl call zp.htoa_w inc de inc de inc de inc de ; Dump SP ld hl, 0 add hl, sp push hl call zp.htoa_w inc de inc de inc de inc de ; Dump I ld a, i call zp.htoa_b ; Dump stack pop hl ld a, h or l jr z, _No_Stack_Dump ld de, 30 add hl, de ld b, 15 jr nc, _XXX ld a, $1C sub l srl a inc a ld b, a _XXX: ld c, 5 ld de, os.console + (6*24) ld hl, 0 add hl, sp _Dump_Stack: push hl deref_hl push bc call zp.htoa_w pop bc dec c jr z, _Dump_Stack1 inc de _Dump_Stack2: pop hl inc hl inc hl djnz _Dump_Stack _No_Stack_Dump: call zp.cdisp ld sp, (os.estack) ret _Dump_Stack1: ld c, 5 jr _Dump_Stack2 .module HEX_EDITOR _address = os.scrap _cur_y = os.scrap + 2 _cur_x = os.scrap + 3 _mode = os.scrap + 4 ; 0 = hex !0 = ascii _string = os.scrap + 5 app.hexedit: .export app.hexedit call zp.credraw ld hl, 0 ld de, (arg(1)) ld a, d or e jr z, _NoArg ld b, 4 call zp.atoh _NoArg: ld (_address), hl ld hl, 0 ld (_cur_y), hl ld (_mode), hl jp _Refresh _loop: ld hl, _Refresh push hl _inkey: call zp.getch cp k_enter jp z, _Set cp k_down jr z, _CurDown cp k_up jr z, _CurUp cp k_left jr z, _CurLeft cp k_right jr z, _CurRight range_test('C','S',_inkey,_lc) or $20 _lc: cp 'c' jp z, _Compare cp 'e' jp z, _Enter cp 'f' jp z, _Fill cp 'g' jp z, _Goto cp 'k' jp z, _PageBack cp 'l' jp z, _PageAhead cp 'm' jp z, _Mode cp 'p' jp z, _Page cp 's' jp z, _Search cp 'q' jr nz, _inkey ; Exit _Quit: pop af ret ; Move the cursor down one row _CurDown: call _Func_PrepCursor _CurDown_2: ld a, l cp 7 jr z, _ScrollDown inc l _CurExit: ld (_cur_y), hl call _XORCursor call zp.vbufdisp jr _inkey _ScrollDown: ld de, 8 _CurMod: ld hl, (_address) add hl, de ld (_address), hl ret ; Move the cursor up one row _CurUp: call _Func_PrepCursor _CurUp_2: ld a, l or a jr z, _ScrollUp dec l jr _CurExit _ScrollUp: ld de, -8 jr _CurMod ret ; Move the cursor left one byte _CurLeft: call _Func_PrepCursor ld a, h or a jr z, _WrapLeft dec h jr _CurExit _WrapLeft: ld h, 7 ld (_cur_y), hl jr _CurUp_2 _CurRight: call _Func_PrepCursor ld a, h sub 7 jr z, _WrapRight inc h jr _CurExit _WrapRight: ld h, a ld (_cur_y), hl jr _CurDown_2 ; Set a byte _Set: call _Func_AddressTest ld hl, _str_set call _DispCommand ld a, (_mode) or a jr z, _SHex ld a, (os.buffer) ld d, a jr _SWrite _SHex: ld de, os.buffer ld b, 2 call zp.atoh jp c, _HexError ld d, l _SWrite: call _Get_Cur_Address ld (hl), d ret _Mode: ld a, (_mode) cpl ld (_mode), a ret _PageAhead: ld hl, (_address) ld de, 64 _PageAhead_2: add hl, de ld (_address), hl ret _PageBack: ld hl, (_address) ld de, -64 jr _PageAhead_2 ; Warp to a specified address _Goto: ld hl, _str_goto call _DispCommand ld de, os.buffer ld b, 4 call zp.atoh jp c, _HexError ld (_address), hl ret _Page: ld hl, _str_page call _DispCommand ld de, os.buffer ld b, 2 call zp.atoh jp c, _HexError ld a, l out (flash_pageA_port), a ret _Compare: ld hl, _str_comp call _DispCommand call _ParseC call _Get_Cur_Address ld bc, (arg(0)) ld de, (arg(1)) ld a, b or c jp z, _inkey _CLoop: ld a, (de) inc de cpi jr nz, _CMismatch jp pe, _CLoop ld hl, _str_match jp _HE2 _CMismatch: dec hl ld (_address), hl push de ld hl, _str_mismatch _C2: ld de, _string call zp.strcpy dec de pop hl dec hl call zp.htoa_w xor a ld (de), a sbc hl, hl ld (_cur_y), hl ld hl, _string jp _HE2 _Enter: call _Func_AddressTest push hl ld hl, _str_enter call _DispCommand ld de, os.buffer ld a, (_mode) or a jr z, _EWriteH ex de, hl pop de _EWriteA: ld a, (hl) or a ret z ldi jr _EWriteA _EWriteH: pop bc push bc ld b, 2 call zp.atoh pop bc jp c, _HexError ld a, l ld (bc), a inc bc ld a, (de) or a jr nz, _EWriteH+1 ret _Search: ld hl, _str_search call _DispCommand ld de, os.buffer ld a, (_mode) or a jr nz, _SAsc ld ix, os.buffer ld c, 0 _SConvHex: ld b, 2 call zp.atoh jp c, _HexError ld (ix), l inc ix inc c ld a, (de) or a jr nz, _SConvHex jr _SDoSearch _SAsc: ld hl, os.buffer call zp.strlen _SDoSearch: call _Get_Cur_Address ld ixh, c ld de, os.buffer ld bc, 65535 _SBegin: ld a, (de) cpir push de push ix _SStep: inc de dec ixh jr z, _SFound ld a, (de) cpi jr z, _SStep _SFound: pop ix pop de jr nz, _SBegin ld d, 0 ld e, ixh sbc hl, de ld (_address), hl inc hl push hl ld hl, _str_found jp _C2 _Fill: call _Func_AddressTest ld hl, _str_fill call _DispCommand call _ParseFS call _Get_Cur_Address ld bc, (arg(0)) ld a, b or c jp z, _inkey ld de, (arg(1)) _Fill_Loop: ld (hl), e inc hl dec bc ld a, b or c jr nz, _Fill_Loop ret _Get_Cur_Address: ld hl, (_address) ld a, (_cur_y) add a, a add a, a add a, a ld e, a ld a, (_cur_x) add a, e offset_hl ret pop af _HexError: ld a, CMD_PANE call zp.clrline ld hl, _str_hex _HE2: ld bc, CMD_PANE*256+0 call zp.puts_con ld a, CMD_PANE call zp.displine call zp.getch ret ; Parse for FIND and SEARCH: ; _ParseFS: call _Func_UnivParse jr c, _HexError-1 ld a, (_mode) or a ld a, (de) ld l, a ld b, 2 call z, zp.atoh jr c, _HexError-1 ld (arg(1)), hl ret ; Parse for COMPARE: ; _ParseC: call _Func_UnivParse jr c, _HexError-1 ld b, 4 call zp.atoh jr c, _HexError-1 ld ((arg(1)), hl ret ; Rebuild the display from nothing _Refresh: ld a, MSG_PANE call zp.clrline ld a, CMD_PANE call zp.clrline ld hl, (_address) ld bc, 0 _Refresh_Line: push bc ld de, _string call zp.htoa_w ld a, ':' ld (de), a inc de ld a, ' ' ld (de), a inc de call _Func_Conv call _Func_Conv call _Func_Conv call _Func_Conv pop bc push bc ld de, _string _Refresh_Write: ld a, (de) inc de call zp.putch_con inc c ld a, c cp 22 jp nz, _Refresh_Write pop bc ld a, b add a, 6 ld b, a cp 8*6 jp nz, _Refresh_Line call _XORCursor call zp.vbufdisp jp _loop _XORCursor: ld hl, (_cur_y) ld a, h ld h, 0 add hl, hl add hl, hl add hl, hl ld d, h ld e, l add hl, hl add hl, hl add hl, hl add hl, de add a, 3 offset_hl ld de, os.lcd_mem add hl, de ld b, 6 ld de, 12 _InvLoop: ld a, (hl) cpl ld (hl), a add hl, de djnz _InvLoop ret _DispCommand: ld a, MSG_PANE ; Display function name call zp.clrline ld bc, MSG_PANE*256 call zp.puts_con ld a, MSG_PANE call zp.invline ld a, MSG_PANE call zp.displine jp zp.cgets ; Bunches of silly functions to shorten code size ; Code used by both parsing functions _Func_UnivParse: ld b, 2 ld hl, os.buffer ld d, h ld e, l ld ix, os.arg_ptrs call zp.tokenize ld de, (arg(0)) ld b, 4 call zp.atoh ret c ld (arg(0)), hl ld de, (arg(1)) ret _Func_PrepCursor: call _XORCursor ; Erase cursor highlight ld hl, (_cur_y) ret ; Convert bytes to ASCII or Hex _Func_Conv: ld a, (_mode) or a jr z, _Func_Conv_Hex ld a, ' ' ldi ld (de), a inc de ldi ld (de), a inc de ret _Func_Conv_Hex: ld b, (hl) inc hl ld c, (hl) inc hl push hl ld h, b ld l, c call zp.htoa_w pop hl ret ; Test if in Flash _Func_AddressTest: call _Get_Cur_Address pop de bit 7, h jp z, _inkey push de ret ; "0 1 2 " ; "012345678901234567890123" _str_comp .db "COMPARE MEMORY", 0 _str_enter .db "ENTER STRING", 0 _str_fill .db "FILL MEMORY", 0 _str_goto .db "GO TO ADDRESS", 0 _str_page .db "SET FLASH PAGE", 0 _str_set .db "SET BYTE", 0 _str_hex .db "Invalid Hex Value", 0 _str_match .db "Memory Matches", 0 _str_mismatch .db "Mismatch at ", 0 _str_search .db "SEARCH", 0 _str_found .db "String Found at ", 0 .echo "Hex Editor\t" .echo $-app.hexedit .echo "\n" vect_putch_con: push hl push de push bc ld h, 0 ld l, b ld d, h ld e, l add hl, hl add hl, de add hl, hl add hl, hl ld e, c ld c, a ; C.0 font lsb srl e rl c ; C.1 font lsb C.0 = column lsb add hl, de ld de, os.lcd_mem add hl, de ; HL = address into lcd_mem push hl rra ld h, 0 ld l, a ld d, h ld e, l add hl, hl add hl, de add hl, hl ld de, os.font_con add hl, de ; HL = address of bitmap ex (sp), hl pop ix ; HL -> lcd_mem IX -> bitmap ld b, 6 _loop: ld a, (ix) bit 1, c jr nz, _oddfont rlca rlca rlca rlca _oddfont: and $0F ld e, $F0 bit 0, c jr nz, _oddcolumn ld e, $0F rlca rlca rlca rlca _oddcolumn: push af ld a, (hl) and e ld d, a pop af or d ld (hl), a inc ix ld de, 12 add hl, de djnz _loop pop bc pop de pop hl ret .echo "putch_con\t" .echo $-vect_putch_con .echo "\n" vect_f_load: _reloc_size = os.scrap _load_size = os.scrap + 2 _reloc_ptr = os.scrap + 4 _load_ptr = os.scrap + 6 _reloc_ptr2 = os.scrap + 8 _reloc_endptr = os.scrap + 10 ld hl, user_ram cmp_hlde ret z ; Get sizes of both files call zp.f_size ld (_reloc_size), bc ex de, hl ; HL = & load file, DE = & reloc file call zp.f_size ld (_load_size), bc ld (_load_ptr), hl ld (_reloc_ptr), de ; Compare sizes ld d, b ld e, c ld hl, (_reloc_size) ; HL = size reloc, DE = size load _CMP: cmp_hlde jr z, _Sizes_Are_Equal jr c, _LoadFile_Is_Larger ; reloc > load ; Do exchange of DE bytes ld b, d ld c, e ld hl, (_load_ptr) ld de, (_reloc_ptr) call zp.memswap add hl, bc ex de, hl add hl, bc ex de, hl ; ----------------------------------------------------- ; | LOAD_FILE | RELOC_PT_2 | STUFF | RELOC_PT_1 | STUFF | ; ----------------------------------------------------- ; ^_reloc_ptr ^DE ^_load_ptr ^HL ; Get size difference ld (_reloc_ptr2), de ld (_reloc_endptr), hl ld hl, (_reloc_size) ld de, (_load_size) or a sbc hl, de ; Find HL / 1024 and HL % 1024 ld a, h and $03 ld b, a ; BC = HL % 1024 == HL & 0x03FF ld c, l or c jr z, _No_Remainder ; Move HL % 1024 bytes: ; ------------------------------------------------------- ; | LOAD_FILE |***RELOC_PT_2 | STUFF | RELOC_PT_1 | STUFF | ; ------------------------------------------------------- ; | LOAD_FILE |<--RELOC_PT_2 | STUFF | RELOC_PT_1 | STUFF | ; ------------------------------------------------------- ; | LOAD_FILE | RELOC_PT_2 | STUFF | RELOC_PT_1***| STUFF | ; ------------------------------------------------------- push hl call _Twiddle_Bytes pop hl _No_Remainder: srl h srl h ret z ld a, h ; A = HL / 1024 == H >> 2 _Loop: ; Move 1024 bytes A times ld bc, 1024 call _Twiddle_Bytes dec a ret z jr _Loop _LoadFile_Is_Larger: ; load > reloc ; Do exchange of HL bytes ld b, h ld c, l push de push hl ld hl, (_load_ptr) ld de, (_reloc_ptr) call zp.memswap add hl, bc ex de, hl add hl, bc ex de, hl ; ---------------------------------------------------------------- ; | LOAD_PT_1 | RELOC_II | RELOC_III | RELOC_I | LOAD_PT_2 | STUFF | ; ---------------------------------------------------------------- ; ^_reloc_ptr ^DE ^_load_ptr ^HL ; Update vars and go through the whole rigmarole again ld (_load_ptr), hl ld (_reloc_ptr), de ex de, hl call zp.f_size ld (_reloc_size), bc pop de pop hl or a sbc hl, de ld (_load_size), hl ex de, hl ld h, b ld l, c jp _CMP _Sizes_Are_Equal: ; Exchange DE or HL bytes ld b, h ld c, l ld hl, (_load_ptr) ld de, (_reloc_ptr) jp zp.memswap add hl, bc ex de, hl add hl, bc ex de, hl _Twiddle_Bytes: ld hl, (_reloc_ptr2) ld de, os.free push bc ldir ex de, hl ld hl, (_reloc_endptr) or a sbc hl, de ld b, h ld c, l ld hl, (_reloc_ptr2) ex de, hl ldir pop bc ld hl, os.free ldir ret .echo "f_load \t" .echo $-vect_f_load .echo "\n" .module INPUT vect_input: push bc push hl ld b, 8 ; counter ld hl, TIMEOUT ; timer ld a, RED1_WHITE1 out (link_port), a ; Set W = 1, R = 1 _Start: in a, (link_port) and %00000011 cp %00000011 jr nz, _Get_Bit call _Chk_Timeout jr _Start _Get_Bit: cp %00000010 ; If W = 1, R = 0, a zero is incoming jr z, _Receive_0 _Receive_1: srl c ; Shift accumulator and set bit set 7, c ld a, RED0_WHITE1 out (link_port), a jr _End_Wait _Receive_0: srl c ld a, RED1_WHITE0 out (link_port), a _End_Wait: call _Chk_Timeout in a, (link_port) and %00000011 jr z, _End_Wait ld a, RED1_WHITE1 out (link_port), a ld hl, TIMEOUT djnz _Start ld a, c or a _Exit: pop hl pop bc ret _Chk_Timeout: dec hl ld a, h or l ret nz _Error: pop af ld a, RED1_WHITE1 out (link_port), a scf jr _Exit .echo "input \t" .echo $-vect_input .echo "\n" _token: ld a, ' ' cpi jr z, $-2 dec hl ld a, (hl) ld bc, $2022 cp c jr nz, $+3 ld b, $22 inc hl _tok2: ld a, (hl) ldi inc bc or a scf ret z cp b jr z, _tok3 cp $5C jr z, _escape cp c jr nz, _tok2 _tok3: dec de xor a ld (de), a inc de ret _escape: ld a, (hl) inc hl cp $5C jr z, _tok2 or a scf ret z dec de cp c jr nz, _esc2 ld a, c _esc3: ld (de), a inc de jr _tok2 _esc2: cp 'n' jr nz, _tok2 ld a, $0A jr _esc3 .echo "extract \t" .echo $-vect_extract .echo "\n" .NOLIST #define equ .equ #define EQU .equ #define end .end #include "ti83plus.inc" #include "mirage.inc" .LIST #DEFINE kDown 01h #DEFINE kLeft 02h #DEFINE kRight 03h #DEFINE kUp 04h #DEFINE kEnter 09h #DEFINE kMode 37h #DEFINE kDel 38h #DEFINE kYEq 35h #DEFINE k2nd 36h #DEFINE kAlpha 30h #define xmm savesscreen ; Mega Man's x-coord #define ymm savesscreen+2 ; Mega Man's y-coord #define jrem savesscreen+3 ; remebers the y-coord where the jump started #define jchk savesscreen+4 ; check for jump: 0=no jump 1=jump up 2=jump down #define wchk savesscreen+5 ; check if ok to shoot again: 0=yes >0=no #define dir savesscreen+6 ; direction Mega Man is facing: 0=left 1=right #define x2 savesscreen+7 ; x-coord for many different things #define y2 savesscreen+8 ; y-coord for many different things #define xb savesscreen+9 ; x-coord for boss #define yb savesscreen+10 ; y-coord for boss #define wx1 savesscreen+11 ; x-coord for 1st shot #define wy1 savesscreen+12 ; y-coord for 1st shot #define wx2 savesscreen+13 ; x-coord for 2nd shot #define wy2 savesscreen+14 ; y-coord for 2nd shot #define wx3 savesscreen+15 ; x-coord for 3rd shot #define wy3 savesscreen+16 ; y-coord for 3rd shot #define bdir savesscreen+17 ; direction of boss: 0=left 1=right #define wdir1 savesscreen+18 ; direction of 1st shot: 0=left 1=right #define wdir2 savesscreen+19 ; direction of 2nd shot: 0=left 1=right #define wdir3 savesscreen+20 ; direction of 3rd shot: 0=left 1=right #define wchk1 savesscreen+21 ; check if bullet #1 is still on screen: 0=no 1=yes #define wchk2 savesscreen+22 ; check if bullet #2 is still on screen: 0=no 1=yes #define wchk3 savesscreen+23 ; check if bullet #3 is still on screen: 0=no 1=yes #define curlvl savesscreen+24 ; pointer to the beginning of the level data #define feet savesscreen+26 ; check for which running sprite to use: 0 or 1 #define xscr savesscreen+27 ; x scroller #define tempscr savesscreen+29 ; amount scrolled within incomplete block #define schk savesscreen+31 ; scroll check: 0=no 1=yes #define boss savesscreen+33 ; which boss u will face: 1 2 3=top row 4 5 6=middle row 7 8 9=bottom row #define wpnspr savesscreen+34 ; current weapon sprite #define smlspr savesscreen+36 ; current 8x8 sprite #define curpic savesscreen+38 ; current pic to draw #define bosspic savesscreen+40 ; current boss sprite #define death savesscreen+42 ; check if dead: 0=no 1=yes #define win savesscreen+44 ; check if level is completed: 0=no 1=yes #define xe savesscreen+45 ; x-coord for enemy #define ye savesscreen+46 ; y-coord for enemy #define edir savesscreen+47 ; direction enemy is travelling #define echk savesscreen+48 ; check for onscreen enemy: 0=no 1=i 2=t 3=dead #define enspr savesscreen+49 ; current enemy sprite #define ecount savesscreen+51 ; counts how many pixels enemy has moved (32 pixels allowed) #define ecount2 savesscreen+52 ; counts how many pixels have scrolled since enemy appeared #define bchk savesscreen+53 ; checks for boss: 0=no 1=yes #define bwx savesscreen+54 ; x-coord of boss's shot #define bwspr savesscreen+55 ; sprite for boss's shot #define bwchk savesscreen+57 ; check for boss's shot onscreen #define bjchk savesscreen+58 ; check for boss's jump: 0=no jump 1=jump down 2=jump up #define lvldone savesscreen+59 ; checks levels completed: 0 1 2=top row 3 _ 4=middle row 5 6 7=bottom row #define anpw savesscreen+60 ; checks for password dots corresponding to Anchorman #define mapw savesscreen+61 ; checks for password dots corresponding to Mailman #define mdpw savesscreen+62 ; checks for password dots corresponding to Madman #define dopw savesscreen+63 ; checks for password dots corresponding to Doorman #define popw savesscreen+64 ; checks for password dots corresponding to Policeman #define frpw savesscreen+65 ; checks for password dots corresponding to Freshman #define sepw savesscreen+66 ; checks for password dots corresponding to Top Secret Weapon #define sapw savesscreen+67 ; checks for password dots corresponding to Salesman #define mipw savesscreen+68 ; checks for password dots corresponding to Milkman #define tankpw savesscreen+69 ; checks for password dots corresponding to energy tanks #define lives savesscreen+70 ; the number of lives you have #define tanks savesscreen+71 ; the number of energy tanks you have #define remlvl savesscreen+72 ; remembers which level you were on before the special boss screens #define wpn savesscreen+74 ; which weapon you are using: 1=an...5=??...9=mi #define wrem1 savesscreen+75 ; remembers x-coord where short-range bullet #1 must stop #define wrem2 savesscreen+76 ; remembers x-coord where short-range bullet #2 must stop #define wrem3 savesscreen+77 ; remembers x-coord where short-range bullet #3 must stop #define bcount savesscreen+78 ; special counting variable used for final bosses #define item savesscreen+79 ; check for item in level: 0=no 1=yes 2=got #define enp savesscreen+80 ; life energy #define enan savesscreen+81 ; energy for anchor toss #define enma savesscreen+82 ; energy for stamp throw #define enmd savesscreen+83 ; energy for swearing scream #define endo savesscreen+84 ; energy for splinter shot #define ense savesscreen+85 ; energy for top secret weapon #define enpo savesscreen+86 ; energy for badge boomerang #define enfr savesscreen+87 ; energy for zit shield #define ensa savesscreen+88 ; energy for bill charge #define enmi savesscreen+89 ; energy for milk bubble #define enwpn savesscreen+90 ; energy for current weapon #define ene savesscreen+91 ; energy for enemy #define enb savesscreen+92 ; energy for boss #define hchk savesscreen+93 ; check if you've been hit: 0=no 1=yes #define stack savesscreen+93 ; save stack for debugging (?) .org $9d93 ;Origin (set back two to account for AsmPrgm) .db $BB,$6D ;Compiled AsmPrgm token ret ;So TIOS wont run the program .db 1 ;Identifier as MirageOS program .db %00000000,%00000000 .db %00000000,%00000000 .db %00000011,%00000000 .db %00000100,%10000000 .db %00001111,%01000000 .db %00001010,%11000000 .db %00000100,%10000000 .db %00000011,%00000000 .db %00001100,%11100000 .db %00001100,%11100000 .db %00000011,%00000000 .db %00000111,%11100000 .db %00001010,%11100000 .db %00001110,%00000000 .db %00000000,%00000000 Description: .db "Mega Man 83+",0 prog_start: bcall(_grbufclr) ld a,19 ld hl,djs call centertext ld a,25 ld hl,and_inf call centertext ld a,31 ld hl,djs2 call centertext ld a,37 ld hl,pre call centertext djsp_loop: call wait call fastcopys ld hl,intro call draw_text story_loop2: bcall(_clrlcdfull) bcall(_grbufclr) xor a ; no levels completed ld (lvldone),a ld (tanks),a ; 0 energy tanks inc a ld (tankpw),a ; 0 energy tanks (for password system) inc a inc a ld (lives),a ; 3 lives ld hl,logo ; display title screen ld de,PLOTSSCREEN call disprle call fastcopys ld a,17 ld (x2),a ld a,43 ld (y2),a ld hl,pwdot ld (smlspr),hl menu_loop: call xor_8x8 call fastcopys call xor_8x8 bcall(_getcsc) cp kUp jr z,curs_change cp kDown jr z,curs_change cp kEnter jr z,title_done cp kMode jr nz,menu_loop ret curs_change: ld a,(y2) ld b,a ld a,97 sub b ld (y2),a jr menu_loop title_done: ld a,(y2) cp 43 jr z,cb_init call enter_pw cp kMode ; exit game if MODE was pressed on enter password screen ret z cb_init: ld a,33 ld (x2),a ld a,22 ld (y2),a bcall(_clrlcdfull) choose_boss: bcall(_grbufclr) ld hl,cbs ld de,PLOTSSCREEN call disprle ld a,(lvldone) ld c,a rrc c call c,no_an rrc c call c,no_ma rrc c call c,no_md rrc c call c,no_do rrc c call c,no_po rrc c call c,no_fr rrc c call c,no_sa rrc c call c,no_mi call fastcopys boss_loop: call xor_corners call fastcopys call xor_corners bcall(_getcsc) cp kUp jr z,bcurs_up cp kDown jr z,bcurs_down cp kLeft jr z,bcurs_left cp kRight jr z,bcurs_right cp kEnter jr z,find_boss cp kMode jr nz,boss_loop bcall(_getcsc) ; clear the keybuffer bcall(_grbufclr) bcall(_clrlcdfull) ret bcurs_up: ld a,(y2) cp 1 jr z,boss_loop ld a,(y2) sub 21 ld (y2),a jr boss_loop bcurs_down: ld a,(y2) cp 43 jp z,boss_loop ld a,(y2) add a,21 ld (y2),a jp boss_loop bcurs_left: ld a,(x2) cp 2 jp z,boss_loop ld a,(x2) sub 31 ld (x2),a jp boss_loop bcurs_right: ld a,(x2) cp 64 jp z,boss_loop ld a,(x2) add a,31 ld (x2),a jp boss_loop find_boss: ld a,(y2) cp 1 jr z,row1 cp 22 jr z,row2 ld a,7 jr found_row row2: ld a,4 jr found_row row1: ld a,1 found_row: ld (boss),a ld a,(x2) cp 64 jr z,add2 cp 33 jr nz,add0 ld a,(boss) inc a jr add_done add0: ld a,(boss) jr add_done add2: ld a,(boss) add a,2 add_done: ld (boss),a ld a,44 ld (xb),a ld a,27 ld (yb),a ld a,(boss) cp 1 jr z,an_init cp 2 jr z,ma_init cp 3 jr z,md_init cp 4 jp z,do_init cp 5 jp z,ti_init cp 6 jp z,po_init cp 7 jp z,fr_init cp 8 jp z,sa_init cp 9 jp z,mi_init an_init: ld a,(lvldone) bit 0,a jp c,choose_boss ld hl,ansl call disp_boss ld hl,wpan ld (bwspr),hl ld a,54 ld hl,a_n call centertext ld hl,lvlan jp intro_done ma_init: ld a,(lvldone) bit 1,a jp nz,choose_boss ld hl,masl call disp_boss ld hl,wpma ld (bwspr),hl ld a,54 ld hl,m_a call centertext ld hl,lvlma jp intro_done md_init: ld a,(lvldone) bit 2,a jp nz,choose_boss ld hl,mdsl call disp_boss ld hl,wpmd ld (bwspr),hl ld a,54 ld hl,m_d call centertext ld hl,lvlmd jp intro_done do_init: ld a,(lvldone) bit 3,a jp nz,choose_boss ld hl,dosl call disp_boss ld hl,wpdo ld (bwspr),hl ld a,54 ld hl,d_o call centertext ld hl,lvldo jp intro_done ti_init: ld a,(lvldone) rrc a jp nc,choose_boss rrc a jp nc,choose_boss rrc a jp nc,choose_boss rrc a jp nc,choose_boss rrc a jp nc,choose_boss rrc a jp nc,choose_boss rrc a jp nc,choose_boss rrc a jp nc,choose_boss ld hl,tisl call disp_boss ld hl,wpp ld (bwspr),hl ld a,54 ld hl,t_i call centertext ld hl,lvlti jp intro_done po_init: ld a,(lvldone) bit 4,a jp nz,choose_boss ld hl,posl call disp_boss ld hl,wppo ld (bwspr),hl ld a,54 ld hl,p_o call centertext ld hl,lvlpo jr intro_done fr_init: ld a,(lvldone) bit 5,a jp nz,choose_boss ld hl,frsl call disp_boss ld hl,wpfr ld (bwspr),hl ld a,54 ld hl,f_r call centertext ld hl,lvlfr jr intro_done sa_init: ld a,(lvldone) bit 6,a jp nz,choose_boss ld hl,sasl call disp_boss ld hl,wpsa ld (bwspr),hl ld a,54 ld hl,s_a call centertext ld hl,lvlsa jr intro_done mi_init: ld a,(lvldone) bit 7,a jp nz,choose_boss ld hl,misl call disp_boss ld hl,wpmi ld (bwspr),hl ld a,54 ld hl,m_i call centertext ld hl,lvlmi intro_done: ld (curlvl),hl ; remember the start of the level ld (remlvl),hl call delay bcall(_clrlcdfull) bcall(_grbufclr) call wpn_fill part1_init: call init_vars ld a,44 ; initialize some variables ld (ymm),a xor a ld (jchk),a ld (bchk),a ld (wpn),a inc a ld (dir),a ld (schk),a ld hl,wpp ld (wpnspr),hl call ShowLevel call main_loop bcall(_getcsc) ; clear the keybuffer bcall(_grbufclr) bcall(_clrlcdfull) ld a,(death) ; check if died or a jp nz,lost_life ld a,(win) or a ret z ; exit loop if level has not been completed part2_init: ld hl,lvlb1 xor a ld (bchk),a call init_lvlb ld a,(death) ; check if died or a jp nz,lost_life ld a,(win) or a ret z ; exit loop if level has not been completed xor a ; initialize boss variables ld (bdir),a ld (bjchk),a inc a ld (bchk),a ld a,28 ld (enb),a ld a,44 ld (yb),a ld a,76 ld (xb),a ld hl,lvlb2 call init_lvlb ld a,(death) ; check if died or a jp nz,lost_life ld a,(win) or a ret z ; exit game if level has not been completed ld a,(lvldone) ld b,a ld a,(boss) cp 5 jp z,final_boss cp 1 jr z,set_bit0 cp 2 jr z,set_bit1 cp 3 jr z,set_bit2 cp 4 jr z,set_bit3 cp 6 jr z,set_bit4 cp 7 jr z,set_bit5 cp 8 jr z,set_bit6 set 7,b jr set_bit_done set_bit6: set 6,b jr set_bit_done set_bit5: set 5,b jr set_bit_done set_bit4: set 4,b jr set_bit_done set_bit3: set 3,b jr set_bit_done set_bit2: set 2,b jr set_bit_done set_bit1: set 1,b jr set_bit_done set_bit0: set 0,b set_bit_done: ld a,b ld (lvldone),a call you_got ; show "you got x weapon" screen cp kMode ; exit is MODE was pressed at you got screen ret z call show_pw ; show password cp kMode ; exit if MODE was pressed at show password screen ret z jp cb_init lost_life: call wpn_fill ld a,(lives) ; go to game over screen if all lives lost or a jr z,game_over ld a,(schk) or a jp z,part2_init jp part1_init game_over: call show_pw cp kMode ; exit if MODE was pressed at show password screen ret z ld a,3 ld (lives),a bcall(_clrlcdfull) bcall(_grbufclr) ld hl,game_over_lindat call draw call fastcopys ld de,18*256+31 ld hl,gover call setvputs ld de,25*256+25 ld hl,cont call setvputs ld de,32*256+14 ld hl,stgsel call setvputs ld de,39*256+31 ld hl,endgame call setvputs bcall(_grbufclr) go_loop: bcall(_getcsc) cp k2nd jr z,go_cont cp kAlpha jp z,cb_init cp kMode ret z jr go_loop go_cont: ld hl,(remlvl) ld (curlvl),hl jp part1_init final_boss: xor a ld (boss),a ;select boss 0 ld (win),a ;you haven't won call main_loop ;call the main loop ld a,(death) ;check if you died or a jp nz,lost_life ld a,(win) or a ret z ; exit game if level has not been completed ending: ld hl,endingtext call draw_text ld hl,creditext call draw_text ld a,11 ld hl,pres call centertext ld a,22 ld hl,djs call centertext ld a,28 ld hl,and_inf call centertext ld a,34 ld hl,djs2 call centertext call clrwait ret init_lvlb: ld (curlvl),hl call init_vars ld (schk),a ld (bcount),a call ShowLevel call main_loop ld a,(win) ; see if you defeated TI's spaceship cp 2 jr z,ship_dead bcall(_getcsc) ; clear the keybuffer bcall(_grbufclr) bcall(_clrlcdfull) ret init_vars: ld hl,0 ld (xscr),hl ld (tempscr),hl ld hl,8 ; initialize some variables ld (xmm),hl xor a ld (wchk),a ld (wchk1),a ld (wchk2),a ld (wchk3),a ld (win),a ld (death),a ld (feet),a ld (item),a ld (echk),a ld (bwchk),a ld (hchk),a ret ship_dead: ld a,28 ld (enb),a call check_spr call xor_char ld b,0 ; erase ship call ship_init ti_fall: ; TI falls to the bottom of the screen ld a,(yb) inc a ld (yb),a call xor_boss call fastcopys call xor_boss ld a,(yb) cp 44 jr nz,ti_fall call check_spr call xor_char ret main_loop: ld a,(hchk) or a call nz,thrown_back ld hl,(xmm) call load_x ld a,(ymm) add a,4 push hl push af call GetBlock call CheckItem pop af pop hl ld de,7 add hl,de call GetBlock call CheckItem ld a,(echk) or a call nz,check_ehitu ld a,(bchk) or a call nz,check_bhitu ld a,(bwchk) or a call nz,check_bwhitu call ShowLevel ld a,(boss) ;draw spaceship if necessary cp 5 ld b,1 call z,ship_init ;if at boss 5 (TI) draw the ship call draw_nrg ; draw energy lines call check_spr ; figure out which Mega Man sprite to use call xor_char ; draw it ld a,(wchk1) ; check if shots should be displayed and display as necessary or a call nz,xor_wpn1 ld a,(wchk2) or a call nz,xor_wpn2 ld a,(wchk3) or a call nz,xor_wpn3 ld a,(echk) ;check for enemy and display as necessary push af cp 1 call z,xor_en pop af cp 2 call z,xor_en ld a,(bwchk) ;check for boss's shot and display as necessary or a call nz,xor_bwpn ld a,(bchk) ;check for boss and display as necessary or a call nz,xor_boss call fastcopys ;copy everything to the buffer ld a,(enp) or a call z,die call xor_char ;erase the Megaman sprite ld a,(wchk1) ;check for shots and erase as necessary or a call nz,shot1_move ld a,(wchk2) or a call nz,shot2_move ld a,(wchk3) or a call nz,shot3_move ld a,(echk) ;check for enemy and erase as necessary push af cp 1 call z,i_move pop af cp 2 call z,t_move ld a,(bwchk) ;check for boss's shot and erase as necessary or a call nz,boss_shot_move ld a,(bchk) ;check for boss and erase as necessary or a call nz,boss_move bcall(_grbufclr) ld a,(wchk) or a call nz,inc_wchk call find_spr ld a,$FD ;check ENTER out (1),a in a,(1) bit 0,a call z,pause ld a,$FE ;check arrow keys out (1),a in a,(1) bit 1,a call z,move_left bit 2,a call z,move_right ld a,$BF ;check other keys out (1),a in a,(1) bit 4,a call z,sub_screen bit 5,a push af call z,jump call nz,jchk_now_2 call fall pop af bit 6,a ret z ;exit loop is MODE has been pressed ld a,$DF ;check ALPHA out (1),a in a,(1) bit 7,a call z,shoot ld a,(death) or a ret nz ;exit loop if dead ld a,(win) or a jp z,main_loop ;exit loop if level completed ret pause: call tiny_delay pause_loop: bcall(_getcsc) cp kMode ret z cp kEnter jr nz,pause_loop call tiny_delay ret jchk_now_2: ; make sure you can't jump push af ld a,2 ld (jchk),a pop af ret move_right: ld a,(feet) and $02 ld hl,mmrr2 jr nz,rr2_spr ld hl,mmrr rr2_spr: ld (curpic),hl ld a,(xmm) cp 80 call z,won call CheckRight call z,CheckRight2 call z,CheckRight3 jr nz,no_right call change_right ld a,(xmm) cp 44 jr nz,no_scroll ld a,(xscr) cp 68 jr z,no_scroll ld a,(schk) or a jr z,no_scroll call scroll jr no_right no_scroll: ld hl,(xmm) inc hl ld (xmm),hl no_right: ld a,(dir) or a call z,change_right ret change_right: call feet_inc ld a,1 ld (dir),a ret move_left: push af ld a,(feet) and $02 ld hl,mmrl2 jr nz,rl2_spr ld hl,mmrl rl2_spr: ld (curpic),hl ld a,(xmm) or a jr z,no_left call CheckLeft call z,CheckLeft2 call z,CheckLeft3 jr nz,no_left call change_left ld hl,(xmm) dec hl ld (xmm),hl no_left: ld a,(dir) or a call nz,change_left pop af ret change_left: call feet_inc xor a ld (dir),a ret CheckRight: ld hl,(xmm) call load_x ld de,8 add hl,de jr CheckHorz CheckLeft: ld hl,(xmm) call load_x dec hl CheckHorz: ld a,(ymm) call GetBlock call CheckTile ret CheckRight2: ld hl,(xmm) call load_x ld de,8 add hl,de jr CheckHorz2 CheckLeft2: ld hl,(xmm) call load_x dec hl CheckHorz2: ld a,(ymm) add a,11 call GetBlock call CheckTile ret CheckRight3: ld hl,(xmm) call load_x ld de,8 add hl,de jr CheckHorz3 CheckLeft3: ld hl,(xmm) call load_x dec hl CheckHorz3: ld a,(ymm) add a,6 call GetBlock call CheckTile ret GetBlock: ; Gets the block at (HL,A) -> A. HL = addr, B,C = coord srl h rr l srl h rr l srl h rr l ; Divide X with 8 ld b,l cp 64 jr c,OnScreen xor a OnScreen: srl a srl a srl a ; Divide Y with 8 ld c,a add hl,hl add hl,hl add hl,hl ld d,0 ld e,a add hl,de ; HL = x*8+y ld de,(curlvl) add hl,de ; Add HL with the pointer to the level data ld a,(hl) ret CheckTile: or a ret z cp 5 ret c xor a ret CheckItem: cp 5 jr z,got_life cp 6 jr z,got_tank ret got_life: ld a,(item) cp 1 ret nz inc a ld (item),a ld a,(lives) inc a ld (lives),a ret got_tank: ld a,(item) cp 1 ret nz inc a ld (item),a ld a,(tanks) inc a ld (tanks),a ret jump: push af ld a,(jchk) cp 2 jr z,no_jump or a jr nz,jump_up ld a,1 ld (jchk),a ld a,(ymm) sub 10 jr nc,jrem_not0 ld a,1 jrem_not0: ld (jrem),a jump_up: ld a,(jrem) ld b,a ld a,(ymm) cp b jr c,end_jump call CheckUp call z,CheckUp2 jr nz,end_jump ld a,(ymm) dec a ld (ymm),a jr no_jump end_jump: ld a,2 ld (jchk),a no_jump: pop af ret fall: push af ld a,(jchk) cp 1 jr z,no_fall call CheckDown call z,CheckDown2 jr nz,end_fall ld a,(ymm) inc a ld (ymm),a cp 52 call z,die jr no_fall end_fall: xor a ld (jchk),a no_fall: pop af ret CheckUp: ld a,(ymm) dec a jr CheckVert CheckDown: ld a,(ymm) add a,12 CheckVert: ld hl,(xmm) call load_x call GetBlock call CheckTile ret CheckUp2: ld a,(ymm) dec a jr CheckVert2 CheckDown2: ld a,(ymm) add a,12 CheckVert2: ld hl,(xmm) call load_x ld de,7 add hl,de call GetBlock call CheckTile ret shoot_sa: ld a,(xmm) ld (wx1),a ld a,(ymm) add a,4 ld (wy1),a ld a,1 ld (wchk1),a ld a,(enwpn) sub 4 ld (enwpn),a call check_spr call xor_char ret shoot_fr: ld a,(xmm) ld (wx1),a ld a,(ymm) ld (wy1),a call xor_wpn1 ld a,(wy1) add a,4 ld (wy1),a call xor_wpn1 ld a,(wy1) add a,4 ld (wy1),a ld a,1 ld (wchk1),a ld a,(enwpn) sub 4 ld (enwpn),a call check_spr call xor_char ret shoot_md: ld a,(ymm) inc a ld (wy1),a ld a,(dir) or a ld a,(xmm) jr z,smd_left add a,8 jr smd_right smd_left: sub 8 smd_right: ld (wx1),a ld a,1 ld (wchk1),a ld a,(enwpn) sub 4 ld (enwpn),a ret shoot_se: ld a,(bchk) ; restrictions on using top secret weapon or a ret nz ld a,(echk) or a ret z cp 3 ret z ld a,(ymm) cp 26 ret c ld a,(lives) cp 3 ret c ld a,(tanks) cp 4 ret c call won ; effect is beating the current part of the level if requirements are met xor a ld (enwpn),a ret shoot: ld a,(wchk) or a ret nz ld a,(wpn) or a jr z,no_check_enwpn ld a,(enwpn) ; don't shoot if no weapon energy left or a ret z no_check_enwpn: ld a,(dir) ; make sure you aren't too close to edge of screen or a jr z,try_left ld a,(xmm) cp 80 ret nc jr shoot_cont try_left: ld a,(xmm) cp 8 ret c shoot_cont: ld a,(wpn) cp 3 jr z,shoot_md cp 5 jr z,shoot_se cp 7 jp z,shoot_fr cp 8 jp z,shoot_sa ld a,1 ld (wchk),a ld a,(wpn) or a jr z,no_dec_enwpn ld a,(enwpn) dec a ld (enwpn),a no_dec_enwpn: ld a,(wchk1) ; check for bullet #1 or a ; if it doesn't exist, it does now jr z,store_shot1 ld a,(wchk2) ; check for bullet #2 or a ; if it doesn't exist, it does now jr z,store_shot2 ld a,(wchk3) ; check for bullet #3 or a ; if it doesn't exist, it does now ret nz ld a,(ymm) ; initialize shot #3 add a,5 ld (wy3),a ld a,(dir) ld (wdir3),a or a jr z,shoot_left3 ld a,(xmm) add a,8 ld b,a add a,12 jr shoot_init3 shoot_left3: ld a,(xmm) sub 8 ld b,a sub 12 shoot_init3: res 0,a ld (wrem3),a ld a,b ld (wx3),a ld a,1 ld (wchk3),a ret store_shot2: ld a,(ymm) ; initialize shot #2 add a,5 ld (wy2),a ld a,(dir) ld (wdir2),a or a jr z,shoot_left2 ld a,(xmm) add a,8 ld b,a add a,24 jr shoot_init2 shoot_left2: ld a,(xmm) sub 8 ld b,a sub 24 shoot_init2: res 0,a ld (wrem2),a ld a,b ld (wx2),a ld a,1 ld (wchk2),a ret store_shot1: ld a,(ymm) ; initialize shot #1 add a,5 ld (wy1),a ld a,(dir) ld (wdir1),a or a jr z,shoot_left1 ld a,(xmm) add a,8 ld b,a add a,24 jr shoot_init1 shoot_left1: ld a,(xmm) sub 8 ld b,a sub 24 shoot_init1: res 0,a ld (wrem1),a ld a,b ld (wx1),a ld a,1 ld (wchk1),a ret shot3_move: call xor_wpn3 ld a,(xmm) ld b,a ld a,(wx3) cp 4 jr c,sm_end3 cp 87 jr nc,sm_end3 res 0,a cp b jr z,sm_end3 ld b,a ld a,(wpn) cp 1 jr z,sm_short3 cp 2 jr z,sm_short3 cp 6 jr z,sm_short3 sm_cont3: ld a,(wdir3) or a ld a,(wpn) jr z,sm_left3 inc b inc b or a jr z,smr_two3 cp 4 jr z,smr_two3 cp 6 jr z,smr_two3 jr sm_store3 smr_two3: inc b jr sm_store3 sm_left3: dec b dec b or a jr z,sml_two3 cp 4 jr z,sml_two3 cp 6 jr z,sml_two3 sml_two3: dec b sm_store3: ld a,b ld (wx3),a ret sm_short3: ld a,(wrem3) res 0,a sub b jr nz,sm_cont3 ld a,(wpn) cp 6 jr z,sm_chg3 sm_end3: xor a ; shot is off the screen ld (wchk3),a ret sm_chg3: ld a,(wdir3) ; reverse dir shot #3 is moving inc a and $01 ld (wdir3),a jr sm_cont3 shot2_move: call xor_wpn2 ld a,(xmm) ld b,a ld a,(wx2) cp 4 jr c,sm_end2 cp 87 jr nc,sm_end2 res 0,a cp b jr z,sm_end2 ld b,a ld a,(wpn) cp 1 jr z,sm_short2 cp 2 jr z,sm_short2 cp 6 jr z,sm_short2 sm_cont2: ld a,(wdir2) or a ld a,(wpn) jr z,sm_left2 inc b inc b or a jr z,smr_two2 cp 4 jr z,smr_two2 cp 6 jr z,smr_two2 jr sm_store2 smr_two2: inc b jr sm_store2 sm_left2: dec b dec b or a jr z,sml_two2 cp 4 jr z,sml_two2 cp 6 jr z,sml_two2 sml_two2: dec b sm_store2: ld a,b ld (wx2),a ret sm_short2: ld a,(wrem2) res 0,a sub b jr nz,sm_cont2 ld a,(wpn) cp 6 jr z,sm_chg2 sm_end2: xor a ; shot is off the screen ld (wchk2),a ret sm_chg2: ld a,(wdir2) ; reverse dir shot #2 is moving inc a and $01 ld (wdir2),a jr sm_cont2 ssa_move: call check_spr call xor_char ssam_loop: ld a,(wx1) inc a ld (wx1),a call xor_wpn1 call fastcopys call xor_wpn1 ld a,(wx1) cp 88 jr nz,ssam_loop ssam_loop2: ld a,(wx1) dec a ld (wx1),a call xor_wpn1 call fastcopys call xor_wpn1 ld a,(wx1) or a jr nz,ssam_loop2 ssam_loop3: ld a,(wx1) inc a ld (wx1),a call xor_wpn1 call fastcopys call xor_wpn1 ld a,(xmm) ld b,a ld a,(wx1) cp b jr nz,ssam_loop3 xor a ld (wchk1),a ld a,(echk) or a jr z,ssam_bchk cp 3 jr z,ssam_bchk ld a,(ye) ld b,a ld a,(wy1) sub 7 cp b ret nc add a,10 cp b ret c xor a ld a,(ene) or a sub 2 jr nc,sahite_nokill xor a sahite_nokill: ld (ene),a or a ret nz ld a,3 ld (echk),a ret ssam_bchk: ld a,(bchk) or a ret z ld a,(yb) ld b,a ld a,(wy1) sub 11 cp b ret nc add a,14 cp b ret c call dam7_or1 ld a,(enb) or a sub 1 jr nc,sahitb_nokill xor a sahitb_nokill: ld (enb),a ret nz call won ret sfr_move: ld a,(wy1) sub 4 ld (wy1),a call xor_wpn1 ld a,(wy1) sub 4 ld (wy1),a call xor_wpn1 call short_delay xor a ld (wchk1),a call check_spr call xor_char ld a,(echk) or a jr z,sfrm_bchk cp 3 jr z,sfrm_bchk ld a,(xe) ld b,a ld a,(wx1) sub 11 cp b ret nc add a,22 cp b ret c ld a,(ye) ld b,a ld a,(wy1) sub 7 cp b ret nc add a,10 cp b ret c xor a ld a,(ene) or a sub 2 jr nc,frhite_nokill xor a frhite_nokill: ld (ene),a or a ret nz ld a,3 ld (echk),a ret sfrm_bchk: ld a,(bchk) or a ret z ld a,(xb) ld b,a ld a,(wx1) sub 11 cp b ret nc add a,22 cp b ret c ld a,(yb) ld b,a ld a,(wy1) sub 11 cp b ret nc add a,14 cp b ret c call dam7_or1 ld a,(enb) or a sub 1 jr nc,frhitb_nokill xor a frhitb_nokill: ld (enb),a ret nz call won ret smd_move: call short_delay xor a ld (wchk1),a ld a,(echk) or a jr z,smdm_bchk cp 3 jr z,smdm_bchk call xor_en ld a,3 ld (echk),a xor a ld (ecount),a smdm_bchk: ld a,(bchk) or a ret z call dam7_or1 ld a,(enb) or a sub 1 jr nc,mdhitb_nokill xor a mdhitb_nokill: ld (enb),a ret nz call won ret shot1_move: call xor_wpn1 ld a,(wpn) cp 3 jr z,smd_move cp 7 jp z,sfr_move cp 8 jp z,ssa_move ld a,(xmm) ld b,a ld a,(wx1) cp 4 jr c,sm_end1 cp 87 jr nc,sm_end1 res 0,a cp b jr z,sm_end1 ld b,a ld a,(wpn) cp 1 jr z,sm_short1 cp 2 jr z,sm_short1 cp 6 jr z,sm_short1 sm_cont1: ld a,(wdir1) or a ld a,(wpn) jr z,sm_left1 inc b inc b or a jr z,smr_two1 cp 4 jr z,smr_two1 cp 6 jr z,smr_two1 jr sm_store1 smr_two1: inc b jr sm_store1 sm_left1: dec b dec b or a jr z,sml_two1 cp 4 jr z,sml_two1 cp 6 jr z,sml_two1 sml_two1: dec b sm_store1: ld a,b ld (wx1),a ret sm_short1: ld a,(wrem1) res 0,a sub b jr nz,sm_cont1 ld a,(wpn) cp 6 jr z,sm_chg1 sm_end1: xor a ; shot is off the screen ld (wchk1),a ret sm_chg1: ld a,(wdir1) ; reverse dir shot #1 is moving inc a and $01 ld (wdir1),a jr sm_cont1 inc_wchk: ; lets you shoot again inc a cp 8 jr nz,keep_wchk xor a keep_wchk: ld (wchk),a ret die: call short_delay ld a,(lives) dec a ld (lives),a ld a,1 ld (death),a ret won: ld a,1 ld (win),a ld a,(bchk) ; check for boss or a ret z ld a,(boss) ; see if that boss was the spaceship cp 5 ret nz ld a,2 ; if so, set win=2 ld (win),a ret s1_dec: ld a,(wx1) dec a ld (wx1),a ld a,(wrem1) dec a ld (wrem1),a ret s2_dec: ld a,(wx2) dec a ld (wx2),a ld a,(wrem2) dec a ld (wrem2),a ret s3_dec: ld a,(wx3) dec a ld (wx3),a ld a,(wrem3) dec a ld (wrem3),a ret scroll: bcall(_grbufclr) ld a,(tempscr) inc a cp 8 jr nz,scroll_cont ld a,(xscr) inc a ld (xscr),a xor a scroll_cont: ld (tempscr),a ld a,(wchk1) or a call nz,s1_dec ld a,(wchk2) or a call nz,s2_dec ld a,(wchk3) or a call nz,s3_dec ld a,(echk) or a call nz,next_en ld a,(echk) or a ret z cp 3 ret z ld a,(xe) ; decrease x-coord of enemy dec a ld (xe),a or a call z,en_dead ret ShowLevel: ld hl,(xscr) add hl,hl add hl,hl add hl,hl push hl pop de ld hl,(curlvl) add hl,de ld bc,0 RepShowLevel: ; displays the current full screen of the level ld a,(hl) cp 5 call nc,item_init inc hl push hl ld h,0 ld l,a add hl,hl add hl,hl add hl,hl ld de,lvlspr add hl,de push bc ld a,(tempscr) ld d,a ld a,b sub d jr c,skip_8x8 ld (x2),a ld a,c ld (y2),a ld (smlspr),hl call xor_8x8 skip_8x8: pop bc pop hl ld a,c add a,8 ld c,a cp 64 jr nz,RepShowLevel ld c,0 ld a,b add a,8 ld b,a cp 96 jr nz,RepShowLevel ret item_init: ld d,a cp 7 jr nc,t_init ld a,(item) cp 2 jr z,no_item_init ld a,1 ld (item),a ld a,d ret no_item_init: xor a ; replace item sprite with blank sprite ret t_init: ld a,(echk) ; check for existing enemy or a jr nz,no_en_init ld hl,iup ; initialize enemy variables xor a ld (edir),a ld (ecount),a ld (ecount2),a inc a inc a ld (ene),a ld a,d cp 9 ld a,1 jr z,i_init ld a,3 ld (ene),a dec a ld hl,tleft i_init: ld (echk),a ld (enspr),hl ld a,b ld (xe),a ld a,c ld (ye),a no_en_init: xor a ; replace enemy sprite with blank sprite ret load_x: ; loads x location (input as hl) into hl, accounting for scrolling push hl ld hl,(xscr) add hl,hl add hl,hl add hl,hl pop de add hl,de push hl ld hl,(tempscr) pop de add hl,de ret feet_inc: ; feet changes from 0 to 1 to 2 to 3 to 0 ld a,(feet) inc a cp 4 jr nz,store_feet xor a store_feet: ld (feet),a ret sub_screen: push af bcall(_clrlcdfull) bcall(_grbufclr) call tiny_delay xor a ld (wchk1),a ld (wchk2),a ld (wchk3),a ld a,(wpn) or a jr z,ss_cont cp 1 jr z,en_an cp 2 jr z,en_ma cp 3 jr z,en_md cp 4 jr z,en_do cp 5 jr z,en_se cp 6 jr z,en_po cp 7 jr z,en_fr cp 8 jr z,en_sa cp 9 jr z,en_mi en_an: ld a,(enwpn) ld (enan),a jr ss_cont en_ma: ld a,(enwpn) ld (enma),a jr ss_cont en_md: ld a,(enwpn) ld (enmd),a jr ss_cont en_do: ld a,(enwpn) ld (endo),a jr ss_cont en_se: ld a,(enwpn) ld (ense),a jr ss_cont en_po: ld a,(enwpn) ld (enpo),a jr ss_cont en_fr: ld a,(enwpn) ld (enfr),a jr ss_cont en_sa: ld a,(enwpn) ld (ensa),a jr ss_cont en_mi: ld a,(enwpn) ld (enmi),a ss_cont: ld a,28 ld (x2),a ld a,53 ld (y2),a ld hl,tank ld (smlspr),hl call xor_8x8 ld a,55 ld (x2),a ld hl,head ld (smlspr),hl call xor_8x8 ld hl,ss_cont_lindat call draw xor a ld (x2),a inc a ld (y2),a ld hl,pwdot ld (smlspr),hl ss_loop_new: call xor_8x8 call fastcopys ld a,(lvldone) bit 0,a jr z,ss_line1 ld d,16 ld e,15 push af ld a,(enan) add a,17 ld h,a ld l,15 ld a,1 call fastline pop af ss_line1: bit 1,a jr z,ss_line2 ld d,16 ld e,25 push af ld a,(enma) add a,17 ld h,a ld l,25 ld a,1 call fastline pop af ss_line2: bit 2,a jr z,ss_line3 ld d,16 ld e,35 push af ld a,(enmd) add a,17 ld h,a ld l,35 ld a,1 call fastline pop af ss_line3: bit 3,a jr z,ss_line4 ld d,16 ld e,45 push af ld a,(endo) add a,17 ld h,a ld l,45 ld a,1 call fastline pop af ss_line4: bit 4,a jr z,ss_line5 ld d,63 ld e,15 push af ld a,(enpo) add a,64 ld h,a ld l,15 ld a,1 call fastline pop af ss_line5: bit 5,a jr z,ss_line6 ld d,63 ld e,5 push af ld a,(ense) add a,64 ld h,a ld l,5 ld a,1 call fastline ld d,63 ld e,25 ld a,(enfr) add a,64 ld h,a ld l,25 ld a,1 call fastline pop af ss_line6: bit 6,a jr z,ss_line7 ld d,63 ld e,35 push af ld a,(ensa) add a,64 ld h,a ld l,35 ld a,1 call fastline pop af ss_line7: bit 7,a jr z,ss_line_done ld d,63 ld e,45 ld a,(enmi) add a,64 ld h,a ld l,45 ld a,1 call fastline ss_line_done: ld d,16 ld e,5 ld a,(enp) add a,17 ld h,a ld l,5 ld a,1 call fastline call fastcopys ld a,(lvldone) bit 0,a jr z,ss_bit1 ld de,12*256+7 ld hl,an call setvputs ss_bit1: bit 1,a jr z,ss_bit2 ld de,22*256+7 ld hl,ma call setvputs ss_bit2: bit 2,a jr z,ss_bit3 ld de,32*256+7 ld hl,md call setvputs ss_bit3: bit 3,a jr z,ss_bit4 ld de,42*256+7 ld hl,do call setvputs ss_bit4: bit 4,a jr z,ss_bit5 ld de,12*256+54 ld hl,po call setvputs ss_bit5: bit 5,a jr z,ss_bit6 ld de,22*256+54 ld hl,fr call setvputs ld de,2*256+54 ld hl,se call setvputs ss_bit6: bit 6,a jr z,ss_bit7 ld de,32*256+54 ld hl,sa call setvputs ss_bit7: bit 7,a jr z,ss_loop_init ld de,42*256+54 ld hl,mi call setvputs ss_loop_init: ld de,2*256+7 ld hl,p call setvputs ld a,(tanks) bcall(_setxxop1 ld hl,54*256+40 ld (pencol),hl ld a,1 bcall(_dispop1a) ld a,(lives) bcall(_setxxop1) ld hl,54*256+67 ld (pencol),hl ld a,1 bcall(_dispop1a) call xor_8x8 ss_loop: bcall(_getcsc) cp kUp jp z,ss_up cp kDown jp z,ss_down cp kLeft jp z,ss_horz cp kRight jp z,ss_horz cp k2nd jp z,ss_tank cp kMode jp z,ss_mode cp kYEq jr nz,ss_loop ld hl,wpp ld a,(lvldone) ld b,a ld a,(x2) or a ld a,(y2) jr z,wpn_left cp 1 jr z,ss_se cp 11 jp z,ss_po cp 21 jp z,ss_fr cp 31 jp z,ss_sa jp ss_mi wpn_left: ld c,0 ld hl,wpp cp 1 jp z,ss_exit cp 11 jr z,ss_an cp 21 jr z,ss_ma cp 31 jr z,ss_md jr ss_do ss_an: bit 0,b jr z,ss_loop ld c,1 ld a,(enan) ld (enwpn),a ld hl,wpan jp ss_exit ss_ma: bit 1,b jr z,ss_loop ld c,2 ld a,(enma) ld (enwpn),a ld hl,wpma jr ss_exit ss_md: bit 2,b jp z,ss_loop ld c,3 ld a,(enmd) ld (enwpn),a ld hl,wpmd jr ss_exit ss_do: bit 3,b jp z,ss_loop ld c,4 ld a,(endo) ld (enwpn),a ld hl,wpdo jr ss_exit ss_se: bit 5,b jp z,ss_loop ld c,5 ld a,(ense) ld (enwpn),a ld hl,wpse jr ss_exit ss_po: bit 4,b jp z,ss_loop ld c,6 ld a,(enpo) ld (enwpn),a ld hl,wppo jr ss_exit ss_fr: bit 5,b jp z,ss_loop ld c,7 ld a,(enfr) ld (enwpn),a ld hl,wpfr jr ss_exit ss_sa: bit 6,b jp z,ss_loop ld c,8 ld a,(ensa) ld (enwpn),a ld hl,wpsa jr ss_exit ss_mi: bit 7,b jp z,ss_loop ld c,9 ld a,(enmi) ld (enwpn),a ld hl,wpmi ss_exit: ld a,c ld (wpn),a ld (wpnspr),hl bcall(_clrlcdfull) bcall(_grbufclr) call ShowLevel pop af call tiny_delay ret ss_mode: pop bc ; pop to something other than af so it remembers that MODE has been pressed ret ss_up: ld a,(y2) cp 1 jr z,ss_vert sub 10 ld (y2),a jp ss_loop_new ss_down: ld a,(y2) cp 41 jr z,ss_vert add a,10 ld (y2),a jp ss_loop_new ss_vert: ld b,a ld a,42 sub b ld (y2),a jp ss_loop_new ss_horz: ld a,(x2) ld b,a ld a,47 sub b ld (x2),a jp ss_loop_new ss_tank: ld a,(tanks) or a jp z,ss_loop_new dec a ld (tanks),a ld a,28 ld (enp),a jp ss_loop_new xor_char: ld ix,(curpic) ld b,12 ld a,(ymm) ld l,a ld a,(xmm) call isprite ret check_spr: ld a,(dir) or a jr z,check_spr_l check_spr_r: ld hl,mmhr ld a,(hchk) or a jr nz,found_spr ld a,(ymm) add a,12 call CheckVert jr c,not_jump_r ld hl,mmjr ld a,(jchk) or a jr nz,found_spr not_jump_r: ld hl,mmwr ld a,(wchk) or a jr nz,found_spr ret check_spr_l: ld hl,mmhl ld a,(hchk) or a jr nz,found_spr ld a,(ymm) add a,12 call CheckVert jr c,not_jump_l ld hl,mmjl ld a,(jchk) or a jr nz,found_spr not_jump_l: ld hl,mmwl ld a,(wchk) or a jr nz,found_spr ret found_spr: ld (curpic),hl ret find_spr: ld a,(dir) or a jr z,left_spr ld hl,mmsr jr found_spr left_spr: ld hl,mmsl jr found_spr t_move: call xor_en call check_en_dist ld a,(edir) or a ld a,(xe) jr z,t_move_l inc a jr t_move_r t_move_l: dec a or a call z,en_dead t_move_r: ld (xe),a ret i_move: call xor_en call check_en_dist ld a,(edir) or a ld a,(ye) jr z,i_move_u inc a jr i_move_d i_move_u: dec a i_move_d: ld (ye),a ret ti_check: ld a,(echk) cp 3 jr nz,tic_cont xor a ld (echk),a tic_cont: ld b,46 ld c,46 ld a,(bcount) inc a ld (bcount),a cp 50 ld a,7 call z,item_init ld a,(bcount) cp 100 ld a,9 call z,item_init ld a,(bcount) cp 100 ret nz xor a ld (bcount),a ret ship_check: ld a,(bcount) inc a cp 50 jr z,ship_laser ld (bcount),a ret ship_laser: xor a ld (bcount),a ld b,1 call xor_laser call short_delay ld a,(ymm) cp 38 call c,die ld b,0 call xor_laser ret boss_move: call xor_boss ld a,(boss) or a jr z,ti_check cp 5 jr z,ship_check ld a,(bjchk) or a jr nz,boss_jump ld a,(bdir) or a ld a,(xb) jr z,boss_move_l inc a cp 76 jr boss_move_r boss_move_l: dec a cp 56 boss_move_r: ld (xb),a jr z,boss_turn cp 66 call z,boss_shoot ret boss_turn: ld a,(bdir) ; reverse dir boss is moving ld b,a ld a,1 sub b ld (bdir),a ld a,2 ld (bjchk),a ret boss_jump: ld a,(bjchk) cp 1 ld a,(yb) jr z,boss_fall dec a cp 34 jr boss_jump_end boss_fall: inc a cp 44 boss_jump_end: ld (yb),a ret nz ld a,(bjchk) dec a ld (bjchk),a ret bshoot_sa: ld a,(xb) ld (bwx),a call xor_boss ret bshoot_fr: ld a,(xb) ld (bwx),a ret bshoot_md: ld a,(xb) sub 8 ld (bwx),a ret boss_shoot: ld a,(bwchk) or a ret nz inc a ld (bwchk),a ld a,(boss) cp 3 jr z,bshoot_md cp 7 jr z,bshoot_fr cp 8 jr z,bshoot_sa ld a,58 ld (bwx),a ret bssa_move: call xor_boss call check_spr call xor_char bssam_loop: ld a,(bwx) dec a ld (bwx),a call xor_bwpn call fastcopys call xor_bwpn ld a,(bwx) or a jr nz,bssam_loop bssam_loop2: ld a,(bwx) inc a ld (bwx),a call xor_bwpn call fastcopys call xor_bwpn ld a,(bwx) cp 88 jr nz,bssam_loop2 bssam_loop3: ld a,(bwx) dec a ld (bwx),a call xor_bwpn call fastcopys call xor_bwpn ld a,(xb) ld b,a ld a,(bwx) cp b jr nz,bssam_loop3 xor a ld (bwchk),a call check_spr call xor_char ld a,(ymm) ld b,a ld a,37 cp b ret nc add a,16 cp b ret c ld a,(enp) or a sub 4 jr nc,bssam_nokill xor a bssam_nokill: ld (enp),a ret bsfr_move: call check_spr call xor_char call xor_boss call xor_bwpn call fastcopys call xor_char call xor_boss call xor_bwpn call short_delay xor a ld (bwchk),a ld a,(xmm) ld b,a ld a,55 cp b ret nc add a,22 cp b ret c ld a,(ymm) ld b,a ld a,33 cp b ret nc add a,11 cp b ret c ld a,(enp) or a sub 4 jr nc,bsfrm_nokill xor a bsfrm_nokill: ld (enp),a ret bsmd_move: call short_delay ld a,(enp) or a sub 4 jr nc,bsmdm_nokill xor a bsmdm_nokill: ld (enp),a xor a ld (bwchk),a ret boss_shot_move: call xor_bwpn ld a,(boss) cp 8 jp z,bssa_move cp 3 jr z,bsmd_move cp 7 jr z,bsfr_move ld a,(xb) ld b,a ld a,(bwx) cp 2 jr c,bsm_end cp b jr z,bsm_end ld b,a bsm_cont: dec b dec b ld a,(boss) cp 4 jr nz,bsm_store dec b bsm_store: ld a,b ld (bwx),a ret bsm_end: xor a ; boss's shot is off the screen ld (bwchk),a ret check_en_dist: ; check distance enemy has moved and turn around if necessary ld a,(ecount) inc a cp 33 call z,en_turn ld (ecount),a ret en_turn: ld hl,(enspr) ld de,8 ld a,(edir) or a jr z,en_turn_r sbc hl,de dec a jr en_turn_l en_turn_r: add hl,de inc a en_turn_l: ld (enspr),hl ld (edir),a xor a ret en_dead: ; enemy is now dead ld a,3 ld (echk),a xor a ld (ecount),a ret next_en: ; check if previous enemy is clear so next enemy can initialize ld a,(ecount2) inc a ld (ecount2),a cp 96 ret nz xor a ld (echk),a ret xor_en: ld ix,(enspr) ld b,8 ld a,(ye) ld l,a ld a,(xe) call isprite ret xor_corners: ld hl,uprlft ld (smlspr),hl call xor_8x8 ld a,(x2) add a,22 ld (x2),a ld hl,uprrt ld (smlspr),hl call xor_8x8 ld a,(y2) add a,12 ld (y2),a ld hl,lwrrt ld (smlspr),hl call xor_8x8 ld a,(x2) sub 22 ld (x2),a ld hl,lwrlft ld (smlspr),hl call xor_8x8 ld a,(y2) sub 12 ld (y2),a ret xor_8x8: ld ix,(smlspr) ld b,8 ld a,(y2) ld l,a ld a,(x2) call isprite ret xor_wpn1: ld ix,(wpnspr) ld b,4 ld a,(wy1) ld l,a ld a,(wx1) call isprite ret xor_wpn2: ld ix,(wpnspr) ld b,4 ld a,(wy2) ld l,a ld a,(wx2) call isprite ret xor_wpn3: ld b,4 ld a,(wy3) ld l,a ld a,(wx3) ld ix,(wpnspr) call isprite ret xor_bwpn: ld b,4 ld l,49 ld a,(bwx) ld ix,(bwspr) call isprite ret tiny_delay: ld b,20 jr del_loop short_delay: ld b,50 jr del_loop long_delay: call delay med_delay: ld b,100 jr del_loop delay: ld b,200 del_loop: halt halt djnz del_loop ret disp_boss: ld (bosspic),hl bcall(_clrlcdfull) bcall(_grbufclr) xor a ld (x2),a ld a,16 ld (y2),a ld hl,bint ld (smlspr),hl ld b,12 draw1: push bc call xor_8x8 ld a,(x2) add a,8 ld (x2),a pop bc djnz draw1 ld a,0 ld (x2),a ld a,40 ld (y2),a ld hl,bint ld (smlspr),hl ld b,12 draw2: push bc call xor_8x8 ld a,(x2) add a,8 ld (x2),a pop bc djnz draw2 call xor_boss call fastcopys ret xor_boss: ld b,12 ld a,(yb) ld l,a ld a,(xb) ld ix,(bosspic) call isprite ret no_an: ld hl,no_an_lindat call draw ret no_ma: ld hl,no_ma_lindat call draw ret no_md: ld hl,no_md_lindat call draw ret no_do: ld hl,no_do_lindat call draw ret no_po: ld hl,no_po_lindat call draw ret no_fr: ld hl,no_fr_lindat call draw ret no_sa: ld hl,no_sa_lindat call draw ret no_mi: ld hl,no_mi_lindat call draw ret you_got: bcall(_clrlcdfull) bcall(_grbufclr) ld hl,you_got_lindat call draw ld hl,35 ld (xmm),hl ld a,50 ld (ymm),a ld hl,mmsr ld (curpic),hl ld a,43 ld (wx1),a ld a,51 ld (wy1),a ld a,(boss) ld hl,wpmd cp 3 jr z,yg_cont ld hl,mmwr ld (curpic),hl ld a,55 ld (wx1),a ld a,55 ld (wy1),a ld a,(boss) ld hl,wpan cp 1 jr z,yg_cont ld hl,wpma cp 2 jr z,yg_cont ld hl,wpdo cp 4 jr z,yg_cont ld hl,wppo cp 6 jr z,yg_cont cp 9 ld hl,wpmi jr z,yg_cont push af ld a,35 ld (wx1),a ld a,54 ld (wy1),a call xor_char pop af ld hl,wpsa cp 8 jr z,yg_cont ld hl,wpfr ld (wpnspr),hl call xor_wpn1 ld a,50 ld (wy1),a call xor_wpn1 ld a,58 ld (wy1),a ld hl,wpfr yg_cont: ld (wpnspr),hl call xor_wpn1 call xor_char call fastcopys ld de,10*256+35 ld hl,yougot call setvputs ld a,(boss) cp 1 jr z,yg_an cp 2 jr z,yg_ma cp 3 jr z,yg_md cp 4 jr z,yg_do cp 6 jr z,yg_po cp 7 jr z,yg_fr cp 8 jr z,yg_sa jr yg_mi yg_an: ld de,20*256+28 ld hl,ygan call setvputs jr yg_loop yg_ma: ld de,20*256+25 ld hl,ygma call setvputs jr yg_loop yg_md: ld de,20*256+20 ld hl,ygmd call setvputs jr yg_loop yg_do: ld de,20*256+26 ld hl,ygdo call setvputs jr yg_loop yg_po: ld de,20*256+18 ld hl,ygpo call setvputs jr yg_loop yg_fr: ld de,20*256+31 ld hl,ygfr call setvputs ld de,30*256+12 ld hl,ygse call setvputs ld de,53*256+55 ld hl,se call setvputs jr yg_loop yg_sa: ld de,20*256+28 ld hl,ygsa call setvputs jr yg_loop yg_mi: ld de,20*256+28 ld hl,ygmi call setvputs yg_loop: bcall(_getcsc) cp kMode ret z cp kEnter jr nz,yg_loop ret draw_grid: bcall(_clrlcdfull) bcall(_grbufclr) ld hl,draw_grid_lindat call draw ret pw_text: ld de,1*256+31 ld hl,one call setvputs ld de,1*256+40 ld hl,two call setvputs ld de,1*256+49 ld hl,three call setvputs ld de,1*256+58 ld hl,four call setvputs ld de,1*256+67 ld hl,five call setvputs ld de,10*256+23 ld hl,a call setvputs ld de,19*256+23 ld hl,b call setvputs ld de,28*256+23 ld hl,c call setvputs ld de,37*256+23 ld hl,d call setvputs ld de,46*256+23 ld hl,e call setvputs ld de,56*256+32 ld hl,enter call setvputs ret show_pw: call draw_grid ld a,(tanks) ; find correct password dot for number of tanks ld b,1 or a jr z,spw_cont ld b,2 cp 1 jr z,spw_cont ld b,4 cp 2 jr z,spw_cont ld b,8 cp 3 jr z,spw_cont ld b,16 spw_cont: ld a,b ld (tankpw),a ld hl,pwdot ld (smlspr),hl ld a,(lvldone) bit 0,a jr z,no_an_dot ld a,28 jr an_dot no_an_dot: ld a,46 an_dot: ld (y2),a ld a,47 ld (x2),a call xor_8x8 ld a,(lvldone) bit 1,a jr z,no_ma_dot ld a,10 ld (y2),a ld a,38 jr ma_dot no_ma_dot: ld a,28 ld (y2),a ld a,65 ma_dot: ld (x2),a call xor_8x8 ld a,(lvldone) bit 2,a jr z,no_md_dot ld a,46 ld (y2),a ld a,65 jr md_dot no_md_dot: ld a,10 ld (y2),a ld a,56 md_dot: ld (x2),a call xor_8x8 ld a,(lvldone) bit 3,a jr z,no_do_dot ld a,37 ld (y2),a ld a,47 jr do_dot no_do_dot: ld a,46 ld (y2),a ld a,38 do_dot: ld (x2),a call xor_8x8 ld a,(lvldone) bit 4,a jr z,no_po_dot ld a,37 ld (y2),a ld a,29 jr po_dot no_po_dot: ld a,19 ld (y2),a ld a,65 po_dot: ld (x2),a call xor_8x8 ld a,(lvldone) bit 5,a jr z,no_fr_dot ld a,56 jr fr_dot no_fr_dot: ld a,29 fr_dot: ld (x2),a ld a,19 ld (y2),a call xor_8x8 ld a,(lvldone) bit 5,a jr z,no_se_dot ld a,46 ld (y2),a ld a,29 jr se_dot no_se_dot: ld a,28 ld (y2),a ld a,56 se_dot: ld (x2),a call xor_8x8 ld a,(lvldone) bit 6,a jr z,no_sa_dot ld a,38 jr sa_dot no_sa_dot: ld a,47 sa_dot: ld (x2),a ld a,19 ld (y2),a call xor_8x8 ld a,(lvldone) bit 7,a jr z,no_mi_dot ld a,28 ld (y2),a ld a,38 jr mi_dot no_mi_dot: ld a,37 ld (y2),a ld a,56 mi_dot: ld (x2),a call xor_8x8 tank_dot: ld a,(tankpw) ld b,a ld a,10 ld (y2),a ld a,47 ld (x2),a bit 0,b jr nz,tank_dot_found ld a,46 ld (y2),a ld a,56 ld (x2),a bit 1,b jr nz,tank_dot_found ld a,28 ld (y2),a ld a,29 ld (x2),a bit 2,b jr nz,tank_dot_found ld a,10 ld (y2),a ld a,65 ld (x2),a bit 3,b jr nz,tank_dot_found ld a,37 ld (y2),a ld a,38 ld (x2),a tank_dot_found: call xor_8x8 call fastcopys call pw_text show_pw_loop: bcall(_getcsc) cp kMode ret z cp kEnter jr nz,show_pw_loop ret enter_pw: xor a ld (anpw),a ld (mapw),a ld (mdpw),a ld (dopw),a ld (popw),a ld (frpw),a ld (sepw),a ld (sapw),a ld (mipw),a ld (tankpw),a call draw_grid ld hl,pwcurs ld (smlspr),hl ld a,10 ld (y2),a ld a,29 ld (x2),a ep_loop_new: call xor_8x8 call fastcopys call pw_text call xor_8x8 ep_loop: bcall(_getcsc) cp kLeft jr z,ep_left cp kRight jr z,ep_right cp kUp jr z,ep_up cp kDown jr z,ep_down cp k2nd jr z,ep_dot cp kEnter jp z,check_pw cp kMode ret z jr ep_loop ep_left: ld a,(x2) cp 29 jr z,ep_horz sub 9 ld (x2),a jr ep_loop_new ep_right: ld a,(x2) cp 65 jr z,ep_horz add a,9 ld (x2),a jr ep_loop_new ep_horz: ld b,a ld a,94 sub b ld (x2),a jr ep_loop_new ep_up: ld a,(y2) cp 10 jr z,ep_vert sub 9 ld (y2),a jr ep_loop_new ep_down: ld a,(y2) cp 46 jr z,ep_vert add a,9 ld (y2),a jr ep_loop_new ep_vert: ld b,a ld a,56 sub b ld (y2),a jr ep_loop_new ep_dot: ld hl,pwdot ld (smlspr),hl call xor_8x8 ld hl,pwcurs ld (smlspr),hl ld a,(y2) cp 10 jr z,rowa cp 19 jr z,rowb cp 28 jp z,rowc cp 37 jp z,rowd jp rowe rowa: ld a,(x2) cp 29 jr z,rowa_col1 cp 38 jr z,rowa_col2 cp 47 jr z,rowa_col3 cp 56 jr z,rowa_col4 jr rowa_col5 rowa_col1: ld a,(tankpw) bit 5,a set 5,a jp z,tankpw_done res 5,a jp tankpw_done rowa_col2: ld a,(mapw) bit 1,a set 1,a jr z,mapw_done res 1,a mapw_done: ld (mapw),a jp ep_loop_new rowa_col3: ld a,(tankpw) bit 0,a set 0,a jp z,tankpw_done res 0,a jp tankpw_done rowa_col4: ld a,(mdpw) bit 0,a set 0,a jr z,mdpw_done res 0,a mdpw_done: ld (mdpw),a jp ep_loop_new rowa_col5: ld a,(tankpw) bit 3,a set 3,a jp z,tankpw_done res 3,a jp tankpw_done rowb: ld a,(x2) cp 29 jr z,rowb_col1 cp 38 jr z,rowb_col2 cp 47 jr z,rowb_col3 cp 56 jr z,rowb_col4 jr rowb_col5 rowb_col1: ld a,(frpw) bit 0,a set 0,a jr z,frpw_done res 0,a frpw_done: ld (frpw),a jp ep_loop_new rowb_col2: ld a,(sapw) bit 1,a set 1,a jr z,sapw_done res 1,a sapw_done: ld (sapw),a jp ep_loop_new rowb_col3: ld a,(sapw) bit 0,a set 0,a jr z,sapw_done res 0,a jr sapw_done rowb_col4: ld a,(frpw) bit 1,a set 1,a jr z,frpw_done res 1,a jr frpw_done rowb_col5: ld a,(popw) bit 0,a set 0,a jr z,popw_done res 0,a popw_done: ld (popw),a jp ep_loop_new rowc: ld a,(x2) cp 29 jr z,rowc_col1 cp 38 jr z,rowc_col2 cp 47 jr z,rowc_col3 cp 56 jr z,rowc_col4 jr rowc_col5 rowc_col1: ld a,(tankpw) bit 2,a set 2,a jr z,tankpw_done res 2,a tankpw_done: ld (tankpw),a jp ep_loop_new rowc_col2: ld a,(mipw) bit 1,a set 1,a jr z,mipw_done res 1,a mipw_done: ld (mipw),a jp ep_loop_new rowc_col3: ld a,(anpw) bit 1,a set 1,a jp z,anpw_done res 1,a jp anpw_done rowc_col4: ld a,(sepw) bit 0,a set 0,a jp z,sepw_done res 0,a jp sepw_done rowc_col5: ld a,(mapw) bit 0,a set 0,a jp z,mapw_done res 0,a jp mapw_done rowd: ld a,(x2) cp 29 jr z,rowd_col1 cp 38 jr z,rowd_col2 cp 47 jr z,rowd_col3 cp 56 jr z,rowd_col4 jr rowd_col5 rowd_col1: ld a,(popw) bit 1,a set 1,a jp z,popw_done res 1,a jp popw_done rowd_col2: ld a,(tankpw) bit 4,a set 4,a jr z,tankpw_done res 4,a jr tankpw_done rowd_col3: ld a,(dopw) bit 1,a set 1,a jr z,dopw_done res 1,a dopw_done: ld (dopw),a jp ep_loop_new rowd_col4: ld a,(mipw) bit 0,a set 0,a jr z,mipw_done res 0,a jp mipw_done rowd_col5: ld a,(tankpw) bit 6,a set 6,a jp z,tankpw_done res 6,a jp tankpw_done rowe: ld a,(x2) cp 29 jr z,rowe_col1 cp 38 jr z,rowe_col2 cp 47 jr z,rowe_col3 cp 56 jr z,rowe_col4 jr rowe_col5 rowe_col1: ld a,(sepw) bit 1,a set 1,a jr z,sepw_done res 1,a sepw_done: ld (sepw),a jp ep_loop_new rowe_col2: ld a,(dopw) bit 0,a set 0,a jr z,dopw_done res 0,a jr dopw_done rowe_col3: ld a,(anpw) bit 0,a set 0,a jr z,anpw_done res 0,a anpw_done: ld (anpw),a jp ep_loop_new rowe_col4: ld a,(tankpw) bit 1,a set 1,a jp z,tankpw_done res 1,a jp tankpw_done rowe_col5: ld a,(mdpw) bit 1,a set 1,a jp z,mdpw_done res 1,a jp mdpw_done check_pw: ld a,(anpw) or a jr z,pw_error cp 3 jr z,pw_error ld a,(mapw) or a jr z,pw_error cp 3 jr z,pw_error ld a,(mdpw) or a jr z,pw_error cp 3 jr z,pw_error ld a,(dopw) or a jr z,pw_error cp 3 jr z,pw_error ld a,(popw) or a jr z,pw_error cp 3 jr z,pw_error ld a,(frpw) or a jr z,pw_error cp 3 jr z,pw_error ld a,(sepw) or a jr z,pw_error cp 3 jr z,pw_error ld a,(sapw) or a jr z,pw_error cp 3 jr z,pw_error ld a,(mipw) or a jr z,pw_error cp 3 jr z,pw_error ld a,(tankpw) ld b,0 cp 1 jp z,pw_good inc b cp 2 jp z,pw_good inc b cp 4 jp z,pw_good inc b cp 8 jp z,pw_good inc b cp 16 jp z,pw_good pw_error: bcall(_clrlcdfull) bcall(_grbufclr) ld hl,pw_error_lindat call draw call fastcopys ld de,10*256+20 ld hl,pwerr call setvputs ld de,40*256+30 ld hl,pwtry call setvputs ld de,47*256+33 ld hl,yes call setvputs ld de,54*256+31 ld hl,no call setvputs pe_loop: bcall(_getcsc) cp k2nd jp z,enter_pw cp kAlpha ret z cp kMode ret z jr pe_loop pw_good: ld a,b ld (tanks),a ld a,(lvldone) ld b,a ld a,(anpw) bit 1,a jr z,pg1 set 0,b pg1: ld a,(mapw) bit 1,a jr z,pg2 set 1,b pg2: ld a,(mdpw) bit 1,a jr z,pg3 set 2,b pg3: ld a,(dopw) bit 1,a jr z,pg4 set 3,b pg4: ld a,(popw) bit 1,a jr z,pg5 set 4,b pg5: ld a,(frpw) bit 1,a jr z,pg6 set 5,b pg6: ld a,(sapw) bit 1,a jr z,pg7 set 6,b pg7: ld a,(mipw) bit 1,a jr z,pg_done set 7,b pg_done: ld a,b ld (lvldone),a ret ship_init: ld a,(bchk) or a ret z ld hl,ship_init_lindat call draw ld a,56 ld (xb),a ld a,16 ld (yb),a ret xor_laser: ld hl,xor_laser_lindat call draw call check_spr call xor_char call xor_boss call fastcopys ld hl,xor_laser_lindat call draw call xor_char call xor_boss ret wpn_fill: ld a,28 ld (enp),a ld (enan),a ld (enma),a ld (enmd),a ld (endo),a ld (ense),a ld (enpo),a ld (enfr),a ld (ensa),a ld (enmi),a ld (enwpn),a ret draw_nrg: ld a,(bchk) or a call nz,draw_bnrg ld d,10 ld e,38 ld h,10 ld a,(enp) ld b,a ld a,37 sub b ld l,a ld a,1 call fastline ld a,(wpn) or a ret z ld d,12 ; draw weapon energy line ld e,38 ld h,12 ld a,(enwpn) ld b,a ld a,37 sub b ld l,a ld a,1 call fastline ret draw_bnrg: ld d,86 ld e,38 ld h,86 ld a,(enb) ld b,a ld a,37 sub b ld l,a ld a,1 call fastline ret check_ehitu: ld a,(echk) cp 3 ret z ld a,(wx1) ld d,a ld a,(wy1) ld e,a ld a,(wchk1) ld c,a or a call nz,check_white ld a,c ld (wchk1),a ld a,(wx2) ld d,a ld a,(wy2) ld e,a ld a,(wchk2) ld c,a or a call nz,check_white ld a,c ld (wchk2),a ld a,(wx3) ld d,a ld a,(wy3) ld e,a ld a,(wchk3) ld c,a or a call nz,check_white ld a,c ld (wchk3),a ld a,(xmm) ld b,a ld a,(xe) sub 7 cp b ret nc add a,14 cp b ret c ld a,(ymm) ld b,a ld a,(ye) sub 11 cp b ret nc add a,18 cp b ret c ld a,(enp) or a sub 1 jr nc,ehitu_nokill xor a ehitu_nokill: ld (enp),a ld a,1 ld (hchk),a ret check_bhitu: ld a,(wx1) ld d,a ld a,(wy1) ld e,a ld a,(wchk1) ld c,a or a call nz,check_whitb ld a,c ld (wchk1),a ld a,(wx2) ld d,a ld a,(wy2) ld e,a ld a,(wchk2) ld c,a or a call nz,check_whitb ld a,c ld (wchk2),a ld a,(wx3) ld d,a ld a,(wy3) ld e,a ld a,(wchk3) ld c,a or a call nz,check_whitb ld a,c ld (wchk3),a ld a,(boss) cp 5 jr z,check_shitu ld a,(xmm) ld b,a ld a,(xb) sub 7 cp b ret nc add a,14 cp b ret c ld a,(ymm) ld b,a ld a,(yb) sub 11 cp b ret nc add a,22 cp b ret c ld a,(enp) or a sub 7 jr nc,bhitu_nokill xor a bhitu_nokill: ld (enp),a ld a,1 ld (hchk),a ret check_shitu: ld a,(xmm) ld b,a ld a,28 cp b ret nc xor a ld (enp),a ld a,1 ld (hchk),a ret check_bwhitu: ld a,(xmm) ld b,a ld a,(bwx) sub 7 cp b ret nc add a,14 cp b ret c ld a,(ymm) ld b,a ld a,38 cp b ret nc add a,14 cp b ret c ld a,(enp) or a sub 2 jr nc,bwhitu_nokill xor a bwhitu_nokill: ld (enp),a ld a,1 ld (hchk),a ret check_white: ld a,(xe) ld b,a ld a,d sub 7 cp b ret nc add a,14 cp b ret c ld a,(ye) ld b,a ld a,e sub 7 cp b ret nc add a,10 cp b ret c ld c,0 ld a,(ene) or a sub 1 jr nc,white_nokill xor a white_nokill: ld (ene),a or a ret nz ld a,3 ld (echk),a ret check_whitb: ld a,(boss) cp 5 jr z,check_whits ld a,(xb) ld b,a ld a,d sub 7 cp b ret nc add a,14 cp b ret c ld a,(yb) ld b,a ld a,e sub 11 cp b ret nc add a,14 cp b ret c ld c,0 call dam7_or1 ld a,(enb) or a sub 1 jr nc,whitb_nokill xor a whitb_nokill: ld (enb),a ret nz call won ret check_whits: ld b,35 ld a,d sub 7 cp b ret nc add a,14 cp b ret c ld b,42 ld a,e cp b ret nc add a,10 cp b ret c ld c,0 call dam7_or1 ld a,(enb) or a sub 1 jr nc,whits_nokill xor a whits_nokill: ld (enb),a or a ret nz call won ret dam7_or1: ld a,(wpn) or a ret z cp 5 ret z cp 1 jr z,an_on_po cp 2 jr z,ma_on_do cp 3 jr z,md_on_sa cp 4 jr z,do_on_fr cp 6 jr z,po_on_md cp 7 jr z,fr_on_an cp 8 jr z,sa_on_mi cp 9 jr z,mi_on_ma ret an_on_po: ld a,(boss) cp 5 jr z,damage7 cp 6 ret nz jr damage7 ma_on_do: ld a,(boss) or a jr z,damage7 cp 4 ret nz jr damage7 md_on_sa: ld a,(boss) cp 8 ret nz jr damage7 do_on_fr: ld a,(boss) cp 7 ret nz jr damage7 po_on_md: ld a,(boss) cp 3 ret nz jr damage7 fr_on_an: ld a,(boss) cp 1 ret nz jr damage7 sa_on_mi: ld a,(boss) cp 9 ret nz jr damage7 mi_on_ma: ld a,(boss) cp 2 ret nz damage7: ld a,(enb) or a sub 6 jr nc,dam7_nokill call won xor a dam7_nokill: ld (enb),a ret thrown_back: xor a ld (hchk),a ld hl,(xmm) call load_x or a ld de,8 sbc hl,de push hl push hl call CheckHorz pop hl call z,CheckHorz2 pop hl call z,CheckHorz3 jr nz,thrown_short ld a,(xmm) sub 8 ld (xmm),a ret thrown_short: ld hl,(xmm) call load_x push hl srl h rr l srl h rr l srl h rr l ; divide x by 8 add hl,hl add hl,hl add hl,hl ; multiply x by 8 push hl pop de pop hl or a sbc hl,de push hl ld hl,(xmm) pop de or a sbc hl,de ld (xmm),hl ret draw_text: ;hl = pointer to text info ld a,(hl) ld e,a inc hl push de push hl bcall(_clrlcdfull) bcall(_grbufclr) ld a,1 pop hl pop de draw_txt_loop: push af push de push hl call centertext pop hl pop de pop af add a,6 cp 59 call nc,reseta_draw push af ld a,$00 ld b,255 cpir pop af dec e jr nz,draw_txt_loop call clrwait ret reseta_draw: push af push de push hl dec e call nz,clrwait inc e pop hl pop de pop af ld a,1 ret clrwait: call wait bcall(_clrlcdfull) bcall(_grbufclr) ret wait: bcall(_getcsc) or a jr z,wait ret quit_force: draw: push af push bc push de ld a,(hl) ld b,a inc hl ld a,(hl) inc hl drawloop: ;hl = pointer to line data ;a = draw mode (0=off 1=on 2=xor 3=pattern) ;b = number of lines push bc ld c,(hl) inc hl ld b,(hl) inc hl ld e,(hl) inc hl ld d,(hl) inc hl push af push hl push bc push de pop de pop hl call fastline pop hl pop af pop bc djnz drawloop pop de pop bc pop af ret Description: .db "Mario Demo 83+",0 prog_start: bcall(_clrlcdfull) bcall(_grbufclr) xor a ; no levels completed ld (lvldone),a ld (tanks),a ; 0 energy tanks inc a ld (tankpw),a ; 0 energy tanks (for password system) inc a inc a ld (lives),a ; 3 lives ld a,17 ld (x2),a ld a,43 ld (y2),a ld hl,pwdot ld (smlspr),hl ld a,(y2) cp 43 jr z,cb_init cp kMode ; exit game if MODE was pressed on enter password screen ret z cb_init: ld a,33 ld (x2),a ld a,22 ld (y2),a bcall(_clrlcdfull) boss_loop: call xor_corners call fastcopys call xor_corners jr find_boss bcall(_getcsc) ; clear the keybuffer bcall(_grbufclr) bcall(_clrlcdfull) ret find_boss: ld a,(y2) cp 1 jr z,row1 cp 22 jr z,row2 ld a,7 jr found_row row2: ld a,4 jr found_row row1: ld a,1 found_row: ld (boss),a ld a,(x2) cp 64 jr z,add2 cp 33 jr nz,add0 ld a,(boss) inc a jr add_done add0: ld a,(boss) jr add_done add2: ld a,(boss) add a,2 add_done: ld (boss),a ld a,44 ld (xb),a ld a,27 ld (yb),a ld a,(boss) cp 1 jr z,an_init an_init: ld a,(lvldone) bit 0,a jp c,boss_loop ld hl,ansl call disp_boss ld hl,wpan ld (bwspr),hl ld a,54 ld hl,a_n call centertext ld hl,lvlan intro_done: ld (curlvl),hl ; remember the start of the level ld (remlvl),hl call delay bcall(_clrlcdfull) bcall(_grbufclr) call wpn_fill part1_init: call init_vars ld a,44 ; initialize some variables ld (ymm),a xor a ld (jchk),a ld (bchk),a ld (wpn),a inc a ld (dir),a ld (schk),a ld hl,wpp ld (wpnspr),hl call ShowLevel call main_loop bcall(_getcsc) ; clear the keybuffer bcall(_grbufclr) bcall(_clrlcdfull) ld a,(death) ; check if died or a jp nz,lost_life ld a,(win) or a ret z ; exit loop if level has not been completed part2_init: ld hl,lvlb1 xor a ld (bchk),a call init_lvlb ld a,(death) ; check if died or a jp nz,lost_life ld a,(win) or a ret z ; exit loop if level has not been completed xor a ; initialize boss variables ld (bdir),a ld (bjchk),a inc a ld (bchk),a ld a,28 ld (enb),a ld a,44 ld (yb),a ld a,76 ld (xb),a ld hl,lvlb2 call init_lvlb ld a,(death) ; check if died or a jp nz,lost_life ld a,(win) or a ret z ; exit game if level has not been completed ld a,(lvldone) ld b,a ld a,(boss) cp 1 jr z,set_bit0 set 7,b jr set_bit_done set_bit6: set 6,b jr set_bit_done set_bit5: set 5,b jr set_bit_done set_bit4: set 4,b jr set_bit_done set_bit3: set 3,b jr set_bit_done set_bit2: set 2,b jr set_bit_done set_bit1: set 1,b jr set_bit_done set_bit0: set 0,b set_bit_done: ld a,b ld (lvldone),a jp cb_init lost_life: call wpn_fill ld a,(lives) ; go to game over screen if all lives lost or a jr z,game_over ld a,(schk) or a jp z,part2_init jp part1_init game_over: cp kMode ; exit if MODE was pressed at show password screen ret z ld a,3 ld (lives),a bcall(_clrlcdfull) bcall(_grbufclr) call draw call fastcopys ld de,18*256+31 ld hl,gover call setvputs ld de,25*256+25 ld hl,cont call setvputs ld de,32*256+14 ld hl,stgsel call setvputs ld de,39*256+31 ld hl,endgame call setvputs bcall(_grbufclr) go_loop: bcall(_getcsc) cp k2nd jr z,go_cont cp kMode ret z jr go_loop go_cont: ld hl,(remlvl) ld (curlvl),hl jp part1_init final_boss: xor a ld (boss),a ;select boss 0 ld (win),a ;you haven't won call main_loop ;call the main loop ld a,(death) ;check if you died or a jp nz,lost_life ld a,(win) or a ret z ; exit game if level has not been completed ending: ld hl,endingtext call draw_text ld hl,creditext call draw_text ld a,11 ld a,28 ld hl,and_inf call centertext call clrwait ret init_lvlb: ld (curlvl),hl call init_vars ld (schk),a ld (bcount),a call ShowLevel call main_loop ld a,(win) ; see if you defeated TI's spaceship cp 2 jr z,ship_dead bcall(_getcsc) ; clear the keybuffer bcall(_grbufclr) bcall(_clrlcdfull) ret init_vars: ld hl,0 ld (xscr),hl ld (tempscr),hl ld hl,8 ; initialize some variables ld (xmm),hl xor a ld (wchk),a ld (wchk1),a ld (wchk2),a ld (wchk3),a ld (win),a ld (death),a ld (feet),a ld (item),a ld (echk),a ld (bwchk),a ld (hchk),a ret ship_dead: ld a,28 ld (enb),a call check_spr call xor_char ld b,0 ; erase ship call ship_init ti_fall: ; TI falls to the bottom of the screen ld a,(yb) inc a ld (yb),a call xor_boss call fastcopys call xor_boss ld a,(yb) cp 44 jr nz,ti_fall call check_spr call xor_char ret main_loop: ld hl,(xmm) call load_x ld a,(ymm) add a,4 push hl push af call GetBlock pop af pop hl ld de,8 add hl,de call GetBlock call ShowLevel call check_spr ; figure out which Mega Man sprite to use call xor_char ; draw it call fastcopys ;copy everything to the buffer call xor_char ;erase the Megaman sprite ld a,(echk) ;check for enemy and erase as necessary bcall(_grbufclr) call find_spr ld a,$FD ;check ENTER out (1),a in a,(1) bit 0,a call z,pause ld a,$FE ;check arrow keys out (1),a in a,(1) bit 1,a call z,move_left bit 2,a call z,move_right ld a,$BF ;check other keys out (1),a in a,(1) bit 5,a jr jump_button_down main2: bit 6,a ret z ;exit loop is MODE has been pressed ld a,(death) or a ret nz ;exit loop if dead ld a,(win) or a jp z,main_loop ;exit loop if level completed ret jchk_now_2: ; make sure you can't jump push af ld a,2 ld (jchk),a pop af ret jump_button_down: push af ld a,1 ld (maxjh),a call z,jump call nz,jchk_now_2 call fall pop af jr main2 move_right: ld a,(feet) and $02 ld hl,mmrr2 jr nz,rr2_spr ld hl,mmrr rr2_spr: ld (curpic),hl ld a,(xmm) cp 80 call z,won call CheckRight call z,CheckRight2 call z,CheckRight3 jr nz,no_right ld a,(xmm) cp 44 jr nz,no_scroll ld a,(xscr) cp 68 jr z,no_scroll ld a,(schk) or a jr z,no_scroll call scroll jr no_right no_scroll: ld hl,(xmm) inc hl inc hl ld (xmm),hl no_right: ld a,(dir) or a call z,change_right ret change_right: ld a,1 ld (dir),a ret move_left: push af ld a,(feet) and $02 ld hl,mmrl2 jr nz,rl2_spr ld hl,mmrl rl2_spr: ld (curpic),hl ld a,(xmm) or a jr z,no_left call CheckLeft call z,CheckLeft2 call z,CheckLeft3 jr nz,no_left call change_left ld hl,(xmm) dec hl dec hl ld (xmm),hl no_left: ld a,(dir) or a call nz,change_left pop af ret change_left: xor a ld (dir),a ret CheckRight: ld hl,(xmm) call load_x ld de,8 add hl,de jr CheckHorz CheckLeft: ld hl,(xmm) call load_x dec hl CheckHorz: ld a,(ymm) call GetBlock call CheckTile ret CheckRight2: ld hl,(xmm) call load_x ld de,8 add hl,de jr CheckHorz2 CheckLeft2: ld hl,(xmm) call load_x dec hl CheckHorz2: ld a,(ymm) add a,11 call GetBlock call CheckTile ret CheckRight3: ld hl,(xmm) call load_x ld de,8 add hl,de jr CheckHorz3 CheckLeft3: ld hl,(xmm) call load_x dec hl CheckHorz3: ld a,(ymm) add a,6 call GetBlock call CheckTile ret pause: call tiny_delay pause_loop: bcall(_getcsc) cp kMode ret z cp kEnter jr nz,pause_loop call tiny_delay ret GetBlock: ; Gets the block at (HL,A) -> A. HL = addr, B,C = coord srl h rr l srl h rr l srl h rr l ; Divide X with 8 ld b,l cp 64 jr c,OnScreen xor a OnScreen: srl a srl a srl a ; Divide Y with 8 ld c,a add hl,hl add hl,hl add hl,hl ld d,0 ld e,a add hl,de ; HL = x*8+y ld de,(curlvl) add hl,de ; Add HL with the pointer to the level data ld a,(hl) ret CheckTile: or a ret z cp 8 ret c xor a ret jump: push af ld a,(jchk) cp 2 jr z,no_jump or a jr nz,jump_up ld a,1 ld (jchk),a ld a,(ymm) sub 16 jr nc,jrem_not0 ld a,1 jrem_not0: ld (jrem),a jump_up: ld a,(jrem) ld b,a ld a,(ymm) cp b jr c,end_jump call CheckUp call z,CheckUp2 jr nz,end_jump ld a,(ymm) dec a dec a dec a dec a ld (ymm),a jr no_jump end_jump: ld a,2 ld (jchk),a no_jump: pop af ret fall: push af ld a,(jchk) cp 1 jr z,no_fall call CheckDown call z,CheckDown2 jr nz,end_fall ld a,(ymm) inc a inc a inc a inc a ld (ymm),a cp 52 call z,die jr no_fall end_fall: xor a ld (jchk),a no_fall: pop af ret CheckUp: ld a,(ymm) dec a jr CheckVert CheckDown: ld a,(ymm) add a,12 CheckVert: ld hl,(xmm) call load_x call GetBlock call CheckTile ret CheckUp2: ld a,(ymm) dec a jr CheckVert2 CheckDown2: ld a,(ymm) add a,12 CheckVert2: ld hl,(xmm) call load_x ld de,7 add hl,de call GetBlock call CheckTile ret inc_wchk: ; lets you shoot again inc a cp 8 jr nz,keep_wchk xor a keep_wchk: ld (wchk),a ret die: call short_delay ld a,(lives) dec a ld (lives),a ld a,1 ld (death),a ret won: ld a,1 ld (win),a ld a,(bchk) ; check for boss or a ret z ld a,(boss) ; see if that boss was the spaceship cp 5 ret nz ld a,2 ; if so, set win=2 ld (win),a ret scroll: bcall(_grbufclr) ld a,(tempscr) inc a inc a cp 8 jr nz,scroll_cont ld a,(xscr) inc a ld (xscr),a xor a scroll_cont: ld (tempscr),a ld a,(echk) or a call nz,next_en ld a,(echk) or a ret z cp 3 ret z ld a,(xe) ; decrease x-coord of enemy dec a ld (xe),a or a call z,en_dead ret ShowLevel: ld hl,(xscr) add hl,hl add hl,hl add hl,hl push hl pop de ld hl,(curlvl) add hl,de ld bc,0 RepShowLevel: ; displays the current full screen of the level ld a,(hl) cp 5 call nc,item_init inc hl push hl ld h,0 ld l,a add hl,hl add hl,hl add hl,hl ld de,lvlspr add hl,de push bc ld a,(tempscr) ld d,a ld a,b sub d jr c,skip_8x8 ld (x2),a ld a,c ld (y2),a ld (smlspr),hl call xor_8x8 skip_8x8: pop bc pop hl ld a,c add a,8 ld c,a cp 64 jr nz,RepShowLevel ld c,0 ld a,b add a,8 ld b,a cp 96 jr nz,RepShowLevel ret item_init: ld d,a cp 8 jr nc,no_en_init ld a,(item) cp 2 jr z,no_item_init ld a,1 ld (item),a ld a,d ret no_item_init: xor a ; replace item sprite with blank sprite ret t_init: i_init: no_en_init: xor a ; replace enemy sprite with blank sprite ret load_x: ; loads x location (input as hl) into hl, accounting for scrolling push hl ld hl,(xscr) add hl,hl add hl,hl add hl,hl pop de add hl,de push hl ld hl,(tempscr) pop de add hl,de ret sub_screen: push af bcall(_clrlcdfull) bcall(_grbufclr) call tiny_delay xor a ld (wchk1),a ld (wchk2),a ld (wchk3),a ld a,(wpn) or a jr z,ss_cont cp 1 jr z,en_an cp 2 jr z,en_ma cp 3 jr z,en_md cp 4 jr z,en_do cp 5 jr z,en_se cp 6 jr z,en_po cp 7 jr z,en_fr cp 8 jr z,en_sa cp 9 jr z,en_mi en_an: ld a,(enwpn) ld (enan),a jr ss_cont en_ma: ld a,(enwpn) ld (enma),a jr ss_cont en_md: ld a,(enwpn) ld (enmd),a jr ss_cont en_do: ld a,(enwpn) ld (endo),a jr ss_cont en_se: ld a,(enwpn) ld (ense),a jr ss_cont en_po: ld a,(enwpn) ld (enpo),a jr ss_cont en_fr: ld a,(enwpn) ld (enfr),a jr ss_cont en_sa: ld a,(enwpn) ld (ensa),a jr ss_cont en_mi: ld a,(enwpn) ld (enmi),a ss_cont: ld a,28 ld (x2),a ld a,53 ld (y2),a ld a,55 ld (x2),a xor a ld (x2),a inc a ld (y2),a ld hl,pwdot ld (smlspr),hl ss_loop_new: call xor_8x8 call fastcopys ld a,(lvldone) bit 0,a jr z,ss_line1 ld d,16 ld e,15 push af ld a,(enan) add a,17 ld h,a ld l,15 ld a,1 call fastline pop af ss_line1: bit 1,a jr z,ss_line2 ld d,16 ld e,25 push af ld a,(enma) add a,17 ld h,a ld l,25 ld a,1 call fastline pop af ss_line2: bit 2,a jr z,ss_line3 ld d,16 ld e,35 push af ld a,(enmd) add a,17 ld h,a ld l,35 ld a,1 call fastline pop af ss_line3: bit 3,a jr z,ss_line4 ld d,16 ld e,45 push af ld a,(endo) add a,17 ld h,a ld l,45 ld a,1 call fastline pop af ss_line4: bit 4,a jr z,ss_line5 ld d,63 ld e,15 push af ld a,(enpo) add a,64 ld h,a ld l,15 ld a,1 call fastline pop af ss_line5: bit 5,a jr z,ss_line6 ld d,63 ld e,5 push af ld a,(ense) add a,64 ld h,a ld l,5 ld a,1 call fastline ld d,63 ld e,25 ld a,(enfr) add a,64 ld h,a ld l,25 ld a,1 call fastline pop af ss_line6: bit 6,a jr z,ss_line7 ld d,63 ld e,35 push af ld a,(ensa) add a,64 ld h,a ld l,35 ld a,1 call fastline pop af ss_line7: bit 7,a jr z,ss_line_done ld d,63 ld e,45 ld a,(enmi) add a,64 ld h,a ld l,45 ld a,1 call fastline ss_line_done: ld d,16 ld e,5 ld a,(enp) add a,17 ld h,a ld l,5 ld a,1 call fastline call fastcopys ld a,(lvldone) bit 0,a jr z,ss_bit1 ld de,12*256+7 ld hl,an call setvputs ss_bit1: bit 1,a jr z,ss_bit2 ld de,22*256+7 ld hl,ma call setvputs ss_bit2: bit 2,a jr z,ss_bit3 ld de,32*256+7 ld hl,md call setvputs ss_bit3: bit 3,a jr z,ss_bit4 ld de,42*256+7 ld hl,do call setvputs ss_bit4: bit 4,a jr z,ss_bit5 ld de,12*256+54 ld hl,po call setvputs ss_bit5: bit 5,a jr z,ss_bit6 ld de,22*256+54 ld hl,fr call setvputs ld de,2*256+54 ld hl,se call setvputs ss_bit6: bit 6,a jr z,ss_bit7 ld de,32*256+54 ld hl,sa call setvputs ss_bit7: bit 7,a jr z,ss_loop_init ld de,42*256+54 ld hl,mi call setvputs ss_loop_init: ld de,2*256+7 ld hl,p call setvputs ld a,(tanks) bcall(_setxxop1 ld hl,54*256+40 ld (pencol),hl ld a,1 bcall(_dispop1a) ld a,(lives) bcall(_setxxop1) ld hl,54*256+67 ld (pencol),hl ld a,1 bcall(_dispop1a) call xor_8x8 ss_loop: bcall(_getcsc) cp kUp jp z,ss_up cp kDown jp z,ss_down cp kLeft jp z,ss_horz cp kRight jp z,ss_horz cp k2nd jp z,ss_tank cp kMode jp z,ss_mode cp kYEq jr nz,ss_loop ld hl,wpp ld a,(lvldone) ld b,a ld a,(x2) or a ld a,(y2) jr z,wpn_left wpn_left: ld c,0 ld hl,wpp cp 1 jp z,ss_exit cp 11 jr z,ss_an ss_an: bit 0,b jr z,ss_loop ld c,1 ld a,(enan) ld (enwpn),a ld hl,wpan jp ss_exit ss_exit: ld a,c ld (wpn),a ld (wpnspr),hl bcall(_clrlcdfull) bcall(_grbufclr) call ShowLevel pop af call tiny_delay ret ss_mode: pop bc ; pop to something other than af so it remembers that MODE has been pressed ret ss_up: ld a,(y2) cp 1 jr z,ss_vert sub 10 ld (y2),a jp ss_loop_new ss_down: ld a,(y2) cp 41 jr z,ss_vert add a,10 ld (y2),a jp ss_loop_new ss_vert: ld b,a ld a,42 sub b ld (y2),a jp ss_loop_new ss_horz: ld a,(x2) ld b,a ld a,47 sub b ld (x2),a jp ss_loop_new ss_tank: ld a,(tanks) or a jp z,ss_loop_new dec a ld (tanks),a ld a,28 ld (enp),a jp ss_loop_new xor_char: ld ix,(curpic) ld b,12 ld a,(ymm) ld l,a ld a,(xmm) call isprite ret check_spr: ld a,(dir) or a jr z,check_spr_l check_spr_r: ld hl,mmhr ld a,(hchk) or a jr nz,found_spr ld a,(ymm) add a,12 call CheckVert jr c,not_jump_r ld hl,mmjr ld a,(jchk) or a jr nz,found_spr not_jump_r: ld hl,mmwr ld a,(wchk) or a jr nz,found_spr ret check_spr_l: ld hl,mmhl ld a,(hchk) or a jr nz,found_spr ld a,(ymm) add a,12 call CheckVert jr c,not_jump_l ld hl,mmjl ld a,(jchk) or a jr nz,found_spr not_jump_l: ld hl,mmwl ld a,(wchk) or a jr nz,found_spr ret found_spr: ld (curpic),hl ret find_spr: ld a,(dir) or a jr z,left_spr ld hl,mmsr jr found_spr left_spr: ld hl,mmsl jr found_spr t_move: call xor_en call check_en_dist ld a,(edir) or a ld a,(xe) jr z,t_move_l inc a jr t_move_r t_move_l: dec a or a call z,en_dead t_move_r: ld (xe),a ret i_move: call xor_en call check_en_dist ld a,(edir) or a ld a,(ye) jr z,i_move_u inc a jr i_move_d i_move_u: dec a i_move_d: ld (ye),a ret ti_check: ld a,(echk) cp 3 jr nz,tic_cont xor a ld (echk),a tic_cont: ld b,46 ld c,46 ld a,(bcount) inc a ld (bcount),a cp 50 ld a,7 call z,item_init ld a,(bcount) cp 100 ld a,9 call z,item_init ld a,(bcount) cp 100 ret nz xor a ld (bcount),a ret ship_check: ld a,(bcount) inc a cp 50 jr z,ship_laser ld (bcount),a ret ship_laser: xor a ld (bcount),a ld b,1 call xor_laser call short_delay ld a,(ymm) cp 38 call c,die ld b,0 call xor_laser ret boss_move: call xor_boss ld a,(boss) or a jr z,ti_check cp 5 jr z,ship_check ld a,(bjchk) or a jr nz,boss_jump ld a,(bdir) or a ld a,(xb) jr z,boss_move_l inc a cp 76 jr boss_move_r boss_move_l: dec a cp 56 boss_move_r: ld (xb),a jr z,boss_turn cp 66 call z,boss_shoot ret boss_turn: ld a,(bdir) ; reverse dir boss is moving ld b,a ld a,1 sub b ld (bdir),a ld a,2 ld (bjchk),a ret boss_jump: ld a,(bjchk) cp 1 ld a,(yb) jr z,boss_fall dec a cp 34 jr boss_jump_end boss_fall: inc a cp 44 boss_jump_end: ld (yb),a ret nz ld a,(bjchk) dec a ld (bjchk),a ret bshoot_sa: ld a,(xb) ld (bwx),a call xor_boss ret bshoot_fr: ld a,(xb) ld (bwx),a ret bshoot_md: ld a,(xb) sub 8 ld (bwx),a ret boss_shoot: ld a,(bwchk) or a ret nz inc a ld (bwchk),a ld a,(boss) cp 3 jr z,bshoot_md cp 7 jr z,bshoot_fr cp 8 jr z,bshoot_sa ld a,58 ld (bwx),a ret bssa_move: call xor_boss call check_spr call xor_char bssam_loop: ld a,(bwx) dec a ld (bwx),a call xor_bwpn call fastcopys call xor_bwpn ld a,(bwx) or a jr nz,bssam_loop bssam_loop2: ld a,(bwx) inc a ld (bwx),a call xor_bwpn call fastcopys call xor_bwpn ld a,(bwx) cp 88 jr nz,bssam_loop2 bssam_loop3: ld a,(bwx) dec a ld (bwx),a call xor_bwpn call fastcopys call xor_bwpn ld a,(xb) ld b,a ld a,(bwx) cp b jr nz,bssam_loop3 xor a ld (bwchk),a call check_spr call xor_char ld a,(ymm) ld b,a ld a,37 cp b ret nc add a,16 cp b ret c ld a,(enp) or a sub 4 jr nc,bssam_nokill xor a bssam_nokill: ld (enp),a ret bsfr_move: call check_spr call xor_char call xor_boss call xor_bwpn call fastcopys call xor_char call xor_boss call xor_bwpn call short_delay xor a ld (bwchk),a ld a,(xmm) ld b,a ld a,55 cp b ret nc add a,22 cp b ret c ld a,(ymm) ld b,a ld a,33 cp b ret nc add a,11 cp b ret c ld a,(enp) or a sub 4 jr nc,bsfrm_nokill xor a bsfrm_nokill: ld (enp),a ret bsmd_move: call short_delay ld a,(enp) or a sub 4 jr nc,bsmdm_nokill xor a bsmdm_nokill: ld (enp),a xor a ld (bwchk),a ret boss_shot_move: call xor_bwpn ld a,(boss) cp 8 jp z,bssa_move cp 3 jr z,bsmd_move cp 7 jr z,bsfr_move ld a,(xb) ld b,a ld a,(bwx) cp 2 jr c,bsm_end cp b jr z,bsm_end ld b,a bsm_cont: dec b dec b ld a,(boss) cp 4 jr nz,bsm_store dec b bsm_store: ld a,b ld (bwx),a ret bsm_end: xor a ; boss's shot is off the screen ld (bwchk),a ret check_en_dist: ; check distance enemy has moved and turn around if necessary ld a,(ecount) inc a cp 33 call z,en_turn ld (ecount),a ret en_turn: ld hl,(enspr) ld de,8 ld a,(edir) or a jr z,en_turn_r sbc hl,de dec a jr en_turn_l en_turn_r: add hl,de inc a en_turn_l: ld (enspr),hl ld (edir),a xor a ret en_dead: ; enemy is now dead ld a,3 ld (echk),a xor a ld (ecount),a ret next_en: ; check if previous enemy is clear so next enemy can initialize ld a,(ecount2) inc a ld (ecount2),a cp 96 ret nz xor a ld (echk),a ret xor_en: ld ix,(enspr) ld b,8 ld a,(ye) ld l,a ld a,(xe) call isprite ret xor_corners: ld hl,uprlft ld (smlspr),hl call xor_8x8 ld a,(x2) add a,22 ld (x2),a ld hl,uprrt ld (smlspr),hl call xor_8x8 ld a,(y2) add a,12 ld (y2),a ld hl,lwrrt ld (smlspr),hl call xor_8x8 ld a,(x2) sub 22 ld (x2),a ld hl,lwrlft ld (smlspr),hl call xor_8x8 ld a,(y2) sub 12 ld (y2),a ret xor_8x8: ld ix,(smlspr) ld b,8 ld a,(y2) ld l,a ld a,(x2) call isprite ret xor_wpn1: ld ix,(wpnspr) ld b,4 ld a,(wy1) ld l,a ld a,(wx1) call isprite ret xor_wpn2: ld ix,(wpnspr) ld b,4 ld a,(wy2) ld l,a ld a,(wx2) call isprite ret xor_wpn3: ld b,4 ld a,(wy3) ld l,a ld a,(wx3) ld ix,(wpnspr) call isprite ret xor_bwpn: ld b,4 ld l,49 ld a,(bwx) ld ix,(bwspr) call isprite ret tiny_delay: ld b,20 jr del_loop short_delay: ld b,50 jr del_loop long_delay: call delay med_delay: ld b,100 jr del_loop delay: ld b,200 del_loop: halt halt djnz del_loop ret disp_boss: ld (bosspic),hl bcall(_clrlcdfull) bcall(_grbufclr) xor a ld (x2),a ld a,16 ld (y2),a ld hl,bint ld (smlspr),hl ld b,12 draw1: push bc call xor_8x8 ld a,(x2) add a,8 ld (x2),a pop bc djnz draw1 ld a,0 ld (x2),a ld a,40 ld (y2),a ld hl,bint ld (smlspr),hl ld b,12 draw2: push bc call xor_8x8 ld a,(x2) add a,8 ld (x2),a pop bc djnz draw2 call xor_boss call fastcopys ret xor_boss: ld b,12 ld a,(yb) ld l,a ld a,(xb) ld ix,(bosspic) call isprite ret no_an: call draw ret no_ma: call draw ret no_md: call draw ret no_do: call draw ret no_po: call draw ret no_fr: call draw ret no_sa: call draw ret no_mi: call draw ret you_got: bcall(_clrlcdfull) bcall(_grbufclr) call draw ld hl,35 ld (xmm),hl ld a,50 ld (ymm),a ld hl,mmsr ld (curpic),hl ld a,43 ld (wx1),a ld a,51 ld (wy1),a ld a,(boss) cp 3 jr z,yg_cont ld hl,mmwr ld (curpic),hl ld a,55 ld (wx1),a ld a,55 ld (wy1),a ld a,(boss) ld hl,wpan cp 1 jr z,yg_cont cp 2 jr z,yg_cont cp 4 jr z,yg_cont cp 6 jr z,yg_cont cp 9 jr z,yg_cont push af ld a,35 ld (wx1),a ld a,54 ld (wy1),a call xor_char pop af cp 8 jr z,yg_cont ld (wpnspr),hl call xor_wpn1 ld a,50 ld (wy1),a call xor_wpn1 ld a,58 ld (wy1),a yg_cont: ld (wpnspr),hl call xor_wpn1 call xor_char call fastcopys ld de,10*256+35 ld hl,yougot call setvputs ld a,(boss) cp 1 jr z,yg_an jr yg_mi yg_an: ld de,20*256+28 ld hl,ygan call setvputs jr yg_loop yg_mi: ld de,20*256+28 ld hl,ygmi call setvputs yg_loop: bcall(_getcsc) cp kMode ret z cp kEnter jr nz,yg_loop ret draw_grid: bcall(_clrlcdfull) bcall(_grbufclr) call draw ret pw_text: ld de,1*256+31 ld hl,one call setvputs ld de,1*256+40 ld hl,two call setvputs ld de,1*256+49 ld hl,three call setvputs ld de,1*256+58 ld hl,four call setvputs ld de,1*256+67 ld hl,five call setvputs ld de,10*256+23 ld hl,a call setvputs ld de,19*256+23 ld hl,b call setvputs ld de,28*256+23 ld hl,c call setvputs ld de,37*256+23 ld hl,d call setvputs ld de,46*256+23 ld hl,e call setvputs ld de,56*256+32 ld hl,enter call setvputs ret show_pw: call draw_grid ld a,(tanks) ; find correct password dot for number of tanks ld b,1 or a jr z,spw_cont ld b,2 cp 1 jr z,spw_cont ld b,4 cp 2 jr z,spw_cont ld b,8 cp 3 jr z,spw_cont ld b,16 spw_cont: ld a,b ld (tankpw),a ld hl,pwdot ld (smlspr),hl ld a,(lvldone) bit 0,a jr z,no_an_dot ld a,28 jr an_dot no_an_dot: ld a,46 an_dot: ld (y2),a ld a,47 ld (x2),a call xor_8x8 ld a,(lvldone) bit 1,a jr z,no_ma_dot ld a,10 ld (y2),a ld a,38 jr ma_dot no_ma_dot: ld a,28 ld (y2),a ld a,65 ma_dot: ld (x2),a call xor_8x8 ld a,(lvldone) bit 2,a jr z,no_md_dot ld a,46 ld (y2),a ld a,65 jr md_dot no_md_dot: ld a,10 ld (y2),a ld a,56 md_dot: ld (x2),a call xor_8x8 ld a,(lvldone) bit 3,a jr z,no_do_dot ld a,37 ld (y2),a ld a,47 jr do_dot no_do_dot: ld a,46 ld (y2),a ld a,38 do_dot: ld (x2),a call xor_8x8 ld a,(lvldone) bit 4,a jr z,no_po_dot ld a,37 ld (y2),a ld a,29 jr po_dot no_po_dot: ld a,19 ld (y2),a ld a,65 po_dot: ld (x2),a call xor_8x8 ld a,(lvldone) bit 5,a jr z,no_fr_dot ld a,56 jr fr_dot no_fr_dot: ld a,29 fr_dot: ld (x2),a ld a,19 ld (y2),a call xor_8x8 ld a,(lvldone) bit 5,a jr z,no_se_dot ld a,46 ld (y2),a ld a,29 jr se_dot no_se_dot: ld a,28 ld (y2),a ld a,56 se_dot: ld (x2),a call xor_8x8 ld a,(lvldone) bit 6,a jr z,no_sa_dot ld a,38 jr sa_dot no_sa_dot: ld a,47 sa_dot: ld (x2),a ld a,19 ld (y2),a call xor_8x8 ld a,(lvldone) bit 7,a jr z,no_mi_dot ld a,28 ld (y2),a ld a,38 jr mi_dot no_mi_dot: ld a,37 ld (y2),a ld a,56 mi_dot: ld (x2),a call xor_8x8 tank_dot: ld a,(tankpw) ld b,a ld a,10 ld (y2),a ld a,47 ld (x2),a bit 0,b jr nz,tank_dot_found ld a,46 ld (y2),a ld a,56 ld (x2),a bit 1,b jr nz,tank_dot_found ld a,28 ld (y2),a ld a,29 ld (x2),a bit 2,b jr nz,tank_dot_found ld a,10 ld (y2),a ld a,65 ld (x2),a bit 3,b jr nz,tank_dot_found ld a,37 ld (y2),a ld a,38 ld (x2),a tank_dot_found: call xor_8x8 call fastcopys call pw_text show_pw_loop: bcall(_getcsc) cp kMode ret z cp kEnter jr nz,show_pw_loop ret ship_init: ld a,(bchk) or a ret z call draw ld a,56 ld (xb),a ld a,16 ld (yb),a ret xor_laser: call draw call check_spr call xor_char call xor_boss call fastcopys call draw call xor_char call xor_boss ret wpn_fill: ld a,28 ld (enp),a ld (enan),a ld (enma),a ld (enmd),a ld (endo),a ld (ense),a ld (enpo),a ld (enfr),a ld (ensa),a ld (enmi),a ld (enwpn),a ret draw_nrg: ld a,(bchk) or a call nz,draw_bnrg ld d,10 ld e,38 ld h,10 ld a,(enp) ld b,a ld a,37 sub b ld l,a ld a,1 call fastline ld a,(wpn) or a ret z ld d,12 ; draw weapon energy line ld e,38 ld h,12 ld a,(enwpn) ld b,a ld a,37 sub b ld l,a ld a,1 call fastline ret draw_bnrg: ld d,86 ld e,38 ld h,86 ld a,(enb) ld b,a ld a,37 sub b ld l,a ld a,1 call fastline ret check_ehitu: ld a,(echk) cp 3 ret z ld a,(wx1) ld d,a ld a,(wy1) ld e,a ld a,(wchk1) ld c,a or a call nz,check_white ld a,c ld (wchk1),a ld a,(wx2) ld d,a ld a,(wy2) ld e,a ld a,(wchk2) ld c,a or a call nz,check_white ld a,c ld (wchk2),a ld a,(wx3) ld d,a ld a,(wy3) ld e,a ld a,(wchk3) ld c,a or a call nz,check_white ld a,c ld (wchk3),a ld a,(xmm) ld b,a ld a,(xe) sub 7 cp b ret nc add a,14 cp b ret c ld a,(ymm) ld b,a ld a,(ye) sub 11 cp b ret nc add a,18 cp b ret c ld a,(enp) or a sub 1 jr nc,ehitu_nokill xor a ehitu_nokill: ld (enp),a ld a,1 ld (hchk),a ret check_bhitu: ld a,(wx1) ld d,a ld a,(wy1) ld e,a ld a,(wchk1) ld c,a or a call nz,check_whitb ld a,c ld (wchk1),a ld a,(wx2) ld d,a ld a,(wy2) ld e,a ld a,(wchk2) ld c,a or a call nz,check_whitb ld a,c ld (wchk2),a ld a,(wx3) ld d,a ld a,(wy3) ld e,a ld a,(wchk3) ld c,a or a call nz,check_whitb ld a,c ld (wchk3),a ld a,(boss) cp 5 jr z,check_shitu ld a,(xmm) ld b,a ld a,(xb) sub 7 cp b ret nc add a,14 cp b ret c ld a,(ymm) ld b,a ld a,(yb) sub 11 cp b ret nc add a,22 cp b ret c ld a,(enp) or a sub 7 jr nc,bhitu_nokill xor a bhitu_nokill: ld (enp),a ld a,1 ld (hchk),a ret check_shitu: ld a,(xmm) ld b,a ld a,28 cp b ret nc xor a ld (enp),a ld a,1 ld (hchk),a ret check_bwhitu: ld a,(xmm) ld b,a ld a,(bwx) sub 7 cp b ret nc add a,14 cp b ret c ld a,(ymm) ld b,a ld a,38 cp b ret nc add a,14 cp b ret c ld a,(enp) or a sub 2 jr nc,bwhitu_nokill xor a bwhitu_nokill: ld (enp),a ld a,1 ld (hchk),a ret check_white: ld a,(xe) ld b,a ld a,d sub 7 cp b ret nc add a,14 cp b ret c ld a,(ye) ld b,a ld a,e sub 7 cp b ret nc add a,10 cp b ret c ld c,0 ld a,(ene) or a sub 1 jr nc,white_nokill xor a white_nokill: ld (ene),a or a ret nz ld a,3 ld (echk),a ret check_whitb: ld a,(boss) cp 5 jr z,check_whits ld a,(xb) ld b,a ld a,d sub 7 cp b ret nc add a,14 cp b ret c ld a,(yb) ld b,a ld a,e sub 11 cp b ret nc add a,14 cp b ret c ld c,0 call dam7_or1 ld a,(enb) or a sub 1 jr nc,whitb_nokill xor a whitb_nokill: ld (enb),a ret nz call won ret check_whits: ld b,35 ld a,d sub 7 cp b ret nc add a,14 cp b ret c ld b,42 ld a,e cp b ret nc add a,10 cp b ret c ld c,0 call dam7_or1 ld a,(enb) or a sub 1 jr nc,whits_nokill xor a whits_nokill: ld (enb),a or a ret nz call won ret dam7_or1: ld a,(wpn) or a ret z cp 5 ret z cp 1 jr z,an_on_po cp 2 jr z,ma_on_do cp 3 jr z,md_on_sa cp 4 jr z,do_on_fr cp 6 jr z,po_on_md cp 7 jr z,fr_on_an cp 8 jr z,sa_on_mi cp 9 jr z,mi_on_ma ret an_on_po: ld a,(boss) cp 5 jr z,damage7 cp 6 ret nz jr damage7 ma_on_do: ld a,(boss) or a jr z,damage7 cp 4 ret nz jr damage7 md_on_sa: ld a,(boss) cp 8 ret nz jr damage7 do_on_fr: ld a,(boss) cp 7 ret nz jr damage7 po_on_md: ld a,(boss) cp 3 ret nz jr damage7 fr_on_an: ld a,(boss) cp 1 ret nz jr damage7 sa_on_mi: ld a,(boss) cp 9 ret nz jr damage7 mi_on_ma: ld a,(boss) cp 2 ret nz damage7: ld a,(enb) or a sub 6 jr nc,dam7_nokill call won xor a dam7_nokill: ld (enb),a ret thrown_back: xor a ld (hchk),a ld hl,(xmm) call load_x or a ld de,8 sbc hl,de push hl push hl call CheckHorz pop hl call z,CheckHorz2 pop hl call z,CheckHorz3 jr nz,thrown_short ld a,(xmm) sub 8 ld (xmm),a ret thrown_short: ld hl,(xmm) call load_x push hl srl h rr l srl h rr l srl h rr l ; divide x by 8 add hl,hl add hl,hl add hl,hl ; multiply x by 8 push hl pop de pop hl or a sbc hl,de push hl ld hl,(xmm) pop de or a sbc hl,de ld (xmm),hl ret draw_text: ;hl = pointer to text info ld a,(hl) ld e,a inc hl push de push hl bcall(_clrlcdfull) bcall(_grbufclr) ld a,1 pop hl pop de draw_txt_loop: push af push de push hl call centertext pop hl pop de pop af add a,6 cp 59 call nc,reseta_draw push af ld a,$00 ld b,255 cpir pop af dec e jr nz,draw_txt_loop call clrwait ret reseta_draw: push af push de push hl dec e call nz,clrwait inc e pop hl pop de pop af ld a,1 ret clrwait: call wait bcall(_clrlcdfull) bcall(_grbufclr) ret wait: bcall(_getcsc) or a jr z,wait ret quit_force: draw: push af push bc push de ld a,(hl) ld b,a inc hl ld a,(hl) inc hl drawloop: ;hl = pointer to line data ;a = draw mode (0=off 1=on 2=xor 3=pattern) ;b = number of lines push bc ld c,(hl) inc hl ld b,(hl) inc hl ld e,(hl) inc hl ld d,(hl) inc hl push af push hl push bc push de pop de pop hl call fastline pop hl pop af pop bc djnz drawloop pop de pop bc pop af ret