mercredi 15 juin 2022

Generate random letters and give a coordinate Assembly 8086

im doing a word puzzle game, how can i generate letters in assembly 8086 and give them coordinates to print them in the specific locations? I have a code that generates numbers but i cant restrictic to only letters and give it coordinates to the right places to print.

Here is the code:

;------------------------------------------------------------------------
;   Base para TRABALHO PRATICO - TECNOLOGIAS e ARQUITECTURAS de COMPUTADORES
;   
;   ANO LECTIVO 2020/2021
;--------------------------------------------------------------
; Demostração duma rotina de calculo de números aleatórios 
;
;--------------------------------------------------------------

.8086
.MODEL SMALL
.STACK 2048

DADOS   SEGMENT PARA 'DATA'
    ultimo_num_aleat dw 0

    str_num db 5 dup(?),'$'
DADOS   ENDS

CODIGO  SEGMENT PARA 'CODE'
    ASSUME CS:CODIGO, DS:DADOS

PRINC PROC
    MOV AX, DADOS
    MOV DS, AX

    mov cx,10
ciclo:
    call    CalcAleat
    pop ax ; vai buscar 'a pilha o numero aleatorio

    mov dl,cl
    mov dh,70
    push    dx
    push    ax
    call    impnum
    loop    ciclo

FIM:
    MOV AH,4Ch
    INT 21h
PRINC ENDP

;------------------------------------------------------
;CalcAleat - calcula um numero aleatorio de 16 bits
;Parametros passados pela pilha
;entrada:
;não tem parametros de entrada
;saida:
;param1 - 16 bits - numero aleatorio calculado
;notas adicionais:
; deve estar definida uma variavel => ultimo_num_aleat dw 0
; assume-se que DS esta a apontar para o segmento onde esta armazenada ultimo_num_aleat
CalcAleat proc near

    sub sp,2
    push    bp
    mov bp,sp
    push    ax
    push    cx
    push    dx  
    mov ax,[bp+4]
    mov [bp+2],ax

    mov ah,00h
    int 1ah

    add dx,ultimo_num_aleat
    add cx,dx   
    mov ax,65521
    push    dx
    mul cx
    pop dx
    xchg    dl,dh
    add dx,32749
    add dx,ax

    mov ultimo_num_aleat,dx

    mov [BP+4],dx

    pop dx
    pop cx
    pop ax
    pop bp
    ret
CalcAleat endp

;------------------------------------------------------
;impnum - imprime um numero de 16 bits na posicao x,y
;Parametros passados pela pilha
;entrada:
;param1 -  8 bits - posicao x
;param2 -  8 bits - posicao y
;param3 - 16 bits - numero a imprimir
;saida:
;não tem parametros de saída
;notas adicionais:
; deve estar definida uma variavel => str_num db 5 dup(?),'$'
; assume-se que DS esta a apontar para o segmento onde esta armazenada str_num
; sao eliminados da pilha os parametros de entrada
impnum proc near
    push    bp
    mov     bp,sp
    push    ax
    push    bx
    push    cx
    push    dx
    push    di
    mov     ax,[bp+4] ;param3
    lea     di,[str_num+5]
    mov     cx,5
prox_dig:
    xor     dx,dx
    mov     bx,10
    div     bx
    add     dl,'0' ; dh e' sempre 0
    dec     di
    mov     [di],dl
    loop    prox_dig

    mov     ah,02h
    mov     bh,00h
    mov     dl,[bp+4] ;param1
    mov     dh,[bp+13] ;param2
    int     10h
    mov     dx,di
    mov     ah,09h
    int     21h
    pop     di
    pop     dx
    pop     cx
    pop     bx
    pop     ax
    pop     bp
    ret     4 ;limpa parametros (4 bytes) colocados na pilha
impnum endp

CODIGO  ENDS
END PRINC



Aucun commentaire:

Enregistrer un commentaire