; LOaDPT 9/84-1/17/85, A. B. Langdon››; Read executable file to see where ›; its segments load and its entry point(s).››SET $491=$4000 SET 14=$491^›PROC go=*()[$6C $2E2] MODULE; try Long's fix instead of BYTE rts=[$60]›;INCLUDE "D:SYSLIB.ACT"›;INCLUDE "D:SYSIO.ACT"››; Close using channel 1 caused "system error" with DOS 2.1 but not DOS XL.›; ACS bbs has a block read (BLKIO.ACT) in machine code segments that is›; smaller and has a general purpose call to CIO. Here, I'll leave mine›; as it illustrates use of the language and is just as fast.››; First global CARD ARRAY will be placed AFTER rest of program.›CARD ARRAY buffer(1) ; locate the buffer.››CARD FLen, ; File length up to 64K› i, CSum0, CSum1›BYTE OpOK››BYTE CIO_status ; global for CIO return value (per ACS convention)››CARD FUNC GetAD(BYTE chan CARD addr, len) ; Block read› TYPE IOCB=[BYTE hid,dno,com,sta › CARD badr,put,blen › BYTE aux1,aux2,aux3,aux4,aux5,aux6]› IOCB POINTER ic› BYTE chan16› BYTE POINTER b› chan16 = (chan&$07) LSH 4› ic = $340+chan16› ic.com = 7 ; read› ic.blen = len› ic.badr = addr› [$AE chan16 $20 $E456 $8C CIO_status] ; LDX chan, JSR CIO; STY CIO_status› IF CIO_status = $88 THEN EOF(chan)=1 FI› FLen ==+ ic.blen ; this to RETURN is special to this application.› b = addr› FOR i = 1 TO ic.blen DO› ; note CSum1 is affected by trailing zeroes (OS/A v.4).› CSum0 ==+ b^› CSum1 ==+ CSum0› b ==+ 1› OD›RETURN (ic.blen)››CARD FUNC GetCD(BYTE chan) ; Read a word› CARD c› GetAD(chan,@c,2)›RETURN (c)››PROC FixFlSp(BYTE ARRAY FileSpec)› IF FileSpec(2)<>': AND FileSpec(3)<>': THEN ; prefix "D:" to file name› FileSpec^==+2› i=FileSpec^› WHILE i>2 DO› FileSpec(i)=FileSpec(i-2)› i==-1› OD› FileSpec(1)='D FileSpec(2)=':› FI›; Could also convert to upper case: if >$60 then subtract $20.›RETURN››PROC SysErr(BYTE errno)››PROC MyError(BYTE errno)› IF errno=$80 THEN Error=SysErr Error(errno) FI› PrintF("error %I. Try again%E",errno)› OpOK=0›RETURN››PROC End=*() [$68$AA$68$CD$2E8$90$5$CD$2E6$90$F3 $48$8A$48$60]›; entry: PLA; TAX; PLA; CMP MEMLO+1; BCC lab; CMP MEMTOP+1; BCC entry;›; lab: PHA; TXA; PHA; RTS›; Trace back thru RTS's and return to cartridge or DOS.›; From ACS bulletin board.››PROC LoadPt()› CHAR ARRAY FileSpec(20)› BYTE b › CARD fwa, lwa, BufLen, MEMTOP=$2E5, MEMLO=$2E7› BufLen=MEMTOP-$80-buffer› SysErr=Error› DO› Print("File Spec=")› InputS(FileSpec)› IF FileSpec^=0 THEN END() FI› FixFlSp(FileSpec)› Close(2)› OpOK=1 Error=MyError Open(2,FileSpec,4,0)› UNTIL OpOK OD› Error=SysErr› FLen=0 CSum0=0 CSum1=0› › i=GetCD(2)› IF i<>$FFFF THEN ; is it a LOAD file?› PrintF("Bad load file header=%H%E",i)› Close(2)› RETURN› FI›› DO; Code block› DO › fwa=GetCD(2)› IF fwa=0 OR EOF(2)<>0 THEN ; may get 0 before EOF in DOS 4.› PrintF("End of file. %H bytes%E",FLen)› PrintF(" checksum=%H%H%E",CSum0,CSum1)› Close(2)› RETURN› FI› UNTIL fwa<>$FFFF OD; Skip embedded $FFFF› lwa=GetCD(2)› IF (fwa=$2E2 OR fwa=$2E0) AND lwa=fwa+1 THEN› IF fwa=$2E0 THEN Print("INIT") FI› IF fwa=$2E2 THEN Print("RUN") FI› i=GetCD(2)› PrintF(" at %H%E",i)› fwa==+2› ELSE› PrintF("fwa, lwa %H %H%E",fwa,lwa)› IF fwa=fwa DO ; just pass over these bytes› i=lwa-fwa+1 IF i>1000 THEN i=1000 FI› i=GetAD(2,buffer,i) › fwa==+i› OD› OD› Close(2)›RETURN››PROC Main()› device=0 ; in case MAC/65 has been here› DO› LoadPt()› PrintE(" (RETURN to end)")› OD›RETURN››