Last active
December 8, 2020 02:00
-
-
Save Chrispassold/c4c40f1683fc840d7d1054c6304aa3d3 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
; 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