; CIS-261
; M08.ASM
; @topic W080110 IO.H and IO.ASM usage demo
; @brief Lab M08, <a href="http://www.c-jump.com/bcc/c261c/MLabs/M08console/M08console.html" target="_blank">Console Input/Output</a>, validate range 0 to 255

.386                ; Tells MASM to use Intel 80386 instruction set.
.MODEL FLAT         ; Flat memory model
option casemap:none ; Treat labels as case-sensitive

INCLUDE IO.H        ; header file for input/output

.CONST              ; Constant data segment
SZ_PROMPT_8BIT_UNSIGNED BYTE "Input 8-bit unsigned integer: ", 0
SZ_PROMPT_BAD_INPUT     BYTE "***BAD INPUT*** try again!", 0
SZ_RESULT               BYTE "The result is: ", 0
SZ_NEW_LINE             BYTE 13, 10, 0
SZ_PAUSE                BYTE "Please type x and hit Enter to exit: ", 0

.DATA               ; Begin initialized data segment
buffer              BYTE    12 DUP (?)
dtoa_buffer         BYTE    11 DUP (?)
atoa_buffer         BYTE    6  DUP (?)

.CODE               ; Begin code segment
_main PROC          ; Beginning of code

input_first_8_bit:
    ;--------------------------------------------------------
    ; Input first 8-bit unsigned integers from the user
    ;--------------------------------------------------------
    output SZ_PROMPT_8BIT_UNSIGNED
    input buffer, SIZEOF buffer ; Get user input
    ;--------------------------------------------------------
    ; Validate input length and make sure it's 0 < input < 4
    ;--------------------------------------------------------
    szlen buffer                ; Get input size in EAX
    or EAX, EAX                 ; Is EAX zero?
    jnz @F                      ; if not, then move on
    output SZ_PROMPT_BAD_INPUT
    output SZ_NEW_LINE
    jmp input_first_8_bit       ; repeat the input
@@:
    cmp EAX, 3                  ; Make sure no more than 3 characters
    jle @F                      ; if everything okay move on
    output SZ_PROMPT_BAD_INPUT
    output SZ_NEW_LINE
    jmp input_first_8_bit       ; repeat the input
@@:
    ;--------------------------------------------------------
    ; Validate range from 0 to 255
    ;--------------------------------------------------------
    atod buffer                 ; convert text to number in EAX
    jno @F                      ; if it worked, then move on
    output SZ_PROMPT_BAD_INPUT
    output SZ_NEW_LINE
    jmp input_first_8_bit       ; repeat the input
@@:
    ;--------------------------------------------------------
    ; Now EAX contains our first number
    ;--------------------------------------------------------
    cmp EAX, 0                  ; See if EAX >= 0
    jge @F                      ; EAX is >= 0, which is good 
    output SZ_PROMPT_BAD_INPUT
    output SZ_NEW_LINE
    jmp input_first_8_bit       ; repeat the input
@@:
    cmp EAX, 255                ; See if EAX > 255
    jle @F                      ; EAX <= 255, which is good
    output SZ_PROMPT_BAD_INPUT
    output SZ_NEW_LINE
    jmp input_first_8_bit       ; repeat the input
@@:
    
    ;--------------------------------------------------------
    ; TODO:
    ;--------------------------------------------------------
    ; Input second 8-bit unsigned integers from the user
    ; Validate range from 0 to 255
    ; Calculate the sum of the two numbers
    ; Check for the overflow; if yes, repeat the input

    ;--------------------------------------------------------
    ; Print result in EAX on the screen
    ;--------------------------------------------------------
    dtoa dtoa_buffer, EAX
    output SZ_RESULT
    output dtoa_buffer
    output SZ_NEW_LINE

    ;--------------------------------------------------------
    ; Pause before exiting
    ;--------------------------------------------------------
    output SZ_PAUSE
    input buffer, SIZEOF buffer
    ret
    
_main ENDP
END _main        ; Marks the end of the module and sets the program entry point label

