Copy Link
Add to Bookmark
Report
Syndicate ZMagazine Issue 192
==(((((((((( == Z*MAGAZINE - ATARI 8-BIT ONLINE MAGAZINE
=========(( === ----------------------------------------
=======(( ===== April 24, 1991 Issue #192
=====(( ======= ----------------------------------------
==(((((((((( == (c)1986-87-88-89-90-91, Z*Net Publishing
Rovac Industries, Inc.
Post Office Box 59
Middlesex, New Jersey 08846-0059
Z*Net BBS (908) 968-2024
EDITORS DESK
============
by Ron Kovacs
This issue contains programming information and a review. The next
edition will contain more 8-bit only information and be available next
week, April 30, 1991.
DEFAULT DRIVER PLUS
===================
Reprinted from the Australian Atari Gazette
(edited by Ron Kovacs)
by Peter Bailey
The following short program makes several alterations to the AtariWriter
Plus printer driver F (XMM801). Before making any adjustments you
should know more about the AP.OBJ file.
Each data line contains the total information for each alteration and
may be deleted if not required. The format for each line is (XL
Version) sector, byte, (XE Version) sector, byte, number of bytes to
change and data. In some cases the format is repeated until all the
necessary alterations were made. NOTE: DO NOT ALTER THE DATA
STATEMENTS.
Line 80 changes [SELECT] [.] from Double Strike (two passes) to Bold
(one pass). NOTE: Bold is only available with Pica.
Line 90 changes [CONTROL] [G] 4 (superscript) and [CONTROL] [G] 5
(subscript) from condensed to current type face or selected type face,
e.g. for elite subscript when using pica select elite first and then
condensed, [CONTROL] [G] 6 [CONTROL] [G] 5, then return to pica,
[CONTROL] [G] 1, when subscript is finished.
Line 100 allows selection of condensed after using elite. Previously
this was not possible as elite was not cancelled first. This is done by
having condensed first select pica (to cancel elite) and then sending
the required printer code.
EO 10 V=2:OPEN #1,12,0,-D:AP.OBJ-:NOTE #1,S1,B1:S2=S1+194:B2=B1+20
YW 20 POINT #1,S2,B2:GET #1,A:IF A=224 THEN V=1:REM XL VERSION
QF 30 READ A:IF A=-1 THEN 70
EI 40 READ B,C,D,E:S=S1+A:B=B1+B
GI 50 IF V=2 THEN S=S1+C:B=B1+D
PN 60 POINT #1,S,B:FOR X=1 TO E:READ Y:PUT #1,Y:NEXT X:GOTO 30
YA 70 CLOSE #1:END
LG 80 DATA 191,123,27,57,1,70,192,1,27,60,1,69
CJ 90 DATA 192,42,27,101,1,17,192,51,27,110,1,17
SQ 100 DATA 192,15,27,74,19,7,27,19,27,84,27,112,0,9,27,19,27,20,27,84,27,112,0,6
FY 110 DATA -1
The screen color of AtariWriter Plus is 144. If you would prefer a less
contrast border, why not use 146 instead of 0. To make the change,
simply add the following line to the above listing. You may prefer to
preview the combination first, so with BASIC type 'POKE 710,144:POKE
712,146'.
THE WORKBENCH
=============
(Reprinted from the Mid-Florida Atari Computer Club Bulletin)
by Len Spencer
This is probably one of the last articles original to me for a while,
but I will try to bring you some of the best fixes, modifications, and
other projects of other authors in the coming months. In this article
however, I will try to give a little help on fixing one of the more
common breakdowns, the keyboard. I'm sure quite a few of you have an
Atari in the closet with a keyboard that has gone belly-up in one way or
another. You would like to put that machine to use again, or would like
to sell it for the best price as a working computer, so let's dig right
in.
The 400's membrane keyboard was a joke from the git-go. The only
solution there is replacement, and a lot of people replaced them with
third party keyboards. Since there were so many manufacturers, I can't
even begin to cover them all here.
With the 800's, as well as the 800XL, there were more than one design of
keyboards, by far the most durable of which was the full stroke,
contact-switch type. Stackpole was one of the major manufacturers here.
While I'm notsure about what percentage of 800's used this type, not
many of the 800XL's had them. If you should happen to have an 800 or
800XL with a Stackpole keyboard, then you should have very little if any
problems with it. If you lose function of a key here, a nice bath with
a good tuner cleaner will take care of even the nastiest keys. If that
doesn't work, then the keyswitch can be replaced.
The other was the printed circuit contact sheet, where conductive paint
traces were silkscreened onto plastic sheets. My 800 is one of these,
manufactured by Mitsumi, and a lot of the 800XL's were made by Chelco.
Here you must exercise a little more caution. DO NOT use any solvent
type cleaner or you will wash the traces right off. The only thing you
can use here is a little water and a soft cloth. Even alcohol will
discolor the traces and raise the resistance. If a trace is broken, a
little dab of conductive paint, available at any electronic supply
store, will fix it up nicely. If the key still doesn't work, try giving
the spring that presses against that contact a little stretch. Be
careful here, as it is easy to go too far and have the key stick on all
the time. Remember, it is easier to stretch a spring than it is to
shorten it, (cutting it is -NOT- an acceptable alternative!!). If the
problem is a key sticking on all the time, try it with the pressure
spring removed. If it stops repeating, then shorten the pressure spring
by squeezing it down with gentle pressure. If it still sticks, then
take the separator sheet (the one with all the holes in it), and add a
piece of scotch tape over the corresponding hole, and cut out the tape
where it covers the hole. Don't use masking tape or anything like that,
as it is too thick. You should never use more than two layers of scotch
tape for this type of repair. If it still sticks after two, then
replace the keyboard or use the computer for parts. There are quite a
few 800XL's floating around that can be had for a more-than-reasonable
price, and you should be able to find one with a working keyboard.
The 130XE was a radical departure from the others, in it used only a
single sheet of plastic, with a contact on the bottom of the keyshafts
bridging two contacts on the sheet. Here if cleaning doesn't help, save
yourself a lot of aggravation and replace the keyboard.
If you've found everything to be fine and dandy with the keyboard
itself, but you don't have function of a group of keys, check the ribbon
connector where the keyboard connects to the computer. There may be a
bad connection. On the 800 this shouldn't happen, as this is a full
plastic-bodied 18-pin connector. On the 800XL, the ribbon is merely an
extension of the silk-screened sheet that slips into a connector on the
main board. If part of the conductive paint has been scrapped away, you
can reach fresh trace by trimming down the ribbon a little. If you find
yourself having to go too far, then replace the keyboard.
Sometimes the problem is on the main board itself. The keyboard is read
by two 4051 decoders and fed into the POKEY chip. Try swapping out the
chips, one at a time, and eventually the keyboard should come back to
life. If not, then there is a more serious problem that requires
professional attention.
Hopefully, I have given you enough information here to enable you to do
your own keyboard repairs and save a little money.
ADVENTURE SYNTAX MAGAZINE
=========================
Adventure = SYNTAX = Magazine
Why should you try it?
* It's the only ST disk magazine dedicated to adventures and RPGs.
The first issue was produced in July 1989. The magazine is bi-
monthly and is available in colour or mono versions and all issues
are STE-compatible.
* Each issue so far has contained several screenshots and an average
of:
10 solutions (some with maps, some serialised)
11 reviews including some adventure-related book reviews
12 files of hints
* The specially designed SynTax 3-in-1 hints give two levels of hints
- subtle or sledgehammer - depending how desperate you are!
* Each disk contains news, letters, and various information sections
including a reference list of ST adventure/RPG software which is
being continually updated.
* The SynTax PD library contains over 150 disks of adventure-related
software including games, map disks solutions and demos. If you make
a contribution to SynTax on disk, you can pick a PD disk to replace
it - free!
* SynTax has had favourable reviews in all the major glossy magazines
and the disks build up into a useful reference collection.
* At only 3 Pounds 50 Pence an issue or 20 Pounds for a year's
subscription of six issues in the UK/Europe (Five Pounds 25 Pence /
Thirty Pounds overseas by airmail) can you afford NOT to try it?
----------------------------------------------------------
To: SynTax, 9 Warwick Road, Sidcup, Kent DA14 6LJ ENGLAND
Please send me the current issue/ the next six issues of
SynTax in colour/mono
Cheques/POs etc should be made payable to S Medley - all
payment in Sterling please.
Name....................................................
Address.................................................
............................... Postcode................
THE ABC COMPILER
================
by Mark Farmer, S*P*A*C*E
(Reprinted from the Puget Sound Atari News, May 1990)
If you 8-Bit Atari users would like to speed up your Basic programs so
that they run like the high speed and memory efficienct compiled
languages such as Forth, -C-, Action, or Assembler then, do I have a
Basic compiler for you! Monarch Data Systems has a Basic compiler
called the ABC Compiler that will translate your Basic programs into
compact pseudo-code, also known as p-code. Once compiled this p-code
can be executed like any other binary program. ABC compiled programs
run from four to twelve times faster than the original Basic program,
depending on how well the source code is written. This makes it
possible to use compiled Basic for professional game developement and
other speed critical applications.
I first bought the ABC Compiler back in 1983. I own version 1.03, but
know that it has been upgraded twice since I purchased it and now is at
version 1.05. The ABC Compiler was the best back then and is the only
Basic compiler out for the Atari 8-bit (the DataSoft and MGM compilers
are no longer made). Even if these two compilers were still out the ABC
Compiler is the easiest to use.
I am very happy with the ABC Compiler (a job hard to do, ask my wife).
The ABC Compiler is cheaper now than it was when I originally purchased
it ($50.00). The compiler comes with the program disk and a well put
together manual that tells you how to use it. I highly recommend this
Basic compiler. If you have any questions about the ABC compiler you
can send a letter to me at:
SSG Mark S. Farmer
A Co. 1/506 Inf
APO, SF 96251
The address and phone number for Monarch Data Systems is as follows:
Monarch Data Systems, Inc.
25 Cambridge Ct.
Morganville, NJ 07751
Phone: (201) 591-9774
THE 8-BIT DCB A Programming Tutorial
=============
by Dan Knauf of S*P*A*C*E
(Reprinted from the Puget Sound Atari News, March 1991)
Something that a lot of people seem to have a hard time learning to
understand is the Device Control Block (DCB) in the Atari Computer.
Actually, there are two of them - the one available to any programmer
located in page 3 (memory location $300 or 768 in decimal) and the one
located in zero-page that is used by the operating system and DOS. For
now, we'll just worry about the one in page 3.
The main purpose of the DCB is to provide a uniform method of talking to
any periphials attached to the computer. In the 8-bit Atari, this
includes items attached to the SIO port and (for XL's and XE's) the
expansion port. This includes such interesting devices as disk drives,
cassette drives, hard drive interfaces, and the 850 interface to name a
few. To keep this as simple as possible, we'll just talk about disk
drives. This information pretty much applies to all periphials though.
The DCB is a table containing 12 bytes of information that is required
by the operating system to talk to any and all these periphials. This
info includes a device identifier (to specify D:, P:, etc.), a device
unit number, a command byte, a status byte, a buffer address, a timeout
byte, a buffer size, two auxilliary bytes, and one spare (unused) byte.
Here is a list of the addresses and the official Atari names of each of
these fields:
* Hex Dec Name Purpose
-------------------------
*$300 768 DDEVIC Buss ID
*$301 769 DUNIT Unit number
*$302 770 DCOMND Command
*$303 771 DSTATS Status
*$304 772 DBUFLO Lo byte of buffer address
*$305 773 DBUFHI Hi byte of buffer address
*$306 774 DTIMLO Timeout value
*$307 775 DUNUSE Spare byte - unused
*$308 776 DBYTLO Lo byte of buffer size
*$309 777 DBYTHI Hi byte of buffer size
*$30A 778 DAUX1 Auxilliary byte #1
*$30B 779 DAUX2 Auxilliary byte #2
Once this table has been set up with the correct data, all that is
necessary to talk to a periphial is a call to the operating systems
Serial Input Output Vector (SIOV) located at address $E459 (58457
decimal). So if it's so easy, what goes in the table? Well, here is
an expanded description of each item in the DCB and, where appropriate,
legal values and their purpose.
DDEVIC is used to select a particular periphial. For now we'll just
worry about talking to a disk drive. To do that DDEVIC must contain a
$31 (49) which is the ID value for disk drives.
DUNIT is used to select the unit number. To talk to drive one, a value
of 1 must be in DUNIT. For drive two, a 2 and so on.
DCOMND is the command to be executed. There are several valid commands,
some of which are:
* Format $21 33
* Format enhanced $22 34 (1050 compatibles only)
* Get configuration $4E 78
* Set configuration $4F 79
* Put (no verify) $50 80
* Read $52 82
* Status $53 83
* Write (w/verify) $57 87
There are some other commands but these are the most useful and will
allow you to do just about anything with a disk drive.
DSTATS is an interesting part of the table and the one I tended to
forget about the most when I was learning how to use the DCB. First, it
holds the status of the operation after a call to SIOV. If it is
greater than 127 an error has occured and the number contained here is
the Atari number for the error encountered. For example, a 138 here
means the device addressed is not on-line (device time-out). Second,
(the part I kept forgetting) it is used to indicate the direction of any
data transfer to be peformed during the execution of the command. To
send data do the drive, POKE $80 (128) here. To receive data from the
drive POKE $40 (64). For commands not involving any data POKE a 0 in
this location. Virtually all commands involve the transfer of some data
so a zero isn't used here too often.
DBUFLO and DBUFHI contain the address of the data buffer. If you are
sending data, it will be sent from this address. If you are receiving
data it will received at this address. Example:
HI=INT(BUFADR/256):LO=BUFADR-256*HI:POKE DBUFLO,LO:POKE DBUFHI,HI.
DTIMLO is used to set the amount of time you want to system to wait on
the periphial in seconds. I use a value of 7 a lot here. The default
value is something over 30 seconds and I am an impatient sort. Usually
if 7 seconds isn't long enough 30 isn't going to be either. The
exception is the format command. I use a value of $F8 (248) because the
format takes lotsa time.
DBYTLO and DBYTHI are used to indicate the number of bytes to transfer.
This usually 128 (for single or enhanced density disks) or 256 (double
density). Example:
HI=INT(SIZE/256):LO=SIZE-256*HI:POKE DBYTLO,LO:POKE DBYTHI,HI.
DAUX1 and DAUX2 contain the number of the sector to be read or written
to. As with all the two byte fields this data is stored in 6502 format.
Ie., the low byte is in DAUX1 and the high byte is in DAUX2. For
example, to read sector 1 DAUX1 would contain a 1 and DAUX2 would be
zero. Example:
HI=INT(SECTOR/256):LO=SECTOR-256*HI:POKE DAUX1,LO:POKE DAUX2,HI.
This concludes the description of the DCB. Now let's look at some of
the commands and how they are used.
First comes the get configuration command. Before doing any reading or
writing to the disk you must know what density it is in so you know
whether to write 128 or 256 bytes to a sector. The exception to this is
sectors 1-3. They are ALWAYS 128 bytes long. All drives I know of
except the 810 contain a 12 byte configuration table that is user
alterable. This table sets the density among other things. Here is a
listing of the drive configuration table.
*Byte # Purpose*
* 1 Number of tracks
* 2 Step rate
* 3 Sectors per track - Hi byte
* 4 Sectors per track - Lo byte
* 5 number of heads -1
* 6 Density 0=single 4=Double or Enhanced
* 7 Bytes per sector Hi byte
* 8 Bytes per sector Lo byte
* 9 Drive present flag
* 10 Not used (Stock XF551 returns a $41 here)
* 11 Not used
* 12 Not used
Notice that the two-byte values are NOT in 6502 format. The high byte
of these values comes first! Another thing to be aware of is that hard
drives use some of these locations a little differently. The number of
heads is invalid for hard drives. And the first two bytes of the table
contain the total number of sectors in the partition instead of tracks
and step rate. I know this to be true of the BlackBox interface and
think it holds true for the MIO also.
To read the table from the drive, you must set up the DCB to receive 12
bytes of data at an address you specify. Then poke $4E (78) into DCOMND
and call SIOV. Here is a one line call to SIOV from BASIC.
X=USR(ADR(-hLYd-)):REM the 'd' is inverse.
Once you have read the configuration look at byte 7. It should be
either a 1 or a 0. If it is 0 the disk is single or enhanced density.
Otherwise, it is double density (256 byte sectors).
This method is not perfect. If you have a Percom drive you should read
sector 1 (remember it is always 128 bytes) before getting the
configuration to ensure accuracy. Reading sector one does not screw up
other drives so it is safe to do under any conditions. Enhanced density
disks can confuse the US Doubler and XF551 drives. I personally HATE
enhanced density... One of my favorite snivels is -Why couldn't Atari
have just used real double density???- (Imagine a loud voice with a
strong nasal whine here.)
Now that you know how to GET the configuration, you know how to SET it
too. You set the DCB up with the same values except for the command
which is $4f (79) and DSTATS which is $80 (128). The only values you
can set are: Sectors per track (18 for single or double, 26 for
enhanced), number of heads (0 or 1), density (0 or 4), and bytes per
sector (128 or 256). Note that enhanced density requires a 4 in the
density byte and 128 byte sectors as well as 26 sectors per track. The
most useful place to use the set configuration command is immediately
before issuing a format command. This ensures that the drive will for
sure be formatted in the density you want. Some DOSes don't even do
this. (Ever try to format a disk with DOS 2.0 that has previously been
formatted in double density? Ugh!)
The next command to mention is the STATUS command ($53 or 83 decimal).
This can also be used to get the density of the drive. Again, the US
Doubler can get confused and lie if enhanced density disks are used. (I
HATE enhanced .....) To use this command you must set the DCB up to
receive 4 bytes from the drive. The bytes received are described as
follows:
Byte Description
------------------
1 Command status
2 Controller chip status
3 Timeout value for formatting
4 Unused (current track # for Indus drives)
If the first byte of the data returned is greater than 127 then the
drive is in enhanced mode (supposedly). Otherwise, if bit 5 is set the
drive is in double density. Else the drive is in single density. If
bit 3 is set the disk is write protected. Bits 0-2 are error bits. If
any are set then some error has occured.
Reading and writing sectors is the next thing on the agenda. To read a
sector set the DCB up to receive data. Poke the low byte of the sector
number into DAUX1 and the high byte into DAUX2. Then call SIOV and your
sector will be read into memory - assuming the drive door is closed and
there is a readable disk in there and everything. To write a sector do
the same thing but set up DCOMND and DSTATS to send data instead of
receive it.
Finally, let's look at the format command. You must set the DCB up to
receive data when you format a disk. The drive will return a bad sector
list when the format is completed if successful. So poke a 64 into
DSTATS and the address you want the bad sector list returned to in
DBUFLO/HI. Also, poke a 0 in DBYTLO and a 1 in DBYTHI since the list
can be 256 bytes long. Immediately after the format command, check for
an error as described below. Then check the first two bytes of the bad
sector list buffer. They should both be 255. If they aren't then there
are bad sectors on the disk.
Errors! Well, they are bound to happen sometime. Immediately after
your call to SIOV you should PEEK(DSTATS) and make sure the value there
is not less than zero. If it IS greater than 127 then an error has
occured. If this happens, the value in DSTATS is the same value that
would normally show up in location 195 if BASIC had generated an error.
BASIC will NOT see or TRAP any errors that happen when you talk to the
disk drive through the SIOV. So, make sure you check for them yourself.
Don't get discouraged if your first attempt at doing direct sector I/O
isn't successful. It took me some time to get comfortable with this
method of communicating with periphials and I made some dandy mistakes
too. I have even managed to format a partition or two on my hard drive.
It'd probably be a pretty good idea to make sure you have a scratch disk
in the drive when you do your experimenting....
Anyone interested in the IOCB's? There's 8 of those! Aw... maybe next
month...
A TRIO FOR TURBO BASIC
======================
by John Picken, GCACE
Here are three short and easy programs. The first is a -fix-, the
second is a MyDOS 4.5 -mod- and the third is a new utility. Note that
all three programs will only run under Turbo BASIC which is readily
available to any user group member. There are two reasons for this:
first to demonstrate some of Turbo's fine features and, more
importantly, programming in Turbo is about ten times easier than in
Atari BASIC (laziness wins again).
My original version of MYDOS RAMDISK AUTOLOADER, that was published in
the July PSAN, fits the expression -too smart by half-. It works fine
with 256K because, on the 256XL, an unformatted RAMdisk shows -65535
FREE SECTORS- which tells the loader formatting is needed. The rub is
that an unformatted RAMdisk with the 320XE shows -255 FREE SECTORS-.
Since this could mean a nearly full, formatted RAMdisk, the loader
doesn't format. Program A fixes the existing autorun file for the
320XE; it replaces the -smart- code with -smarter- NOP's so the loader
formats any time DUP.SYS is not found in the RAMdisk. Apologies to any
320XE owners who have been -blue-ifying- the air.
Program B makes a modification to MyDOS 4.5 DUP.SYS which results in
different default colours and keyboard parameters. I find a white on
black display to be more readable on a monochrome monitor but you are
free to select any colors you like. The values for the keyboard produce
a fast, quiet cursor; to change them, refer to page 208 in MAPPING THE
ATARI. If you do something that results in a GRAPHICS 0, (Copy to/from
S: or E:, load Turbo BASIC, etc.) the colors revert to normal but the
keyboard parameters remain as set until you hit RESET. The modification
uses two loops which is why COLOR3 and HELPFG are included - just leave
them at 70 and 0. All internal changes are made so that your modified
DUP will be written if you -Write DOS Files- from DUP.
Program C produces a short machine language file that switches BASIC off
or on. It is a toggle - if BASIC is on, it will be turned off; if off,
it will be turned on. You can load the program anytime and/or, include
it in an autorun file (it should be first with others appended to it).
As an autorun, it has the effect of reversing the OPTION key so that you
would need to press OPTION to enable BASIC at boot.
10 REM Program A: 320XE RDLoader Fix
11 DIM PRG$(700),JSR_AFP$(3)
12 PRG$(700)=CHR$(0)
13 JSR_AFP$=CHR$(32)
14 JSR_AFP$(2)=CHR$(0)
15 JSR_AFP$(3)=CHR$(216)
16 OPEN #1,4,0,-D1:AUTORUN.SYS-
17 TRAP #EOF
18 BGET #1,ADR(PRG$),LEN(PRG$)
19 # EOF:CLOSE
20 PRG$=PRG$(1,DPEEK($0358))
21 PATCH=INSTR(PRG$,JSR_AFP$)
22 FOR B=0 TO 11
23 __PRG$(PATCH+B,PATCH+B)=CHR$(234)
24 NEXT B
25 OPEN #1,8,0,-D1:AUTORUN.SYS-
26 BPUT #1,ADR(PRG$),LEN(PRG$)
27 END
10 REM Program B: Modifier for
11 REM . MyDOS 4.5 DUP.SYS
12 DIM DUP$(7000)
13 DUP$(7000)=CHR$(0)
14 TRAP #EOF
15 OPEN #1,4,0,-D:DUP.SYS-
16 BGET #1,ADR(DUP$),7000
17 # EOF:CLOSE
18 DUP$=DUP$(1,DPEEK($0358))
19 REM Code changes inside DUP
20 RESTORE #IN_MODS
21 FOR COUNT=1 TO 14
22 __READ INDEX,BYTE
23 __DUP$(INDEX,INDEX)=CHR$(BYTE)
24 NEXT COUNT
25 # IN_MODS:DATA 5,78,30,32
26 DATA 31,50,32,67
27 DATA 326,52,1682,79
28 DATA 1690,79,2385,78
29 DATA 2389,26,2393,5
30 DATA 2779,79,2986,79
31 DATA 5839,54,5840,48
32 REM Code added to end of DUP
33 RESTORE #ADD_MODS
34 FOR COUNT=6639 TO 6659
35 __READ BYTE
36 __DUP$(COUNT)=CHR$(BYTE)
37 NEXT COUNT
38 # ADD_MODS:DATA 162,4,189,70
39 DATA 67,157,196,2
40 DATA 189,74,67,157
41 DATA 216,2,202,208
42 DATA 241,142,28,2
43 DATA 96
44 REM Default bytes at end of DUP
45 DUP$(6660)=CHR$(12):REM Colr1 Text
46 DUP$(6661)=CHR$(0):REM Colr2 Bak
47 DUP$(6662)=CHR$(70):REM Color3
48 DUP$(6663)=CHR$(0):REM Col4 Border
49 REM Ref. Mapping The Atari p.208
50 DUP$(6664)=CHR$(18):REM KRPDEL
51 DUP$(6665)=CHR$(2):REM KEYREP
52 DUP$(6666)=CHR$(1):REM NOCLIK
53 DUP$(6667)=CHR$(0):REM HELPFG
54 OPEN #1,8,0,-D:DUP.SYS-
55 BPUT #1,ADR(DUP$),6667
56 END
10 REM Program C: Makes Basic Toggle
11 CLS :? :? :? -BASIC.COM Creator-
12 ? :? -Checking data lines-:?
13 TRAP #EOD1
14 DO
15 __B=B+1
16 __READ A
17 __CS=CS+A*B
18 LOOP
19 # EOD1:RESTORE
20 IF CS=211369
21 __? :? -__Data OK. Insert disk,-
22 __? -push START to write file.-
23 __# KEY:ON PEEK(53279)<>6 GO# KEY
24 __TRAP #DISK_ERROR
25 __OPEN #1,8,0,-D1:BASIC.COM-
26 __TRAP #EOD2
27 __DO
28 ____READ A
29 ____PUT #1,A
30 __LOOP
31 __# EOD2:CLOSE
32 __? :? -BASIC.COM created.-
33 ELSE
34 __? - Sorry, data incorrect.-
35 __# RETRY
36 __? -Please check and re-run.-
37 ENDIF
38 END
39 # DISK_ERROR:? CHR$(253)
40 ? - DISK ERROR #-;ERR:GO# RETRY
41 DATA 255,255,0,1,54,1,162,160
42 DATA 173,1,211,73,2,141,1,211
43 DATA 41,2,141,248,3,240,2,162
44 DATA 192,134,106,162,0,142,75,3
45 DATA 169,72,141,68,3,169,196,141
46 DATA 69,3,169,12,141,74,3,141
47 DATA 66,3,32,86,228,169,3,141
48 DATA 66,3,76,86,228,226,2,227
49 DATA 2,0,1
(This article provided courtesy of the Garden City ACE, P.O. Box 6578,
Victoria, B.C., Canada V8P 5N7.)
XEP80 STATUS LINE
=================
by Michael D. Bjorkman, S*P*A*C*E
The XEP80 has a number of special features, not all of which were
demonstrated in the DEMO80.BAS program which comes on the handler disk.
One of these features is a one line text window below the 24th and last
line of the normal 80 column screen display. This extra text line is
called the Status Line and is handy for printing error messages,
prompting for input, etc. for those cases where you don't want to mess
up the regular 24 lines of text.
The Status Line is not accessible from BASIC using the PRINT command.
Therefore I've written a short ML routine which can be called with a USR
command. My program will only print messages to the status line and
will not accept input from the status line. That is left as an exercise
for the reader.
Listing 1 is a short demo I've written which uses my Status Line ML
routine. The program first initializes the ML string, then lists half
of the program to the screen, then prints a message to the status line,
then lists some more of the program, and then erases the status line.
Listing 2 is the UNICHECK checksum file for checking your typing. Do
not type Listing 2, it is not part of the program.
Listing 3 is the source code for the ML string. It was written to be
relocateable so that it could be placed in a BASIC string.
If you want to use the ML string in your own programs, then you will
need lines 110, 120, 210, 220, and 1000-1080. The length of the message
which can be printed to the status line should only be limited to the
width of screen memory, which is 256 characters. I don't know what
happens if more than 80 characters are printed to the screen, however,
they should all be there. I haven't tried this, but you should be able
to horizontally scroll over to read the rest of the message by using the
proper CIO call. I also don't know what happens if you try to print
more than 256 characters to the status line. Another exercise for the
reader. Also, I haven't built an automatic clearing of the status line
into the ML routine. You are responsible for clearing the status line
of your messages. That can be done by printing a string of spaces to
the status line. See line 170 in Listing 1.
LISTING 1
110 DIM ML$(126),MSG$(7)
120 FOR I=1 TO 126:READ BYTE:ML$(I,I)=CHR$(BYTE):NEXT I
130 MSG$=-MESSAGE-
135 LIST 100,170
140 ? -MESSAGE IS STARTING-
150 GOSUB 210
160 FOR DELAY=1 TO 800:NEXT DELAY
165 LIST 180,1080
170 MSG$=- -
180 ? -MESSAGE IS ENDING-
190 GOSUB 210
200 END
210 XPOS=PEEK(85):YPOS=PEEK(84)
220 X=USR(ADR(ML$),ADR(MSG$),LEN(MSG$),XPOS,YPOS)
230 RETURN
1000 DATA 104,104,141,1,1,104,141,0,1
1010 DATA 104,141,3,1,104,141,2,1,104,104,141,4,1,104,104
1020 DATA 141,5,1,162,0,169,20,141,66,3,169,12,141,74,3
1030 DATA 169,152,141,75,3,32,86,228,162,0,169,11,141,66,3
1040 DATA 173,0,1,141,68,3,173,1,1,141,69,3,173,2,1
1050 DATA 141,72,3,173,3,1,141,73,3,32,86,228,162,0,169
1060 DATA 20,141,66,3,169,12,141,74,3,173,4,1,141,75,3
1070 DATA 32,86,228,162,0,169,20,141,66,3,169,12,141,74,3
1080 DATA 173,5,1,9,128,141,75,3,32,86,228,96
LISTING 2.
110 DATA 865,373,529,260,928,972,422,136,892,679,984,28,413,644,592,8717
1000 DATA 136,898,912,282,393,936,643,15,881,5096
LISTING 3.
1000 *= $5000 ; this code is relocatable, however MAC/65 requires
1010 ; the Program Counter be set during assembly with the
1020 ; *= directive even though it will do nothing during
1030 ; the assembly of this code.
1040 ;
1050 ; condition of stack when entering this routine.
1060 ; num of arguments (one byte: thrown away and not used.)
1070 ; buffer addr (hi byte)
1080 ; buffer addr (lo byte)
1090 ; buffer length (hi byte)
1100 ; buffer length (lo byte)
1110 ; xpos (hi byte)
1120 ; xpos (lo byte)
1130 ; ypos (hi byte)
1140 ; ypos (lo byte)
1150 ;
1160 STOR1 = $0100 ; buffer address
1170 STOR2 = $0102 ; buffer length
1180 STOR3 = $0104 ; x position of cursor before entering this routine
1190 STOR4 = $0105 ; y position of cursor before entering this routine
1200 ;
1210 ICCOM = $0342
1220 ICBAL = $0344
1230 ICBAH = $0345
1240 ICBLL = $0348
1250 ICBLH = $0349
1260 AUX1 = $034A
1270 AUX2 = $034B
1280 CIOV = $E456
1290 ;
1300 ; This segment of code stores all the arguments at the top of the
1310 ; stack on the bottom of the stack --
1320 ; Thus preventing loss of the values if CIO uses the stack.
1330 PLA ; number of arguments on stack
1340 PLA
1350 STA STOR1+1 ; ICBAH
1360 PLA
1370 STA STOR1 ; ICBAL
1380 PLA
1390 STA STOR2+1 ; ICBLH
1400 PLA
1410 STA STOR2 ; ICBLL
1420 PLA
1430 PLA
1440 STA STOR3 ; XPOS
1450 PLA
1460 PLA
1470 STA STOR4 ; YPOS
1480 ;
1490 ; Routine to move cursor to Status Line.
1500 ; Using an XEP80 Special CIO call.
1510 LDX #$00
1520 LDA #$14
1530 STA ICCOM
1540 LDA #$0C
1550 STA AUX1
1560 LDA #$98
1570 STA AUX2
1580 JSR CIOV
1590 ;
1600 ; Routine to print text buffer.
1610 ; Using a Device Independent CIO call.
1620 LDX #$00
1630 LDA #$0B
1640 STA ICCOM
1650 LDA STOR1
1660 STA ICBAL
1670 LDA STOR1+1
1680 STA ICBAH
1690 LDA STOR2
1700 STA ICBLL
1710 LDA STOR2+1
1720 STA ICBLH
1730 JSR CIOV
1740 ;
1745 ; Routine to return the cursor to its original horizontal position.
1746 ; Using a XEP80 Special CIO call.
1750 LDX #$00
1760 LDA #$14
1770 STA ICCOM
1780 LDA #$0C
1790 STA AUX1
1800 LDA STOR3
1810 STA AUX2
1820 JSR CIOV
1830 ;
1834 ; Routine to return the cursor to its original vertical position.
1836 ; Using an XEP80 Special CIO call.
1840 LDX #$00
1850 LDA #$14
1860 STA ICCOM
1870 LDA #$0C
1880 STA AUX1
1890 LDA STOR4
1900 ORA #$80
1910 STA AUX2
1920 JSR CIOV
1930 RTS
1940 .END
=======================================================================
Z*MAGAZINE ISSUE #192 APRIL 24, 1991
=======================================================================