Skip to content

Instantly share code, notes, and snippets.

@Bahaaib
Created May 18, 2017 21:29
Show Gist options
  • Select an option

  • Save Bahaaib/ceef3e069dfa23d171f09f82566546a4 to your computer and use it in GitHub Desktop.

Select an option

Save Bahaaib/ceef3e069dfa23d171f09f82566546a4 to your computer and use it in GitHub Desktop.
.MODEL TINY
.DATA
GEN_NUM DB 0
SNUM DB 8 DUP (?)
FAC DW 10
TEMP DW 10
USER_NUM DW 0
TEMPB DB 0
MSG0_0 DB ' WELCOME TO iGUESS GAME$'
MSG0_1 DB ' ********************************$'
MSG0_2 DB 'PRESS: $'
MSG0_3 DB 'R -> TO GIVE UP AND REVEAL THE CORRECT NUMBER ANYTIME!$'
MSG0_4 DB 'Q -> TO EXIT THE GAME ANYTIME$'
MSG1 DB 'GUESS A NUMBER IN A RANGE FROM 1 TO 100$'
MSG2 DB 'TOO HIGH!$'
MSG3 DB 'TOO LOW!$'
MSG4 DB '90% ACCURATE..GUESS DOWN CLOSER!$'
MSG5 DB '90% ACCURATE..GUESS UP CLOSER!$'
MSG6 DB 'FINE GUESS!$'
MSG7 DB 'PLAY AGAIN? (Y/N)$'
MSG8 DB 'ARE YOU SURE? (Y/N)$'
MSG9 DB 'PRETTY SURE? (Y/N)$'
.CODE
MAIN:
MOV AX, @DATA
MOV DS, AX
MOV SI, OFFSET SNUM
MOV BX, -1
MOV DX, OFFSET MSG0_0
MOV AH, 09H
INT 21H
MOV DL, 10
MOV AH, 02H
INT 21H
MOV DL, 13
MOV AH, 02H
INT 21H
;------------------------------------------
MOV DX, OFFSET MSG0_1
MOV AH, 09H
INT 21H
MOV DL, 10
MOV AH, 02H
INT 21H
MOV DL, 13
MOV AH, 02H
INT 21H
;------------------------------------------
MOV DX, OFFSET MSG0_2
MOV AH, 09H
INT 21H
MOV DL, 10
MOV AH, 02H
INT 21H
MOV DL, 13
MOV AH, 02H
INT 21H
;------------------------------------------
MOV DX, OFFSET MSG0_3
MOV AH, 09H
INT 21H
MOV DL, 10
MOV AH, 02H
INT 21H
MOV DL, 13
MOV AH, 02H
INT 21H
;------------------------------------------
MOV DX, OFFSET MSG0_4
MOV AH, 09H
INT 21H
MOV DL, 10
MOV AH, 02H
INT 21H
MOV DL, 13
MOV AH, 02H
INT 21H
;------------------------------------------
MOV DL, 10
MOV AH, 02H
INT 21H
MOV DL, 13
MOV AH, 02H
INT 21H
MAIN_PSU:
MOV DX, OFFSET MSG1
MOV AH, 09H
INT 21H
MOV DL, 10 ; Break for a new line </br>
MOV AH, 02H
INT 21H
MOV DL, 13
MOV AH, 02H
INT 21H
RANDGEN:
MOV AH, 00H ; Get system time as a seed..
INT 1AH ; CX:DX now hold number of clock ticks since midnight!
MOV AX, DX
XOR DX, DX
MOV CX, 100 ; Determine the range from 0 to 99
DIV CX ; Here's DX contains the remainder of the division - from 0 to 99
ADD DX, 1 ; Now it has a number from 1 to 100
MOV GEN_NUM, DL
START:
MOV AH, 01H ; Wait user to enter number..
INT 21H
CMP AL, 'R'
JE PRINT ; Reveal correct number when user asks for..
CMP AL, 'Q' ; Quit the game on demand
JE QUIT
CMP AL, 0DH ; Recieve Chars till ENTER is pressed
JE FORMAT ; Format the string once finished!
MOV [SI], AL ; Transfer Chars to Memory..
INC SI ; Extend 1 more place in memory for more Chars
INC BX
JMP START ; Keep recieving Chars till ENTER pressed!
FORMAT:
MOV DL, 10 ; Break for a new line </br>
MOV AH, 02H
INT 21H
MOV DL, 13
MOV AH, 02H
INT 21H ; Start the new line from the very beginnning
MOV DL, '$'
INC SI
MOV [SI], DL ; Distinguish as String!
MOV CX, BX ; Adjust loop counter to the number of digits entered!
MOV SI, OFFSET SNUM ; Assign The Address of The number to SI
MOV AX, 1
CMP BX, 0 ;If user entered more than a digit,calculate the factor from the left most.
JE TOINT ;Otherwise, Convert it..
FACLOOP:
MUL FAC
LOOP FACLOOP
MAIN_1:
MOV CX, BX ;Reset the number of Loop counter..
TOINT:
MOV AH, 0 ;Fixing something stupid above..skip it!
MOV DL, [SI] ;Transfer the content of first Char to DL
SUB DL, '0' ;Get the true value of intger stored in DL..
MOV TEMP, AX
MUL DL ;Get the true value of an integer related to its position in the number.
ADD USER_NUM, AX ;Accumulatively add till we have a complete converted number.
MOV AX, TEMP ;Downgrade the factor for further iterations.
MOV DL, 10
DIV DL ;By dividing it by 10 at each lap.
INC SI
DEC CX
CMP CX, 0 ; If it's not last lap
JGE TOINT ; Keep going..
RANGE:
MOV CL, 10
MOV AL, GEN_NUM
MOV AH, 0
DIV CL
MOV DL, GEN_NUM
ADD DL, AL
MOV BL, GEN_NUM
SUB BL, AL
MOV AX, USER_NUM
MOV CL, GEN_NUM
MOV CH, 0
CMP AX, CX
JE SUCESS
CMP AL, DL
JG PRNTHIGH
CMP AX, CX
JG PRNT90DN
CMP AL, BL
JL PRNTLOW
CMP AX, CX
JL PRNT90UP
PRNTHIGH:
MOV DX, OFFSET MSG2
MOV AH, 09H
INT 21H
MOV DL, 10 ; Break for a new line </br>
MOV AH, 02H
INT 21H
MOV DL, 13
MOV AH, 02H
INT 21H
MOV USER_NUM, 0
MOV SI, OFFSET SNUM
MOV BX, -1
JMP START
PRNTLOW:
MOV DX, OFFSET MSG3
MOV AH, 09H
INT 21H
MOV DL, 10 ; Break for a new line </br>
MOV AH, 02H
INT 21H
MOV DL, 13
MOV AH, 02H
INT 21H
MOV USER_NUM, 0
MOV SI, OFFSET SNUM
MOV BX, -1
JMP START
PRNT90DN:
MOV DX, OFFSET MSG4
MOV AH, 09H
INT 21H
MOV DL, 10 ; Break for a new line </br>
MOV AH, 02H
INT 21H
MOV DL, 13
MOV AH, 02H
INT 21H
MOV USER_NUM, 0
MOV SI, OFFSET SNUM
MOV BX, -1
JMP START
PRNT90UP:
MOV DX, OFFSET MSG5
MOV AH, 09H
INT 21H
MOV DL, 10 ; Break for a new line </br>
MOV AH, 02H
INT 21H
MOV DL, 13
MOV AH, 02H
INT 21H
MOV USER_NUM, 0
MOV SI, OFFSET SNUM
MOV BX, -1
JMP START
SUCESS:
MOV DX, OFFSET MSG6
MOV AH, 09H
INT 21H
MOV DL, 10 ; Break for a new line </br>
MOV AH, 02H
INT 21H
MOV DL, 13
MOV AH, 02H
INT 21H
MOV SI, OFFSET SNUM
MOV DX, OFFSET MSG7
MOV AH, 09
INT 21H
MOV AH, 01H
INT 21H
CMP AL, 'Y'
MOV DL, 10 ; Break for a new line </br>
MOV AH, 02H
INT 21H
MOV DL, 13
MOV AH, 02H
INT 21H
JE MAIN_PSU
JNE EXIT
PRINT:
MOV AL, GEN_NUM
MOV TEMPB, AL
MOV CL, 10
MOV CH, 0
MOV AH, 0
DIV CL
ADD AL, '0'
MOV [SI], AL
SUB AL, '0'
INC SI
MOV AH, 0
MUL CL
MOV BL, TEMPB
SUB BL, AL
ADD BL, '0'
MOV [SI], BL
MOV DL, '$'
INC SI
MOV [SI], DL
MOV DL, 10
MOV AH, 02H
INT 21H
MOV DL, 13
MOV AH, 02H
INT 21H
MOV DX, OFFSET SNUM
MOV AH, 09
INT 21H
MOV DL, 10 ; Break for a new line </br>
MOV AH, 02H
INT 21H
MOV DL, 13
MOV AH, 02H
INT 21H
MOV DX, OFFSET MSG7
MOV AH, 09
INT 21H
MOV AH, 01H
INT 21H
CMP AL, 'Y'
MOV DL, 10 ; Break for a new line </br>
MOV AH, 02H
INT 21H
MOV DL, 13
MOV AH, 02H
INT 21H
JE MAIN_PSU
JNE EXIT
QUIT:
MOV DL, 10
MOV AH, 02H
INT 21H
MOV DL, 13
MOV AH, 02H
INT 21H
MOV DX, OFFSET MSG8
MOV AH, 09
INT 21H
MOV DL, 10
MOV AH, 02H
INT 21H
MOV DL, 13
MOV AH, 02H
INT 21H
MOV AH, 01H
INT 21H
CMP AL, 'Y'
MOV DL, 10
MOV AH, 02H
INT 21H
MOV DL, 13
MOV AH, 02H
INT 21H
JNE MAIN_PSU
MOV DX, OFFSET MSG9
MOV AH, 09
INT 21H
MOV DL, 10
MOV AH, 02H
INT 21H
MOV DL, 13
MOV AH, 02H
INT 21H
MOV AH, 01H
INT 21H
CMP AL, 'Y'
MOV DL, 10
MOV AH, 02H
INT 21H
MOV DL, 13
MOV AH, 02H
INT 21H
JNE MAIN_PSU
EXIT:
MOV AH ,4CH
INT 21H
END MAIN
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment