Below is the version of the Psion Printer II manual used from 1989 onwards. See also:
Psion Printer II Manual (1988)
Notes on the Psion Printer II
Repairing the Psion Printer II
© Copyright Psion PLC 1988
All rights reserved. This document and the programs referred to herein are copyrighted works of Psion PLC, London, England. Reproduction in whole or in part including utilisation in machines capable of reproduction or retrieval, without the express permission of Psion PLC, is prohibited. Reverse engineering is also prohibited.
The information in this document is subject to change without notice.
Psion and the Psion logo are registered trademarks of
Psion Organiser II, Datapak and Rampak are trademarks of Psion PLC.
The Psion Printer II produces dot-matrix quality printout, unlike the illustration on the cover of this manual.
Part No. 6100-0060
Introduction 1 Setting up Inserting the Organiser Power Paper 2 Basic printing Printing the screen, blank lines and records Listing OPL procedures Printing notes Printing from OPL: LPRINT Printing addresses (MAIN) 3 Further printing from OPL Control codes: Changing character width Moving print position Printing to Comms Link OPL errors Example: Printing the diary 4 Graphics Appendix: Specifications and character set
The Psion Printer II connects with your Organiser II to provide a portable system for producing printed output wherever you need it. The printer is ideal for producing hard copy from any Organiser application, whether a purchased product (such as the Pocket Spreadsheet} or your own program written in OPL, the Organiser Programming Language.
The printer can be set to print wide or narrow characters, you can underline characters or make them double height, and you can do dot-by-dot graphics printing.
You can power the printer either from a rechargeable battery or via a mains power adaptor. The printer comes complete with both, together with a roll of thermal paper.
The printer can be used with all versions of the Organiser II. The software which is built into the printer uses about 2.5K of the Organiser's memory, which reduces the amount of memory available for other applications. This is more significant on the 8K Organiser II model CM than on higher memory models.
The Organiser II connects with the Psion Printer II by fitting into the purpose-built cavity within the printer (see below). The cavity contains a connector which slots into the top port on the Organiser.
Before connecting the Organiser to the printer you must turn the Organiser OFF. Then
Before removing the Organiser from the printer, make sure the Organiser is turned off.
Although it connects with the top port on your Organiser, the Psion Printer II contains its own top port (positioned on the left side of the printer) into which you can still plug other devices, such as a Comms Link lead.
The printer does not have an ON/OFF switch, because it is automatically turned on and off by the Organiser. Pressing ON/CLEAR turns the printer on, selecting OFF from me main menu turns the printer off; but to save power the Organiser also turns the printer off whilst it is performing other tasks and not using the printer.
Whenever you plug in to the mains, you also recharge your batteries if they are not already full charged. This recharging takes place regardless of whether the printer is connected to the Organiser at the time. You can disconnect the Organiser or be printing during the recharging. A flat battery takes 12 to 14 hours to recharge fully.
If you run the printer from fully charged batteries, instead of the mains, you can print continuously for about 1 hour.
If you don't have an Organiser Mains Adaptor, you can instead use the printer's mains adaptor to power an Organiser II which is not connected to the printer. A mains adaptor interface is included in the printer package: plug this into the top port of the Organiser and then plug the printer mains adaptor lead into the interface.
You must not use an Organiser II Mains Adaptor to power the printer, because of the printer's greater power consumption.
While the mains adaptor is connected it also powers the Organiser. If you run the printer from its batteries, not from the mains, the Organiser will also draw power from the printer's battery if its own battery becomes low on power. The printer, however, will never take power from the Organiser's battery.
Additional rolls of paper are available from Psion. If you wish to obtain paper from another supplier, the correct paper is specified at the end of the manual, but using the wrong paper can dramatically reduce the life of the print head.
To fit a new paper roll:
The Psion Printer II contains software which must be loaded into the Organiser before you can print. To do this, connect the Organiser to the printer, press ON/CLEAR to turn the Organiser on, then press ON/CLEAR again while you're in the main menu.
The printer software takes up about 2.5K of Organiser internal memory. If there is not enough space, an OUT OF MEMORY message will be displayed. You will then need to free some memory by deleting some programs, diary entries, data files or records from device A: before trying to load the printer software again.
The screen doesn't change while the software is being loaded.
Once the software is loaded, you can
Printing from other products is described in the operating manual supplied with them. Printing from within an OPL program is described in Chapter 3. This chapter describes the other two operations.
When you have finished using the printer, turn the Organiser off, disconnect it from the printer, return to the main menu and press ON/CLEAR again. The second ON/CLEAR removes the printer software from the Organiser memory, freeing it for other uses.
If your printer batteries are low (which they will be if you are using the printer for the first time), before starting to print plug the printer into the mains and let the batteries charge up for fifteen minutes or so (definitely not for less than three minutes).
Then, when you have connected the Organiser to the printer and loaded the printer software, experiment with these controls, which are immediately available to you:
If you press ON/CLEAR while the printer is printing it immediately stops. This can leave the print head in any position, so to return to the left margin hold down the SHIFT key and press SPACE.
Printing out one of your OPL procedures is also very easy. Simply go to the PROG menu and select the LIST option. Enter the procedure name - pressing MODE, if necessary, to select the device. Now press EXE and the procedure is listed to the printer.
You can use the OPL editor as a text editor if you want to type notes and print them, using the LIST option, as if they were an OPL procedure.
The OPL command to send a text string to the printer is LPRINT. To see how this command works enter this procedure:
print: LOCAL a$(20) LPRINT "**********" PRINT "Enter name" INPUT a$ LPRINT a$ LPRINT "**********"
When you run this procedure you will need to press SHIFT SPACE a couple of times to scroll the paper up so that you can see what you've printed.
Notice that on the printout the lines of asterisks appear above and below the name entered, not before and after it on the same line. This is because LPRINT automatically adds a carriage return to the end of the text string printed - moving the print position to the start of the next line.
LPRINT has the same syntax as the PRINT command and operates in the same way except that LPRINT writes to the printer rather than to the display. The syntax of both PRINT and LPRINT are described in the Organiser II Operating Manual.
LPRINT "HELLO WORLD";
It is a good idea to use a single LPRINT command at the start of your OPL programs, to bring the printer head back to the left hand margin in case it had finished somewhere else.
You could print your Main data file by bringing each record to the screen with the FIND option and then pressing SHIFT and ←. A much quicker way to do this is to write a small OPL program.
The procedure below opens the main data file, A:MAIN. Each record in this file is made up of a number of lines ('fields') and you need to specify each of these lines to be printed: A.F1$ (the first field) to A.F6$ (the sixth field - include more fields if you have more than six lines in your addresses). The procedure prints each record in turn until it has printed them all ('while not end of file'): it then closes the data file, waits for you to press a key and returns you to the PROG menu from which it was run.
address: LPRINT "Addresses" LPRINT "---------" OPEN "A:MAIN",A,F1$,F2$,F3$,F4$,F5$,F6$ WHILE NOT EOF LPRINT LPRINT A.F1$ LPRINT A.F2$ LPRINT A.F3$ LPRINT A.F4$ LPRINT A.F5$ LPRINT A.F6$ NEXT ENDWH CLOSE
This Procedure assumes that your addresses are in the MAIN data file, A:MAIN. You could adapt the procedure to print the contents of your MAIN file on pack B: by changing 'OPEN "A:MAIN",A,F1$...' to 'OPEN "B:MAIN",A,F1$,...'
For further information about data files see the relevant Chapter in the main Organiser Operating Manual.
The Psion Printer II can print at 20, 40, 60 or 80 characters per line (i.e. narrow or wide characters), can underline or print characters at double height. By default the printer is set to print 40 normal characters. To change this, send a 'control code' to the printer. Control codes are ASCII characters which you access with the CHR$ function. So to send the code for 20 column mode, use an LPRINT like this:
The trailing semi-colon stops LPRINT from sending an unwanted carriage return. To change the character width in the middle of a line send the code like this:
LPRINT "String"+CHR$(14)+"Next String"
Only the characters sent after the control code will be printed in the new width.
The controls supported by the Psion Printer II are:
|14||20 COLUMN MODE - sets the printer to 20 characters per line. Changing from 40 column mode to 20 column mode as the effect of producing double width characters.|
|15||40 COLUMN MODE - sets the printer to 40 characters per line. The printer prints in this mode by default.|
|23||60 COLUMN MODE - sets the printer to 60 characters per line.|
|22||80 COLUMN MODE - sets the printer to 80 characters per line.|
|21||START UNDERLINE - causes any subsequent characters to be underlined, until a STOP UNDERLINE command is sent.|
|24||STOP UNDERLINE - stops the underlining of characters.|
|17||DOUBLE HEIGHT - causes the entire current line to be printed in double height (even characters already sent are affected, since no characters are actually printed until the carnage return is received at the end of the LPRINT string - see ASCII 13 below). The printer automatically reverts to normal height on the following line.|
The following procedure is a convenient way for you to change character width setting in between different print jobs. It presents you with a menu of the different settings and then sends to the printer the relevant control code for the setting you select.
WIDTH: LOCAL a% a%=MENU("20Col,40Col,60Col,80Col") IF a%=0 RETURN ELSEIF a%=1 LPRINT CHR$(14) PRINT "20 Columns Set" ELSEIF a%=2 LPRINT CHR$(15) PRINT "40 Columns Set" ELSEIF a%=3 LPRINT CHR$(23) PRINT "60 Columns Set" ELSEIF a%=4 LPRINT CHR$(22) PRINT "80 Columns Set" ENDIF PAUSE 40
You can also use control characters to position the printer head:
|9||TAB - moves the printer position to the centre of the paper. This has no effect if the printer is already positioned to the right of the centre point.|
|12||FORM FEED - causes previously sent characters to be printed and feeds the paper by three lines.|
|13||CARRIAGE RETURN - causes previously sent characters to be printed and moves the printer position to the start of the next line.|
If the text string sent to the printer is so long that the printer reaches the end of a line without having received a carriage return, the printer will automatically 'run on' - printing the first line of text, then going to the start of the next line and printing the rest of the string.
If this happens when the text string is exactly the width of the column (so that the printer immediately receives a carriage return at the beginning of the new line) the carriage return sent by LPRINT is ignored. This prevents unwanted blank lines appearing on your printout. So, for example, an LPRINT of a 40 character string in 40 column mode will always position to the next line, whether or not the string was followed by a semi-colon.
Common problems which occur are:
By putting commas or semicolons between different strings in the same LPRINT statement, you can make several strings appear on the same line. But the text is not actually printed until one of the following occurs:
When you end an LPRINT with a semi-colon or a comma you are suspending the printing of the string, because you have overridden the carriage return usually sent and which instructs the printer to print. The instructions that you give to the Organiser during this pause might be such that the string never gets printed, but is lost, because the Organiser turns the printer off while it isn't actually printing. It does this to save power.
An example of this is if you were to follow an LPRINT statement ending in a comma or semi-colon with an OPL command or function which uses the keyboard - that is INPUT, GET, KEY or a PAUSE of 0 or below. While the Organiser waits for the keypress it switches the printer off.
So if you do have to access the keyboard during an OPL program which uses the printer, build up complete lines of text in the program, and LPRINT them without using a semi-colon.
You can in fact use this feature to help conserve power when running your printer from the battery. If an LPRINT command which does cause a carriage return is followed by a gap when nothing is printed, follow the LPRINT with a harmless keyboard command such as KEY. This may cause a slight pause in your OPL program while the printer finishes printing the text from the LPRINT, but the printer will then turn off and use no power until the next printer command occurs.
If Comms Link is connected to the printer (via the 'top port' on the left side of the printer) the LPRINT command will by default send data to the printer rather than via the Comms Link lead. To divert the data to Comms Link, use the XPRINT% command. This is added to OPL by the printer software that you load when you first connect the Organiser and the printer. XPRINT% is also the command for diverting the data back to the printer from Comms Link. Include
in your procedure to direct LPRINTs to Comms Link, and:
to make LPRINT revert back to the printer.
If you request the value of XPRINT%, it will return 0 if LPRINT is going to Comms Link, and 1 if it is going to the printer. For example:
A%=XPRINT%:(0) IF A%=1 XPRINT%:(1) ELSEIF XPRINT%:(0) ENDIF
Note that any call to XPRINT%: must supply an argument - either (0) or (1) - even if you only want to find out what its value currently is. So in the procedure above, the ELSEIF statement is unnecessary, since the A% call has already set XPRINT%: to the value 0.
For further details of printing via Comms Link see the Comms Link manual.
If your OPL program contains XPRINT% references and it gives a MISSING PROC error when run, it is possible that you have not loaded the printer's software into the Organiser's memory. This situation causes a DEVICE MISSING error if you use the LPRINT command. Just return to the main menu and press ON/CLEAR to load the printer software.
As well as the standard errors listed in your Organiser II manual (such as DEVICE MISSING), the Psion Printer II can return three other error numbers to OPL, as follows:
184 : PRINTER BATT LOW - the voltage of the rechargeable battery has fallen too low to run the printer. Power the printer from the mains supply, which will also start recharging the battery.
183 : PRINTER TIMEOUT - an LPRINT has failed because the printer did not respond. This indicates an hardware problem such as a paper jam.
182 : PRINTER ESCAPE - ON/CLEAR was pressed while the printer was printing.
Unless you use the OPL command ONERR and write some OPL to deal with those particular errors, they will cause *** ERROR *** to be displayed, and the program will stop.
The procedure below prints out your diary from the first entry until the end of the month you specify (1-12).
PDIARY: LOCAL BASE%,LEN%,C%,END% LPRINT chr$(15) BASE%=PEEKW($2004) PRINT "Print to end of month (1-12) "; INPUT END% CLS :PRINT "Printing..." A:: LEN%=PEEKB(BASE%) IF LEN%=0 CLS :PRINT "END OF DIARY" LPRINT :LPRINT :LPRINT :LPRINT :LPRINT :LPRINT RETURN ENDIF LPRINT IF PEEKB(BASE%+2)+1<=END% IF PEEKB(BASE%+3)<9 LPRINT "0"; ENDIF LPRINT (PEEKB(BASE%+3)+1);"/"; IF PEEKB(BASE%+2)<9 LPRINT "0"; ENDIF LPRINT (PEEKB(BASE%+2)+1);"/"; LPRINT PEEKB(BASE%+1);" "; IF PEEKB(BASE%+4)<9 LPRINT "0"; ENDIF LPRINT PEEKB(BASE%+4);":"; IF PEEKB(BASE%+5)=0 LPRINT "00 "; ELSE LPRINT "30 "; ENDIF LPRINT C%=PEEKB(BASE%) BASE%=BASE%+7 DO LPRINT CHR$(PEEKB(BASE%)); C%=C%-1 BASE%=BASE%+1 UNTIL C%=0 LPRINT GOTO A:: ENDIF
The PEEKB statements look up the date, time and text of the various diary entries.
You can print bit-image graphics on your Psion Printer II by using the GPRINT command. However, you cannot mix text and graphics on the same line of printout; GPRINT simply discards any text characters.
Printing graphics is slower than printing text - the maximum time to print a line of graphics is 3 seconds. Graphics printing also uses more power than text printing, which may be significant if you are running your printer on battery power rather than from the mains. If you have periods between GPRINTs when nothing is printed, you can conserve power by following each GPRINT with a keyboard command such as KEY, as explained in Chapter 3 under 'More about LPRINT'.
Like LPRINT, GPRINT sends a carriage return at the end of the print string. GPRINT positions to the left margin before printing, and to the left margin of the next line after printing.
On the Psion Printer II, graphics images are made up of vertical lines 8 dots high read horizontally across the page:
This is reflected in the way you call GPRINT, with 2 parameters:
The easiest way to supply a memory address is to declare a variable. The declaration consists in the Organiser setting aside a certain region of memory for the variables' values. You can then use the OPL function ADDR to make the Organiser find out for itself where the region of memory is.
The first parameter must be an integer between 1 and 256 inclusive (the printer page is 256 columns wide). For each of these columns you must give a numeric value. This value determines the pattern. To work out the value you need, think of each dot as having a value:
These values allow each pattern to be 'named' by its number, since every combination of these numbers (none of the numbers chosen more than once) makes a unique total.
To work out the value of the byte, add the values of the dots you want to set. So if you wanted just the top two dots of the eight to be drawn, the byte of data should have the value 64+128=192. The following two bytes would have the values 6 (2+4) and 138 (2+8+128).
Once you have worked out the value you want, you need to give this value to the relevant memory location. The easiest way of doing this is simply to assign that value to the variable. For example, to print a diamond shape, you could declare a string variable and add in it the values of the bytes you want to print, like this:
diamond: LOCAL a$(5) a$=CHR$(8) a$=a$+CHR$(20) a$=a$+CHR$(34) a$=a$+CHR$(20) a$=a$+CHR$(8) GPRINT:(5,ADDR(a$)+1)
When you add values to string variables, what you add remains intact as a distinct element of the 'total' - e.g. if a$="abc"+"def" the value of a$ would be abcdef. Each of the characters added uses a separate byte, as below. This makes string variables suitable to use with GPRINT.
Note that the first byte you want GPRINT to look at is one from the beginning of the string, so +1 is included in the GPRINT bracket. (The header identifies the variable as a string variable.) The CHR$ function is necessary to pass the numeric values to the string variable.
An alternative way to give bytes the required values is to use POKEB statements in combination with the ADDR function. Further details of these are given in the Organiser II Operating Manual.
This procedure generates the curve of the formula y=20sinx+10cosx. It uses an intelligent loop to work out the different values to add to a string variable.
curve: LOCAL ymin%,ymax%,xstart%,x%,y%(256) LOCAL passes%,byte%,p$(255) ymin%=-50 ymax%=50 xstart%=-127 x%=xstart% ONERR zero:: PRINT "Calculating y(x)" DO AT 5,2 PRINT "y(";x%;") " x%=x%+1 y%(x%-xstart%)=20*SIN(RAD(x%*10))+ 10*COS(RAD(x%*8)) † IF y%(x%-xstart%)>ymax% OR y%(x%-xstart%)<ymin% zero:: y%(x%-xstart%)=0 ENDIF UNTIL x%=255+xstart% ONERR OFF passes%=int(ymax%/8) CLS PRINT "Printing..." DO x%=1 DO IF x%+xstart%=0 byte%=255 ELSEIF y%(x%)<>0 AND y%(x%)>passes%*8 byte%=2**(y%(x%)-passes%*8) y%(x%)=0 ELSE byte%=0 ENDIF IF passes%=0 byte%=byte% OR 1 ENDIF p$=p$+CHR$(byte%) x%=x%+1 UNTIL x%=255 GPRINT:(255,ADDR(p$)+1) p$="" passes%=passes%-1 UNTIL 8*(passes%+1)<ymin%
Another interesting curve is generated by the equation x%*(x%-50)*(x%+25)/1500.0 Enter this, or another formula of your choice at †. The formula must be in the form y(x)=f(x), with y(x) replaced with the expression y%(x%-xstart%) and x with x% on the right hand side.
For a list of OPL errors possible during use of GPRINT (they are the same as for LPRINT), see 'OPL errors' in Chapter 3.
Print Method: Thermal 5 x 9 dot matrix
Print Mechanism: Epson 1221
Print Speed: 0.8 lines/second
Paper Roll: Thermal (Jujo TF50 KS-C), 30-112mm width
Print Width: 100mm
Column Capacity: 20, 40, 60 or 80 columns
Character Size (40 column): 1.7mm x 2.4mm
Character Size (80 column): 0.85mm x 2.4mm
Line Spacing: 4.2mm ± 10% (12 dot feed]
Printer Input Voltage: 9 to 11.5V DC
Power Supply Voltage: 10.5V DC 600 mA
Head Voltage: 4.3 to 5.4V DC
Motor Voltage: 4.6 to 5.6V DC
Battery Duration: 1 hour continuous printing from full recharge
Ambient Temperature: 0°C to 40°C
Head Reliability: MCBF 300,000 lines
Mechanism Reliability: MCBF 500,000 lines
Size: 253 x 153 x 76mm
The design and specification of the Psion Printer II may change without notice.
Replacement Nickel-Cadmium batteries are available from Psion.
The Psion Printer II character set (slightly different from the Organiser II character set) is given on the following pages.
The characters are based on a 7 by 5 array of dots. Characters with descenders below the line, such as 'p', 'g' and 'y', are moved down by 2 dots when printed.
The full character set conforms to the Psion Organiser II multi-national character set. Characters with codes exceeding 127 may not a with those on a particular model of the Organiser, but all of the commonly used characters (those with ASCII values between 32 and 127) are the same as those on any Organiser II.
If your text includes user defined characters (those with ASCII values from 0 to 7) they will appear the same as on the Organiser screen when printed except that the bottom row of the eight will always be blank. For more information on user defined characters, see your Organiser II Operating Manual.