home *** CD-ROM | disk | FTP | other *** search
/ Power-Programmierung / CD1.mdf / assemblr / library / asm_kit / look.asm < prev    next >
Assembly Source File  |  1984-03-04  |  22KB  |  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.