PushWindow:: callfar _PushWindow ret ExitMenu:: push af callfar _ExitMenu pop af ret InitVerticalMenuCursor:: callfar _InitVerticalMenuCursor ret CloseWindow:: push af call ExitMenu call ApplyTilemap call UpdateSprites pop af ret RestoreTileBackup:: call MenuBoxCoord2Tile call .copy call MenuBoxCoord2Attr call .copy ret .copy call GetMenuBoxDims inc b inc c .row push bc push hl .col ld a, [de] ld [hli], a dec de dec c jr nz, .col pop hl ld bc, SCREEN_WIDTH add hl, bc pop bc dec b jr nz, .row ret PopWindow:: ld b, $10 ld de, wMenuFlags .loop ld a, [hld] ld [de], a inc de dec b jr nz, .loop ret GetMenuBoxDims:: ld a, [wMenuBorderTopCoord] ; top ld b, a ld a, [wMenuBorderBottomCoord] ; bottom sub b ld b, a ld a, [wMenuBorderLeftCoord] ; left ld c, a ld a, [wMenuBorderRightCoord] ; right sub c ld c, a ret CopyMenuData:: push hl push de push bc push af ld hl, wMenuDataPointer ld a, [hli] ld h, [hl] ld l, a ld de, wMenuDataFlags ld bc, wMenuDataEnd - wMenuDataFlags call CopyBytes pop af pop bc pop de pop hl ret GetWindowStackTop:: ld hl, wWindowStackPointer ld a, [hli] ld h, [hl] ld l, a inc hl ld a, [hli] ld h, [hl] ld l, a ret PlaceVerticalMenuItems:: call CopyMenuData ld hl, wMenuDataPointer ld e, [hl] inc hl ld d, [hl] call GetMenuTextStartCoord call Coord2Tile ; hl now contains the tilemap address where we will start printing text. inc de ld a, [de] ; Number of items inc de ld b, a .loop push bc call PlaceString inc de ld bc, 2 * SCREEN_WIDTH add hl, bc pop bc dec b jr nz, .loop ld a, [wMenuDataFlags] bit 4, a ret z call MenuBoxCoord2Tile ld a, [de] ld c, a inc de ld b, $0 add hl, bc jp PlaceString MenuBox:: call MenuBoxCoord2Tile call GetMenuBoxDims dec b dec c jp Textbox GetMenuTextStartCoord:: ld a, [wMenuBorderTopCoord] ld b, a inc b ld a, [wMenuBorderLeftCoord] ld c, a inc c ; bit 6: if not set, leave extra room on top ld a, [wMenuDataFlags] bit 6, a jr nz, .bit_6_set inc b .bit_6_set ; bit 7: if set, leave extra room on the left ld a, [wMenuDataFlags] bit 7, a jr z, .bit_7_clear inc c .bit_7_clear ret ClearMenuBoxInterior:: call MenuBoxCoord2Tile ld bc, SCREEN_WIDTH + 1 add hl, bc call GetMenuBoxDims dec b dec c call ClearBox ret ClearWholeMenuBox:: call MenuBoxCoord2Tile call GetMenuBoxDims inc c inc b call ClearBox ret MenuBoxCoord2Tile:: ld a, [wMenuBorderLeftCoord] ld c, a ld a, [wMenuBorderTopCoord] ld b, a Coord2Tile:: ; Return the address of wTilemap(c, b) in hl. xor a ld h, a ld l, b ld a, c ld b, h ld c, l add hl, hl add hl, hl add hl, bc add hl, hl add hl, hl ld c, a xor a ld b, a add hl, bc bccoord 0, 0 add hl, bc ret MenuBoxCoord2Attr:: ld a, [wMenuBorderLeftCoord] ld c, a ld a, [wMenuBorderTopCoord] ld b, a Coord2Attr:: ; Return the address of wAttrmap(c, b) in hl. xor a ld h, a ld l, b ld a, c ld b, h ld c, l add hl, hl add hl, hl add hl, bc add hl, hl add hl, hl ld c, a xor a ld b, a add hl, bc bccoord 0, 0, wAttrmap add hl, bc ret