From: notsaying@nospicedham.invalid.org   
      
   On Wed, 04 Apr 2018 09:15:43 GMT, "wolfgang kern"    
   wrote:   
      
   > Kerr-Mudd,John wrote:   
   >   
   >>>>> Criticisms welcome:   
   >   
   >   
   > Yeah, a LUT would be overkill. A bit reordering and CMOVcc, SETcc   
   > could save some jumps.   
   Actually, it's OK   
      
   BE8000AC9891E88D007254954EAC3C20E1FB744B50E87E0091587243982C253C   
   0A773C53BB8B0101C38A1F95FFD35BBF8701B9680080FB10740AB12009C07904   
   F7D8B12D31D2F7F3923C0A1C692F88054F9209C075EE880D575AB409CD21C3BA   
   6401EBF655736167652069733A2063616C63206E756D31205B2B2D2A2F252726   
   28295D206E756D320D0A24EDDDE3D7DAE0D15FD45FEDAC3C20E1FB7431BB0A00   
   3C687503B310AC55523C2D9C74024E4131EDAC3C30720E244FD4379895F7E372   
   0D01C5E2ED959D7502F7D85A5DC358EBFA01C8C329C8C309C8C331C8C321C8C3   
   F7E1C389C549F7E57202E2FAC399F7F1454D750192C3   
      
   161D:0100 BE 80 00 mov si,0080   
   161D:0103 AC lodsb   
   161D:0104 98 cbw   
   161D:0105 91 xchg ax,cx   
   ; call getnum   
   161D:0106 E8 8D 00 call 0196   
   161D:0109 72 54 jb 015F   
   161D:010B 95 xchg ax,bp   
   ; getoperator   
   161D:010C 4E dec si   
   161D:010D AC lodsb   
   161D:010E 3C 20 cmp al,20   
   161D:0110 E1 FB loopzw 010D   
   161D:0112 74 4B jz 015F   
   161D:0114 50 push ax   
   ; call getnum   
   161D:0115 E8 7E 00 call 0196   
   161D:0118 91 xchg ax,cx   
   ; test op   
   161D:0119 58 pop ax   
   161D:011A 72 43 jb 015F   
   161D:011C 98 cbw   
   161D:011D 2C 25 sub al,25 ; '%'->0   
   161D:011F 3C 0A cmp al,0A ; '/' is top   
   161D:0121 77 3C ja 015F   
   161D:0123 53 push bx   
   161D:0124 BB 8B 01 mov bx,018B ; LUT   
   161D:0127 01 C3 add bx,ax   
   161D:0129 8A 1F mov bl,[bx] ; bh=1   
   161D:012B 95 xchg ax,bp   
   ; call op rtn   
   161D:012C FF D3 call bx   
   161D:012E 5B pop bx   
   prtnum:   
   161D:012F BF 87 01 mov di,0187 ; lastdigit   
   161D:0132 B9 68 00 mov cx,0068 ; 'h'   
   161D:0135 80 FB 10 cmp bl,10   
   161D:0138 74 0A jz 0144   
   161D:013A B1 20 mov cl,20   
   161D:013C 09 C0 or ax,ax   
   161D:013E 79 04 jns 0144   
   161D:0140 F7 D8 neg ax   
   161D:0142 B1 2D mov cl,2D ;-ve   
   putc:   
   161D:0144 31 D2 xor dx,dx   
   161D:0146 F7 F3 div bx   
   161D:0148 92 xchg ax,dx   
   161D:0149 3C 0A cmp al,0A   
   161D:014B 1C 69 sbb al,69   
   161D:014D 2F das   
   161D:014E 88 05 mov [di],al   
   161D:0150 4F dec di   
   161D:0151 92 xchg ax,dx   
   161D:0152 09 C0 or ax,ax   
   161D:0154 75 EE jnz 0144   
   161D:0156 88 0D mov [di],cl   
   161D:0158 57 push di   
   161D:0159 5A pop dx   
   msgexit: ; print $ terminated string in dx   
   161D:015A B4 09 mov ah,09   
   161D:015C CD 21 int 21   
   endprog:   
   161D:015E C3 ret   
      
   prtusage:   
   161D:015F BA 64 01 mov dx,0164   
   161D:0162 EB F6 jmp 015A   
   161D:0164 db "Usage is: calc num1 [+-*/%'&()] num2"   
   lastdigit equ $-1   
   db 0D,0A,'$'   
   LUT:   
   161D:018B db ED DD E3 D7 DA E0 D1 5F D4 5F ED   
      
   getnum:   
   161D:0196 AC lodsb   
   161D:0197 3C 20 cmp al,20   
   161D:0199 E1 FB loopzw 0196   
   161D:019B 74 31 jz 01CE   
   161D:019D BB 0A 00 mov bx,000A   
   161D:01A0 3C 68 cmp al,68   
   161D:01A2 75 03 jnz 01A7   
   161D:01A4 B3 10 mov bl,10   
   161D:01A6 AC lodsb   
   161D:01A7 55 push bp   
   161D:01A8 52 push dx   
   161D:01A9 3C 2D cmp al,2D   
   161D:01AB 9C pushfw   
   161D:01AC 74 02 jz 01B0   
   161D:01AE 4E dec si   
   161D:01AF 41 inc cx   
   161D:01B0 31 ED xor bp,bp   
   161D:01B2 AC lodsb   
   161D:01B3 3C 30 cmp al,30   
   161D:01B5 72 0E jb 01C5   
   161D:01B7 24 4F and al,4F   
   161D:01B9 D4 37 aam 37   
   161D:01BB 98 cbw   
   161D:01BC 95 xchg ax,bp   
   161D:01BD F7 E3 mul bx   
   161D:01BF 72 0D jb 01CE   
   161D:01C1 01 C5 add bp,ax   
   161D:01C3 E2 ED loopw 01B2   
   161D:01C5 95 xchg ax,bp   
   161D:01C6 9D popfw   
   161D:01C7 75 02 jnz 01CB   
   161D:01C9 F7 D8 neg ax   
   161D:01CB 5A pop dx   
   161D:01CC 5D pop bp   
   161D:01CD C3 ret   
   161D:01CE 58 pop ax   
   161D:01CF EB FA jmp 01CB   
   addnums:   
   161D:01D1 01 C8 add ax,cx   
   161D:01D3 C3 ret   
   161D:01D4 29 C8 sub ax,cx   
   161D:01D6 C3 ret   
   161D:01D7 09 C8 or ax,cx   
   161D:01D9 C3 ret   
   161D:01DA 31 C8 xor ax,cx   
   161D:01DC C3 ret   
   161D:01DD 21 C8 and ax,cx   
   161D:01DF C3 ret   
   161D:01E0 F7 E1 mul cx   
   161D:01E2 C3 ret   
   expnums:   
   161D:01E3 89 C5 mov bp,ax   
   161D:01E5 49 dec cx   
   161D:01E6 F7 E5 mul bp   
   161D:01E8 72 02 jb 01EC   
   161D:01EA E2 FA loopw 01E6   
   161D:01EC C3 ret   
   divnums:   
   modnums:   
   161D:01ED 99 cwd   
   161D:01EE F7 F1 div cx   
   161D:01F0 45 inc bp   
   161D:01F1 4D dec bp   
   161D:01F2 75 01 jnz 01F5   
   161D:01F4 92 xchg ax,dx   
   161D:01F5 C3 ret   
      
      
   10 spare   
      
      
      
      
   --   
   Bah, and indeed, Humbug.   
      
   --- SoupGate-Win32 v1.05   
    * Origin: you cannot sedate... all the things you hate (1:229/2)   
|