Please examine the following assembly code from a 1980s IBM PC computer game. This game uses CGA graphics, PC speaker sound and keyboard input. The following code has been observed to be executed while the game is at a screen reading "LEVEL 1", before actual gameplay has begun. Can you tell me what these functions appear to be doing, and if possible suggest names for the functions?

FUN_0000_2e48()
PUSH       BP
SUB        SP,0x6
MOV        BP,SP
MOV        AX,0x28
PUSH       AX
PUSH       AX
PUSH       word ptr [0x2968]
CALL       FUN_0000_5ad6
MOV        SP,BP
MOV        AL,[0x17c]
XOR        AH,AH
SHL        AX,0x1
MOV        SI,AX
MOV        AX,0x64
PUSH       AX
MOV        AX,0x50
PUSH       AX
PUSH       word ptr [SI + 0x296a]
CALL       FUN_0000_5ad6
MOV        SP,BP
MOV        AL,[0x17a]
XOR        AH,AH
CMP        AX,0x3
MOV        word ptr [BP + 0x0],AX
MOV        [0x17b],AL
JGE        LAB_0000_2e8c
INC        AX
MOV        [0x17a],AL
JMP        LAB_0000_2e91
                             LAB_0000_2e8c
MOV        byte ptr [0x17a],0x0
                             LAB_0000_2e91
MOV        AL,[0x17b]
XOR        AH,AH
MOV        SI,AX
MOV        AL,byte ptr [SI + 0x176]
XOR        AH,AH
MOV        BL,byte ptr [0x17a]
XOR        BH,BH
MOV        CL,byte ptr [BX + 0x176]
XOR        CH,CH
PUSH       CX
PUSH       AX
PUSH       word ptr [0x2968]
CALL       FUN_0000_50b9
MOV        SP,BP
MOV        AL,[0x17c]
XOR        AH,AH
SHL        AX,0x1
MOV        SI,AX
MOV        AL,[0x17b]
XOR        AH,AH
MOV        DI,AX
MOV        AL,byte ptr [DI + 0x176]
XOR        AH,AH
MOV        BL,byte ptr [0x17a]
XOR        BH,BH
MOV        CL,byte ptr [BX + 0x176]
XOR        CH,CH
PUSH       CX
PUSH       AX
PUSH       word ptr [SI + 0x296a]
CALL       FUN_0000_50b9
MOV        SP,BP
ADD        SP,0x6
POP        BP
RET

FUN_0000_5ad6
PUSH       BP
MOV        BP,SP
MOV        SI,word ptr [BP + Stack[0x2]]
MOV        DX,word ptr [BP + Stack[0x4]]
MOV        BX,word ptr [BP + Stack[0x6]]
SUB        DX,0xa
LODSW      SI
INC        AX
TEST       AX,0x1
JZ         LAB_0000_5aed
INC        AX
                             LAB_0000_5aed 
SHR        AX,0x1
MOV        [0x5ff2],AX
LODSW      SI
INC        AX
MOV        [0x5ff4],AX
SHL        BX,0x1
MOV        AX,DX
SHR        AX,0x1
MOV        BP,AX
TEST       DX,0x1
JZ         LAB_0000_5b06
DEC        DX
                             LAB_0000_5b06
MOV        CX,word ptr [0x5ff2]
MOV        DX,word ptr [0x5ff4]
PUSH       ES
MOV        AX,DAT_0000_b800
MOV        ES,AX
                             LAB_0000_5b14
MOV        DI,word ptr [BX + 0x5c46]
ADD        DI,BP
PUSH       BP
PUSH       CX
MOVSB.REP  ES:DI,SI
POP        CX
POP        BP
INC        BX
INC        BX
DEC        DX
JNZ        LAB_0000_5b14
POP        ES
POP        BP
RET

FUN_0000_50b9 
PUSH       BP
SUB        SP,0xe
MOV        BP,SP
MOV        SI,word ptr [BP + Stack[0x2]]
MOV        AL,byte ptr [SI]
XOR        AH,AH
INC        SI
INC        SI
MOV        BL,byte ptr [SI]
XOR        BH,BH
MOV        CX,SI
MOV        word ptr [BP + Stack[0x2]],CX
INC        CX
INC        CX
MOV        word ptr [BP + local_6],BX
INC        BX
MOV        word ptr [BP + local_8],AX
INC        AX
INC        AX
MOV        word ptr [BP + local_8],AX
MOV        word ptr [BP + 0x0],BX
MOV        word ptr [BP + local_6],BX
MOV        BX,0x2
CWD
IDIV       BX
MOV        word ptr [BP + local_e],AX
MOV        AX,word ptr [BP + 0x0]
MOV        BX,word ptr [BP + local_e]
IMUL       BX
MOV        word ptr [BP + local_4],0x0
MOV        word ptr [BP + local_a],AX
MOV        word ptr [BP + Stack[0x2]],CX
                             LAB_0000_5101
MOV        AX,word ptr [BP + local_4]
CMP        AX,word ptr [BP + local_a]
JGE        LAB_0000_5167
MOV        byte ptr [BP + local_b],0x0
MOV        SI,word ptr [BP + Stack[0x2]]
MOV        AL,byte ptr [SI]
XOR        AH,AH
MOV        byte ptr [BP + local_c],AL
AND        AX,0xf0
MOV        BX,word ptr [BP + Stack[0x4]]
AND        BX,0xf0
CMP        AX,BX
JNZ        LAB_0000_512e
MOV        AX,word ptr [BP + Stack[0x6]]
AND        AX,0xf0
MOV        byte ptr [BP + local_b],AL
                             LAB_0000_512e
MOV        AL,byte ptr [BP + local_c]
XOR        AH,AH
AND        AX,0xf
MOV        BX,word ptr [BP + Stack[0x4]]
AND        BX,0xf
CMP        AX,BX
JNZ        LAB_0000_5151
MOV        AX,word ptr [BP + Stack[0x6]]
AND        AX,0xf
MOV        BL,byte ptr [BP + local_b]
XOR        BH,BH
OR         BX,AX
MOV        byte ptr [BP + local_b],BL
                             LAB_0000_5151
MOV        AL,byte ptr [BP + local_b]
XOR        AH,AH
TEST       AX,AX
JZ         LAB_0000_515f
MOV        SI,word ptr [BP + Stack[0x2]]
MOV        byte ptr [SI],AL
                             LAB_0000_515f
INC        word ptr [BP + Stack[0x2]]
INC        word ptr [BP + local_4]
JMP        LAB_0000_5101
                             LAB_0000_5167
ADD        SP,0xe
POP        BP
RET