jimomura@lsuc.UUCP (05/10/87)
The following is the first program I've gotten to work on Microware
BASIC under OS-9 68K. As far as I can see it should work under 6809
versions without change, but I haven't tried it yet. It seems to me
that BASIC09/Microware BASIC programs will be important for a while
because it is the language supplied with future "Personal OS-9" systems.
Those who have not seen Microware BASIC may be interested in knowing
that this is in fact a fairly old language, yet has features which
weren't seen commonly in BASICs until later (BOOLEAN types and
structures, automatic formatting just to name a few):
PROCEDURE udecode
(* Udecode.bas -- decode a uuencoded file back to binary form
(*
(* Hacked for OS-9 by Jim Omura -- 87/05/08
(* from Patrick Simon's Atari BASIC version and a
(* couple of versions in C for Atari ST and Amiga.
(* Some credit to Berie Roehl and who knows who else.
(* This version is Public Domain.
(*
(* The following notes are from Simon's version:
(*
(* Slightly modified from a version posted to net.sources once;
(* suitable for compilation on an IBM PC.
(*
(* modified for Lattice C on the ST - 11.05.86 by MSD
(*
(* rewritten for ST BASIC on the Atari ST - September 9, 1986,
(* by Patrick Simon
(*
(* *********************************************************
(*
(* USAGE:
(*
(* udecode <inputfile >outputfile
(*
(* *********************************************************
(* Declarations: *)
BASE 1
DIM bdeclen:INTEGER
DIM byteout:INTEGER
DIM cchar:STRING[1]\ (* Current Character *)
DIM cntr:INTEGER\ (* Local counter for For Next Lps. *)
DIM infile:STRING[80]
DIM inline:STRING[80]
DIM mask:INTEGER
DIM more:BOOLEAN
DIM numl:INTEGER
DIM obuf:STRING[45]
DIM obfoffst:INTEGER
DIM obfpntr:INTEGER
DIM outbyte(4):INTEGER
DIM outfile:STRING[80]
DIM stderr:INTEGER
DIM stdin:INTEGER
DIM stdout:INTEGER
DIM spc:INTEGER
DIM sptr:INTEGER\ (* String Pointer *)
(* Set Constants: *)
mask=63
spc=ASC(" ")
stdin=0
stdout=1
stderr=2
(* Initializations: *)
byteout=0
obfpntr=ADDR(obuf)
more=TRUE
numl=0
READ #stdin,obuf\ (* Input and ignore original filename. *)
(* Now set up screen for user.
(* CLEARW 2
(* GOTOXY 1,2 \ PRINT "Decoding "; infile; " to "; OFILEN$
(* GOTOXY 1,4 \ PRINT "# lines read in: "
(* GOTOXY 1,5 \ PRINT "# bytes output: "
IF EOF(#stdin) THEN
more=FALSE
ENDIF
LOOP
EXITIF NOT(more) THEN
ENDEXIT
READ #stdin,inline\ (* Get a Line *)
IF inline="end" THEN
more=FALSE\ (* All done *)
ELSE
numl=numl+1
(* For each line, must "decode" each byte.
(* First byte contains # bytes to ***output*** from this
(* line. Then, after decoding, each set of 4 input bytes
(* contains 6*4 = 24 bits of information to output, 8
(* bits per output byte, thus 3 output bytes.
sptr=1\ (* Set up string position pointer for inline *)
GOSUB 1000\ (* Get first byte = # bytes to output *)
bdeclen=C
N=bdeclen
IF bdeclen=0 THEN \ (* No Data - 2nd end of file exit *)
more=FALSE
ELSE \ (* Process one line of input *)
obfoffst=0\ (* Reset Offset pseudo-register *)
WHILE N>0 DO \ (* Decode set of 4 input bytes. *)
FOR cntr=1 TO 4
GOSUB 1000
outbyte(cntr)=C
NEXT cntr
C1=LAND(outbyte(1)*4,$ff)+INT(outbyte(2)/16)
C2=LAND(outbyte(2)*16,$ff)+INT(outbyte(3)/4)
C3=LAND(outbyte(3)*64,$ff)+outbyte(4)
IF N>0 THEN \ (* Write up to 3 bytes dep. on No. decoded *)
POKE obfpntr+obfoffst,C1
obfoffst=obfoffst+1
ENDIF
IF N>1 THEN
POKE obfpntr+obfoffst,C2
obfoffst=obfoffst+1
ENDIF
IF N>2 THEN
POKE obfpntr+obfoffst,C3
obfoffst=obfoffst+1
ENDIF
N=N-3\ (* Dec. waiting *)
ENDWHILE \ (* If more in this line, go back again. *)
(* Finished processing line. *)
PUT #stdout,obuf\ (* Send decoded stuff to output file. *)
byteout=byteout+bdeclen\ (* Show status to user. *)
(* GOTOXY 20,4 \ PRINT numl
(* GOTOXY 20,5 \ PRINT byteout
ENDIF \ (* 2nd EOF exit *)
ENDIF \ (* 1st EOF exit *)
ENDLOOP
(* Close files if openned *)
END
(* ********************************************* *)
1000 (* Subroutine to decode a single character *)
IF LEN(inline)-sptr=0 THEN
inline=inline+" "
ENDIF
cchar=MID$(inline,sptr,1)
sptr=sptr+1
C=LAND(ASC(cchar)-spc,mask)
RETURN
--
Jim Omura, 2A King George's Drive, Toronto, (416) 652-3880
ihnp4!utzoo!lsuc!jimomura
Byte Information eXchange: jimomura