| DOS386 
 13.04.2009, 10:20
   | 18 Bytes !!! Anyone can beat this? HEX16 for 8086 (Developers) | 
    
     | Task: convert the value in DX (or some other register) into a 4-Bytes string representing the number in HEX using 8086 compatible instructions (no TSR this time, sorry  ) 
 Solution by King Udo (31 Bytes):
 
 
 output_hex:
 ; On Entry:
 ;      dx = 2 byte hex value
 ; On Exit:
 ;      None
 
 mov      cx,4
 output_hex10:
 mov      al,dh
 push     cx
 mov      cl,4
 shr      al,cl
 pop      cx
 and      al,0fh
 cmp      al,09h         ; greater 0-9?
 jg       output_hex20
 add      al,30h
 jmp      output_hex30
 output_hex20:
 add      al,37h
 output_hex30:
 ; call onecharal
 push     cx
 mov      cl,4
 shl      dx,cl
 pop      cx
 loop     output_hex10
 My solution (18 Bytes):
 
 
 use16
 ; HEX16 output conversion, 8086 compatible
 
 ; Input in DX or AX | Trashes AX CX DX
 
 ;  9 instructions 18 Bytes vary bare input in DX
 ; 10 instructions 19 Bytes very bare input in AX
 ; 11 instructions 22 Bytes including call, input in AX
 ; 18 instructions 29 Bytes including call, full register preservation and RET
 
 push   ax
 push   cx
 push   dx
 
 xchg   dx, ax       ; DX <- AX | Later peek the 4-bit groups from DX
 mov    cx, 1028     ; "MOVNTQ CL, 4" + "MOVNTQ CH, 4"
 @@:     mov    al, dh       ; AL <- DH | Move all 8 bits, only upper 4 useful
 shl    dx, cl       ; 8086 compatible
 shr    al, cl       ; 8086 compatible
 cmp    al, 10       ; Now must be and is AL<=15 | Decimal "10" !!!
 sbb    al, $69      ; Securely Bugged Backup
 das                 ; Digital Attack System | ASCII result in AL
 call   onecharal    ; Input in AL | Must preserve CX and DX, not AX
 dec    ch           ; & No LOO'p on CH
  jnz    short @b     ; &
 
 pope   dx
 pope   cx
 pope   ax
 ret
 ;----
 ---This is a LOGITECH mouse driver, but some software expect here
 the following string:*** This is Copyright 1983 Microsoft ***
 | 
               
     | ecm 
 
    
 Düsseldorf, Germany,
 13.04.2009, 14:08
 
 @ DOS386
 | 18 Bytes! Anyone can beat this? - No | 
    
     | My solution requires 34 bytes, but I think it's easier to understand than using das (or daa, see below).
 
 disp_ax_hex:                      ; axxchg al,ah
 call disp_al_hex                ; display former ah
 xchg al,ah                      ;  and fall trough for al
 disp_al_hex:                    ; al
 push cx
 mov cl,4
 ror al,cl
 call disp_al_lownibble_hex      ; display former high-nibble
 rol al,cl
 pop cx
 ;  and fall trough for low-nibble
 disp_al_lownibble_hex:
 push ax                         ; save ax for call return
 and al,00001111b                ; high nibble must be zero
 add al,'0'                    ; if number is 0-9, now it's the correct character
 cmp al,'9'
 jna .decimalnum                 ; if we get decimal number with this, ok -->
 add al,7                        ;  otherwise, add 7 and we are inside our alphabet
 .decimalnum:
 call disp_al
 pop ax
 retn
 I think Henrik Haftmann's solution is good, too. It still requires 26 bytes. (Note that _ochr is actually the call to display the character in al, so it doesn't count. Note also that these macros aren't used as macros multiple times per program, they're used once, then they're called inside the program.)
 
 
 macro _ochr                       ;Zeichenausgabe aus ALochr:   push    ax dx
 mov     dl,al
 DOS     2
 pop     dx ax
 ret
 endm
 
 macro _axhx                     ;Hexzahlausgabe, VR: AX,F
 axhx:   xchg    al,ah
 call    ahex
 xchg    al,ah
 ahex:   push    ax cx           ;Werte erhalten
 mov     cl,4            ;oberes Nibble auf Bit 3...0
 shr     al,cl           ; schieben
 pop     cx
 call    ahex1
 pop     ax
 ahex1:  and     al,0fh
 add     al,90h          ;Hex -> ASCII
 daa
 adc     al,40h
 daa
 _ochr
 endm
 ---l
 | 
                
     | DOS386 
 13.04.2009, 14:32
 
 @ ecm
 | 18 Bytes! Anyone can beat this? - No DAS | 
    
     | > easier to understand than using das
 Just replace (5 Bytes):
 
 
         cmp    al, 10       ; Now must be and is AL<=15 | Decimal "10" !!!sbb    al, $69      ; Securely Bugged Backup
 das                 ; Digital Attack System | ASCII result in AL
 by (8 Bytes):
 
 
         cmp    al, 10jb      short heh
 add     al, 7
 heh:    add     al, 48
 So my code grows to 21 Bytes. I have no idea how DAS works but it does
  ---This is a LOGITECH mouse driver, but some software expect here
 the following string:*** This is Copyright 1983 Microsoft ***
 | 
                
     | mht 
 
  
 Wroclaw, Poland,
 13.04.2009, 16:04
 
 @ DOS386
 | 18 Bytes !!! Anyone can beat this? HEX16 for 8086 | 
    
     | You can still improve register usage. Use rotations on one register instead of shifts on two (4 rotations by 4 bits = no-op).But anyway, what are you trying to show?
 1. "Work-In-Progress version" certainly may contain some (possibly even unused) debug code and there is nothing wrong with it.
 2. Optimizing such pieces of code is wasting time, it will be surely removed in a "production" version.
 3. You can find source files where unclear tricks (like the old DAS one) are commented and explained, better cut-and-paste from there, instead of introducing additional noise.
 | 
                
     | rr 
 
    
 Berlin, Germany,
 13.04.2009, 16:13
 
 @ DOS386
 | 18 Bytes! Anyone can beat this? - No DAS | 
    
     | > So my code grows to 21 Bytes. I have no idea how DAS works but it> does
  
 http://www.df.lth.se/%7Ejohn_e/gems/gem003a.html
 ---Forum admin
 | 
                
     | DOS386 
 18.05.2009, 05:54
 (edited by DOS386, 18.05.2009, 06:09)
 
 @ mht
 | 18 Bytes !!! Anyone can beat this? HEX16 for 8086 | ROL | 
    
     | rr wrote: 
 > http://www.df.lth.se/%7Ejohn_e/gems/gem003a.html
 
 
  
 mht wrote:
 
 > You can still improve register usage. Use rotations on one
 > register instead of shifts on two (4 rotations by 4 bits = no-op).
 
 Thanks
  You can't beat the 18 Bytes this way but indeed improve the "useful" variant  
 > better cut-and-paste from there, instead of introducing additional
 > noise
 
 Welcome back to NOiSe ain't dead - the great C&P forum
  
 
 use16
 ; HEX16 output conversion, 8086 compatible
 
 ; Input in AX | Trashes CX only !!!
 
 ;  9 instructions 18 Bytes vary bare, input in DX, trashes AX
 ; 10 instructions 18 Bytes very bare, input in AX, uses stack
 ; 10 instructions 19 Bytes very bare, input in AX, trashes DX, no stack
 ; 11 instructions 21 Bytes including call, input in AX, uses stack
 ; 14 instructions 24 Bytes including call, full register preservation and RET
 
 hex16:
 push   cx
 
 mov    cx, 1028     ; "MOVNTQ CL, 4" + "MOVNTQ CH, 4"
 h16l:
 rol    ax, cl       ; 8086 compatible, after 4 ROL's original back
 ; rol    dx, cl       ; 8086 compatible, after 4 ROL's original back
 ; mov    al, dl       ; AL <- DL , transfer 8 bits, only 4 are useful
 push   ax
 ; mov    dx, ax       ; Now both DX and AX are equal, XCHG not good
 and    al, $0F
 cmp    al, 10       ; Now must be and is AL<=15 | Decimal "10" !!!
 sbb    al, $69      ; Securely Bugged Backup
 das                 ; Digital Attack System | ASCII result in AL
 call   onecharal    ; Input in AL | Must preserve CX (+ DX or AX)
 pope   ax
 ; xchg   dx, ax       ; Restore trashed AX from DX, but now DX trash
 dec    ch           ; & No LOO'p on CH
  jnz    short h16l   ; &
 
 pope   cx
 ret
 ;----
 
 ; Avoiding cryptic "DAS" (also preceding SBB, OTOH keep CMP) costs 3 Bytes:
 
 cmp    al, 10
 jb     short @f     ; OK, 0 ... 9
 add    al, 7        ; Fix for A ... F
 @@:     add    al, 48
 ---This is a LOGITECH mouse driver, but some software expect here
 the following string:*** This is Copyright 1983 Microsoft ***
 |