Sorcery_Brews Sorcery Brews

User Manual: Pdf Sorcery_Brews

Open the PDF directly: View PDF PDF.
Page Count: 128

DownloadSorcery_Brews Sorcery Brews
Open PDF In BrowserView PDF
• • • • •7
~

•••••

..
...

SORCERY BREWS

CONCOCTED BY HOWARD ARRINGTON
COPYRIGHT (C) 1981 BY HOWARD ARRINGTON
A PRODUCT OF THE GLOBAL SOFTWARE NETWORK

This manual is a treasury of programming tricks that are
specific to the Exidy Sorcerer computer, although much is
applicable to other microcomputers that employ either Microsoft
Basic or a Z80 microprocessor. With this ready reference of
valuable examples at your fingertips, your programming efforts
will be greatly simplified, and your programs will be more
professional in both appearance and performance. Using this
manual will unleash the hidden powers of your Sorcerer. You
will graduate from being an apprentice to being a full wizard
as you study and use the brews concocted by masters of the
Sorcerer.

•

T ABLE OF CONTENTS
CHAPTER 1
1.01
1.02
1.03
1.04
1.05
1.06
1.07
1.08
1.09
1.10
1.11
1.12
1.13

RELOCATE BASIC PROGRAMS TO A DIFFERENT RUN ADDRESS
END-OF-PROGRAM ADDRESS FOR ROMPAC BASIC
CSAVE BASIC AND MACHINE LANGUAGE ROUTINES TOGETHER
SAVE A CHARACTER SET AND A BASIC PROGRAM TOGETHER
AUTO-EXECUTE BASIC PROGRAMS
FIND TOP-OF-MEMORY IN ADDRESSES FOOO-F001 HEX
ARRAY SPACE REQUIREMENT
CONCEAL 'REM' AND LINE NUMBER IN LISTINGS
MACHINE CODE ROUTINES HIDDEN IN BASIC REMARKS
THREE MEMORY SIZE DEPENDENT BYTES IN THE BASIC WORK AREA
AN IDEAL PROGRAM START
FASTER BASIC EXECUTION
MERGE TWO BASIC PROGRAMS TOGETHER

CHAPTER 2
2.01
2.02
2.03
2.04
2.05
2.06
2.07
2.08
2.09
2.10
2.11
2.12
2.13
2.14
2.15
2.16
2.17
2.18
2.19
2.20
2.21
2.22

BASIC PROGRAM TIPS

BASIC COMMANDS

CLEAR COMMAND
RESTORE nnnn WILL RESTORE TO A SPECIFIC LINE NUMBER
SWAP INTEGER VARIABLES
LEN(STR$(l)) IS 2 BECAUSE A SPACE PRECEDES THE DIGIT
MID$ FUNCTION EXAMPLES
USE CHR$(64) TO PRINT THE '@' SIGN
ORDER OF PRECEDENCE FOR NUMERICAL OPERATIONS
FLOATING POINT INACCURACIES
NUMERICAL RELATIONS
LOGICAL OPERATOR TRUTH TABLES
ONE SECOND DELAY LOOP IN BASIC
A 0.81 SECOND DELAY LOOP IN THE MONITOR
A 3.24 SECOND DELAY LOOP IN THE MONITOR
MULTIPLE LINE CHARACTER STRINGS
PRINT DECIMAL NUMBER IN HEXADECIMAL
PRINT DECIMAL NUMBER IN HEXADECIMAL
PRINT DECIMAL NUMBER IN HEXADECIMAL
CONVERT HEXADECIMAL TO DECIMAL
CONVERT DECIMAL TO HEXADECIMAL
MENU SELECTION UTILIZING 'IF X THEN RUN' STATEMENT
CARTESIAN COORDINATES FROM POLAR EQUATIONS
SHELL SORT SUBROUTINE TO PUT ARRAY Z() IN ASCENDING ORDER

CHAPTER 3
3.01
3.02
3.03
3.04
3.05
3.06
3.07
3.08
3.09
3.10
3.11
3.12

KEYBOARD

---

VIDEO

DOUBLE SPACE LISTINGS
SCREEN POKE ADDRESS FOR ANY ROW AND COLUMN
MAKE THE CURSOR DISAPPEAR AFTER A PRINT STATEMENT
REMOVE CURSOR FROM SCREEN
SCREEN ADDRESSING
SYNC SCREEN MOTION WITH VIDEO HORIZONTAL SYNC 'PULSE
PRINT AT SUBROUTINE
PLACE CURSOR AT ROW AND COLUMN
PLACE CURSOR AT ROW AND COLUMN
DRAW BOX ROUTINE
CREATE INVERSE VIDEO CHARACTER SET
CREATE DOUBLE WIDE CHARACTER SET

CHAPTER 6
6.01
6.02
6.03
6.04
6.05
6.06

---

ACCEPT 'YES' ANSWER WITH INPUT OF 'y', 'YE' OR 'YES'
KEYBOARD SCAN OR 'GET' COMMAND
PRINT ON LINE AFTER INPUT STATEMENT
INPUT STRINGS CONTAINING COMMAS AND '@' SYMBOLS
KEYBOARD SCAN FOR 'GRAPHIC', 'CONTROL', AND 'SHIFT'
WAIT FOR USER TO PRESS 'SHIFT' KEY TO CONTINUE

CHAPTER 5
5.01
5.02
5.03
5.04
5.05
5.06
5.07
5.08
5.09
5.10
5.11
5.12

FUNCTIONS

RANDOM NUMBER FUNCTION
RANDOMIZE FUNCTION
INT FUNCTION EXAMPLES
SGN() FUNCTION
DEF FUNCTION RULES
DECIMAL POINT ALIGNMENT
TABULATED PRINTING OF DOLLARS AND CENTS
ROUND OFF FUNCTION
ASCII CODE FOR A HEX DIGIT
FIX COMMAND
BASE 10 LOGORITHM
PI = 3.14159 = 355/113

CHAPTER 4
4.01
4.02
4.03
4.04
4.05
4.06

---

JOYSTICKS

JOYSTICK / KEYBOARD STANDARD FOR THE SORCERER
JOYSTICK INTERFACE STANDARD TO PARALLEL PORT
JOYSTICK CIRCUIT DIAGRAM
JOYSTICK EXAMPLE USING BASIC STATEMENTS
JOYSTICK EXAMPLE USING MACHINE LANGUAGE SOFTWARE
MACHINE LANGUAGE JOYSTICK ROUTINE

.

CHAPTER 7
7.01
7.02
7.03
7.04

PRINCIPLE OF ONE VOICE SOUND
ONE VOICE MUSIC ROUTINE
PIEZO SPEAKER AUDIO PROMPTER
CONTROL IG I BEEP

CHAPTER 8
8.01
8.02

MONITOR

---

MACHINE LANGUAGE INTERFACE

PROTECT MEMORY FOR MACHINE LANGUAGE ROUTINES
CALL A MACHINE LANGUAGE ROUTINE
FASTER USR() PARAMETER PASSING
POKE MACHINE HEX CODE INTO MEMORY
PASS ARGUMENT IN IAI REGISTER TO MACHINE LANGUAGE ROUTINE
PASS TWO PARAMETERS USING THE OUT I,J INSTRUCTION
PASS ROUTINE ADDRESS IN USR() FUNCTION CALL
MULTIPLE USR() ROUTINES SELECTED BY THE LETTER IN ()
UP-LOADER FOR MACHINE LANGUAGE ROUTINES

CHAPTER 11
11.01
11.02
11.03
11.04
11.05

---

MONITOR POKE ADDRESSES
MONITOR WORKAREA
USEFUL MONITOR ROUTINES AND THEIR FUNCTIONS
RELOCATE THE MONITOR STACK
ERASE MEMORY BY FILLING IT WITH ZEROES
EXECUTE MONITOR COMMANDS FROM A BASIC PROGRAM

CHAPTER 10
10.01
10.02
10.03
10.04
10.05
10.06
10.07
10.08
10.09

--- BASIC ROMPAC

BASIC ROMPAC MAP
BASIC ROMPAC WORK AREA

CHAPTER 9
9.01
9.02
9.03
9.04
9.05
9.06

--- SOUND

---

MACHINE CODE ROUTINES

ROW - COLUMN ROTATION OF A CHARACTER CELL
IMAGE DRIVER TO CONVERT TO >SA FILES.
PINE WOOD DERBY CONTROLLER
PINE WOOD DERBylS BASIC PROGRAM
IDEAL MACHINE LANGUAGE PROGRAM START

CHAPTER 12
12.01
12.02
12.03
12.04
12.05
12.06
12.07
12.08
12.09

SAVE
SAVE
CP/M
BIOS
CP/M

---

CP/M

---

WORD PROCESSOR

---

DEVELOPMENT PAC

PAUSE DEVELOPMENT PAC LISTINGS
MEMORY PARTITIONS FOR 32K CONFIGURATION
I/O VECTOR ASSIGNMENTS
SAMPLE COMMANDS

CHAPTER 18
18.01
18.02

EDITOR FOR BASIC

WORD PROCESSOR PRINTER DRIVER
SALVAGE WORD PROCESSOR FILE FROM RESET
PRINTER DRIVER TO SEND ESCAPE SEQUENCES

CHAPTER 17
17.01
17.02
17.03
17.04

---

ROMPAC BASIC PROGRAM ON CP/M DISK
WORD PROCESSOR ROMPAC FILES ON CP/M DISK
COMMANDS
MODIFICATION TO GIVE BACKSPACE TYPE RUBOUTS
LOAD ROUTINE OF WP FILES FOR DEVPAC

CHAPTER 16
16.01
16.02
16.03

CASSETTE TAPE

EDITOR FOR BASIC INSTRUCTIONS
EDITOR FOR BASIC SOURCE LISTING

CHAPTER 15
15.01
15.02
15.03
15.04
15.05

---

WRITE DATA TO CASSETTE TAPE
READ DATA FROM CASSETTE TAPE

CHAPTER 14
14.01
14.02

I/O DRIVERS

RS232 OUTPUT DRIVER ROUTINE
RS232 DRIVER WITH PERFERATION SKIP CONTROL
RS232 INPUT DRIVER ROUTINE
DUMB TERMINAL ROUTINE
VARIABLE LINE LENGTHS FOR PRINTERS
CENTRONICS SCREEN PRINT ROUTINE
CENTRONICS PRINTER DRIVER
ACCESS CENTRONICS PRINTER DRIVER FROM BASIC
PROGRAMMING THE UART FOR PARITY OPTIONS

CHAPTER 13
13.01
13.02

---

---

PLOTTING

BEAUTIFUL BIRTHDAY PLOTS
3-D FUNCTION PLOTS USING SHADED PRINT DENSITY

.J.

~:~.

CHAPTER 19
19.01
19.02
19.03
19.04
19.05
19.06
19.07
19.08
19.09
19.10
19.11
19.12
19.13
19.14

---

TABLES AND FORMS

BASIC'S TOKENS
HEX - BINARY CONVERSION TABLE
POWERS OF 2 TABLE
DECIMAL - HEXADECIMAL CONVERSION TABLE
CONTROL CODES AND THEIR FUNCTIONS
GRAPHIC CHARACTER DESIGNER'S FORM
MACHINE LANGUAGE CODING FORM
SERIAL INTERFACE PINOUTS
PARALLEL INTERFACE PINOUTS
DATA PORT ASSIGNMENTS
ASCII CHARACTER SET
KEYBOARD STRUCTURE
GRAPHIC CHARACTER STARTING ADDRESSES
ONE STROKE BASIC COMMANDS

- - - - - - - - - - -----------

FORWARD
"In promulgating your esoteric cognitations, or articulating
your superficial sentimentalities and amicable, philosophical
or psychological observations, beware of platitudinous
ponderosity. Let your conversational communications possess a
clarified conciseness, a compact comprehensibleness, coalescent
consistency, and a concantenated cogency. Eschew all
conglomerations of flatulent garrulity, jejune babblement and
asinine affectation. Let your extemporaneous and
unpremeditated expatiations have intelligibility and vivacious
vivacity, without rodomontade and thrasonical bombast.
Sedulously avoid all polysyllabic profundity, pompous
prolixity, osittaceous vacuity, ventriloquial verbosity, and
veniloquent vapidity. Shun double-entendres, pruvient
jocosity, and pestiferous profanity, obscurant or apparent.
In other words, write plainly, briefly, naturally, sensibly,
truthfully, purely. Keep from complexities; don't put on airs;
write what you mean; and don't forget that others are trying
to understand you. Simply stated -- Reread this paragraph
until you understand the veniloquent vapidity."
I've tried to heed this good counsel throughout this manual.

To my patient wife

MARILYN

•

---

CHAPTER 1

PROGRAM TIPS

1.01 RELOCATE PROGRAMS TO A DIFFERENT RUN ADDRESS.
BYE
>EN 149
0149: 00 10 /
>EN OFFF
OFFF: 0 /
>PP

EXIT TO THE MONITOR.
CHANGE POINTER IN 149 HEX.
NEW BASIC START ADDRESS OF 1000 HEX.
ZERO BYTE BEFORE START ADDRESS.
GO ENTER BASIC PROGRAM FROM KEYBOARD.

PROGRAM CAN BE RUN AND CSAVED IN NORMAL FASHION.
TO CLOAD, THOUGH, 0149 HEX MUST BE ALTERED AS ABOVE.
THIS ALLOWS A BASIC PROGRAM TO HAVE A PROTECTED MEMORY
SPACE FOR MACHINE LANGUAGE ROUTINES FROM 01D5H TO ONE
BYTE BEFORE THE START OF YOUR RELOCATED BASIC PROGRAM.
--------------------------------------------------------------

1.02 END-OF-PROGRAM ADDRESS FOR ROMPAC BASIC.
BYE
>DU 1B7 1B8
ADDR 0 1 2
01BO: .. ..

EXIT TO MONITOR
ADDRESS STORED IN THESE TWO BYTES.
3

4

5

6

7
yy

8
xx

HEX ADDRESS IS STORED IN REVERSE BYTE ORDER IN ADDRESS
01B7 AND 01B8 HEX. ADDRESS IS READ AS xxyy.
--------------------------------------------------------------

1.03 eSA VE BASIC AND MACHINE LANGUAGE ROUTINES.
PLACE MACHINE LANGUAGE ROUTINES IN MEMORY JUST BEYOND
THE END OF A BASIC PROGRAM.
PUT THE ADDRESS TO SAVE THROUGH IN BYTES 1B7 AND 1B8.
EXAMPLE:

IF MACHINE CODE OCCUPIES TO ADDRESS 264F HEX.
BYE
>EN 1B7
01B7: 4F 26 /
>PP
CSAVE XMPLE

ENTER NEW ENDING ADDRESS.
SAVE BASIC AND ROUTINES.

WHEN THE BASIC PROGRAM AND THE MACHINE CODE RELOAD,
THE MACHINE CODE NEEDS TO BE MOVED BACK TO ITS ORIGINAL
ADDRESS IN MEMORY. BE CAREFUL THAT VARIABLE STORAGE
DOES NOT OVERWRITE IT WHEN THE BASIC PROGRAM RUNS.

~~~.-----~-

------

1.04 SAVE A CHARACTER SET AND A BASIC PROGRAM TOGETHER.
BYE
>DU 1B7 1B8
>SA XMPLE FCOO xxyy
>LO XMPLE
>PP
RUN

FIND END OF PROGRAM ADDRESS.
SAVE THROUGH xxyy FROM 1B7 1B8.
TO RERUN YOUR PROGRAM.

==============================================================

1.05 AUTO-EXECUTE BASIC PROGRAMS
PROGRAM MUST HAVE A LINE O. EXAMPLE: 0 REM
FIND PROGRAM END IN 1B7-1B8 HEX FOR xxyy ADDRESS.
>SE X=C858
>SE F=4D
>SA PROG 1B7 xxyy

(AUTO EXECUTE ADDRESS)
(FILE TYPE)

LOAD AND AUTO EXECUTE WITH

>LOG

===============================================================

1.06 FIND TOP-OF-MEMORY IN ADDRESSES FOOO-F001 HEX.
100 RAMSIZE = PEEK(-4095) * 256 + PEEK(-4096)
==============================================================

1.07 ARRAY SPACE REQUIREMENT
THE NUMBER OF BYTES REQUIRED TO STORE AN ARRAY IS:
(#

OF ELEMENTS) * 4 + (# OF DIMENSIONS) * 2 + 6

EXAMPLE:

100 DIM A(10,10) : REM USES 494 BYTES
: REM 494 = 11*11*4+2*2+6

=============================================================

1.08 CONCEAL 'REM' AND LINE NUMBER IN SCREEN LISTINGS.
ONE CAN CONCEAL THE LINE NUMBER OF REMARK STATEMENTS BY
USING THE FOLLOWING TRICK. THE APPEARANCE OF REMARK
STATEMENTS IMPROVES BECAUSE THEY READILY STAND OUT.

SAMPLE OUTPUT:
100 PRINT /lTHIS IS A SAMPLE SCREEN LISTING/I
--- A REMARK, BUT NO 'REM' OR LINE # SHOWS --120 PRINT /lLINE NUMBER 110 IS PRESENT, YET HIDDEN

II

TO DO THE ABOVE TO A REMARK STATEMENT, DO THE FOLLOWING:
1. TYPE THE LINE NUMBER AND 'REM', IE.

110 REM

2. NOW, PRESS THE CURSOR LEFT KEY SEVEN OR MORE TIMES TO
MOVE THE CURSOR ALL THE WAY BACK TO THE LEFT MARGIN.

3. USE THE SPACE BAR TO ERASE THE VISIBLE LINE NUMBER
AND THE 'REM' LETTERS.

4. NOW, PRESS 'LINE FEED

I

TO INSERT A BLANK LINE.

5. TYPE THE REMARK STATEMENT'S TEXT.

6. TYPE ANOTHER 'LINE FEED

I

TO INSERT A BLANK LINE BELOW.

7. FINALLY, TERMINATE THE LINE WITH CARRIAGE RETURN.
===============================================================

1.09 MACHINE CODE ROUTINES HIDDEN IN BASIC REMARKS
ONE CAN STORE A SHORT MACHINE LANGUAGE ROUTINE AS PART
OF BASIC STATEMENT BY PUTTING IT IN A REM STATEMENT.
IT WILL AUTOMATICALLY BE SAVED AND LOADED WITH THE BASIC
PROGRAM.
EXAMPLE:
100 REM < A LINE FULL OF SPACES >
110 REM THE REST OF THE PROGRAM FOLLOWS
IN MEMORY THE FIRST LINE LOOKS LIKE:
01D5: yy xx 64 00 SF
01DA: 20 20 20 20 20 20 20 20 20 20 20 20

etc.

THE xxyy IS THE LINK POINTER ADDRESS OF WHERE THE NEXT
LINE STARTS. THE LINE NUMBER OF 100 IS STORED AS 64 00.
THE 'REM' COMMAND IS STORED AS SF. STARTING IN ADDRESS
01DA ARE ALL THE SPACES OF THE REM TEXT.
YOU CAN INSERT A SHORT MACHINE LANGUAGE ROUTINE IN THE
ADDRESS SPACE BETWEEN 01DAH AND xxyy, FOR EXAMPLE. ONCE
THE CODE IS INSERTED, DON'T ALTER THE REM STATEMENT OR
ANY LINE WHICH MIGHT PRECEED THE REM STATEMENT.
ALSO, THE CODE INSERTED CANNOT CONTAIN A 00 BYTE AS BASIC
WILL TREAT IT AS AN END-OF-LINE MARKER.

1.10 THREE MEMORY SIZE DEPENDENT BYTES IN THE BWA
0145-6H
0192-3H
01A6-7H

-

POINTER TO TOP OF BASIC STACK.
POINTER TO HIGHEST RAM LOCATION.
POINTER TO TOP OF FREE STRING SPACE.

IF THE BASIC WORK AREA FROM 0100H THROUGH 01D4H IS SAVED
WITH A BASIC PROGRAM IN THIS FASHION: >SA PROG 100 xxyy,
THE PROGRAM WILL NOT RUN ON A MACHINE WHICH HAS LESS
MEMORY THAN THE MACHINE ON WHICH THE PROGRAM WAS
RECORDED.
THE CONFLICT CAN BE OVERCOME BE LOADING BYTES 0146H,
0193H, AND 01A7H WITH THE CORRECT VALUE, IE. THE DEFAULT
VALUE LOADED BY BASIC ON POWER UP. THE VALUE IS 03EH FOR
A 16K MACHINE, 07EH FOR A 32K MACHINE, AND OBEH FOR A
48K MACHINE.
---------------------------------------------------------------

1.11 AN IDEAL PROGRAM START

o

100
110
120
130
140
150
160
170
180
190
200
210
220
230
240
250

REM --PROGRAM NAME
.
REM AUTHOR'S COPYRIGHT NOTICE
REM PROGRAM DATE AND VERSION NUMBER

.

REM DEFINE CURSOR CONTROL VARIABLES
CL$=CHR$(l) : CP$=CHR$(12) : CH$=CHR$(17)
CR$=CHR$(19): CU$=CHR$(23) : CD$=CHR$(26)
REM COMPUTE MEMORY SIZE TO LOCATE MONITOR WORK AREA
MS=256*PEEK(-4095)+PEEK(-4096)
IF MS>32767 THEN MS=MS-65536
REM LOCATE MONITOR WORK AREA CONTROL BYTES
PC=MS-47 :REM PC is printer control poke address.
SS=MS-48 :REM SS is screen speed poke address.
BR=MS-49 :REM BR is baud rate poke address.

==============================================================

1.12 FASTER BASIC EXECUTION
BASIC STARTS AT THE BEGINNING OF A ,PROGRAM AND SCANS
THROUGH LOOKING FOR THE LINE NUMBER REFERENCED BY A
GOSUB, IF-THEN, OR GOTO.
OPTIMIZE BY HAVING OFTEN CALLED LINE NUMBERS NEAR THE
, BEGINNING OF A PROGRAM. HAVE SELDOM USED LINES, SUCH
AS PROGRAM INSTRUCTIONS AND INITIALIZATION, AT THE BOTTOM
OF A PROGRAM.

1.13 MERGE TWO BASIC PROGRAMS TOGETHER.
1.

THE LINE NUMBERS IN THE PROGRAM TO BE MERGED MUST
BE GREATER THAN THE LAST LINE NUMBER IN THE FIRST
PROGRAM. USE A LINE RENUMBERING PROGRAM IF NECESSARY
TO ACCOMPLISH THIS.

2.

LOAD THE FIRST PROGRAM INTO MEMORY. FIND ITS END
LOACATION IN ADRESS 01B7 AND 01B8 HEX.

3.

USE THE END ADDRESS TO FIND THE THREE ZEROS IN
MEMORY MARKING THE END OF THE PROGRAM. WRITE DOWN
THE ADDRESS OF THE SECOND ZERO.

4.

USE THE MONITOR TO LOAD THE PROGRAM TO BE MERGED.
USE >LO FILENAME 1 xxyy WHERE xxyy IS THE ADDRESS
OF THE SECOND ZERO FROM STEP #3.

5.

ADD THE MERGING PROGRAM'S SIZE TO xxyy TO HELP LOCATE
THE THREE ZEROS AT THE END OF THE TWO COMBINED
PROGRAMS.

6.

STORE THE ADDRESS OF THE THIRD ZERO IN BYTES 01B7
AND 01B8 HEX. THE ADDRESS IS STORED IN REVERSE BYTE
ORDER.

7.

IN BASIC, ADD AND DELETE A LINE NUMBER 0, IE.
0 REM
THIS WILL RECOMPUTE ALL OF THE LINK POINTERS. THE
TWO PROGRAMS ARE NOW MERGED AND CAN BE SAVED ON TAPE.

•

.

CHAPTER 2

---

BASIC COMMANDS

2.01 CLEAR COMMAND
100 CLEAR xx,yy
•

xx IS THE NUMBER OF BYTES TO RESERVE FOR STRING SPACE.
yy IS THE TOP-OF-MEMORY ADDRESS FOR THIS STRING SPACE .

EXAMPLE:

100 CLEAR 500,24576

500 BYTES ARE RESERVED FOR STRING MANIPULATIONS.
THE STRING WORKSPACE WILL START AT 6000 HEX AND GROW
DOWNWARD IN MEMORY TOWARD THE VARIABLE STORAGE SPACE.
MEMORY FROM 6000 HEX TO THE BOTTOM OF THE MONITOR STACK
WORKSPACE IS NOW 'PROTECTED' MEMORY AVAILABLE FOR
MACHINE LANGUAGE ROUTINES.
---------------------------------------------------------------

2.02 RESTORE nnnn WILL RESTORE TO A SPECIFIC LINE #.
===============================================================

2.03 SWAP INTEGER VARIABLES
100 A=A XOR B B: B=B XOR A : A=A XOR B
===============================================================

2.04 LEN(STR$(1»=2 SINCE A SPACE PRECEDES THE DIGIT.
USE A$ = MID$(STR$(J),2) TO EXTRACT JUST THE DIGITS.
---------------------------------------------------------------

2.05 MID$ FUNCTION EXAMPLES.
100
110
120
130
140

A$="1234567890"
PRINT MID$(A$,3,2)
PRINT MID$(A$,3,4)
PRINT MID$(A$,3)
PRINT MID$(A$,8,5)

MID$(A$,l,J) = LEFT$(A$,J)
•

REM
REM
REM
REM

OUTPUT
OUTPUT
OUTPUT
OUTPUT

"34"
"3456"
"34567890"
"890"

2.06 USE CHR$(64) TO PRINT THE '@' SIGN.
EXAMPLE:

100 PRINT "5 APPLES ";CHR$(64);" 15 CENTS EACH"

===============================================================

2.07 ORDER OF PRECEDENCE FOR NUMERICAL OPERATIONS
1.
2.
3.
4.
5.
6.

() EXPRESSIONS IN PARENTHESES.
EXPONENTIATION.
- NEGATION
* / MULTIPLICATION AND DIVISION
+ ADDITION AND SUBTRATION
NUMERICAL RELATIONS
= EQUAL
<> NOT EQUAL
< LESS THAN
> GREATER THAN
<= LESS THAN OR EQUAL
>= GREATER THAN OR EQUAL
7. NOT
8. AND
9. OR
A

---------------------------------------------------------------

2.08 FLOATING POINT INACCURACIES
100 J= 30*30 : X= 30 2 : PRINT J,X
A

BOTH SHOULD PRINT 900, HOWEVER THE SECOND NUMBER IS
PRINTED AS 900.001 BECAUSE ALL OPERATIONS EMPLOY ONLY SIX
DIGITS OF ACCURACY. THUS, ONE MAY HAVE TO TEST FOR A
BOUNDED CONDITION RATHER THAN FOR EQUALITY. FOR EXAMPLE:
110 IF X>899.997 AND X<900.003 THEN PRINT II X = 900 II
---------------------------------------------------------------

2.09 NUMERICAL RELATIONS
IF A RELATION IS 'TRUE ' , A VALUE OF -1 IS RETURNED.
IF A RELATION IS 'FALSE ' , A VALUE OF 0 IS RETURNED.
EXAMPLE:
OUTPUT:

100 PRINT 1=2, 1<2, 2=2, IIAII=IIAII, IIABII=IIAC II

o

-1

-1

-1

o

2.10 LOGICAL OPERA TOR TRUTH TABLES
AND

I

J

I AND J

-------------------------

OR

0
0
1
1

0
1
0
1

0
0
0
1

I

J

I OR J

-------------------------

o
o

o
o

1

1
1

1

o

1
1
1

EXAMPLE: J AND 255 = JUST THE LOWER BYTE
THIS IS A QUICK WAY TO GET THE
LOWER BYTE OF AN ADDRESS TO POKE.
15 AND 13 = 13

IN BINARY

1111 AND 1101 = 1101

-1 AND J

= J

BECAUSE -1 IS ALL ONES.

5

OR

2

= 7

IN BINARY

5

AND 2

= 0

0101 OR 0010 = 0111

NOT 0 = -1

FALSE = 0

TRUE = -1

NOT J = -(J+1)

TWO'S COMPLEMENT.

===============================================================

2.11 ONE SECOND DELAY LOOP IN BASIC
100 FOR J=1 TO 500:NEXT J
---------------------------------------------------------------

2.12 A 0.81 SECOND DELAY LOOP IN THE MONITOR
100 POKE 260,39 : POKE 261,224
110 X=USR(O)
: REM 0.81 SEC DELAY WITH EACH CALL
THIS 'CASSETTE OFF' ROUTINE GIVES 0.81 SECONDS OF DELAY.
===========~========================================== =========

2.13 A 3.24 SECOND DEL A V LOOP IN THE MONITOR
100 POKE 260,160 : POKE 261,226
110 X=USR(O)
: REM 3.24 SEC DELAY WITH EACH CALL

2.14 MULTIPLE LINE CHARACTER STRINGS.
GRAPHICAL FIGURES WHICH OCCUpy THREE OR FOUR PRINT LINES
AND ARE A FEW CHARACTERS WIDE MAY BE CREATED IN A SINGLE
STRING AND PRINTED WITH ONE PRINT STATEMENT. A SINGLE
PRINT STATEMENT USED TO PLACE THE FIGURE ON THE SCREEN IS
MUCH FASTER THAN PRINTING THE FIGURE WITH MULTIPLE PRINT
STATEMENTS.

'"

EXAMPLE:

..

100 A$ = "*****
*
*
*
*
*****"
110 PRINT A$
THE ABOVE PROGRAM WILL PRINT A BOX MADE FROM ASTERISKS.
THERE ARE HIDDEN CHARACTERS IN LINE 100 THAT MAKE THE
STRING A$ PRINT THE BOX ON FOUR LINES.
A STRING BEGINS AND ENDS WITH QUOTE MARKS, AND MAY
CONTAIN ANY CHARACTERS. OUR STRING CONTAINS THE
ASTERISKS THAT ARE SEEN, PLUS 'LINE FEED', 'CURSOR LEFT'
AND 'SPACE' CHARACTERS.
THE STRING CONSISTS OF THE FOLLOWING SEQUENCE OF
CHARACTERS IN THE ORDER PRESSED FROM THE KEYBOARD:
A$ = * * ** * 
*
*
*
*
*****"
II

THE STRING A$ IS 38 CHARACTERS IN LENGTH.
 IS A LINE FEED CHARACTER.
 IS A CURSOR LEFT CHARACTER.

--------------------------------------------------------------2.15 PRINT DECIMAL NUMBER IN HEXADECIMAL.
0000:
0004:
0005:
0008:
0009:

ED 5B 07 01 ENTRY LD
57
LD
CD EB E1
CALL
C1
POP
C9
RET

DE,(0107H)
D,A
OE1E8H
BC

;GET I # IN E
;GET J # IN D
;PRINT HEX #
;RELIEVE STACK

ROUTINE MUST RESIDE AT ADDRESS 0 FOR RST OH COMMAND.
100
110
120
130

POKE 262,199 : REM 'OUT I,J' BECOMES RST OH COMMAND.
INPUT X
: REM X IS DECIMAL # TO PRINT IN HEX.
I=X : IF X>32767 THEN I=x-65536
OUT I AND 255, X/256 : REM HEX # IS PRINTED.

----------

--

------

-----

-------

2.16 PRINT DECIMAL NUMBER IN HEXADECIMAL
0000: CD DO C7
0003: C3 E8 E1
100 POKE 260,0
110 X = USR(J)
•

;GET USR() #
;PRINT HEX #

ENTRY CALL OC7DOH
JP
OE1E8H

POKE 261,0 : REM USR() ENTRY ADDRESS
: REM PRINT HEX VALUE OF J

---------------------------------------------------------------

2.17 PRINT DECIMAL NUMBER IN HEXADECIMAL.
0000
0003

11 yy xx
C3 E8 El

ENTRY LD
JP

DE,nn
OE1E8H

nn IN DECIMAL
PRINT HEX #

TO USE THE ABOVE MACHINE LANGUAGE ROUTINE, FIRST PLACE
DECIMAL NUMBER TO CONVERT IN BYTES 1 AND 2.
EXAMPLE:

100 POKE 260,0 : POKE 261,0 : REM USR() ADDR
110 POKE 1,J AND 255 : POKE 2,J/256
120 X=USR(O) : REM PRINT HEX EQUIVALENT OF J

===============================================================

2.18 CONVERT HEXADECIMAL TO DECIMAL
100
110
120
130
140
150
160
170

DEF FNA(X) = (X AND 15) - 9 * (X > 64)

.

A$ = IFC07" : REM TYPICAL HEXADECIMAL # TO CONVERT

.

N=O : FOR J=l TO LEN(A$)
N=N*16 + FNA(ASC(MID$(A$,J») : NEXT J
PRINT A$;

II

HEXADECIMAL EQUALS "; N;

II

DECIMAL"

===============================================================

2.19 CONVERT DECIMAL TO HEXADECIMAL
100
110
120
130
140
150
160

N = 4000

: REM TYPICAL NUMBER TO CONVERT TO HEX

J = N : A$="II :REM A$ TO RECEIVE HEXADECIMAL DIGITS
I = J AND 15 : J = INT(J/16)
A$= CHR$(I+48 - 7*(I > 9» + A$ : IF J>O THEN 130
.
PRINT N;" DECIMAL EQUALS ";A$;" HEXADECIMAL"

2.20 MENU SELECTION USING 'IF X THEN RUN' STATEMENT
100 PRINT IIMENU SELECTION II
110 PRINT II 1 - FIRST PROGRAM II
120 PRINT II 2 - SECOND PROGRAM II
130 PRINT II 3 - THIRD PROGRAM II
140 ·
150 INPUT IIENTER SELECTION NUMBER II;X
160 IF X=l THEN RUN 1000
170 IF X=2 THEN RUN 2000
180 IF X=3 THEN RUN 3000
190 PRINT IIENTER NUMBER FROM 1 TO 3, PLEASE II
200
1000 REM
FIRST PROGRAM
2000 REM --- SECOND PROGRAM --3000 REM --- THIRD PROGRAM --'RUN '

ALL VARIABLES ARE RESET BY THE

.'
GOTO 150
I

COMMAND.

--------------------------------------------------------------

2.21 CARTESIAN COORDINATES FROM POLAR EQUATIONS.
100
110
120
130
140
200
210
220
230
240
250
260
270

FOR TH = 0 TO 180
R = COS(TH / 57.2958)
GOSUB 200
NEXT TH : END

REM PLOT MANY POINTS
REM SAMPLE POLAR FUNCTION
REM CONVERT TO (X,Y)

·

REM --- CONVERT RADIUS R AND ANGLE TH TO (X,Y) ---

·

X = R
Y = R

* SIN(TH / 57.2958)
* COS(TH / 57.2958)

REM --- NOW SCALE AND PLOT COORDINATE (X,Y) --RETURN

---------------------------------------------------------------

2.22 SHELL SORT TO PUT ARRAY
100
110
120
130
140
150
160
170
180

ZO

IN ASCENDING ORDER

D = N
:REM N=# OF ELEMENTS IN ARRAY Z()
D = INT(D/2)
FOR I=l TO N-D
IF Z(I) <= Z(I+D) THEN 160
T=Z(I) : Z(I)=Z(I+D) : Z(I+D)=T
IF I>D THEN IF Z(I-D) > Z(I) THEN I=I-D
GOTO 140
NEXT I
IF D > 1 THEN 110
RETURN

.

---

CHAPTER 3

FUNCTIONS

3.01 RANDOM NUMBER FUNCTION
J=RND(X) PRODUCES THE FOLLOWING DEPENDING ON X:
X>O
X=O
X 0

INT(xx.yy) = xx

INT(7.36) = 7

xx.yy < 0

INT(xx.yy) = xx - 1

INT(-7.3) = -8

==============================================================

3.04 SGNO FUNCTION
SGN(X) = 1 WHEN
SGN(X) = 0 WHEN
SGN(X) = -1 WHEN

X >
X =
X <

o.
o.
o.

.
-

----------

---,

~--

----~~

3.05 DEF FUNCTION RULES
THE FIRST 2 LETTERS MUST BE IFNI.
THE THIRD CHARACTER MUST BE A LETTER.
ADDITIONAL CHARACTERS ARE OPTIONAL.
THE NAME CANNOT CONTAIN ANY RESERVED WORDS.
ONLY THE 2 CHARACTERS AFTER THE FN MAKE THE NAME UNIQUE.
EXAMPLES:

FNA(

FNX1(

FNAA(

FNSQ(

FNUPPER(

THE ARGUMENT VARIABLE IS A DUMMY USED TO 'MAP' VALUES
INTO THE FUNCTION IF DESIRED.
OTHER VARIABLES IN THE FUNCTION USE THEIR CURRENT VALUES.
EXAMPLE:

100 DEF FNA(J)= J * J + X
110 J=5 : X=3 : PRINT FNA(2)

OUTPUT:

7

SINCE J WAS THE DUMMY ARGUMENT, IT MAPPED A 2 INTO THE
FUNCTION RATHER THAN USE ITS CURRENT VALUE OF 5.
THE CURRENT VALUE OF X WAS USED. THUS, 7 = 2 * 2 + 3.
===============================================================

3.06 DECIMAL POINT ALIGNMENT
100 DEF FNA(J)= (J=O) - (ABS(J)9)
EXAMPLE:
OUTPUT:

PRINT CHR$(FNA(14»
D

===============================================================

3.10 FIX COMMAND
100 DEF FNA(J) = SGN(J) * INT(ABS(J»
EXAMPLE:
OUTPUT:

PRINT FNA(-5.2)
-5

===============================================================

3.11 BASE 10 LOGORITHM
100 DEF FNLOG10(J) = LOG(J) * 0.4342945
EXAMPLE:
OUTPUT:

PRINT FNLOG10(1000)
3

===============================================================

3.12 PI

= 3.14159 = 355/113

57.2958 = 180 / PI
100 DEF FND(J) = J * PI / 180
110 DEF FNR(J) = J * 180 / PI

REM DEGREES TO RADIANS
REM RADIANS TO DEGREES

-----------

CHAPTER 4

---

KEYBOARD

4.01 ACCEPT 'YES' ANSWER WITH INPUT OF 'Y', 'YE' OR 'YES'
100 INPUT "ENTER 'YES' OR 'NO''';A$
110 IF LEFT$("YES",LEN(A$»=A$ THEN PRINT "YES"

===============================================================
4.02 KEYBOARD SCAN OR 'GET' COMMAND
100 POKE 318,195 : POKE 320,224
110 X=INP(9) : A$=CHR$(X)
X = ASCII VALUE OF KEY DEPRESSED.
X = 0 IF NO KEY IS DEPRESSED.
A$= CHARACTER KEYED.

'RETURN' NOT REQUIRED.

--------------------------------------------------------------4.03 PRINT ON LINE AFTER INPUT STATEMENT.
100 B$="ENTER EXAMPLE TEXT"
110 PRINT B$;:INPUT A$
120 PRINT TAB(LEN(B$)+LEN(A$)+5);CHR$(23);"THANK YOU"
THE ABOVE EXAMPLE TABS BEYOND THE LENGTH OF THE USER'S
INPUT TO PRINT THE COMPUTER'S RETURN RESPONSE ON THE
SAME LINE AS THE INPUT.

===============================================================
4.04 INPUT STRINGS CONTAINING COMMAS AND '@' SYMBOLS
100
110
120
200
210
220

POKE 318,195 : POKE 320,224
GOSUB 200 : PRINT A$ : END
:
A$="" : REM INPUT A$ UNTIL  RECEIVED
J = INP(9) : IF J=13 THEN RETURN
A$ = A$ + CHR$(J) : GOTO 210

4.05 KEYBOARD SCAN OF 'GRAPHIC', 'CONTROL', AND 'SHIFT'.
100 J=INP(254) AND 31
J
J
J
J
J

= 31
= 21
= 7
= 5
= 23

IF
IF
IF
IF
IF

'CONTROL' KEY IS DEPRESSED.
'GRAPHIIC' KEY IS DEPRESSED.
'SHIFT' KEY IS DEPRESSED.
'GRAPHIC - SHIFT' KEYS ARE DEPRESSED.
'NO KEY IS DEPRESSED.

'SHIFT LOCK ' KEY MUST BE DOWN.
===============================================================

4.06 WAIT FOR USER TO PRESS 'SHIFT' KEY TO CONTINUE.
100 PRINT "PRESS 'SHIFT' TO CONTINUE"
110 WAIT 254,31,23
120 PRINT "I WAS WAITING FOR YOU. THANKS.

II

CHAPTER 5

---

VIDEO

5.01 DOUBLE SPACE LISTINGS.
POKE 322,0 : LIST
---------------------------------------------------------------

5.02 SCREEN POKE ADDRESS FOR ANY ROW AND COLUMN.
100 DEF FNA(J) = R

* 64

+

C - 3968

R = ROW
NUMBER FROM 0 TO 29.
C = COLUMN NUMBER FROM 0 TO 63.
---------------------------------------------------------------

5.03 MAKE THE CURSOR DISAPPEAR AFTER A PRINT.
100 PRINT CHR$(17); : POKE -3968,32
OR, JUST REPLACE THE CHARACTER UNDER THE CURSOR WITH:
100 POKE 260,232 : POKE 261,233 : J=USR(O)
---------------------------------------------------------------

5.04 REMOVE CURSOR FROM SCREEN.
100 PRINT CHR$(12) : POKE -3904,32
---------------------------------------------------------------

5.05 SCREEN ADDRESSING
ADDRESS OF THE FIRST COLUMN IN EACH VIDEO LINE.
LINE#

HEX

-----

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15

F080
FOCO
F100
F140
F180
F1CO
F200
F240
F280
F2CO
F300
F340
F380
F3CO
F400

POKE DECIMAL
------------

-3968
-3904
-3840
-3776
-3712
-3648
-3584
-3520
-3456
-3392
-3328
-3264
-3200
-3136
-3072

LINE#
----16
17
18
19
20
21
22
23
24
25
26
27
28
29
30

HEX
F440
F480
F4CO
F500
F540
F580
F5CO
F600
F640
F680
F6co
F700
F740
F780
F7CO

POKE DECIMAL
------------

-3008
-2944
-2880
-2816
-2752
-2688
-2624
-2560
-2496
-2432
-2368
-2304
-2240
-2176
-2112

5.06 SYNC SCREEN MOTION WITH VIDEO HORIZONTAL SYNC.
100 WAIT 254,32
THIS WILL REMOVE SCREEN FLICKER AND DISAPPEARANCE OF
CHARACTERS DURING SCREEN MOTION DUE TO BEING OUT OF
SYNC WITH THE SCREEN REFRESH CIRCUITRY.
-------------~---------------------------------------- -----------------------------------------------------------------------

5.07 PRINT AT SUBROUTINE
100 CLEAR 200
: REM CURSOR DOWN
110 R$=CHR$(26)
: REM CURSOR RIGHT
120 C$=CHR$(19)
130 FOR J=l TO 6 : R$=R$+R$ : C$=C$+C$ : NEXT J
140 R$=CHR$(17)+R$ : REM ADD CURSOR HOME
150
160 REM --- PRINT TEXT AT ROW R, COLUMN C --170
180 R=5 : C=10 : A$="THIS IS AN EXAMPLE" : GOSUB 1000
190 END
200
1000 REM --- PRINT AT SUBROUTINE --1010 :
1020 PRINT LEFT$(R$,R);LEFT$(C$,C);A$ : RETURN
===============================================================

5.08 PLACE CURSOR AT ROW AND COLUMN.
THIS ROUTINE MUST BE LOCATED STARTING AT ADDRESS 0,
BECAUSE THE 'OUT' INSTRUCTION IS MADE INTO A RST OH
COMMAND.
0000:
0001:
0004:
0007:
0009:
OOOA:
OOOB:
OOOC:
OOOD:
OOOE:
OOOF:
0012:
0015:
0018:
OOlE:
001D:
OOlE:
001F:

E5
CD
2A
26
29
29
29
29
29
29
FD
FD
FD
CD
36
El
Cl
C9

A2 E1
07 01
00

75
74
77
CC
20

68
69
6A
E9

ENTRY PUSH
CALL
LD
LD
ADD
ADD
ADD
ADD
ADD
ADD
LD
LD
LD
CALL
LD
POP
POP
RET

HL
OE1A2H
HL,(0107H)
H,O
HL,HL
HL,HL
HL,HL
HL,HL
HL,HL
HL,HL
(IY+68H),L
(IY+69H),H
(IY+6AH),A
OE9CCH
(HL),20H
HL
BC

;GET IY
;GET ROW #
;*2
;*4
;*8
;*16
;*32
;*64
;ROW ADDRESS
;COL ADDRESS
;MOVE CURSOR
;STORE SPACE
;RELIEVE STACK

CALLING THE ROUTINE WILL MOVE THE CURSOR TO THE
REFERENCED SCREEN POSITION AND PLACE A SPACE THERE.
EXAMPLE:

100 POKE 262,199 : REM INSERT RST OH COMMAND
110 OUT 7,15
: REM CURSOR TO ROW 7, COL 15
120 PRINT "TEXT STARTS ON ROW 7, COLUMN 15"

===============================================================

5.09 PLACE CURSOR AT ROW AND COLUMN.
0000:
0001:

ROW
COL

DEFB 0
DEFB 0

;

0002:
0005:
0008:
0009:
OOOB:

oooc:

DODD:
OOOE:
OOOF:
0010:
0011:
0014:
0017:
001A:
001D:
001F:

CD
2A
7C
26
29
29
29
29
29
29
FD
FD
FD
CD
36
C9

A2 E1
00 00
00

75
74
77
CC
20

68
69
6A
E9

ENTRY

CALL
LD
LD
LD
ADD
ADD
ADD
ADD
ADD
ADD
LD
LD
LD
CALL
LD
RET

OE1A2H
HL, (ROW)
A,H
H,O
HL,HL
HL,HL
HL,HL
HL,HL
HL,HL
HL,HL
(IY+68H),L
(IY+69H) , H
(IY+6AH) ,A
OE9CCH
(HL),20H

POKE ROW
NUMBER IN ADDRESS O.
POKE COLUMN NUMBER IN ADDRESS 1.

;GET IY

;*2
;*4
;*8
;*16
;*32
;*64
;ROW ADDRESS
;COL ADDRESS
;MOVE CURSOR
;STORE SPACE

RANGE 0 - 29.
RANGE 0 - 63.

CALLING THE ROUTINE WILL MOVE THE CURSOR TO THE
REFERENCED SCREEN POSITION AND PLACE A SPACE THERE.
EXAMPLE:

100
110
120
130
140
200

POKE 260,2 : POKE 261,0 : REM USR() ADDR
R=7 : C=15 : GOSUB 200
PRINT "TEXT STARTS ON ROW 7, COLUMN 15"
STOP
.
POKE O,R : POKE 1,C : J=USR(O) : RETURN

5.10 DRAW BOX ROUTINE
THIS ROUTINE WILL DRAW A BOX AROUND A TEXT STRING.
PUT STARTING LOCATING OF STRING IN ROW AND COL, AND ITS
SIZE IN LENGTH.
THIS ROUTINE USES THE CURSOR PLACEMENT ROUTINE OF 5.09

0020: 00
2430:
2433:
2434:
2435:
2436:
2439:
243A:
243D:
243F:
2442:
2443:
2445:
2446:
2448:
2449:
244c:
244D:
244E:
244F:
2450:
2452:
2453:
2455:
2456:
2458:
245B:
245C:
245E:
245F:
2461:
2462:
2464:
2466:
2468:

21
35
23
35
3A
47
CD
36
11
19
36
19
36
E5
11
19
D1
23
13
36
EB
36
EB
10
11
23
36
19
36
19
36
3E
2E
C3

00 00

CURSOR

EQU

LENGTH

ORG 20H
DEFB 0

BOX

20 00
00 02
BC
40 00
A2
BE
80 FF
HaRZ
97
97
F6
40 00
BD
A2
BF
00
00
09 00

ORG
LD
DEC
INC
DEC
LD
LD
CALL
LD
LD
ADD
LD
ADD
LD
PUSH
LD
ADD
POP
INC
INC
LD
EX
LD
EX
DJNZ
LD
INC
LD
ADD
LD
ADD
LD
LD
LD
JP

.,.

02H

2430H
HL,ROW
(HL)
HL
(HL)
A, (LENGTH)
B,A
CURSOR
(HL),OBCH
DE,040H
HL,DE
(HL),OA2H
HL,DE
(HL),OBEH
HL
DE,OFF80H
HL,DE
DE
HL
DE
(HL),097H
DE,HL
(HL),097H
DE,HL
HORZ-$
DE,040H
HL
(HL),OBDH
HL,DE
(HL),OA2H
HL,DE
(HL),OBFH
A,OOOH
L,OOOH
CURSOR+7

.-

;STRING START
;BOX CORNER
;CURSOR TO CORNER
;TOP LEFT CORNER
;DOWN ONE ROW
;LEFT SIDE
;DOWN ONE ROW
;BOTTOM CORNER
;SAVE CORNER ADDR
;UP THREE ROWS
;HL = TOP ADDR
;DE = BOTTOM ADDR
;DRAW TOP LINE
;DRAW BOTTOM

LIN~

;LOOP ON LENGTH
;TOP RIGHT CORNER
;RIGHT SIDE
;BOTTOM CORNER
;CURSOR TO HOME

5.11 CREATE INVERSE VIDEO CHARACTER SET
100 FOR J=-1024 TO -1
110 POKE J,256 + NOT PEEK(J-1024)
120 NEXT J
USE THE IGRAPHIC I AND THE ISHIFT GRAPHIC I KEYS TO DISPLAY
THE INVERSE VIDEO CHARACTER SET.
THE SAME THING IS DONE BELOW IN MACHINE LANGUAGE:
0000:
0001:
0002:
0003:
0004:
0007:
OOOA:
OOOD:
OOOE:
OOOF:
0010:
0011:
0012:
0013:
0015:
0016:
0017:
0018:
0019:

E5
D5
C5
F5
21
11
01
7E
2F
12
23
13
OB
20
F1
C1
D1
E1
C9

00 F8
00 FC
00 04

F8

ENTRY PUSH
PUSH
PUSH
PUSH
LD
LD
LD
LOOP LD
CPL
LD
INC
INC
DEC
JR
POP
POP
POP
POP
RET

HL
DE
BC
AF
HL,OF800H
DE,OFCOO
BE,0400H
A, (HL)

;SAVE REGS

;CHARACTER SOURCE
; DESTINATION
;1024 COUNTER
;GET A ROW
;INVERT IT
;MOVE IT DOWN
(DE) , A
;HL = HL + 1
HL
;DE = DE + 1
DE
;COUNT IT
BC
NZ,LOOP-$ ;REPEAT TIL DONE
AF
BC
DE
;RESTORE REGS
HL

NOW THAT THE INVERSE CHARACTER SET HAS BEEN CREATED,
LET1S PRINT INVERSE TEXT FROM THE STRING A$.
200
300
310
320
330
340

INPUT A$ : GOSUB 300 : GOTO 200
.
REM THIS ROUTINE PRINTS A$ IN INVERSE VIDEO
:
FOR J=l TO LEN(A$)
PRINT CHR$(ASC(MID$(A$,J» OR 128); : NEXT J

RETURN

5.12 CREATE DOUBLE WIDE CHARACTER SET
64 ASCII CHARACTERS FROM ASCII 20H (SPACE) THROUGH
ASCII 5FH (UNDERSCORE) WILL BE MADE INTO DOUBLE WIDE
CHARACTERS USING THE 128 AVAILABLE GRAPHIC CHARACTERS.
THIS DOUBLE WIDE CHARACTER SET INCLUDES THE DIGITS,
SYMBOLS, AND THE UPPER CASE LETTERS.
THIS ROUTINE WILL CREATE THE DOUBLE WIDE CHARACTER SET.
100
110
120
130
140

FOR J= 32 TO 95 : I=(J-256)*8 : K=(2*J-192)*8
FOR L= 0 TO 7 : M=PEEK(I+L) : N=INT(M/16): P=M AND 15
R=O : s=o : FOR T= 0 TO 3 : V=2AT
R=R+(N AND V)*V*3 : S=S+(P AND V)*V*3 : NEXT T
POKE K+L,R : POKE K+L+8,S : NEXT L,J

A CHARACTER WITH ASCII VALUE J CAN BE PRINTED IN DOUBLE
WIDTH USING THE TWO GRAPHIC CHARACTERS WITH ASCII VALUE
OF 2*J + 64 AND 2*J + 65. SEE THE FOLLOWING EXAMPLE.
150 A$="SAMPLE TEXT STRING TO PRINT"
160 FOR 1=1 TO LEN(A$) : J=ASC(MID$(A$,I»*2+64
170 PRINT CHR$(J);CHR$(J+1); : NEXT I
OR, YOU MAY WISH TO HAVE THE CHARACTERS SENT TO THE VIDEO
DISPLAYED IN DOUBLE SIZE AUTOMATICALLY. THIS CAN BE
ACCOMPLISHED USING THE FOLLOWING VIDEO DRIVER. CHANGE
THE >SE O=xxyy VECTOR ADDRESS TO POINT TO THIS ROUTINE,
IE. >SE 0=0000, OR POKE 32720,0
POKE 32721,0 FOR 32K.
0000:
0002:
0005:
0006:
0008:
OOOB:
OOOC:

FE
FA
87
c6
CD
3C
C3

20
1B EO
40
1B EO
1B EO

CP
JP
ADD
ADD
CALL
INC
JP

32
M,VIDEO
A,A
A,64
VIDEO
A

VIDEO

;CHAR BEFORE SPACE
;YES, EXIT TO VIDEO
;J*2
;J*2+64
;PRINT LEFT HALF
;J*2+65
;PRINT RIGHT HALF
I

I

CHAPTER 6

---

JOYSTICKS

6.01 JOYSTICK / KEYBOARD STANDARD FOR THE SORCERER
This standard has been adopted by several software houses in
the USA and in Australia. Software offered by these vendors
which employs joystick/keyboard control will conform to this
standard. It is suggested that all SORCERER owners use this
standard for international compatibility of software and
hardware.
Two joysticks may be attached to the INPUT of the parallel
port. UNIT #1 uses the LOW-order 4 bits, and UNIT #2 uses the
HIGH-order 4 bits. Each unit may steer in the four basic
directions, LEFT, RIGHT, UP, DOWN, as well as in the four
diagonal directions. Both units operate independently, and
simultaneous operation is permitted.
FIRE BUTTON control may be included, and has priority over
directional control of the joystick unit it is attached to.
FIRE BUTTON is activated by grounding both BIT 0 and BIT I for
unit #1, and BIT 4 and BIT 5 for unit #2 .
KEYBOARD has priority over JOYSTICK, and overrides both
joystick units if used. KEYBOARD INPUT RESULT is returned as
the RESULT CODE of joystick unit #1, with joystick unit #2
disabled.
Keyboard directional control is via the arrow (normally
cursor control) keys in the NUMERIC KEYPAD only. The SHIFT key
need not be depressed when using these keys. FIRE BUTTON on
the keyboard is the NUMERIC-PAD 115 11 key (HOME). Optional FIRE
BUTTONS may be SKIP/TAB or SPACE BAR. FIRE BUTTON overrides
directional keys on the keyboard.
II

II

In the event that both the LEFT and the RIGHT keys are pressed
together, it is treated as NO INPUT. The same rule applies to
depressing both the UP and the DOWN keys together. The UP/LEFT
(117 11 ), UP/RIGHT (119 11 ), DOWN/LEFT (11111) and DOWN/RIGHT (113 11 )
keys on the numeric-pad are optional.
For programming in z80 machine code, the 8-bit INPUT RESULT
CODE is returned in the A-register. No other registers are
affected .. If there is no input, then return with a zero in
the A-register and with the Z-flag set.

6.02 JOYSTICK INTERFACE STANDARD TO PARALLEL PORT
BIT

PIN

FUNCTION

BIT

PIN

FUNCTION

12
24
13
25
12/24
20

UNIT #2
UNIT #2
UNIT #2
UNIT #2
UNIT #2
+5 VOLT

--------

0
1
2
3
0-1

10
22
11
23
10/22
8

UNIT #1
UNIT #1
UNIT #1
UNIT #1
UNIT #1
Ground

--------

LEFT
RIGHT
UP
DOWN
FIRE

4
5
6

7
4-5

LEFT
RIGHT
UP
DOWN
FIRE
SUPPLY

---------------------------------------------------------------

6.03 JOYSTICK CIRCUIT DIAGRAM
ATARI joysticks can be easily modified to connect directly to
the parallel port. A 4.7K 1/4 watt resistor pulls-up each
direction input to +5 volts at the nodes marked with ·Y· in the
diagram. The FIRE BUTTON employs the two diodes between the
LEFT and the RIGHT direction inputs, and GROUND connects to the
common line. When the joystick selects a direction, or the
fire button is pressed, a switch closes which changes the input
bit from +5 volts to ground.
switch
UP
Y
»------------+----0 0----+
DOWN
Y
»------------+----0
RIGHT
Y
»--------+---+----0

I
I

0----+

I
I

0----+

I
I
\ / DIODE
V

FIRE
+--------0

I
A

/ \
----I
LEFT
I

DIODE

I
I
I
I
I
I
I

0----+

I
I
I
I
I
I
I

Y ---»--------+-----+--0 0----+

I

GROUND
I
»-------------------------+

6.04 JOYSTICK EXAMPLE USING BASIC STATEMENTS
100 A = 255 - INP(255) : REM READ PARALLEL PORT
110 IF (A AND 3)= 3 THEN IIFIRE BUTTON UNIT #1
120 IF (A AND 48)=48 THEN IIFIRE BUTTON UNIT #2
11
11

130
140
150
160

IF
IF
IF
IF

A
A
A
A

AND
AND
AND
AND

1
2
4
8

170
180
190
200

IF
IF
IF
IF

A
A
A
A

AND 16
AND 32
AND 64
AND 128

THEN II UNIT #1 LEFT II
THEN II UNIT #1 RIGHT II
THEN II UNIT #1 UP II
THEN II UNIT #1 DOWN II
THEN
THEN
THEN
THEN

210 GOTO 100 : REM

UNIT
UNIT
II UNIT
II UNIT
II
II

#2
#2
#2
#2

LEFT II
RIGHT II
UP II
DOWN II

SCAN AGAIN

Use the Basic statements to observe the state of the
joysticks. The text strings tell what to do after
determining the condition of the joysticks. If you
branch to a routine to service Unit #1, be sure to
return to the testing of Unit #2 so that it can operate
simultaneous with Unit #1.
===============================================================

6.05 JOYSTICK EXAMPLE USING MACHINE LANGUAGE CODE
The joystick source lising of section 6.06 is a useful
routine that loads into memory from address 0 through A4
hex. To use the routine from a Basic program, set the
USR() jump address to 0 as shown on line 100 below.
Now initialize the location of each joystick cursor by
placing a screen row number and a column number in the
following addresses using POKE statements: (See example
on line 110 below.)
ADDRESS 2
3
4
5
6

-

#1, RANGE (1. .. 30).
#1, RANGE (1. .. 64) .
#2, RANGE (1. .. 30).
#2, RANGE (1. .. 64).
UNITS: = 1 UNIT #1 ONLY
= 2 UNIT #2 ONLY
= 3 BOTH UNITS FIRING.
7,8 - SCREEN ADDRESS OF UNIT #1
9,10 - SCREEN ADDRESS OF UNIT #2

100
110
120
130
140
150
160
170

ROW #
COLUMN #
ROW #
COLUMN #
FIRE FOR

UNIT
UNIT
UNIT
UNIT
BOTH

POKE 260,0:POKE 261,0:PRINT CHR$(12):REM
POKE 2,1:POKE 3,1:POKE 4,1:POKE 5,1 :REM
Z=USR(O)
:REM
L=PEEK(2)*64+PEEK(3)-4033
:REM
POKE L,ASC(1I1
:REM
M=PEEK(9)+PEEK(10)*256-65536
:REM
POKE M,50
:REM
GOTO 120
:REM
11 )

USR() ADDR
INITIALIZE
GET JOYSTICK
SCREEN ADDR
CURSOR #1
ANOTHER WAY
CURSOR #2
DO AGAIN

6.06 MACHINE LANGUAGE JOYSTICK ROUTINE
This routine reads the status of the joysticks connected to
the parallel port and updates the ROW, COLUMN and FIRE
variables for each joystick. The routine will keep the
row variables in the range of (1~ .. 30), and the column
variables in the range of (1 ... 64). The user's Basic program
can access these variables to compute the screen position of
each joystick, or read directly the contents of ADDR1 and ADDR2.
Section 6.05 gives an example of how Basic might access this
routine.
0000: 18 09

ENTRY

JR

START-$

0002:
0003:
0004:
0005:
0006:
0007:
0009:

ROW1
COL1
ROW2
COL2
FIRE
ADDR1
ADDR2
,
LEFT1
RIGHT1
UP1
DOWN1
FIRE1
LEFT2
RIGHT2
UP2
DOWN2
FIRE2

DEFB
DEFB
DEFB
DEFB
DEFB
DEFW
DEFW

1
1
1
1
0
0
0

EQU
EQU
EQU
EQU
EQU
EQU
EQU
EQU
EQU
EQU

0
1
2
3
3
4
5
6
7
48

IN
CPL
OR
LD
LD
RET

A,(OFFH)

;GET JOYSTICK

A
HL,FIRE
(HL),OOOH
Z

;ANY ACTIVITY

PUSH
AND
CP
JR
INC
POP
PUSH
AND
CP
JR
INC
INC

AF
FIRE1
FIRE1
NZ,L001D-$
(HL)
AF
AF
FIRE2
FIRE2
NZ,L0027-$
(HL)
(HL)

01
01
01
01
00
00 00
00 00

,

,.

OOOB:
OOOD:
OOOE:
OOOF:
0012:
0014:

DB FF
2F
B7
21 06 00
36 00
c8

0015:
0016:
0018:
001A:
001C:
001D:
001E:
001F:
0021:
0023:
0025:
0026:

F5
E6
FE
20
34
F1
F5
E6
FE
20
34
34

START

03
03
01
L001D
30
30
02

-

--------_.

~~

;REMOVE FIRES
;RET IF IDLE

;FIRE1 ACTIVE

;FIRE2 ACTIVE

H
D

= COLUMN
= COLUMN

1
2

L
E

= ROW
= ROW

1
2

INCREMENT COL IF RIGHT
INCREMENT ROW IF DOWN
DECREMENT COL IF LEFT
DECREMENT ROW IF UP
;

0027:
0028:
002B:
002F:
0031:
0033:
0034:
0036:
0038:
0039:
003B:
003D:
003E:
0040:
0042:
0043:
0045:
0047:
0048:
004A:
004c:
004D:
004F:
0051:
0052:
0054:
0056:

F1
2A
ED
CB
28
25
CB
28
15
CB
28
24
CB
28
14
CB
28
2D
CB
28
1D
CB
28
2C
CB
28
lC

02 00
5B 04 00
47
01

L0027

67
01

L0034

4F
01

L0039

6F
01

L003E

57
01

L0043

77
01

L0048

5F
01

Lo04D

7F
01

L0052

POP
LD
LD
BIT
JR
DEC
BIT
JR
DEC
BIT
JR
INC
BIT
JR
INC
BIT
JR
DEC
BIT
JR
DEC
BIT
JR
INC
BIT
JR
INC

AF
HL, (ROW1)
DE, (ROW2)
LEFT1,A
Z,L0034-$
H
LEFT2,A
Z,L0039-$
D
RIGHT1,A
Z,L003E-$
H
RIGHT2,A
Z,L0043-$
D
UP1,A
Z,L0048-$
L
UP2,A
Z,L004D-$
E
DOWN1,A
Z,L0052-$
L
DOWN2,A
Z,L0057-$
E

COLUMN RANGE:
ROW
RANGE:

0057:
0059:
005A:
005C:
005D:
005E:
0060:
0061:
0063:
0064:
0066:
0067:
0068:
006A:

3E
BD
20
2D
BB
20
ID
3E
BC
20
25
BA
20
15

1F

,.
L0057

01
01
41

L005D
L0061

01
01

Lo067

LD
CP
JR
DEC
CP
JR
DEC
LD
CP
JR
DEC
CP
JR
DEC

1 - 64
1 - 30

A,31
L
NZ,L005D-$
L
E
NZ,L0061-$
E
A,65
H
NZ,L0067-$
H
D
NZ,L006B-$
D

;ROW LIMIT

;COL LIMIT

,.
006B:
006D:
006E:
0070:
0071:
0072:
0074:
0075:
0076:
007B:
0079:
007A:
007C:

3E
BD
20
2C
BB
20
1C
BC
20
24
BA
20
14

007D:
ooBO:
00B4:
00B7:
OOBA:
OOBD:
0090:
0093:

22
ED
CD
22
2A
CD
22
C9

00

L006B

01
L0071

01

L0075

01

L0079

01

,.
02
53
94
07
04
94
09

00
L007D
04 00
00
00
00
00
00

LD
CP
JR
INC
CP
JR
INC
CP
JR
INC
CP
JR
INC

A,OOOH
L
NZ,L0071-$
L
E
NZ,L0075-$
E
H
NZ,L0079-$
H
D
NZ,L007D-$
D

;KEEP > 0

LD
LD
CALL
LD
LD
CALL
LD
RET

(ROW1),HL
(ROW2) ,DE
ADDRESS
(ADDR1),HL
HL,(ROW2)
ADDRESS
(ADDR2),HL

;ROW1 - COL1
;ROW2 - COL2
;SCREEN ADDR1
;SCREEN ADDR2

CONVERT ROW AND COL TO A SCREEN
ADDRESS STORED IN ADDR1 AND ADDR2

,
0094:
0095:
0097:
0099:
009A:
009B:
009C:
009D:
009E:
009F:
OOAO:
00A3:
00A4:

5C
16 00
26 00
29
29
29
29
29
29
19
11 3F FO
19
C9

ADDR = SCREEN BASE

ADDRESS LD
LD
LD
ADD
ADD
ADD
ADD
ADD
ADD
ADD
LD
ADD
RET

+

E,H
D,OOOH
H,OOOH
HL,HL
HL,HL
HL,HL
HL,HL
HL,HL
HL,HL
HL,DE
DE,OF03FH
HL,DE

-----~---

ROW * 64

+

COL

;DE = COL
;HL = ROW
*2
,· *4
,· *B
,· *16
; *32
;HL = ROW*64
;ROW + COL
;SCREEN BASE

-----

CHAPTER 7

---

SOUND

7.01 PRINCIPLE OF ONE VOICE SOUND
Generating sound from your Sorcerer is not that difficult, and
this discussion will help you get started by detailing a machine
language routine to generate music.
Letls use the parallel port as a means to output a signal to an
external speaker since the Sorcerer does not have an internal
speaker like some other computers do. I DO NOT recommend
connecting a small 8 ohm speaker directly between one of the
parallel portis output bits and ground. It is safer to have an
output bit drive a transistorls base via a 1K resistor, and
let the transistor switch current through a small speaker. Or,
you may wish to use the music interface board that comes with
our four voice Music System.
The statement: 10 FOR I=l TO 100:0UT 255,255:0UT 255,0:NEXT I
generates a low pitched note by toggling the output bits on the
parallel port from high to low, back to high. It may be
sufficient for your needs, but provides no control over the
pitch of the sound. However, it illustrates the principle of
how sound will be generated in machine language.
The following code generates notes.
0000:
0001:
0002:
0003:
0006:
0007:
0008:
0009:
OOOB:
OOOD:
OOOF:
0010:
0011:
0012:
0014:
0015:
0016:
0017:

F5
C5
E5
21
79
2F
4F
06
D3
10
2B
7D
B4
20
E1
C1
F1
C9

60 00

40
FF
FE

F2

ENTER PUSH
PUSH
PUSH
LD
TOP
LD
CPL
LD
LD
OUT
LOOP DJNZ
DEC
LD
OR
JR
POP
POP
POP
RET

AF
BC
HL
HL,DURATION
A,C

;SAVE REGISTERS USED
; LENGTH OF SOUND
; TOGGLE OUTPUT BITS

C,A
B,PITCH
(OFFH) ,A
LOOP-$
HL
A,L
H
NZ,TOP-$
HL
BC
AF

;FREQUENCY CONTROL
;TO PARALLEL PORT
; DELAY
;DOWN COUNT DURATION
;IS COUNT = o ?
;LOOP WHILE HL<>O
;RESTORE REGISTERS
;RETURN FROM SUBROUTINE

You can vary the pitch by changing the values loaded into
register B (ie. contents of address OAH.) How long the note is
played is controlled by the duration value loaded into HL (ie.
the contents of address 04H and 05H.)
The routine above suffers from the effect of having the delay
loop nested inside of the duration loop. If the delay loop is
tight, then the duration is accordingly shortened, since the
total time in the routine is the product of the two loop
parameters. A routine which has a duration independent of the
frequency is given in 7.02

7.02 ONE VOICE MUSIC ROUTINE
FREQ
DURATION
SPEED
OODO:
00D1:
00D2:
00D3:
00D4:
00D6:
00D9:
OODA:
OODD:
00E1:
00E3:
00E4:
00E7:
00E8:
00E9:
OOEB:
OOEE:
OOFO:
00F1:
00F2:
00F3:
00F4:

F5
C5
D5
E5
FD
21
4E
11
FD
D3
OD
C2
2F
4E
FD
DA
FD
E1
D1
C1
F1
C9

EQU
EQU
EQU

,.

ORG
PUSH
PUSH
PUSH
PUSH
PUSH
E5
FC 00
ENTER LD
LD
FF 14
LD
2A FD 00
LD
LOOP OUT
FF
DEC
JP
E9 00
CPL
LD
SKIP ADD
19
E1 00
JP
E1
POP
POP
POP
POP
POP
RET

OFCH
OFDH
14FFH

;STORE PITCH # IN 253
;DURATION # IN 254 - 255.
;TEMPO FOR ENTIRE SONG.

ODOH
AF
BC
DE
HL
IY
HL,FREQ
C, (HL)
DE, SPEED
IY, (DUR)
(OFFH),A
C
NZ,SKIP

;LOCATE ON ZERO PAGE
;SAVE REGISTERS

C, (HL)
IY,DE
C,LOOP
IY
HL
DE
BC
AF

;GET FREQUENCY #
;GET DURATION
;TO PARALLEL PORT
;IS IT TIME TO TOGGLE
;TOGGLE OUTPUT
;RELOAD FREQUENCY COUNT
;LOOP UNTIL DURATION UP

;RESTORE REGISTERS
; RETURN

To use the above routine from Basic, store the frequency number
in byte 253 with POKE 253,FREQ. Store the duration in bytes
254, and 255 with POKE 254,DURATION:POKE 255,0. Usually
control from (254) is sufficient, and keep (255) at zero.
Call the routine through the USR() function by poking the entry
address into 260, and 261: POKE 260,214:POKE 261,O:X=USR(0).
Here are frequency numbers to generate notes for one octave.
Higher octaves can be obtained by dividing these numbers by 2,
4, and 8, etc.
C - 268
E - 213
G# - 169

C# - 253
F - 201
A - 160

D - 239
F# - 190
A# - 151

D# - 226
G - 179
B - 142

Although the above music routine is fun and easy, its
usefulness is no comparison to the enjoyment you'll get from
the four voice Music System from Arrington Software Service.

"I

7.02 ONE VOICE MUSIC ROUTINE
FREQ
DURATION
SPEED

EQU
EQU
EQU

,

ORG
OODO: F5
PUSH
00D1: C5
PUSH
00D2: D5
PUSH
00D3: E5
PUSH
00D4: FD E5
PUSH
00D6: 21 FC 00
ENTER LD
LD
00D9: 4E
OODA: 11 FF FF
LD
LD
OODD: FD 2A FD 00
LOOP OUT
00E1: D3 FF
DEC
00E3: OD
JP
00E4: C2 E9 00
CPL
00E7: 2F
00E8: 4E
LD
SKIP ADD
00E9: FD 19
OOEB: DA E1 00
JP
OOEE: FD E1
POP
OOFO: E1
POP
00F1: D1
POP
00F2: C1
POP
POP
00F3: F1
00F4: C9
RET

OFCH
OFDH
FFFFH

;STORE PITCH # IN 252
;DURATION # IN 254 - 253.
;TEMPO FOR ENTIRE SONG.

ODOH
AF
BC
DE
HL
IY
HL,FREQ
C, (HL)
DE,SPEED
IY, (DUR)
(OFFH),A
C
NZ , SKIP

;LOCATE ON ZERO PAGE
;SAVE REGISTERS

C, (HL)
IY,DE
C,LOOP
IY
HL
DE
BC
AF

;GET FREQUENCY #
;GET DURATION
;TO PARALLEL PORT
;TS IT TIME TO TOGGLE
;TOGGLE OUTPUT
;RELOAD FREQUENCY COUNT
;LOOP UNTIL DURATION UP

;RESTORE REGISTERS
; RETURN

Tp use the above routine from Basic, store the frequency number
in byte 252 with POKE 252,FREQ. Store the duration in bytes
254, and 253 with POKE 254,DURATION:POKE 253,0. Usually
control from (254) is s~fficient, and keep (253) at zero.
Call the routine through the USR() function by poking the entry
address into 260, and 261: POKE 260,208:POKE 261,0:X=USR(0).
Here are frequency numbers to generate notes for one octave.
Higher octaves can be obtained by dividing these numbers by 2,
4, and 8, etc.
C - 268
E - 213
G# - 169

C# - 253
F - 201
A - 160

D - 239
F# - 190
A# - 151

D# - 226
G - 179
B - 142

Although the above music routine is fun and easy, its
usefulness is no comparison to the enjoyment you'll get from
the four voice Music System from Arrington Software Service.

f

7.03 PIEZO SPEAKER AUDIO PROMPTER
A miniature 4.7 KHz piezo speaker can be purchased at Radio
Shack for three dollars and connected directly to the
Sorcerer's parallel port. Connect the red wire to pin 4, and
the black wire to pin 8.
The piezo speaker is a self contained chamber which resonates
at a fixed frequency when activated with a voltage between 3
and 9 volts. Although I chose to connect the red wire to bit 7
of the port, any of the eight bit outputs will work equally
well. The statement of OUT 255,128 causes bit 7 of the port
to go to a logical high, thus sourcing the speaker with 5
volts. The 5 volts causes the speaker to continually sound
until bit 7 is returned to a logical low with an OUT 255,0.
The 255 is the address of the parallel port.
Sending the command sequence of OUT 255,128:0UT 255,0 will
cause the speaker to chirp since it sees a brief 5 volt pulse.
This audio addition to the Sorcerer is inexpensive and has
found frequent use in programs to signal an event in a
program's execution, or to prompt the user that an input is
required at the keyboard.
This speaker cannot be used to reproduce the music spoken of in
7.01, 7.02, and 7.04. Also, it will not produce the sound that
accompanies much of the game software on the market.
---------------------------------------------------------------

7.04 CONTROL 'G' BEEP
THIS ROUTINE INTERCEPTS CONTROL 'G' CHARACTERS SENT TO
THE VIDEO DRIVER AND OUTPUTS A BEEP. USE THE MUSIC
INTERFACE BOARD FROM OUR MUSIC SYSTEM.
ACTIVATE WITH
0000:
0002:
0005:
0006:
0007:
OOOA:
OOOB:
OOOC:
OOOD:
OOOF:
0011:
0013:
0014:
0015:
0016:
0018:
0019:
001A:

FE
C2
C5
E5
21
79
2F
4F
06
D3
10
2B
7D
B4
20
E1
C1

cg

07
FO E9

>SE 0=0
ENTER

60 00
TOP
40
FF
FE

F2

LOOP

CP
JP
PUSH
PUSH
LD
LD
CPL
LD
LD
OUT
DJNZ
DEC
LD
OR
JR
POP
POP
RET

7
NZ,VIDEO
BC
HL
HL,DURATION
A,C

;CONTROL G ?
;EXIT IF NOT
;LENGTH OF
;TOGGLE OUTPUT

C,A
B,PITCH
(OFFH) , A
LOOP-$
HL
A,L
H
NZ,TOP-$
HL
BC

; FREQUENCY
;PARALLEL PORT
; DELAY
;DOWN COUNT
;IS COUNT=O ?
;LOOP IF HL<>O
; RETURN

- - - - _... _----------

CHAPTER 8

---

BASIC ROMPAC

8.01 BASIC ROMPAC MAP by P. HOLMICK
NOTES:

(1) Floating Point variables occupy 4 bytes.
(2) ACC is the floating point accumulator 01BF to 01C2.
(OlBF) = Least significant byte.
(OlCO) = Next most significant byte.
(OlC1) = Most significant byte.
(OlC2) = Exponent.
(3) NTF is the Number,Type Flag (0190).
(0190) = 1 for Strings
(0190) = 0 for Numbers
(4) For arithmetic operations requiring 2 operands, one
is usually the ACC, and the other is either (HL) or
BCDE, where BCDE contains:
B = Exponent.'
C = Most significant byte.
D = Next most significant byte.
E = Least significant byte.
(5) HL is used as the text pointer for most of the
comparison or conversion routines.

ADDRESS
COOO:
C06B:
C075:
coBo:
COB2:
COB5:
coc6:

FUNCTIONAL DESCRIPTION

Moves a block of memory from C25B-C2A6 to 0100-014E.
BASIC Warm Start
"BYTES FREE" string.
String address for double CR-LF.
String address for single CR-LF.
"EXIDY STANDARD BASIC VER 1.0 ..... etc." message string.
Command Jump Table.
D606,D6CA,D61C,0103,CEE9,D24A,CF17,DBBA,D999,D4AB,D908,
DAOE,DA14,DA75,DABA,D6FE,D1BB,CF9F,D225,D19A,D1AB,D1BB,
D1EB,D1F5

COF6: BASIC Token Table.
END,FOR,NEXT,DATA,BYE,INPUT,DIM,READ,LET,GOTO,RUN,IF,
RESTORE GOSUB,RETURN,REM,STOP,OUT,ON,NULL,WAIT,DEF,POKE,
PRINT,CONT,LIST CLEAR,CLOAD,CSAVE,NEW,TAB(,TO,FN,SPC(,
THEN,NOT,STEP,+,-,*,/,A, AND,OR,>,=,<,SGN,INT,ABS,USR,
FRE,INP,POS,SQR,RND,LOG,EXP,COS,SIN,TAN,ATN,PEEK,LEN,
STR$,VAL,ASC,CHR$,LEFT$,RIGHT$,MID$
C1El: Command Jump Table continued.
C709,C62E,CB34,CBB5,E003,CA43,CD4F,CA72,C8CC,C872,C855,
C944,C6DD,C861,CB90,CBB7,C707,D256,C926,C748,D25C,CF1F,
D705,C96B,C735,C5C6,CBOF,D341,D2C9,C41A

•.

C21D: Jump Table for Arithmetic Operators (+,-,*,/,A,AND,OR)
D7A2,D3AA,D4EA,D54B,D8C3,CCA8,CCA7
Includes a one-byte "precedence" value for each operator
which tells the Interpreter the order of arithmetic
computations.
C232: start of Error Codes Table (2 Bytes each)
C258: start of 4EH bytes to be copied into BASIC CONTROL AREA
from 0100H
C2A3: " ERROR" message
C2AA: " IN " message.
C2AF: "READY" message.
C2B7: "BREAK" message.
C2BD: Used by  ...  loops to manipulate SP so that
 knows where the last  statement ends.
C2EO: Gets variable name from a line of BASIC - loads it into
the variable area.
C2E6: Move bottom of program further down in memory.
BC = Destination address.
DE = Stopping address, ie. stop when HL = DE.
HL = End of program address, ie. source address.
C2F1: Check to see that there's enough free memory for next
operation.
C309: OM ERROR
C30E: Puts last-used  line number into (0147) so that
BASIC will print "?SN ERROR IN xx". Where xx=Data Line
Number
C314: SN ERROR
C317: /0 ERROR
C31A: NF ERROR
C320: UF ERROR
C322: Prints error message. To use this routine, load the E
register with Oto 24H before jumping here.
-----------------------------------Error Message
E = nn
-----------------------------------NF
Next Without For
00
SN
Syntax
02
RG
Return Without Gosub
04
OD
Out of Data
06
FC
Illegal Function Call
08
OV
Calculation Overflow
OA
OM
Out of Memory
OC
UL
Undefined Line Number
OE
BS
Bad Subscript
10
DD
Redimensioned Array
12
/0
Division by Zero
14
ID
Illegal Direct Mode
16
TM
Type Mismatch
18
OS
Out of String Space
1A
LS
String too Long
1C
ST
String Formula too complex 1E
CN
Can't Continue
20
UF
Undefined User Function
22
MO
Missing Operand
24
------------------------------------

C359:
C366:
C3DD:
C3EO:
C3FA:

C41A:
C426:
C45A:
C467:
C521:
C53A:
C565:
C574:
C57A:

Print II READY II - back to DIRECT COMMAND mode.
Same as C359 except doesn't print IIREADY".
Reset Program pointers - rejustify Link Pointers.
Rejustify Link Pointers (see also D394). This can be used
to RECOVER a BASIC program after  or RESET or even
 if the original program hasn't been over-written.
Searches for a particular Line Number in a BASIC program.
To search
DE = required line number
If found
BC = Start of Line
HL = Start of next line.
Carry Flag is set (=1).

Part of  routine. Entering here resets HIMEM, STRING
Space, and variable area pointers BUT doesn't destroy the
first Link bytes thus not lIerasing" the program.
Keyboard Input. Prints "?II then jumps to C53A.
This routine scans the input Buffer and converts lower
case to upper case (unless the text is enclosed in
quotes) - converts BASIC reserved words to TOKENs.
Resets HL = 014B and puts 3 zeros at end of program.
Inputs a string of characters from the keyboard until
RETURN is pressed. Uses the buffer from o14c to o18c. On
exit, HL=014B and B=number of characters entered.
This is where BASIC tests for buffer overflow but DOESN'T
do anything about it !!! (Perhaps JR Z C550 would be a
suitable patch.)
Compares HL with DE and sets the flags accordingly.
Z flag set when DE = HL.
C flag set when DE < HL.
Tests for lIexpected" characters such as commas, semicolons, and left and right brackets.
To use
HL should point to the BASIC text to test.
CALL C57A
II ,
Test for comma.
NOTE: If a match is NOT made, then an ?SN error results
II

C585: Prints the character in the A register. This calls the
Monitor Send Vector, EOOC.
C5B4: This could be used to implement a  or 
function. Inputs one character to the A register. Calls
the Monitor Receive Vector, E009, but will not return
until a key is pressed !
C5C6: 
C62E: 
C66E: 
C689: Re-entry point to BASIC interpreter. HL should be
pointing to the zero byte at the end of the line, or the
colon in a multi- statement line.
C6AD: BASIC Interpreter starts here. HL should point to the
byte before
the actual text to be interpreted.
C6CD: Skips over blanks in the BASIC text by incrementing HL.
The Carry Flag is set if the next character is a number.
C6DD: 
C6F8: This is the routine that's supposed to pause LISTings if
ESC or RUN/STOP was pressed, however the byte at C701 is
wrong. It should be 1BH instead of 13H.

..

C707: 
c709: 
C70E: Prints "BREAK" if CONTROL-C pressed in DIRECT MODE,
else "BREAK IN .... line number" if in RUN MODE.
C735: 
C74B: 
C75A: CLOAD* jumps here. (OlAF) = FF and (OlAC) = 01
C75F: CSAVE* jumps here. (OlAF) = 01 and (OlAC) = 01
Used by CSAVE*
C7B9: Write 4 bytes to tape.
C792: Input 4 bytes from tape. Used by CLOAD*
C7B6: Turn off cassette motors - finish up.
C7BC: Tests for alpha-character pointed to by HL, and resets
Carry Flag if found.
C7C4: As for C7DO below, but first evaluates a BASIC expression
pointed to by HL, then puts result into ACC.
?FC ERROR if negative.
C7DO: DE = INTeger value of floating point value in ACCumulator
C7E5: FC ERROR
C7EA: DE = Hex of numeric string pointed to by HL.
On exit, HL points to first non digit character.
CBOF:  where n=string space, N=top of BASIC RAM.
CB55: 
CB5B: Go address for >LOG BASIC programs. The program must
have Line Number 0 and FILE Type must be 
CB72: 
cBBB: UL ERROR
CB90: 
CB99: RG ERROR
CBB5: 
CBB7: 
cBcc: 
C91F: Moves a variable (4 bytes) from ACC to (HL). On exit, HL
points to the delimiter and DE points to the first of the
4 bytes in the variable area.
C926: 
C944: 
C96B: 
C9B2: Do a CR-LF unless cursor is in the first column.
C9BF: Do a CR-LF.
C9C9: Delay by sending number of NULL characters in (0141).
C9F1: Here for  or  initially.
CA01: 
CA04: 
CA1B: "?REDO FROM START" message string.
CA43: 
CA72: 
CAFF: "?EXTRA IGNORED" message string.
CB10: Used by  .
CB34: 
CB7F: Calls CB93 to evaluate BASIC expression - check for TM
Error.
CBB2: Checks for NTF=O
==> Numeric Operation.
==> String Operation.
CBB3: Checks for NTF=l
CBBA: TM ERROR

CB8F: Tests for left bracket and evaluates the expression.
Jumps to ?SN ERROR if left bracket not found.
Evaluates
BASIC expression, pointed to by HL.
CB93:
CCOA: Used by several routines (esp.CB93) to test for +, .,_,11,
, and evaluates them if found: Also indexes into
Jump Table at coc6 to get addresses for  thru 
CC14: MO ERROR
CC45: Evaluate expression then check for right bracket 11)11,
else ?SN ERROR.
CC5E: Loads ACC with variable - sets NTF. HL should point to
variable name.
CC6F: All commands  to  and  to  pass
through here.
Numeric routines :  to  jump to CC96.
IIStringll routines : to  continue on to CC7D.
CC96:  and others, jump from here.
ACC = (SP) OR ACC.
CCA7: 
ACC = (SP) AND ACC.
cCA8: 
CD2F: 
CD4F: 
CD54: This routine searches for a variable (name pointed to by
HL) and either (1) Returns its address in DE
or (2) Creates the variable if not found.
CDF8: Make ACC point to READY
CE4D: DD ERROR
CE5E: BS ERROR
CEE9: 
CF17: 
CF1A: ACC = Floating point of value in A.
CF1F: 
CF42: 
cF8o: Checks to see if Sorcerer is in RUN mode or DIRECT mode.
CF89: ID ERROR
CF9F: 
CFC4: Loads (OlA2)=String Length in A.
(OlA4)=Start address of string in DE.
CFD3: Counts number of characters in a string.
On entry: HL should point to start of ASCII string.
On exit : BC = string length
HL = address of delimiter.
DOOF: ST ERROR
D015: Prints a string using C585. Again, HL must point to start
of string.
D02E: First checks if there's still free string space.
?OS ERROR if none.
After a CALL D02E, DE points to start of sub-string.
A = sub-string length.
D093: String Space Garbage Collection routine.
D10F:
D146: Sets up registers before continuing to D14F.
On entry : Return address - pointer to 4 bytes of string
information are on the Stack.
II

II •

I,

"

D14F: Used by string commands to remove sub-strings.
On entry : L=sub-string length.
BC=start address of sub-string within main
DE=start address of new string.
D159:
D17A:
D18B:
D19A:
D1AB:
D1BB:
D1EB:
D1F5:
D225:
D240:
D24A:
D256:
D25C:
D27A:
D28D:
D2A1:
D2A4:
D2AD:
D2BD:
D2C9:
D2CE:
D304:
D310:
D336:
D341:
D346:
D384:








Tests for a right bracket 11)11 after RIGHT$, LEFT$ or MID$
On return, B=substring length.



Used by  to evaluate - load the port value.
A = Hex of numeric string pointed to by HL.
FC ERROR if > 255.
Writes 2 bytes to tape. (Byte is in A).
Writes 1 byte to tape.
Reads 1 byte from tape.
Writes 1 byte to tape.


Finish off CSAVE.
Put program FILENAME (max.5 chars) into 16 byte tape
output file header which starts at (IY+47H).
If length of FILENAME < 5 then pad to right with blanks.


This is part of . Loads (01B7) with the end of the
CLOADed program, prints IIREADy and re-creates the link
pointers.
Repair the link pointers in a BASIC program.
ACC = ACC + 0.5
ACC = (HL) + ACC
ADDITION
ACC = (HL) - ACC
SUBTRACTION
ACC = BCDE - ACC
ACC = BCDE + ACC
Sets ACC = Zero by making the floating point exponent
(01C2)=O.
OV ERROR
BCDE = - BCDE

ACC = ACC * LOG(2)
ACC = (SP) * ACe
ACC = BCDE * Aec
ACC = (SP) * Ace
ACC = BCDE / ACC
Ace = ACC * 10
Checks if Ace = O? and sets Z flag if it is.

ll

D394:
D39D:
D3AO:
D3A6:
D3AC:
D3AF:
D415:
D451:
D462:
D4AB:
D4E3:
D4EA:
D4EC:
D54B:
D54D:
D5EO:
D5F7:
D606:

D60E: ACC = Floating Point of BADE. This routine can be used
to return values to the USR(x) function.
B = Exponent
A = MSB including Sign Bit
D = NSB
E = LSB.
(A=O for +ve)
For -65536 < x < +65536: XOR A
(A=FF for -ve)
LD
B, 9BH
LD DE, NNnn
JP
D60E
D61C: 
D620: Part of ABS routine, the only difference is that it
doesn't test the ACC for zero.
D62B: (SP) = ACC. Loads the floating point value from the ACC
to the stack To get it back, POP BC then POP DE.
D635: ACC = (HL). Loads floating point value (4 bytes) from HL
to ACC.
D63B: ACC = BCDE.
D643: BCDE = ACC
D646: BCDE = (HL)
D64F: (HL) = ACC
D652: (HL) = (DE). Move 4 bytes from location pointed to by DE
to HL.
D654: (HL) = (DE). Move # bytes in B register.
D65D: ACC = - ACC
D672: Compares ACC with BCDE.
If ACC < BCDE then A = FFH (-1)
ACC = BCDE then A = 00
ACC > BCDE then A = 01
D6CA: 
D6FE: 
D705: 
D716: ACC = Floating Point of Numeric String pointed to by HL.
D7C6: Numeric String = ACC. (Opposite of D716).
DB90: Compares ACC with 999,999.
DB9F: Floating point 0.5
(OO/OO/OO/BO).
DBBA: 
DBC3: ACC = (SP) A ACC (POWER)
D90B: 
D94B: Table of floating point constants used by EXP - SQR.
D95D: FF/FF/7F/7F = 0.5
00/00/BO/B1 =-1
00/00/00/B1 = +1
D999: 
DA02: Tables of data used by RND.
DAOE:  = SIN(x + PI/2)
DA14:  = x - x A3/3! + x A5/5! - x A7/7! + x 9/9!
However, the actual expansion used is:
SIN(2Plx) = 2Plx - (2Plx)A3/3! + (2Plx)A5/5! (2Plx)A7/7! + (2Plx)A9/9!
Only the first 5 terms of the series are required for 6
digit precision. The above coefficients are located from
DA61 to DA74.
A

DA58:Table of floating point constants (4 bytes each) used by
SIN - COS.
DB/OF/49/81 = 1.5708 radians = 90 degrees.
00/00/00/7F = 0.25
DA60: 05 = Number of terms required to calc. SIN - COS
DA61: BA/D7/1E/86 = +39.7107 = (2PI)A9/9! approx. allows for
round-off.
64/26/99/87 = -76.575
= (2PI)A7/7! exactly.
58/34/23/87 = +81.6022 = (2PI)A5/5! approx.
EO/5D/A5/86 = -41.3417 = (2PI)A3/3! exactly.
DA/OF/49/83 = + 6.28319 = (2PI) = 360 degrees.
DA75:  =  / 
DA8A: 
DAB1: Table of floating point constants used by ATN.
DAD6: [EMPTY ROM from here till DFFA !! ]
DFFA: BASIC Warm Start, jumps to C06B.
DFFD: BASIC Cold Start, jumps to COOO.

8.02 BASIC ROMPAC WORK AREA
ADDR SIZE

DESCRIPTION

100:

3

z80 jump instruction to Basic warm start: C3 6B CO
Used if work area and program are saved as a CP/M
.COM file.

103:

3

z80 jump instruction to USR() function routine.
Default address is to the FC ERROR routine. The user
can insert the address of his routine with:
POKE 260,AD AND 255 : POKE 261,AD / 256

106:

3

OUT (nn),A instruction.

Used by the OUT I,J command.

109: 14

Fast 4 byte subtract routine used by floating point
divide for speed.

117: 35

Pseudo-random number data used as tables and counters
by Basic's RND function.

13A:

4

Last psuedo-random number generated by RND, in
floating point, for RND(O).

13E:

3

IN A,(nn) instruction.

141:

1

Number of ASCII nulls to print after a carriage
return. Defaults to 1.

142:

1

Terminal line length.

143:

1

Column number of last PRINT with comma field, ie. the
start of the last 14 character field.

144:

1

CTRL 0 output suppression flag.

145:

2

Pointer to top of Basic stack.

147:

2

Current line number.

149:

2

Pointer to start of Basic program text, ie. 01D5H.

Used by INP() function.

Defaults to 64.

OH = output.
OFFH = no output.

OFFFEH during initialization.
OFFFFH in direct mode.

14B: 67

Terminal input buffer.
direct command line.

Starts with a comma.

18E:

1

Current terminal column position.

18F:

1

o when

190:

1

Number Type Flag. (See Note 3 above).

Also

used by CD54 to locate - create variables.
<> 0 when used by .

.'

191:

1

MUlti-Statement Line Flag.
= 0 if multi-statement line
<> 0 if only one statement on line.

192:

2

Pointer to highest RAM location, ie. HIMEM.

194: 18

Internal pointers used for string constant, variable
and string space maintenance.

1A2:

2

Length of string that was just printed.

1A4:

2

start address of string that was just printed.

1A6:

2

Pointer to top of free string space.
command.

1A8:

2

Internal pointer used in string space garbage
collection.

1AA:

2

Current DATA line number.

lAC:

1

Used by  and .
= 64H when used by 
= 80H when used by 

lAD:

1

Used by . Should = 0 for return. Also,
last character entered from keyboard during input.

1AE:

1

Used by  -  to distinguish between them.
= 0 for .
< >0 for  .

1AF:

1

Temporary storage for HL. Sometimes used to store
current or last position reached in a line of BASIC
before extra processing was required. Also used to
store pointer to value of variable in variable area.

1B1:

2

Pointer to end of current line being processed by
BASIC. This can be useful for passing names instead
of numbers as arguments of the USR() function.
Points to instruction in the Basic program about to
be executed when CTRL-C is used to stop execution.

1B3:

2

Line number in program.

1B5:

2

Pointer to current statement in program to be
executed next.

1B7:

2

Pointer to start of variable space at end of program.

1B9:

2

Pointer to start of array space.

1BB:

2

Pointer to end of RAM memory in use, ie. end of
variable storage space.

Set by CLEAR n

Set by CTRL-C or STOP.

1BD:

2

Pointer to current item in DATA list.

1BF:

4

Floating point numeric accumulator.

1C3: 17

Internal storage used for floating point printout and
multiplication.

1D4:

1

Zero to signify end of imaginary first program line.

1D5:

x

Start of Basic program storage.
•

..

---

CHAPTER 9

MONITOR

9.01 MONITOR POKE ADDRESSES
>SE S=xx
s=o
S=10

>SE T=xx

SCREEN SPEED
FASTEST.
SLOWER.

8K
8143

16K
16335

32K
32719

48K
-16433

32K
32718

48K
-16434

POWER-ON DEFAULT.

BAUD RATE

8K
8142

16K
16334

T=O

1200 BAUD FOR SERIAL PORT AND CASSETTE TAPE.
EXAMPLE: POKE 32718,64 :REM 1200 BAUD.

T=l

300 BAUD FOR SERIAL PORT AND CASSETTE TAPE.
EXAMPLE: POKE 32718,0 : REM 300 BAUD.

>SE O=yy
V
P
L
S
xxyy

-

>SE I=xx
K
P
S
xxyy

-

OUTPUT PORT
VIDEO DRIVER
PARALLEL OUT
CENTRONICS
CASSETTE OUT
USER DEFINED

INPUT PORT
KEYBOARD
PARALLEL IN
CASSETTE IN
USER DEFINED

8K
8144-5
OE01BH
OE021H
OE993H
OE012H
xxyy
8K
8146-7
OE018H
OE01EH
OEOOFH
xxyy

16K
16336-7
POKE
POKE
POKE
POKE
POKE

32720,27 :POKE
32720,33 :POKE
32720,147:POKE
32720,18 : POKE
32720,yy :POKE

16K
16338-9
POKE
POKE
POKE
POKE

32K
32720-1

32K
32722-3

32722,24
32722,30
32722,15
32722,yy

: POKE
:POKE
:POKE
:POKE

48K
-16432-1
32721,224
32721,224
32721,233
32721,224
32721,xx
48K
-16430-29
32723,224
32723,224
32723,224
32723,xx

9.02 MONITOR WORKAREA
(IY+nn)

RAM

+00

91

+3C
+3D
+3E
+3F
+41
+43
+44
+45
+46
+47
+4C
+4D
+4E
+50
+52
+54
+57
+5C
+5D
+5E
+60
+62
+64
+67
+68
+6A
+6c
+6D

CD
CE
CF
DO
D2
D4
D5
D6
D7
D8
DD
DE
DF
El
E3
E5
E8
ED
EE
EF
Fl
F3
F5
F8
F9
FB
FD
FE

DESCRIPTION
60 BYTE MONITOR COMMAND BUFFER. ASCII TEXT IS
TERMINATED BY A CARRIAGE RETURN, ODH.
PORT OFEH STATUS.
BAUD RATE.
1200 BAUD= 040H. 300 BAUD= 00 HEX.
SEND DELAY TIME FROM >SE S=nn COMMAND.
CURRENT SEND ROUTINE ADDRESS FROM >SE O=xxyy.
CURRENT RECEIVE ROUTINE ADDRESS FROM >SE I=xxyy.
BATCH MODE STATUS. O=NORMAL l=BATCH MODE.
MONITOR OUTPUT PROMPT OF 1>1.
BAUD RATE - MOTOR CONTROL 10H=MOTOR1 20H=MOTOR2
TAPE INPUT AND OUTPUT CRC CHECK DATA BYTE.
FIVE LETTER OUTPUT FILE NAME FROM >SA AND CSAVE
OUTPUT FILE HEADER ID. USUALLY 55H.
OUTPUT FILE TYPE FROM >SE F=nn COMMAND.
2-BYTE LENGTH OF FILE IN BYTES.
2-BYTE PROGRAM LOAD ADDRESS. BASIC=01D5H.
2-BYTE PROGRAM >GO ADDRESS.
>SE X=xxyy COMMAND.
3 RESERVED BYTES.
FIVE LETTER INPUT FILE NAME FROM >LO AND CLOAD.
INPUT FILE HEADER ID.
INPUT FILE TYPE.
2-BYTE LENGTH OF INPUT FILE IN BYTES.
2-BYTE PROGRAM LOAD ADDRESS FROM TAPE.
2-BYTE PROGRAM >GO ADDRESS FROM TAPE.
3 RESERVED BYTES.
CHARACTER UNDER THE CURSOR.
2-BYTE SCREEN OFFSET FOR ROW CURSOR IS ON.
2-BYTE COLUMN NUMBER CURSOR IS IN [0-63].
LAST CHARACTER FROM KEYBOARD FOR REPEAT FUNCTION.
2 BYTES OF RESERVED SPACE.

9.03 USEFUL MONITOR ROUTINES AND THEIR FUNCTIONS.
ADDR
EOOO
E003
Eo06
E009
EOOC
EOOF
E012
E015
E018
E01B
E02l
E993
E024
E027
E02A
E02D
E13A
E1A2
ElBA
E1C9
E1D4
E1E8
E1ED
E205
E22F
E23D
E2D2
E4D3
E538
E562
E597
E5A2
E638
E6B9
E78A
E858
E85C
E884
E8Al
E98A
E9Bl
E9CC
E9D6
EB10
EC1E
EDFE

DESCRIPTION
MONITOR COLD START.
MONITOR WARM START. JUMP TO HERE FROM YOUR PROGRAMS.
RELOCATE MONITOR STACK TO ADDRESS PASSED IN REGISTER HL.
RECEIVE: RETURN CHARACTER IN 'A' AND 'NZ' FLAG.
SEND: SEND CHARACTER IN 'A' TO CURRENT OUTPUT DEVICE.
SERIAL IN: READ CHARACTER FROM UART.
SERIAL OUT: SEND CHARACTER TO UART.
QUICK CHECK: RETURN 'NZ' IF 'CTRL-C', 'RUN/STOP' OR 'ESC I
KEYBOARD: ROUTINE FOR RECEIVE IF >SE I=K.
KEYBOARD SCAN
VIDEO:
ROUTINE FOR SEND IF >SE O=V.
VIDEO DISPLAY
PARALLEL OUT: SEND CHARACTER TO PARALLEL PORT.
CENTRONICS OUT: HANDSHAKE CHARACTER TO CENTRONICS PRINTER
TURN CASSETTE MOTOR ON. REGISTER B CONTAINS 1 OR 2.
TURN CASSETTE MOTOR OFF.
TAPE SAVE ROUTINE.
TAPE LOAD ROUTINE.
MONITOR INPUT ROUTINE FILLS 60 BYTE INPUT BUFFER.
FIND MONITOR WORKAREA AND PUT BASE ADDRESS IN REGISTER IY
MESSAGE: OUTPUT TEXT STRING THAT ENDS WITH A ZERO BYTE.
ERROR: PRINT ERROR MESSAGE AND DIAGNOSTIC MESSAGE.
OVER: PROCESS THE BATCH MODE OVER COMMAND.
PRINT HEXADECIMAL NUMBER IN REGISTER IDE' IN HEX.
PRINT HEXADECIMAL NUMBER IN REGISTER 'A' IN HEX.
PRINT CARRIAGE RETURN AND LINE FEED.
PARSE INPUT COMMAND STRING.
PUT ASCII HEX NUMBER IN REGISTER IDEI. REVERSE OF E1E8H.
SEND THE NUMBER OF BLANKS IN REGISTER 'B'.
DUMP
COMMAND PROCESSOR.
ENTER COMMAND PROCESSOR.
MOVE
COMMAND PROCESSOR.
GO
COMMAND PROCESSOR.
SET
COMMAND PROCESSOR.
SAVE
COMMAND PROCESSOR.
FILES COMMAND PROCESSOR.
LOAD
COMMAND PROCESSOR.
BATCH COMMAND PROCESSOR.
CREATE COMMAND PROCESSOR.
LIST
COMMAND PROCESSOR.
TEST
COMMAND PROCESSOR.
PP
COMMAND PROCESSOR.
CLEAR THE DISPLAY AND REWRITE THE GRAPHIC CHARACTER SET.
MOVE CURSOR TO ROW AND COLUMN NUMBER IN MWA+68 AND MWA+6A
FIND THE CURSOR ROW AND COLUMN NUMBERS.
REPLACE CHARACTER UNDER THE CURSOR.
KEYBOARD INPUT TABLES TO DECODE THE ASCII VALUE TO RETURN
CHARACTER SET FOR THE FIRST 64 GRAPHIC CHARACTERS.

9.04 RELOCATE THE MONITOR STACK.
>EN 0
0000: 21 yy xx C3 06 EO /
>GO 0
THE MONITOR STACK ON POWER UP BUILDS FROM THE LAST MEMORY
LOCATION DOWNWARD. IN A 32K MACHINE THIS IS AT 7FFFH.
THE STACK CAN BE RELOCATED ELSEWHERE IN MEMORY BY
PROVIDING A DIFFERENT LAST ADDRESS IN yy xx OF THE ABOVE
CODE.

,

EXAMPLE:

1/

TO RELOCATE TO 6FFFH, USE
21 FF 6F C3 06 EO /

---------------------------------------------------------------

9.05 ERASE MEMORY BY FILLING IT WITH ZEROES.
BYE
>EN 0
0000: 0 /
>MO 0 7FOO 1

EXIT TO THE MONITOR.
BYTE 0 CONTAINS THE FILL CHARACTER.
ZERO MEMORY THROUGH ADDRESS 7FOO HEX.

===============================================================

9.06 EXECUTE MONITOR COMMANDS FROM A BASIC PROGRAM
100
110
120
130
140
150

C$ = "LO 1 3800"+CHR$(13) : REM TYPICAL COMMAND
M = PEEK(-~096)+PEEK(-4095)*256-111
IF M>32767 THEN M=M-65536
FOR I=l TO LEN(CM$)
POKE M+I,ASC(MID$(C$,I,l»: NEXT I :REM PUT IN BUFFER
POKE 260,138:POKE 261,231:X=USR(0) :REM DO COMMAND

•

---~~---~--

-----~-~-~------

CHAPTER 10

---

M. CODE INTERFACE

10.01 PROTECT MEMORY FOR MACHINE LANGUAGE ROUTINES
1.
2.
3.

0000 - DOFF HEX IS NEVER USED BY THE ROMPAC BASIC.
RELOCATE THE STACK. USE THE MEMORY ABOVE THE STACK.
CLEAR xx,yy CREATES A WINDOW ABOVE THE STRING SPACE.

===============================================================

10.02 CALL A MACHINE LANGUAGE ROUTINE
100 POKE 260,ADDR AND 255 : POKE 261,ADDR/256
110 X=USR(O)
ADDR CONTAINS THE ADDRESS OF THE ROUTINE.
PLACE THE ADDRESS OF THE ROUTINE IN BYTES 260 AND 261.
INVOKE THE CALL TO THE ROUTINE WITH THE USR() FUNCTION.
A 'RET' INSTRUCTION IN THE ROUTINE WILL RETURN TO BASIC.
===============================================================

10.03 FASTER USRO PARAMETER PASSING.
100 J=USR(O) : J=PEEK(X)
110 J=PEEK(USR(X»
LINE 110 IS EQUAVALENT TO LINE 100, BUT FASTER.
---------------------------------------------------------------------------------~---------------------------------- ---------

10.04 POKE MACHINE HEX CODE INTO MEMORY.
100
110
120
130
140
150
160
200

DEF FNA(X) = (X AND 15) - 9 * (X > 64)
READ J : REM FIRST DATA ITEM IS # OF BYTE TO POKE
:
FOR I=O TO J-1 : READ A$
K = FNA(ASC(A$» * 16 + FNA(ASC(RIGHT$(A$,1»)
POKE OFFSET + I,K : NEXT I
:
DATA 6,11,00,00,C3,EB,E1 : REM EXAMPLE HEX CODE

THIS ROUTINE CONVERTS HEX CODE INTO DECIMAL TO POKE.
THE CODE LOADS BEGINNING AT THE ADDRESS OF 'OFFSET'.
---------------------------------------------------------------

10.05 PASS ARGUMENT IN 'A' REGISTER TO MACHINE CODE
100 POKE 262,195 : POKE 264,ADDR/256
110 OUT ADDR AND 255, X
ADDR CONTAINS THE ADDRESS OF THE ROUTINE.
THE 'OUTI COMMAND INVOKES THE CALL TO THE ROUTINE.
ARGUMENT X IS PASSED TO THE ROUTINE IN THE ACCUMULATOR.

10.06 PASS TWO PARAMETERS USING THE OUT I,J INSTRUCTION.
CHANGE THE 'OUT I,J ' INSTRUCTION TO A RST OH COMMAND.
THE RST OH IS A MACHINE LANGUAGE RESTART TO ADDRESS O.
IT IS JUST LIKE A CALL INSTRUCTION, EXCEPT IT OCCUPIES
ONLY ONE BYTE OF MEMORY.
100 POKE 262,199 : REM 'OUT ' IS NOT A 'RST OH '
110 OUT I,J
: REM CALL YOUR ROUTINE AT ADDRESS O.
YOUR MACHINE LANGUAGE ROUTINE MUST RESIDE AT ADDRESS O.
THE I PARAMETER FROM THE OUT COMMAND IS PASSED IN
ADDRESS 0107H, AND THE J PARAMETER IS PASSED IN THE z80
ACCUMULATOR. TO RETURN TO BASIC, YOU MUST POP THE RST
RETURN ADDRESS OFF OF THE STACK SO THAT THE RETURN
ADDRESS FOR THE 'OUT ' COMMAND IS USED INSTEAD.
---------------------------------------------------------------

10.07 PASS ROUTINE ADDRESS IN USRO FUNCTION CALL.
0000: CD DO C7
0003: D5
0004: C9

ENTRY CALL OC7DOH
PUSH DE
RET

;GET USR() #
;CALL ADDRESS
;GOTO ROUTINE

100 POKE 260,0 : POKE 261,0 : REM USR() ENTRY ADDRESS
110 X = USR(AD) : REM JUMP TO MEMORY ADDRESS IN AD
THE USR() FUNCTION WILL ENTER THE ROUTINE AT ADDRESS 0,
AND THEN JUMP THE ADDRESS PASSED AS A PARAMETER IN THE
VARIABLE AD. YOUR CODE AT ADDRESS AD WOULD END WITH
A NORMAL 'RET' TO RETURN TO BASIC.
IF YOUR ROUTINE USES REGISTER HL, YOU SHOULD PUSH HL
UPON ENTRY, AND THEN POP HL JUST BEFORE RETURNING.
===============================================================

10.08 MULTIPLE USRO ROUTINES SELECTED BY LETTER IN O.
100
110
120
130

POKE 260,0
.
X = USR(A)
X = USR(B)

POKE 261,0 : REM ONLY ONE ENTRY ADDRESS.
: REM EXECUTE ROUTINE "A"
: REM EXECUTE ROUTINE "B"

THE ADDRESSES FOR THE ABOVE ROUTINES ARE FOUND IN A
TABLE. THE TABLE CONTAINS THE MATCH LETTER, SUCH AS "A" '"
FOLLOWED BY THE ADDRESS OF THE ROUTINE. A ZERO BYTE IN
THE MATCH LETTER POSITION WILL TERMINATE THE TABLE.

.;

I,
I

...

\
I

V

'1

~1

V

0000:
0003:
0006:
0008:
0009:
OOOA:
OOOC:
OOOD:
OOOE:
OOOF:
0012:
0013:
0015:
0016:
0017:
0018:
001B:
001C:
001D:
001E:
001F:
0021:
0022:
0023:
0024:
0025:
0026:
0027:
0028:
002A:
002B:
002D:

CD
2A
3E
2B
BE
20
23
23
7E
21
BE
28
47
AF
BE
CA
78
23
23
23
18
23
7E
23
66
6F
E9
41
yy
42
yy
00

A2 E1
B1 01
B2
FC

27 00
OC

E5 C7

F1

xx
xx

ENTRY CALL
LD
LD
LP1
DEC
CP
JR
INC
INC
LD
LD
LP2
CP
JR
LD
XOR
CP
JP
LD
INC
INC
INC
JR
FOUND INC
LD
INC
LD
LD
JP
TABLE DEFB
DEFW
DEFB
DEFW
DEFB

OE1A2H
HL,(01B1H)
A,OB2H
HL
(HL)
NZ,LP1-$
HL
HL
A, (HL)
HL,TABLE
(HL)
Z,FOUND-$
B,A
A
(HL)
Z,OC7E5H
A,B
HL
HL
HL
LP2-$
HL
A, (HL)
HL
H, (HL)
L,A
(HL)
IAI
A-LABEL
IBI
B-LABEL
00

;GET IY
;BASIC POINTER
;USR( TOKEN
;POINTER BACK
;FOUND USR( YET
;KEEP LOOKING
;SKIP OVER
;POINT LETTER
;GET LETTER
;TABLE BASE
;MATCH ??
;JUMP IF MATCH
;SAVE LETTER
;LOAD ZERO
;TABLE END ??
;?FC ERROR
;RESTORE LETTER
;SKIP LETTER
;SKIP yy ADDR
;SKIP xx ADDR
;TRY NEXT MATCH
;SKIP LETTER
;GET yy ADDRESS
;SKIP yy ADDR
;GET xx ADDRESS
;HL = xxyy ADDR
;GOTO ROUTINE
;MATCH LETTER
;ROUTINE ADDR
;MATCH LETTER
;ROUTINE ADDR
;TABLE END FLAG

---------------------------------------------------------------

10.09 UP-LOADER FOR MACHINE LANGUAGE ROUTINES
THIS SHORT ROUTINE IS USEFUL FOR MOVING MACHINE
CODE TO ITS PROPER ORG ADDRESS AFTER BEING LOADED
AT A DIFFERENT ADDRESS.

j

!

V

0100:
0103:
0106:
0109:
010B:

01
11
21
ED
C3

yy
yy
yy
BO
yy

xx
xx
xx
xx

ENTER

LD
LD
LD
LDIR
JP

BC , LENGTH
DE,TO
HL,FROM
START

;# OF BYTES TO MOVE

;DESTINATION ADDRESS
;SOURCE ADDRESS
;BLOCK MOVE
;PROGRAM START

THIS ROUTINE IS PARTICULARLY USEFUL IN CP/M
ENVIRONMENTS WHERE THE CODE HAS BEEN MOVED DOWN
TO 0110H WITH THE MONITOR AND THEN SAVED ON DISK.
WHEN THE PROGRAM IS LOADED FROM DISK, CP/M EXECUTES
THIS UP-LOADER WHICH LOADED JUST AHEAD OF THE PROGRAM.
THE PROGRAM IS MOVED TO ITS PROPER ADDRESS AND EXECUTED.

---

----------

CHAPTER 11

---

M. CODE ROUTINES

11.01 ROW - COLUMN ROTATION OF A CHARACTER CELL
ENTER WITH AN ASCII CHARACTER IN REGISTER A.

,

THE BIT PATTERN FOR THE CHARACTER IS CONVERTED FROM ITS ROW BY
ROW FORMAT INTO COLUMN BY COLUMN DOT DATA THAT CAN BE USED TO
FIRE EIGHT HAMMERS OF A GRAPHICS PRINTER.
TO ACTIVATE, SET THE OUTPUT VECTOR TO THIS DRIVER.

1

6500:
6501:
6502:
6503:
6504:
6506:
6507:
6508:
6509:
650C:
650D:
650F:
,·
6511:
6513:
6514:
,
6516:
6517:
6518:
6519:
651A:
651B:
651C:

C5
D5
E5
6F
26
29
29
29
11
19
1E
OE

00

00 F8
08
80

ORG
PUSH
PUCH
PUSH
LD
LD
ADD
ADD
ADD
LD
ADD
LD
LD

6500H
BC
DE
HL
L,A
H,O
HL,HL
HL,HL
HL,HL
DE,OF800H
HL,DE
E,8
C,80H

;*2

>SE 0=6500

;HL = ASCII CHAR

;*4
;*8
;ASCII TABLE BASE
;TABLE POINTER
;COL LOOP COUNTER
;AND MASK BIT 7

16 00
E5
06 08

LOOP1

LD
PUSH
LD

D,O
HL
B,8

;CLEAR D
;SAVE HL NEXT LOOP
;ROW LOOP COUNTER

7E
A1
B2
07
57
23
10 F8

LOOP2

LD
AND
OR
RLCA
LD
INC
DJNZ

A, (HL)

;GET PATTERN
;MASK BIT OFF
; COMBINE
;ROTATE A LEFT
;RESAVE IN D
;NEXT ROW PATTERN
;GET 8 ROW BITS

C
D

D,A
HL
LOOP2~$

COMPENSATE FOR MASK SHIFT, UNEVEN SHIFTING
,·
LD
B,E
651E: 43
LOOP3
RRCA
651F: OF
6520: 10 FD
DJNZ LOOP3-$
;ROTATE BACK

,

6522:
6524:
6526:
6527:
6528:
,·
652A:
652B:
652C:
652D:

D3 FF
CB 09
E1
1D
20 E7

OUT
RRC
POP
DEC
JR

(255),A
C
HL
E
NZ,LOOP1-$

E1
D1
C1
C9

POP
POP
POP
RET

HL
DE
BC

;SEND COL TO PRINTER
;ROTATE MASK
;ADDRESS BASE
;DO 8 COLUMNS

;BACK TO MAIN PROG

11.02 IMAGE DRIVER TO CONVERT TO >SA FILES.
This is a simple, yet very useful, driver that converts
any video output to a memory image. Two frequent uses of
this driver are: convert a Basic program into its ASCII
file, and convert a disassembler listing into a word
processor file.
0000:
0001:
0004:
0005:
0006:
0009:
OOOA:
OOOD:

E5
2A OD 00

77

23
22 OD 00
E1
C3 1B EO
yy xx

EXAMPLE:
1.

ENTRY PUSH
LD
LD
INC
LD
POP
JP
POINT DEFW

HL
HL,(POINT)
(HL) , A
HL
(POINT),HL
HL
OE01BH
xxyy

;GET POINTER
;CREATE IMAGE
;NEXT MEM CELL
;PUT POINTER
;TO VIDEO TOO
;START ADDRESS

CREATE A WORD PROCESSOR FILE FROM DISASSEMBLER.

INSERT WORD PROCESSOR ROMPAC.

2. USE THE MONITOR TO LOAD A MACHINE LANGUAGE
DISASSEMBLER SUCH AS:
>LO DIS32
3. LOAD THE ABOVE DRIVER.
4. START ADDRESS IS BOFH:

OOOD: OF oB /

5. CHANGE OUTPUT VECTOR:

>SE 0=0000

6. EXECUTE DISASSEMBLER.

>GO 6AOO

7. DISASSEMBLE ROUTINE OF INTEREST.

B. EXIT DISASSEMBLER BACK TO MONITOR.
9. RESTORE VIDEO VECTOR.

>SE O=V

10. FIND FINAL ADDRESS IN (POINT).
>DU D E
ONE MIGHT SAVE THE FILE AT THIS POINT WITH
>SA NAME oBOF xxyy
11. ENTER 03 INTO THIS FINAL ADDRESS. THIS PROVIDES THE
END-OF-FILE MARKER FOR THE WORD PROCESSOR.
12. EXECUTE WORD PROCESSOR.
>PP
YOUR FILE SHOULD BE PRESENT. IT MAY BE DOUBLE SPACED
SINCE THE WORD PROCESSOR CONVERTS BOTH  AND 
INTO s.
13. USE THIS MACRO TO REMOVE DOUBLE SPACING.
D1
F1
COMMAND> A
COMMAND> B.
COMMAND> A200

(SAVE MACRO)
(START ON LINE TO DELETE)
(EXECUTE MACRO)

11.03 PINE WOOD DERBY CONTROLLER
The following machine language and basic programs are
included as illustrations of how to use the Sorcerer to
monitor external events. In this case, photo detectors
were mounted in each of three racing lanes for a Cub
Scout Pine Wood Derby. As the hand made cars crossed
the finish line, the photo detector light source would
be interrupted. The Sorcerer would observe the changed
state of the photo detectors and stop that car's timer.
After all three cars had crossed the finish line, the
three timers would be displayed in large block lettering
for the anxious audience to read. The resolution of the
timing was around 1 milisecond which kept parents and
their sons from arguing over whose car was the fastest.
PINE WOOD DERBY CONTROLLER
4000: 18 05
,
4002: 00
4003: 00
~004: 00
4005: 00

,
4007:
4009:
400B:
,
, THE
,
400D:
400F:
4012:
4015:

DB FF
CB 47
20 FA
GATE IS OPEN.
3E
32
32
32

01
02 40
03 40
04 40

4018:
401A:
401C:
401E:
401F:
4021:
4024:

DB
CB
20
F5
3E
32
F1

FF
4F
07

4025:
4027:
4029:
402A:
402C:
402F:

CB
20
F5
3E
32
Fl

57
07

,.

,

ENTRY

ORG
JR

4000H
SKIP-$

CARl
CAR2
CAR3
COUNT

DEFB
DEFB
DEFB
DEFW

0
0
0
0

BUFF

EQU

0

SKIP

IN
BIT
JR

A, (OFFH)
O,A
NZ,L4007-$

;WAIT FOR START
;GATE TO OPEN

THE CARS ARE ON THEIR WAY DOWN THE TRACK

FINISH

00
02 40
L4025

00
03 40

..

.~~~-

~---

.. -- ......

---~

-

LD
LD
LD
LD

A,OOlH
(CAR1),A
(CAR2),A
(CAR3),A

IN
BIT
JR
PUSH
LD
LD
POP

A,(OFFH)
1,A
NZ,L4025-$
AF
A,OOOH
(CARl) ,A
AF

;WATCH FINISH LINE
;IS CARl ACROSS?
;JUMP IF NOT

BIT
JR
PUSH
LD
LD
POP

2,A
NZ,L4030-$
AF
A,OOOH
(CAR2),A
AF

;IS CAR2 ACROSS?
;JUMP IF NOT

--

--

;START ALL TIMERS

;STOP TIMER #1

;STOP TIMER #2

,
4030:
4032:
4034:
4035:
4037:
403A:

,

CB
20
F5
3E
32
F1

5F
07

L4030

00
04 40

BIT
JR
PUSH
LD
LD
POP

3,A
NZ,L403B-$
AF
A,OOOH
(CAR3),A
AF

;IS CAR3 ACROSS?
;JUMP IF NOT
;STOP TIMER #3

; UPDATE TIMER CLOCK, WHICH IS A SIMPLE INCREMENTING COUNTER.

,·

403B:
403E:
403F:
4040:
4041:
4042:
4044:
4045:
4046:
4047:

,·

2A 05 40
7D
3C
27
6F
3E 00
8c
27
67
22 05 40

L403B

LD
LD
INC
DAA
LD
LD
ADC
DAA
LD
LD

HL,(COUNT)
A,L
A
L,A
A,OOOH
A,H
H,A
(COUNT),HL

•

;GET TIMER.
;HL = 4 DECIMAL
; DIGITS RATHER
; A BINARY #.
;HL

= HL

+ 1

;REPLACE TIMER

; UPDATE EACH CARIS DISPLAY ON CRT WITH NEW COUNT VALUE UNTIL
THE RACE IS OVER WHEN ALL FLAGS = o.

, CARIS FINISH FLAG = O.
,·

404A:
404D:
404E:
4050:
4053:

3A
B7
28
11
CD

02 40

4056:
4059:
405A:
405C:
405F:

3A
B7
28
11
CD

03 40

4062:
4065:
4066:
4068:
406B:

3A
B7
28
11
CD

,·

,·

,

LD
OR
JR
LD
CALL

A,(CAR1)
A
Z,L4056-$
DE,BUFF+4H
MOVE

L4056

LD
OR
JR
LD
CALL

A, (CAR2)
;IS CAR2 ACROSS?
A
Z,L4062-$
DE,BUFF+OCH ;CARIS BUFFER
MOVE
;LOAD NEW TIME

L4062

LD
OR
JR
LD
CALL

A, (CAR3)
;IS CAR3 ACROSS?
A
Z,L406E-$
DE,BUFF+14H ;CARIS BUFFER
MOVE
;LOAD NEW TIME

L406E

CALL MESSAGE

06
04 00
7D 40

06
OC 00
7D 40
04 40
06
14 00
7D 40

406E: CD A9 40

,·

;IS CARl ACROSS?
;CARIS BUFFER
;LOAD NEW TIME

;NEW CRT DISPLAY

; NOW CHECK TO SEE IF ALL CARS ARE ACROSS

,·

4071:
4074:
4075:
4076:
4077:
4078:
11079 :
407C:

21 02 40
7E
23
B6
23
B6
C2 18 40
C9

LD
LD
INC
OR
INC
OR
JP
RET

HL,CAR1
A, (HL)
HL
(HL)
HL
(HL)
NZ,FINISH

J,

;CHECK FIRST FLAG
;CAR2 FINISH FLAG
;CAR3 FINISH FLAG
;DONE IF ALL = 0
;BACK TO BASIC

THIS ROUTINE LOADS EACH CARIS BUFFER WITH THE ASCII
CHARACTERS THAT MAKE UP THE FOUR DECIMAL DIGIT COUNT IN HL.

,

•
"

ENTER WITH A CARIS UNIQUE BUFFER ADDRESS IN DE.

407D:
4080:
4081:
4082:
4084:
4086:
4088:
408A:
408c:
408D:
408E:
408F:
4091:
4093:
4094:
4095:
4096:
4098:
409A:
409C:
409E:
40AO:
40A1:
40A2:
40A3:
40A5:
40A7:
40A8:

,

2A
EB
7A
CB
CB
CB
CB
F6
77
23
7A
E6
F6
77
23
7B
CB
CB
CB
CB
F6
77
23
7B
E6
F6
77
C9

05 40
3F
3F
3F
3F
30

OF
30

3F
3F
3F
3F
30

OF
30

MOVE

LD
EX
LD
SRL
SRL
SRL
SRL
OR
LD
INC
LD
AND
OR
LD
INC
LD
SRL
SRL
SRL
SRL
OR
LD
INC
LD
AND
OR
LD
RET

HL,(COUNT)
DE,HL
A,D
A
A
A
A
030H
(HL) , A
HL
A,D
OOFH
030H
(HL),A
HL
A,E

;GET TIMER VALUE
;HL = BUFFER ADDR
;DE = 4 DIGITS

;FIRST ASCII DIGIT
;PUT IT IN BUFFER

;2ND ASCII DIGIT
;PUT IT IN BUFFER

A

A
A
A
030H
(HL) , A
HL
A,E
OOFH
030H
(HL) , A

;3RD ASCII DIGIT
;PUT IT IN BUFFER

;4TH ASCII DIGIT
;PUT IT IN BUFFER

THIS ROUTINE DISPLAYS A 24 CHARACTER BUFFER IN THE CRT IN
THREE ROWS OF EIGHT CHARACTERS EACH. THE CHARACTERS ARE
DISPLAYED IN LARGE BLOCK SIZE WHERE EACH DOT OCCUPIES A FULL
CHARACTER CELL. THE START ADDRESS OF THE BUFFER IS BUFF.

40A9:
40AB:
40AF:
40B2:
40B4:
40B6:
40B7:
40B8:
40B9:
40BB:
40BE:
40CO:
40C1:
40C2:
40C3:

FD
FD
21
OE
06
7E
C5
E5
FD
CD
FD
E1
C1
23
11

E5
21 00 F1
00 00
03
08

E5
D7 40
E1

08 00

MESSAGE PUSH
LD
LD
LD
NEXTROW LD
NEXTCOL LD
PUSH
PUSH
PUSH
CALL
POP
POP
POP
INC
LD

IY
IY,OF100H
HL,BUFF
C,003H
B,008H
A,(HL)
BC
HL
IY
DISPLAY
IY
HL
BC
HL
DE,8

;TOP OF SCREEN
;C = # OF ROWS
;B = # OF CHARS
;GET ASCII CHAR

;SHOW IN BIG SIZE

;MOVE SCRN POINTER

40c6:
40c8:
40CA:
40CB:
40CD:
40DO:
40D2:
40D4:
40D6:

FD
10
OD
28
11
FD
18
FD
C9

19
EC
07
40 02
19
EO
E1

L40D4

ADD
DJNZ
DEC
JR
LD
ADD
J"R
POP
RET

IY,DE
NEXTCOL-$
C
Z,L40D4-$
DE,0240H
IY,DE
NEXTROW-$
IY

;NEXT CHARACTER
;THIS ROW DONE
;ANY MORE TO DO?
;MOVE SCRN POINTER
; TO NEXT ROW.
;SCREEN COMPLETE

..

THIS ROUTINE CREATES A LARGE SIZE CHARACTER FROM THE BIT
PATTERN FOR THE ASCII CHARACTER. THE CHARACTER IS LOCATED
BY HAVING IY POINT TO THE TOP LEFT CORNER OF THE CHARACTER.

,.

ENTER WITH ASCII CHARACTER IN A, AND SCREEN LOCATION IN IY.

40D7:
40D9:
40DA:
40DC:
40DD:
40DE:
40DF:
40E2:
40E3:
40E4:
40E6:
40E7:
40E9:
40ED:
40EF:
40F3:
40F5:
40F7:
40F8:
40F9:
40FC:
40FE:
40FF:

OE
6F
26
29
29
29
11
19
7F
06
07
38
FD
18
FD
FD
10
OD
c8
11
FD
23
18

08
00

00 F8
08
06
36 00 20
04
36 00 CO
23
EF
38 00
19
E2

DISPLAY LD
LD
LD
ADD
ADD
ADD
LD
ADD
CHAR
LD
LD
RLCA
COL
J"R
LD
J"R
WHITE
LD
NEXT
INC
DJNZ
DEC
RET
LD
ADD
INC
J"R

C,008H
L,A
H,OOOH
HL,HL
HL,HL
HL,HL
DE,OF800H
HL,DE
A, (HL)
B,008H

;ROW COUNTER

;OFFSET = ASCII*8
;START OF BIT MAP
;HL = PATTERN ADDR
;A = FIRST ROW
;CELL WIDTH
;DETERMINE WHITE
OR BLACK DOT.
;
C,WHITE-$
(IY+000H),020H
; BLACK
NEXT-$
(IY+OOOH),OCOH
; WHITE
IY
COL-$
;LOOP CELL WIDTH
;COUNT THIS ROW
C
:EXIT AFTER 8TH
Z
;POINT START NEXT
DE,038H
IY,DE
; ROW ON SCREEN.
;NEXT ROW PATTERN
HL
CHAR-$

•

11.04 PINE WOOD DERBY'S BASIC PROGRAM

•

100
110
120
130
140
150
160
170
180
190
200
210
220
230
240
250
260
270
280
290
300
310
320
330
340
350
360
370
380
390
400
410
420
430
440
450
460
470
480
490
500
510
520
530
540
550
560
570

REM

PINE WOOD DERBY

REM

CREATE SOLID WHITE GRAPHIC CHARACTER IN ASCII #192

FOR 1=1 TO 8:POKE -513+I,255:NEXT I
REM

ESTABLISH USR() ADDRESS FOR 4000H.

POKE 261,64
REM

CLEAR SCREEN, PUT MESSAGE IN 24 BYTE BUFFER

.

PRINT CHR$ ( 12) : A$ = READY
GET SET GO.
FOR I=1T024:POKE I-1,ASC(MID$(A$,I,1»:NEXT I
II

REM

II

NOW SEND BUFFER TO CRT IN LARGE LETTERS

POKE 260,169:X=USR(X)
REM
REM
REM
REM
REM
REM

SCREEN LOOKS LIKE THIS WITH 3 ROWS OF 8 CHARACTERS:

REM
REM

NOW WAIT FOR THE GATE TO OPEN AND START TIMERS
CALL MACHINE CODE ROUTINE AT 4000H.

READY
GET SET
GO .

POKE 260,0:X=USR(X)
REM
REM
REM

.

RACE IS NOW OVER. SORT TIMES FOR 1ST, 2ND, 3RD PLACE
TIMES FOUND IN BUFFER AS ASCII DIGITS.
CONVERT TO A DECIMAL VALUE.

K=4
K=12:
K=20:
F=49:
REM
IF
IF
IF
IF
IF
IF

GOSUB
GOSUB
GOSUB
G=F :

900
900
900
H=F

A=X : REM K = BUFFER OFFSET
B=X
C=X
REM F=G=H= ASCII ZERO

SORT WINNER, 2ND AND 3RD PLACE
A>B
A>C
B>A
B>C
C>A
C>B

THEN
THEN
THEN
THEN
THEN
THEN

F=F+l
F=F+l
G=G+l
G=G+l
H=H+l
H=H+l

-

---.-~-.----

580
590
600
610
620
630
640
650
660
670
680
690
700
710
720
730
740
750
760
770
780
790
800
810
900
910
920
930

·
·
POKE

PUT 1ST, 2ND, 3RD PLACEMENT IN BUFFER

·
REM

NOW DISPLAY WINNERS IN LARGE LETTERS

·
REM

0,65
POKE 8,66
POKE16,67
POKE 2,F

POKE 1,45
POKE 9,45
POKE17,45
POKE10,G

POKE 3,32
POKE11,32
POKE19,32
POKE18,H

POKE 260,169 : X=USR(X)
PRINT CHR$(17);" LANE

·
REM
REM
REM
REM
REM
REM
·

REM
REM

·

SCREEN LOOKS LIKE THIS:

·

REM HEADINGS

LANE - PLACE - TIMER

A-2 8034
B-1 7892
C-3 8047
WAIT FOR OPERATOR TO START NEXT RACE.
USER HITS RETURN TO CONTINUE.

·
INPUT
II
·
REM

PLACE ";

press RETURN to race again II;A$:GOT0200

CONVERT 4 ASCII CHARACTERS FROM BUFFER INTO NUMBER

X=O:FOR I=K TO K+4:J=PEEK(I)-30:X=X*10+J:NEXT I:RETURN

----~

-- ------

•

11.05 IDEAL MACHINE LANGUAGE PROGRAM START
PROGRAM NAME
AUTHOR'S COPYRIGHT NOTICE
PROGRAM DATE AND VERSION NUMBER

,

PROGRAM DESCRIPTION

MONITOR EQU

0100:
0103:
0106:
0109:
010C:
010F:

C3
C3
C3
C3
C3
C3

yy
yy
yy
yy
yy
yy

xx
xx
xx
xx
xx
xx

OE003H

;EQUATE LABELS

COUNT

ORG 0500H
DEFB 0

;ORG VARIABLES

ENTER
WARM
SEND
RECEIVE
PRINTER
SOUND

ORG
JP
JP
JP
JP
JP
JP

;ORG PROGRAM
;JUMP COLD START
;JUMP WARM START
;OUTPUT DRIVER
;INPUT DRIVER
;PRINTER DRIVER
;SOUND ROUTINES

0100H
COLDST
WARMST
VIDEO
KEYBRD
OUTPUT
NOISE

ETC
HAVING THE PROGRAM START AT 100H MAKES
IT EASY TO PLACE PROGRAM ON CP/M DISK.

0112: CO
0113: FE

0114:

,

START PROGRAM WITH VECTOR JUMPS TO THE
VARIOUS MAJOR ROUTINES USED BY THE
PROGRAM. THUS, IF A USER MUST MODIFY
THE PROGRAM TO SUIT HIS SYSTEM, HE
ONLY HAS TO CHANGE THE JUMP ADDRESS TO
ACCESS HIS NEW SUBSTITUTE ROUTINE.

BAUD
PORT

,

DEFB OCOH
DEFB OFEH

;SYSTEM PARAMETERS
;STORED HERE

NOW PLACE A TABLE OF SYSTEM PARAMETERS
USED SUCH AS BAUD RATE. A USER WHO
USES A DIFFERENT PARAMETER NOW ONLY
HAS TO STORE THE DIFFERENT VALUE HERE.

MAIN

???? ??

ETC.

;BEGIN MAIN PROGRAM

CHAPTER 12 ---

I/O DRIVERS

12.01 RS232 OUTPUT DRIVER ROUTINE
0000:
0001:
0002:
0005:
0007:
0009:
OOOA:
OOOD:
0010:
0011:

F5
F5
FD
F6
D3
F1
CD
CD
F1
C9

7E 3D
80
FE
12 EO
1B EO

ENTRY PUSH
PUSH
LD
OR
OUT
POP
CALL
CALL
POP
RET

AF
AF
A, (IY+03DH)
80H
(OFEH) , A
AF
OE012H
OE01BH
AF

;SAVE CHARACTER
;UART CONTROL
;SET BIT 7
;TURN RS232 ON
;GET CHARACTER
;RS232 CHAR OUT
;SEND TO VIDEO
;GET CHARACTER
; RETURN

TO DIRECT ALL OUTPUT TO BOTH THE RS232 PORT AND TO THE
VIDEO, USE THE MONITOR COMMAND:
>SE O=xxyy
WHERE xxyy IS THE ENTRY ADDRESS FOR WHERE EVER THE
ROUTINE IS LOCATED IN MEMORY. FOR THE ABOVE ADDRESSING
THE COMMAND WOULD BE >SE 0=0000.
~O RESTORE THE OUTPUT TO JUST THE VIDEO DRIVER USE:
>SE O=V
•

THE ABOVE RS232 DRIVER IS FULLY RELOCATABLE .
===============================================================

12.02 RS232 DRIVER WITH PERFERATION SKIP.
THE ROUTINE WILL COUNT THE NUMBER OF LINES PRINTED AND
AUTOMATICALLY ISSUE A FORM FEED AFTER 54 LINES OF PRINT.
0000:
0001:
0002:
0005:
0007:
0009:
OOOA:
OOOD:
0010:
0011:
0013:
0014:
0015:
0018:
0019:
001B:
001D:
001F:
0022:
0023:
0026:
0027:

F5
F5
FD
F6
D3
Fl
CD
CD
Fl
FE
CO
F5
3A
3C
FE
20
3E
CD
AF
32
Fl
cg

7E 3D
80
FE
12 EO
1B EO
OA
FF FF
36
06
OC
12 EO
FF FF

ENTRY PUSH
PUSH
LD
OR
OUT
POP
CALL
CALL
POP
CP
RET
PUSH
LD
INC
CP
JR
LD
CALL
XOR
EXIT LD
POP
RET

AF
AF
A, (IY+03DH)
80H
(OFEH),A
AF
OE012H
OE01BH
AF
OAH
NZ
AF
A, (OFFFFH)
A
54
NZ,EXIT-$
A,OCH
OE012H
A
(OFFFFH) , A
AF

;SAVE CHARACTER
;UART CONTROL
;SET BIT 7
;TURN RS232 ON
;GET CHARACTER
;RS232 CHAR OUT
;SEND TO VIDEO
;GET CHARACTER
;TEST FOR LF
;RETURN IF NOT
;SAVE CHARACTER
;LINE COUNTER
;# = # + 1
;54 LINES YET?
;EXIT IF NOT 54
;GET FORM FEED
;RS232 CHAR OUT
;COUNTER = 0
;RESAVE COUNTER
;GET CHARACTER
; RETURN

SYNCHRONIZE THE LINE COUNTER WITH PAPER TOP-OF-FORM BY
ENTERING A 0 INTO BYTE FFFF HEX.
EXAMPLE:
OR

>EN FFFF
FFFF: 0 /

FROM THE MONITOR.

POKE -1,0

FROM BASIC.

TO LIST BASIC PROGRAM USE:

POKE -l,O:LIST

TO DIRECT ALL OUTPUT TO BOTH THE RS232 PORT AND" TO THE
VIDEO, USE THE MONITOR COMMAND:
>SE O=xxyy
WHERE xxyy IS THE ENTRY ADDRESS FOR WHERE EVER THE
ROUTINE IS LOCATED IN MEMORY. FOR THE ABOVE ADDRESSING
THE COMMAND WOULD BE >SE 0=0000.
TO RESTORE THE OUTPUT TO JUST THE VIDEO DRIVER USE:
>SE O=V
THE ABOVE RS232 DRIVER IS FULLY RELOCATABLE.
---------------------------------------------------------------

12.03 RS232 INPUT DRIVER ROUTINE.
0000:
0003:
0005:
0007:

FD
F6
D3
C3

7E 3D
80
FE
OF EO

ENTRY LD
OR
OUT
JP

A, (IY+03DH)
80H
(OFEH) , A
OEOOFH

;UART CONTROL
;SET BIT 7
;TURN ON RS232
;GET RS232 INPUT

TO RECEIVE ALL INPUT FROM THE RS232 PORT, USE THE MONITOR
COMMAND:
>SE I=xxyy
WHERE xxyy IS THE ENTRY ADDRESS FOR WHERE EVER THE
ROUTINE IS LOCATED IN MEMORY. FOR THE ABOVE ADDRESSING
THE COMMAND WOULD BE >SE 1=0000.
ONE LOOSES KEYBOARD CONTROL OF THE SORCERER WHEN THE
INPUT IS SET TO THE ABOVE RS232 INPUT DRIVER.
PERHAPS A BETTER USE OF THE ROUTINE WOULD BE TO CALL IT
FROM AN APPLICATION PROGRAM WITH THE INP() FUNCTION.
EXAMPLE:

100 POKE 318,195:POKE 320,0
110 X=INP(O) : A$=CHR$(X)

THE INP() EXAMPLE USES AN ENTRY ADDRESS OF 0000 HEX.
A$ IS THE CHARACTER RECEIVED FROM THE RS232 ROUTINE.
THE ABOVE RS232 DRIVER IS FULLY RELOCATABLE.

12.04 DUMB TERMINAL ROUTINE
GET CHARACTERS FROM KEYBOARD AND SEND TO RS232.
CHARACTERS RECEIVED FROM RS232 SENT TO VIDEO SCREEN.
RETURN TO CALLING PROGRAM IF I RUN/STOP I KEY IS PRESSED.
ORG

2470H

LD
OUT
IN
BIT
RET
CALL
JR
PUSH
IN
BIT
JR
POP
OUT
IN
BIT
JR
IN
CALL
JR

A,OCOH
(OFEH) , A
A, (OFEH)
o ,A
Z
OEB1CH
Z,SCAN-$
AF
A, (OFDH)
o ,A
Z,UART-$
AF
(OFCH) , A
A,(OFDH)
1,A
Z,LOOP -$
A, (OFCH)
OE01BH
LOOP-$

;

2470:
2472:
2474:
2476:
2478:
2479:
247C:
247E:
247F:
2481:
2483:
2485:
2486:
2488:
248A:
248C:
248E:
2490:
2493:

.

3E
D3
DB
CB
c8
CD
28
F5
DB
CB
28
F1
D3
DB
CB
28
DB
CD
18

CO
FE
FE
47

DUMB
LOOP

1C EB
OA
FD
47
FA

UART

FC
FD
4F
E6
FC
1B EO
DF

SCAN

;BAUD - RS232 ON
;TURN RS232 ON
;LOOK FOR IRIS I
;ABORT IF IRIS I
;SCAN KEYBOARD
;SKIP IF NO INPUT
;WAIT UART DONE

; SEND CHARACTER
; CHAR RECEIVED
;LOOP IF NOTHING
;GET INCOMING CHAR
;SEND TO VIDEO
;LOOP

---------------------------------------------------------------~---------------------------------------------------- ----------

12.05 VARIABLE LINE LENGTHS FOR PRINTERS.
100 POKE 322,J
J = LINE LENGTH FROM 0 TO 255.
BASIC WILL ISSUE A  WHEN THE LINE LENGTH IS EXCEEDED.
EXAMPLE:

100 POKE 322,132 : REM 132 CHARACTER LINE

===============================================================

12.06 CENTRONICS SCREEN PRINT ROUTINE
100
110
120
130
140
150
160

POKE 262,195 : POKE 264,233
AD = -3968
FOR R = 0 TO 29 : FOR C = 0 TO 63
OUT 147,PEEK(AD) : AD = AD + 1
NEXT C
OUT 147,13 : REM SEND  AT END-OF-LINE
NEXT R

THE POKE STATEMENTS ON LINE 100 INITIALIZE THE ROUTINE.
EACH lOUT 147,##1 SENDS ONE ASCII CHARACTER TO THE
MONITORIS CENTRONICS DRIVER ROUTINE.

12.07 CENTRONICS PRINTER DRIVER
100 OUT 255,J OR 128
110 OUT 255,J
120 OUT 255,J OR 128
THESE THREE OUT STATEMENTS SEND THE ASCII CHARACTER VALUE
IN J, AND STROBE THE HANDSHAKE ON BIT 7. THIS METHOD OF
SENDING CHARACTERS TO A CENTRONICS PRINTER IS MUCH SLOWER
THAN THE METHOD OF 12.06 WHERE THE IOUT I COMMAND PASSES
THE ASCII DIRECTLY TO THE MONITORIS CENTRONICS 'ROUTINE.
---------------------------------------------------------------

12.08 ACCESS CENTRONICS PRINTER DRIVER FROM BASIC.
100
110
120
130
140
200

RAMSIZE = PEEK(-4095) * 256 + PEEK(-4096)
IF RAMSIZE > 32767 THEN RAMSIZE = RAMSIZE - 65536

.

POKE RAMSIZE - 47,147

REM TURN PRINTER ON

POKE RAMSIZE - 47,240

REM TURN PRINTER OFF

THE ABOVE IS EQUIVALENT TO

>SE O=L

AND

>SE O=V.

---------------------------------------------------------------

12.09 PROGRAMMING THE UART FOR PARITY OPTIONS
THE UART USED FOR SERIAL TRANSMISSION CAN BE PROGRAMMED
FOR VARIOUS PARITY AND STOP BIT OPTIONS.
0000: 3E xx
0002: D3 FD
0004: C9

START

7 6 5 4
X X X P

FORMAT=
X
P
PS
S
NB2

=
=
=
=
-

LD
OUT
RET

A,VALUE ;CONTROL PARAMETER
(OFDH),A ;PROGRAM UART
;BACK TO MAIN PROGRAM

3 2 1 0
(8 BIT POSITIONS)
PS S NB2 NB1

DONIT CARE BIT POSITION
PARITY ENABLE: O=ENABLED
l=NONE
PARITY SELECT: O=ODD
l=EVEN
# OF STOP BITS: O=ONE
l=TWO BITS
NB1 = NUMBER OF BITS PER CHARACTER
NB2 NB1

# OF BITS

005
016
107
118
EXAMPLE:

VALUE = OEH = 00001110 BINARY
7 BITS PER CHARACTER
2 STOP BITS
PARITY ENABLED
PARITY EVEN

CHAPTER 13 ---

CASSETTE TAPE

13.01 WRITE OAT A TO CASSETTE TAPE
100
110
120
130
140
150
160
170
180
190
200
210
220

MS=256*PEEK(-4095)+PEEK(-4096) : REM MEMORY SIZE
IF MS>32767 THEN MS=MS-65536
POKE MS-45,8 : POKE MS-44,1 : REM DISABLE KEYBOARD
POKE MS-41,16
REM MOTOR #1 CONTROL
OUT 254,16
: REM TURN ON MOTOR #1.
POKE MS-47,18:POKE MS-46,244: REM OUTPUT TO TAPE
FOR J=l TO 10
FOR K=l TO 100:NEXT K
REM DELAY BETWEEN DATA
PRINT A$(J);II,II;A(J)
REM PRINT DATA ON TAPE
NEXT J
POKE MS-47,27
REM RESTORE VIDEO
OUT 254,0
REM OFF MOTOR #1
POKE MS-45,24:POKE MS-44,224: REM RESTORE KEYBOARD

BOTH STINGS AND NUMBERS MAY BE PRINTED ON THE TAPE.
SEPARATES THE DATA TO MATCH THE INPUT STATEMENT.
THE FILE CREATED HAS NO NAME AND NO CRC ERROR CHECKING.
KEYBOARD IS DISABLED SO THAT ITS USUAL SCAN DOES NOT
TURN THE CASSETTE MOTORS OFF .
11,11

.'

---------------------------------------------------------------

13.02 READ DATA FROM CASSETTE TAPE
400
410
420
430
440
450
460
470
480
490
500

MS=256*PEEK(-4095)+PEEK(-4096) : REM MEMORY SIZE
IF MS>32767 THEN MS=MS-65536
POKE MS-45,15:POKE MS-44,224: REM TAPE TO INPUT
POKE MS-41,16
: REM MOTOR #1 CONTROL
OUT 254,16
: REM TURN ON MOTOR #1.
FOR J=l TO 10
FOR K=l TO 30:NEXT K REM DELAY < THAN WHEN WRITTEN
INPUT A$(J),A(J)
REM INPUT DATA FROM TAPE
NEXT J
POKE MS-45,24
REM RESTORE INPUT TO KEYBOARD
OUT 254,0
REM TURN OFF MOTOR #1

THIS ROUTINE READS THE DATA TAPES CREATED BY 13.01. THE
INPUT STATEMENT ON LINE 470 IS A MATCHED STATEMENT TO
THE PRINT STATEMENT ON LINE 180. THE INPUT VECTOR POINTS
TO THE TAPE INPUT ROUTINE RATHER THAN TO THE KEYBOARD.

CHAPTER 14 ---

EDITOR FOR BASIC

14.01 EDITOR FOR BASIC INSTRUCTIONS.
TO USE

>LO EDIT
>SE I=7000
>pp

(Load the editor from 14.02)
(For 32K version, ie. ORG address)
(Exit back to Basic)

Any cursor movement key, HOME, or TAB will activate edit mode
as indicated by the inverse video cursor.
CTRL E

Expand the line by moving the rightmost characters
one space right for insertion ahead of the cursor.

CTRL R

Reduce the line by deleting the character under the
cursor. Rightmost characters move one space left.

RUBOUT

Rubout the character under the cursor and replace
with a space. Note that RUBOUT is now unshifted.

CTRL N

Renumber all program statements in increments of 10
starting at 100. Starting line number is stored in
bytes 7136 and 7137 hex, and the increment is
stored in bytes 71A1 and 71F9 hex if you desire to
change them.

Example:

>EN 7136
7136: E8 03 /
>EN 71A1
71A1: 64 /
>EN 71F9
71F9: 64 /
>pp

(Enter Monitor by typing BYE )
(Change starting line # to 1000)
(Changes increment to 100)
(Exit back to Basic)

CTRL U

-Up (ie. revive) a program lost due to mistakenly
typing NEW or CLOAD. (Hard reset destroys a
portion of your program near the start. However,
you may be able to revive from hard reset by using
CTRL U, listing the program, and deleting the line
number that is messed up. Loosing a couple lines
at the start of a program from a hard reset is
better than loosing the entire program.)

TAB

Tab to the preset tabs i.n columns 1, 9, 17, 25, 33,
41, 49, 57, and enter edit mode.

INVERSE CURSOR
The editor's cursor is the inverse video of
the character it is sitting on top of.
LINE NUMBER EDITING
Editing a statement's line number will
COpy the line under the new line number. The
original line still exits and may deleted, if you
desire, by typing the old line number and RETURN.

WRITING CODE

Preferably enter edit mode before starting a
statement. (If you enter the edit mode DURING the
typing of a line, all of the text on the screen
will be added behind what you have already typed.
Therefore, return to the line in edit mode and hit
RETURN a second time. Basic will then have the
line as it appears on the screen.)

TRANSPARENCY

When not in edit mode, the keyboard functions
normally wherein you may RUN, CSAVE, LIST, write
code, insert or delete lines, etc. The Monitor's
>SE I=K will restore the regular Sorcerer keyboard
routine.

CLEAR

Using CLEAR will no longer generate a SYNTAX ERROR
message.

CTRL X

Cross reference the Basic program's variables and
statement references such as GOTO, GOSUB, RESTORE,
etc. This feature is present ONLY if you bought
our CROSS REFERENCE program and added it to your
Editor for Basic.

14.02 EDITOR FOR BASIC SOURCE LISTING
7000:
7003:
7004:
7005:
7006:
7007:
7009:
700C:
700E:
7010:
7013:
7015:
7017:
7019:
701B:
701D:
701F:
7021:
7023:
7025:
7027:
7029:
702B:
702D:
702F:
7031:
7033:
7035:
7037:
703A:
703C:
703F:
7041:
7043:
7045:
7047:
7049:
704B:
704D:
704E:
7051:
7052:
7053:
7055:
7057:
7059:
705B:
705D:
705F:
7062:
7065:

CD
c8
C5
D5
E5
FD
CD
FE
20
CD
18
FE
28
FE
28
FE
28
FE
28
FE
28
FE
28
FE
28
FE
28
FE
CA
FE
CA
FE
20
3E
18
FE
20
3E
47
3A
B7
78
28
FE
28
FE
20
3E
32
CD
CD

1C EB

E5
A2
OC
05
OC
71
01
46
11
42
13
3E
17
3A
1A
36
OB
62
05
73
12
7C
OE
35
15
19
7F
04
5F
06
5F
02
7F

EDITOR

E1
EO
L7015

71
71

18 71
32
OD
7D
7F
02
08
18 71
OC EO
D6 E9

L7047
L704D

VIDEO

ORG
CALL
RET
PUSH
PUSH
PUSH
PUSH
CALL
CP
JR
CALL
JR
CP
JR
CP
JR
CP
JR
CP
JR
CP
JR
CP
JR
CP
JR
CP
JR
CP
JP
CP
JP
CP
JR
LD
JR
CP
JR
LD
LD
LD
OR
LD
JR
CP
JR
CP
JR
LD
LD
CALL
CALL

7000H
OEB1CH
Z
BC
DE
HL
IY
OE1A2H
OOCH
NZ,L7015-$
OEOOCH
CLEAR-$
001H
Z,VIDEO-$
011H
Z,VIDEO-$
013H
Z,VIDEO-$
017H
Z,VIDEO-$
01AH
Z,VIDEO-$
OOBH
Z,TAB-$
005H
Z,EXPAND-$
012H
Z,REDUCE-$
OOEH
Z,RENUM
015H
Z,CLOAD
07FH
NZ,L7047-$
A,05FH
L704D-$
05FH
NZ,L704D-$
A,07FH
B,A
A, (FLAG)
A
A,B
Z,END-$
OODH
Z,LINE-$
07FH
NZ,VIDEO-$
A,008H
(FLAG),A
OEOOCH
OE9D6H

;SCAN KEYBOARD
;RETURN IF NOTHING

;GET IY
;CLEAR KEY?
;CLEAR VIDEO CRT
;RET WITH NOTHING
;CURSOR LEFT
;CURSOR HOME
;CURSOR RIGHT
;CURSOR UP
;CURSOR DOWN
;TAB
;CTRL E - EXPAND
;CTRL R - REDUCE
;CTRL N - RENUMBER
;CTRL U - UP PROG
; RUBOUT
; CHANGE TO UNDERSC
; UNDERSCORE
;CHANGE TO RUBOUT

;RESTORE CHAR
;EXIT NORMAL MODE
;
; RUBOUT
; BACKSPACE
;ENTER EDIT MODE
;CHAR TO VIDEO
;GET CURSOR ADDR

,.

REVERSE VIDEO CHARACTER UNDER CURSOR

706B:
706A:
706D:
706F:
7070:
7071:
7072:
7075:
7076:
707A:
707C:
707D:
707E:
70B1:
70B2:
70B4:
,
70B6:
70B7:
70B9:
70BB:
70BC:
70BD:
70BE:

36
FD
26
29
29
29
11
19
DD
06
7E
2F
DD
23
DD
10

FE
6E 67
00

00 FB
21 FO FF
OB
77 00
23
F6

AF
FE 00
FD E1
E1
D1
C1
C9

INVERSE LD
LD
LD
ADD
ADD
ADD
LD
ADD
LD
LD
LD
L707C
CPL
LD
INC
INC
DJNZ

(HL),OFEH
L,(IY+067H)
H,OOOH
HL,HL
HL,HL
HL,HL
DE,OFBOOH
HL,DE
IX,OFFFOH
B,OOBH
A, CHL)

;INVERSE VIDEO
;CHAR UNDER CURSOR

CLEAR
END

XOR
CP
POP
POP
POP
POP
RET

A
OOOH
IY
HL
DE
BC

;RETURN NOTHING
;SET Z FLAG

CALL
LD
ADD
AND
LD
LD
CALL
JR

OE9EBH
A,(IY+06AH)
A,OOBH
03BH
(IY+06AH) , A
(FLAG) , A
OEgCCH
INVERSE-$

:REPLACE CURSOR
; COLUMN NUMBER

;ASCII OFFSET
;TABLE BASE
;HL = BIT PATTERN
;GRAPHIC CHAR 254
;ROW COUNTER
;GET BIT PATTERN
; INVERSE
(IX+OOOH),A ;CREATE GRAPHICS
;NEXT ROW
HL
IX
;LOOP B TIMES
L707C-$

;EXIT

PERFORM TAB FUNCTION
;

70BF:
7092:
7095:
7097:
7099:
709C:
70gF:
70A2:

,.

CD
FD
c6
E6
FD
32
CD
1B

EB
7E
oB
3B
77
1B
CC
C4

E9
6A
6A
71
Eg

TAB

L709C

;UNIFORM TABS
;NEW COLUMN
;ENTER EDIT MODE
;MOVE CURSOR
;INVERSE VIDEO

EXPAND OR REDUCE LINE ONE CHARACTER AT CURSOR LOCATION

70A4:
70A7:
70A9:
70AA:
70AB:
70AC:
70AE:
70AF:

CD
2B
E5
D1
2B
ED
23
1B

c4 70
13

BB
OB

EXPAND

CALL
JR
PUSH
POP
DEC
LDDR
INC
JR

DELTA
Z,L70BC-$
HL
DE
HL
HL
L70BC-$

;GET SCREEN ADDRS

;SHIFT LINE RIGHT

,
70B1:
70B4:
70B6:
70B7:
70B8:
70B9:
70BB:
70BC:
70BE:
70BF:
70C2:

CD
28
D5
E1
23
ED
2B
3E
77
CD
18

c4 70
06

REDUCE

BO
20

L70BC

CC E9
A4

CALL
JR
PUSH
POP
INC
LDIR
DEC
LD
LD
CALL
JR

DELTA
Z,L70BC-$
DE
HL
HL
HL
A,020H
(HL) , A
OE9CCH
INVERSE-$

;GET SCREEN ADDRS

;SHIFT LINE LEFT
;INSERT SPACE
;SAVE CURSOR

CALCULATE NUMBER OF CHARACTERS TO SHIFT
ON
,
70C4:
70C7:
70C8:
70CA:
70CC:
70CD:
70CE:
70DO:
70D1:
70D2:
70D3:
70D4:
70D5:

EXIT:
CD
7D
E6
D6
2F
4F
06
EB
C5
E1
19
B1
C9

E8 E9
3F
40
00

DE = PRESENT CURSOR ADDR.
DELTA

CALL
LD
AND
SUB
CPL
LD
LD
EX
PUSH
POP
ADD
OR
RET

OE9E8H
A,L
03FH
o40H
C,A
B,OOOH
DE,HL
BC
HL
HL,DE
C

HL = LINE END ADDR.
;REPLACE CURSOR

;BC = # CHAR
;DE = PRESENT
;HL = LINE END
;TEST BC=O

COPY EDITED LINE FROM SCREEN TO REPLACE ONE IN MEMORY
,
HL,NEW
;NEW INPUT VECTOR
70D6: 21 F4 70
LINE
LD
(IY+041H),L
LD
70D9: FD 75 41
(IY+042H),H
LD
70DC: FD 74 42
;GET LINE END ADDR
70DF: CD c4 70
CALL DELTA
LD
B,041H
;65 CHAR DEFAULT
70E2: 06 41
LD
A,020H
70E4: 3E 20
CP
(HL)
L70E6
70E6: BE
JR
NZ,L70ED-$
70E7: 20 04
DEC HL
70E9: 2B
DJNZ L70E6-$
;SUBTRACT SPACES
70EA: 10 FA
;B <> 0
70EC: 04
INC B
A,B
;# CHAR TO MOVE
70ED: 78
L70ED
LD
(IY+06AH),000H ;FIRST COLUMN
LD
70EE: FD 36 6A 00
JR
L709C-$
;GO UPDATE MEMORY
70F2: 18 A8

,

PUT ADDRESS OF NEXT LINE IN (NEXT)

7141:
7144:
7147:
7148:
7149:
714A:
714B:
714F:
7150:
7151:
7154:
7155:

2A
22
5E
23
56
23
ED
7B
B2
CA
23
23

54 72
4E 72

53 54 72
E6 71

NEXT LIN LD
LD
LD
INC
LD
INC
LD
LD
OR
JP
INC
INC

HL, (NEXT)
(PRESENT),HL
E, (HL)
HL
D,(HL)
;DE = NEXT LINE
HL
(NEXT),DE
A,E
D

Z,PASS2
HL
HL

LOOK FOR REM, GOTO, GOSUB, THEN
,
LOOK
LD
A,(HL)
7156: 7E
INC HL
7157: 23
L7158
CP
OOOH
7158: FE 00
JR
Z,NEXTLIN-$
715A: 28 E5
CP
o8FH
715C: FE 8F
715E: 28 E1
JR
Z,NEXTLIN-$
7160: FE 89
CP
089H
7162: 28 OE
JR
Z,GOTO-$
7164: FE 8D
CP
08DH
7166: 28 OA
JR
Z,GOTO-$
7168: FE 8c
CP
o8CH
JR
Z,GOTO-$
716A: 28 06
716c: FE A2
CP
OA2H
716E: 28 02
JR
Z,GOTO-$
JR
LOOK-$
7170: 18 E4
PROCESS GOTO, GOSUB, THEN STATEMENTS
,
GOTO
PUSH HL
7172: E5
CALL OC7EAH
7173: CD EA C7
LD
( POINT) , HL
7176: 22 50 72
XOR A
7179: AF
717A: C1
POP BC
SBC HL,BC
717B: ED 42
LD
(LENGTH),HL
717D: 22 56 72

;TEST END OF PROG

;GET CHARACTER
;END OF LINE?
;REM ?
;GOTO ?
; GOSUB ?
;RESTORE ?
; THEN
;CONTINUE SEARCH

;SAVE BEGIN ADDR
;CONVERT TO BINARY
;END OF # ADDR
;LENGTH OF LINE #

SEARCH FOR LINE # MATCH
;

7180:
7183:
7186:
7189:
718A:
718B:
718c:
718D:
718E:
718F:
7191:
7192:
7193:
7194:
7195:
7196:
7197:
719A:
719C:
719D:
71AO:
71A3:
71A4:
71A7:
71A8:
71A9:
71AA:

,

n1

58 72
52 72
D5 01
L7189

48

74 C5
10
52 72
OA 00
52 72

OJ ....

69
60
18 DD

LD
LD
LD
LD
INC
LD
INC
LD
OR
JR
PUSH
LD
INC
LD
EX
POP
CALL
JR
PUSH
LD
LD
ADD
LD
POP
LD
LD
JR

HL,(INIT)
(COUNT),HL
HL,01D5H
c, (HL)
HL
B, (HL)
HL
A,C
B
Z,L71D9-$
DE
E, (HL)
HL
D, (HL)
DE,HL
DE
OC574H
Z,L71AC-$
DE
HL,(COUNT)
DE,10
HL,DE
(COUNT),HL

;INITIALIZE LINE #

;NEXT LINE ADDR

;END OF PROG?
;SAVE MATCH #
; CURRENT LINE #
; COMPARE HL-DE
;NO MATCH
;ADD 10 TO COUNT

1"'\1':'

uc.

L,C
H,B
L7189-$

;NEXT LINE ADDR

FOUND MATCH, CONVERT LINE # TO DECIMAL AND REPLACE

71AC:
71AF:
71B2:
71B5:
71B9:
71BA:
71BD:
71CO:
71C1:
71C3:
71C4:
71C5:
71C6:
71C9:
71CA:
71CE:

,.

2A
22
21
4E
23
46
23
79
BO
28
D5
5E
23
56
EB
D1
CD
28
D5
2A
11
19
22

CD
2A
CD
ED
41
CD
CD
7D
E6
4F
78
91
FC
2B
DD
DD

B2
52
BB
4B

C9
72
D7
56 72

L71AC

A2 E1
D6 E9
07

OC 72
2A 50 72
2B

CALL
LD
CALL
LD
LD
CALL
CALL
LD
AND
LD
LD
SUB
CALL
DEC
LD
DEC

OC9B2H
HL,(COUNT)
OD7BBH
BC,(LENGTH)
B,C
OE1A2H
OE9D6H
A,L
007H
C,A
A,B
C
M,EXPAND
HL
IX, (POINT)
IX

;FIRST COLUMN
;# TO CONVERT

;PRINT DECIMAL #
;LENGTH OF #
;GET IY
;GET CURSOR ADDR

;MOVE PROG DOWN

MOVE NUMBER ON SCREEN TO MEMORY IN REVERSE ORDER

71DO:
71D1:
71D4:
71D5:
71D7:

7E
DD 77 00
2B
DD 2B
10 F7

L71DO

LD
LD
DEC
DEC
DJNZ

A, (HL)
(IX+OOOH),A ; TRANSFER CHAR
HL
IX
L71DO-$

,

CHECK FOR COMMA AFTER NUMBER

71D9:
71DC:
71DD:
71DF:
71EO:
71E3:
,

2A
7E
FE
23
CA
C3

50 72

L71D9

2C
72 71
58 71

LD
LD
CP
INC
JP
JP

HL,(POINT)
A, (HL)
02CH
HL
Z,GOTO
L7158

;LAST LOOK ADDR
; IS IT A COMMA?
;YES, CONVERT #
;NO, CONTINUE SCAN

PASS TWO - RENUMBER ALL LINES

71E6:
71E9:
71ED:
71EE:
71EF:
71FO:
71F1:
71F2:
71F3:
71F5:
71F6:
71F7:
71F8:
71FB:
71FC:
71FD:
71FE:
71FF:
,
7201:
7204:
7207:
7209:

21
ED
4E
23
46
23
79
BO
28
73
23
72
21
19
EB
69
60
18

D5 01
5B 58 72

EC

21
CD
3E
C3

AF C2
15 DO
OD
87 70

PASS2

LD
LD
LD
INC
LD
INC
LD
OR
JR
LD
INC
LD
LD
ADD
EX
LD
LD
JR

HL,01D5H
DE,(INIT)
C,(HL)
HL
B, (HL)
HL
A,C
B
Z,L7201-$
(HL) , E
HL
(HL) , D
HL,10
HL,DE
DE,HL
L,C
H,B
L71ED-$

L7201

LD
CALL
LD
JP

HL,OC2AFH
OD015H
A,OODH
END

EXPAND

PUSH
PUSH
LD
SUB
LD
LD
PUSH
LD
ADD
LD
LD
ADD
LD
EX
LD

BC
HL
A,C
B
C,A
B,OOOH
BC
HL, (NEXT)
HL,BC
(NEXT),HL
HL,(POINT)
HL,BC
(POINT),HL
DE,HL
HL,(OlB7H)

L71ED

OC

OA 00

;START OF PROGRAM
;NEW LINE NUMBER
;GET FORWARD LINK

;END OF PROGRAM?
;STORE NEW LINE #
;DEFAULT INCREMENT

;LOOP TIL PROG END
;PRINT READY
;RETURN 

MOVE PROGRAM DOWN
,

720C:
720D:
720E:
720F:
7210:
7211:
7213:
7214:
7217:
7218:
721B:
721E:
721F:
7222:
7223:

C5
E5
79
90
4F
06
C5
2A
09
22
2A
09
22
EB
2A

00
54 72
54 72
50 72
50 72
B7 01

;A ; # TO MOVE

;ADJUST POINTERS
;ADJUST POINTERS
;NEW PROG END ADDR

7226:
7227:
7228:
722B:
722C:
722E:
722F:
7230:
7231:
7232:
7233:
7235:
7238:

E5
09
22
E5
ED
E5
C1
D1
E1
03
ED
2A
C1

7239:
723A:
723B:
723C:
723D:
723E:
7240:
7241:
7242:
7243:
7244:
7245:
7246:
7247:
7248:
,.
724A:
724B:
724C:
724D:

5E
23
56
7B
B2
28 OA
2B
EB
09
EB
73
23
72

E1
C1
41
C9

L724A

724E:
7250:
7252:
7254:
7256:
7258:

00
00
00
00
00
00

PRESENT
POINT
COUNT
NEXT
LENGTH
INIT

,.

,

B7 01
52

B8
4E 72
RELINK

EB

18 EF

PUSH
ADD
LD
PUSH
SBC
PUSH
POP
POP
POP
INC
LDDR
LD
POP

HL
HL,BC
(01B7H),HL
HL
HL,DE
HL
BC
DE
HL
BC

LD
INC
LD
LD
OR
JR
DEC
EX
ADD
EX
LD
INC
LD
EX
JR

E, (HL)
HL
D, (HL)
A,E
D
Z,L724A-$
HL
DE,HL
HL,BC
DE,HL
(HL) , E
HL
(HL) •D
DE,HL
RELINK-$

POP
POP
LD
RET

HL
BC
B,C

DEFW
DEFW
DEFW
DEFW
DEFW
DEFW

0
0
0
0
0
0

;MOVE PROG DOWN
HL,(PRESENT)
;DISTANCE MOVED
BC
;RELINK BOTTOM

;AT PROG END?

; ADJUST LINK

;RELINK FINISHED

CHAPTER 15 --- CP/M
15.01 SAVE ROMPAC BASIC PROGRAM ON CP/M DISK.
REQUIREMENT:

..

DISK BOOT ADDRESS MUST NOT CONFLICT WITH
THE ROMPAC ADDRESSES OF COOO - DFFF HEX.

CLOAD XMPLE
BYE
>DU 1B7 1B8
01B7: C4 24
>GO B900
A>SAVE 36 XMPLE.COM
A>XMPLE
READY
RUN

CLOAD PROGRAM FROM TAPE.
FIND END OF BASIC PROGRAM.
TYPICAL END-OF-PROGRAM ADDRESS.
TYPICAL DISK BOOT ADDRESS.
STORE xx BLOCKS ON DISK.
LOAD PROGRAM FROM DISK.
PRINTED BY BASIC ROMPAC.
EXECUTE ROMPAC BASIC.

JUST CONVERT CONTENTS OF BYTE 1B8 TO DECIMAL FOR xx.
WHEN CP/M LOADS THE PROGRAM AND BEGINS EXECUTION, IT
FINDS A JP OC06BH AT 100H. THIS JUMP WAS PLACED AT
100H BY THE BASIC ROMPAC.
===============================================================

15.02 SAVE WORD PROCESSOR ROMPAC FILES ON CP/M DISK.
REQUIREMENT:

DISK BOOT ADDRESS MUST NOT CONFLICT WITH
THE ROMPAC ADDRESSES OF COOO - DFFF HEX.

COMMAND> X
>DU 74A 74B
074A: 45 1A
>EN 100
0100: C3 03 CO
>GO B900
A>SAVE 26 WPFILE.COM
A>WPFILE

EXIT TO MONITOR FROM WP ROMPAC.
FIND END OF WORD PROCESSOR FILE.
TYPICAL END-OF-FILE ADDRESS
NEED JUMP TO ROMPAC WARM START.
TYPICAL DISK BOOT ADDRESS.
SAVE xx BLOCKS THROUGH FILE END.
26 DECIMAL = 1A HEX FROM 74B.
RELOAD AND JUMP TO WARM START.

--------.-~-"-----.

--~.-~--,~----~--

.....

~~~~~

15.03 CP/M COMMANDS
PIP
PIP
PIP
PIP
PIP
PIP

A:=B:XXX.COM
A:=B:*.*
B:=C:*.COM
B:PROG.BAK=C:PROG.COM
B:=C:*.COM[V]

PIP B:XXX=A:YYY
PIP B:=A:XXX.*

Copy XXX file from
B to A
Copy all files from
B to A
Copy all COM files from C to B
Make backup of PROG from C to B
Copies all COM files from C to B
with verification
.
Copy YYY from A to B and rename XXX
Copy all files with name of XXX on
A onto B

REN
REN
REN
REN
REN

NEW.COM=OLD.COM
NEW.BAK=OLD.COM
XXX.BAK=XXX.COM
C:XXX.COM=YYY.COM

Rename
Rename
Rename
Rename

file name
file OLD type COM to NEW type BAK
filetype
filename YYY on C to XXX

ERA
ERA
ERA
ERA
ERA
ERA

XXX. COM
*.DAT
XXX.*

* *

C:*.COM

Erase
Erase
Erase
Erase
Erase

filename XXX with type COM
all file types of DAT
all files with name of XXX
all files
all COM type files on C

SAVE
A>SAVE xx PROGNAME.COM
A>SAVE xx B:PROGNAME.COM

Save file on A
Save file on B

CTRL CHARACTERS
CTRL X - delete line typed
CTRL R - retype line
CTRL C - reboot system (warm)

----~-

--

-~---~

15.04 BIOS MODIFICATIONS TO GIVE BACKSPACE TYPE RUBOUTS
CONSOLE INPUT
This routine must get a character from the console,
and return the character in the ACCUMULATOR.
If the character is a RUBOUT, then a new delete flag
is set to cause the backspace sequence of characters
to be sent to the VIDEO display by the CONSOLE OUTPUT
driver.

,
B24D:
B250:
B253:
B256:
B259:
B25B:
B25E:
B260:
B263:
B265:
B266:
B268:
B26B:
B26D:

CD
CA
CD
CA
FE
CA
FE
CA
FE
CO
3E
32
3E
C9

26
4D
09
4D
OB
6E
09
71
7F

B2
B2
EO
B2

CINP

A,l
DELF
A,7FH

;IS A CHARACTER READY?
;NO--WAIT FOR IT.
;GET THE CHARACTER.
;TRY AGAIN IF NOT IN TIME
;IS THE CHARACTER A TAB?
;YES--CONVERT IT.
;IS IT A CONTROL I ?
;YES-;IS THIS AN UNDERSCORE?
;NO, FINISHED WITH CINP
;SET
,
DELETE FLAG
;CHANGE TO RUBOUT

MVI
RET

A,'I'_40H

;CHANGE TO THE CP/M TAB

MVI
RET

A,'K ' -40H

;CHANGE TO CONTROL K.

CALL
JZ
CALL
JZ
CPI
JZ
CPI
JZ
CPI
RNZ
MVI
STA
MVI
RET

B2
B2

01
EA B2
7F

B26E: 3E 09
B270: C9

TABIT

B271: 3E OB
B273: C9

UNTAB

,

,.

CSTAT
CINP
KEYBRD
CINP
'K'-40H
TABIT
'I'-40H
UNTAB
5FH

CONSOLE OUTPUT
This routine will be called with the character to be
output in the IC I REGISTER.
If the delete flag is
set, then generate the characters to erase the deleted
character from the video display rathar than echo it.

,
B274:
B277:
B279:
B27C:
B27D:
B280:
B282:
B285:
B287:
B28A:
B28c:

3A
FE
C2
E5
21
3E
CD
3E
CD
3E
CD

EA B2
01
97 B2
EB
01
1B
20
1B
01
1B

B2
EO
EO
EO

COUT

LDA
CPI
JNZ
PUSH
LXI
MVI
CALL
MVI
CALL
MVI
CALL

DELF
1

JMPRBO

;CHECK
,
DELETE FLAG
;NO, GO JMPRBO

H

H,CHAR2
A,l
VIDEO
A,020H
VIDEO
A,l
VIDEO

;MOVE CURSOR LEFT
;SPACE ERASE CHAR
;MOVE CURSOR LEFT

B28F:
B290:
B291:
B293:
B296:

34
E1
3E 00
32 EA B2
C9

B297:
B298:
B299:
B29C:
B29E:
B2A1:
B2A3:
B2A6:
B2A7:
B2AA:
B2AC:
B2AF:
B2B1:
B2B1I:
B2B5:
B2B7:
B2BA:
B2BB:

79
E5
21
FE
CA
FE
CA
35
C2
3E
CD
3E
CD
79
36
CD
E1
C9

B2EA: 00

EB B2
OD
B5 B2
OC
B5 B2
B7 B2
OD
1B EO
OA
1B EO
42
1B EO

INR
POP
MVI
STA
RET

,.

JMPRBO MOV
PUSH
LXI
CPI
JZ
CPI
JZ
DCR
JNZ
MVI
CALL
MVI
CALL
MOV
NEW
MVI
VOUT CALL
POP
RET
DELF

M
H
A,O
DELF

;ADJUST CHAR COUNT

A,C
H
H,CHAR2
ODH
NEW
OCH
NEW
M
VOUT
A,13
VIDEO
A,10
VIDEO
A,C
M,1I2H
VIDEO
H

;GET IT TO THE ACUM.
;SAVE HL.
;POINT TO CHAR COUNT
;CARRIAGE RETURN?

ORG OB2EAH
DEFB 0

; RESET
DELETE FLAG

;FORM FEED?
;COUNT OFF CHAR.
;GO WORK.
;SEND CR
;SEND A LINE FEED
;CHARACTER TO ACCUM
;RESET CHARACTER COUNT
;MORE WORK.
;JUST LIKE WE CAME IN
;BACK TO CALLER
;IE. AFTER END OF BIOS
;DELETE FLAG

...

15.05 CP/M LOAD ROUTINE OF WP FILES FOR DEVPAC
This program operates with the Development Pac by bringing
a Word Processor File into the DEVPAC file area from CP/M
disk. The program then sets the I/O vectors, and jumps to
the Development Pac.
COPYRIGHT (C), Frank Root, Sept. 16, 19B1
BDOS
OPENF
READF
DMAF
FILE
FCB
FCBCR
BUFINC
,
OPEN

,
MAIN

ORG
EQU
EQU
EQU
EQU
EQU

100H
0005H
15
20
26
05ABOH

EQU
EQU
EQU

5CH
FCB+32
BOH

LD
LD
CALL
CP
RET
XOR
LD

DE,FCB
C,OPENF
BDOS
255

;OPEN NAMED FILE

(FCBCR) ,A

;SET FIRST RECORD TO 0

PUSH
LD
LD
CALL
CALL
CP
JR
POP
RET

BC
;SAVE BC
BC,FILE
(FILBUF),BC
MOVBUF
DISKR
0
;CHECK FOR ERROR
Z,LOOP-$
BC
;BACK TO CPM ON READ ERROR

PUSH
LD
LD
ADD
LD
POP
CALL
CALL
CP
JR
POP
RET

HL
;SAVE HL
HL,(FILBUF)
BC,BUFINC
;BUFFER LENGTH
HL,BC
(FILBUF),HL
HL
MOVBUF
DISKR
0
;CHECK FOR ERROR
Z,LOOP-$
BC
;BACK TO CPM ON READ ERROR

Z
A

;DOS ENTRY POINT
;FILE OPEN
;READ FUNCTION
;SET DMA ADDRESS FUNCTION
;START ADDRESS OF FILE FOR
;46K MEMORY CONFIGURATION
;FILE CONTROL BLOCK
;CURRENT (NEXT) RECORD
;READ BLOCK LENGTH

;CHECK FOR OPEN ERROR
;BAD OPEN

,

LOOP

DISKR

PUSH
PUSH
PUSH
LD
LD
CALL
POP
POP
POP
CP
JR
RET

HL
DE
BC
DE,FCB
C,READF
BDOS
BC
DE
HL

PUSH
PUSH
PUSH
LD
LD
CALL
POP
POP
POP
RET

HL
;MOVE BUFFER TO RAM
DE
BC
DE, (FILBUF)
C,DMAF
BDOS
BC
DE
HL

EQU
EQU
EQU
EQU
EQU
EQU
EQU
EQU
EQU
EQU
EQU

OFOIEH
OF020H

LD
LD
LD
LD
LD
LD
LD
LD
LD
LD
LD
LD
LD

BC,SK
(CI),BC
BC,SV
(CO),BC
BC,AO
(OI),BC
BC,AI
(00) , BC
BC,BO
(SI), BC
BC,SV
(SO),BC
BC,FILE

1

Z,FINIS-$

;READ ONE BUFFER FROM DISK

;CHECK FOR EOF

;

MOVBUF

,
CI
CO

or

00
SI
SO
SK
SV
AO
AI
BO

,

FINIS

OF022H

OF024H
OF026H
OF028H
OC547H
OC54EH
OC60AH
OC5F5H
OC624H
;SET DEVELOPMENT PAC VECTORS

ELOOP

,
FILBUF

INC
LD
CP
JR
XOR
LD
POP
POP
JP

BC
A, (BC)
OIAH
NZ,ELOOP-$

;NOW PUT A

10 1

AT EOF

;IS IT DISK EOF MARKER?

A
(Be) , A

BC
BC
OEOOOH

DEFW 0
END

--------~---

-~--

;POP DISKR RETURN ADDRESS
;RESTORE BC FROM MAIN PUSH
;TO RESET ADDRESS OF DEVPAC

CHAPTER 16 ---

WORD PROCESSOR

16.01 WORD PROCESSOR PRINTER DRIVER
INSTALL YOUR OWN PRINTER DRIVER BY PUTTING THE ADDRESS
OF YOUR ROUTINE IN BYTES 7E7 AND 7E8 HEX.
USES DRIVER #1 IN THE Y TABLE.
0000: 21 yy xx
0003: 22 E7 07

ENTRY

LD
LD

HL,NEWDRIVER
(07E7H),HL

---------------------------------------------------------------

16.02 SALVAGE WORD PROCESSOR FILE FROM RESET.
IF THE WORD PROCESSOR RESETS, AND YOU ARE CURSING BECAUSE
YOUR FILE WASN'T SAVED ON TAPE OR DISK YET, ALL IS NOT
LOST. YOU MAY BE ABLE TO SALVAGE YOUR FILE (EVERYTHING
EXCEPT FOR THE FIRST 175 CHARACTERS.)
GO TO THE MONITOR AND TRY:

>MO 800 8CE 801
>PP

YOUR FILE IS STILL IN MEMORY, AND ONLY THE FIRST FEW
LINES OF TEXT HAVE BEEN LOST. THESE LOST LINES WILL
HAVE TO BE REENTERED.
---------------------------------------------------------------

16.03 PRINTER DRIVER TO SEND ESCAPE SEQUENCES
THIS DRIVER PATCHES INTO THE WORD PROCESSOR ROMPAC PRINTER
DRIVER TO ALLOW ONE TO SEND ESCAPE SEQUENCES TO ACCESS A
PRINTER'S SPECIAL FEATURES SUCH AS FONT SIZES AND FORM FEED.
CREATE A TABLE OF ESCAPE SEQUENCES THAT YOUR PRINTER
UNDERSTANDS AT THE END OF THIS ROUTINE. THE TABLE IS
CONSTRUCTED WITH A MATCH LETTER FOLLOWED BY A FIVE BYTE ESCAPE
SEQUENCE. THUS, THE TABLE IS A MULTIPLE OF 6 BYTES IN LENGTH.
THIS DRIVER WATCHES FOR AN @ SIGN IN THE WORD PROCESSOR TEXT
TO SIGNAL THAT THE NEXT LETTER IS TO GENERATE SOME DESIRED
ESCAPE SEQUENCE. NEITHER THE @ SIGN, NOR THE FOLLOWING MATCH
LETTER WILL BE PRINTED. INSTEAD, THE ROUTINE WILL SEARCH THE
TABLE FOR THIS LETTER AND SEND THE 5 BYTE SEQUENCE THAT
FOLLOWS THE MATCH LETTER.
AFTER LOADING THIS ROUTINE, >GO 0
TO INITIALIZE THE ROUTINE.
THE ROUTINE WILL PATCH ITSELF INTO THE WORD PROCESSOR PRINTER
DRIVER. IN THE 'Y' TABLE, USE PRINTER ROUTINE #1.
;

0000:
0001:
0004:
0007:
OOOA:

AF
32
21
22
C3

61
OD
E7
FA

00
00
07
DF

INITZ

XOR
LD
LD
LD
JP

A
(FLAG) , A
HL,DRIVER
(07E7H),HL
ODFFAH

; CLEAR FLAG
;WP VECTOR
;GO WARM START

,·

THE FOLLOWING DRIVER NOW SUBSTITUTES FOR THE REGULAR WORD
PROCESSOR PRINTER ROUTINE.
WHEN THE @ SIGN IS SEEN, A FLAG IS SET TO INDICATE THAT
THE NEXT CHARACTER SHOULD SELECT A SEQUENCE FROM THE TABLE.

OOOD:
OOOE:
OOOF:
0010:
0011:
0014:
0015:
0017:
0018:
001A:
001C:
001F:

,·

F5
C5
E5
4F
3A
B7
20
79
FE
20
32
18

DRIVER

61 00
OA
40
lC
61 00
1A

0022: 32 61 00

0025:
0028:
0029:
002A:
002C:
002D:
002F:
0030:
0031:
0032:
0033:
0034:
0035:

A

NZ,CTRL-$
A,C
040H
NZ,PRINT-$
(FLAG) ,A
EXIT-$

;SAVE REGISTERS
;SAVE CHARACTER
;IS FLAG SET
;JP IF COMMAND
;GET CHARACTER
;TEST @ SIGN
;GO PRINT CHAR
;REMEMBER @
;EXIT

21
7E
B7
28
B9
28
23
23
23
23
23
23
18

62 00

CTRL
LOOP

OB
10

F1

XOR

A

1D

(FLAG) ,A

LD
LD
OR
JR
CP
JR
INC
INC
INC
INC
INC
INC
JR

HL,BASE
A, (HL)
A

Z,METOO-$
C
Z,FOUND-$
HL
HL
HL
HL
HL
HL
LOOP-$

;CLEAR FLAG
;TABLE BASE
;GET LETTER
;TEST 0 END
;NOT IN TABLE
;MATCH CHAR?
;GO SEND SEQ.
;SKIP TO NEXT
; ENTRY IN
; TABLE WHEN
; THERE IS NO
; MATCH.
;SEQ IS 6 LONG

SEND THE CHARACTER TO THE WORD PROCESSOR PRINTER DRIVER.

0037:
0038:
003B:
003C:
003D:
003E:

,

AF
BC
HL
C,A
A, (FLAG)

AN @ SIGN WAS THE PREVIOUS CHARACTER. TAKE THE PRESENT
CHARACTER AND SEARCH THE TABLE FOR A MATCH. IF WE ARRIVE
AT THE BOTTOM OF THE TABLE WITHOUT A MATCH, THEN GO
AHEAD AND PRINT THE CHARACTER. THIS ALLOWS THE @ SIGN
TO BE PRINTED FROM OUR TEXT BY USING TWO @ SIGNS TOGETHER.

0021: AF

,·

PUSH
PUSH
PUSH
LD
LD
OR
JR
LD
CP
JR
LD
JR

79
CD 90 DE
E1
C1
F1
C9

METOO
PRINT
EXIT

LD
CALL
POP
POP
POP
RET

A,C
ODE90H
HL
BC
AF

A SEQUENCE HAS BEEN LOCATED IN THE TABLE.
5 BYTES THAT FOLLOW IN THE TABLE.

005A:
005C:
005E:
0060:

DB FD
CB 47
28 FA
c9

LOOP3

IN
BIT
JR
RET

A,(OFDH)
O,A
Z,LOOP3-$

;GET CHARACTER
;WP SERIAL
;RESTORE REGS
;BACK TO WP
NOW SEND OUT THE
;WAIT FOR UART

------

-~

..

--.

-

,
0061: 00

.'

,

0062:
0063:
0064:
0065:
0066:
0067:
,
0068:

45
1B
26
6B
31
00
00

ESC
CR
LF
BELL
NULL

EQU
EQU
EQU
EQU
EQU

FLAG

DEFB 0

BASE

DEFB
DEFB
DEFB
DEFB
DEFB
DEFB

1BH
ODH
OAH
07H
OOH

'E'
ESC
')

,

'k'

'1'
NULL

DEFB 0

;USEFUL EQUATES

;MATCH LETTER
;ESC SEQUENCE
FIVE
BYTES
; LONG
;FILLER NULL
;0 MATCH ENDS
;TABLE.

OTHER SEQUENCES FOR YOUR SERIAL PRINTER WOULD CONTINUE AT
ADDRESS 0068H. JUST BE SURE TO MARK THE END OF THE TABLE WITH
A 0 BYTE IN THE POSITION WHERE A MATCH LETTER WOULD GO. ALSO,
PAD A SEQUENCE WITH 'NULL' FILLER CHARACTERS IF IT IS LESS THAN
FIVE BYTES IN LENGTH AS IN THE ABOVE EXAMPLE.
EXAMPLE TEXT:

..

.

@E ENTER EXPANDED MODE.
@C ENTER COMPRESSED MODE.
@N RETURN TO NORMAL SIZED PRINT .

THE @E, @N, AND @C DO NOT PRINT WHEN THE FEATURE IS ACCESSED.
THEY ARE SHOWN IN THE EXAMPLE TEXT AS IT WOULD APPEAR ON THE
VIDEO DISPLAY .

.

16.03 CORRECTION

,

AN @ SIGN WAS lHE PREVIOUS CHARAC1ER. TAKE THE PRESENT
CHARACTER AND SEARCH THE TABLE FOR A MATCH.
IF WE ARRIVE
AT THE BOTTOM OF THE TABLE WITHOUT A MATCH~ THEN GO
AHEAD AND PRINT THE CHARACTER. THIS ALLOWS THE @ SIGN
TO BE PRINTED FROM OUR TEXT BY USING TWO @ SIGNS TOGETHER.

~

\

0021:
0022:
0025:
0028:
0029:
002A:
002C:
002D:
002F:
0030:
0031:
0()32:
0033:
0034:
00:35:

,
,

AF
32 61 00
21 62 00
7E
B7
28 OB
F.{9
28
23
23
23

CTRL
I...OClP

XOR
LD
L.D
LD

JR

A
(FLAG) ; A
HL,BASE
A, ('·il...)
A
Z > METClO-"~;

CP

C

01<

JR
INC
INC
INC
INC
INC
INC
JR

;~3

23
;~3

18 F1

BASE
LETTEH
}TEST 0 END
~NClT IN TABLE
~MATCH CHAR?
i GO SEND SE(~ ,
TO NEXT
.,i SlOP
ENTRY IN
,, TABLE WHEN
THERE IS NCl
•
i MATCH.
iSLQ I C" (:) LONG
~TABLE

~GET

Z, FOUND--~;

HL.

HL
Ht.

HI...

HL
HI...

.;:)

LD()P ._$

SEND THE CHARACTER TO THE WORD PROCESSOR PRINTER DRIVER.

0037:
0038:
003B:
003C:
003D:
003E:

79
CD 90 DE
£1
C1
F1
C9

METOCl
PRINT
EXIT

LD
CALI...
PClP
POP
PDP
RET

A,C
(1)[90H
HL

i
i

AF

iRESTORE REGS
i BACI( TO !.LJP

Be

A SEQUENCE HAS BEEN LOCATED IN THE TABLE,
S BYTES THAT FClLLOW IN THE TABLE,
003F:
o04j. :
0042:
0()43:
0046:
0047:
0049:

,

FLAG

~CLEAR

06
23
7E
CD
23
10
18

OS

FOUND
I...OOP2

4B 00
F9

FO

LD
INC
tD
CALL
INC
DJNZ
JR

GET CHAI~ACTEF-~
WP ~:)ER I i~L..

NOW SEND OUT THE

B,OOSH

~ ~3END

5 BYTEr:)
BYTE

lit..

;FII~ST

A> OiL)
f:lER IAL
HL

;SERIAL OUT
~NEXT BYTE

LOOP;:'~-!~

> L.C)OP

EX 11 --!I;

i

DONE

l'Hr~lJ

~:)

NmJ

A SERIAL PRINTER ROUTINE FOR 1200 BAUD OR 300 BAUD,
THIS RClU1INE IS USED TO SEND OUT THE SEQUENCE SO THAT
THE WORD PRClCESSClR CANNClT HAVE CONTROL UNTIL WE ARE THROUGH,

.>

004B:
004C:
004F:
0051:
0053:
0056:
0057:
O()SA:
OO~lC :
OOSE:
0060:

SERIAL

FS

FD
F6
D3
FD
F1
CD
DB
CB
28
C9

7E 3D

80
FE
77 45
12 EO
FD
47
FA

LOOP3

PUSH
LD
OR
ClUT
tD

AF

POP

AF
L.E012
A.(OFDH)
O,A
Z > LOOP3-··$

CALL
IN
BIT
JR
RET

P" (IY+03DH)

0801-1
(OFEH).A
(IY+04~;H)

,A

;BAUD RATE
i RS;~32 DN
iTAPE STATUS
~SERIAL OUT
iWPIIl FOR UART

\

i
\
\

J
I

j

CHAPTER 17

---

DEVELOPMENT PAC

17.01 PAUSE DEVELOPMENT PAC LISTINGS
0000:
0003:
0005:
0006:
0009:
OOOB:
OOOC:

CD
20
7A
CD
FE
CO
C3

15 CO
FB
1B EO
OA
1B EO

ENTRY CALL
JR
LD
CALL
CP
RET
JP

QUICKCHECK
NZ,ENTRY-$
A,D
VIDEO
LINEFEED
NZ
VIDEO

UNDER DDTBO, CHANGE THE :SO AND :CO VECTORS TO 0000 HEX.
NOW, HOLDING DOWN THE RUN/STOP KEY WILL PAUSE A LISTING.
===============================================================

17.02 MEMORY PARTITIONS FOR 32K CONFIGURATION.
#1 - I/O AND STACK

7DOO - 7FFF

#2 - PROGRAM SOURCE, 'B' BUFFER

3E80 - 7CFF

#3 - ASSEMBLED CODE, 'A' BUFFER

1F40 - 3E7F

#4 - USER LOAD AREA

013A - 1F3F

#5 - ASSEMBLER'S RAM SPACE

0100 - 0139

#6 - USER LOAD AREA

0000 - DOFF

===============================================================

17.03 I/O VECTOR ASSIGNMENTS:
VECTOR

EDITOR

ASSEMBLER

CASSETTE

:CI
:CO

:SK
:SV

:SK
:SV

:SK
:SV

CHANNEL

:OI
:00

:AO
:AI

:AO
:AI

:I1
:01

ASSEMBLER

:SI
:SO

:BI
:SV

:BO
:SV

:I1
:01

SOURCE

17.04 SAMPLE COMMANDS
.M :SI
:SI :BI

:BO

;CHANGE FROM EDITOR TO ASSEMBLER
;CHANGE BACK TO :BI FOR EDITOR

.E E003
.E :AS

;EXIT TO MONITOR
;EXIT TO ASSEMBLER

.E :ED
.E :ER

;ENTER EDITOR TO START NEW FILE
;REENTER EDITOR TO MODIFY A FILE

.L 0,200

;CALL LOADER WITH 0 OFFSET TO ORG
;BUILD SYMBOL TABLE AT 200H

LABEL-$

;RELATIVE ADDRESSING USES -$
;LABELS DO NOT HAVE A
I: I

CHAPTER 18

---

PLOTTING

18.01 BEAUTIFUL BIRTHDAY PLOTS
THE PROGRAM LISTING USES AN HP7225A PLOTTER WHICH IS VERY
INTELLIGENT. HOWEVER, YOU CAN SUBSTITUTE EQUIVALENT PLOTTER
CONTROL COMMANDS FOR YOUR PLOTTER
•

•

100
110
120
130
140
150
160
1.70
180
190
200
210
220
230
240
250
260
270
280
290
300
310
320
330
340
350
360
370
380
390
400
410
420
430
440
450
460
470
480
490
500
510
520
530
540

REM

BIRTHDAY PLOTS

CLEAR 150:DIM R(18,18)
REM
REM

POKE AN RS232 DRIVER IN MEMORY AND USE IT TO SEND
PLOTTER CONTROL SEQUENCES VIA PRINT STRINGS.

· J=O TO 14:READ I:POKE J,I:NEXT J
FOR
DATA 245,245,62,128,211,254,241,205,18
DATA 224,205,27,224,241,201
·

INPUT "NAME"; N$
INPUT "RANDOM NUMBER";A:J=RND(-A*2-1)
REM
REM

·

FIND MONITOR WORK AREA AND CHANGE OUTPUT VECTOR
TO POINT TO THE RS232 DRIVER ROUTINE.

M=256*PEEK(-4095)+PEEK(-4096)-65536
POKE M-47,0:POKE M-46,0
REM
REM

TURN PLOTTER ON, INITIALIZE IT, AND IDENTIFY
THE PHYSICAL AREA OF THE PLOTTING WINDOW.

PRINT CHR$(27)+".(IN;"
PRINT "IPI328,1000,9328,6769;"
PRINT SI . 3, .4;
REM SIZE LETTERING WIDTH AND HEIGHT
II

REM

II

:

THIS LOOP SELECTS RANDOM POINTS TO CREATE THE PLOT

B=RND(I)*.1 + .02
C=INT(RND(1)*10)+7
E=0:D=0:G=1000:F=1000
FOR H=lTOC
R(H,l)=RND(l)*lOOO
IF R(H,l)<=D THEN 460
D=R(H,I)
IF R(H,I»=F THEN 480
F=R(H,I)
R(H,2)=RND(1)*1000
IF R(H,2)<=E THEN 510
E=R(H,2)
IF R(H,2»=G THEN 530
G=R(H,2)
NEXT H

550
560
570
580
590
600
610
620
630
640
650
660
670
680
690
700
710
720
730
740
750
760
770
780
790
800
810
820
830
840
850

REM NOW MAP THE LOGICAL WINDOW TO THE PLOTTING SURFACE
.
PRINT ISC";F;D;G-.1*(E-G);E;II;1I
REM PLOT THE BIRTHDAY PLOT
.
PRINT IPAI;R(1,1);R(1,2);";PD;"
FOR H=lT050
R(C+1,1)~R(1,1)

R(C+1,2)=R(1,2)
FOR I=1TOC+1
PRINT IPAI;INT(R(I,l»;INT(R(I,2»;I;"
IF I>C THEN 700
R(I,1)=B*(R(I+1,1)-R(I,1»+R(I,1)
R(I,2)=B*(R(I+1,2)-R(I,2»+R(I,2)
NEXT I
NEXT H
REM LABEL THE PLOT WITH THE NAME TEXT
:
PRINT "PU;PAI;(D-F)*.5;G-.1*(E-G)I;"
A$=MID$(STR$(A),2)+"
II+N$
R=LEN(A$)/2
PRINT ICPI;R;-1;";1I
PRINT "LB#";A$;CHR$(3)
REM

TURN PLOTTER OFF, AND RESTORE VECTOR TO >SE O=V

PRINT "IN;II;CHR$(27)+II.)1I
POKE M-47,27:POKE M-46,224
END

SUMMARY OF 7225A PLOTTER CONTROLS USED IN THE EXAMPLE:
IPx1,y1,x2,y2
SCx1,y1,x2,y2
PAx,y
PU
PD
CPx,y
LB
SIx,y

-

WINDOW CORNER POINTS ON PLOTTER SURFACE
SCALE LOGICAL CORNER POINTS TO PHYSICAL WINDOW
MOVE PEN TO ABSOLUTE LOGICAL POINT OF (x,y)
PEN UP
PEN DOWN
MOVE RELATIVE x CHARACTER WIDTHS, Y HEIGHTS
LETTER TEXT STRING WHICH FOLLOWS
LETTER WIDTH x, HEIGHT Y IN CENTIMETERS

18.02 3-D FUNCTION PLOTS USING SHADED PRINT DENSITY

It

100 REM
PATTERNS
110 .
120 REM PUT FUNCTION TO BE GRAPHED IN FNZ()= ON LINE 140
130 .
140 DEF FNZ(X)=COS(X)*COS(Y)
:REM SAMPLE 3-D FUNCTION
150 .
160 L=18:GOSUB 5000
170 INPUT "DOMAIN OF X-AXIS ";X1,X2 :REM TRY -7,7
180 U=(X2-X1)/64
190 INPUT "DOMAIN OF Y-AXIS ";Y1,Y2 :REM TRY -7,7
200 W=-(Y1-Y2)/30
210 INPUT "RANGE OF FUNCTION"; R1, R2 : REM TRY -1. 01,1. 01
220 L=L/(R2-R1):PRINT CHR$(12):Y=Y1
230 FOR J=l TO 30:X=X1:FOR I=l TO 64
240 P=INT(L*(FNZ(X)-R1»+192 : POKE -4033+I+J*64,P
250 X=X+U : NEXT I : Y=Y+W : NEXT J
260 GOTO 260 : REM ENDLESS LOOP SO DISPLAY IS NOT RUINED
270 END
5000 REM --DEFINE GRAPHIC SYMBOLS
5010 FOR I=l TO L*8: READ A: POKE -513+I,A: NEXT I: RETURN
6000 DATA 0,0,0,0,0,0,0,0
6010 DATA 0,0,32,0,0,0,2,0
6020 DATA 0,32,0,4,64,0,8,0
6030 DATA 4,64,16,1,8,128,2,32
6040 DATA 65,16,20,33,132,16,66,8
6050 DATA 146,32,9,128,17,138,16,69
6060 DATA 145,74,17,68,137,18,132,82
6070 DATA 41,138,98,41,146,41,196,41
6080 DATA 85,74,101,146,73,178,74,149
6090 DATA 85,42,83,186,86,170,165,102
6100 DATA 85,229,85,174,85,202,85,171
6110 DATA 93,234,87,186,213,174,117,171
6120 DATA 109,222,245,107,218,183,247,251
6130 DATA 237,119,221,119,237,190,111,219
6140 DATA 190,238,251,222,123,238,190,247
6150 DATA 251,191,238,254,247,127,253,223
6160 DATA 255,223,255,254,255,191,255,251
6170 DATA 255,255,255,255,255,255,255,255

----------

-------~-

CHAPTER 19

--

T ABLES AND FORMS

19.01 BASIC'S TOKENS
HEX -8O
1
2

3

4
5

6

7
8
9
A
B
C
D
E
F

END
FOR
NEXT
DATA
BYE
INPUT
DIM
READ
LET
GOTO
RUN
IF
RESTORE
GOSUB
RETURN
REM

EXAMPLE:

-9-

-A-

-B-

-c-

STOP
OUT
ON
NULL
WAIT
DEF
POKE
PRINT
CaNT
LIST
CLEAR
CLOAD
CSAVE
NEW
TAB
TO

FN
SPC
THEN
NOT
STEP

INT
ABS
USR
FRE
INP
pas
SQR
RND
LOG
EXP
CO'S
SIN
TAN
ATN
PEEK
LEN

STR$
VAL
ASC
CHR$
LEFT$
RIGHT$
MID$

8F - REM

+

*
/
A

AND
OR
>
=

<

SGN
BE - PEEK

c6 - MID$

===============================================================

19.02 HEXADECIMAL - BINARY CONVERSION TABLE

o - 0000
1 - 0001
2 - 0010
3 - 0011
4 - 0100
5 - 0101
6 - 0110
7 - 0111

8
9
A
B
C

-

1000
1001
1010
1011
1100
D - 1101
E - 1110
F - 1111

---------------------------------------------------------------

19.03 POWERS OF 2 TABLE:
0-1

1 2 -

3 4 5 -

2

4
8

16
32
6 - 64
7 - 128
8 - 256

2

A

N
9
10
11
12
13
14
15
16
17

512
- 1024
- 2048
- 4096
- 8192
- 16384
- 32768
- 65536
-131072

19.04 DECIMAL - HEXADECIMAL CONVERSION TABLE

0
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47

-

00
01
02
03
04
05
06
07
08
09
OA
OB
OC
OD
OE
OF
10
11
12
13
14
15
16
17
18
19
1A
1B
1C
1D
1E
1F
20
21
22
23
24
25
26
27
28
29
2A
2B
2C
2D
2E
2F

48
49
50
51
52
53
54
55
56
57
5B
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95

-

30
31
32
33
34
35
36
37
38
39
3A
3B
3C
3D
3E
3F
40
41
42
43
44
45
46
47
48
49
4A
4B
4c
4D
4E
4F
50
51
52
53
54
55
56
57
58
59
5A
5B
5C
5D
5E
5F

96
97
98
99
100
101
102
103
104
105
106
107
loB
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143

-

60
61
62
63
64
65
66
67
68
69
6A
6B
6C
6D
6E
6F
70
71
72
73
74
75
76
77
78
79
7A
7B
7C
7D
7E
7F
80
81
82
83
84
85
86
87
88
89
8A
8B
8c
8D
8E
8F

144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191

-

90
91
92
93
94
95
96
97
98
99
9A
9B
9C
9D
9E
9F
AO
A1
A2
A3
A4
A5
A6
A7
A8
A9
AA
AB
AC
AD
AE
AF
BO
B1
B2
B3
B4
B5
B6
B7
B8
B9
BA
BB
BC
BD
BE
BF

192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239

-

co
240 - FO
Cl
241 - Fl
C2
242 - F2
C3
243 - F3
c4
244 - F4
C5
245 - F5
c6 . 246 - F6
C7
247 - F7
·248 - FB
C8
cg
249 - F9
CA
250 - FA
CB
251 - FB
CC
252 - FC
CD
253 - FD
CE
254 - FE
CF
255 - FF
DO
Dl
D2
D3
D4
D5
D6
D7
D8
D9
DA
DB
DC
DD
DE
DF
EO
E1
E2
E3
E4
E5
E6
E7
E8
E9
EA
EB
EC
ED
EE
EF

19.05 CONTROL CODES AND THEIR FUNCTIONS
HEX

DEC

CONTROL
-------

00
01
02
03
04
05
06
07
08
09
OA
OB
OC
OD
OE
OF
10
11
12
13
14
15
16
17
18
19
1A
1B
1C
1D
IE
IF

0
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31

@

A
B
C
D

E
F
G

H
T
..L

J

K
L

N
0

P
Q

R
S
T

U
V

w
X

Y
Z
[

\

]

A

SYMBOL
-----NULL
SOH
STX
ETX
EOT
ENQ
ACK
BELL
BS
HT
LF
VT
FF
CR
SO
SI
DLE
DC1
DC2
DC3
Dc4
NAK
SYN
ETB
CAN
EM
SUB
ESC
FS
GS
RS
US

FUNCTION

----------CURSOR LEFT

RUB OUT
LINE FEED
CLEAR SCREEN
RETURN
STOP INPUT
HOME
CURSOR RIGHT

CURSOR UP
CURSOR DOWN
ESCAPE

FUNCTIONS ACCESSED USING CHR$() .
EXAMPLE:

100 PRINT CHR$(12);:REM CLEARS SCREEN

19.06 GRAPHIC CHARACTER DESIGNER'S FORM
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000

00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000

00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000

00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000

00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000

00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000

00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000

00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000

00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000

00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000

00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000

00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000

00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000

00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000

00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000

00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000

19.07 MACHINE LANGUAGE CODING FORM
ROUTINE NAME:

PAGE

DESCRIPTION:

DATE

ADDRESS

OBJECT CODE

LABEL

INSTRUCTION

REMARKS

OF

19.08 SERIAL INTERFACE PINOUTS
PIN#
1
2
3
4
5
6
7
8
9
10
11
12
13

SIGNAL
SHIELD 1
RS232 OUT
RS232 IN
GROUND
AUX 1
GROUND
GROUND
GROUND
+12 VOLTS
UNUSED
RS232 IN
MOTOR #1+
MOTOR #2+

PIN#
14
15
16
17
18
19
20
21
22
23
24
25

SIGNAL
SHIELD 2
MIC 1
MIC 2
GROUND
AUX 2
GROUND
EAR 1
EAR 2
UNUSED
RS232 OUT
MOTOR #1MOTOR #2-

===============================================================

19.09 PARALLEL INTERFACE PINOUTS
PIN#
1
2
3
4
5
6
7
8
9
10
11
12
13

SIGNAL
GROUND
OUTPUT DATA ACCEPTED
OUTPUT DATA AVAILABLE
OUTPUT BIT 7
OUTPUT BIT 6
OUTPUT BIT 5
OUTPUT BIT 4
GROUND
INPUT DATA AVAILABLE
INPUT BIT 0
INPUT BIT 2
INPUT BIT 4
INPUT BIT 6

PIN#
14
15
16
17
18
19
20
21
22
23
24
25

SIGNAL
UNUSED
+5 VOLTS
OUTPUT BIT 0
OUTPUT BIT 1
OUTPUT BIT 2
OUTPUT BIT 3
+5 VOLTS
INPUT DATA ACCEPTED
INPUT BIT 1
INPUT BIT 3
INPUT BIT 5
INPUT BIT 7

19.10 DATA PORT ASSIGNMENTS
PORT
OFCH

BIT

INPUT FUNCTION

OUTPUT FUNCTION

0
1

252

2
3

4
5
6
7

OFDH

0
1

253

2
3
4
5
6

7

OFEH

0
1

254

2
3
4

5

6
7

OFFH

SERIAL
INPUT
DATA
BYTE

SERIAL
OUTPUT
DATA
BYTE

SERIAL OUT BUFFER EMPTY
SERIAL DATA AVAILABLE
OVER-RUN
FRAMING ERROR
PARITY ERROR
UNUSED
UNUSED
UNUSED

BITS PER CHARACTER NB1
BITS PER CHARACTER NB2
NUMBER OF STOP BITS
PARITY SELECT
NO PARITY
UNUSED
UNUSED
UNUSED

I
I KEYBOARD
I DATA
I BYTE (5 BITS)
I
HORIZONTAL SYNC PULSE
PARALLEL OUTPUT READ
PARALLEL INPUT AVAILABLE

I
I KEYBOARD
I SCAN COLUMN
I
MOTOR #1 CONTROL
MOTOR #2 CONTROL
BAUD RATE SELECT
O=CASSETTE 1=RS232

0
1

255

2

3
4
5
6
7

PARALLEL
INPUT
DATA
BYTE

PARALLEL
OUTPUT
DATA
BYTE

19.11 ASCII CHARACTER SET
LSB
0
1
2
3
4
5
6
7
8
9
A
B
C
D
-E
F
LSB
0
1
2
3
4
5
6
7
8

MSB

MSB

9

A
B
C
D
E
F
KEY:

0
----NUL
SOH
STX
ETX
EaT
ENG
ACK
BELL
BS
HT
LF
VT
FF
CR
SO
SI
8
-----

GR
GR
GR
GR
GR
GR
GR
GR
GR
GR
GR
GR
GR
GR
GR
GR

1
2
3
4
5
6
7
8
9
0

1
-----

DLE
DCl
DC2
DC3
DC4
NAK
SYN
ETB
CAN
EM
SUB
ESC
FS
GS
RS
VS

A

!
II

#

$
%

AMP
I

(
)

*
+

3

.

/

A

9

-----

0
1
2
3
4
5
6
7
8
9

A
B
C
D
E
F
G
H
I

E
R
T
Y
U
I
a
P
[
]
A
S
D
F
G
H

@

;

=
>
?

K
L
M
N
a

-----

Q

a

R
S
T

b
c
d

P
q
r

U

e

V
W

g

v
w
x

h
i
j
k
1
m
n

]

A

UNDER
D

y

z
{

I

}

RUB

0

E

-----

GS
GS
GS
GS
GS
GS
GS
GS
GS
GS
GS
GS
GS
GS
GS
GS

s
t
u

f

\

A

7

-----

[

C
----GS 1
GS 2
GS 3
GS 4
GS 5
GS 6
GS 7
GS 8
GS 9
GS 0
GS
GS GS
GS TAB
GS Q
GS W

6

5
----P

X
Y
Z

J

B
----GR /
GR K GR KGR L
GR K7
GR ;
GR K8
GR @ GR K9
GR K/
GR \
GR RUB GR K4
GR Z
GR K6
GR X GR K*
GR C GR Kl
GR V GR K2
GR B GR K3
GR N GR K+
GR M GR KO
GR ,
GR K.
GR .
GR K=
----GR J

4

-----

<

-----

GR
GR
GR
GR
GR
GR
GR
GR
GR
GR
GR
GR
GR
TAB GR
Q
GR
W GR

2
----SPACE

E
R
T
Y
U
I
a
P
[
]
A
S
D
F
G
H

F

----GS J

GS
GS
GS
GS
GS
GS
GS
GS
GS
GS
GS
GS
GS
GS
GS

-----

GS
GS
GS
GS
;
@
GS
GS
\
RUB GS
GS
Z
X GS
C GS
V GS
B GS
N GS
M GS
,
GS
. GS
K
L

/
KK7
K8
K9
K/
K4
K6
K*
Kl
K2
K3
K+
KO

K.

K=

GR = GRAPHIC
GS = GRAPHIC AND SHIFT
Kl = KEYPAD 1
MSB= MOST SIGNIFICANT BYTE
LSB= LEAST SIGNIFICANT BYTE

EXAMPLE:

GRAPHIC SHIFT TAB = CD HEX (205 DECIMAL)

19.12 KEYBOARD STRUCTURE: OUT (OFEH),nn AND IN A,(OFEH)
THE KEY IS DEPRESSED WHEN THE BIT IS A LOGICAL LOW.
OUT

BIT 0

nn

o
1
2

3

4
5
6
7

8

9
10
11

12
13
14
15

BIT 1

BIT 2

STOP
CLEAR

GRAPHIC
REPEAT

CTRL
SPACE

X
C
F

Z
D

A
S

R

B

V
N
I
L

M
K

,
/
\
UNDERLINE
KEYPAD +
KEYPAD 0
KEYPAD
NOT USED

@

RETURN
KEYPAD *
KEYPAD 1
KEYPAD 2
NOT USED

BIT 3

BIT 4

SHFTLOCK
SKIP

SHIFT
ESC

Q

1
2

E

vi
4

G

T

H
J

o

Y
U
9

5

,

P

]
LINEFEED
KEYPAD /
KEYPAD 4
KEYPAD 5
NOT USED

3
6

7

8

o

[
A

KEYPAD
KEYPAD
KEYPAD
KEYPAD

8
6

NOT USED
KEYPAD 7
KEYPAD 9
= KEYPAD 3

===============================================================

19.13 GRAPHIC CHARACTER STARTING ADDRESSES
ASC

KEY

128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143

GR
GR
GR
GR
GR
GR
GR
GR
GR
GR
GR
GR
GR
GR
GR
GR

HEX
1
2
3
4
5
6
7
8
9
0

FCOO
Fc08
FC10
FC18
FC20
FC28
FC30
FC38
FC40
Fc48
FC50
FC58
Fc60
TAB FC68
Q
FC70
W FC78
A

DEC

ASC

KEY

-1024
-1016
-1008
-1000
-992
-984
-976
-968
-960
-952
-944
-936
-928
-920
-912
-904

192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207

GS
GS
GS
GS
GS
GS
GS
GS
GS
GS
GS
GS
GS
GS
GS
GS

HEX
1
2
3
4
5
6
7
8
9
0

FEOO
FE08
FE10
FEl8
FE20
FE28
FE30
FE38
FE40
FE48
FE50
FE58
FE60
TAB FE68
Q
FE70
W FE78
A

DEC
-512
-504
-496
-488
-1~80

-472
-464
-456
-448
-440
-432
-424
-416
-408
-400
-392

KEY:

144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159

GR
GR
GR
GR
GR
GR
GR
GR
GR
GR
GR
GR
GR
GR
GR
GR

E
R
T
Y
U
I
0
P
[
]
A
S
D
F
G
H

FC80
Fc88
FC90
FC98
FCAO
FCA8
FCBO
FCB8
FCCO
Fcc8
FCDO
FCD8
FCEO
FCE8
FCFO
FCF8

-896
-888
-880
-872
-864
-856
-848
-840
-832
-824
-816
-808
-800
-792
-784
-776

208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223

GS
GS
GS
GS
GS
GS
GS
GS
GS
GS
GS
GS
GS
GS
GS
GS

E
R
T
Y
U
I
0
P

FE80
FE88
FE90
FE98
FEAO
FEA8
FEBO
FEB8
FECO
FEC8
FEDO
FED8
FEEO
FEE8
FEFO
FEF8

-384
-376
-368
-360
-352
-344
-336
-328
-320
-312
-304
-296
-288
-280
-272
-264

160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175

GR
GR
GR
GR
GR
GR
GR
GR
GR
GR
GR
GR
GR
GR
GR
GR

FDOO
FD08
L
FD10
FD18
;
@
FD20
FD28
\
RUB FD30
Z FD38
X FD40
C FD48
V FD50
B FD58
N FD60
M FD68
,
FD70
FD78

-768
-760
-752
-744
-736
-728
-720
-712
-704
-696
-688
-680
-672
-664
-656
-648

224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239

GS
GS
GS
GS
GS
GS
GS
GS
GS
GS
GS
GS
GS
GS
GS
GS

FFOO
FF08
FF10
L
,
FF18
@
FF20
FF28
\
RUB FF30
Z FF38
X FF40
C FF48
V FF50
B FF58
N FF60
M FF68
,
FF70
FF78

-252
-244
-236
-228
-220
-212
-204
-196
-188
-180
-172
-168
-160
-152
-144
-136

176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191

GR
GR
GR
GR
GR
GR
GR
GR
GR
GR
GR
GR
GR
GR
GR
GR

/
KK7
K8
K9
K/
K4
K6
K*
K1
K2
K3
K+
KO
K.
K=

FD80
FD88
FD90
FD98
FDAO
FDA8
FDBO
FDB8
FDCO
FDC8
FDDO
FDD8
FDEO
FDE8
FDFO
FDF8

-640
-632
-624
-616
-608
-600
-592
-584
-576
-568
-560
-552
-544
-536
-528
-520

2JW
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255

GS
GS
GS
GS
GS
GS
GS
GS
GS
GS
GS
GS
GS
GS
GS
GS

KK7
K8
K9
K/
K4
K6
K*
K1
K2
K3
K+
KO
K.
K=

FF80
FP88
FF90
FF98
FFAO
FFA8
FFBO
FFB8
FFCO
FFC8
FFDO
FFD8
FFEO
FFE8
FFFO
FFF8

-128
-120
-112
-104
-96
-88
-80
-72
-64
-56
-48
-40
-32
-24
-16
-8

J

K

GR = GRAPHIC

[
]

A
S
D
F
G
H

GS = GRAPHIC AND SHIFT

J

K

/

K1 = KEYPAD 1

19.14 ONE-STROKE BASIC COMMANDS
ASC

KEYS

COMMAND

-----

-------

128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143

GR
GR
GR
GR
GR
GR
GR
GR
GR
GR
GR
GR
GR
GR
GR
GR

END
FOR
NEXT
DATA
BYE 0
INPUT
DIM
READ
LET
GOTO
RUN
IF
A
RESTORE
TAB GOSUB
Q RETURN
W REM

144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159

GR
GR
GR
GR
GR
GR
GR
GR
GR
GR
GR
GR
GR
GR
GR
GR

E
R
T
Y
U
I
0
P
(
]
A
S
D
F
G
H

160
161
162
163
164
165
166
167
168
169
170
171
172
173
17 1l
175

GR
GR
GR
GR
GR
GR
GR
GR
GR
GR
GR
GR
GR
GR
GR
GR

FN
SPC(
THEN
NOT
@ STEP
+
\
RUB Z
X
/
"C
V AND
B OR
N
>
M =
,
<
.
SGN

KEY:

1
2
3
4
5
6
7
8
9
0

ASC

KEYS

192
193
194
195
196
197
198

GS
GS
GS
GS
GS
GS
GS

1
2
3
4
5
6
7

COMMAND
------STR$
VAL
ASC
CHR$
LEFT$
RIGHT$
MID$

176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191

GR
GR
GR
GR
GR
GR
GR
GR
GR
GR
GR
GR
GR
GR
GR
GR

/
KK7
K8
K9
K/
Kl,J
K6
K*
Kl
K2
K3
K+
KO
K.
K=

INT.
ABS
USR
FRE
INP
POS
SQR
RND
LOG
EXP
COS
SIN
TAN
ATN
PEEK
LEN

-----

STOP
OUT
ON
NULL
WAIT
DEF
POKE
PRINT
CONT
LIST
CLEAR
CLOAD
CSAVE
NEW
TAB(
TO

J

K
L
;

GR = GRAPHIC KEY

GS = GRAPHIC AND SHIFT KEYS

•

ARRINGTON SOFTWARE SERVICE
9522 Linstock, Boise, Idaho 83704 U.S.A.

~G~ ~

HOW TO ORDER:
ASTRO ATTACKER

$21.95

is similar to the arcade game called "ASTRO BLASTER".
This action game for the Sorcerer is far superior to all
other Sorcerer games because of its high resolution
graphics, sound, variety and playability. Astro Attacker
graphics are extremely advanced. The display is of the
console inside your astro fighter craft. In your console
window you see the enemy ships placed against a
background of continuously moving stars. Gauges also
indicate the amount of fuel remaining and the
temperature of your lazer cannons. If you fire too frequently you can overheat the lazers, or if you move
recklessly you may run out of fuel. Your challenge is to
survive and destroy the Spinners, the Lazer Ships, the
Rockets, the Flame Throwers, and the Meteor shower.
Docking with the mother ship is crucial to survival as
this restores your shield strength and fuel, and cools
your lazer cannon. With each succeeding level of play,
survival becomes more difficult as the enemy ships attack with greater frequency and quickness. Superb
sound too.

ALL

L-

PRICES ARE IN

U.S.

DOLLARS

PRODUCT

PRICE

i

i
I
I

I

I OVERSEAS POSTAGE: ADD $3
. NO POSTAGE CHARGE IN USA & CANADA
i

VIS4

,'• •

TOTAL

ENCLOSE:
(A) A CHECK IN U.S. DOLLARS DRAWN ON A U.S.
BANK, MONEY ORDER OR CASH FOR THE ABOVE
AMOUNT, OR
(B) CREDIT CARD, EXPIRATION DATE

...j

~+tlJ ~,..~ "
ot~ oG~

c:I ~,.."

c,'"

<:>e<:>

o~e":;

1>-C>
\.'(\e

o,Y.l-e

0"- e",e

~e(,

\.0

,,:;e~o ~0\}'I.

\e1>-,,:;e

~'(\o

,-\e'

~ ~e~":; ,,~o~
0'<:.

(,1>-

-.:s-''':;

NUMBER: ............. , ............... , .......
My name and address:

ASTRO

ATTACKER

NAME ........................................

v
q;j.;'':;;
, III

00

i f'~
c'

SCORE: 08753

STREET: ......... ' ............................
CITY/STATE ...................................

~iJv

I

POSTCODE ............. COUNTRY: .............

'I

+
HIGH: 0875.::3

I

PlEASE DESCRIBE YOUR COMPUTER CONFIGURATI

....

HIGH QUALITY
SOFTWARE AT A
LOW PRICE

MAIL YOUR ORDER TO:
Please let us know if you should not be
receiving this catalog so we can remove your
name from our mailing list

- - -----_._--

ENSIGN SOFTWARE
2312 N. COLE RD., SUITE E
BOISE, IDAHO 83704 U.S.A.
PHONE: (208) 378-8086

LIMITED WARRANTY
SOFTWARE IS PROVIDED "AS IS" WITHOUT WARRANTY
OF ANY KIND. IN NO EVENT WILL ENSIGN SOFTWARE BE
LIABLE TO YOU FOR ANY DAMAGES, INCLUDING ANY
LOST PROFITS, LOST SAVINGS OR OTHER INCIDENTAL OR
CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR
INABILITY TO USE ANY OF OUR PRODUCTS.
YOU ASSUME RESPONSIBILITY FOR THE SELECTION OF
THE PRODUCTS TO ACHIEVE YOUR INTENDED RESULTS,
AND FORTHE INSTALLATION, REPAIR, USE AND RESULTS
OBTAINED FROM THE PRODUCTS.

AUTHORS: We seek excellent programs to
market worldwide. Our royalties are generous,
and our interest in having satisfied customers
is keen. We invite you to join with us and our
distributors to bring your product into the
marketplace. Submit programs for evaluation
along with documentation and your phone
number.

ENSIGN SOFTWARE
2312 N. Cole Rd., Suite E,

Boise, Idaho 83704 U.S.A.



Source Exif Data:
File Type                       : PDF
File Type Extension             : pdf
MIME Type                       : application/pdf
PDF Version                     : 1.3
Linearized                      : No
XMP Toolkit                     : Adobe XMP Core 4.2.1-c041 52.342996, 2008/05/07-21:37:19
Create Date                     : 2018:08:21 07:57:35-08:00
Modify Date                     : 2018:08:21 08:19:22-07:00
Metadata Date                   : 2018:08:21 08:19:22-07:00
Producer                        : Adobe Acrobat 9.0 Paper Capture Plug-in
Format                          : application/pdf
Document ID                     : uuid:70e5553e-a6ac-0d4f-94eb-843847a22ca4
Instance ID                     : uuid:0c72944b-285c-c446-b98e-29c3ebbb7579
Page Layout                     : SinglePage
Page Mode                       : UseNone
Page Count                      : 128
EXIF Metadata provided by EXIF.tools

Navigation menu