Página 1 de 1

JOGO DA FORCA

MensagemEnviado: 03 Nov 2011 08:23
por tcpipchip
Programa exemplo que fiz para gurizada...usei o emu8086.com
Código: Selecionar todos
; multi-segment executable file template.

data segment
    PALAVRA  DB "MIGUEL$"
    RESPOSTA DB "------$"
    PULALINHA DB 13,10,"$"
    MENSAGEM DB "ENTRE COM UMA LETRA",13,10,"$"
    SEGUNDOS_INICIAL DW 0
    SEGUNDOS_FINAL   DW 0
    MEN_PERD DB "INFELIZMENTE ACABARAM SUAS CHANCES",13,10,"$"
    RAPIDO   DB "PARABENS, RESOLVEU DENTRO DO TEMPO",13,10,"$"
    LENTO    DB "SINTO MUITO, VOCE NAO RESPONDEU A TEMPO",13,10,"$"
    CABECA   DB "         ***            ",13,10 ;CABECA
             DB "        *****           ",13,10
             DB "         * *            ",13,10
             DB "          *             ",13,10
             DB "         * *            ",13,10
             DB "          *             ",13,10,"$"
    PESCO    DB "          *             ",13,10
             DB "          *             ",13,10
             DB "          *             ",13,10
             DB "          *             ",13,10
             DB "          *             ",13,10
             DB "          *             ",13,10,"$"
    BRACOS   DB "         ***            ",13,10
             DB "        *****           ",13,10
             DB "       * *** *          ",13,10
             DB "      *  ***  *         ",13,10
             DB "     *   ***   *        ",13,10
             DB "         ***            ",13,10,"$"
    PERNAS   DB "         ***            ",13,10
             DB "         * *            ",13,10
             DB "         * *            ",13,10
             DB "         * *            ",13,10
             DB "         * *            ",13,10
             DB "         * *            ",13,10,"$"
    SAPATOS  DB "         * *            ",13,10
             DB "      **** ****         ",13,10
             DB "      **** ****         ",13,10
             DB "      **** ****         ",13,10
             DB "      **** ****         ",13,10
             DB "      **** ****         ",13,10,"$"
ends

stack segment
    dw   128  dup(0)
ends

code segment
start:
; set segment registers:
    mov ax, data
    mov ds, ax

    ; add your code here
   
    CALL PEGA_HORA_INICIAL
   
    XOR CH,CH
   
CONTINUA:   
    CALL IMPRIME_FORCA
    CALL IMPRIME_MENSAGEM     
    CALL ENTRA_LETRA
    MOV DH,'N'
    CALL PROCURA_LETRA
    CMP DH,'S'
    JE  VERIFICA_SE_ACABOU
    INC CH
    CALL IMPRIME_BONECO
    CMP CH,5
    JE  PERDIDO
    JMP CONTINUA


PERDIDO:
    MOV AH,9
    MOV DX, OFFSET MEN_PERD
    INT 21H
    MOV AH,9
    MOV DX,OFFSET PALAVRA
    INT 21H
    JMP FINALIZA2
                   
   
VERIFICA_SE_ACABOU:
    CALL ACABOU
    CMP DH,'N'
    JE FINALIZA
    JMP CONTINUA
   
FINALIZA:           
    CALL IMPRIME_FORCA
    CALL PEGA_HORA_FINAL
    CALL CALCULA_TEMPO
   
FINALIZA2:           
    mov ax, 4c00h ; exit to operating system.
    int 21h   

IMPRIME_FORCA:
    MOV AH,9     
    MOV DX, OFFSET RESPOSTA
    INT 21H
PULA_LINHA:
    MOV AH,9   
    MOV DX, OFFSET PULALINHA
    INT 21H
    RET   
IMPRIME_MENSAGEM:
    MOV AH,9
    MOV DX, OFFSET MENSAGEM
    INT 21H
    RET
ENTRA_LETRA:
    ; RETORNA EM AL
    MOV AH,8
    INT 21H
    RET

PROCURA_LETRA:
    MOV SI,0
    MOV BX, OFFSET PALAVRA
PROXIMA:       
    MOV CL,'$' 
    CMP [BX+SI],CL
    JE  FIM_PROCURA

    CMP [BX+SI],AL
    JE  MOVIMENTA
    INC SI 
    JMP PROXIMA
FIM_PROCURA:
    RET           
         
   
MOVIMENTA:
    MOV DH,'S'               
    PUSH BX
    MOV BX,OFFSET RESPOSTA
    MOV [BX+SI],AL
    POP BX
    INC SI
    JMP PROXIMA
   
ACABOU:
    ;RETORNA EM DH SE ACABOU OU NAO
    PUSH BX
    MOV DH,'N'   
    MOV BX, OFFSET RESPOSTA
COMPARA_ACHOU:
    MOV DL,'$'
    CMP [BX],DL
    JE  FIM_ACABOU
    MOV DL,'-'
    CMP [BX],DL
    JE  ACHOU_
    INC BX
    JMP COMPARA_ACHOU
ACHOU_:
    MOV DH,'S'
FIM_ACABOU:
    POP BX
    RET   

IMPRIME_BONECO:
    CMP CH,1
    JNE PART2
    JMP ULTIMO_CABECA

PART2:
    CMP CH,2
    JNE PART3             
    JMP ULTIMO_PESCOCO
   
PART3:                 
    CMP CH,3           
    JNE PART4
    JMP ULTIMO_BRACOS

   
PART4:
    CMP CH,4
    JNE PART5
    JMP ULTIMO_PERNAS

PART5:
    CMP CH,5
    JNE PART6
    JMP ULTIMO_SAPATOS

PART6:
    RET

IMPRIME_CABECA:
    MOV AH,9
    MOV DX, OFFSET CABECA
    INT 21H
    RET

IMPRIME_PESCOCO:
    MOV AH,9
    MOV DX, OFFSET PESCO
    INT 21H
    RET


IMPRIME_BRACOS:
    MOV AH,9
    MOV DX, OFFSET BRACOS
    INT 21H
    RET

IMPRIME_PERNAS:
    MOV AH,9
    MOV DX, OFFSET PERNAS
    INT 21H
    RET

IMPRIME_SAPATO:
    MOV AH,9
    MOV DX, OFFSET SAPATOS
    INT 21H
    RET             
   
ULTIMO_SAPATOS:
    CALL IMPRIME_CABECA
    CALL IMPRIME_PESCOCO
    CALL IMPRIME_BRACOS
    CALL IMPRIME_PERNAS
    CALL IMPRIME_SAPATO
    RET
   
ULTIMO_PERNAS:
    CALL IMPRIME_CABECA
    CALL IMPRIME_PESCOCO
    CALL IMPRIME_BRACOS
    CALL IMPRIME_PERNAS
    RET

ULTIMO_BRACOS:
    CALL IMPRIME_CABECA
    CALL IMPRIME_PESCOCO
    CALL IMPRIME_BRACOS
    RET

ULTIMO_PESCOCO:
    CALL IMPRIME_CABECA
    CALL IMPRIME_PESCOCO
    RET       
   
ULTIMO_CABECA:
    CALL IMPRIME_CABECA
    RET       
   
PEGA_HORA_INICIAL:
    MOV AH,2CH         
    INT 21H
    MOV AL,60
    MUL CL   
    ; CL CONTEM MINUTOS
    ; AX TEM SEGUNDOS (AX = AL * CL)
    ; AX TEM SEGUNDOS (AX = 60 * MINUTOS)
    ; DH CONTEM SEGUNDOS
    ; DX = DH         DL
    ; DX = SEGUNDOS   DL=SUJEIRA
   
    XCHG DH,DL ; TRANFORMA DH EM BITS MENOS
    MOV  DH,0  ; SIGNIFICATIVOS DE DX E ANULA DH
               ; DX = DH=0 E DL=SEGUNDOS
    ADD  AX,DX ; SOMA MAIS SEGUNDOS
    MOV  WORD PTR SEGUNDOS_INICIAL,AX   
    RET                                     

PEGA_HORA_FINAL:
    MOV AH,2CH         
    INT 21H
    MOV AL,60
    MUL CL   
    ; CL CONTEM MINUTOS
    ; AX TEM SEGUNDOS (AX = AL * CL)
    ; AX TEM SEGUNDOS (AX = 60 * MINUTOS)
    ; DH CONTEM SEGUNDOS
    ; DX = DH         DL
    ; DX = SEGUNDOS   DL=SUJEIRA
   
    XCHG DH,DL ; TRANFORMA DH EM BITS MENOS
    MOV  DH,0  ; SIGNIFICATIVOS DE DX E ANULA DH
               ; DX = DH=0 E DL=SEGUNDOS
    ADD  AX,DX ; SOMA MAIS SEGUNDOS                 
    MOV  WORD PTR SEGUNDOS_FINAL,AX
    RET                                     

CALCULA_TEMPO:
    MOV AX,WORD PTR SEGUNDOS_FINAL
    MOV BX,WORD PTR SEGUNDOS_INICIAL
    SUB AX,BX
    CALL PRINT_AX
    CMP AX,10
    JLE PARABENS
    MOV AH,9
    MOV DX, OFFSET LENTO
    INT 21H
    RET   
   
PARABENS:
    MOV AH,9
    MOV DX, OFFSET RAPIDO
    INT 21H
    RET

;===================================
; rotina do emu8086.com
   
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


print_nl proc
    push ax 
    push dx 
    mov ah, 2
    mov dl, 0Dh
    int 21h 
    mov dl, 0Ah
    int 21h   
    pop dx
    pop ax     
    ret
endp   
       
       
ends

end start ; set entry point and stop the assembler.

MensagemEnviado: 04 Nov 2011 18:20
por enigmabox
Legal tcpipchip,

Hora que tiver tempo vou carregar seu codigo Assembly numa maquina antiga que tenho aqui pra ver o que acontece.....

:wink:

MensagemEnviado: 05 Nov 2011 14:23
por fender
Tcpipchip, seu livro de java para microcontrolador já está à venda?

MensagemEnviado: 07 Nov 2011 09:27
por tcpipchip
Infelizmente, ainda nao...
Estamos reescrevendo...pq a programacao será agora via MPLAB-X...tambem encaminhamos a proposta do livro para a editora da universidade e estamos aguardando a resposta e liberacao da grana para imprimir 1000 livros..
TCPIPCHIP

MensagemEnviado: 08 Nov 2011 21:00
por mastk
Ja faz tempo que nao vejo um codigo em ASM bem feitinho assim. So de lembrar os que tenho que dar manutencao tenho vontade de chorar.

MensagemEnviado: 09 Nov 2011 07:36
por fabim
Fazia tempos que não via um professor com tanto tempo ocioso assim.
Se escreve-se mais, teriam mais livros pra gente ler e aprender..

ULTIMA VERSAO

MensagemEnviado: 15 Nov 2011 15:08
por tcpipchip
Código: Selecionar todos
; multi-segment executable file template.

data segment
    PALAVRA  DB "MIGUEL$"
    RESPOSTA DB "------$"
    PULALINHA DB 13,10,"$"
    MENSAGEM DB "ENTRE COM UMA LETRA",13,10,"$"
    SEGUNDOS_INICIAL DW 0
    SEGUNDOS_FINAL   DW 0
    MEN_PERD DB "INFELIZMENTE ACABARAM SUAS CHANCES",13,10,"$"
    RAPIDO   DB "PARABENS, RESOLVEU DENTRO DO TEMPO",13,10,"$"
    LENTO    DB "SINTO MUITO, VOCE NAO RESPONDEU A TEMPO",13,10,"$"
    CABECA   DB "         ***            ",13,10 ;CABECA
             DB "        *****           ",13,10
             DB "         * *            ",13,10
             DB "          *             ",13,10
             DB "         * *            ",13,10
             DB "          *             ",13,10,"$"
    PESCO    DB "          *             ",13,10
             DB "          *             ",13,10
             DB "          *             ",13,10
             DB "          *             ",13,10
             DB "          *             ",13,10
             DB "          *             ",13,10,"$"
    BRACOS   DB "         ***            ",13,10
             DB "        *****           ",13,10
             DB "       * *** *          ",13,10
             DB "      *  ***  *         ",13,10
             DB "     *   ***   *        ",13,10
             DB "         ***            ",13,10,"$"
    PERNAS   DB "         ***            ",13,10
             DB "         * *            ",13,10
             DB "         * *            ",13,10
             DB "         * *            ",13,10
             DB "         * *            ",13,10
             DB "         * *            ",13,10,"$"
    SAPATOS  DB "         * *            ",13,10
             DB "      **** ****         ",13,10
             DB "      **** ****         ",13,10
             DB "      **** ****         ",13,10
             DB "      **** ****         ",13,10
             DB "      **** ****         ",13,10,"$"
ends

stack segment
    dw   128  dup(0)
ends

code segment
start:
; set segment registers:
    mov ax, data
    mov ds, ax

    ; add your code here
   
    CALL PEGA_HORA_INICIAL
   
    XOR CH,CH
   
CONTINUA:   
    CALL IMPRIME_FORCA
    CALL IMPRIME_MENSAGEM     
    CALL ENTRA_LETRA
    MOV DH,'N'
    CALL PROCURA_LETRA
    CMP DH,'S'
    JE  VERIFICA_SE_ACABOU
    INC CH
    CALL IMPRIME_BONECO
    CMP CH,5
    JE  PERDIDO
    JMP CONTINUA


PERDIDO:
    MOV AH,9
    MOV DX, OFFSET MEN_PERD
    INT 21H
    MOV AH,9
    MOV DX,OFFSET PALAVRA
    INT 21H
    JMP FINALIZA2
                   
   
VERIFICA_SE_ACABOU:
    CALL ACABOU
    CMP DH,'N'
    JE FINALIZA
    JMP CONTINUA
   
FINALIZA:           
    CALL IMPRIME_FORCA
    CALL PEGA_HORA_FINAL
    CALL CALCULA_TEMPO
   
FINALIZA2:           
    mov ax, 4c00h ; exit to operating system.
    int 21h   

IMPRIME_FORCA:
    MOV AH,9     
    MOV DX, OFFSET RESPOSTA
    INT 21H
PULA_LINHA:
    MOV AH,9   
    MOV DX, OFFSET PULALINHA
    INT 21H
    RET   
IMPRIME_MENSAGEM:
    MOV AH,9
    MOV DX, OFFSET MENSAGEM
    INT 21H
    RET
ENTRA_LETRA:
    ; RETORNA EM AL
    MOV AH,8
    INT 21H
    RET

PROCURA_LETRA:
    MOV SI,0
    MOV BX, OFFSET PALAVRA
PROXIMA:       
    MOV CL,'$' 
    CMP [BX+SI],CL
    JE  FIM_PROCURA

    CMP [BX+SI],AL
    JE  MOVIMENTA
    INC SI 
    JMP PROXIMA
FIM_PROCURA:
    RET           
         
   
MOVIMENTA:
    MOV DH,'S'               
    PUSH BX
    MOV BX,OFFSET RESPOSTA
    MOV [BX+SI],AL
    POP BX
    INC SI
    JMP PROXIMA
   
ACABOU:
    ;RETORNA EM DH SE ACABOU OU NAO
    PUSH BX
    MOV DH,'N'   
    MOV BX, OFFSET RESPOSTA
COMPARA_ACHOU:
    MOV DL,'$'
    CMP [BX],DL
    JE  FIM_ACABOU
    MOV DL,'-'
    CMP [BX],DL
    JE  ACHOU_
    INC BX
    JMP COMPARA_ACHOU
ACHOU_:
    MOV DH,'S'
FIM_ACABOU:
    POP BX
    RET   

IMPRIME_BONECO:
    CMP CH,1
    JNE PART2
    JMP ULTIMO_CABECA

PART2:
    CMP CH,2
    JNE PART3             
    JMP ULTIMO_PESCOCO
   
PART3:                 
    CMP CH,3           
    JNE PART4
    JMP ULTIMO_BRACOS

   
PART4:
    CMP CH,4
    JNE PART5
    JMP ULTIMO_PERNAS

PART5:
    CMP CH,5
    JNE PART6
    JMP ULTIMO_SAPATOS

PART6:
    RET

IMPRIME_CABECA:
    MOV AH,9
    MOV DX, OFFSET CABECA
    INT 21H
    RET

IMPRIME_PESCOCO:
    MOV AH,9
    MOV DX, OFFSET PESCO
    INT 21H
    RET


IMPRIME_BRACOS:
    MOV AH,9
    MOV DX, OFFSET BRACOS
    INT 21H
    RET

IMPRIME_PERNAS:
    MOV AH,9
    MOV DX, OFFSET PERNAS
    INT 21H
    RET

IMPRIME_SAPATO:
    MOV AH,9
    MOV DX, OFFSET SAPATOS
    INT 21H
    RET             
   
ULTIMO_SAPATOS:
    CALL IMPRIME_CABECA
    CALL IMPRIME_PESCOCO
    CALL IMPRIME_BRACOS
    CALL IMPRIME_PERNAS
    CALL IMPRIME_SAPATO
    RET
   
ULTIMO_PERNAS:
    CALL IMPRIME_CABECA
    CALL IMPRIME_PESCOCO
    CALL IMPRIME_BRACOS
    CALL IMPRIME_PERNAS
    RET

ULTIMO_BRACOS:
    CALL IMPRIME_CABECA
    CALL IMPRIME_PESCOCO
    CALL IMPRIME_BRACOS
    RET

ULTIMO_PESCOCO:
    CALL IMPRIME_CABECA
    CALL IMPRIME_PESCOCO
    RET       
   
ULTIMO_CABECA:
    CALL IMPRIME_CABECA
    RET       
   
PEGA_HORA_INICIAL:
    MOV AH,2CH         
    INT 21H
    MOV AL,60
    MUL CL   
    ; CL CONTEM MINUTOS
    ; AX TEM SEGUNDOS (AX = AL * CL)
    ; AX TEM SEGUNDOS (AX = 60 * MINUTOS)
    ; DH CONTEM SEGUNDOS
    ; DX = DH         DL
    ; DX = SEGUNDOS   DL=SUJEIRA
   
    XCHG DH,DL ; TRANFORMA DH EM BITS MENOS
    MOV  DH,0  ; SIGNIFICATIVOS DE DX E ANULA DH
               ; DX = DH=0 E DL=SEGUNDOS
    ADD  AX,DX ; SOMA MAIS SEGUNDOS
    MOV  WORD PTR SEGUNDOS_INICIAL,AX   
    RET                                     

PEGA_HORA_FINAL:
    MOV AH,2CH         
    INT 21H
    MOV AL,60
    MUL CL   
    ; CL CONTEM MINUTOS
    ; AX TEM SEGUNDOS (AX = AL * CL)
    ; AX TEM SEGUNDOS (AX = 60 * MINUTOS)
    ; DH CONTEM SEGUNDOS
    ; DX = DH         DL
    ; DX = SEGUNDOS   DL=SUJEIRA
   
    XCHG DH,DL ; TRANFORMA DH EM BITS MENOS
    MOV  DH,0  ; SIGNIFICATIVOS DE DX E ANULA DH
               ; DX = DH=0 E DL=SEGUNDOS
    ADD  AX,DX ; SOMA MAIS SEGUNDOS                 
    MOV  WORD PTR SEGUNDOS_FINAL,AX
    RET                                     

CALCULA_TEMPO:
    MOV AX,WORD PTR SEGUNDOS_FINAL
    MOV BX,WORD PTR SEGUNDOS_INICIAL
    SUB AX,BX
    CALL PRINT_AX
    CMP AX,10
    JLE PARABENS
    MOV AH,9
    MOV DX, OFFSET LENTO
    INT 21H
    RET   
   
PARABENS:
    MOV AH,9
    MOV DX, OFFSET RAPIDO
    INT 21H
    RET
   
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


print_nl proc
    push ax 
    push dx 
    mov ah, 2
    mov dl, 0Dh
    int 21h 
    mov dl, 0Ah
    int 21h   
    pop dx
    pop ax     
    ret
endp   
       
       
ends

end start ; set entry point and stop the assembler.