|
|
1.1 ! root 1: .386P ! 2: ! 3: vseg equ 0b000h ;video ram segment address ! 4: ! 5: ;**************************************************************************** ! 6: ;* * ! 7: ;* Procedure msout On entry ds:si -> text, terminated with 0. * ! 8: ;* * ! 9: ;* Display message on standard output, convert parameters to hex ascii or * ! 10: ;* decimal ascii for each �n, �n, �n in message where n=number of digits. * ! 11: ;* Repeat character c for �nc, where n=(number of repetitions plus 30h). * ! 12: ;* * ! 13: ;**************************************************************************** ! 14: ! 15: litsg equ '�' ;next character is to be output directly ! 16: hexsg equ '�' ;hexadecimal conversion signal ! 17: decsg equ '�' ;decimal conversion signal ! 18: decsgn equ '�' ;decimal conversion, leading spaces suppressed ! 19: decsgc equ '�' ;decimal conversion, use commas ! 20: repsg equ '�' ;repeat character signal ! 21: sgchk equ '�' ;all characters below this value are literals ! 22: ! 23: msout proc near ! 24: pushad ! 25: push ds ! 26: push es ! 27: push ax ! 28: ! 29: mov ax,cs ! 30: mov ds,ax ! 31: mov es,ax ! 32: mov di,os iobuf ;output buffer ! 33: mov bx,os msval ;parameter list ! 34: cld ! 35: ! 36: msorc: lodsb ;read character ! 37: cmp al,sgchk ! 38: jc short msowc ;not conversion character ! 39: ! 40: cmp al,hexsg ! 41: jz short mscvh ;hex conversion character ! 42: xor dh,dh ;decimal type flag ! 43: cmp al,decsg ! 44: jz short mscvd ;decimal conversion ! 45: mov dh,40h ;leading space suppress, bit 6 ! 46: cmp al,decsgn ! 47: jz short mscvd ;decimal, suppress leading spaces ! 48: shl dh,1 ;include commas, bit 7 ! 49: cmp al,decsgc ! 50: jz short mscvd ;decimal with commas ! 51: cmp al,repsg ! 52: jnz short msolc ;not repeat character ! 53: lodsb ;get number of repeats ! 54: sub al,30h ;ascii zero based ! 55: movzx cx,al ;count ! 56: lodsb ;character to repeat ! 57: rep stosb ;expand ! 58: jmp short msorc ! 59: ! 60: msolc: cmp al,litsg ! 61: jnz short msowc ;not literal signal ! 62: lodsb ;no translation on character following ! 63: ! 64: msowc: stosb ;write character to buffer ! 65: or al,al ! 66: jnz short msorc ;not at end ! 67: ! 68: mov si,os iobuf ! 69: sub di,si ;length ! 70: dec di ! 71: ; jz msox ;what? ! 72: mov cx,di ! 73: pop di ;dest ! 74: ; mov ah,40h ! 75: ; mov bx,1 ;stdout ! 76: ; int 21h ;write line ! 77: mov ax,vseg ! 78: mov es,ax ;video segment ! 79: mov ah,7 ;attr ! 80: wrsc: lodsb ! 81: stosw ! 82: loop wrsc ;write ms to screen ! 83: ! 84: msox: pop es ! 85: pop ds ! 86: popad ! 87: ret ! 88: ! 89: ! 90: ; Binary to Hex Ascii Conversion ! 91: ! 92: ; ds:si->source text, es:di->output text, ds:bx->current binary parameter ! 93: ! 94: mscvh: lodsb ;read character after signal ! 95: dec al ! 96: and al,7 ;number of digits (0-7 for 1-8) ! 97: shl al,2 ;times bits per digit ! 98: movzx cx,al ;number of bits minus 4 ! 99: mov eax,[bx] ;get parameter ! 100: add bx,4 ;address next parameter ! 101: ror eax,cl ;bits 3-0 are ms digit ! 102: shr cx,2 ! 103: inc cx ;number of digits ! 104: ! 105: mshxd: mov dh,al ;save 2 digits ! 106: call cvhn ;convert al{3:0} ! 107: mov al,dh ;restore 2 digits ! 108: rol eax,4 ;pull up next digit ! 109: loop mshxd ! 110: jmp short msorc ;continue with text ! 111: ! 112: ; Convert Binary in al to Hex Ascii at es:[di]+ ! 113: ; Affects: ax, di ! 114: ! 115: cvhb: cld ! 116: push ax ;save low digit ! 117: shr al,4 ! 118: call cvhn ;convert high digit ! 119: pop ax ;convert low digit ! 120: cvhn: and al,0fh ! 121: or al,90h ;90-99, 9A-9F ! 122: daa ;90-99, 100-105 ! 123: adc al,40h ;D0-D9, 41-46 ! 124: daa ;130-139, 41-46 ! 125: stosb ;store ascii 0-9, A-F ! 126: ret ! 127: ! 128: ! 129: ; Binary to Decimal Ascii Conversion ! 130: ! 131: ; ds:si->source text, es:di->output text, ds:bx->current binary parameter ! 132: ! 133: ; dh = 80h, include commas; dh = 40h, suppress leading spaces ! 134: ! 135: mscvd: lodsb ;read character after signal ! 136: xor ecx,ecx ;clear for use as index ! 137: cmp al,'w' ! 138: jz short msdwp ;16-bit conversion ! 139: cmp al,'b' ! 140: jnz short msdlp ;32-bit conversion ! 141: ! 142: mov 1[bx],cl ;8-bit conversion, zero high byte of low word ! 143: msdwp: mov 2[bx],cx ;zero high word for 8/16-bit ! 144: lodsb ;get next source character ! 145: ! 146: msdlp: dec al ! 147: and al,0fh ! 148: mov cl,al ;number of decimal digits (0-9 for 1-10) ! 149: mov ebp,[bx] ;get parameter ! 150: add bx,4 ;update current parameter address ! 151: push bx ! 152: ! 153: msdsc: sub al,3 ! 154: jnc short msdsc ;reduce al mod 3 ! 155: add al,3 ;add remainder ! 156: mov bl,al ;number of digits before first comma ! 157: push si ;save place in source text ! 158: ! 159: jcxz msd1 ;one digit only ! 160: lea si,dcval[ecx*4] ;index into 10� list for number of digits ! 161: ! 162: msdxd: std ;count downward ! 163: lodsd ;get 10� where n is current digit ! 164: cld ;count upward ! 165: ! 166: mov dl,2fh ;ascii count ! 167: msdxi: inc dl ! 168: js short msdov ;overflow ! 169: sub ebp,eax ;subtract 10� from parameter value ! 170: jnc short msdxi ! 171: msdov: add ebp,eax ;leave remainder ! 172: ! 173: cmp dl,3ah ! 174: jc short msdno ;no overflow ! 175: stc ! 176: rcr ebp,1 ;make sure it propagates ! 177: mov dl,'*' ;overflow character ! 178: ! 179: msdno: or dh,dl ;bits 3-0 are zero if this is a leading zero ! 180: test dh,0fh ;check whether all zeros so far ! 181: mov al,dl ;current digit ! 182: jnz short msdpc ;display non-leading-zero ! 183: mov al,' ' ;change leading zero to space ! 184: ! 185: test dh,40h ! 186: jnz short msdx ;skip leading spaces and commas ! 187: ! 188: msdpc: stosb ;write digit to output buffer ! 189: ! 190: or dh,dh ! 191: jns short msdx ;no commas ! 192: ! 193: dec bl ;decrement comma counter ! 194: jns short msdx ;no action until zero ! 195: cmp al,' ' ! 196: jz short msdco ;leave leading space ! 197: mov al,',' ! 198: msdco: stosb ;write comma to output buffer ! 199: ! 200: mov bl,2 ;reload counter ! 201: msdx: loop msdxd ;next digit ! 202: msd1: mov ax,bp ;last digit ! 203: cmp ax,10 ! 204: jc short msd1n ;no overflow ! 205: mov al,1ah ;display * ! 206: msd1n: xor al,30h ! 207: stosb ! 208: ! 209: pop si ;restore current index in source text ! 210: pop bx ;restore current parameter index ! 211: jmp msorc ;continue with text ! 212: ! 213: align 4 ! 214: ! 215: dcval equ $-4 ;10� table ! 216: ! 217: dd 10,100,1000,10000,100000,1000000 ! 218: dd 10000000,100000000,1000000000 ! 219: ! 220: msval: ;parameter list ! 221: mv1: dd 0 ! 222: mv2: dd 0 ! 223: mv3: dd 0 ! 224: mv4: dd 0 ! 225: mv5: dd 0 ! 226: mv6: dd 0 ! 227: mv7: dd 0 ! 228: mv8: dd 0 ! 229: ! 230: iobuf: db 512 dup (99h) ;output buffer ! 231: ! 232: msout endp
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.