Skip to content

Instantly share code, notes, and snippets.

@Chrispassold
Last active December 8, 2020 02:00
Embed
What would you like to do?
; multi-segment executable file template.
FINAL_PONTOS equ 33
PONTOS_NORMAL equ 1 ; quando acerta um W
PONTOS_ESPECIAL equ 3 ; quando acerta um *
data segment
; add your data here!
NAVES_SPACE:
DB " w w w ",13,10
DB " w w w w w w ",13,10
DB "w * w w * w w * w",13,10
DB " w w w w w w ",13,10
DB " w w w ",13,10,"$"
CANHAO:
DB " ",13,10
DB " _^_ ","$"
POSICAO_CANHAO DW 0
;0 A 75
SENTIDO_NAVE DB 00000000B ; DIREITA
;11111111B ; ESQUERDA
CONTADOR_SENTIDO_NAVE DB 0
TICKS_NAVE DB 0
TIROS DW 50
INVADER_DOWN DW 0
PONTOS DW 0
MSG_FIM:
DB "FIM DE JOGO!!!",13,10,"$"
MSG_PONTOS:
DB "Pontos: ",13,10,"$"
MSG_TEMPO:
DB "Tempo: ",13,10,"$"
MSG_LIMPA_PLACAR:
DB "b",13,10,"$"
MINUTOS DW 0
SEGUNDOS DW 0
ULTIMO_SEGUNDO DB ?
DOIS_PONTOS DB ":","$"
ends
stack segment
dw 128 dup(0)
ends
code segment
start:
; set segment registers:
MOV AH,25H
MOV AL,1CH
LEA DX, SYSTICK
MOV SI, SEG SYSTICK
MOV DS, SI
INT 21H
mov ax, data
mov ds, ax
mov ax, 0b800h
mov es, ax
mov MINUTOS, 0
mov SEGUNDOS, 0
mov ULTIMO_SEGUNDO, 0
CALL CLRSCR
CALL APAGA_CURSOR
CALL IMPRIMIR_NAVES
CALL IMPRIMIR_CANHAO
CALL PLACAR_TIROS
AGUARDA_TECLA:
CALL CRONOMETRO
MOV AH,1 ; SE NAO TIVERMOS TECLAS NO BUFFER, Z=1
INT 16H
JZ AGUARDA_TECLA
MOV AH,0
INT 16H ; TIRA DO BUFFER A TECLA --> AL
;A = LEFT, D=DIREITA, F=FIM, SPACE=TIRO
CMP AL,"A"
JE CANHAO_ESQUERDA
CMP AL,"a"
JE CANHAO_ESQUERDA
CMP AL,"D"
JE CANHAO_DIREITA
CMP AL,"d"
JE CANHAO_DIREITA
CMP AL," "
JE PREPARA_TIRO
CMP AL,"Q"
JE FIM_SPACE_INVADERS
CMP AL,"q"
JE FIM_SPACE_INVADERS
JMP AGUARDA_TECLA
FIM_SPACE_INVADERS:
mov ax, 4c00h ; exit to operating system.
int 21h
CLRSCR:
PUSHF
PUSH SI
PUSH AX
PUSH BX
PUSH DX
MOV SI,0
CLRSCR_APAGANDO:
MOV ES:[SI]," "
MOV ES:[SI+1],0FH
ADD SI,2
CMP SI,25*160
JE SAI_CLRSCR
JMP CLRSCR_APAGANDO
SAI_CLRSCR:
;Set cursor position AH=02h BH = Page Number, DH = Row, DL = Column
MOV AH,2
MOV BH,0
MOV DH,0
MOV DL,0
INT 10H
POP DX
POP BX
POP AX
POP SI
POPF
RET
APAGA_CURSOR:
PUSHF
PUSH AX
PUSH CX
MOV AH,1
MOV CH,28H
MOV CL,09H
INT 10H
POP CX
POP AX
POPF
RET
IMPRIMIR_NAVES:
PUSHF
PUSH AX
PUSH DX
MOV AH,9
LEA DX, NAVES_SPACE
INT 21H
POP DX
POP AX
POPF
RET
IMPRIMIR_CANHAO:
PUSHF
PUSH AX
PUSH BX
PUSH DX
MOV AH,2
MOV BH,0
MOV DH,22
MOV DL,0
INT 10H
MOV AH,9
LEA DX,CANHAO
INT 21H
POP DX
POP BX
POP AX
POPF
RET
SCROOL_LATERAL_LEFT_CANHAO:
PUSHF
PUSH SI
PUSH AX
MOV SI, 23*160
SCROOL_LATERAL_LEFT_MOVE_CANHAO:
MOV AL, ES:[SI+2]
MOV ES:[SI],AL
ADD SI,2
CMP SI, 24*160
JE SCROOL_LATERAL_LEFT_SAI_CANHAO
JMP SCROOL_LATERAL_LEFT_MOVE_CANHAO
SCROOL_LATERAL_LEFT_SAI_CANHAO:
POP AX
POP SI
POPF
RET
SCROOL_LATERAL_RIGHT_CANHAO:
PUSHF
PUSH SI
PUSH AX
MOV SI, 24*160
SCROOL_LATERAL_RIGHT_MOVE_CANHAO:
MOV AL,ES:[SI-2]
MOV ES:[SI],AL
SUB SI,2
CMP SI,23*160
JE SCROOL_LATERAL_RIGHT_SAI_CANHAO
JMP SCROOL_LATERAL_RIGHT_MOVE_CANHAO
SCROOL_LATERAL_RIGHT_SAI_CANHAO:
POP AX
POP SI
POPF
RET
CANHAO_ESQUERDA:
CMP POSICAO_CANHAO,0
JE AGUARDA_TECLA
CALL SCROOL_LATERAL_LEFT_CANHAO
DEC POSICAO_CANHAO
JMP AGUARDA_TECLA
CANHAO_DIREITA:
CMP POSICAO_CANHAO,75
JE AGUARDA_TECLA
CALL SCROOL_LATERAL_RIGHT_CANHAO
INC POSICAO_CANHAO
JMP AGUARDA_TECLA
PREPARA_TIRO:
PUSHF
PUSH SI
PUSH BX
DEC TIROS
CALL COMP_TEM_TIROS
;CMP TIROS,9
CALL LIMPA_PLACAR
CALL PLACAR_TIROS
MOV CX,360 ; 360HZ
CALL STARTSOUND
CALL DELAYSOUND
CALL STOPSOUND
MOV SI,22*160+4
MOV BX, POSICAO_CANHAO
ROL BX,1
MOV ES:[SI+BX],"^"
POP BX
POP SI
POPF
JMP AGUARDA_TECLA
COMP_TEM_TIROS:
CMP TIROS, 0
JE FIM_DE_PROGRAMA
RET
SCROOL_LATERAL_RIGHT_NAVE:
PUSHF
PUSH SI
PUSH AX
MOV SI, 5*160
SCROOL_LATERAL_RIGHT_NAVE_MOVE:
MOV AL, ES:[SI-2]
MOV ES:[SI],AL
SUB SI,2
CMP SI, 0*160
JE SCROOL_LATERAL_RIGHT_SAI
JMP SCROOL_LATERAL_RIGHT_NAVE_MOVE
SCROOL_LATERAL_RIGHT_SAI:
POP AX
POP SI
POPF
RET
SCROOL_LATERAL_LEFT_NAVE:
PUSHF
PUSH SI
PUSH AX
MOV SI,0*160
SCROOL_LATERAL_LEFT_NAVE_MOVE:
MOV AL,ES:[SI+2]
MOV ES:[SI],AL
ADD SI,2
CMP SI,5*160
JE SCROOL_LATERAL_LEFT_NAVE_SAI
JMP SCROOL_LATERAL_LEFT_NAVE_MOVE
SCROOL_LATERAL_LEFT_NAVE_SAI:
POP AX
POP SI
POPF
RET
MOVIMENTA_NAVES:
CMP SENTIDO_NAVE,00000000B
JE SENTIDO_NAVE_DIREITA
JMP SENTIDO_NAVE_ESQUERDA
SENTIDO_NAVE_DIREITA:
CALL SCROOL_LATERAL_RIGHT_NAVE
INC CONTADOR_SENTIDO_NAVE
CMP CONTADOR_SENTIDO_NAVE,49
JE ATINGIU_LIMITE_DIREITA
RET
ATINGIU_LIMITE_DIREITA:
MOV SENTIDO_NAVE,11111111B
MOV CONTADOR_SENTIDO_NAVE,0
RET
SENTIDO_NAVE_ESQUERDA:
CALL SCROOL_LATERAL_LEFT_NAVE
INC CONTADOR_SENTIDO_NAVE
CMP CONTADOR_SENTIDO_NAVE,49
JE ATINGIU_SENTIDO_ESQUERDA
RET
ATINGIU_SENTIDO_ESQUERDA:
MOV CONTADOR_SENTIDO_NAVE,0
MOV SENTIDO_NAVE,00000000B
RET
MOVE_TIROS:
PUSHF
PUSH SI
PUSH AX
MOV SI, 0*160
MOV CX, 23*80
PROCURA_TIRO:
CMP ES:[SI],"^"
JE MOVIMENTA_TIRO_PARA_CIMA
ADD SI,2
LOOP PROCURA_TIRO
POP AX
POP SI
POPF
RET
MOVIMENTA_TIRO_PARA_CIMA:
MOV ES:[SI]," "
CALL CHECA_PONTUACAO
MOV ES:[SI-160],"^"
ADD SI,2
LOOP PROCURA_TIRO
POP AX
POP SI
POPF
RET
;
;
;SPACE INVADERS
;
;Arthur Ruan Caviquioli
;Christian Passold
;Guilherme Souza dos Santos
;Luma Kuhl
;
;Regra pontuacao
; w vale 1 ponto
; * vale 3 pontos
;quantidade de tiros = 50
;tempo crescente
;audios, tiro mais agudo, acerto das naves mais grave
;quando o tiro e disparado
;arthur
CHECA_PONTUACAO:
CMP ES:[SI-160], "w"
JE INC_P
JMP CMP_ASTE
INC_P:
CALL INCREMENTA_PONTOS_P
CMP_ASTE:
CMP ES:[SI-160], "*"
JE INC_ASTE
JMP CMP_PONTOS
INC_ASTE:
CALL INCREMENTA_PONTOS_ASTE
CMP_PONTOS:
CMP PONTOS, FINAL_PONTOS
JE FIM_DE_PROGRAMA
RET
INCREMENTA_PONTOS_P:
PUSHF
PUSH CX
MOV CX,215 ; 215HZ
CALL STARTSOUND
CALL DELAYSOUND
CALL STOPSOUND
ADD PONTOS,PONTOS_NORMAL
CALL PLACAR_PONTOS
POP CX
POPF
RET
INCREMENTA_PONTOS_ASTE:
PUSHF
PUSH CX
MOV CX,238 ; 261HZ
CALL STARTSOUND
CALL DELAYSOUND
CALL STOPSOUND
ADD PONTOS, PONTOS_ESPECIAL
CALL PLACAR_PONTOS
POP CX
POPF
RET
;MENSAGENS FINAIS
;gui
IMPRIMI_MSG_FIM:
pushf
push ax
push bx
push dx
MOV AH,2
MOV BH,0
MOV DH,11
MOV DL,35
INT 10H
MOV AH,9
LEA DX,MSG_FIM
INT 21H
pop dx
pop bx
pop ax
popf
RET
IMPRIMI_MSG_PONTUACAO:
pushf
push ax
push bx
push dx
MOV AH,2
MOV BH,0
MOV DH,12
MOV DL,35
INT 10H
MOV AH,9
LEA DX,MSG_PONTOS
INT 21H
pop dx
pop bx
pop ax
popf
RET
IMPRIMI_PONTUACAO:
pushf
push ax
push bx
push dx
MOV AH,2
MOV BH,0
MOV DH,12
MOV DL,46
INT 10H
MOV AX,PONTOS
CALL PRINT_AX
pop dx
pop bx
pop ax
popf
RET
IMPRIMI_MSG_TEMPO:
pushf
push ax
push bx
push dx
MOV AH,2
MOV BH,0
MOV DH,13
MOV DL,35
INT 10H
MOV AH,9
LEA DX,MSG_TEMPO
INT 21H
pop dx
pop bx
pop ax
popf
RET
IMPRIMI_TEMPO:
PUSHF
push ax
push bx
push dx
MOV AH,2
MOV BH,0
MOV DH,13
MOV DL,46
INT 10H
mov ax, MINUTOS
CALL print_ax
call PRINT_DOIS_PONTOS
mov ax, SEGUNDOS
CALL print_ax
pop dx
pop bx
pop ax
popf
RET
LOOP_FINAL:
mov ax, 4c00h ; exit to operating system.
int 21h
JMP LOOP_FINAL
;luma
PLACAR_TIROS:
PUSHF
PUSH AX
PUSH BX
PUSH DX
MOV AH,2
MOV BH,0
MOV DH,24 ;linha
MOV DL,40 ;coluna
INT 10H
MOV AX,TIROS
CALL PRINT_AX
POP DX
POP BX
POP AX
POPF
RET
LIMPA_PLACAR:
PUSHF
PUSH SI
MOV SI,3922 ;24*160+40
MOV ES:[SI]," "
POP SI
POPF
RET
PLACAR_PONTOS:
PUSHF
PUSH AX
PUSH BX
PUSH DX
MOV AH,2
MOV BH,0
MOV DH,24
MOV DL,44
INT 10H
MOV AX,PONTOS
CALL PRINT_AX
POP DX
POP BX
POP AX
POPF
RET
;chris
CRONOMETRO:
PUSHF
PUSH AX
PUSH BX
PUSH DX
MOV AH,2
MOV BH,0
MOV DH,24
MOV DL,55
INT 10H
mov ax, MINUTOS
CALL print_ax
call PRINT_DOIS_PONTOS
mov ax, SEGUNDOS
CALL print_ax
CALL cronometro_update
POP DX
POP BX
POP AX
POPF
RET
PRINT_DOIS_PONTOS:
PUSHF
PUSH AX
PUSH DX
MOV AH,9
LEA DX,DOIS_PONTOS
INT 21H
POP DX
POP AX
POPF
RET
cronometro_update: ;ATUALIZA CRONOMETRO
pushf
push ax
push dx
push cx
mov ah, 2ch ;Get time
int 21h
cmp ULTIMO_SEGUNDO, dh
jne inc_segundos
jmp fim_cronometro_update
inc_segundos:
mov ULTIMO_SEGUNDO, dh
inc SEGUNDOS
cmp SEGUNDOS,60
jne fim_cronometro_update
inc MINUTOS
mov SEGUNDOS,0
fim_cronometro_update:
pop cx
pop dx
pop ax
popf
ret ; interrupt return!!!!!!!!!!!!!!!!!!!!
FIM_DE_PROGRAMA:
CALL CLRSCR
CALL IMPRIMI_MSG_FIM
CALL IMPRIMI_MSG_PONTUACAO
CALL IMPRIMI_PONTUACAO
CALL IMPRIMI_MSG_TEMPO
CALL IMPRIMI_TEMPO
JMP LOOP_FINAL
;NOSSO CODIGO
;
;
;
;
;
;
;18x por segundo = T = 1/f = 0,055s = 2 x 0,055s = 2 x 55ms = 110ms 6*110ms 660ms
SYSTICK:
PUSHF
INC TICKS_NAVE
CMP TICKS_NAVE,9
JE SYSTICK_MOVIMENTA_NAVE
JMP SYSTICK_SAI
SYSTICK_MOVIMENTA_NAVE:
CALL MOVIMENTA_NAVES
MOV TICKS_NAVE,0
SYSTICK_SAI:
CALL MOVE_TIROS
POPF
IRET
print_ax proc
cmp ax, 0
jne print_ax_r
push ax
mov al, '0'
mov ah, 0eh
int 10h
pop ax
ret
print_ax_r:
pusha
mov dx, 0
cmp ax, 0
je pn_done
mov bx, 10
div bx
call print_ax_r
mov ax, dx
add al, 30h
mov ah, 0eh
int 10h
jmp pn_done
pn_done:
popa
ret
endp
; 1.19MHZ---- / DIVISAO = HZ
STARTSOUND: ;CX=FREQUENCY IN HERTZ. DESTROYS AX & DX
PUSH AX
PUSH DX
CMP CX, 014H
JB STARTSOUND_DONE
;CALL STOPSOUND
IN AL, 061H
;AND AL, 0FEH
;OR AL, 002H
OR AL, 003H
DEC AX
OUT 061H, AL ;TURN AND GATE ON; TURN TIMER OFF
MOV DX, 00012H ;HIGH WORD OF 1193180
MOV AX, 034DCH ;LOW WORD OF 1193180
DIV CX
MOV DX, AX
MOV AL, 0B6H
PUSHF
CLI ;!!!
OUT 043H, AL
MOV AL, DL
OUT 042H, AL
MOV AL, DH
OUT 042H, AL
POPF
IN AL, 061H
OR AL, 003H
OUT 061H, AL
STARTSOUND_DONE:
POP DX
POP AX
RET
STOPSOUND: ;DESTROYS AL F
PUSH AX
IN AL, 061H
AND AL, 0FCH
OUT 061H, AL
POP AX
RET
DELAYSOUND:
PUSH CX
MOV CX,0FFFFH
PAUSE1:
LOOP PAUSE1
POP CX
RET
ends
end start ; set entry point and stop the assembler.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment