nelson@image.soe.clarkson.edu (Russ Nelson) (10/07/90)
Note that EGA or VGA is required. Note that showface.com is uuencoded. #!/bin/sh # shar: Shell Archiver (v1.22) # # Run the following text with /bin/sh to create: # COPYING # README # chrout.asm # decout.asm # digout.asm # getdig.asm # getnum.asm # pixel.asm # showface.asm # showface.com # skipblk.asm # echo "x - extracting COPYING (Text)" sed 's/^X//' << 'SHAR_EOF' > COPYING && XRussell Nelson, Clarkson University. XCopyright, 1989, 1990, Russell Nelson X XThis program is free software; you can redistribute it and/or modify Xit under the terms of the GNU General Public License as published by Xthe Free Software Foundation, version 1. X XThis program is distributed in the hope that it will be useful, Xbut WITHOUT ANY WARRANTY; without even the implied warranty of XMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the XGNU General Public License for more details. X XYou are assumed to be able to find a copy of the GNU General Public XLicense; if not, write to the Free Software Foundation, Inc., 675 XMass Ave, Cambridge, MA 02139, USA. X SHAR_EOF chmod 0644 COPYING || echo "restore of COPYING fails" echo "x - extracting README (Text)" sed 's/^X//' << 'SHAR_EOF' > README && XThis is the readme file for showface, a PC program for viewing XFaceSaver(tm) format files as found on uunet.uu.net. It requires Xan EGA or VGA. X XThere is no documentation -- showface does what you expect. If you try Xsomething, and it doesn't work the way you would expect, send me mail X<nelson@sun.soe.clarkson.edu>. X XVersion 1.0: initial release X XVersion 1.1: split out graphics code into pixel.asm, added code to deal Xwith newline terminated files, added code to require presence of a XPicData header line, fixed a bug that caused only the first file to be Xdisplayed when using an EGA. X X XFaceSaver is a trademark of Metron Computerware, Ltd. SHAR_EOF chmod 0644 README || echo "restore of README fails" echo "x - extracting chrout.asm (Text)" sed 's/^X//' << 'SHAR_EOF' > chrout.asm && X;put into the public domain by Russell Nelson, nelson@clutx.clarkson.edu X X public chrout Xchrout: X push ax ;print the char in al. X push dx X mov dl,al X mov ah,2 X int 21h X pop dx X pop ax X ret SHAR_EOF chmod 0644 chrout.asm || echo "restore of chrout.asm fails" echo "x - extracting decout.asm (Text)" sed 's/^X//' << 'SHAR_EOF' > decout.asm && X;put into the public domain by Russell Nelson, nelson@clutx.clarkson.edu X X public decout Xdecout: X mov si,ax ;get the number where we want it. X mov di,dx X or ax,dx ;is the number zero? X jne decout_nonzero X mov al,'0' ;yes - easier to just print it, than X jmp chrout ; to eliminate all but the last zero. Xdecout_nonzero: X X xor ax,ax ;start with all zeroes in al,bx,bp X mov bx,ax X mov bp,ax X X mov cx,32 ;32 bits in two 16 bit registers. Xdecout_1: X shl si,1 X rcl di,1 X xchg bp,ax X call addbit X xchg bp,ax X xchg bx,ax X call addbit X xchg bx,ax X adc al,al X daa X loop decout_1 X X mov cl,'0' ;prepare to eliminate leading zeroes. X call byteout ;output the first two. X mov ax,bx ;output the next four X call wordout ;output the next four X mov ax,bp X jmp wordout X Xaddbit: adc al,al X daa X xchg al,ah X adc al,al X daa X xchg al,ah X ret X SHAR_EOF chmod 0644 decout.asm || echo "restore of decout.asm fails" echo "x - extracting digout.asm (Text)" sed 's/^X//' << 'SHAR_EOF' > digout.asm && X;put into the public domain by Russell Nelson, nelson@clutx.clarkson.edu X X public dwordout, wordout, byteout, digout Xdwordout: X mov cl,'0' ;prepare to eliminate leading zeroes. X xchg ax,dx ;just output 32 bits in hex. X call wordout ;output dx. X xchg ax,dx Xwordout: X push ax X mov al,ah X call byteout X pop ax Xbyteout: X mov ah,al X shr al,1 X shr al,1 X shr al,1 X shr al,1 X call digout X mov al,ah Xdigout: X and al,0fh X add al,90h ;binary digit to ascii hex digit. X daa X adc al,40h X daa X cmp al,cl ;leading zero? X je digout_1 X mov cl,-1 ;no more leading zeros. X jmp chrout Xdigout_1: X ret SHAR_EOF chmod 0644 digout.asm || echo "restore of digout.asm fails" echo "x - extracting getdig.asm (Text)" sed 's/^X//' << 'SHAR_EOF' > getdig.asm && X;put into the public domain by Russell Nelson, nelson@clutx.clarkson.edu X X public get_digit Xget_digit: X;enter with al = character X;return nc, al=digit, or cy if not a digit. X cmp al,'0' ;decimal digit? X jb get_digit_1 ;no. X cmp al,'9' ;. .? X ja get_digit_2 ;no. X sub al,'0' X clc X ret Xget_digit_2: X cmp al,'a' ;hex digit? X jb get_digit_3 X cmp al,'f' ;hex digit? X ja get_digit_3 X sub al,'a'-10 X clc X ret Xget_digit_3: X cmp al,'A' ;hex digit? X jb get_digit_1 X cmp al,'F' ;hex digit? X ja get_digit_1 X sub al,'A'-10 X clc X ret Xget_digit_1: X stc X ret X X SHAR_EOF chmod 0644 getdig.asm || echo "restore of getdig.asm fails" echo "x - extracting getnum.asm (Text)" sed 's/^X//' << 'SHAR_EOF' > getnum.asm && X;put into the public domain by Russell Nelson, nelson@clutx.clarkson.edu X X public get_number Xget_number: X mov bp,10 ;we default to 10. X jmp short get_number_0 X X public get_hex Xget_hex: X mov bp,16 X;get a hex number, skipping leading blanks. X;enter with si->string of digits, X; di -> dword to store the number in. [di] is not modified if no X; digits are given, so it acts as the default. X;return cy if there are no digits at all. X;return nc, bx:cx = number, and store bx:cx at [di]. Xget_number_0: X call skip_blanks X call get_digit ;is there really a number here? X jc get_number_3 X or al,al ;Does the number begin with zero? X jne get_number_4 ;no. X mov bp,8 ;yes - they want octal. Xget_number_4: X X xor cx,cx ;get a hex number. X xor bx,bx Xget_number_1: X lodsb X cmp al,'x' ;did they really want hex? X je get_number_5 ;yes. X cmp al,'X' ;did they really want hex? X je get_number_5 ;yes. X call get_digit ;convert a character into an int. X jc get_number_2 ;not a digit (neither hex nor dec). X xor ah,ah X cmp ax,bp ;larger than our base? X jae get_number_2 ;yes. X X push ax ;save the new digit. X X mov ax,bp ;multiply the low word by ten. X mul cx X mov cx,ax ;keep the low word. X push dx ;save the high word for later. X mov ax,bp X mul bx X mov bx,ax ;we keep only the low word (which is our high word) X pop dx X add bx,dx ;add the high result from earlier. X X pop ax ;get the new digit back. X add cx,ax ;add the new digit in. X adc bx,0 X jmp get_number_1 Xget_number_5: X mov bp,16 ;change the base to hex. X jmp get_number_1 Xget_number_2: X dec si X mov [di],cx ;store the parsed number. X mov [di+2],bx X clc X jmp short get_number_6 Xget_number_3: X cmp al,'?' ;did they ask for the default? X stc X jne get_number_6 ;no, return cy. X add si,2 ;skip past the question mark. X mov cx,-1 X mov bx,-1 X jmp get_number_2 ;and return the -1. Xget_number_6: X ret SHAR_EOF chmod 0644 getnum.asm || echo "restore of getnum.asm fails" echo "x - extracting pixel.asm (Text)" sed 's/^X//' << 'SHAR_EOF' > pixel.asm && X; code to do graphics at 320x200x256 on both EGAs and VGAs. X Xaddress_list label word X;can't change es, di, dx, or ah. X;al and bx will get trashed, but they need not be preserved. Xopen_vid dw ? Xmove_right dw ? Xmove_up dw ? Xmove_down dw ? Xset_bit dw ? Xclose_vid dw ? Xuninit_vid dw ? Xaddress_end label word X Xega_adrs dw init_vid_ega, open_vid_ega, move_right_ega X dw move_up_ega, move_down_ega, set_bit_ega, close_vid_ega X dw uninit_vid_ega X Xvga_adrs dw init_vid_vga, open_vid_vga, move_right_vga X dw move_up_vga, move_down_vga, set_bit_vga, close_vid_vga X dw uninit_vid_vga X X Xinit_vid: X;test for VGA. X mov ax,1a00h X int 10h X cmp al,1ah X mov si,offset vga_adrs X ifndef FORCE_EGA X je have_vga X endif X mov si,offset ega_adrs Xhave_vga: X lodsw ;get the init_vid_* routine. X push ds X pop es X mov di,offset address_list X mov cx,(offset address_end - offset address_list) / 2 X rep movsw X jmp ax ;jump to the proper init_vid routine. X X Xinit_vid_vga: X mov ax,13h ;put the screen into vga mode. X int 10h X X call pal_save ;save the palette X call pal_setgrey ;set to a gray palette. X X ret X Xuninit_vid_vga: X call pal_restore X X mov ax,3h ;put the screen into text mode. X int 10h X X ret X X Xinit_vid_ega: X mov ax,10h ;put the screen into ega mode. X int 10h X X mov ax,1000h ;change the palette entry for 7 X mov bx,77Q*256 + 7 ; to 77 octal. X int 10h X X mov ax,1000h X mov bx,007Q*256 + 08h X int 10h X X mov ax,1000h X mov bx,010Q*256 + 09h X int 10h X X mov ax,1000h X mov bx,020Q*256 + 0ah X int 10h X X mov ax,1000h X mov bx,030Q*256 + 0bh X int 10h X X mov ax,1000h X mov bx,040Q*256 + 0ch X int 10h X X mov ax,1000h X mov bx,050Q*256 + 0dh X int 10h X X mov ax,1000h X mov bx,060Q*256 + 0eh X int 10h X X mov ax,1000h X mov bx,070Q*256 + 0fh X int 10h X X ret X X Xuninit_vid_ega: X mov ax,3h ;put the screen into text mode. X int 10h X X ret X X Xpal_save: X;Save existing palette X mov ax,1017h ;get all palette registers. X mov bx,0 ;first palette register. X mov cx,256 ;read all palette registers. X push ds X pop es X mov dx,offset save_dacs X int 10h X X ret X X Xpal_setgrey: X mov di,offset gray_dacs X mov al,0 Xpal_setgrey_1: X mov cx,3 * 256 / 64 ;3 colors, 256 grays, 64 slots. X rep stosb X X inc al X cmp al,64 X jb pal_setgrey_1 X X mov dx,offset gray_dacs X jmp short pal_set X Xpal_restore: X mov dx,offset save_dacs Xpal_set: X mov ax,1012h ;set all palette registers. X mov bx,0 ;first palette register. X mov cx,256 ;read all palette registers. X push ds X pop es X int 10h X X ret X X Xopen_vid_vga: X;enter with cx,dx = point on screen. X;exit with es:di,ah -> byte/bit on screen. X mov ax,0a000h X mov es,ax X mov ax,320 ;width of screen. X mul dx X add ax,cx ;add the offset in. X mov di,ax ;remember our pointer. X ret X X Xmove_right_vga: X inc di X ret X Xmove_up_vga: X sub di,320 ;width of screen. X ret X Xmove_down_vga: X add di,320 ;width of screen. X ret X Xset_bit_vga: X mov es:[di],al X ret X Xclose_vid_vga: X ret X X Xopen_vid_ega: X;enter with cx,dx = point on screen. X;exit with es:di,ah -> byte/bit on screen. X mov ax,0a000h X mov es,ax X mov ax,640/8*2 ;bytes per scan line * scan lines per pixel X mul dx X mov di,ax X mov ax,cx ;/8*2 X shr ax,1 X shr ax,1 X add di,ax X X mov dx,03ceh ;graphics controller X mov ax,0205h ;write mode 2. X out dx,al X inc dx X mov al,ah X out dx,al X dec dx X mov al,08h ;select bitmap register. X out dx,al X inc dx X X shl cx,1 ;compute the bit. X and cl,7 X mov ah,80h X shr ah,cl X ret X X Xmove_right_ega: X shr ah,1 ;move right by a bit. X ror ah,1 ;move right by another bit, X adc di,0 ; and handle byte increment. X ret X X Xmove_up_ega: X sub di,80*2 ;width of screen. X ret X X Xmove_down_ega: X add di,80*2 ;width of screen. X ret X X Xset_bit_ega: X mov bl,al X xor bh,bh X X mov al,ah X out dx,al X mov al,ulpal[bx] X xchg es:[di],al ;store the palette value. X mov al,llpal[bx] X xchg es:[di+80],al ;store the palette value. X X shr ah,1 ;move right by a bit. X X mov al,ah X out dx,al X mov al,urpal[bx] X xchg es:[di],al ;store the palette value. X mov al,lrpal[bx] X xchg es:[di+80],al ;store the palette value. X X shl ah,1 ;restore the bit. X X ret X X Xclose_vid_ega: X mov al,0ffh ;mask = all ones. X out dx,al X dec dx X mov ax,0005h ;write mode 0 X out dx,al X inc dx X mov al,ah X out dx,al X X ret X Xulpal db 20 dup(00h) X db 20 dup(09h) X db 20 dup(0bh) X db 20 dup(0fh) X db 20 dup(0fh) X db 20 dup(0fh) X db 20 dup(0fh) X db 20 dup(08h) X db 20 dup(08h) X db 20 dup(07h) X db 20 dup(07h) X db 20 dup(07h) X db 20 dup(07h) Xurpal db 20 dup(00h) X db 20 dup(00h) X db 20 dup(0ch) X db 20 dup(0eh) X db 20 dup(0fh) X db 20 dup(08h) X db 20 dup(08h) X db 20 dup(08h) X db 20 dup(08h) X db 20 dup(08h) X db 20 dup(08h) X db 20 dup(08h) X db 20 dup(07h) Xllpal db 20 dup(00h) X db 20 dup(0ch) X db 20 dup(0ch) X db 20 dup(0dh) X db 20 dup(0fh) X db 20 dup(0fh) X db 20 dup(08h) X db 20 dup(08h) X db 20 dup(08h) X db 20 dup(08h) X db 20 dup(08h) X db 20 dup(07h) X db 20 dup(07h) Xlrpal db 20 dup(00h) X db 20 dup(0ah) X db 20 dup(0bh) X db 20 dup(0bh) X db 20 dup(0fh) X db 20 dup(0fh) X db 20 dup(0fh) X db 20 dup(0fh) X db 20 dup(08h) X db 20 dup(08h) X db 20 dup(07h) X db 20 dup(07h) X db 20 dup(07h) X Xsave_dacs db 256 * 3 dup(?) Xgray_dacs db 256 * 3 dup(?) X X SHAR_EOF chmod 0644 pixel.asm || echo "restore of pixel.asm fails" echo "x - extracting showface.asm (Text)" sed 's/^X//' << 'SHAR_EOF' > showface.asm && X;History:277,1 X XMAJVER EQU 1 ;1.0 XVERSION EQU 1 X X; Russell Nelson, Clarkson University. December 24, 1989 X; Copyright, 1989, Russell Nelson X X; This program is free software; you can redistribute it and/or modify X; it under the terms of the GNU General Public License as published by X; the Free Software Foundation, version 1. X; X; This program is distributed in the hope that it will be useful, X; but WITHOUT ANY WARRANTY; without even the implied warranty of X; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the X; GNU General Public License for more details. X; X; You should have received a copy of the GNU General Public License X; along with this program; if not, write to the Free Software X; Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. X Xcode segment byte public X assume cs:code, ds:code X XHT equ 09h XCR equ 0dh XLF equ 0ah X Xfont_struc struc Xascent dw ? ;number of pixels above base line Xdescent dw ? ;number of pixels below base line XwidMax dw ? ;number of pixels wide Xleading dw ? ;number of pixels below descent and above ascent Xfont_struc ends X Xsegmoffs struc ; defines offs as 0, segm as 2 Xoffs dw ? Xsegm dw ? Xsegmoffs ends X X org 80h Xphd_dioa label byte X X org 100h Xstart: X jmp start_1 X Xno_ega_msg db "showface: You must have an EGA or VGA display.",CR,LF,'$' Xcopyleft_msg label byte X db "Face viewer version ",'0'+majver,".",'0'+version," Copyright 1990, Russell Nelson.",CR,LF X db "This program is free software; see the file COPYING for details.",CR,LF X db "NO WARRANTY; see the file COPYING for details.",CR,LF Xcrlf_msg db CR,LF,'$' X Xprompt_msg db "Filename: ",'$' X Xfile_not_found db "File not found",'$' Xread_trouble db "Trouble reading the file",'$' Xread_too_much db "The file is too large",'$' Xno_picdata db "This file doesn't have a PicData header, which means it probably isn't a face.",CR,LF,'$' Xbad_picdata db "This file has a PicData with x = 0 or x >320, or y = 0 or y >200, or z != 8",CR,LF,'$' X Xfirstn db "FirstName",0 Xlastn db "LastName",0 Xpicdata db "PicData",0 Xfacedat db 0 Xxsize dw ?,? Xysize dw ?,? Xdepth dw ?,? X Xffblk label byte Xff_reserved db 21 dup(?) Xff_attrib db ? Xff_ftime dw ? Xff_fdate dw ? Xff_fsize dd ? Xff_name db 13 dup(?) X Xour_fn db 64 dup(?) X X include pixel.asm X Xerror: X mov ah,9 X int 21h X mov ax,4c0ah ; give errorlevel 10 X int 21h X Xstart_1: X mov dx,offset copyleft_msg X mov ah,9 X int 21h X X mov ax,1200h ;test for an EGA X mov bx,10h X mov cx,-1 X int 10h X cmp cx,-1 X jne start_4 ;go if we've got an EGA (or VGA). X mov dx,offset no_ega_msg X jmp error Xstart_4: X X mov dx,offset ffblk ;set up for wildcards. X mov ah,1ah X int 21h X X cld X mov si,offset phd_dioa+1 X call skip_blanks ;end of line? X cmp al,CR X je start_2 X X call find_files ;find all the files that match this spec. X jc error X X jmp short start_3 ;all done. X Xstart_2: X mov phd_dioa[0],128 ;get set for a line input dos call. X mov phd_dioa[1],0 X mov phd_dioa[2],CR X X mov dx,offset prompt_msg ;prompt them for a filename. X mov ah,9 X int 21h X X mov dx,offset phd_dioa ;read the line. X mov ah,0ah X int 21h X X mov al,LF ;obligingly line feed for them. X call chrout X X mov si,offset phd_dioa+2 X call skip_blanks ;end of line? X cmp al,CR ;if so, we're done. X je start_3 X X call find_files ;find all the files that match. X jnc start_5 X mov ah,9 ;print the error message. X int 21h Xstart_5: X jmp start_2 X Xstart_3: X mov ax,4c00h ;terminate. X int 21h X X Xfind_files: X;enter with si -> list of filenames (possibly w/ wildcards) to show. X;exit with cy, dx -> error message if we couldn't find one of the files. Xfind_name_end: X push ds X pop es X mov di,offset our_fn X mov dx,di Xfind_name_end_1: X lodsb ;find the end of the filename. X stosb X cmp al,'/' ;whenever we encounter a pathname char, X je find_name_end_4 ; remember it. X cmp al,'\' X jne find_name_end_3 Xfind_name_end_4: X mov dx,di ;found a path char, remember it. Xfind_name_end_3: X cmp al,' ' X je find_name_end_2 X cmp al,HT X je find_name_end_2 X cmp al,CR X jne find_name_end_1 Xfind_name_end_2: X dec si ;point si to terminator. X push si ;->end of filename in input. X mov byte ptr [di-1],0 ;terminate pathname in our_fn. X mov di,dx ;->end of pathname in our_fn. X call skip_blanks X X mov dx,offset our_fn X mov ah,4eh ;find the first file. X mov cx,0 ;no special files Xfind_one_file: X int 21h ;find a file. X jc find_files_done X X push di X mov si,offset ff_name ;append the found name to the pathname. Xfind_one_file_1: X lodsb X stosb X or al,al X jne find_one_file_1 X X mov dx,offset our_fn ;show a single file. X call show_face X X pop di X jc find_files_error X X mov ah,4fh ;find next file. X jmp find_one_file X Xfind_files_done: X pop si ;restore the terminator. X call skip_blanks ;end of line? X cmp al,CR X jne find_name_end ;no, more files to do. X X clc X ret Xfind_files_error: X pop si ;give up now if we can't find it. X ret X X Xshow_face: X;read the face info. from the file named in [dx]. X;return cy, dx -> error message if something went wrong. X X call read_file X jnc show_face_1 X ret Xshow_face_3: X mov dx,offset no_picdata X stc X ret Xshow_face_2: X mov dx,offset bad_picdata X stc X ret Xshow_face_1: X X mov di,offset picdata ;get the size of the image. X call find_header X jc show_face_3 X X mov di,offset xsize ;get their image size. X call get_number X X mov di,offset ysize X call get_number X X mov di,offset depth X call get_number X X cmp xsize,0 ;incredibly small? X je show_face_2 X cmp xsize,320 ;too wide? X ja show_face_2 X X cmp ysize,0 ;incredibly small? X je show_face_2 X cmp ysize,200 ;too high? X ja show_face_2 X X cmp depth,8 ;we can only handle 8 bits per pixel. X jne show_face_2 X X call init_vid X X mov di,offset firstn ;get their first name. X call find_header X jc show_face_4 X X mov cx,xsize ;put it to the screen. X add cx,30 X mov dx,10 X call show_line X Xshow_face_4: X X mov al,' ' ;put a space between first and last names. X call show_char X X push cx ;now find the last name (but remember X push dx ; the xy position this time. X mov di,offset lastn X call find_header X pop dx X pop cx X jc show_face_5 X X call show_line ;put the last name to the screen. X Xshow_face_5: X X mov di,offset facedat ;now put the face up. X call find_header X X mov dx,ysize X mov cx,0 X call open_vid X X mov cx,ysize Xvga_line: X push cx X push ax X push di X mov cx,xsize Xvga_pel: X mov bh,ah ;preserve ah. X call get_byte X mov ah,bh X call set_bit X call move_right X loop vga_pel X pop di X pop ax X call move_up X pop cx X loop vga_line X X mov ah,7 ;wait for a key. X int 21h X X call close_vid X X call uninit_vid X X clc X ret X X Xshow_line: X;enter with si -> CR or LF terminated string to be printed, CX = x, DX = y. Xshow_line_0: X lodsb X cmp al,CR X je show_line_1 X cmp al,LF X je show_line_1 X push si X call show_char X pop si X jmp show_line_0 Xshow_line_1: X ret X X Xchar_number db ? ;ASCII value of this character. Xchar_height dw ? ;height of this character Xchar_width db ? ;width of this character in pixels. Xchar_color db 0ffh ;color to paint this character. X Xshow_char: X;enter with cx,dx=position, al = character. X push cx X push dx X push es X mov char_number,al X X mov ax,system_font.ascent ;compute height of character. X add ax,system_font.descent X mov char_height,ax ;save it. X X mov si,offset system_font + (size font_struc) Xuse_font_1: X lodsw X xchg ah,al ;get the number (AH) and width (AL). X X or al,al ;zero width? X je use_font_3 ;yes, end of the font. X cmp ah,char_number ;is this the character? X je use_font_2 ;Yes, use it. X mov ah,0 X add ax,7 ;round up to next nearest byte. X shr ax,1 ;and convert pixels X shr ax,1 ; to X shr ax,1 ; bytes. X push dx X mul char_height ;find the size. X pop dx X add si,ax ;move ahead by this size. X jmp use_font_1 Xuse_font_3: X pop es X pop dx X pop cx X stc X ret Xuse_font_2: X mov char_width,al ;remember the width of the font. X X call open_vid X X mov cx,char_height Xshow_char_4: X push cx X push ax X push di X mov cl,char_width X xor ch,ch X mov al,80h X jmp short show_char_6 Xshow_char_5: X ror al,1 ;move right in the source. X adc si,0 X call move_right ;move right in the destination. Xshow_char_6: X test [si],al ;is this bit set? X je show_char_7 X push ax X mov al,0ffh X call set_bit ;yes, set it. X pop ax Xshow_char_7: X loop show_char_5 X inc si ;flush the rest of the bits in source. X pop di X pop ax X call move_down X pop cx X loop show_char_4 ;go do another line. X pop es X pop dx X pop cx X inc char_width X add cl,char_width ;move over. X adc ch,0 X clc X ret X X Xhandle dw ? X Xread_file: X;enter with dx -> filename. X;return nc if all okay, or cy, dx -> error if any problems. X mov ax,3d00h ;open for reading. X int 21h X jnc read_file_found X mov dx,offset file_not_found X stc X ret X Xread_file_found: X mov handle,ax X X mov ah,3fh ;read the whole thing in. X mov bx,handle X mov cx,65535 - 200 X sub cx,offset face_buffer X mov dx,offset face_buffer X int 21h X jnc read_okay X mov dx,offset read_trouble X stc X ret Xread_okay: X cmp ax,cx ;did we read all we asked for? X jne read_enough X mov dx,offset read_too_much X stc X ret Xread_enough: X mov ah,3eh ;close the file. X mov bx,handle X int 21h X X clc X ret X X Xget_byte: X;enter with si -> two hex digits (maybe some CR/LFs first...) X;exit with al = the byte. X lodsb ;get a character. X cmp al,CR ;ignore CR and LF. X je get_byte X cmp al,LF X je get_byte X call get_digit ;hex digits come in pairs. X shl al,1 X shl al,1 X shl al,1 X shl al,1 X mov ah,al ;shift the first nibble over. X lodsb ;get the second nibble X call get_digit X or al,ah ;combine and store. X ret X Xfind_header_ptr dw ? X Xfind_header: X;enter with di -> header name X;exit with nc,si -> header contents, or cy if not found. X mov find_header_ptr,di ;remember the pointer to their header. X push ds X pop es X mov si,offset face_buffer Xfind_header_0: X mov di,find_header_ptr X mov cx,30 ;no header name is >30 chars. X repe cmpsb ;compare the header chars. X cmp [si-1],byte ptr ':' ;if we didn't get as far as the colon, X jne find_header_1 ; they didn't match. X cmp [di-1],byte ptr 0 ;if we didn't get as far as the null, X jne find_header_1 ; they didn't match. X call skip_blanks X ret Xfind_header_1: X;scan to the next LF. X lodsb X cmp al,LF X jne find_header_1 X cmp byte ptr [si],CR ;two crlf's in a row? X je find_header_2 ;yes, no more headers. X cmp byte ptr [si],LF ;two lf's in a row? X jne find_header_0 ;yes, no more headers. Xfind_header_2: X stc X ret X X include skipblk.asm X include getdig.asm X include getnum.asm X include chrout.asm X include decout.asm X include digout.asm X Xsystem_font label byte X font_struc <9, 3, 10, 1> X X db 20h,6 X db 00000000b X db 00000000b X db 00000000b X db 00000000b X db 00000000b X db 00000000b X db 00000000b X db 00000000b X db 00000000b X db 00000000b X db 00000000b X db 00000000b X X db 21h,4 X db 01100000b X db 11110000b X db 11110000b X db 11110000b X db 11110000b X db 11110000b X db 01100000b X db 00000000b X db 01100000b X db 01100000b X db 00000000b X db 00000000b X X db 22h,7 X db 00000000b X db 00000000b X db 11101110b X db 01100110b X db 11001100b X db 00000000b X db 00000000b X db 00000000b X db 00000000b X db 00000000b X db 00000000b X db 00000000b X X db 23h,6 X db 00000000b X db 00000000b X db 01001000b X db 01001000b X db 11111100b X db 01001000b X db 11111100b X db 01001000b X db 01001000b X db 00000000b X db 00000000b X db 00000000b X X db 24h,6 X db 00000000b X db 00000000b X db 00010000b X db 01111100b X db 11010000b X db 01111100b X db 00010110b X db 01111100b X db 00010000b X db 00000000b X db 00000000b X db 00000000b X X db 25h,6 X db 00000000b X db 00000000b X db 11000000b X db 11001100b X db 00011000b X db 00110000b X db 01100000b X db 11001100b X db 00001100b X db 00000000b X db 00000000b X db 00000000b X X db 26h,6 X db 00000000b X db 00000000b X db 01110000b X db 11011000b X db 11011000b X db 01110000b X db 11011100b X db 11011000b X db 01101100b X db 00000000b X db 00000000b X db 00000000b X X db 27h,4 X db 00000000b X db 00000000b X db 00110000b X db 01100000b X db 11000000b X db 00000000b X db 00000000b X db 00000000b X db 00000000b X db 00000000b X db 00000000b X db 00000000b X X db 28h,4 X db 00000000b X db 00000000b X db 00110000b X db 01100000b X db 11000000b X db 11000000b X db 11000000b X db 01100000b X db 00110000b X db 00000000b X db 00000000b X db 00000000b X X db 29h,4 X db 00000000b X db 00000000b X db 11000000b X db 01100000b X db 00110000b X db 00110000b X db 00110000b X db 01100000b X db 11000000b X db 00000000b X db 00000000b X db 00000000b X X db 2Ah,6 X db 00000000b X db 00000000b X db 00000000b X db 00110000b X db 10110100b X db 01111000b X db 10110100b X db 00110000b X db 00000000b X db 00000000b X db 00000000b X db 00000000b X X db 2Bh,6 X db 00000000b X db 00000000b X db 00000000b X db 00110000b X db 00110000b X db 11111100b X db 00110000b X db 00110000b X db 00000000b X db 00000000b X db 00000000b X db 00000000b X X db 2Ch,3 X db 00000000b X db 00000000b X db 00000000b X db 00000000b X db 00000000b X db 00000000b X db 11100000b X db 11100000b X db 01100000b X db 11000000b X db 00000000b X db 00000000b X X db 2Dh,6 X db 00000000b X db 00000000b X db 00000000b X db 00000000b X db 00000000b X db 11111100b X db 00000000b X db 00000000b X db 00000000b X db 00000000b X db 00000000b X db 00000000b X X db 2Eh,3 X db 00000000b X db 00000000b X db 00000000b X db 00000000b X db 00000000b X db 00000000b X db 00000000b X db 11100000b X db 11100000b X db 00000000b X db 00000000b X db 00000000b X X db 2Fh,7 X db 00000000b X db 00000000b X db 00000110b X db 00001100b X db 00011000b X db 00110000b X db 01100000b X db 11000000b X db 00000000b X db 00000000b X db 00000000b X db 00000000b X X db 30h,7 X db 01111100b X db 11001110b X db 11001110b X db 11010110b X db 11010110b X db 11010110b X db 11100110b X db 11100110b X db 01111100b X db 00000000b X db 00000000b X db 00000000b X X db 31h,7 X db 01100000b X db 11100000b X db 01100000b X db 01100000b X db 01100000b X db 01100000b X db 01100000b X db 01100000b X db 11110000b X db 00000000b X db 00000000b X db 00000000b X X db 32h,7 X db 01111100b X db 10000110b X db 00000110b X db 00000110b X db 00001100b X db 00011000b X db 00110000b X db 01100000b X db 11111110b X db 00000000b X db 00000000b X db 00000000b X X db 33h,7 X db 11111100b X db 00001100b X db 00011000b X db 00110000b X db 00001100b X db 00000110b X db 00000110b X db 11000110b X db 01111100b X db 00000000b X db 00000000b X db 00000000b X X db 34h,7 X db 00011100b X db 00111100b X db 01101100b X db 11001100b X db 11001100b X db 11001100b X db 11111110b X db 00001100b X db 00001100b X db 00000000b X db 00000000b X db 00000000b X X db 35h,7 X db 11111110b X db 11000000b X db 11000000b X db 11000000b X db 11111100b X db 00000110b X db 00000110b X db 11000110b X db 01111100b X db 00000000b X db 00000000b X db 00000000b X X db 36h,7 X db 01111100b X db 11000110b X db 11000000b X db 11000000b X db 11111100b X db 11000110b X db 11000110b X db 11000110b X db 01111100b X db 00000000b X db 00000000b X db 00000000b X X db 37h,7 X db 11111110b X db 00000110b X db 00000110b X db 00001100b X db 00011000b X db 00110000b X db 00110000b X db 00110000b X db 00110000b X db 00000000b X db 00000000b X db 00000000b X X db 38h,7 X db 01111100b X db 11000110b X db 11000110b X db 11000110b X db 01111100b X db 11000110b X db 11000110b X db 11000110b X db 01111100b X db 00000000b X db 00000000b X db 00000000b X X db 39h,7 X db 01111100b X db 11000110b X db 11000110b X db 11000110b X db 01111110b X db 00000110b X db 00000110b X db 11000110b X db 01111100b X db 00000000b X db 00000000b X db 00000000b X X db 3Ah,3 X db 00000000b X db 00000000b X db 11100000b X db 11100000b X db 00000000b X db 00000000b X db 11100000b X db 11100000b X db 00000000b X db 00000000b X db 00000000b X db 00000000b X X db 3Bh,3 X db 00000000b X db 00000000b X db 11100000b X db 11100000b X db 00000000b X db 00000000b X db 11100000b X db 11100000b X db 01100000b X db 11000000b X db 00000000b X db 00000000b X X db 3Ch,7 X db 00000000b X db 00000000b X db 00000110b X db 00011100b X db 01110000b X db 11000000b X db 01110000b X db 00011100b X db 00000110b X db 00000000b X db 00000000b X db 00000000b X X db 3Dh,6 X db 00000000b X db 00000000b X db 00000000b X db 11111110b X db 00000000b X db 00000000b X db 11111110b X db 00000000b X db 00000000b X db 00000000b X db 00000000b X db 00000000b X X db 3Eh,7 X db 00000000b X db 00000000b X db 11000000b X db 01110000b X db 00011100b X db 00000110b X db 00011100b X db 01110000b X db 11000000b X db 00000000b X db 00000000b X db 00000000b X X db 3Fh,6 X db 01111100b X db 11000110b X db 00000110b X db 00001100b X db 00011000b X db 00110000b X db 00110000b X db 00000000b X db 00110000b X db 00000000b X db 00000000b X db 00000000b X X db 40h,6 X db 00000000b X db 00000000b X db 00111000b X db 01101100b X db 11011100b X db 11010100b X db 11011100b X db 11000000b X db 01111100b X db 00000000b X db 00000000b X db 00000000b X X db 41h,7 X db 01111100b X db 11000110b X db 11000110b X db 11000110b X db 11111110b X db 11000110b X db 11000110b X db 11000110b X db 11000110b X db 00000000b X db 00000000b X db 00000000b X X db 42h,7 X db 11111100b X db 11000110b X db 11000110b X db 11000110b X db 11111110b X db 11000110b X db 11000110b X db 11000110b X db 11111100b X db 00000000b X db 00000000b X db 00000000b X X db 43h,7 X db 01111100b X db 11000010b X db 11000000b X db 11000000b X db 11000000b X db 11000000b X db 11000000b X db 11000010b X db 01111100b X db 00000000b X db 00000000b X db 00000000b X X db 44h,7 X db 11111100b X db 11000110b X db 11000110b X db 11000110b X db 11000110b X db 11000110b X db 11000110b X db 11000110b X db 11111100b X db 00000000b X db 00000000b X db 00000000b X X db 45h,6 X db 11111100b X db 11000000b X db 11000000b X db 11000000b X db 11111000b X db 11000000b X db 11000000b X db 11000000b X db 11111100b X db 00000000b X db 00000000b X db 00000000b X X db 46h,6 X db 11111100b X db 11000000b X db 11000000b X db 11000000b X db 11111000b X db 11000000b X db 11000000b X db 11000000b X db 11000000b X db 00000000b X db 00000000b X db 00000000b X X db 47h,7 X db 01111100b X db 11000100b X db 11000000b X db 11000000b X db 11001110b X db 11000110b X db 11000110b X db 11000110b X db 01111100b X db 00000000b X db 00000000b X db 00000000b X X db 48h,7 X db 11000110b X db 11000110b X db 11000110b X db 11000110b X db 11111110b X db 11000110b X db 11000110b X db 11000110b X db 11000110b X db 00000000b X db 00000000b X db 00000000b X X db 49h,2 X db 11000000b X db 11000000b X db 11000000b X db 11000000b X db 11000000b X db 11000000b X db 11000000b X db 11000000b X db 11000000b X db 00000000b X db 00000000b X db 00000000b X X db 4Ah,6 X db 00001100b X db 00001100b X db 00001100b X db 00001100b X db 00001100b X db 00001100b X db 11001100b X db 11001100b X db 01111000b X db 00000000b X db 00000000b X db 00000000b X X db 4Bh,8 X db 11000011b X db 11000110b X db 11001100b X db 11011000b X db 11110000b X db 11110000b X db 11011000b X db 11001100b X db 11000110b X db 00000000b X db 00000000b X db 00000000b X X db 4Ch,6 X db 11000000b X db 11000000b X db 11000000b X db 11000000b X db 11000000b X db 11000000b X db 11000000b X db 11000000b X db 11111100b X db 00000000b X db 00000000b X db 00000000b X X db 4Dh,9 X db 11000000b,10000000b X db 11100001b,10000000b X db 11110011b,10000000b X db 11011101b,10000000b X db 11001001b,10000000b X db 11000001b,10000000b X db 11000001b,10000000b X db 11000001b,10000000b X db 11000001b,10000000b X db 00000000b,00000000b X db 00000000b,00000000b X db 00000000b,00000000b X X db 4Eh,8 X db 10000001b X db 11000001b X db 11100001b X db 10110001b X db 10011001b X db 10001101b X db 10000111b X db 10000011b X db 10000001b X db 00000000b X db 00000000b X db 00000000b X X db 4Fh,7 X db 01111100b X db 11000110b X db 11000110b X db 11000110b X db 11000110b X db 11000110b X db 11000110b X db 11000110b X db 01111100b X db 00000000b X db 00000000b X db 00000000b X X db 50h,7 X db 11111100b X db 11000110b X db 11000110b X db 11000110b X db 11111100b X db 11000000b X db 11000000b X db 11000000b X db 11000000b X db 00000000b X db 00000000b X db 00000000b X X db 51h,7 X db 01111100b X db 11000110b X db 11000110b X db 11000110b X db 11000110b X db 11000110b X db 11000110b X db 11000110b X db 01111100b X db 00000110b X db 00000000b X db 00000000b X X db 52h,7 X db 11111100b X db 11000110b X db 11000110b X db 11000110b X db 11111100b X db 11000110b X db 11000110b X db 11000110b X db 11000110b X db 00000000b X db 00000000b X db 00000000b X X db 53h,7 X db 01111100b X db 11000010b X db 11100000b X db 01110000b X db 00111000b X db 00011100b X db 00001110b X db 10000110b X db 01111100b X db 00000000b X db 00000000b X db 00000000b X X db 54h,6 X db 11111100b X db 00110000b X db 00110000b X db 00110000b X db 00110000b X db 00110000b X db 00110000b X db 00110000b X db 00110000b X db 00000000b X db 00000000b X db 00000000b X X db 55h,7 X db 11000110b X db 11000110b X db 11000110b X db 11000110b X db 11000110b X db 11000110b X db 11000110b X db 11000110b X db 01111100b X db 00000000b X db 00000000b X db 00000000b X X db 56h,7 X db 11000110b X db 11000110b X db 11000110b X db 11000110b X db 11000110b X db 11000110b X db 11000110b X db 11000100b X db 11111000b X db 00000000b X db 00000000b X db 00000000b X X db 57h,10 X db 11001100b,11000000b X db 11001100b,11000000b X db 11001100b,11000000b X db 11001100b,11000000b X db 11001100b,11000000b X db 11001100b,11000000b X db 11001100b,11000000b X db 11001100b,10000000b X db 11111111b,00000000b X db 00000000b,00000000b X db 00000000b,00000000b X db 00000000b,00000000b X X db 58h,7 X db 11000110b X db 11000110b X db 11000110b X db 11000110b X db 01111100b X db 11000110b X db 11000110b X db 11000110b X db 11000110b X db 00000000b X db 00000000b X db 00000000b X X db 59h,6 X db 11001100b X db 11001100b X db 11001100b X db 11001100b X db 01111000b X db 00110000b X db 00110000b X db 00110000b X db 00110000b X db 00000000b X db 00000000b X db 00000000b X X db 5Ah,8 X db 11111111b X db 00000011b X db 00000110b X db 00001100b X db 00011000b X db 00110000b X db 01100000b X db 11000000b X db 11111111b X db 00000000b X db 00000000b X db 00000000b X X db 5Bh,4 X db 11110000b X db 11000000b X db 11000000b X db 11000000b X db 11000000b X db 11000000b X db 11000000b X db 11000000b X db 11110000b X db 00000000b X db 00000000b X db 00000000b X X db 5Ch,5 X db 10000000b X db 10000000b X db 01000000b X db 01000000b X db 00100000b X db 00100000b X db 00010000b X db 00010000b X db 00001000b X db 00000000b X db 00000000b X db 00000000b X X db 5Dh,4 X db 11110000b X db 00110000b X db 00110000b X db 00110000b X db 00110000b X db 00110000b X db 00110000b X db 00110000b X db 11110000b X db 00000000b X db 00000000b X db 00000000b X X db 5Eh,8 X db 00000000b X db 00000000b X db 00010000b X db 00111000b X db 01101100b X db 11000110b X db 00000000b X db 00000000b X db 00000000b X db 00000000b X db 00000000b X db 00000000b X X db 5Fh,8 X db 00000000b X db 00000000b X db 00000000b X db 00000000b X db 00000000b X db 00000000b X db 00000000b X db 00000000b X db 00000000b X db 11111111b X db 00000000b X db 00000000b X X db 60h,6 X db 00000000b X db 00000000b X db 11000000b X db 01100000b X db 00110000b X db 00000000b X db 00000000b X db 00000000b X db 00000000b X db 00000000b X db 00000000b X db 00000000b X X db 61h,7 X db 00000000b X db 00000000b X db 01111100b X db 10000110b X db 01111110b X db 11000110b X db 11000110b X db 11000110b X db 01111110b X db 00000000b X db 00000000b X db 00000000b X X db 62h,7 X db 11000000b X db 11000000b X db 11111100b X db 11000110b X db 11000110b X db 11000110b X db 11000110b X db 11000110b X db 11111100b X db 00000000b X db 00000000b X db 00000000b X X db 63h,6 X db 00000000b X db 00000000b X db 01111000b X db 11000100b X db 11000000b X db 11000000b X db 11000000b X db 11000100b X db 01111000b X db 00000000b X db 00000000b X db 00000000b X X db 64h,7 X db 00000110b X db 00000110b X db 01111110b X db 11000110b X db 11000110b X db 11000110b X db 11000110b X db 11000110b X db 01111110b X db 00000000b X db 00000000b X db 00000000b X X db 65h,7 X db 00000000b X db 00000000b X db 01111100b X db 11000110b X db 11000110b X db 11111110b X db 11000000b X db 11000110b X db 01111100b X db 00000000b X db 00000000b X db 00000000b X X db 66h,6 X db 00111100b X db 01100000b X db 11110000b X db 01100000b X db 01100000b X db 01100000b X db 01100000b X db 01100000b X db 01100000b X db 00000000b X db 00000000b X db 00000000b X X db 67h,7 X db 00000000b X db 00000000b X db 01111110b X db 11000110b X db 11000110b X db 11000110b X db 11000110b X db 11000110b X db 01111110b X db 00000110b X db 10000110b X db 01111100b X X db 68h,7 X db 11000000b X db 11000000b X db 11111100b X db 11000110b X db 11000110b X db 11000110b X db 11000110b X db 11000110b X db 11000110b X db 00000000b X db 00000000b X db 00000000b X X db 69h,2 X db 11000000b X db 00000000b X db 11000000b X db 11000000b X db 11000000b X db 11000000b X db 11000000b X db 11000000b X db 11000000b X db 00000000b X db 00000000b X db 00000000b X X db 6Ah,5 X db 00000000b X db 00000000b X db 00011000b X db 00000000b X db 00011000b X db 00011000b X db 00011000b X db 00011000b X db 00011000b X db 00011000b X db 10011000b X db 01110000b X X db 6Bh,6 X db 11000000b X db 11000000b X db 11000000b X db 11001100b X db 11011000b X db 11110000b X db 11110000b X db 11011000b X db 11001100b X db 00000000b X db 00000000b X db 00000000b X X db 6Ch,2 X db 11000000b X db 11000000b X db 11000000b X db 11000000b X db 11000000b X db 11000000b X db 11000000b X db 11000000b X db 11000000b X db 00000000b X db 00000000b X db 00000000b X X db 6Dh,10 X db 00000000b,00000000b X db 00000000b,00000000b X db 11111111b,00000000b X db 11001100b,10000000b X db 11001100b,11000000b X db 11001100b,11000000b X db 11001100b,11000000b X db 11001100b,11000000b X db 11001100b,11000000b X db 00000000b,00000000b X db 00000000b,00000000b X db 00000000b,00000000b X X db 6Eh,7 X db 00000000b X db 00000000b X db 11111100b X db 11000110b X db 11000110b X db 11000110b X db 11000110b X db 11000110b X db 11000110b X db 00000000b X db 00000000b X db 00000000b X X db 6Fh,7 X db 00000000b X db 00000000b X db 01111100b X db 11000110b X db 11000110b X db 11000110b X db 11000110b X db 11000110b X db 01111100b X db 00000000b X db 00000000b X db 00000000b X X db 70h,7 X db 00000000b X db 00000000b X db 11111100b X db 11000110b X db 11000110b X db 11000110b X db 11000110b X db 11000110b X db 11111100b X db 11000000b X db 11000000b X db 00000000b X X db 71h,7 X db 00000000b X db 00000000b X db 01111110b X db 11000110b X db 11000110b X db 11000110b X db 11000110b X db 11000110b X db 01111110b X db 00000110b X db 00000110b X db 00000000b X X db 72h,6 X db 00000000b X db 00000000b X db 11011100b X db 11100000b X db 11000000b X db 11000000b X db 11000000b X db 11000000b X db 11000000b X db 00000000b X db 00000000b X db 00000000b X X db 73h,6 X db 00000000b X db 00000000b X db 01111000b X db 11000100b X db 11100000b X db 01111000b X db 00011100b X db 10001100b X db 01111000b X db 00000000b X db 00000000b X db 00000000b X X db 74h,4 X db 01100000b X db 01100000b X db 11110000b X db 01100000b X db 01100000b X db 01100000b X db 01100000b X db 01100000b X db 00110000b X db 00000000b X db 00000000b X db 00000000b X X db 75h,7 X db 00000000b X db 00000000b X db 11000110b X db 11000110b X db 11000110b X db 11000110b X db 11000110b X db 11000110b X db 01111100b X db 00000000b X db 00000000b X db 00000000b X X db 76h,7 X db 00000000b X db 00000000b X db 11000110b X db 11000110b X db 11000110b X db 11000110b X db 11000110b X db 11000100b X db 11111000b X db 00000000b X db 00000000b X db 00000000b X X db 77h,10 X db 00000000b,00000000b X db 00000000b,00000000b X db 11001100b,11000000b X db 11001100b,11000000b X db 11001100b,11000000b X db 11001100b,11000000b X db 11001100b,11000000b X db 11001100b,10000000b X db 11111111b,00000000b X db 00000000b,00000000b X db 00000000b,00000000b X db 00000000b,00000000b X X db 78h,7 X db 00000000b X db 00000000b X db 11000110b X db 11000110b X db 11000110b X db 01111100b X db 11000110b X db 11000110b X db 11000110b X db 00000000b X db 00000000b X db 00000000b X X db 79h,7 X db 00000000b X db 00000000b X db 11000110b X db 11000110b X db 11000110b X db 11000110b X db 11000110b X db 11000110b X db 01111110b X db 00000110b X db 10000110b X db 01111100b X X db 7Ah,6 X db 00000000b X db 00000000b X db 11111100b X db 00001100b X db 00011000b X db 00110000b X db 01100000b X db 11000000b X db 11111100b X db 00000000b X db 00000000b X db 00000000b X X db 7Bh,8 X db 00000000b X db 00000000b X db 00111000b X db 01100000b X db 01100000b X db 11000000b X db 01100000b X db 01100000b X db 00111000b X db 00000000b X db 00000000b X db 00000000b X X db 7Ch,2 X db 11000000b X db 11000000b X db 11000000b X db 11000000b X db 11000000b X db 11000000b X db 11000000b X db 11000000b X db 11000000b X db 11000000b X db 11000000b X db 00000000b X X db 7Dh,8 X db 00000000b X db 00000000b X db 11100000b X db 00110000b X db 00110000b X db 00011000b X db 00110000b X db 00110000b X db 11100000b X db 00000000b X db 00000000b X db 00000000b X X db 7Eh,8 X db 00000000b X db 00000000b X db 00000000b X db 01100000b X db 10010010b X db 00001100b X db 00000000b X db 00000000b X db 00000000b X db 00000000b X db 00000000b X db 00000000b X X db 80h,0 ;end of the font. X Xface_buffer label byte X Xcode ends X X end start SHAR_EOF chmod 0644 showface.asm || echo "restore of showface.asm fails" echo "x - extracting showface.com (Binary)" sed 's/^X//' << 'SHAR_EOF' > s2_temp_.tmp && Xbegin 600 showface.com XMZ?<-<VAO=V9A8V4Z(%EO=2!M=7-T(&AA=F4@86X@14=!(&]R(%9'02!D:7-P XM;&%Y+@T*)$9A8V4@=FEE=V5R('9E<G-I;VX@,2XQ($-O<'ER:6=H="`Q.3DP XM+"!2=7-S96QL($YE;'-O;BX-"E1H:7,@<')O9W)A;2!I<R!F<F5E('-O9G1W XM87)E.R!S964@=&AE(&9I;&4@0T]064E.1R!F;W(@9&5T86EL<RX-"DY/(%=! XM4E)!3E19.R!S964@=&AE(&9I;&4@0T]064E.1R!F;W(@9&5T86EL<RX-"@T* XM)$9I;&5N86UE.B`D1FEL92!N;W0@9F]U;F0D5')O=6)L92!R96%D:6YG('1H XM92!F:6QE)%1H92!F:6QE(&ES('1O;R!L87)G9214:&ES(&9I;&4@9&]E<VXG XM="!H879E(&$@4&EC1&%T82!H96%D97(L('=H:6-H(&UE86YS(&ET('!R;V)A XM8FQY(&ES;B=T(&$@9F%C92X-"B14:&ES(&9I;&4@:&%S(&$@4&EC1&%T82!W XM:71H('@@/2`P(&]R('@@/C,R,"P@;W(@>2`](#`@;W(@>2`^,C`P+"!O<B!Z XM("$](#@-"B1&:7)S=$YA;64`3&%S=$YA;64`4&EC1&%T80`````````````` XM```````````````````````````````````````````````````````````` XM```````````````````````````````````````````````````````````` XM`````````````````````````````````````````````+P#9P25!)T$H@2G XM!-0$"@2G`T<$5@18!%T$8@1F!+,#N``:S1`\&KY[`W0#OFL#K1X'OUT#N0<` XM\Z7_X+@3`,T0Z&$`Z&\`P^B``+@#`,T0P[@0`,T0N``0NP<_S1"X`!"["`?- XM$+@`$+L)",T0N``0NPH0S1"X`!"["QC-$+@`$+L,(,T0N``0NPTHS1"X`!"[ XM#C#-$+@`$+L/.,T0P[@#`,T0P[@7$+L``+D``1X'NO$(S1##O_$+L`"Y#`#S XMJO[`/$!R];KQ"^L#NO$(N!(0NP``N0`!'@?-$,.X`*".P+A``??B`\&+^,-' XMPX'O0`'#@<=``<,FB`7#P[@`H([`N*``]^*+^(O!T>C1Z`/XNLX#N`4"[D** XMQ.Y*L`CN0M'A@.$'M(#2[,/0[-#,@]<`PX'OH`##@<>@`,.*V#+_BL3NBH?A XM!":&!8J'Z08FAD50T.R*Q.Z*A^4%)H8%BH?M!R:&15#0Y,.P_^Y*N`4`[D** XMQ.[#```````````````````````````)"0D)"0D)"0D)"0D)"0D)"0D)"0L+ XM"PL+"PL+"PL+"PL+"PL+"PL+#P\/#P\/#P\/#P\/#P\/#P\/#P\/#P\/#P\/ XM#P\/#P\/#P\/#P\/#P\/#P\/#P\/#P\/#P\/#P\/#P\/#P\/#P\/#P\/#P\/ XM#P\/#P\/#P\("`@("`@("`@("`@("`@("`@("`@("`@("`@("`@("`@("`@( XM"`@(!P<'!P<'!P<'!P<'!P<'!P<'!P<'!P<'!P<'!P<'!P<'!P<'!P<'!P<' XM!P<'!P<'!P<'!P<'!P<'!P<'!P<'!P<'!P<'!P<'!P<'!P<'!P<````````` XM````````````````````````````````````````````#`P,#`P,#`P,#`P, XM#`P,#`P,#`P.#@X.#@X.#@X.#@X.#@X.#@X.#@\/#P\/#P\/#P\/#P\/#P\/ XM#P\/"`@("`@("`@("`@("`@("`@("`@("`@("`@("`@("`@("`@("`@("`@( XM"`@("`@("`@("`@("`@("`@("`@("`@("`@("`@("`@("`@("`@("`@("`@( XM"`@("`@("`@("`@("`@("`@("`@("`@("`@("`@("`@("`@("`@("`@("`@( XM"`@("`@("`@'!P<'!P<'!P<'!P<'!P<'!P<'!P`````````````````````` XM````#`P,#`P,#`P,#`P,#`P,#`P,#`P,#`P,#`P,#`P,#`P,#`P,#`P,#`T- XM#0T-#0T-#0T-#0T-#0T-#0T-#P\/#P\/#P\/#P\/#P\/#P\/#P\/#P\/#P\/ XM#P\/#P\/#P\/#P\/#P@("`@("`@("`@("`@("`@("`@("`@("`@("`@("`@( XM"`@("`@("`@("`@("`@("`@("`@("`@("`@("`@("`@("`@("`@("`@("`@( XM"`@("`@("`@("`@("`@("`@("`@("`@'!P<'!P<'!P<'!P<'!P<'!P<'!P<' XM!P<'!P<'!P<'!P<'!P<'!P<'```````````````````````````*"@H*"@H* XM"@H*"@H*"@H*"@H*"@L+"PL+"PL+"PL+"PL+"PL+"PL+"PL+"PL+"PL+"PL+ XM"PL+"PL+"PL/#P\/#P\/#P\/#P\/#P\/#P\/#P\/#P\/#P\/#P\/#P\/#P\/ XM#P\/#P\/#P\/#P\/#P\/#P\/#P\/#P\/#P\/#P\/#P\/#P\/#P\/#P\/#P@( XM"`@("`@("`@("`@("`@("`@("`@("`@("`@("`@("`@("`@("`@'!P<'!P<' XM!P<'!P<'!P<'!P<'!P<'!P<'!P<'!P<'!P<'!P<'!P<'!P<'!P<'!P<'!P<' XM!P<'!P<'!P<````````````````````````````````````````````````` XM```````````````````````````````````````````````````````````` XM```````````````````````````````````````````````````````````` XM```````````````````````````````````````````````````````````` XM```````````````````````````````````````````````````````````` XM```````````````````````````````````````````````````````````` XM```````````````````````````````````````````````````````````` XM```````````````````````````````````````````````````````````` XM```````````````````````````````````````````````````````````` XM```````````````````````````````````````````````````````````` XM```````````````````````````````````````````````````````````` XM```````````````````````````````````````````````````````````` XM```````````````````````````````````````````````````````````` XM```````````````````````````````````````````````````````````` XM```````````````````````````````````````````````````````````` XM```````````````````````````````````````````````````````````` XM```````````````````````````````````````````````````````````` XM```````````````````````````````````````````````````````````` XM```````````````````````````````````````````````````````````` XM```````````````````````````````````````````````````````````` XM```````````````````````````````````````````````````````````` XM```````````````````````````````````````````````````````````` XM```````````````````````````````````````````````````````````` XM```````````````````````````````````````````````````````````` XM```````````````````````````````````````````````````````````` XM```````````````````````````````````````````````````````````` XM```````````````````````````````````````````````````````````` XM```````````````````````````````````````````````````````````` XM```````````````````````````````````````````````````````````` XM```````````````````````````````````````````````````````````` XM```````````````````````````````````````````````````````````` XM```````````````````````````````````````````````````````````` XM```````````````````````````````````````````````````````````` XM```````````````````````````````````````````````````````````` XM``````````````````"T"<TAN`I,S2&Z-`&T"<TAN``2NQ``N?__S1"#^?]U XM!;H#`>O;NO("M!K-(?R^@0#HAP(\#70'Z$``<L3K-\8&@`"`Q@:!``#&!H(` XM#;KB`;0)S2&Z@`"T"LTAL`KH\@*^@@#H5`(\#70+Z`T`<P2T"<TAZ\FX`$S- XM(1X'OQT#B]>LJCPO=`0\7'4"B]<\('0(/`ET!#P-=>A.5L9%_P"+^N@6`KH= XM`[1.N0``S2%R%U>^$`.LJ@K`=?JZ'0/H$P!?<@ZT3^OE7NCO`3P-=:OXPU[# XMZ%<!<PO#NBL"^<.Z?`+YP[_=`NB>`7+NO^8"Z/H!O^H"Z/0!O^X"Z.X!@S[F XM`@!TVH$^Y@)``7?2@S[J`@!TRX$^Z@+(`'?#@S[N`@AUO.AU\[_*`NA<`7(- XMBP[F`H/!'KH*`.A8`+`@Z&D`45*_U`+H0`%:67(#Z$0`O^4"Z#,!BQ;J`KD` XM`/\670.+#NH"45!7BP[F`HK\Z/D`BN?_%F4#_Q9?`^+O7UC_%F$#6>+?M`?- XM(?\69P/_%FD#^,.L/`UT"SP*=`=6Z`D`7NOPPP````#_45(&HI00H;X2`P;` XM$J.5$+[&$JV&X`K`=!LZ)I00=!JT``4'`-'HT>C1Z%+W)I406@/PZ]X'6EGY XMPZ*7$/\670.+#I4045!7B@Z7$#+ML(#K"=#(@]8`_Q9?`X0$=`A0L/__%F4# XM6.+I1E]8_Q9C`UGBT@=:6?X&EQ`"#I<0@-4`^,,``+@`/<TA<P6Z[0'YPZ,< XM$;0_BQX<$;DW_X'I*ABZ*AC-(7,%NOP!^<,[P74%NA4"^<.T/HL>'!'-(?C# XMK#P-=/L\"G3WZ%$`T.#0X-#@T."*X*SH0P`*Q,,``(D^=A$>![XJ&(L^=A&Y XM'@#SIH!\_SIU"H!]_P!U!.@2`,.L/`IU^X`\#70%@#P*==CYPZP\('3[/`ET XM]T[#/#!R(#PY=P0L,/C#/&%R"#QF=P0L5_C#/$%R"#Q&=P0L-_C#^<.]"@#K XM`[T0`.C$_^C,_W)&"L!U`[T(`#/),]NL/'AT*#Q8="3HL_]R)#+D.\5S'E"+ XMQ??AB\A2B\7WXXO86@/:6`/(@],`Z].]$`#KSDZ)#8E=`OCK$#P_^74+@\8" XMN?__N___Z^?#4%**T+0"S2%:6,.+\(OZ"\)U!+`PZ^DSP(O8B^BY(`#1YM'7 XME>@:`)63Z!4`DQ+`)^+ML3#H(P"+P^@7`(O%ZQ.0$L`GAL02P">&Q,.Q,)+H XM`0"24(K$Z`$`6(K@T.C0Z-#HT.CH`@"*Q"0/!)`G%$`G.L%T!+'_ZX;#"0`# XM``H``0`@!@```````````````"$$8/#P\/#P8`!@8```(@<``.YFS``````` XM```C!@``2$C\2/Q(2````"0&```0?-!\%GP0````)08``,#,&#!@S`P````F XM!@``<-C8<-S8;````"<$```P8,``````````*`0``#!@P,#`8#`````I!``` XMP&`P,#!@P````"H&````,+1XM#``````*P8````P,/PP,``````L`P`````` XM`.#@8,```"T&``````#\````````+@,`````````X.`````O!P``!@P8,&#` XM`````#`'?,[.UM;6YN9\````,0=@X&!@8&!@8/`````R!WR&!@8,&#!@_@`` XM`#,'_`P8,`P&!L9\````-`<</&S,S,S^#`P````U!_[`P,#\!@;&?````#8' XM?,;`P/S&QL9\````-P?^!@8,&#`P,#`````X!WS&QL9\QL;&?````#D'?,;& XMQGX&!L9\````.@,``.#@``#@X``````[`P``X.```.#@8,```#P'```&''#` XM<!P&````/08```#^``#^```````^!P``P'`<!AQPP````#\&?,8&#!@P,``P XM````0`8``#ALW-3<P'P```!!!WS&QL;^QL;&Q@```$('_,;&QO[&QL;\```` XM0P=\PL#`P,#`PGP```!$!_S&QL;&QL;&_````$4&_,#`P/C`P,#\````1@;\ XMP,#`^,#`P,````!'!WS$P,#.QL;&?````$@'QL;&QO[&QL;&````20+`P,#` XMP,#`P,````!*!@P,#`P,#,S,>````$L(P\;,V/#PV,S&````3`;`P,#`P,#` XMP/P```!-"<"`X8#S@-V`R8#!@,&`P8#!@````````$X(@<'AL9F-AX.!```` XM3P=\QL;&QL;&QGP```!0!_S&QL;\P,#`P````%$'?,;&QL;&QL9\!@``4@?\ XMQL;&_,;&QL8```!3!WS"X'`X'`Z&?````%0&_#`P,#`P,#`P````50?&QL;& XMQL;&QGP```!6!\;&QL;&QL;$^````%<*S,#,P,S`S,#,P,S`S,#,@/\````` XM````6`?&QL;&?,;&QL8```!9!LS,S,QX,#`P,````%H(_P,&#!@P8,#_```` XM6P3PP,#`P,#`P/````!<!8"`0$`@(!`0"````%T$\#`P,#`P,##P````7@@` XM`!`X;,8```````!?"````````````/\``&`&``#`8#``````````80<``'R& XM?L;&QGX```!B!\#`_,;&QL;&_````&,&``!XQ,#`P,1X````9`<&!G[&QL;& XMQGX```!E!P``?,;&_L#&?````&8&/&#P8&!@8&!@````9P<``'[&QL;&QGX& XMAGQH!\#`_,;&QL;&Q@```&D"P`#`P,#`P,#`````:@4``!@`&!@8&!@8F'!K XM!L#`P,S8\/#8S````&P"P,#`P,#`P,#`````;0H`````_P#,@,S`S,#,P,S` XMS,````````!N!P``_,;&QL;&Q@```&\'``!\QL;&QL9\````<`<``/S&QL;& XMQOS`P`!Q!P``?L;&QL;&?@8&`'(&``#<X,#`P,#`````<P8``'C$X'@<C'@` XM``!T!&!@\&!@8&!@,````'4'``#&QL;&QL9\````=@<``,;&QL;&Q/@```!W XM"@````#,P,S`S,#,P,S`S(#_`````````'@'``#&QL9\QL;&````>0<``,;& XMQL;&QGX&AGQZ!@``_`P8,&#`_````'L(```X8&#`8&`X````?`+`P,#`P,#` XCP,#`P`!]"```X#`P&#`PX````'X(````8)(,````````@``` X` Xend SHAR_EOF echo "uudecoding file showface.com" uudecode < s2_temp_.tmp && rm -f s2_temp_.tmp && chmod 0644 showface.com || echo "restore of showface.com fails" echo "x - extracting skipblk.asm (Text)" sed 's/^X//' << 'SHAR_EOF' > skipblk.asm && X;put into the public domain by Russell Nelson, nelson@clutx.clarkson.edu X X public skip_blanks Xskip_blanks: X lodsb ;skip blanks. X cmp al,' ' X je skip_blanks X cmp al,HT X je skip_blanks X dec si X ret X SHAR_EOF chmod 0644 skipblk.asm || echo "restore of skipblk.asm fails" exit 0 -- --russ (nelson@clutx [.bitnet | .clarkson.edu]) Russ.Nelson@$315.268.6667 It's better to get mugged than to live a life of fear -- Freeman Dyson