[comp.sources.misc] v05i075: u16 2 of 2 - 16 bit uncompress for IBM PC

tom@SSD.HARRIS.COM (Tom Horsley) (12/08/88)

Posting-number: Volume 5, Issue 75
Submitted-by: "Tom Horsley" <tom@SSD.HARRIS.COM>
Archive-name: u16.pc/part02

u16 is a 16 bit LZW uncompress program for the IBM PC. It can
decompress any files compressed with the net "compress" utility.
--------------------------cut here-----------------------------
#! /bin/sh
# This is a shell archive.  Remove anything before this line, then unpack
# it by saving it into a file and typing "sh file".  To overwrite existing
# files, type "sh file -c".  You can also feed this as standard input via
# unshar, or by typing "sh <file", e.g..  If this archive is complete, you
# will see the following message at the end:
#		"End of archive 2 (of 2)."
# Contents:  xcode.asm
# Wrapped by tom@hcx2 on Tue Dec  6 10:58:19 1988
PATH=/bin:/usr/bin:/usr/ucb ; export PATH
if test -f 'xcode.asm' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'xcode.asm'\"
else
echo shar: Extracting \"'xcode.asm'\" \(24436 characters\)
sed "s/^X//" >'xcode.asm' <<'END_OF_FILE'
X; xcode is the assembler optimized variable sized packed code
X; extraction routines. Written by Tom Horsley
X; (tahorsley@ssd.harris.com) Dec 1988.
X;
X; struct codebuf {
X;    void near   (*codep)();
X;    char near * bufp;
X; };
X;
X; extern unsigned int near xcode(struct codebuf near * cbp)
X;
X; xcode extracts the next variable sized code from the buffer pointed
X; at by bufp. The codep function pointer is a state variable recording
X; the address of the routine that will be used to extract the next
X; code byte.
X;
X; xcode works by jumping to the codep address. Each code extraction
X; routine extracts the specific offset code it is designed for then
X; sets codep to point to the next routine that will extract the next
X; code. Eventually we sync up on a byte boundary and start over again
X; with the original routine.
X;
X; Note: As you can see below, this uses the new .MODEL directive
X; Microsoft introduced sometime around 5.0, so you need the latest
X; version of the assembler to build this.
X
X.MODEL	 SMALL
X.CODE
X	 PUBLIC	   _xcode
X_xcode	 PROC
X	 push	   bp
X	 mov	   bp,sp     ; add code to push ss, ds, si, di
X	 push	   si
X
X	 mov	   bx,[bp+4] ; bx points to codebuf struct
X	 mov	   cx,[bx]   ; cx points to routine
X	 mov	   si,[bx+2] ; si points to data buffer
X	 call	   cx	     ; go make state transition
X	 mov	   [bx],cx   ; save new state routine
X	 mov	   [bx+2],si ; save new buffer ptr
X
X	 pop	   si
X	 pop	   bp	     ; add code to pop di, si, ds, ss
X	 ret
X_xcode	 ENDP
X
X; The following code implements all the code extraction routines.
X; Because of the way that the net compress utility works there are
X; eight routines for each size code from 9 to 15 bits. For 10, 12, 14,
X; and 16 bits we could do with fewer routines since we sync up on a
X; byte boundary before looking at n_bits bytes, but the compress.c
X; code always flushes out to n_bits byte boundary when changing code
X; size, so there are 8 routines not just to extract codes, but also to
X; maintain unique state information so that a buffer flush can get to
X; the correct byte boundary to find the next set of codes.
X;
X; A fanatic would probably say "My gosh! we are wasteing space!" and
X; implement a new magic number and a new compression algorithm to
X; recover the dozen or so bytes wasted, but since I am not (that sort
X; of) a fanatic, and I like the idea of sticking to standards, I leave
X; it the way it is. (P.S. The percentage of wasted space is somewhere
X; around .000001, so there is no real reason to get upset).
X
X; ********************************************** 9 bit code extraction routines
X
X	 PUBLIC	   _init9
X_init9	 PROC
X	 push	   bp
X	 mov	   bp,sp
X	 mov	   bx,[bp+4] ; bx points to codebuf struct
X	 mov	   cx,offset g9c0 ; initialize state to g9c0
X	 mov	   [bx],cx   ; save new state routine
X	 pop	   bp
X	 ret
X_init9	 ENDP
X
X; g9c0 get 9 bit code 0: 11111111 -------1
X
Xg9c0	 PROC
X	 mov	   ax,[si]   ; get low in al, high bit in ah
X	 and	   ah,001h   ; mask off junk
X	 inc	   si	     ; skip past first byte
X	 mov	   cx,offset g9c1 ; point to next code routine
X	 ret
Xg9c0	 ENDP
X
X; g9c1 get 9 bit code 1: 1111111- ------11
X
Xg9c1	 PROC
X	 mov	   ax,[si]   ; get data in ax << 1
X	 shr	   ax,1	     ; position correctly
X	 and	   ah,001h   ; mask junk
X	 inc	   si	     ; skip to next
X	 mov	   cx,offset g9c2 ; point to next code routine
X	 ret
Xg9c1	 ENDP
X
X; g9c2 get 9 bit code 2: 111111-- -----111
X
Xg9c2	 PROC
X	 mov	   ax,[si]   ; get data in ax << 2
X	 shr	   ax,1	     ; position correctly
X	 shr	   ax,1
X	 and	   ah,001h   ; mask junk
X	 inc	   si	     ; skip to next
X	 mov	   cx,offset g9c3 ; point to next code routine
X	 ret
Xg9c2	 ENDP
X
X; g9c3 get 9 bit code 3: 11111--- ----1111
X
Xg9c3	 PROC
X	 mov	   ax,[si]   ; get data in ax << 3
X	 shr	   ax,1	     ; position correctly
X	 shr	   ax,1
X	 shr	   ax,1
X	 and	   ah,001h   ; mask junk
X	 inc	   si	     ; skip to next
X	 mov	   cx,offset g9c4 ; point to next code routine
X	 ret
Xg9c3	 ENDP
X
X; g9c4 get 9 bit code 4: 1111---- ---11111
X
Xg9c4	 PROC
X	 mov	   ax,[si]   ; get data in ax << 4
X	 shr	   ax,1	     ; position correctly
X	 shr	   ax,1
X	 shr	   ax,1
X	 shr	   ax,1
X	 and	   ah,001h   ; mask junk
X	 inc	   si	     ; skip to next
X	 mov	   cx,offset g9c5 ; point to next code routine
X	 ret
Xg9c4	 ENDP
X
X; g9c5 get 9 bit code 5: 111----- --111111
X
Xg9c5	 PROC
X	 mov	   ax,[si]   ; ax = --123456 789-----
X	 xchg	   ah,al     ; ax = 789----- --123456
X	 rol	   ax,1	     ; ax = 89------ -1234567
X	 rol	   ax,1	     ; ax = 9------- 12345678
X	 rol	   ax,1	     ; ax = -------1 23456789
X	 and	   ah,001h   ; mask junk
X	 inc	   si	     ; skip to next
X	 mov	   cx,offset g9c6 ; point to next code routine
X	 ret
Xg9c5	 ENDP
X
X; g9c6 get 9 bit code 6: 11------ -1111111
X
Xg9c6	 PROC
X	 mov	   ax,[si]   ; ax = -1234567 89------
X	 xchg	   ah,al     ; ax = 89------ -1234567
X	 rol	   ax,1	     ; ax = 9------- 12345678
X	 rol	   ax,1	     ; ax = -------1 23456789
X	 and	   ah,001h   ; mask junk
X	 inc	   si	     ; skip to next
X	 mov	   cx,offset g9c7 ; point to next code routine
X	 ret
Xg9c6	 ENDP
X
X; g9c7 get 9 bit code 7: 1------- 11111111
X
Xg9c7	 PROC
X	 mov	   ax,[si]   ; ax = 12345678 9-------
X	 xchg	   ah,al     ; ax = 9------- 12345678
X	 rol	   ax,1	     ; ax = -------1 23456789
X	 and	   ah,001h   ; mask junk
X	 inc	   si	     ; skip to next
X	 inc	   si	     ; skip to next
X	 mov	   cx,offset g9c0 ; synced, point back to code 0 routine
X	 ret
Xg9c7	 ENDP
X
X; ********************************************* 10 bit code extraction routines
X
X	 PUBLIC	   _init10
X_init10	 PROC
X	 push	   bp
X	 mov	   bp,sp
X	 mov	   bx,[bp+4] ; bx points to codebuf struct
X	 mov	   cx,offset g10c0 ; initialize state to g10c0
X	 mov	   [bx],cx   ; save new state routine
X	 pop	   bp
X	 ret
X_init10	 ENDP
X
X; g10c0 get 10 bit code 0: 11111111 ------11
X
Xg10c0	 PROC
X	 mov	   ax,[si]   ; code in ax
X	 and	   ah,003h   ; mask off junk
X	 inc	   si	     ; point to next byte
X	 mov	   cx,offset g10c1 ; point to next code routine
X	 ret
Xg10c0	 ENDP
X
X; g10c1 get 10 bit code 1: 111111-- ----1111
X
Xg10c1	 PROC
X	 mov	   ax,[si]   ; ax = ----1234 56789a--
X	 shr	   ax,1	     ; ax = -----123 456789a-
X	 shr	   ax,1	     ; ax = ------12 3456789a
X	 and	   ah,003h   ; mask off junk
X	 inc	   si	     ; point to next byte
X	 mov	   cx,offset g10c2 ; point to next code routine
X	 ret
Xg10c1	 ENDP
X
X; g10c2 get 10 bit code 2: 1111---- --111111
X
Xg10c2	 PROC
X	 mov	   ax,[si]   ; ax = --123456 789a----
X	 shr	   ax,1	     ; ax = ---12345 6789a---
X	 shr	   ax,1	     ; ax = ----1234 56789a--
X	 shr	   ax,1	     ; ax = -----123 456789a-
X	 shr	   ax,1	     ; ax = ------12 3456789a
X	 and	   ah,003h   ; mask off junk
X	 inc	   si	     ; point to next byte
X	 mov	   cx,offset g10c3 ; point to next code routine
X	 ret
Xg10c2	 ENDP
X
X; g10c3 get 10 bit code 3: 11------ 11111111
X
Xg10c3	 PROC
X	 mov	   ax,[si]   ; ax = 12345678 9a------
X	 xchg	   ah,al     ; ax = 9a------ 12345678
X	 rol	   ax,1	     ; ax = a------1 23456789
X	 rol	   ax,1	     ; ax = ------12 3456789a
X	 and	   ah,003h   ; mask off junk
X	 inc	   si	     ; inc past code
X	 inc	   si
X	 mov	   cx,offset g10c4 ; point to next code routine
X	 ret
Xg10c3	 ENDP
X
X; g10c4 get 10 bit code 4: 11111111 ------11
X
Xg10c4	 PROC		     ; same as c0
X	 mov	   ax,[si]
X	 and	   ah,003h
X	 inc	   si
X	 mov	   cx,offset g10c5
X	 ret
Xg10c4	 ENDP
X
X; g10c5 get 10 bit code 5: 111111-- ----1111
X
Xg10c5	 PROC		     ; same as c1
X	 mov	   ax,[si]
X	 shr	   ax,1
X	 shr	   ax,1
X	 and	   ah,003h
X	 inc	   si
X	 mov	   cx,offset g10c6
X	 ret
Xg10c5	 ENDP
X
X; g10c6 get 10 bit code 6: 1111---- --111111
X
Xg10c6	 PROC		     ; same as c2
X	 mov	   ax,[si]
X	 shr	   ax,1
X	 shr	   ax,1
X	 shr	   ax,1
X	 shr	   ax,1
X	 and	   ah,003h
X	 inc	   si
X	 mov	   cx,offset g10c7
X	 ret
Xg10c6	 ENDP
X
X; g10c7 get 10 bit code 3: 11------ 11111111
X
Xg10c7	 PROC		     ; same as c3
X	 mov	   ax,[si]
X	 xchg	   ah,al
X	 rol	   ax,1
X	 rol	   ax,1
X	 and	   ah,003h
X	 inc	   si
X	 inc	   si
X	 mov	   cx,offset g10c0 ; synced, wrap back around
X	 ret
Xg10c7	 ENDP
X
X; ********************************************* 11 bit code extraction routines
X
X	 PUBLIC	   _init11
X_init11	 PROC
X	 push	   bp
X	 mov	   bp,sp
X	 mov	   bx,[bp+4] ; bx points to codebuf struct
X	 mov	   cx,offset g11c0 ; initialize state to g11c0
X	 mov	   [bx],cx   ; save new state routine
X	 pop	   bp
X	 ret
X_init11	 ENDP
X
X; g11c0 get 11 bit code 0: 11111111 -----111
X
Xg11c0	 PROC
X	 mov	   ax,[si]   ; code in ax
X	 and	   ah,007h   ; mask off junk
X	 inc	   si	     ; bump pointer
X	 mov	   cx,offset g11c1 ; point to next code routine
X	 ret
Xg11c0	 ENDP
X
X; g11c1 get 11 bit code 1: 11111--- --111111
X
Xg11c1	 PROC
X	 mov	   ax,[si]   ; ax = --123456 789ab---
X	 shr	   ax,1	     ; ax = ---12345 6789ab--
X	 shr	   ax,1	     ; ax = ----1234 56789ab-
X	 shr	   ax,1	     ; ax = -----123 456789ab
X	 and	   ah,007h   ; mask off junk
X	 inc	   si	     ; bump pointer
X	 mov	   cx,offset g11c2 ; point to next code routine
X	 ret
Xg11c1	 ENDP
X
X; g11c2 get 11 bit code 2: 11------ 11111111 -------1
X
Xg11c2	 PROC
X	 mov	   ax,[si]   ; ax = 23456789 ab------
X	 inc	   si	     ; bump pointer
X	 inc	   si
X	 mov	   cl,[si]   ; cl = -------1
X	 rcr	   cl,1	     ; carry bit = 1
X	 rcr	   ax,1	     ; ax = 12345678 9ab-----
X	 xchg	   ah,al     ; ax = 9ab----- 12345678
X	 rol	   ax,1	     ; ax = ab-----1 23456789
X	 rol	   ax,1	     ; ax = b-----12 3456789a
X	 rol	   ax,1	     ; ax = -----123 456789ab
X	 and	   ah,007h   ; mask off junk
X	 mov	   cx,offset g11c3 ; point to next code routine
X	 ret
Xg11c2	 ENDP
X
X; g11c3 get 11 bit code 3: 1111111- ----1111
X
Xg11c3	 PROC
X	 mov	   ax,[si]   ; ax = ----1234 56789ab-
X	 shr	   ax,1	     ; ax = -----123 456789ab
X	 and	   ah,007h   ; mask off junk
X	 inc	   si	     ; next byte
X	 mov	   cx,offset g11c4 ; point to next code routine
X	 ret
Xg11c3	 ENDP
X
X; g11c4 get 11 bit code 4: 1111---- -1111111
X
Xg11c4	 PROC
X	 mov	   ax,[si]   ; ax = -1234567 89ab----
X	 shr	   ax,1	     ; ax = --123456 789ab---
X	 shr	   ax,1	     ; ax = ---12345 6789ab--
X	 shr	   ax,1	     ; ax = ----1234 56789ab-
X	 shr	   ax,1	     ; ax = -----123 456789ab
X	 and	   ah,007h   ; mask off junk
X	 inc	   si	     ; next byte
X	 mov	   cx,offset g11c5 ; point to next code routine
X	 ret
Xg11c4	 ENDP
X
X; g11c5 get 11 bit code 5: 1------- 11111111 ------11
X
Xg11c5	 PROC
X	 mov	   ax,[si]   ; ax = 3456789a b-------
X	 and	   al,080h   ; mask off junk
X	 inc	   si	     ; bump pointer
X	 inc	   si
X	 mov	   cl,[si]   ; cl = ------12
X	 and	   cl,003h   ; mask off junk
X	 or	   al,cl     ; ax = 3456789a b-----12
X	 rol	   ax,1	     ; ax = 456789ab -----123
X	 xchg	   ah,al     ; ax = -----123 456789ab
X	 mov	   cx,offset g11c6 ; point to next code routine
X	 ret
Xg11c5	 ENDP
X
X; g11c6 get 11 bit code 6: 111111-- ---11111
X
Xg11c6	 PROC
X	 mov	   ax,[si]   ; ax = ---12345 6789ab--
X	 shr	   ax,1	     ; ax = ----1234 56789ab-
X	 shr	   ax,1	     ; ax = -----123 456789ab
X	 and	   ah,007h   ; mask off junk
X	 inc	   si	     ; bump pointer
X	 mov	   cx,offset g11c7 ; point to next code routine
X	 ret
Xg11c6	 ENDP
X
X; g11c7 get 11 bit code 7: 111----- 11111111
X
Xg11c7	 PROC
X	 mov	   ax,[si]   ; ax = 12345678 9ab-----
X	 xchg	   ah,al     ; ax = 9ab----- 12345678
X	 rol	   ax,1	     ; ax = ab-----1 23456789
X	 rol	   ax,1	     ; ax = b-----12 3456789a
X	 rol	   ax,1	     ; ax = -----123 456789ab
X	 and	   ah,007h   ; mask off junk
X	 inc	   si	     ; bump pointer
X	 inc	   si
X	 mov	   cx,offset g11c0 ; synced, wrap around
X	 ret
Xg11c7	 ENDP
X
X; ********************************************* 12 bit code extraction routines
X
X	 PUBLIC	   _init12
X_init12	 PROC
X	 push	   bp
X	 mov	   bp,sp
X	 mov	   bx,[bp+4] ; bx points to codebuf struct
X	 mov	   cx,offset g12c0 ; initialize state to g12c0
X	 mov	   [bx],cx   ; save new state routine
X	 pop	   bp
X	 ret
X_init12	 ENDP
X
X; g12c0 get 12 bit code 0: 11111111 ----1111
X
Xg12c0	 PROC
X	 mov	   ax,[si]   ; code in ax
X	 and	   ah,00fh   ; mask off junk
X	 inc	   si	     ; next byte
X	 mov	   cx,offset g12c1 ; point to next routine
X	 ret
Xg12c0	 ENDP
X
X; g12c1 get 12 bit code 1: 1111---- 11111111
X
Xg12c1	 PROC
X	 mov	   ax,[si]   ; ax = 12345678 9abc----
X	 shr	   ax,1	     ; ax = -1234567 89abc---
X	 shr	   ax,1	     ; ax = --123456 789abc--
X	 shr	   ax,1	     ; ax = ---12345 6789abc-
X	 shr	   ax,1	     ; ax = ----1234 56789abc
X	 inc	   si	     ; bump pointer
X	 inc	   si
X	 mov	   cx,offset g12c2 ; point to next routine
X	 ret
Xg12c1	 ENDP
X
X; g12c2 get 12 bit code 2: 11111111 ----1111
X
Xg12c2	 PROC		     ; same as 0
X	 mov	   ax,[si]
X	 and	   ah,00fh
X	 inc	   si
X	 mov	   cx,offset g12c3
X	 ret
Xg12c2	 ENDP
X
X; g12c3 get 12 bit code 3: 1111---- 11111111
X
Xg12c3	 PROC		     ; same as 1
X	 mov	   ax,[si]
X	 shr	   ax,1
X	 shr	   ax,1
X	 shr	   ax,1
X	 shr	   ax,1
X	 inc	   si
X	 inc	   si
X	 mov	   cx,offset g12c4
X	 ret
Xg12c3	 ENDP
X
X; g12c4 get 12 bit code 4: 11111111 ----1111
X
Xg12c4	 PROC		     ; same as 0
X	 mov	   ax,[si]
X	 and	   ah,00fh
X	 inc	   si
X	 mov	   cx,offset g12c5
X	 ret
Xg12c4	 ENDP
X
X; g12c5 get 12 bit code 5: 1111---- 11111111
X
Xg12c5	 PROC		     ; same as 1
X	 mov	   ax,[si]
X	 shr	   ax,1
X	 shr	   ax,1
X	 shr	   ax,1
X	 shr	   ax,1
X	 inc	   si
X	 inc	   si
X	 mov	   cx,offset g12c6
X	 ret
Xg12c5	 ENDP
X
X; g12c6 get 12 bit code 6: 11111111 ----1111
X
Xg12c6	 PROC		     ; same as 0
X	 mov	   ax,[si]
X	 and	   ah,00fh
X	 inc	   si
X	 mov	   cx,offset g12c7
X	 ret
Xg12c6	 ENDP
X
X; g12c7 get 12 bit code 7: 1111---- 11111111
X
Xg12c7	 PROC		     ; same as 1
X	 mov	   ax,[si]
X	 shr	   ax,1
X	 shr	   ax,1
X	 shr	   ax,1
X	 shr	   ax,1
X	 inc	   si
X	 inc	   si
X	 mov	   cx,offset g12c0 ; synced, wrap around
X	 ret
Xg12c7	 ENDP
X
X; ********************************************* 13 bit code extraction routines
X
X	 PUBLIC	   _init13
X_init13	 PROC
X	 push	   bp
X	 mov	   bp,sp
X	 mov	   bx,[bp+4] ; bx points to codebuf struct
X	 mov	   cx,offset g13c0 ; initialize state to g13c0
X	 mov	   [bx],cx   ; save new state routine
X	 pop	   bp
X	 ret
X_init13	 ENDP
X
X; g13c0 get 13 bit code 0: 11111111 ---11111
X
Xg13c0	 PROC
X	 mov	   ax,[si]   ; ax = 12345 6789abcd
X	 and	   ah,01fh   ; mask off junk
X	 inc	   si	     ; bump pointer
X	 mov	   cx,offset g13c1 ; point to next routine
X	 ret
Xg13c0	 ENDP
X
X; g13c1 get 13 bit code 1: 111----- 11111111 ------11
X
Xg13c1	 PROC
X	 mov	   ax,[si]   ; ax = 3456789a bcd-----
X	 and	   al,0e0h   ; mask off junk
X	 inc	   si	     ; bump pointer
X	 inc	   si
X	 mov	   cl,[si]   ; cl = ------12
X	 and	   cl,003h   ; mask off junk
X	 or	   al,cl     ; ax = 3456789a bcd---12
X	 rol	   ax,1	     ; ax = 456789ab cd---123
X	 rol	   ax,1	     ; ax = 56789abc d---1234
X	 rol	   ax,1	     ; ax = 6789abcd ---12345
X	 xchg	   ah,al     ; ax = ---12345 6789abcd
X	 mov	   cx,offset g13c2 ; point to next routine
X	 ret
Xg13c1	 ENDP
X
X; g13c2 get 13 bit code 2: 111111-- -1111111
X
Xg13c2	 PROC
X	 mov	   ax,[si]   ; ax = -1234567 89abcd--
X	 shr	   ax,1	     ; ax = --123456 789abcd-
X	 shr	   ax,1	     ; ax = ---12345 6789abcd
X	 and	   ah,01fh   ; mask junk
X	 inc	   si	     ; bump pointer
X	 mov	   cx,offset g13c3 ; point to next routine
X	 ret
Xg13c2	 ENDP
X
X; g13c3 get 13 bit code 3: 1------- 11111111 ----1111
X
Xg13c3	 PROC
X	 mov	   ax,[si]   ; ax = 56789abc d-------
X	 inc	   si	     ; bump pointer
X	 inc	   si
X	 mov	   cl,[si]   ; cl = ----1234
X	 and	   cl,00fh   ; mask junk
X	 and	   al,080h   ; mask junk
X	 or	   al,cl     ; ax = 56789abc d---1234
X	 rol	   ax,1	     ; ax = 6789abcd ---12345
X	 xchg	   ah,al     ; ax = ---12345 6789abcd
X	 mov	   cx,offset g13c4 ; point to next routine
X	 ret
Xg13c3	 ENDP
X
X; g13c4 get 13 bit code 4: 1111---- 11111111 -------1
X
Xg13c4	 PROC
X	 mov	   ax,[si]   ; ax = 23456789 abcd----
X	 inc	   si	     ; bump pointer
X	 inc	   si
X	 mov	   cl,[si]   ; cl = ------1
X	 rcr	   cl,1	     ; carry bit = 1
X	 rcr	   ax,1	     ; ax = 12345678 9abcd---
X	 shr	   ax,1	     ; ax = -1234567 89abcd--
X	 shr	   ax,1	     ; ax = --123456 789abcd-
X	 shr	   ax,1	     ; ax = ---12345 6789abcd
X	 mov	   cx,offset g13c5 ; point to next routine
X	 ret
Xg13c4	 ENDP
X
X; g13c5 get 13 bit code 5: 1111111- --111111
X
Xg13c5	 PROC
X	 mov	   ax,[si]   ; ax = --123456 789abcd-
X	 shr	   ax,1	     ; ax = ---12345 6789abcd
X	 and	   ah,01fh   ; mask junk
X	 inc	   si
X	 mov	   cx,offset g13c6 ; point to next routine
X	 ret
Xg13c5	 ENDP
X
X; g13c6 get 13 bit code 6: 11------ 11111111 -----111
X
Xg13c6	 PROC
X	 mov	   ax,[si]   ; ax = 456789ab cd------
X	 inc	   si
X	 inc	   si
X	 mov	   cl,[si]   ; cl = -----123
X	 and	   al,0c0h   ; mask junk
X	 and	   cl,007h   ; mask junk
X	 or	   al,cl     ; ax = 456789ab cd---123
X	 rol	   ax,1	     ; ax = 56789abc d---1234
X	 rol	   ax,1	     ; ax = 6789abcd ---12345
X	 xchg	   ah,al     ; ax = ---12345 6789abcd
X	 mov	   cx,offset g13c7 ; point to next routine
X	 ret
Xg13c6	 ENDP
X
X; g13c7 get 13 bit code 7: 11111--- 11111111
X
Xg13c7	 PROC
X	 mov	   ax,[si]   ; ax = 12345678 9abcd---
X	 shr	   ax,1	     ; ax = -1234567 89abcd--
X	 shr	   ax,1	     ; ax = --123456 789abcd-
X	 shr	   ax,1	     ; ax = ---12345 6789abcd
X	 inc	   si	     ; bump pointer
X	 inc	   si
X	 mov	   cx,offset g13c0 ; synced, wrap around
X	 ret
Xg13c7	 ENDP
X
X; ********************************************* 14 bit code extraction routines
X
X	 PUBLIC	   _init14
X_init14	 PROC
X	 push	   bp
X	 mov	   bp,sp
X	 mov	   bx,[bp+4] ; bx points to codebuf struct
X	 mov	   cx,offset g14c0 ; initialize state to g14c0
X	 mov	   [bx],cx   ; save new state routine
X	 pop	   bp
X	 ret
X_init14	 ENDP
X
X; g14c0 get 14 bit code 0: 11111111 --111111
X
Xg14c0	 PROC
X	 mov	   ax,[si]   ; ax = --123456 789abcde
X	 and	   ah,03fh   ; mask junk
X	 inc	   si	     ; bump pointer
X	 mov	   cx,offset g14c1 ; point to next routine
X	 ret
Xg14c0	 ENDP
X
X; g14c1 get 14 bit code 1: 11------ 11111111 ----1111
X
Xg14c1	 PROC
X	 mov	   ax,[si]   ; ax = 56789abc de------
X	 inc	   si
X	 inc	   si
X	 mov	   cl,[si]   ; cl = ----1234
X	 and	   al,0c0h   ; mask junk
X	 and	   cl,00fh   ; mask junk
X	 or	   al,cl     ; ax = 56789abc de--1234
X	 rol	   ax,1	     ; ax = 6789abcd e--12345
X	 rol	   ax,1	     ; ax = 789abcde --123456
X	 xchg	   ah,al     ; ax = --123456 789abcde
X	 mov	   cx,offset g14c2 ; point to next routine
X	 ret
Xg14c1	 ENDP
X
X; g14c2 get 14 bit code 2: 1111---- 11111111 ------11
X
Xg14c2	 PROC
X	 mov	   ax,[si]   ; ax = 3456789a bcde----
X	 inc	   si
X	 inc	   si
X	 mov	   cl,[si]   ; cl = ------12
X	 and	   al,0f0h   ; mask junk
X	 and	   cl,003h   ; mask junk
X	 or	   al,cl     ; ax = 3456789a bcde--12
X	 ror	   ax,1	     ; ax = 23456789 abcde--1
X	 ror	   ax,1	     ; ax = 12345678 9abcde--
X	 shr	   ax,1	     ; ax = -1234567 89abcde-
X	 shr	   ax,1	     ; ax = --123456 789abcde
X	 mov	   cx,offset g14c3 ; point to next routine
X	 ret
Xg14c2	 ENDP
X
X; g14c3 get 14 bit code 3: 111111-- 11111111
X
Xg14c3	 PROC
X	 mov	   ax,[si]   ; ax = 12345678 9abcde--
X	 shr	   ax,1	     ; ax = -1234567 89abcde-
X	 shr	   ax,1	     ; ax = --123456 789abcde
X	 inc	   si
X	 inc	   si
X	 mov	   cx,offset g14c4 ; point to next routine
X	 ret
Xg14c3	 ENDP
X
X; g14c4 get 14 bit code 4: 11111111 --111111
X
Xg14c4	 PROC		     ; same as 0
X	 mov	   ax,[si]
X	 and	   ah,03fh
X	 inc	   si
X	 mov	   cx,offset g14c5
X	 ret
Xg14c4	 ENDP
X
X; g14c5 get 14 bit code 5: 11------ 11111111 ----1111
X
Xg14c5	 PROC		     ; same as 1
X	 mov	   ax,[si]
X	 inc	   si
X	 inc	   si
X	 mov	   cl,[si]
X	 and	   al,0c0h
X	 and	   cl,00fh
X	 or	   al,cl
X	 rol	   ax,1
X	 rol	   ax,1
X	 xchg	   ah,al
X	 mov	   cx,offset g14c6
X	 ret
Xg14c5	 ENDP
X
X; g14c6 get 14 bit code 6: 1111---- 11111111 ------11
X
Xg14c6	 PROC		     ; same as 2
X	 mov	   ax,[si]
X	 inc	   si
X	 inc	   si
X	 mov	   cl,[si]
X	 and	   al,0f0h
X	 and	   cl,003h
X	 or	   al,cl
X	 ror	   ax,1
X	 ror	   ax,1
X	 shr	   ax,1
X	 shr	   ax,1
X	 mov	   cx,offset g14c7
X	 ret
Xg14c6	 ENDP
X
X; g14c7 get 14 bit code 7: 111111-- 11111111
X
Xg14c7	 PROC		     ; same as 3
X	 mov	   ax,[si]
X	 shr	   ax,1
X	 shr	   ax,1
X	 inc	   si
X	 inc	   si
X	 mov	   cx,offset g14c0 ; synced, wrap around
X	 ret
Xg14c7	 ENDP
X
X; ********************************************* 15 bit code extraction routines
X
X	 PUBLIC	   _init15
X_init15	 PROC
X	 push	   bp
X	 mov	   bp,sp
X	 mov	   bx,[bp+4] ; bx points to codebuf struct
X	 mov	   cx,offset g15c0 ; initialize state to g15c0
X	 mov	   [bx],cx   ; save new state routine
X	 pop	   bp
X	 ret
X_init15	 ENDP
X
X; g15c0 get 15 bit code 0: 11111111 -1111111
X
Xg15c0	 PROC
X	 mov	   ax,[si]   ; ax = -1234567 89abcdef
X	 and	   ah,07fh   ; mask junk
X	 inc	   si
X	 mov	   cx,offset g15c1 ; point to next routine
X	 ret
Xg15c0	 ENDP
X
X; g15c1 get 15 bit code 1: 1------- 11111111 --111111
X
Xg15c1	 PROC
X	 mov	   ax,[si]   ; ax = 789abcde f-------
X	 inc	   si
X	 inc	   si
X	 mov	   cl,[si]   ; ax = --123456
X	 and	   al,080h   ; mask junk
X	 and	   cl,03fh   ; mask junk
X	 or	   al,cl     ; ax = 789abcde f-123456
X	 rol	   ax,1	     ; ax = 89abcdef -1234567
X	 xchg	   ah,al     ; ax = -1234567 89abcdef
X	 mov	   cx,offset g15c2 ; point to next routine
X	 ret
Xg15c1	 ENDP
X
X; g15c2 get 15 bit code 2: 11------ 11111111 ---11111
X
Xg15c2	 PROC
X	 mov	   ax,[si]   ; ax = 6789abcd ef------
X	 inc	   si
X	 inc	   si
X	 mov	   cl,[si]   ; cl = ---12345
X	 and	   al,0c0h   ; mask junk
X	 and	   cl,01fh   ; mask junk
X	 or	   al,cl     ; ax = 6789abcd ef-12345
X	 rol	   ax,1	     ; ax = 789abcde f-123456
X	 rol	   ax,1	     ; ax = 89abcdef -1234567
X	 xchg	   ah,al     ; ax = -1234567 89abcdef
X	 mov	   cx,offset g15c3 ; point to next routine
X	 ret
Xg15c2	 ENDP
X
X; g15c3 get 15 bit code 3: 111----- 11111111 ----1111
X
Xg15c3	 PROC
X	 mov	   ax,[si]   ; ax = 56789abc def-----
X	 inc	   si
X	 inc	   si
X	 mov	   cl,[si]   ; cl = ----1234
X	 and	   al,0e0h
X	 and	   cl,00fh
X	 or	   al,cl     ; ax = 56789abc def-1234
X	 rol	   ax,1	     ; ax = 6789abcd ef-12345
X	 rol	   ax,1	     ; ax = 789abcde f-123456
X	 rol	   ax,1	     ; ax = 89abcdef -1234567
X	 xchg	   ah,al     ; ax = -1234567 89abcdef
X	 mov	   cx,offset g15c4 ; point to next routine
X	 ret
Xg15c3	 ENDP
X
X; g15c4 get 15 bit code 4: 1111---- 11111111 -----111
X
Xg15c4	 PROC
X	 mov	   ax,[si]   ; ax = 456789ab cdef----
X	 inc	   si
X	 inc	   si
X	 mov	   cl,[si]   ; cl = -----123
X	 and	   cl,007h
X	 and	   al,0f0h
X	 or	   al,cl     ; ax = 456789ab cdef-123
X	 ror	   ax,1	     ; ax = 3456789a bcdef-12
X	 ror	   ax,1	     ; ax = 23456789 abcdef-1
X	 ror	   ax,1	     ; ax = 12345678 9abcdef-
X	 shr	   ax,1	     ; ax = -1234567 89abcdef
X	 mov	   cx,offset g15c5 ; point to next routine
X	 ret
Xg15c4	 ENDP
X
X; g15c5 get 15 bit code 5: 11111--- 11111111 ------11
X
Xg15c5	 PROC
X	 mov	   ax,[si]   ; ax = 3456789a bcdef---
X	 inc	   si
X	 inc	   si
X	 mov	   cl,[si]   ; cl = ------12
X	 and	   al,0f8h
X	 and	   cl,003h
X	 or	   al,cl     ; ax = 3456789a bcdef-12
X	 ror	   ax,1	     ; ax = 23456789 abcdef-1
X	 ror	   ax,1	     ; ax = 12345678 9abcdef-
X	 shr	   ax,1	     ; ax = -1234567 89abcdef
X	 mov	   cx,offset g15c6 ; point to next routine
X	 ret
Xg15c5	 ENDP
X
X; g15c6 get 15 bit code 6: 111111-- 11111111 -------1
X
Xg15c6	 PROC
X	 mov	   ax,[si]   ; ax = 23456789 abcdef--
X	 inc	   si
X	 inc	   si
X	 mov	   cl,[si]   ; cl = -------1
X	 rcr	   cl,1	     ; carry bit = 1
X	 rcr	   ax,1	     ; ax = 12345678 9abcdef-
X	 shr	   ax,1	     ; ax = -1234567 89abcdef
X	 mov	   cx,offset g15c7 ; point to next routine
X	 ret
Xg15c6	 ENDP
X
X; g15c7 get 15 bit code 7: 1111111- 11111111
X
Xg15c7	 PROC
X	 mov	   ax,[si]   ; ax = 12345678 9abcdef-
X	 shr	   ax,1	     ; ax = -1234567 89abcdef
X	 inc	   si
X	 inc	   si
X	 mov	   cx,offset g15c0 ; synced, wrap around
X	 ret
Xg15c7	 ENDP
X
X; ********************************************** 16 bit code extraction routine
X
X	 PUBLIC	   _init16
X_init16	 PROC
X	 push	   bp
X	 mov	   bp,sp
X	 mov	   bx,[bp+4] ; bx points to codebuf struct
X	 mov	   cx,offset g16c0 ; initialize state to g16c0
X	 mov	   [bx],cx   ; save new state routine
X	 pop	   bp
X	 ret
X_init16	 ENDP
X
X; g16c0 get 16 bit code 0: 11111111 11111111
X
Xg16c0	 PROC
X	 mov	   ax,[si]   ; get low & high bytes
X	 inc	   si	     ; skip past them
X	 inc	   si
X	 mov	   cx,offset g16c1 ; next routine
X	 ret
Xg16c0	 ENDP
X
Xg16c1	 PROC		     ; same as 0
X	 mov	   ax,[si]
X	 inc	   si
X	 inc	   si
X	 mov	   cx,offset g16c2
X	 ret
Xg16c1	 ENDP
X
Xg16c2	 PROC		     ; same as 0
X	 mov	   ax,[si]
X	 inc	   si
X	 inc	   si
X	 mov	   cx,offset g16c3
X	 ret
Xg16c2	 ENDP
X
Xg16c3	 PROC		     ; same as 0
X	 mov	   ax,[si]
X	 inc	   si
X	 inc	   si
X	 mov	   cx,offset g16c4
X	 ret
Xg16c3	 ENDP
X
Xg16c4	 PROC		     ; same as 0
X	 mov	   ax,[si]
X	 inc	   si
X	 inc	   si
X	 mov	   cx,offset g16c5
X	 ret
Xg16c4	 ENDP
X
Xg16c5	 PROC		     ; same as 0
X	 mov	   ax,[si]
X	 inc	   si
X	 inc	   si
X	 mov	   cx,offset g16c6
X	 ret
Xg16c5	 ENDP
X
Xg16c6	 PROC		     ; same as 0
X	 mov	   ax,[si]
X	 inc	   si
X	 inc	   si
X	 mov	   cx,offset g16c7
X	 ret
Xg16c6	 ENDP
X
Xg16c7	 PROC		     ; same as 0
X	 mov	   ax,[si]
X	 inc	   si
X	 inc	   si
X	 mov	   cx,offset g16c0 ; wrap back around
X	 ret
Xg16c7	 ENDP
X
X	 END
END_OF_FILE
if test 24436 -ne `wc -c <'xcode.asm'`; then
    echo shar: \"'xcode.asm'\" unpacked with wrong size!
fi
# end of 'xcode.asm'
fi
echo shar: End of archive 2 \(of 2\).
cp /dev/null ark2isdone
MISSING=""
for I in 1 2 ; do
    if test ! -f ark${I}isdone ; then
	MISSING="${MISSING} ${I}"
    fi
done
if test "${MISSING}" = "" ; then
    echo You have unpacked both archives.
    rm -f ark[1-9]isdone
else
    echo You still need to unpack the following archives:
    echo "        " ${MISSING}
fi
##  End of shell archive.
exit 0
=====================================================================
    usenet: tahorsley@ssd.harris.com  USMail: Tom Horsley
compuserve: 76505,364                         511 Kingbird Circle
     genie: T.HORSLEY                         Delray Beach, FL  33444
======================== Aging: Just say no! ========================