Relay-Version: version B 2.10 5/3/83; site utzoo.UUCP Path: utzoo!watmath!clyde!burl!ulysses!allegra!mit-eddie!genrad!decvax!decwrl!pyramid!amiga!skipper!cbmvax!carolyn From: carolyn@cbmvax.UUCP Newsgroups: net.micro.amiga Subject: Re: Graphics from Microsoft basic Message-ID: <421@cbmvax.cbmvax.cbm.UUCP> Date: Tue, 17-Jun-86 09:20:25 EDT Article-I.D.: cbmvax.421 Posted: Tue Jun 17 09:20:25 1986 Date-Received: Thu, 19-Jun-86 07:58:51 EDT References: <1048@nmtvax.UUCP> Reply-To: carolyn@cbmvax.UUCP (Carolyn Scheppner) Distribution: net Organization: Commodore Technology, West Chester, PA Lines: 569 In article <1048@nmtvax.UUCP> patrick@nmtvax.UUCP (Patrick Madden) writes: >Help! We need to print a graphics screen to an Epson printer (LX-80) >from a Microsoft basic program. There must be an easy way >to do this, so I'd appreciate it if someone could enlighten me. I hope this all gets through. I'll put the ScreenPrint program first. It requires an exec.bmap in the directory you are cd'd (CHDIR'd) to. Following ScreenPrint are NewConvertFD and exec_lib.fd in case you need to make the exec.bmap. I am also attaching dos_lib.fd in case you want to make yourself a New dos.bmap capable of xRead, xWrite, etc. Note - make sure you don't have any extra linefeeds (blank lines) at the end of each fd file before running NewConvertFD on it. =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= Carolyn Scheppner -- CBM >>Amiga Technical Support<< UUCP ...{allegra,caip,ihnp4,seismo}!cbmvax!carolyn PHONE 215-431-9180 =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= ---------------------------------------------------------------------------- REM ScreenPrint REM Carolyn Scheppner CBM 04/86 REM REM Graphic screen dump to the printer REM using exec library calls REM Requires exec.bmap REM Use Preferences to select options REM such as GrayScale and Negative REM *** Calling Program *** REM Custom Screen, some graphics w = 320: h = 200: d = 5 SCREEN 2,w,h,d,1 t$=" D = Draw P = Print Q = Quit " WINDOW 2,t$,,15,2 PALETTE 0,1,1,1 PALETTE 1,.2,.4,.8 GOSUB DrawLines: MainLoop: k$ = INKEY$ IF k$ = "d" THEN GOSUB DrawLines: ELSEIF k$ = "p" THEN BorderFlag% = 0 'No borders printed GOSUB ScreenDump REM Time to read any error msgs FOR de = 1 TO 5000: NEXT ELSEIF k$ = "q" THEN GOTO Quit: END IF GOTO MainLoop: Quit: WINDOW CLOSE 2 SCREEN CLOSE 2 END DrawLines: CLS RANDOMIZE TIMER FOR k = 1 TO 12 x1 = 80 + INT(RND(1) * (w - 160)) x2 = 80 + INT(RND(1) * (w - 160)) y1 = 40 + INT(RND(1) * (h - 100)) y2 = 40 + INT(RND(1) * (h - 100)) dx = 2 + INT(RND(1) * 3) IF RND(1) < .5 THEN dx = -dx dy = 2 + INT(RND(1) * 2) IF RND(1) < .5 THEN dy = -dy co = 1 + INT(RND(1) * 16) nl = 12 + INT(RND(1) * 10) FOR j = 1 TO nl LINE (x1,y1)-(x2,y2),co x1 = x1 + dx x2 = x2 + dx y1 = y1 + dy y2 = y2 - dy NEXT NEXT RETURN END ScreenDump: REM If first call of this routine REM declare the exec library functions REM which return values IF AlreadyDeclared = 0 THEN DECLARE FUNCTION AllocSignal%() LIBRARY DECLARE FUNCTION AllocMem&() LIBRARY DECLARE FUNCTION FindTask&() LIBRARY DECLARE FUNCTION DoIO&() LIBRARY DECLARE FUNCTION OpenDevice& LIBRARY AlreadyDeclared = 1 END IF REM Get addresses of the structures sWindow& = WINDOW(7) sScreen& = PEEKL(sWindow& + 46) sViewPort& = sScreen& + 44 sRastPort& = sScreen& + 84 sColorMap& = PEEKL(sViewPort& + 4) REM Get Screen width, height, modes maxWidth% = PEEKW(sScreen& + 12) maxHeight% = PEEKW(sScreen& + 14) viewModes% = PEEKW(sViewPort& + 32) REM Set up parameters for dump command command% = 11 'Printer command number srcX% = 0 'Send whole screen srcY% = 0 srcWidth% = maxWidth% srcHeight% = maxHeight% destRows& = 0 'Dump will compute destCols& = 0 special% = &H84 'FullCol | Aspect IF BorderFlag% = 0 THEN 'No Borders srcX% = srcX% + 3 srcY% = srcY% + 11 srcWidth% = srcWidth% - 3 - 11 srcHeight% = srcHeight% - 11 - 3 END IF LIBRARY "exec.library" REM *** CreatePort *** sigBit% = AllocSignal%(-1) ClearPublic& = 65537& msgPort& = AllocMem&(40,ClearPublic&) IF msgPort& = 0 THEN PRINT "Can't allocate msgPort" GOTO cleanup4 END IF POKE(msgPort& + 8), 4 'Type=NT_MSGPORT POKE(msgPort& + 9), 0 'Priority 0 portName$ = "MyPrtPort"+CHR$(0) POKEL(msgPort& + 10), SADD(portName$) POKE(msgPort& + 14), 0 'Flags POKE(msgPort& + 15), sigBit% sigTask& = FindTask&(0) POKEL(msgPort& + 16), sigTask& CALL AddPort(msgPort&) 'Add the port REM *** CreatExtIO *** ioRequest& = AllocMem&(64,ClearPublic&) IF ioRequest& = 0 THEN PRINT "Can't allocate ioRequest" GOTO cleanup3 END IF POKE(ioRequest& + 8),5 'Type=NT_MESSAGE POKE(ioRequest& + 9),0 'Priority 0 POKEL(ioRequest& + 14), msgPort& REM *** Open the Printer Device *** devName$ = "printer.device"+CHR$(0) pError& = OpenDevice&(SADD(devName$),0,ioRequest&,0) IF pError& <> 0 THEN PRINT "Can't open printer" GOTO cleanup2 END IF REM *** Dump the RastPort *** POKEWW(ioRequest& + 28), command% POKEL(ioRequest& + 32), sRastPort& POKEL(ioRequest& + 36), sColorMap& POKEL(ioRequest& + 40), viewModes% POKEW(ioRequest& + 44), srcX% POKEW(ioRequest& + 46), srcY% POKEW(ioRequest& + 48), srcWidth% POKEW(ioRequest& + 50), srcHeight% POKEL(ioRequest& + 52), destCols& POKEL(ioRequest& + 56), destRows& POKEW(ioRequest& + 60), special% ioError& = DoIO&(ioRequest&) IF ioError& <> 0 THEN PRINT "DumpRPort error =" ioError& GOTO cleanup1 END IF cleanup1: REM *** Close Printer Device *** CALL CloseDevice(ioRequest&) cleanup2: REM *** DeleteExtIO *** POKE(ioRequest& + 8), &HFF POKEL(ioRequest& + 20), &HFFFF POKEL(ioRequest& + 24), &HFFFF CALL FreeMem(ioRequest&,64) cleanup3: REM *** DeletePort *** CALL RemPort(msgPort&) POKE(msgPort& + 8), &HFF POKEL(msgPort& + 20), &HFFFF CALL FreeSignal(sigBit%) CALL FreeMem(msgPort&,40) cleanup4: LIBRARY CLOSE RETURN ---------------------------------------------------------------------------- 'Program: ConvertFd - created Aug 9, 1985 'This program converts .fd files, like 'graphics_lib.fd' to ' .bmap format files, like 'graphics.bmap', so BASIC ' programs can access libraries of machine language routines ' by name via the LIBRARY statement. ' ' Modified 01/86 by Carolyn Scheppner CBM ' Prepends an x to all function names which ' conflict with AmigaBasic keywords. ' See data statements at end of program for ' known conflicts. To call these functions, ' prepend an x (example xRead). ' Saves the .bmap file in current or specified ' directory (previously saved in LIBS:). ' For your program to access the .bmap via ' LIBRARY, it must be in the current dir ' or the LIBS: dir. ' As far as I know, you MUST name your .bmap ' libraryname.bmap. The libraryname is the ' part of the .fd file name before the _. ' (example dos.bmap from dos_lib.fd) DEFINT a-Z 'by default, all variables ares integer REM ******** for conflicting tokens ******** READ cnt 'count of conflicting tokens DIM con$(cnt) FOR k = 0 TO cnt-1: READ con$(k): NEXT REM **************************************** INPUT "Enter name of .fd file to read > ",fdFilename$ OPEN fdFilename$ FOR INPUT AS #1 INPUT "Enter name of .bmap file to produce > ",bmapFilename$ OPEN bmapFilename$ FOR OUTPUT AS #2 WHILE NOT EOF(1) GetLine IF char$ = "#" THEN 'lines which begin with "#" are command lines GOSUB GotCommand ELSEIF char$ = "*" THEN 'lines which begin with "*" are comment lines ELSE 'all other lines define a function in the library GOSUB GotFunction END IF WEND CLOSE END GotCommand: GetChar 'skip 1st "#" GetChar 'skip 2nd "#" GetToken IF token$ = "bias" THEN GetNum offset = -num END IF ram: RETURN GotFunction: GetToken 'token$=function's name REM **** prepend conflicting tokens with 'x' **** k$ = token$ FOR k = 0 TO cnt-1 IF k$ = con$(k) THEN token$ = "x" + token$ NEXT REM ********************************************** funcOffset=offset offset=offset-6 parms$="" SkipTill "(": IF char$="" THEN BadFileFormat SkipTill ")": IF char$="" THEN BadFileFormat GetChar IF char$<>"" THEN SkipTill "(": IF char$="" THEN BadFileFormat WHILE char$ <> ")" GetChar 'skip ( or , or / IF char$<>")" THEN GOSUB GetRegister IF register=0 THEN BadFileFormat IF register=-1 THEN PRINT "Warning: Function ";token$;" not included because it" PRINT " needs a parameter passed in a register BASIC cannot" PRINT " conform to." PRINT RETURN END IF parms$ = parms$+CHR$(register) 'tells BASIC which register to put this parm into END IF WEND END IF AddEntry token$,funcOffset PRINT #2,parms$; 'tells BASIC what registers to pass parms in PRINT #2,CHR$(0); 'marks end of function entry RETURN BadFileFormat: PRINT "Error: ";fdFilename$;" has a format error" PRINT "In line:";lineNum;":";buf$ PRINT "In column:";column CLOSE STOP 'map {d0,d1,d2,d3,d4,d5,d6,d7,a0,a1,a2,a3,a4} to {1,..,13} GetRegister: uchar$=UCASE$(char$) IF uchar$="D" THEN register=1 ELSEIF uchar$="A" THEN register = 9 ELSE register=0 'error RETURN END IF GetChar 'skip a or d i=ASC(char$)-48 IF i<0 OR i>7 THEN register=0: RETURN 'error GetChar 'skip digit register=register+i IF register>13 THEN register=-1 'error RETURN SUB AddEntry(nam$, liboffset%) STATIC highByte = PEEK(VARPTR(liboffset%)) lowByte = PEEK(VARPTR(liboffset%)+1) PRINT #2,nam$; CHR$(0); CHR$(highByte); CHR$(lowByte); END SUB SUB GetLine STATIC SHARED buf$,column,lineNum LINE INPUT #1,buf$ column = 0 GetChar lineNum = lineNum+1 END SUB SUB GetNum STATIC SHARED num,token$ GetToken num = VAL(token$) END SUB SUB GetToken STATIC SHARED buf$,char$,token$ SkipWhiteSpace token$="" uchar$=UCASE$(char$) WHILE ((uchar$>="A") AND (uchar$<="Z")) OR ((uchar$>="0") AND (uchar$<="9")) OR (uchar$="-") token$=token$+char$ GetChar uchar$ = UCASE$(char$) WEND END SUB SUB SkipTill(stopChar$) STATIC SHARED char$ WHILE (char$ <> stopChar$) AND (char$ <> "") GetChar WEND END SUB SUB SkipWhiteSpace STATIC SHARED char$ WHILE (char$=" ") OR (char$=CHR$(9)) GetChar WEND END SUB SUB GetChar STATIC SHARED column,char$,buf$ column = column + 1 char$ = MID$(buf$,column,1) END SUB REM **** conficting token count and tokens **** DATA 11 DATA abs, Close, Exit, Input, Open, Output DATA Read, tan, Translate, Wait, Write ---------------------------------------------------------------------------- ##base _SysBase ##bias 30 ##private *------ special functions --------------------------------------------- Supervisor() ExitIntr() Schedule() Reschedule() Switch() Dispatch() Exception() ##public InitCode(startClass,version)(D0/D1) InitStruct(initTable,memory,size)(A1/A2,D0) MakeLibrary(funcInit,structInit,libInit,dataSize,codeSize)(A0/A1/A2,D0/D1) MakeFunctions(target,functionArray,funcDispBase)(A0,A1,A2) FindResident(name)(A1) InitResident(resident,segList)(A1,D1) Alert(alertNum,parameters)(D7,A5) Debug() *------ interrupts ---------------------------------------------------- Disable() Enable() Forbid() Permit() SetSR(newSR,mask)(D0/D1) SuperState() UserState(sysStack)(D0) SetIntVector(intNumber,interrupt)(D0/A1) AddIntServer(intNumber,interrupt)(D0/A1) RemIntServer(intNumber,interrupt)(D0/A1) Cause(interrupt)(A1) *------ memory allocation: --------------------------------------------- Allocate(freeList,byteSize)(A0,D0) Deallocate(freeList,memoryBlock,byteSize)(A0/A1,D0) AllocMem(byteSize,requirements)(D0/D1) AllocAbs(byteSize,location)(D0/A1) FreeMem(memoryBlock,byteSize)(A1,D0) AvailMem(requirements)(D1) AllocEntry(entry)(A0) FreeEntry(entry)(A0) *------ lists: --------------------------------------------------------- Insert(list,node,pred)(A0/A1/A2) AddHead(list,node)(A0/A1) AddTail(list,node)(A0/A1) Remove(node)(A1) RemHead(list)(A0) RemTail(list)(A0) Enqueue(list,node)(A0/A1) FindName(list,name)(A0/A1) *------ tasks: --------------------------------------------------------- AddTask(task,initPC,finalPC)(A1/A2/A3) RemTask(task)(A1) FindTask(name)(A1) SetTaskPri(task,priority)(A1,D0) SetSignal(newSignals,signalSet)(D0/D1) SetExcept(newSignals,signalSet)(D0/D1) Wait(signalSet)(D0) Signal(task,signalSet)(A1,D0) AllocSignal(signalNum)(D0) FreeSignal(signalNum)(D0) AllocTrap(trapNum)(D0) FreeTrap(trapNum)(D0) *------ messages: ------------------------------------------------------ AddPort(port)(A1) RemPort(port)(A1) PutMsg(port,message)(A0/A1) GetMsg(port)(A0) ReplyMsg(message)(A1) WaitPort(port)(A0) FindPort(name)(A1) *------ libraries: ----------------------------------------------------- AddLibrary(library)(A1) RemLibrary(library)(A1) OldOpenLibrary(libName)(A1) CloseLibrary(library)(A1) SetFunction(library,funcOffset,funcEntry)(A1,A0,D0) SumLibrary(library)(A1) *------ devices: ------------------------------------------------------- AddDevice(device)(A1) RemDevice(device)(A1) OpenDevice(devName,unit,ioRequest,flags)(A0,D0/A1,D1) CloseDevice(ioRequest)(A1) DoIO(ioRequest)(A1) SendIO(ioRequest)(A1) CheckIO(ioRequest)(A1) WaitIO(ioRequest)(A1) AbortIO(ioRequest)(A1) *------ resources: ---------------------------------------------------- AddResource(resource)(A1) RemResource(resource)(A1) OpenResource(resName,version)(A1,D0) *------ new functions: ##private RawIOInit() RawMayGetChar() RawPutChar(char)(d0) RawDoFmt()(A0/A1/A2/A3) ##public GetCC() TypeOfMem(address)(A1); Procure(semaport,bidMsg)(A0/A1) Vacate(semaport)(A0) OpenLibrary(libName,version)(A1,D0) ##end ---------------------------------------------------------------------------- ##base _DOSBase ##bias 30 ##public Open(name,accessMode)(D1/D2) Close(file)(D1) Read(file,buffer,length)(D1/D2/D3) Write(file,buffer,length)(D1/D2/D3) Input() Output() Seek(file,position,offset)(D1/D2/D3) DeleteFile(name)(D1) Rename(oldName,newName)(D1/D2) Lock(name,type)(D1/D2) UnLock(lock)(D1) DupLock(lock)(D1) Examine(lock,fileInfoBlock)(D1/D2) ExNext(lock,fileInfoBlock)(D1/D2) Info(lock,parameterBlock)(D1/D2) CreateDir(name)(D1) CurrentDir(lock)(D1) IoErr() CreateProc(name,pri,segList,stackSize)(D1/D2/D3/D4) Exit(returnCode)(D1) LoadSeg(fileName)(D1) UnLoadSeg(segment)(D1) ##private GetPacket(wait)(D1) QueuePacket(packet)(D1) ##public DeviceProc(name)(D1) SetComment(name,comment)(D1/D2) SetProtection(name,mask)(D1/D2) DateStamp(date)(D1) Delay(timeout)(D1) WaitForChar(file,timeout)(D1/D2) ParentDir(lock)(D1) IsInteractive(file)(D1) Execute(string,file,file)(D1/D2/D3) ##end -- =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= Carolyn Scheppner -- CBM >>Amiga Technical Support<< UUCP ...{allegra,caip,ihnp4,seismo}!cbmvax!carolyn PHONE 215-431-9180 =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=