; DEFINE for the edition #DEFINE NBBLOCKSX 15 ; A FAIRE : ; - copier/coller (sto -> coller) editLevel: call _poprealo5 ld hl,AppVarGraphics call _mov9ToOp1 call _chkFindSym ld hl,19 add hl,de ld bc,(hl) inc hl inc hl inc hl ld de,tilesExtracted call extractRLE ld de,mpLcdPalette ld hl,_TILES_pal ld bc,512 ldir ld hl,vRam ld (mpLcdBase),hl ld hl,vRam+(320*240) ld (currentDrawLoc),hl ld hl,vRam ld (hl),BGCl ld de,vRam+1 ld bc,320*240*2 ldir ld hl,vRam+(320*TIL_sizeY*MAP_sizeY) ld (hl),06 ld de,vRam+(320*TIL_sizeY*MAP_sizeY)+1 ld bc,320*1 ldir ld (hl),$7E ld bc,320*240-((320*TIL_sizeY*MAP_sizeY)+(320*1)) ldir ld hl,vRam+(320*TIL_sizeY*MAP_sizeY)+(320*240) ld (hl),06 ld de,vRam+(320*TIL_sizeY*MAP_sizeY)+(320*240)+1 ld bc,320*1 ldir ld (hl),$7E ld bc,320*240-((320*TIL_sizeY*MAP_sizeY)+(320*1)) ldir ld hl,(addrLvlEdited) ld (addrMAP_sizeX),hl ld de,(hl) ld (LV_MAP_sizeX),de push de inc hl inc hl inc hl ld (addrMAP_sizeY),hl push hl ld a,(hl) inc hl ld (LV_beginningMap),hl push hl call _mult16by8 ld (LV_bytesToSkip),hl ld (LV_maxBytesToSkip),hl ex de,hl pop hl push hl add hl,de ld (LV_fstBlock),hl pop ix pop hl ld a,(hl) add a,10 pop de call _mult16by8 ex de,hl add ix,de ld (LV_addrGravity),ix ld a,(ix) ld c,a add a,c add a,c inc a ld bc,0 ld c,a add ix,bc ld (LV_addrSpaceship),ix ld hl,$000505 ld (posCursorScrnX),hl ld a,1 ld (currentBlock),a res FLG_twoPartTile, (iy+asm_flag1) EDIT_mainloop: call EDIT_displayLevel call EDIT_displayBlockChoice ld hl,(LV_addrGravity) ld ix,tilesExtracted+(21*21*56)+(900*11)+(22*22*13)+5822+132 call EDIT_dispChgCtxt ld hl,(LV_addrSpaceship) ld ix,tilesExtracted+(21*21*56)+(900*11)+(22*22*13)+5822+132+(21*21)+2 call EDIT_dispChgCtxt call EDIT_dispCursor call EDIT_swapBuffers ld hl,$F50000 ld (hl),2 xor a EDIT_scanWait: cp (hl) jr nz,EDIT_scanWait ld a,(kbdG7) and %00001111 jr nz,EDIT_arrowPressed ld a,(kbdG1) and %00010001 jr nz,EDIT_arrowPressed res FLG_blockArrows, (iy+asm_flag1) ld a,5 ld (timerArrow),a EDIT_arrowPressed: ld a,(kbdG7) bit kbitLeft, a call nz, EDIT_goLeft ld a,(kbdG7) bit kbitRight, a call nz, EDIT_goRight ld a,(kbdG7) bit kbitUp, a call nz, EDIT_goUp ld a,(kbdG7) bit kbitDown, a call nz, EDIT_goDown ld a,(kbdG1) bit kbit2nd, a jp nz, EDIT_insertCurrentBlock bit kbitMode, a jp nz, EDIT_quit bit kbitYequ, a call nz, EDIT_prevBlock ld a,(kbdG1) bit kbitGraph, a call nz, EDIT_nextBlock ld a,(kbdG1) bit kbitDel, a jp nz, EDIT_delBlock ld a,(kbdG3) bit kbit1, a jr nz, EDIT_insertBotLeft bit kbit4, a jr nz, EDIT_insertMidLeft bit kbit7, a jr nz, EDIT_insertUpLeft ld a,(kbdG4) bit kbit2, a jr nz, EDIT_insertBotMid bit kbit5, a jr nz, EDIT_insertCenter bit kbit8, a jr nz, EDIT_insertUpMid bit kbitPrgm, a jp nz, EDIT_playLevel ld a,(kbdG5) bit kbit3, a jr nz, EDIT_insertBotRight bit kbit6, a jr nz, EDIT_insertMidRight bit kbit9, a jr nz, EDIT_insertUpRight res FLG_toogleCtxt, (iy+asm_flag1) bit kbitTan, a jp nz, EDIT_toogleCtxt set FLG_toogleCtxt, (iy+asm_flag1) ld a,(kbdG2) bit kbitLn, a jp nz,EDIT_toogleCtxt ld a,(kbdG6) bit kbitAdd, a jp nz, EDIT_extendMapX bit kbitSub, a jp nz, EDIT_reduceMapX bit kbitMul, a jp nz, EDIT_extendMapY bit kbitDiv, a jp nz, EDIT_reduceMapY res FLG_blockInsDel, (iy+asm_flag1) res FLG_blockMode, (iy+asm_flag1) bit kbitClear, a jp z,EDIT_mainloop jp speedQuit EDIT_insertBotLeft: ld a,26 jr EDIT_insertBlock EDIT_insertMidLeft: ld a,13 jr EDIT_insertBlock EDIT_insertUpLeft: ld a,4 jr EDIT_insertBlock EDIT_insertBotMid: ld a,30 jr EDIT_insertBlock EDIT_insertCenter: ld a,23 jr EDIT_insertBlock EDIT_insertUpMid: ld a,22 jr EDIT_insertBlock EDIT_insertBotRight: ld a,35 jr EDIT_insertBlock EDIT_insertMidRight: ld a,14 jr EDIT_insertBlock EDIT_insertUpRight: ld a,5 jr EDIT_insertBlock EDIT_insertBlock: ; INPUT : ; A : Block to insert ex af,af' call EDIT_getAddrBehindCursor ex af,af' ld (hl),a jp EDIT_mainloop EDIT_insertCurrentBlock: call EDIT_getAddrBehindCursor ld a,(currentBlock) ld (hl),a bit FLG_twoPartTile, (iy+asm_flag1) jp z,EDIT_mainloop ld de,(LV_MAP_sizeX) or a sbc hl,de push hl ld de,(LV_beginningMap) sbc hl,de pop hl jp c,EDIT_mainloop ld a,(currentBlock2) ld (hl),a jp EDIT_mainloop EDIT_delBlock: call EDIT_getAddrBehindCursor ld a,(hl) ld (hl),0 ;cp 6 ;jr z,EDIT_del2PartBlkTop ;cp 7 ;jr z,EDIT_del2PartBlkTop ;cp 8 ;jr z,EDIT_del2PartBlkTop ;cp 15 ;jr z,EDIT_del2PartBlkBottom ;cp 16 ;jr z,EDIT_del2PartBlkBottom ;cp 17 ;jr z,EDIT_del2PartBlkBottom ;cp 39 ;jr z,EDIT_del2PartBlkTop ;cp 48 ;jr z,EDIT_del2PartBlkBottom ;cp 54 ;jr z,EDIT_del2PartBlkTop ;cp 55 ;jr z,EDIT_del2PartBlkBottom ;ret ;EDIT_del2PartBlkTop: ;ld de,(LV_MAP_sizeX) ;add hl,de ;ld (hl),0 ;ret ;EDIT_del2PartBlkBottom: ;ld de,(LV_MAP_sizeX) ;or a ;sbc hl,de ;ld (hl),0 jp EDIT_mainloop EDIT_prevBlock: call EDIT_blockArrows ret nz ld a,(currentBlock) ld b,-1 or a jr nz,EDIT_changeCurrentBlock ld a,58 ld (currentBlock),a ret EDIT_nextBlock: call EDIT_blockArrows ret nz ld a,(currentBlock) ld b,1 cp 58 jr nz,EDIT_changeCurrentBlock xor a ld (currentBlock),a ret EDIT_changeCurrentBlock: ; INPUT ; B : direction add a,b cp 29 jr z,EDIT_changeCurrentBlock cp 6 jr z,EDIT_changeCurrentBlock cp 7 jr z,EDIT_changeCurrentBlock cp 8 jr z,EDIT_changeCurrentBlock cp 39 jr z,EDIT_changeCurrentBlock cp 54 jr z,EDIT_changeCurrentBlock ld (currentBlock),a cp 48 jr z,EDIT_twoPartTile cp 15 jr z,EDIT_twoPartTile cp 16 jr z,EDIT_twoPartTile cp 17 jr z,EDIT_twoPartTile cp 55 jr z,EDIT_twoPartTile res FLG_twoPartTile, (iy+asm_flag1) ret EDIT_twoPartTile: set FLG_twoPartTile, (iy+asm_flag1) call EDIT_searchOtherPart inc hl ld a,(hl) ld (currentBlock2),a ret EDIT_quit: bit FLG_blockMode, (iy+asm_flag1) jp nz,EDIT_mainloop call _op5toop1 jp _ARC_UNARC EDIT_goLeft: call EDIT_blockArrows ret nz ld a,(kbdG2) bit kbitAlpha, a jr nz,EDIT_goBegMap ld a,(posCursorScrnX) cp 3 jr nc,EDIT_noScrollLeft call EDIT_scrollLeft ret nz or a ret z EDIT_noScrollLeft: dec a ld (posCursorScrnX),a ret EDIT_goBegMap: ld hl,(LV_beginningMap) ld de,(LV_bytesToSkip) add hl,de ld (LV_fstblock),hl xor a ld (posCursorScrnX),a ret EDIT_goRight: call EDIT_blockArrows ret nz ld a,(kbdG2) bit kbitAlpha, a jr nz,EDIT_goEndMap ld a,(posCursorScrnX) cp NBBLOCKSX-3 jr c,EDIT_noScrollRight call EDIT_scrollRight ret c cp NBBLOCKSX-1 ret z EDIT_noScrollRight: inc a ld (posCursorScrnX),a ret EDIT_goEndMap: ld hl,(LV_beginningMap) ld de,(LV_MAP_sizeX) add hl,de ld de,-17-NBBLOCKSX add hl,de ld de,(LV_bytesToSkip) add hl,de ld (LV_fstblock),hl ld a,NBBLOCKSX-1 ld (posCursorScrnX),a ret EDIT_goUp: call EDIT_blockArrows ret nz ld a,(posCursorScrnY) cp 3 jr nc,EDIT_noScrollUp call EDIT_scrollUp ret nz or a ret z EDIT_noScrollUp: dec a ld (posCursorScrnY),a ret EDIT_goDown: call EDIT_blockArrows ret nz ld a,(posCursorScrnY) cp WIN_SIZEY-3 jr c,EDIT_noScrollDown call EDIT_scrollDown ret nz cp WIN_SIZEY-1 ret z EDIT_noScrollDown: inc a ld (posCursorScrnY),a ret EDIT_scrollLeft: ; OUTPUT : ; Returns Z if we touched the corner, NZ else ld hl,(LV_fstBlock) push hl ld de,(LV_bytesToSkip) or a sbc hl,de ld de,(LV_beginningMap) sbc hl,de pop hl ret z dec hl ld (LV_fstBlock),hl ret EDIT_scrollRight: ; OUTPUT : ; Returns NC if we are at the end of the level, C else ld hl,(LV_fstBlock) push hl ld de,(LV_bytesToSkip) or a sbc hl,de ld de,(LV_beginningMap) sbc hl,de ld de,17+NBBLOCKSX add hl,de ld de,(LV_MAP_sizeX) sbc hl,de pop hl ret nc inc hl ld (LV_fstBlock),hl ret EDIT_scrollUp: ; OUTPUT : ; Returns Z if we touched the corner, NZ else ld hl,(LV_bytesToSkip) ld de,0 or a sbc hl,de ret z ld de,(LV_MAP_sizeX) sbc hl,de ld (LV_bytesToSkip),hl ld hl,(LV_fstblock) sbc hl,de ld (LV_fstblock),hl ret EDIT_scrollDown: ; OUTPUT : ; Returns Z if we touched the corner, NZ else ld hl,(LV_maxBytesToSkip) ld de,(LV_bytesToSkip) or a sbc hl,de ret z ld hl,(LV_MAP_sizeX) ex de,hl add hl,de ld (LV_bytesToSkip),hl ld hl,(LV_fstblock) add hl,de ld (LV_fstblock),hl ret EDIT_dispCursor: ld a,(posCursorScrnY) ld de,320*TIL_sizeY call _mult16by8 ld a,(posCursorScrnX) ld e,a ld d,TIL_sizeX mlt de add hl,de ld de,(currentDrawLoc) add hl,de inc hl inc hl ld ix,tilesExtracted+(21*21*56)+(900*11)+(22*22*13)+5822 ld de,320 call drawSprite ld bc,320*(21-(2*8)) add hl,bc ld ix,tilesExtracted+(21*21*56)+(900*11)+(22*22*13)+5822+66 call drawSprite ld de,-320*21+21-8 add hl,de ld ix,tilesExtracted+(21*21*56)+(900*11)+(22*22*13)+5822 call drawSpriteMirror ld de,320*(21-(2*8)) add hl,de ld ix,tilesExtracted+(21*21*56)+(900*11)+(22*22*13)+5822+66 call drawSpriteMirror ret EDIT_playLevel: ld hl,0 ld a,(kbdG2) bit kbitAlpha, a jr z,EDIT_fromBeg ld hl,(LV_fstblock) ld de,(LV_beginningMap) or a sbc hl,de ld de,(LV_bytesToSkip) sbc hl,de ld a,(posCursorScrnX) ld de,0 ld e,a add hl,de EDIT_fromBeg: ld (begLvlToPlay),hl set FLG_inEditorMode, (iy+asm_flag2) ld a,(iy+asm_flag1) ld (playMem),a call playLevel ld a,(playMem) ld (iy+asm_flag1),a xor a ld (mpLcdRange+11),a ld hl,$EF7802 ld (mpLcdRange+8),hl ld hl,vRam ld (mpLcdBase),hl ld hl,vRam ld (hl),BGCl ld de,vRam+1 ld bc,320*(TIL_sizeY*WIN_SIZEY) ldir ld hl,vRam+(320*240) ld (hl),BGCl ld de,vRam+(320*240)+1 ld bc,320*(TIL_sizeY*WIN_SIZEY) ldir ld hl,vRam+(320*TIL_sizeY*MAP_sizeY) ld (hl),06 ld de,vRam+(320*TIL_sizeY*MAP_sizeY)+1 ld bc,320*1 ldir ld hl,vRam+(320*TIL_sizeY*MAP_sizeY)+(320*240) ld (hl),06 ld de,vRam+(320*TIL_sizeY*MAP_sizeY)+(320*240)+1 ld bc,320*1 ldir set FLG_blockMode, (iy+asm_flag1) jp EDIT_mainloop EDIT_extendMapX: bit FLG_blockInsDel, (iy+asm_flag1) jp nz,EDIT_mainloop set FLG_blockInsDel, (iy+asm_flag1) res FLG_insDel10, (iy+asm_flag1) ld hl,(addrMAP_sizeY) ld a,(hl) ld hl,10 ; we clear H and HLU add a,l ld l,a ld a,(kbdG2) bit kbitAlpha, a jr z,EDIT_insOnlyOneColumnX ld h,10 mlt hl set FLG_insDel10, (iy+asm_flag1) EDIT_insOnlyOneColumnX: push hl call _EnoughMem pop hl jp c,EDIT_mainloop push hl call _op5toop1 call _chkFindSym ; in ram ex de,hl ld de,(hl) ; space pop ix push ix add ix,de ld (hl),ix ld bc,1 bit FLG_insDel10, (iy+asm_flag1) jr z,+_ ld bc,10 _: call EDIT_updateContexts pop de ld hl,(LV_addrSpaceship) add hl,de ld (LV_addrSpaceship),hl ld hl,(LV_addrGravity) add hl,de ld (LV_addrGravity),hl ld a,(posCursorScrnX) ld de,0 ld e,a ld hl,(LV_fstBlock) add hl,de ld de,(LV_bytesToSkip) sbc hl,de ld de,1 bit FLG_insDel10, (iy+asm_flag1) jr z,EDIT_insOnlyOneColumnXBis ld de,10 EDIT_insOnlyOneColumnXBis: ld bc,(addrMAP_sizeY) ld a,(bc) ld b,10 add a,b ld b,a ex de,hl ; HL : nb to insert per line ; DE : addr to insert ; B : nb lines to process EDIT_insertLoopX: push bc push hl call _InsertMEM ex de,hl ld (hl),0 ex de,hl bit FLG_insDel10, (iy+asm_flag1) jr z,EDIT_insOnlyOneColumnX3 push de pop hl inc de ld bc,9 ldir ld ix,(LV_MAP_sizeX) add ix,de lea de,ix+0 pop hl pop bc djnz EDIT_insertLoopX jr EDIT_afterInsertLoopX EDIT_insOnlyOneColumnX3: ld hl,(LV_MAP_sizeX) add hl,de inc hl ex de,hl pop hl pop bc djnz EDIT_insertLoopX EDIT_afterInsertLoopX: ex de,hl ld hl,(addrMAP_sizeX) ld ix,(hl) add ix,de ld (hl),ix ld (LV_MAP_sizeX),ix ld hl,(addrMAP_sizeY) push de ld d,(hl) mlt de ld hl,(LV_maxBytesToSkip) add hl,de ld (LV_maxBytesToSkip),hl ld hl,(LV_bytesToSkip) ld de,(LV_MAP_sizeX) call divHLbyDE_naive pop de ld d,a mlt de ld hl,(LV_bytesToSkip) add hl,de ld (LV_bytesToSkip),hl ld hl,(LV_fstBlock) add hl,de ld (LV_fstblock),hl jp EDIT_mainloop EDIT_reduceMapX: bit FLG_blockInsDel, (iy+asm_flag1) jp nz,EDIT_mainloop set FLG_blockInsDel, (iy+asm_flag1) ; etend map cut (EMC) ld hl,(LV_MAP_sizeX) ld de,41 or a sbc hl,de jp c,EDIT_mainloop ld bc,-1 call EDIT_updateContexts ld hl,(addrMAP_sizeY) ld a,(hl) ld de,10 add a,e ld e,a ld hl,(LV_addrSpaceship) sbc hl,de ld (LV_addrSpaceship),hl ld hl,(LV_addrGravity) sbc hl,de ld (LV_addrGravity),hl ld hl,(addrMAP_sizeY) ld a,(hl) ld hl,10 ; we clear H and HLU add a,l ld l,a ; EMC push hl ; EMC call _op5toop1 call _chkFindSym ; in ram ex de,hl ld de,(hl) ; space call _setDEUTo0 ex de,hl pop bc or a sbc hl,bc ex de,hl ld (hl),de inc hl inc hl ld (hl),$FF ; erased by the LD ld a,(posCursorScrnX) ld de,0 ld e,a ld hl,(LV_fstBlock) add hl,de ld de,(LV_bytesToSkip) sbc hl,de ; EMC ld bc,(addrMAP_sizeY) ld a,(bc) ld b,10 add a,b ld b,a ; DE : nb to insert per line ; HL : addr to insert ; B : nb lines to process EDIT_deleteLoopX: push bc push hl ld de,1 call _DelMEM ; EMC pop hl ld de,(LV_MAP_sizeX) dec de add hl,de pop bc djnz EDIT_deleteLoopX ld hl,(addrMAP_sizeY) ld de,0 ld e,(hl) ld hl,(LV_maxBytesToSkip) or a sbc hl,de ld (LV_maxBytesToSkip),hl ld hl,(LV_bytesToSkip) ld de,(LV_MAP_sizeX) call divHLbyDE_naive ld de,0 ld e,a ld hl,(LV_bytesToSkip) or a sbc hl,de ld (LV_bytesToSkip),hl ld hl,(LV_fstBlock) sbc hl,de ld (LV_fstblock),hl ld hl,(LV_fstBlock) ; if we are at the end of the level... ld de,(LV_bytesToSkip) or a sbc hl,de ld de,(LV_beginningMap) sbc hl,de ld de,17+NBBLOCKSX add hl,de ld de,(LV_MAP_sizeX) sbc hl,de call nc,EDIT_scrollLeft ld hl,(addrMAP_sizeX) ld ix,(hl) dec ix ld (hl),ix ld (LV_MAP_sizeX),ix jp EDIT_mainloop EDIT_extendMapY: bit FLG_blockInsDel, (iy+asm_flag1) jp nz,EDIT_mainloop set FLG_blockInsDel, (iy+asm_flag1) call _op5toop1 call _chkFindSym ex de,hl ld ix,(hl) ld de,(LV_MAP_sizeX) add ix,de ld (hl),ix ex de,hl ld de,(LV_beginningMap) call _InsertMEM ex de,hl ld (hl),0 push hl pop de inc de ld bc,(LV_MAP_sizeX) dec bc ldir ld hl,(LV_maxBytesToSkip) ld de,(LV_MAP_sizeX) push de add hl,de ld (LV_maxBytesToSkip),hl ld hl,(addrMAP_sizeY) inc (hl) pop de ld hl,(LV_addrSpaceship) add hl,de ld (LV_addrSpaceship),hl ld hl,(LV_addrGravity) add hl,de ld (LV_addrGravity),hl jp EDIT_mainloop EDIT_reduceMapY: ld a,(kbdG6) bit kbitEnter, a jr nz,EDIT_reduceSuit res FLG_blockInsDel, (iy+asm_flag1) jp EDIT_mainloop EDIT_reduceSuit: bit FLG_blockInsDel, (iy+asm_flag1) jp nz,EDIT_mainloop set FLG_blockInsDel, (iy+asm_flag1) ld hl,(LV_maxBytesToSkip) ld de,0 or a sbc hl,de jp z,EDIT_mainloop ld de,(LV_MAP_sizeX) sbc hl,de ld (LV_maxBytesToSkip),hl call _op5toop1 call _chkFindSym ex de,hl push hl ld hl,(hl) ld de,(LV_MAP_sizeX) or a sbc hl,de ex de,hl pop hl ld (hl),de ld hl,(LV_beginningMap) ld de,(LV_MAP_sizeX) push de call _DelMEM pop de ld hl,(LV_addrSpaceship) or a sbc hl,de ld (LV_addrSpaceship),hl ld hl,(LV_addrGravity) sbc hl,de ld (LV_addrGravity),hl ld hl,(addrMAP_sizeY) dec (hl) ld hl,(LV_maxBytesToSkip) push hl ld de,(LV_bytesToSkip) or a sbc hl,de pop hl jp nc,EDIT_mainloop ld (LV_bytesToSkip),hl ld hl,(LV_fstblock) ld de,(LV_MAP_sizeX) or a sbc hl,de ld (LV_fstblock),hl jp EDIT_mainloop EDIT_updateContexts: ; Update contexts after a insertion/deletion of a column ; INPUT ; - BC : nb to add to the contexts below the current position ld hl,(LV_fstblock) ld de,(LV_bytesToSkip) or a sbc hl,de ld de,(LV_beginningMap) sbc hl,de ld de,11 add hl,de ld a,(posCursorScrnX) ld e,a add hl,de ex de,hl ld hl,(LV_addrGravity) ld a,2 EDIT_updateLoop: ex af,af' ld a,(hl) inc hl or a jr z,EDIT_noCtxt EDIT_updateCtxtLoop: push hl ld ix,(hl) lea hl,ix+0 or a sbc hl,de pop hl jr c,+_ add ix,bc ld (hl),ix _: inc hl inc hl inc hl dec a jr nz,EDIT_updateCtxtLoop EDIT_noCtxt: ex af,af' dec a jr nz,EDIT_updateLoop ret EDIT_displayLevel: ; Display the level ;ld hl,(currentDrawLoc) ;ld (hl),0 ;push hl ;pop de ;inc de ;ld bc,320*TIL_sizeY*MAP_sizeY-1 ;ldir ld de,(currentDrawLoc) inc de inc de ld hl,(LV_fstBlock) ld b,WIN_SIZEY EDIT_DISP_mapY: push bc ld b,NBBLOCKSX EDIT_DISP_mapX: push bc push hl ld a,(hl) ld bc,0 ld c,a sla a add a,c ld hl,_GD_tiles ld c,a add hl,bc ld hl,(hl) ld a,TIL_sizeY EDIT_DISP_blockY: ld bc,TIL_sizeX ldir ex de,hl ld bc,320-TIL_sizeX add hl,bc ex de,hl dec a jr nz,EDIT_DISP_blockY ld hl,-320*TIL_sizeY+TIL_sizeX add hl,de ex de,hl pop hl pop bc inc hl djnz EDIT_DISP_mapX ld bc,(LV_MAP_sizeX) add hl,bc ld bc,-NBBLOCKSX add hl,bc ex de,hl ld bc,320*TIL_sizeY - (NBBLOCKSX*TIL_sizeX) add hl,bc ex de,hl pop bc djnz EDIT_DISP_mapY ret EDIT_displayBlockChoice: ld hl,(currentDrawLoc) ld de,(320*TIL_sizeY*MAP_sizeY)+(320*1) add hl,de ld (hl),$7E push hl pop de inc de ld bc,320*240-((320*TIL_sizeY*MAP_sizeY)+(320*1))-1 ldir ld hl,(currentDrawLoc) ld de,(320*213)+147 add hl,de call EDIT_drawSquareSelection ld a,(currentBlock) ld hl,(currentDrawLoc) ld de,(320*216)+150 add hl,de call EDIT_drawTile call EDIT_prevBlock+5 ld a,(currentBlock) ld hl,(currentDrawLoc) ld de,(320*216)+80 add hl,de call EDIT_drawTile call EDIT_nextBlock+5 call EDIT_nextBlock+5 ld a,(currentBlock) ld hl,(currentDrawLoc) ld de,(320*216)+220 add hl,de call EDIT_drawTile jp EDIT_prevBlock+5 EDIT_drawTile: ; INPUT ; - A : n° tile ; - HL : Location push hl ld l,a ld h,3 mlt hl ld de,_GD_tiles add hl,de ld ix,(hl) pop hl bit FLG_twoPartTile, (iy+asm_flag1) jr nz,EDIT_drawTwoPartTile jp drawTile EDIT_drawTwoPartTile: push hl call EDIT_searchOtherPart inc hl ld l,(hl) ld h,3 mlt hl ld de,_GD_tiles add hl,de ld ix,(hl) pop hl ld de,6 ; recenter add hl,de ex af,af' call drawMiniTile push hl ex af,af' ld l,a ld h,3 mlt hl ld de,_GD_tiles add hl,de ld ix,(hl) pop hl jp drawMiniTile EDIT_drawSquareSelection: ; DESC ; Draw a 23*23px-long-square at coords HL ; INPUT ; HL : addr to start ld (hl),0 push hl pop de inc de ld bc,26 ldir ld bc,320-26 add hl,bc ex de,hl add hl,bc ex de,hl ld (hl),0 ld bc,26 ldir ld bc,320-26 add hl,bc ld b,23 EDIT_drawSquareSides: ld (hl),0 inc hl ld (hl),0 ld de,24 add hl,de ld (hl),0 inc hl ld (hl),0 ld de,320-26 add hl,de djnz EDIT_drawSquareSides ld (hl),0 push hl pop de inc de ld bc,26 ldir ld bc,320-26 add hl,bc ex de,hl add hl,bc ex de,hl ld (hl),0 ld bc,26 ldir ret EDIT_dispChgCtxt: ; INPUT ; - HL : data context ; - IX : sprite to display to inform of a changing of the current contexte push hl ld hl,(LV_fstblock) ld de,(LV_bytesToSkip) or a sbc hl,de ld de,(LV_beginningMap) sbc hl,de ex de,hl pop hl ld a,(hl) or a ret z ld b,a EDIT_searchCtxtInScreen: inc hl push hl push de push bc ld hl,(hl) ld bc,-11 add hl,bc or a sbc hl,de jr c,+_ ex de,hl ld hl,14 sbc hl,de jr c,+_ ; E = pos in screen ld d,TIL_sizeX mlt de ld hl,(currentDrawLoc) add hl,de inc hl inc hl ld de,320 push ix call drawSprite pop ix _: pop bc pop de pop hl inc hl inc hl djnz EDIT_searchCtxtInScreen ret EDIT_toogleCtxt: ; INPUT ; FLG_toogleCtxt: 0=gravity, 1=spaceship ; OUTPUT ; Data of the level modified bit FLG_blockInsDel, (iy+asm_flag1) jp nz,EDIT_mainloop set FLG_blockInsDel, (iy+asm_flag1) ld hl,(LV_fstblock) ld de,(LV_bytesToSkip) or a sbc hl,de ld de,(LV_beginningMap) sbc hl,de ld a,(posCursorScrnX) ld de,11 add a,e ld e,a add hl,de push hl pop bc ld hl,(LV_addrGravity) bit FLG_toogleCtxt, (iy+asm_flag1) jr z,+_ ld hl,(LV_addrSpaceship) _: push hl ld a,(hl) inc hl or a jr z,EDIT_addCtxt ; HL : addr current ctxt ; BC : addr behind cursor + 11 ; A : ctxts to check EDIT_ctxtLoop: ld de,(hl) ex de,hl or a sbc hl,bc jr z,EDIT_delCtxt ex de,hl jr nc,EDIT_addCtxt inc hl inc hl inc hl dec a jr nz,EDIT_ctxtLoop EDIT_addCtxt: ; INPUT ; DE : addr behind cursor + 11 ex de,hl ld hl,3 push bc call _InsertMEM pop hl ex de,hl ld (hl),de call _op5toop1 call _chkFindSym ex de,hl ld de,(hl) inc de inc de inc de ld (hl),de pop hl inc (hl) bit FLG_toogleCtxt, (iy+asm_flag1) jp nz,EDIT_mainloop ld hl,(LV_addrSpaceship) inc hl inc hl inc hl ld (LV_addrSpaceship),hl jp EDIT_mainloop EDIT_delCtxt: ; INPUT ; DE : addr behind cursor + 11 ex de,hl ld de,3 call _DelMEM call _op5toop1 call _chkFindSym ex de,hl ld de,(hl) dec de dec de dec de ld (hl),de pop hl dec (hl) bit FLG_toogleCtxt, (iy+asm_flag1) jp nz,EDIT_mainloop ld hl,(LV_addrSpaceship) dec hl dec hl dec hl ld (LV_addrSpaceship),hl jp EDIT_mainloop EDIT_getAddrBehindCursor: ; OUTPUT ; HL : ADDR of the block behind the cursor ; DE : value of LV_fstBlock ld a,(posCursorScrnY) ld de,(LV_MAP_sizeX) call _mult16by8 ld a,(posCursorScrnX) ld d,0 ld e,a add hl,de ld de,(LV_fstBlock) add hl,de ret EDIT_blockArrows: bit FLG_blockArrows, (iy+asm_flag1) set FLG_blockArrows, (iy+asm_flag1) ret z ld a,(timerArrow) or a ret z dec a ld (timerArrow),a ret ; nz EDIT_swapBuffers: ; Swaping Vram Buffers (double-Buffering) ld hl,vRam ld bc,(mpLcdBase) or a sbc hl,bc add hl,bc ; Is the current buffer the screen buffer? jr nz,EDIT_notCurrBuf ld hl,vram+(lcdWidth*lcdHeight) EDIT_notCurrBuf: ld (currentDrawLoc),bc ; Set the new buffer location to the old screen pointer ld bc,mpLcdIcr ld a,(bc) or a,4 ; bitLcdLnBuim ld (bc),a ld (mpLcdBase),hl EDIT_waitForSync: ; Wait fot the LCD to be ready to update ld a,(mpLcdRis) and a,4 ; bitLcdLnBuim jr z,EDIT_waitForSync ret EDIT_searchOtherPart: ; INPUT ; - A : tile to search ; OUTPUT ; - (hl+1) : correspondance ld b,(LUT_TPT_end - LUT_twoPartTiles)/2 ld hl,LUT_twoPartTiles _: ld c,(hl) cp c ret z inc hl inc hl djnz -_ ret divHLbyDE_naive: ; OUTPUT : ; A = HL/DE xor a ld bc,0 sbc hl,bc ret z DIV_loop: inc a sbc hl,de ret z jr nc,DIV_loop ret LUT_twoPartTiles: .db 15,6 .db 16,7 .db 17,8 .db 55,54 .db 48,39 LUT_TPT_end: