TITLE HW06_10 HEX character to DEC character converter

;* author: Curtis Caldwell
;* course: CSC220 Assemblers
;* date:   28 August 2003
;*
;* PURPOSE: Page 115, Question 10.
;*
;*----------------
;*
;* ALGORITHM: If 0 <= x <= 9, print out character without modification.
;*            If A <= x <= F, print character 1, 
;*                            subtract 11H and print out character
;*            Require 'Y' to repeat for more conversions.
;*
;*--------------------------------------
;*
;* ASSUMPTIONS,LIMITATIONS,RESTRICTIONS:
;*
;*----------------
;*
;* ERRORS CHECKED:
;    None
;*
;*----------------
;*
;* I/O:
;*   Input: Keyboard
;*   Output: DOS window
;*
;*----------------
;*
;* INPUT PARAMETERS:
;*   Input lower case letter to register AL.
;*
;*-------------------
;*
;* OUTPUT PARAMETERS:
;*
;*-----------------
;*
;* PROCEDURES USED:
;*   MAIN. No subordinate user procedures supplies.
;*
;*------------------
;*
;* PROCESS STRATEGY:
;*
;*******************

;*                             <constants>

;*                               <types>

;*                             <variables>

;*                          <external modules>
.MODEL SMALL
DATA_SEGMENT                 SEGMENT
  CR        EQU  0DH          ;Carriage Return
  LF        EQU  0AH          ;Line Feed
  Prompt1   DB   CR,LF,'Enter a HEX digit: $'
  Msg2      DB   CR,LF,'In decimal it is a $'
  Prompt3   DB   CR,LF,'Do you want to do it again? $'
  Msg4      DB   CR,LF,'Illegal character - Enter 0..9 or A..F: $'
  
DATA_SEGMENT                 ENDS

STACK_SEGMENT                SEGMENT STACK
          DW   100 dup(?)
  TOS     DW   ?             ;tos is 'top of stack'
STACK_SEGMENT                ENDS

CODE_SEGMENT                 SEGMENT

  ASSUME CS:CODE_SEGMENT, DS:DATA_SEGMENT, SS:STACK_SEGMENT

;  At this point in the entry of the program
;  CS:IP points to label START
;  DS, ES, and SS are not pointing to their proper segments.
;    DS and ES point to the program segment prefix.
;  AL contains 00h if first file name on command line is valid, otherwise ffh.
;  AH contains 00h if second file name on command line is valid, else ffh.
;  DTA has been set to point to program segment prefix offset 80h.

MAIN     PROC

  START: MOV   AX,DATA_SEGMENT  ;get data segment
         MOV   DS,AX            ;initialize DS
         MOV   ES,AX            ;initialize ES
         MOV   AX,STACK_SEGMENT ;get stack segment
         MOV   SS,AX            ;initialize SS
         MOV   SP,OFFSET TOS    ;initialize SP to Top of Stack

;the algorithm
;Display prompt1
NEWCHAR:
         LEA    DX,Prompt1       ;load address of prompt message
         MOV    AH,9             ;select string output
         INT    21H              ;output prompt

FETCHIN:
         MOV    AH,1             ;select single character input
         INT    21H              ;INT 21h affects AL.
         MOV    BL,AL            ;make copy of input character for later use
         CMP    AL,30H           ;test against ASCII character 0
         JB     ERROR            ;character is less than 0
         JE     DIGITOUT         ;character is a 0
         CMP    AL,39H           ;test against ASCII character 9
         JBE    DIGITOUT         ;character is less or equal to 9
         CMP    AL,41H           ;test against ASCII character A
         JB     ERROR            ;character 9 < x < A, bad input
         JE     HEXOUT           ;character is A
         CMP    AL,46H           ;test against ASCII character F
         JA     ERROR            ;character is greater than F

HEXOUT:
         LEA    DX,Msg2          ;output header for conversion
         MOV    AH,9
         INT    21H
         MOV    DL,'1'           ;output leading character 1
         MOV    AH,2
         INT    21H
         MOV    AL,BL
         SUB    AL,11H           ;convert second character
         MOV    DL,AL
         INT    21H
         JMP    INQUESTION

DIGITOUT:
         LEA    DX,Msg2          ;output header for conversion
         MOV    AH,9
         INT    21H
         MOV    DL,BL
         MOV    AH,2
         INT    21H

INQUESTION:
         LEA    DX,Prompt3       ;Do you want to try again?
         MOV    AH,9
         INT    21H
         MOV    AH,1             ;Fetch answer
         INT    21H
         CMP    AL,'y'           ;if not yes (y) or (Y), quit
         JE     NEWCHAR
         CMP    AL,'Y'
         JE     NEWCHAR
         JMP    STOP

ERROR:
         LEA    DX,Msg4          ;Announcement... Error.r.rr.rrr
         MOV    AH,9
         INT    21H
         JMP    FETCHIN

;DOS exit
STOP:    MOV AH,4CH
         INT 21H

CODE_SEGMENT                 ENDS

MAIN    ENDP                   ;ENDP ends a procedure
        END  MAIN              ;END ends the source program