home *** CD-ROM | disk | FTP | other *** search
/ Frostbyte's 1980s DOS Shareware Collection / floppyshareware.zip / floppyshareware / USCX / PGMR-UTS.ZIP / LOOK.ASM < prev    next >
Assembly Source File  |  1984-06-26  |  15KB  |  485 lines

  1.     PAGE    ,132
  2.     TITLE    LOOK - LOOK AT MEMORY
  3.     SUBTTL    Look At Memory In Any Segment
  4. ;                                          ;
  5. ;*****************************************************************************;
  6. ;                                          ;
  7. ;              John R. Pulliam     Version 2/21/84              ;
  8. ;                                          ;
  9. ;           For Columbia Data Product Computers and Compatibles          ;
  10. ;              Released to Public Domain                  ;
  11. ;                                          ;
  12. ;*****************************************************************************;
  13. ;                                          ;
  14. ;
  15. ;  DOS CALL INT 21H FUNCTIONS USED
  16. ;
  17. ;
  18. ;    AH = 01H => Input One Character From Keyboard
  19. ;            AL = Ascii Character Received
  20. ;
  21. ;    AH = 02H => Display One Character On CRT
  22. ;            DL = Ascii Character to Display
  23. ;
  24. ;    AH = 09H => Display Message on CRT
  25. ;            DS = Segment of Message
  26. ;            DX = Offset Address of Message
  27. ;
  28. ;    AH = 0CH &
  29. ;    AL = 0AH => Clear Then Fetch Keyboard Buffer
  30. ;            DI       = Buffer First Word Address
  31. ;            [DI]   = Number Of Characters Wanted To Input
  32. ;            [DI+1] = Number Of Characters Actually Received
  33. ;            [DI+2] = First Character Received
  34. ;
  35. ;
  36. ;  DOS INT 20H = Terminate Program And Return To DOS
  37. ;
  38. ;  To Assemble This Program:
  39. ;
  40. ;    1. Place the source file, LOOK.ASM, in Drive B
  41. ;
  42. ;    2. MASM B:LOOK,B:LOOK,B:LOOK,NUL.CRF
  43. ;
  44. ;    3. LINK B:LOOK,B:LOOK,NUL.MAP,NUL.LIB
  45. ;       (There should be 1 warning error message after linking)
  46. ;
  47. ;    4. EXE2BIN B:LOOK,B:LOOK.COM
  48. ;
  49. ;    5. B:LOOK.OBJ and B:LOOK.LST may be deleted if desired.
  50. ;
  51. ;*****************************************************************************;
  52. ;
  53.     CSEG    SEGMENT PARA PUBLIC
  54.     ASSUME    CS:CSEG,DS:CSEG,ES:CSEG
  55.  
  56.     ORG    100H
  57.  
  58. ;  DEFINE THE CONSTANTS
  59.  
  60. CR    EQU    13        ; CARRIAGE RETURN CODE
  61. LF    EQU    10        ; LINE FEED CODE
  62. QT    EQU    34        ; QUOTE MARK
  63. BYT    EQU    16        ; NUMBER OF BYTES PER LINE
  64. LINES    EQU    8        ; NUMBER OF LINES TO DISPLAY
  65.  
  66. ;  SET UP THE SEGMENT REGISTERS
  67.  
  68. LOOK:    MOV    AX,CS        ; GET CURRENT SEGMENT
  69.     MOV    DS,AX        ; SET DS TO THIS SEG
  70.     MOV    ES,AX        ; SET ES TO THIS SEG
  71.     MOV    WORD PTR SEGADD,AX ; INITIALIZE DISPLAY SEGMENT
  72.  
  73. ;  ASK IF ANOTHER SEGMENT IS DESIRED
  74.  
  75. ASKSEG: MOV    DX,OFFSET SEGMSG ;ADDRESS OF MESSAGE
  76.     MOV    AH,9        ; DISPLAY STRING FUNCTION
  77.     INT    21H        ; CALL DOS
  78.  
  79. ;  READ REPLY
  80.  
  81.     MOV    AH,1        ; REQUEST "Y" OR "N"
  82.     INT    21H        ; GET KEY INPUT
  83.     AND    AL,0DFH     ; ALLOW EITHER UPPER OR LOWER CASE
  84.     CMP    AL,'N'          ; BRANCH TO GET STARTING ADD IF "N"
  85.     JE    DISPSEG
  86.     CMP    AL,'Y'          ; REPEAT QUERY IF NOT "Y"
  87.     JNE    ASKSEG
  88.  
  89. ;  GET THE SEGMENT TO DISPLAY MEMORY FROM
  90.  
  91. GETSEG: MOV    DX,OFFSET SEGMSG2 ; ADDRESS OF MESSAGE
  92.     MOV    AH,9        ; DISPLAY STRING FUNCTION
  93.     INT    21H        ; CALL DOS
  94.  
  95. ;  READ DESIRED SEGMENT
  96.  
  97.     MOV    AH,4        ; MAX NUMBER OF CHARACTERS WANTED
  98.     MOV    DI,OFFSET KBUFSZ ; KEYBOARD BUFFER
  99.     CALL    KYBD        ; INPUT REPLY
  100.  
  101.     CMP    AH,4        ; WANT 4 CHARS EXCLUDING THE CR
  102.     JE    CV1        ; SKIP IF NO LEADING ZEROS
  103.     CALL    INSERT        ; INSERT LEADING ZEROS
  104.  
  105. CV1:    CALL    CRLF        ; OUTPUT CR AND LF
  106.  
  107. ;  CONVERT FOUR ASCII CODES INTO TWO HEX BYTES (FOUR HEX DIGITS)
  108.  
  109.     MOV    AX,WORD PTR KBUF ; FIRST TWO ASCII CODES
  110.     CALL    ASC_HEX     ; RETURNS ONE HEX BYTE
  111.     JC    GETSEG        ; REPEAT QUERY IF ILLEGAL INPUT
  112.     MOV    SEGADD+1,AL    ; STORE HIGH SEGMENT BYTE
  113.     MOV    AX,WORD PTR KBUF+2 ; THIRD AND FOURTH ASCII CODES
  114.     CALL    ASC_HEX     ; RETURNS ONE HEX BYTE
  115.     JC    GETSEG        ; REPEAT QUERY IF ILLEGAL INPUT
  116.     MOV    SEGADD,AL    ; STORE LOW SEGMENT BYTE
  117.  
  118. ;  DISPLAY THE SEGMENT FROM WHICH DATA IS TO BE DISPLAYED
  119.  
  120. DISPSEG:
  121.     MOV    AL,SEGADD+1    ; GET THE FIRST SEGMENT BYTE
  122.     CALL    HEX_ASC     ; CONVERT TO ASCII
  123.     MOV    ASCSEG,AX    ; SAVE FOR OUTPUT TO CRT
  124.     MOV    AL,SEGADD    ; GET THE SECOND SEGMENT BYTE
  125.     CALL    HEX_ASC     ; CONVERT IT TO ASCII TOO
  126.     MOV    ASCSEG+2,AX    ; AND SAVE IT ALSO
  127.  
  128.     MOV    DX,OFFSET SEGMSG3 ; ADDRESS OF MESSAGE
  129.     MOV    AH,9        ; DISPLAY STRING FUNCTION
  130.     INT    21H        ; CALL DOS
  131.  
  132.     MOV    DX,OFFSET ASCSEG ; ADDRESS OF MESSAGE
  133.     MOV    AH,9        ; DISPLAY STRING FUNCTION
  134.     INT    21H        ; CALL DOS
  135.  
  136. ;  ASK FOR THE STARTING ADDRESS
  137.  
  138. ASKADD: MOV    DX,OFFSET STMSG ; ADDRESS OF MESSAGE
  139.     MOV    AH,9        ; DISPLAY STRING FUNCTION
  140.     INT    21H        ; CALL DOS
  141.  
  142. ;  READ REPLY
  143.  
  144.     MOV    AH,4        ; MAX NUMBER OF CHARACTERS WANTED
  145.     MOV    DI,OFFSET KBUFSZ ; KEYBOARD BUFFER
  146.     CALL    KYBD        ; INPUT REPLY
  147.  
  148.     CMP    AH,4        ; WANT 4 CHARS EXCLUDING THE CR
  149.     JE    CV2        ; SKIP IF NO LEADING ZEROS
  150.     CALL    INSERT        ; INSERT LEADING ZEROS
  151.  
  152. CV2:    CALL    CRLF        ; OUTPUT CR AND LF
  153.     CALL    CRLF        ; OUTPUT CR AND LF
  154.  
  155. ;  CONVERT FOUR ASCII CODES INTO TWO HEX BYTES (FOUR HEX DIGITS)
  156.  
  157.     MOV    AX,WORD PTR KBUF ; FIRST AND SECOND ASCII CODES
  158.     CALL    ASC_HEX     ; RETURNS ONE HEX BYTE
  159.     JC    ASKADD        ; REPEAT QUERY IF ILLEGAL INPUT
  160.     MOV    STADD+1,AL    ; STORE HIGH ADDRESS BYTE
  161.     MOV    AX,WORD PTR KBUF+2 ; THIRD AND FOURTH ASCII CODES
  162.     CALL    ASC_HEX     ; RETURNS ONE HEX BYTE
  163.     JC    ASKADD        ; REPEAT QUERY IF ILLEGAL INPUT
  164.     MOV    STADD,AL    ; STORE LOW ADDRESS BYTE
  165.  
  166.     MOV    AX,WORD PTR STADD ; GET STARTING ADDRESS
  167.     MOV    SI,AX        ; STARTING ADDRESS IN SI REGISTER
  168.  
  169.     CALL    DISPLA        ; DISPLAY MEMORY (AT LAST)
  170.  
  171. ;  ASK IF WE SHOULD REPEAT
  172.  
  173. EMSG:    MOV    DX,OFFSET ENDMSG ; ADDRESS OF MESSAGE
  174.     MOV    AH,9        ; DISPLAY STRING FUNCTION
  175.     INT    21H        ; CALL DOS
  176.  
  177.     MOV    AH,1        ; REQUEST "Y" OR "N"
  178.     INT    21H        ; GET KEY INPUT
  179.     AND    AL,0DFH     ; ALLOW EITHER UPPER OR LOWER CASE
  180.     CMP    AL,'N'          ; EXIT IF "N"
  181.     JE    EXIT
  182.     CMP    AL,'Y'          ; REPEAT QUERY IF NOT "Y"
  183.     JNE    EMSG
  184.     JMP    ASKSEG        ; LOOP TO START OVER
  185.  
  186. EXIT:    INT    20H        ; Return to DOS
  187.     .XLIST
  188.     SUBTTL    Miscellaneous Callable Routines
  189.     PAGE    +
  190.     .LIST
  191. ;
  192. ;
  193. ;  INSERT LEADING ZEROS INTO KEYBOARD INPUT BUFFER
  194. ;
  195. INSERT: MOV    AL,4        ; NUMBER OF DIGITS IN NUMBER
  196.     SUB    AL,AH        ; NUMBER OF LEADING ZEROS
  197. INS1:    MOV    DI,OFFSET KBUF+3 ; DESTINATION ADDRESS
  198.     MOV    SI,OFFSET KBUF+2 ; SOURCE ADDRESS
  199.     MOV    CX,3        ; LOOP COUNT
  200. INS2:    MOV    AH,[SI]     ; MOVE ONE
  201.     MOV    [DI],AH     ;    CHARACTER
  202.     DEC    DI        ; DEC POINTERS
  203.     DEC    SI
  204.     LOOP    INS2        ; SHIFT ALL DIGITS
  205.     MOV    AH,'0'          ; ASCII ZERO
  206.     MOV    [DI],AH     ; ADD LEADING ZERO
  207.     DEC    AL
  208.     JNZ    INS1        ; LOOP FOR EACH ZERO TO ADD
  209. ;
  210. ;  WRITE CR LF TO CRT
  211. ;
  212. CRLF:    MOV    DX,OFFSET CRLFM ; ADDRESS OF 'CR,LF'
  213.     MOV    AH,9
  214.     INT    21H        ; WRITE CR LF
  215.     RET            ; RETURN TO CONTINUE
  216. CRLFM    DB    CR,LF,'$'
  217. ;
  218. ;
  219. ;  DISPLAY MEMORY
  220. ;
  221. ;    SI REG = STARTING ADDRESS TO DISPLAY
  222. ;    SEGADD = SEGMENT TO DISPLAY FROM
  223. ;    STADD  = OFFSET TO DISPLAY FROM
  224. ;    ASCSEG = ASCII CODE OF SEGMENT
  225. ;    ASCADD = ASCII CODE OF OFFSET
  226. ;    ALL REGISTERS ARE ALTERED
  227. ;
  228. DISPLA: MOV    DX,OFFSET SPACE ; SPACE CODES
  229.     MOV    AH,9        ; DISPLAY STRING FUNCTION
  230.     INT    21H        ; OUTPUT SPACES
  231. ;
  232. ;  OUTPUT THE TOP LINE
  233. ;
  234.     MOV    CX,BYT        ; NUMBER OF BYTES PER LINE
  235.     MOV    AL,STADD    ; GET THE LOW ADDRESS BYTE
  236. LUP1:    PUSH    AX        ; SAVE FOR NEXT OUTPUT
  237.     CALL    HEX_ASC     ; CONVERT TO ASCII
  238.     MOV    ASCTOP,AH    ; SAVE FOR OUTPUT
  239.     MOV    AH,9        ; OUTPUT STRING FUNCTION
  240.     MOV    DX,OFFSET ASCTOP ; ADDRESS OF STRING
  241.     INT    21H        ; OUTPUT ONE DIGIT ON TOP LINE
  242.     POP    AX        ; GET PREVIOUS DIGIT
  243.     INC    AL        ; INCREMENT FOR NEXT DIGIT
  244.     LOOP    LUP1        ; REPEAT FOR THE REST
  245.     CALL    CRLF        ; CR AND LF
  246. ;
  247.     MOV    BX,LINES    ; NUMBER OF LINES TO DISPLAY
  248.     MOV    AX,WORD PTR SEGADD ; FETCH SEGMENT TO DISPLAY
  249.     MOV    ES,AX        ; PUT DESIRED SEGMENT IN ES REGISTER
  250. ;
  251. ;  OUTPUT ADDRESS AT START OF LINE
  252. ;
  253. LUP3:    PUSH    BX        ; SAVE LINE COUNTER
  254.     MOV    AL,STADD+1    ; GET THE FIRST ADDRESS BYTE
  255.     CALL    HEX_ASC     ; CONVERT TO ASCII
  256.     MOV    ASCADD,AX    ; SAVE FOR OUTPUT TO CRT
  257.     MOV    AL,STADD    ; GET THE SECOND ADDRESS BYTE
  258.     CALL    HEX_ASC     ; CONVERT IT TO ASCII TOO
  259.     MOV    ASCADD+2,AX    ; AND SAVE IT ALSO
  260. ;
  261.     MOV    AH,9        ; DISPLAY STRING FUNCTION
  262.     MOV    DX,OFFSET ASCADD ; ADDRESS OF MESSAGE
  263.     INT    21H        ; CALL DOS
  264.     MOV    AL,STADD    ; INCREMENT STARTING ADDRESS
  265.     ADD    AL,BYT        ; BY NUMBER OF BYTES IN A LINE
  266.     MOV    STADD,AL
  267.     JNC    DLINES
  268.     INC    STADD+1     ; INCREMENT HIGH BYTE IF NECESSARY
  269. ;
  270. ;  OUTPUT ONE LINE
  271. ;
  272. DLINES: MOV    CX,BYT        ; NUMBER OF BYTES TO DISPLAY IN A LINE
  273.     MOV    DI,OFFSET ASCCHAR ; ADDRESS OF ASCII BUFFER
  274. ;
  275. LUP4:    MOV    AL,ES:[SI]    ; PICK UP NEXT MEMORY BYTE
  276.     PUSH    AX        ; SAVE IT
  277.     CMP    AL,7FH        ; SEE IF IT CAN BE DISPLAYED ON CRT
  278.     JGE    DASC1        ; BRANCH IF NOT
  279.     CMP    AL,20H
  280.     JGE    DASC2        ; BRANCH IF YES
  281. DASC1:    MOV    AL,'.'          ; SUBSTITUTE PERIOD
  282. DASC2:    MOV    [DI],AL     ; STORE FOR LATER DISPLAY
  283.     INC    DI        ; INCREMENT BUFFER POINTER
  284.     POP    AX        ; RETRIEVE MEMORY BYTE
  285.     CALL    HEX_ASC     ; CONVERT IT TO TWO ASCII CODES
  286.     MOV    CHARS,AX    ; STORE THEM
  287.     PUSH    SI        ; SAVE POINTER
  288.     PUSH    CX        ; SAVE BYTE COUNTER
  289.     MOV    DX,OFFSET CHARS ; ADDRESS OF STRING
  290.     MOV    AH,9        ; DISPLAY STRING FUNCTION
  291.     INT    21H        ; CALL DOS TO DISPLAY THIS BYTE
  292.     POP    CX        ; RESTORE BYTE COUNTER
  293.     POP    SI        ; RESTORE POINTER
  294.     INC    SI        ; INCREMENT SOURCE POINTER
  295.     LOOP    LUP4        ; REPEAT UNTIL DONE
  296. ;
  297.     MOV    CX,BYT+2    ; NUMBER OF TOTAL SYMBOLS
  298.     MOV    DI,OFFSET ASCSYM ; ADDRESS OF STRING
  299. LUP5:    MOV    DL,[DI]     ; NEXT CHARACTER TO DISPLAY
  300.     PUSH    DI        ; SAVE REGISTERS
  301.     PUSH    CX
  302.     MOV    AH,2        ; DISPLAY CHARACTER FUNCTION
  303.     INT    21H        ; CALL DOS TO DISPLAY SYMBOLS
  304.     POP    CX        ; RESTORE REGISTERS
  305.     POP    DI
  306.     INC    DI        ; INCREMENT SYMBOL ADDRESS
  307.     LOOP    LUP5        ; REPEAT UNTIL FINISHED
  308. ;
  309.     CALL    CRLF        ; OUTPUT CR AND LF
  310.     POP    BX        ; RESTORE LINE COUNTER
  311.     DEC    BX        ; DECREMENT LINE COUNTER
  312.     JNZ    LUP3        ; REPEAT FOR ALL LINES
  313. ;
  314.     MOV    AX,DS
  315.     MOV    ES,AX        ; RESTORE ES REGISTER
  316.     RET            ; RETURN TO CALLING ROUTINE
  317.     PAGE
  318. ;                                          ;
  319. ;*****************************************************************************;
  320. ;                                          ;
  321. ;    KEYBOARD INPUT SUBROUTINE     VERSION 2/19/84                  ;
  322. ;                                          ;
  323. ;    THIS ROUTINE READS ASCII CODES FROM THE KEYBOARD INTO A BUFFER          ;
  324. ;                                          ;
  325. ;    ENTRY:    AH = MAX NUMBER OF CHARACTERS TO READ EXCLUDING ANY CR CODE   ;
  326. ;        DI = FWA OF THE BUFFER IN WHICH TO STORE THE CHARACTERS       ;
  327. ;                                          ;
  328. ;    EXIT:    AL = THE LAST CHARACTER READ EXCLUDING ANY CR CODE          ;
  329. ;        AH = THE NUMBER OF CHARACTERS READ EXCLUDING BS OR CR CODES   ;
  330. ;        DI = ADDRESS OF THE LAST CHARACTER READ               ;
  331. ;             ONE LESS THAN BUFFER FWA IF ONLY CR IS RECEIVED          ;
  332. ;                                          ;
  333. ;    BACKSPACE AND CARRIAGE RETURN CODES ARE PROCESSED BY DOS          ;
  334. ;                                          ;
  335. ;    THE BUFFER MUST HAVE THE FIRST TWO BYTES AVAILABLE FOR STORAGE OF     ;
  336. ;    THE MAX NUMBER OF CHARACTERS TO READ AND NUMBER OF CHARACTERS READ    ;
  337. ;    INCLUDING THE CARRAIGE RETURN CODE                      ;
  338. ;                                          ;
  339. ;    ALTERS: ALL REGISTERS EXCEPT BX ARE ALTERED                  ;
  340. ;                                          ;
  341. ;*****************************************************************************;
  342. ;                                          ;
  343. KYBD:    PUSH    BX        ; SAVE REGISTER
  344.     PUSH    DI        ; SAVE BUFFER ADDRESS
  345.     INC    AH        ; ALLOW FOR THE CR CODE
  346.     MOV    [DI],AH     ; STORE MAX NUMBER OF WORDS TO READ
  347.     MOV    AX,0C0AH    ; CLEAR AND READ KEYBOARD BUFFER
  348.     MOV    DX,DI        ; BUFFER ADDRESS IN DX
  349.     INT    21H        ; CALL DOS
  350.     POP    DI        ; GET BUFFER ADDRESS
  351.     INC    DI
  352.     MOV    AH,[DI]     ; GET NUMBER OF CHARACTERS READ
  353.     MOV    BL,AH        ; PUT IN BASE REGISTER
  354.     XOR    BH,BH
  355.     ADD    DI,BX        ; SET DI TO LAST CHARACTER POSITION
  356.     MOV    AL,[DI]     ; GET LAST CHARACTER READ
  357.     POP    BX        ; RESTORE REGISTER
  358.     RET            ; RETURN TO CALLING ROUTINE
  359.     PAGE
  360. ;                                          ;
  361. ;*****************************************************************************;
  362. ;                                          ;
  363. ;    CONVERT ASCII TO HEX            VERSION 2/21/84              ;
  364. ;                                          ;
  365. ;    CONVERT TWO ASCII CODES IN AX TO ONE HEX NUMBER IN AL              ;
  366. ;                                          ;
  367. ;    ENTRY:    AL = UPPER ASCII CODE                          ;
  368. ;        AH = LOWER ASCII CODE                          ;
  369. ;                                          ;
  370. ;    EXIT:    AL = ONE HEX NUMBER  (TWO HEX DIGITS)                  ;
  371. ;        CARRY FLAG IS SET IF AN ILLEGAL HEX DIGIT IS IN THE INPUT     ;
  372. ;                                          ;
  373. ;    ALTERS: REGISTERS AL AND AH ARE ALTERED                   ;
  374. ;                                          ;
  375. ;    NOTE:    VALID FOR ALL HEX NUMBERS 00 TO FF                  ;
  376. ;                                          ;
  377. ;*****************************************************************************;
  378. ;                                          ;
  379. ASC_HEX:PUSH    BX        ; SAVE REGISTERS
  380.     MOV    BX,AX        ; SAVE THE ASCII CODES
  381.     CALL    CNVRT1        ; RETURNS UPPER DIGIT IN LOWER AL
  382.     SHL    AL,1        ; PUT IT IN UPPER AL
  383.     SHL    AL,1
  384.     SHL    AL,1
  385.     SHL    AL,1
  386.     XCHG    AL,BH        ; SAVE IN BH & GET LOWER DIGIT
  387.     CALL    CNVRT1        ; RETURNS LOWER DIGIT IN LOWER AL
  388.     OR    AL,BH        ; COMBINE BOTH HEX DIGITS INTO AL
  389.     POP    BX        ; RESTORE REGISTERS
  390.     CLC            ; CLEAR CARRY/ERROR FLAG
  391.     RET            ; RETURN TO CALLING ROUTINE
  392. ;
  393. CNVRT1: SUB    AL,30H        ; PARTIAL CONVERSION
  394.     JL    CERR        ; AL < 0 => ILLEGAL HEX CODE
  395.     CMP    AL,9        ; CHECK FOR 0 - 9
  396.     JLE    CEND        ; AL <= 9 => 0 - 9
  397.     CMP    AL,11H        ; CHECK FOR A - F
  398.     JL    CERR        ; AL < 11H => ILLEGAL (between '9' and 'A')
  399.     SUB    AL,7        ; CONVERT A - F
  400.     CMP    AL,0FH        ; AL > 0FH => ILLEGAL
  401.     JG    CERR        ; ERROR EXIT
  402. CEND:    RET            ; RETURN TO CONTINUE
  403. ;
  404. CERR:    POP    AX        ; ERASE FIRST RETURN ADDRESS
  405.     SUB    AX,AX        ; SET RESULT TO ZERO
  406.     POP    BX        ; ADJUST STACK
  407.     STC            ; SET CARRY/ERROR FLAG
  408.     RET            ; RETURN TO CALLING ROUTINE
  409.     PAGE
  410. ;                                          ;
  411. ;*****************************************************************************;
  412. ;                                          ;
  413. ;    CONVERT HEX TO ASCII                              ;
  414. ;                                          ;
  415. ;    CONVERT FROM TWO HEX DIGITS IN AL TO TWO ASCII CODES IN AX          ;
  416. ;                                          ;
  417. ;    ENTRY:    AL = HEX NUMBER 00H TO FFH                      ;
  418. ;                                          ;
  419. ;    EXIT:    AL = UPPER ASCII CODE                          ;
  420. ;        AH = LOWER ASCII CODE                          ;
  421. ;                                          ;
  422. ;    ALTERS: REGISTERS AL AND AH ARE ALTERED                   ;
  423. ;                                          ;
  424. ;    NOTE:    THIS CONVERSION IS VALID FOR ALL HEX CODES              ;
  425. ;                                          ;
  426. ;*****************************************************************************;
  427. ;                                          ;
  428. HEX_ASC:
  429.     MOV    AH,AL        ; Save upper hex digit
  430.     CALL    CVRT2        ; Convert hex lower digit
  431.     XCHG    AH,AL        ; Save it in AH / get upper digit to convert
  432.     SHR    AL,1        ; Shift into low nibble
  433.     SHR    AL,1
  434.     SHR    AL,1
  435.     SHR    AL,1
  436.     CALL    CVRT2        ; Convert upper hex digit
  437.     RET            ; Return to calling routine
  438. ;
  439. ;  CONVERT ONE HEX DIGIT IN LOWER NIBBLE OF AL INTO ONE ASCII CODE IN AL
  440. ;
  441. CVRT2:    AND    AL,0FH        ; Separate out one hex digit
  442.     OR    AL,30H        ; Convert 0 - 9
  443.     CMP    AL,'9'          ; Check for A - F
  444.     JLE    CVRT4        ; Skip if 0 - 9
  445.     ADD    AL,07H        ; Convert A - F
  446. CVRT4:    RET            ; Return to calling routine
  447.     .XLIST
  448.     SUBTTL    Messages and Data Storage
  449.     PAGE    +
  450.     .LIST
  451. ;
  452. ;  MESSAGES and DATA STORAGE
  453. ;
  454. SEGMSG    DB    CR,LF,LF,'DO YOU WANT TO DISPLAY A DIFFERENT SEGMENT ? (Y/N) $'
  455. ;
  456. SEGMSG2 DB    CR,LF,LF,'ENTER THE SEGMENT IN HEX $'
  457. ;
  458. SEGMSG3 DB    CR,LF,LF,'DISPLAYING FROM SEGMENT NUMBER  $'
  459. ;
  460. STMSG    DB    CR,LF,LF,'ENTER THE HEX STARTING ADDRESS $'
  461. ;
  462. ENDMSG    DB    CR,LF,'REPEAT TO LOOK AT MORE ? (Y/N) $'
  463. ;
  464. CHARS    DW    '  '
  465.     DB    ' $'
  466. ;
  467. SPACE    DB    '       $'
  468. ASCTOP    DB    '   $'
  469. ;
  470. ASCSYM    DB    '  '
  471. ASCCHAR DB    16 DUP(' ')
  472. ;
  473. SEGADD    DB    0,0,0,0
  474. ASCSEG    DW    0,0
  475.     DB    '  $'
  476. ;
  477. STADD    DB    0,0,0,0
  478. ASCADD    DW    0,0
  479.     DB    '  $'
  480. KBUFSZ    DB    0,0
  481. KBUF    DB    '    $'
  482. ;
  483.     CSEG    ENDS
  484.     END    LOOK
  485.