Intel assembler
Collected size: 506 bytes
Source: 2252 bytes (hey, this is not a trivial problem)
Build: use A86 Run: Tested using the WinXP DOS window. Call jtd.com < input > output
mov ax,3 int 10h mov ax,0b800h mov es,ax mov ah,0bh int 21h mov bx,255 cmp al,bl mov dh,bh mov si,offset a12 push offset a24 je a1 mov si,offset a14 a1: inc bl a2: mov dl,255 call si cmp al,10 jb a4 a3: cmp al,10-48 jne a1 inc bh mov bl,dh jmp a2 a4: mov dl,al call si cmp al,10 jae a5 mov ah,dl aad mov dl,al a5: mov di,dx mov ch,al shl di,2 mov [di+a32],bx cmp bl,[offset a30] jb a6 mov [offset a30],bl a6: cmp bh,[offset a31] jb a7 mov [offset a31],bh a7: push offset a19 mov al,80 mul bh add al,bl adc ah,0 add ax,ax lea di,[di+2+a32] mov [di],ax add di,2 cmp di,[a22-3] jbe a8 mov [a22-3],di mov [a25-3],di a8: mov di,ax mov al,dl aam cmp ah,0 je a10 a9: add ah,48 mov es:[di],ah add di,2 a10:add al,48 mov es:[di],al mov al,ch inc bl jmp a3 a11:jmp si a12:mov ah,0bh int 21h cmp al,255 jne a15 mov ah,8 int 21h a13:cmp al,13 je a11 sub al,48 ret a14:mov ah,1 int 21h cmp al,26 jne a13 mov si,offset a15 ret a15:cmp dl,255 je a16 mov al,32 ret a16:mov si,offset a32 + 4 lodsw mov cx,ax mov dx,ax lodsw mov di,ax mov b es:[di],1 mov bp,0f000h call a26 add sp,6 mov bx,[a22-3] mov ax,[offset a31] inc ax a17:mov bp,[offset a30] a18:mov b[bx],32 inc bx dec bp jnz a18 mov w[bx],0a0dh add bx,2 dec ax jnz a17 mov b[bx],'$' add w[a30],2 a19:lodsw xchg ax,dx cmp ah,dh lahf mov bl,ah cmp al,dl lahf shr bl,6 shr ah,4 and ah,12 or bl,ah mov bh,0 shl bx,3 a20:mov b es:[di],43 a21:mov al,b[a30] mul ch add al,cl adc ah,0 mov bp,ax mov b[bp+100h],43 a22:add di,[bx + a29] add cl,[bx + a29 + 4] add ch,[bx + a29 + 6] mov b es:[di],1 mov al,[bx + a29 + 2] mov [a21-1],al mov [a22-1],al mov bp,01000h call a26 cmp di,[si] jne a20 mov al,es:[di+2] sub al,48 cmp al,10 jae a23 mov b es:[di+2],0 a23:mov b[a21-1],43 mov b[a22-1],43 mov b es:[di],43 lodsw ret a24:mov al,b[a30] mul ch add al,cl adc ah,0 mov bp,ax mov b[bp+100h],43 a25:mov dx,[a22-3] mov ah,9 int 21h ret a26:pusha a27:mov cx,0ffffh a28:loop a28 dec bp jnz a27 popa ret a29:dw -162,92,-1,-1,-2,45,-1,0,158,47,-1,1,0,0,0,0,-160,124,0,-1 a30:dw 0 a31:dw 0,0,0,160,124,0,1,0,0,0,0,-158,47,1,-1,2,45,1,0,162,92,1,1 a32:
Fun features: self-modifying code, animated output (the second example works, but too large to display), the abuse of "ret" to create a loop counter, an interesting way to determine the direction of the line / movement.