Acorn System 1 - MAME · chapter 1: an introduction to the binary number system 1.1 binary numbers...
Transcript of Acorn System 1 - MAME · chapter 1: an introduction to the binary number system 1.1 binary numbers...
User's manual
Q l I T C D Acorn Computor Limited, 4a Market Hill, Cambridge,r U I C K CB2 3MJ, Telephone (0223) 312772
CONTENTSPART1CHAPTER 1: AN INTRODUCTION TO THE BINARY NUMBER SYSTEM1.1 BINARY NUMBERS1.2 LOGICAL MANIPULATIONS1.3 ARITHMETIC MANIPULATIONS1.4 BINARY CODED DECIMAL (BCD) ARITHMETICCHAPTER 2: WELCOME TO THE MACHINE2.1 HOW THE ACORN MICROPROCESSOR WORKS2.2 THE MONITOR COMMANDS M, t , I .2.3 AT LAST, A PROGRAM,
2.3.1 ASSEMBLY LANGUAGE, MACHINE LANGUAGE, THE INSTRUCTIONSLOAD, STORE andJUMP
2.3.2 ENTERING A PROGRAM, THE GO COMMAND2.3.3 INSTRUCTIONS JMP,JSR2.3.4 LOGIC INSTRUCTIONS ORA AND EOR.2.3.5 ARITHMETIC OPERATIONS: ADC, SEC, CLC
CHAPTER 3: INSIDE THE 65023.1 THE ACCUMULATOR, PROGRAM COUNTER, STATUS REGISTER3.2 THE STACK POINTER,3.3 THE INTERNAL REGISTERS X & Y3.4 MAKING OUR PROGRAM 'FRIENDLY'CHAPTER 4: THE REMAINDER OF THE INSTRUCTION SET4.1 BRANCHES4.2 INDEXING4.3 INDIRECTION4.4 R E A D - M O D I F Y - W R I T E INSTRUCTIONS4.5 MISCELLANEOUS REMAINING INSTRUCTIONSCHAPTER 5: ACORN HARDWARE5.1 CHIP LAYOUT AND BUS5.2 RESET, INTERRUPT REQUEST AND NON-MASKABLE INTERRUPT5.3 6502 INTERNAL ARCHITECTURE5.4 PROMS, EPROMS, RAM, RAM I/O5.5 THE KEYBOARD AND TAPE INTERFACE5.6 POWER SUPPLYCHAPTER 6: FIRMWARE6.1 THE TAPE STORE AND LOAD6.2 THE BREAKPOINT AND RESTORE COMMAND6.3 THE SINGLE STEPPING FACILITY6.4 THE MONITOR LISTINGPART 2APPLICATION PROGRAMS
APPENDICESAPPENDIX A: 64 CHARACTER ASCI I ON ACORN'S 7 SEGMENT
DISPLAYAPPENDIX B: INSTRUCTION SETAPPENDIX C: HEXADECIMAL TO DECIMAL CONVERSION TABLEAPPENDIX D: ACORN MONITOR ADDRESS INFORMATION
GLOSSARY
PART1CHAPTER 1: AN INTRODUCTION TO THE BINARY NUMBER SYSTEM1.1 BINARY NUMBERS:NUMBERS IN EVERY DAY USE ARE WRITTEN IN THE DECIMAL SYSTEM, THATIS, TO THE NUMBER BASE 10. A POSITIONAL NOTATION IS USEDREPRESENTING ONE "I00's; TWO "I0's & EIGHT T s AS THE SYMBOL 128. THERIGHTMOST (i.e. LEAST SIGNIFICANT) DIGIT IS IN THE "UNITS" COLUMN, THE2 INTHE 'TENS" COLUMN, THE 1 INTHE "HUNDREDS" COLUMN, AND THEVALUE OF THE SYMBOL '128' IS EVALUATED AS 1x100+2x10 + 8x1 = 128.SIMILARLY '1024' IS EVALUATED AS 1x1000 + 0x100 + 2x10 + 4x1 = 1024, WHICHIS MORE CONVENIENTLY WRITTEN AS 1x103 +0x102 + 2x10* 4x10° = 1024,USING THE MATHEMATICAL SHORTHAND FOR 1000= 10x10x10= 103 ,ANDTHE CONVENTION "ANY NUMBER TO THE POWER ZERO IS 1 " TO GIVE ACONSISTENT METHOD OF EVALUATING SUCH SYMBOLS.SO 1024CAN BE WRITTEN IN COLUMNS
3
1
2
0
1
2
0
4
AND EVALUATED AS 1x103 +0x102 + 2x10* +4x10°TO THE BASE 10.TO THE BASE 8,1024 WOULD MEAN 1x83 + 0x82 + 2x8* +4x8° WHICH IS THEDECIMAL NUMBER 532.TO THE BASE 16,1024 WOULD MEAN 1x163 + 0x162 + 2x161 +4x16° WHICH ISTHE DECIMAL NUMBER 4132.TO DISTINGUISH THE BASE TO WHICH A NUMBER IS WRITTEN WE'LL WRITEITS' BASE AFTER IT AS A SUBSCRIPT: 10241O AND NOW WE CAN WRITE1024* = 5321O|102416 =4132 l 0 |100000002 = 128! oJUST AS BASE TEN HAS THE NAME 'DECIMAL', BASE SIXTEEN HAS THE NAME'HEXADECIMAL', BASE EIGHT HAS THE NAME 'OCTAL' AND BASE TWO'BINARY'. THESE FOUR BASES ARE IN COMMON USE WITH MODERNCOMPUTERS, ESPECIALLY HEXADECIMAL (HEX) AND BINARY. CONVERSIONBETWEEN BINARY, OCTAL & HEX NUMBERS IS VERY SIMPLE. SINCE THEY AREALL POWERS OF TWO, NUMBERS JUST NEED DIVIDING UP:-100000002= 1100011 00001! 6 = 8 0 i 6
= I010||000II000»6 =2008
- EACH HEX DIGIT IS FOUR BINARY DIGITS (BITS) & EACH OCTAL DIGIT IS3 BITS.OCTAL DIGITS ARE 0 , 1 , 2, 3, 4, 5, 6, 7.HEX D I G I T S A R E 0 , 1 , 2 , 3 / 4 , 5 , 6 , 7 , 8 , 9 , A , B , C , D , E / F A....F ARE USEDINSTEAD OF 10....15 TO ALLOW UNRESTRICTED USE OF THE POSITIONALSYSTEM.
PROGRAM COUNTER: 16 BIT REGISTER WHICH CONTAINS THE ADDRESS OFTHE INSTRUCTION BEING EXECUTED. DURING EXECUTION THEPROGRAM COUNTER ISSTEPPEDUPTOPOINTATTHE NEXT INSTRUCTION.
PROM: PROGRAMMABLE READ ONLY MEMORY. THIS TYPE OF MEMORYARRIVES BLANK. IT CAN BE PROGRAMMED BY THE USER WITH THEHELP OF A SPECIAL PROM BLOWER. ONCE THIS PROGRAM HAS BEEN PUTIN, IT CANNOT BE CHANGED.
RAM: RANDOM ACCESS MEMORY. THIS IS THE STANDARD READ/WRITEMEMORY. DATA (AND PROGRAMS) ARE LOST WHEN THE POWER ISSWITCHED OFF.
REGISTER: STORAGE LOCATION IN THE MICROPROCESSOR ITSELF. THEREARE INTERNAL REGISTERS A, X, Y, PC, S, P.
• ROM: READ ONLY MEMORY. THIS IS MEMORY THAT HAS A PROGRAM PUTIN DURING PRODUCTION. THIS PROGRAM CANNOT EVER BE CHANGED,IT CAN ONLY BE READ.
STORE: TRANSFERS DATA FROM AN INTERNAL REGISTER TO MEMORY.XTAL: THE CRYSTAL IN THE ACORN OSCILLIATES AT 1 MHZ. i.e. ONE
MILLION TIMES A SECOND. IT DOES THIS WITH GREAT ACCURACY. SOYOU CAN BUILD A CLOCK FROM YOUR ACORN.
HEX0123456789ABCDEF
1020406480
100
CONVERSIONDECIMAL
0123456789
101112131415163264
100128256
TABLEOCTAL
01234567
10111213141516172040
100144200400
BINARY01
1011
100101110111
10001001101010111100110111101111
10000100000
10000001100100
10000000100000000
THE ACORN MICROPROCESSOR IS DESIGNED TO DEAL WITH 8 BITS AT A TIME.THE COLLECTION OF 8 BITS IS GIVEN THE SPECIAL NAME 'BYTE', AND ISNORMALLY WRITTEN IN HEXADECIMAL OR BINARY. A BYTE THUS IS 0....FF16;0....111111112 OR 0....255io. THE MICROPROCESSOR CAN CARRY OUT LOGICALAND ARITHMETICAL MANIPULATIONS ON BYTES.1.2 LOGICAL MANIPULATIONSTHE MICROPROCESSOR CAN IMMEDIATELY CARRY OUT THE LOGICAL AND,EXCLUSIVE - OR & OR FUNCTIONS ON ALL 8 BITS SIMULTANEOUSLY, USINGTHE FOLLOWING TRUTH TABLES FOR EACH BIT (SYMBOL V )AND ( A ) EXCLUSIVE - OR ( V ) OR ( V )
bi
0011
b2
0101
result0001
bi0011
b2
0101
result0110
bi0011
b2
01 .01
result0111
EXAMPLEOPERANDS00111100 0011110001011010 AND 01011010
(OPERATOR)00011000 RESULT 01100110
E-OR0011110001011010 OR
01111110
1.3 ARITHMETIC MANIPULATIONS
BINARY ADDITIONWITH CARRY OUTPUT
BINARY ADDITION WITH CARRY FROM RIGHT
b,0011
b2
0101
SUM0110
CARRY0001
bi00110011
b2
01010101
INPUT CARRY00001111
SUM01101001
OUTPUT CARRY TO LEFT00010111
EXAMPLE: 00111100 3C16 60iO01011010+ 5A16 + 90io +10010110 9616 150,0
IN ORDER TO MAKE LONGER ADDITIONS EASIER TO PROGRAM,THEMICROPROCESSOR HAS A CARRY BIT (FLAG). AT THE START OF ANADDITION THIS IS TREATED AS THE INPUT CARRY, AND AT THE END ITRECEIVES THE CARRY OUT FROM THE SUM AT BIT 7: ASSUMING WE HAVE ACARRY INPUT:
1100001110100101 CARRY IN
C316
A516
- l i e169,6
195,0165,0_Jio+361,0CARRY OUT QJ 01101001
SUBSTRACTION OPERATES IN A SIMILAR MANNER, EXCEPT THAT THECARRY (OR BORROW) FLAG OPERATES UPSIDE DOWN: A 0 CARRY FLAG ISTREATED AS REPRESENTING A BORROW FROM THE PREVIOUS STAGE:
11111111 FF16 25510
00, 6 000,0
J 010510ioQ] 11111110 1FE16
NOT QUITE THE RESULTS ONE MIGHT HAVE WISHED FOR! (SUPERFICIALLY)THIS OCCURS BECAUSE OF THE HARDWARE IMPLEMENTATION OFSUBTRACTION A SUBTRACTION, (P-Q), IS REGARDED BY THE MICRO-PROCESSOR AS THE EQUIVALENT (P+(-Q)), BECAUSE THERE IS A SIMPLEWAY TO GENERATE THE NEGATIVE OF A NUMBER.THE 'ONES-COMPLEMENT'OF A BINARY NUMBER IS SIMPLY GENERATED BYEXCHANGING '0's & Ts :
T s 000011002 0Cie 12,oCOMPLEMENT 111100112 F316 24310
IF THIS ONE'S-COMPLEMENT IS TO BE THE NEGATIVE OF A NUMBER,WE SHOULD GET 0 ON ADDITION:
GLOSSARY- ACCUMULATOR: 8-BIT CENTRAL REGISTER IN THE MICROPROCESSOR.
MOST INFORMATION HAS TO GO THROUGH IT.- ADDRESS: 16 BIT POINTER TO A MEMORY LOCATION. THE 6502 MICRO-
PROCESSOR CAN ADDRESS 65, 536 SUCH LOCATIONS (WHICH IS216).- ARITHMETIC LOGIC UNIT (A.L.U.): A SECTION OF THE MICROPROCESSOR
WHICH CARRIES OUT ARITHMETIC (ADDITION,SUBTRACTION,INCREMENT, DECREMENT & COMPARE) AND LOGIC ("AND","EOR","OR", & BIT SHIFTS) MANIPULATIONS. THIS IS THE ONLY PART OF 'THE MICROPROCESSOR WHICH ALTERS DATA.
- COMMAND: THE MONITOR FUNCTIONS M,G,P,R,L,S,t',l.- DATA: INFORMATION FOR THE PROCESSOR THAT DOES NOT HAVE TO BE
TRANSLATED, e.g. "AD" AS DATA ACTUALLY MEANS 10x16+13x1 = 1731O
WHEREAS THE INSTRUCTION "AD" GETS TRANSLATED INTO THEOPERATION "LOAD ACCUMULATOR ABSOLUTE".
- EPROM: ERASABLE PROGRAMMABLE READ ONLY MEMORY. THIS TYPEOF MEMORY IS LIKE A PROM, BUT CAN AGAIN BE ERASED BYEXPOSING THE CHIP TO ULTRAVIOLET LIGHT.
- FLAGS: ONE BIT INTERNAL REGISTERS. ALL SEVEN FLAGS CAN ALSO BETREATED AS SEPARATE BITS OF THE P REGISTER (PROCESSOR STATUS).
- INDEX REGISTER: A REGISTER WHICH CAN BE USED TO MODIFY ANADDRESS (USED IN REFERRING TO DATA) BY BEING ADDED TO IT, THUSACCESSING A CERTAIN ELEMENT OF A TABLE. THE 6502 HAS TWO INDEXREGISTERS CALLED X & Y .
- INSTRUCTION: A FUNCTION OF THE MICROPROCESSOR LIKE LOAD ANDSTORE.
- I/O: INPUT/OUTPUT. THIS CHIP ALLOWS YOU TO COMMUNICATE WITH THEOUTSIDE WORLD. IN THE ACORN THE I/O CHIP HAS 16 PROGRAMMABLELINES WHICH CAN EITHER BE OUTPUTS OR INPUTS. IT ALSO HAS 128BYTES OF RAM.
- IRQ: INTERRUPT REQUEST. IF FLAG I (INTERRUPT DISABLE) IS CLEAR ANDA REQUEST IS MADE THE PROCESSOR WILL ATTEND TO IT AFTERSETTING FLAG I AND STORING THE PROGRAM COUNTER AND STATUSREGISTER.
- JUMP: THE PROGRAM COUNTER IS LOADED WITH A NEW ADDRESS. THEEXECUTION OF THE PROGRAM, WHICH IS NORMALLY USINGCONSECUTIVE ADDRESSES, CONTINUES (JUMPS) AT THIS NEW ADDRESS.
- LOAD: TRANSFERS THE DATA OF A MEMORY LOCATION TO AN INTERNALREGISTER.
- MNEMONIC: SUGGESTIVE ABBREVIATION OF AN INSTRUCTION e.g. THEINSTRUCTION "LOAD ACCUMULATOR ABSOLUTE" HAS THE MNEMONIC"LDA".
-NMI : NON MASKABLE INTERRUPT WHEN THE NON MASKABLE INTERRUPTIS ACTIVATED THE PROCESS Wl LL SET FLAG I, STORE AWAY ITSPROGRAM COUNTER AND STATUS REGISTER AND THEN IMMEDIATELYATTEND TO THE INTERRUPT. THERE IS NO WAY OF PREVENTING THISINTERRUPT. IT HAS PRIORITY OVER IRQ.
-OPCODE: HEXADECIMAL REPRESENTATION OF AN INSTRUCTION.e.g. THEINSTRUCTION "LOAD ACCUMULATOR ABSOLUTE" HAS THE MNEMONIC"LDA" AND THE OPCODE "AD" .
0010
0011001200130014-00170018
0019001A
001C001D001E,001F001BFE00FE0C
FE5EFE60FE64FE66FE6FFE7AFE88FEA0
FEA6FEB1FECDFED0FEDDFEF3FF04FFB3
FFEA
D,R4 BASE ADDRESS OF THE EIGHT DISPLAYED MEMORYLOCATIONS, REGISTER 4: TEMPORARILY PCH AFTERBREAK.
R5 REGISTER 5: TEMPORARI LY PCL AFTER BREAKR6 REGISTER 6: TEMPORARI LY 01 AFTER BREAKR7 REGISTER 7: TEMPORARI LY S AFTER BREAK.
LAST 4 DISPLAYED MEMORY LOCATIONS.P SINGLE LEVEL OF STORAGE FOR PREVIOUS DATA AT
BREAKPOINTS.COL COLUMN OF KEY CURRENTLY BEING PROCESSEDTX.TY TEMPORARY STORAGE FOR X (IN DISPLAY) OR Y
(VARIOUS PLACES).USERNMI ADDRESS OF USER'S NMI PROGRAMUSERIRQ ADDRESS OF USER'S IRQ PROGRAMRECAL CONTAINS PC RECALCULATION FACTOR FOR BREAKQUAD DISPLAY X -3 ,X -2 ,X -1 ,X ON THE DISPLAY; THEN IDISPLAY STROBE KEYBOARD, MULTIPLEX DISPLAY, RETURN
WITH KEY INFORMATIONMHEXTD DISPLAY A MEMORY BYTE ON RIGHT OF DISPLAYRDHEXTD DISPLAY A ON RIGHT OF DISPLAYQHEXTD1 DISPLAY X & X+1 ON DISPLAYS 1,2,3 & 4QHEXTD2 DISPLAY X & X+1 ON DISPLAYS Y - 2 , Y - 1 , Y & Y+1DHEXTD DISPLAY A ON DISPLAYS Y & Y+1HEXTD DISPLAY BOTTOM 4 BITS OF A ON DISPLAY YQDATFET FETCH AN ADDRESS INTO LOCATIONS X & X+1COM16 INCREMENT & COMPARE TWO 16 BIT NOS X+6,X+7 &
X+8,X+9NOINC COMPARE X+6,X+7 & X+8,X+9 FOR EQUALITYPUTBYTE A TO TAPE, DO 1 START & 1 STOP BITS, NO PARITYWAIT WAIT FOR CASSETTE TIMING% WAIT HALT^THE WAITGETBYTE TAPE TO A, WAIT FOR START BIT, CENTRE TIMINGRESET ENTRY TO MONITORRESTART RE-ENTRY TO RUNNING MONITORBREAK ENTRY TO MONITOR FROM BRK INSTRUCTION,
DISPLAY CPUFONT SEVEN SEGMENT PICTURES OF THE HEX DIGITSRECAL CONTAINS PC RECALCULATION FACTOR FOR BREAK
000011002 0CF3
16
16
12243
10
10
111111112
WHICH DOESN'T HAPPEN ....000011002111100112
1a
UNTIL WE
+
FF16
ADD AN EXTRA 10C16
F316
1l6 +1 000000002
25510
12io243io
l io25610
16
AND THEN TREAT THE OUTPUT CARRY AS INDICATING THE ABSENCE OF ABORROW FROM THE HIGHER ORDERS.THE NUMBER (ONE'S-COMPLEMENT + 1) IS CALLED THE TWO'S-COMPLEMENTOF A NUMBER:
BINARY HEXADECIMAL DECIMAL000000012 01 i6 + 1 1 O
IIIIIIH2111111102
FFFE
16
16
+0i 0 or - 0 ! 0
-ho-2io
111101002100000002
F416 - 1 2 i 0
8016 -128 1 O
0IIIIIH2 7F1 6 +127 l 0
SO A BYTE CAN BE TREATED AS A 'SIGNED BINARY NUMBER' IN THE RANGE+127 0 -128, OR AS A BINARY NUMBER IN THE RANGE 0 +255. NOWTHE SUBTRACTION ABOVE SHOULD BE CLEAR : INTERNALLY, THE MICRO-PROCESSOR ONE'S-COMPLEMENTS ONE OF THE NUMBERS AND THENEXECUTES A NORMAL ADDITON WITH CARRY.
1.4 BINARY CODED DECIMAL (BCD) ARITHMETIC99 1 6 LOOKS VERY LIKE991 0 THEY BEHAVE THE SAME WAY AS THEY AREMOVED AROUND AND UNDERGO LOGICAL OPERATIONS SINCE THEY AREWRITTEN THE SAME WAY. THE BINARY REPRESENTATION OF 991 0 WOULDNORMALLY BE 011000112, AND OF 9 9 i 6 IT WOULD BE 10011001^ WE NOWDEFINE THE BINARY CODED DECIMAL VERSION OF 991 0 AS BEING THEBINARY REPRESENTATION OF THE DECIMAL DIGITS IN THE ORIGINALPOSITIONAL NOTATION, MAKING THE DIFFERENCE BETWEEN THE BINARYREPRESENTATIONS OF 9916 & 991 0 A MATTER OF SUPSCRIPTS:
9916 =100110012
9910 = 10011001 B.C.D.THE B.C.D. AND BINARY NUMBERS DIFFER IN HANDLING ONLY INARITHMETIC:
?9i6 79io221 6 + BUT 221 0 +9B16 10110
THE MICROPROCESSOR CAN BE TOLD' WHICH TYPE OF ARITHMETIC TOCARRY OUT, BY SETTING (PUTTING A ONE INTO) OR CLEARING (PUTTING AZERO INTO) AN INTERNAL BIT, THE 'DECIMAL MODE' FLAG.
CHAPTER 2: WELCOME TO THE MACHINE2.1 HOW ACORN'S MICROPROCESSOR WORKSTO CARRY OUT THE ABOVE OPERATIONS THE MICROPROCESSOR HAS ANINTERNAL ARITHMETIC LOGIC UNIT (A.L.U.) WHOSE OUTPUT IS SENT TO ANINTERNAL REGISTER OF ONE BYTE LENGTH CALLED THE ACCUMULATOR'A', THIS REGISTER ALSO ACTS AS ONE OF THE OPERANDS; THE OTHER BEINGDRAWN FROM THE MEMORY EXTERNAL TO THE JUPROCESSOR, WHICH IS CON-NECTED TO THE /iP BY 8 LINES CALLED THE DATABUS:
MEMORY
DATABUS
DATA CAN BE TRANSFERRED ALONG THE DATABUS IN EITHER DIRECTION,THIS DIRECTION IS CHOSEN BY THE, /zP AND INDICATED TO THE EXTERNALUNITS BY A SINGLE 'R/W' LINE :WHEN HIGH, T , THE JUP IS RECEIVING DATAFROM THE MEMORY, 'READING'; WHEN LOW, '0', THE JJLP IS SENDING DATA TOTHE MEMORY, 'WRITING'. ALL INFORMATION USED BY THE JUP TRAVELSALONG THE DATABUS, INCLUDING THE INSTRUCTIONS. SO THAT THE JJL?KNOWS WHERE ITS INSTRUCTIONS ARE IT HAS A TWO BYTE (16 l 0 BIT)REGISTER CALLED THE PROGRAM COUNTER, 'PC, WHICH POINTS AT THEINSTRUCTIONS BEING EXECUTED. THE MEMORY CAN BE VIEWED AS A BOOKOF 256 PAGES, THE PARTICULAR PAGE BEING DECIDED BY THE MOSTSIGNIFICANT 8 BITS (BITS 15-8) OF THE 16 BIT ADDRESS, EACH PAGE CON-TAINING 256 BYTES, THE PARTICULAR BYTE BEING DECIDED BY THE LEASTSIGNIFICANT8BITS (BITS7-0) OF THE 16 BIT ADDRESS.
16 BIT ADDRESS > MEMORY ONE BYTE OF DATA
IN THE KIT, PAGES FE16 & FF16 ARE OCCUPIED BY A NON-ERASEABLE PROGRAMTO INTERFACE BETWEEN THE MICROPROCESSOR AND THE KEYBOARD &DISPLAYUNIT.TOSTARTTHE/iPINTHISPROGRAM (ATTHE CORRECT PLACE)THERE IS A RESET BUTTON WHICH INITIALIZES THE PROGRAM COUNTER. INPAGE0016 THERE IS SOME ALTERABLE MEMORY, OF WHICH THE BOTTOM IF1 6
BYTES ARE GIVEN SPECIAL USES BY THE FE16 & FF16 MONITOR PROGRAM, SO,UNLESS PRESSED FOR SPACE, IT'S BEST TO STAY OUT OF THEM.
APPENDIX C HEXADECIMAL TO DECIMAL
1stDIGIT 2nd DIGIT
0123456789ABCDEF
00163248648096112128144160176192208224240
11173349658197113129145161177193209225241
221834b(A668298114130146162178194210226242
33193551678399115131147163179195211227243
442036526884100116132148164180196212228244
552137536985
' 101117133149165181197213229245
662238b470861Cl2118134150166182198214230246
772339557187103119135151167183199215231247
882440567288104120136152168184200216232248
992541b/7389105121137153169185201217233249
A102642587490106122138154170186202218234250
B112743597591107123139155171187203219235251
C122844607692108124140156172188204220236252
D132945617793
1(Z!9125141157173189205221237253
E14
3d46627894
nd126142158174190206222238254
F153147637995111127143159175191207223239255
HEX100200400800100020004000
800010000
DEC2565121024204840968192163843276865536
APPENDIX D ACORN MONITOR ADDRESS INFORMATIONCOMMENTLOW AND HIGH BYTES OF THE M ADDRESSLOW AND HIGH BYTES OF THE GO ADDRESSLOW AND HIGH BYTES OF THE BREAKPOINT ADDRESSLOW AND HIGH BYTES OF THE TAPE FROM ADDRESSLOW AND HIGH BYTES OF THE TAPE TO ADDRESSREGISTER 0: CONTAINS A AFTER BREAK.REGISTER 1: CONTAINS X AFTER BREAK.REGISTER 2: CONTAINS Y AFTER BREAK.REGISTER 3: TEMPORARI LY P AFTER BREAK,CONTAINS LAST PRESSED KEY FOR DISPLAYMSB=1 SETS REPEATEDLY SCANNED DISPLAY,OTHERWISE SINGLE SCAN.EXECUTION STATUS OF THE KEY PROCESSINGROUTINE
ADDRESS0000,00010002,00030004,00050006,00070008,0009000A000B000C000D
LABELMAPGAPPAPFAPTAPR0R1R2R3, KEY
000E
000F
REPEAT
EXEC
ocx.O<
2O<
Q.
O-JDCcom<N
co
LJJ
ON O N
D C *O3
Si-
DCDQ
Qu
LUDCN
QocZuu<N
I -LZLUCON
Or;
o*DC<
< <
< <
OKDCW
z<N
DC DCCOLLJJN
egOLULUN
DC
°5LJJ <
HI <
u
Ox
LUN
DC>-
OcoQ CD
CJLU
QC
9= Q
< ^
O LLJLL N
Q LJJ
<N
8K< —
DC
Ooc<
8<<
8<N
OXDCI— UJLorn
O<DC
CON
CON
corw
com
lcorw
xgQLU-IN
<DCQLU-IN
DCQ LU-IN
Q
U
OUDCLU LUQfkl
2uru
Q_ LJJ
UN
U 3
U
Q
HI ^\
U <
LLJ ^ \
Qrvi"
I*
U
X
•y LU£N
oCQLUCON
XQ_ HION
00 -CO-3
CO <
co<
CQCON
CO-3
LU
O
<
2.2 THE MONITOR COMMANDS M r t , lTHE FIRST FEATURE OF THE MONITOR IS THE MEMORY INSPECT & MODIFYCONTROL SWITCH ON, AND PRESS THE RESET BUTTON:
MODE DATAADDRESS
THEN PRESS THE MODIFY KEY, M. THIS GETS YOU INTO THE MEMORYINSPECTION AND MODIFY MODE. THE MODE INDICATOR SHOWS'A' FORALTER. THIS Fl RST PHASE OF 'A' ALLOWS YOU TO CHOOSE ANY ADDRESSIN MEMORY.
A. X X X XAPPEARS ON THE DISPLAY, WHERE X REPRESENTS
ANY OF THE 16 HEX CARACTERS SIGNIFYING THE ADDRESS.NOW PRESS THEKEYS F, E, 0, 0 (IF YOU MAKE A MISTAKE, E.G. PRESSED F, D, JUST STARTOFF FROM THE F AGAIN). AS EACH KEY IS PRESSED THE INFORMATIONON THE DISPLAY SHIFTS TO THE LEFT:
A.A.A.A.
X X X FXX F EXF E0FE00
AND SO YOU END UP WITH FE00ONTHE DISPLAY. PRESS ANY OF THE EIGHTCOMMAND KEYS (IT DOES NOT MATTER WHICH) AND YOU CAN INSPECT THECONTENTS OF THIS MEMORY ADDRESS. THIS IS PHASE TWO OF MODE 'A' ANDALLOWS YOU TO INSPECT AND ALTER THE DATA OF THE MEMORY ADDRESSCHOSEN IN PHASE ONE.
A. F E 0 0 A0
THIS ISTHE INFORMATION STORED AT THE VERY BEGINNING OF THEMONITOR. IF YOU PRESS THE t KEY
A. F E 0 1 . 0 6
UP WE GO. NATURALLY THE4, KEY BRINGS BACK
A. F E 0 0 . A0
AND EITHER KEY MAY BE USED ANY NUMBER OF TIMES IN SUCCESSION. NOW,IF, WITHOUT TURNING OFF, YOU PRESS RESET
AND THENM
A. F E 0 0
THE SYSTEM HAS REMEMBERED THE ADDRESS YOU WERE USING (WHICHDOESN'T HAVE TO BE FE00) TO INSPECT MEMORY NOW ENTER THE ADDRESS0030 AND TERMINATE WITH ANY COMMAND KEY
A. 0 0 3 0 X X
0030 IS AN ADDRESS IN THE ALTERABLE SECTION OF THE MEMORY.PRESSING DIGIT KEYS NOW WILL CAUSE THE INFORMATION IN0030TOCHANGE (WHAT HAPPENS AT FE00?? TRY IT! YOU CANNOT WRITE INTO THEMONITOR PROM, (i.e. THE PROGRAMMABLE READ ONLY MEMORY). PRESS 0, 1.
PRESS 2.3
A.
A.
0030
0030
01
23
AS BEFORE INFORMATION ISSHIFTED IN UNTIL TERMINATED BY ANYCOMMAND KEY. BUT, UNLI KE THE ADDRESS FETCHING PHASE, THE COMMANDKEY Wl LL BE EXECUTED. USEFUL TERMINATORS ARE THE M, t & I KEYS.PRESS t .
A. 0 0 3 1 X X
PR ESS 4,5
A. 0 0 3 1 45
PRESS 4-
A. 0 0 3 0 23
& t AGAIN
0 0 3 1 45
YOU CAN GO UP AND DOWN INSPECTING & MODIFYING THE MEMORYCONTENTS IF THERE IS NO ALTERABLE MEMORY (E.G. A PROM) AT APARTICULAR ADDRESS, THE INFORMATION WILL NOT CHANGE. TO CLOSETHIS SECTION WE'LL MAKE THE MONITOR DO A LITTLE TRICK. M,0,0,0,E, k( k = ANY COMMAND KEY)
cc
o
flU
LA
oO
TH
AN
ccUJI
CO
ccUJ
5UJcc
oDC
QZ
>
<
x̂<
LU
D_ J
OCOCO
*^
N
X.N
ODCUJN
QUJ
I/MlCJ
ESS
IN
DC UJ
Q QQ O
FLA
GS
<DODCLU
>CJ
OIAI3N
I
2.
COLU m
j _ , _
CO K
CO ID
CO • * •
CO ^t
co «?r
CN <tf
CN <3"
CN CO
CN CN
zt
t
t
<<
1
1
1
CJCN
1
1
CN
1
MJZ
CO
)W!T
HE
ST
BIT
I—I LLJ
Z H<Q—1 ^ .
__ iZO coO<
t
CO
1X
1
1
1
uUJ
1
1
LU
UJ
CJruz
XUJDC<CL
Ou
XQ .CJ
1>
1
1
1
0CJ
1
1
CJ
§
CJMJz
LUDC<Q .
OCJ
Q_
CJ
I
t
\( j0 -
t
0CD
1
1
<^
1
1
1
1
1
a.
Q_
—3
Xt
1
UJCO
1
UJ
COCO
1
<
<
MJ
t
1
1
CJCO
CJ<
1
a
t
NJZ
STE
RS
TER
RE
GI
XQ
- I
XQ_ l
RE
GI
Q
_J
Q_ j
tX
1
1
1
LU00
CO
1
CO00
1
ISTE
R
t>
1
1
1
CJ00
1
O)
00
1
ISTE
R
LU LLJDC DC
XLUccO
CO
X
CO
>-LUDCOCO
>
CO
CO \-
UJ
E1
>LL5
1O
UJOC
x<
COCO
<
ZE
RO
ING
COCOUJDC LU
Q QQ O< 2
CO
0
FLA
_J
CODCUJ
>
CJ
ION
3NI/M
CO
CO
CN
CN
CO
CO
LO
1-LL
I
TIC
S
LU
RIT
H
<
AS
L
UJ
UJ0
CO
s
CJ
z
EF
T
—i
LUQ
UJCJ
CDQ
8
MJZ
LU
DEC
R
1—1
INA
R
CO
DE
C
UJLL
LULJJ
CDLL
COUJ
MJZ
EN
T 1
111
NC
RE
DC
zCO
INC
UJin
UJ
s
CJMJZ
h-
SH
IF
<r
OG
ICLS
RIG
HT
cc
UJCO
LUCN
8
CDCN
CJMJZ
LEF
T
UJ
OT
AT
DC
RO
L
LU
HICO
CD
§
CJMJZ
1-
RIG
H
LU
OT
AT
DC
DC
ODC
CJ
zCO
EC
RO
SPA
GE
.VE
S
O
ION
1
<r
DPE
R,
LL
CLE
1
CJ
DC
XUJ
UJ0
a.
%0ccCJ
NC
H&
BR
A
LL
CN
ICJ
BR
Ah
LL
+I
uzDCDO
O
LL
LLI
DC
OCO
I
DC
liltI8l| DC q
LU - IQ_ _ l
O <I I
8LU
DC
Q
Q
<
DC
O
DCJ
3
LUQCQQ<DCO
D
UO<
COCOLUDCQQ
DCO
D^DCJCJ
O
iEX
I> DC
0- ZO LLJ
I
oDCco
00
t
JUI
u u o oQ_ Q_ Q_ Q. Q-
r-i n t t t t t- L , I . CO CO CO CO CO
1 1 I+ + I
IllllSSSSQ
CO CO CO CO CO
t t t t t x , x < w <
+ + + + + t t t t t tcococococo<<coXX>-
CN(N(NCN<NCNCNJCNCN CM CM CM CM CN CN
Qi OO C D ^ O O O O C D ^
D Q U O I U U ^< CO < < < 00< < CD 00 O) O)
DO
uN ru ru rvi ru
C J O - > Z Z Z Z ZMJ - I
z <uru
uru ru ru ru rtJ ru ru
z z z z z z
CO
LU CO
8
CO CO
LLJDCCO
I
CO
DCDCDCOCcCDCDCCCCJ
LJJLULULuSSSSo_ J _ I _ J _ I ± ± ± ± OCJCJCJCJCOGOCOCO-I
f-coDC
oLU(JODC
HcoDC
oCOCOLUCJo
tDDCDCLU
< 2zo
DC
- co co -J - i
Z O_ Q_ O_ O_
LLLU
ODC
IoDC
LU
5DC
oDC
DCD
I-ODCCODCO
ODCLL
zDCDLUDC
> X < W <
o o o o oh l h h< < co X X >
DC DC DC DC DC DCLU LJJ LU LU LULL LL LL LL LLCO CO CO CO COz z z z z< < <DC DC DC DC DChhhhh
U Q _ > X >J l J J L U L U
<LT
CO U U U U Q Q ± - - l ZQ.Q.Q.Q.
-J DC _O O I-DC DC DC
COHDC
PRESS 1,6. (IF YOU GET BORED, YOU CAN GO THE OTHER WAY BY 1,7)(ESCAPE BY RESET). THE MONITOR SCANS THROUGH ALL MEMORYSUCCESSIVELY SHOWING ITS CONTENTS (DATA). WHERE THERE IS NOMEMORY AT ALL YOU WILL PROBABLY SEE THE FIRST TWO ADDRESSDIGITS.
2.3 AT LAST, A PROGRAM2.3.1 ASSEMBLY LANGUAGE, MACHINE LANGUAGE, THE INSTRUCTIONS
LOAD, STORE AND JUMPA PROGRAM IS THE NAME FOR A SET OF STORED COMMANDS THAT THEMICROPROCESSOR WILL EXECUTE. THESE ARE STORED IN BINARY, SINCETHAT'S ALL THAT ANYTHING CAN BE STORED IN, (ENTERED BY YOU IN HEX)AND ARE INDISTINGUISHABLE FROM ANYTHING ELSE. IF IT GETS THECHANCETHE/xP (MICROPROCESSOR) WILL BUSY ITSELF TREATINGINFORMATION WHICH YOU MEANT AS DATA AS A PROGRAM. IT PROBABLYWONT BE DOING ANYTHING INTELLIGENT AND Wl LL HAVE TO BESUMMONED BACK WITH THE RESET KEY. SOME SORT OF TRANSLATIONBETWEEN THE STORED BINARY/HEX AND YOU IS NEEDED. 101011012 MEANSA GREAT DEAL TO THE/xP BUT LITTLE TO YOU. IT ACTUALLY MEANS "LOADTHE ACCUMULATOR WITH THE CONTENTS OF THE MEMORY ADDRESSDEFINED BY THE FOLLOWING TWO BYTES, OF WHICH THE FIRST IS THELEAST SIGNIFICANT ADDRESS". THIS ISA LITTLE LONG FOR WRITINGSTRAIGHT INTO A PROGRAM AND IS USUALLY ABBREVIATED TO LDAABS,OR JUST LDA.ABSOLUTE MEANS ANYWHERE IN THE 64K. THE 6502 CANADDRESS 64K OF MEMORY WHICH IS DIVIDED INTO PAGES 256 BYTES LONGTHE FIRST PAGE IS CALLED ZERO PAGE. LOCATIONS IN ZERO PAGE CANBE ADDRESSED BY JUST ONE BYTE. THERE ARE SPECIAL INSTRUCTIONS TODO THIS. AT THE END OF THE MANUAL THERE ISA LIST OF ALL THESEMNEMONICS WITH THEIR HEX EQUIVALENTS IN APPENDIX B. SO IF WE WROTETHE PROGRAM IN MNEMOMICS ITW0ULD LOOK LIKE.
LDAFE00AND WE WOULD TRANSLATE IT FOR THE JUP AS THE THREE BYTES
AD LOAD ABSOLUTE00 LOWER BYTE OF ADDRESSFE HIGH BYTE OF ADDRESS
WHICH WOULD CAUSE THE JUP TO PUT A0 (THE DATASTORED IN FE00) IN ITSACCUMULATOR (REMEMBER USING THE MONITOR TO LOOK AT FE00?). THETRANSLATION PROCESS IS CALLED ASSEMBLING AND COMPUTER PROGRAMSWHICH DO IT ARE CALLED ASSEMBLERS. A RESIDENT ASSEMBLER IS ONETHAT RUNS (OPERATES) ON THE SAME MACHINE THAT IT ASSEMBLES FOR;A CROSS ASSEMBLER RUNS ON A DIFFERENT MACHINE. THE MNEMONICSLDA, STA etc ARE OFTEN CALLED ASSEMBLY LANGUAGE, THE GENERATEDBINARY IS CALLED MACHINE CODE.WE CAN LOAD THE ACCUMULATOR IN TEN OTHER WAYS; HERE ARE TWO OFTHEM.
INSTRUCTIONLENGTHINBYTES TYPE
2 1HEXA9
MNEMONICLDA#
EXECUTIONTIMERS
2BRIEF EXPLANATIONPUT THE NEXT BYTEACCUMULATOR. "LOADIMMEDIATE'.
2 2 A5 LDA Z 3 SHORTENED FORM OFLOAD ABS 00XX 'LOADZERO PAGE'.
3 3 AD LDA 4 LOAD A ABSOLUTE.THE FIRST OF THESE INSTRUCTIONS IS VERY IMPORTANT. IF WE KNOW THATWE WANT A0 IN THE ACCUMULATOR THEN IT IS WASTEFUL TO FIND AMEMORY LOCATION WHICH HAPPENS TO CONTAIN IT, SINCE TWO BYTES ARENEEDED (GENERALLY) TO SPECIFY WHERE IT IS AND SO WE IMPLY, BY THEIMMEDIATE INSTRUCTION, WHEHE IT IS & ACTUALLY ENTER IT IN THEPROGRAM. THERE ARE COMPLEMENTARY STORE ACCUMULATOR 'STA'INSTRUCTIONS TO LDA 2-AND LDA.BYTES
2TYPE
2HEX85
MNEMONICSTAZ
TIMERS2 STORE A ZERO PAGE
(IN THE FIRST 256 BYTES)3 3 8D STA 3 STORE A ABSOLUTE
(ANYWHERE IN MEMORY)WE CAN ALSO LOAD THE PROGRAM COUNTER. THE PROGRAM COUNTER IS ANINTERNAL REGISTER THAT POINTS TO THE NEXT LINE OF THE PROGRAM.THE MNEMONIC FOR THIS IS NOT LDPC BECAUSE WHEN THE P.C. IS LOADEDWITH A NEW VALUE IT GIVES THE MICROPROCESSOR A Dl FFERENT PLACE TOLOOK FOR INSTRUCTIONS: THE PROGRAM JUMPS. SO 'LOAD P.C. WITH NEXTTWO BYTES' (LDPC ) IS JMP, THIS IS REFERRED TO AS JUMP ABSOLUTESINCE THE PROGRAM JUMPS TO A NEW ABSOLUTE ADDRESS. SO IF WE ARENOT IN THE MONITOR ANDWANTTO BE,JMP FF04WILL ENTER THE MONITOR.NOW WHAT HAPPENS IF THE FOLLOWING PROGRAM IS RUN?
LDA FE00STA Z 20JMP FF04
THE FIRST INSTRUCTION GETS THE CONTENTS OF FE00, AND PUTS IT IN THEACCUMULATOR. THE SECOND STORES THE ACCUMULATOR IN LOCATION0020JHE FIRST TWO 0'S REFER TO ZERO PAGE AND ARE ASSUMED BY THEPROCESSOR IN THE ZERO PAGE MODE. THE THIRD GETS BACK TO THEMONITOR, SO THAT YOU CAN INSPECT LOCATION 20. THIS READS AS.00300031003200330034003500360037
AD (OPCODE)00 (DATA)FE (DATA)85 (OPCODE)20 (DATA)4C (OPCODE)04 (DATA)FF (DATA)
LDA
STA
,! JMP
FE00
Z20
FF04
II RELATIVE: RELATIVE ADDRESSING MODE
2 BYTES 2+t CYCLES
MNEMONIC
BCCBCSBEQBMIBNEBPLBVCBVS
VERBAL
BRANCH IF CARRY CLEARBRANCH IF CARRY SETBRANCH IF EQUAL (TO ZERO)BRANCH IF MINUSBRANCH IF NOT EQUALBRANCH IF PLUSBRANCH IF OVERFLOW CLEARBRANCH IF OVERFLOW SET
90B0F030D0105070
BRANCH IFC = 0C=1Z = 1N = 12 = 0N =0V = 0V = 1
SE
T
AC
CU
MU
LA
TO
R,
OP
ER
AT
ION
, M
EM
OR
Y -•
AC
CU
MU
LA
TO
R
AP
PE
ND
IX B
INS
TRU
CTI
ON
1 A
CC
UM
UL
AT
OR
RE
FE
RE
NC
E: ,
AD
DR
ES
SIN
GM
OD
E
IMM
ED
Z
ER
O
Z,X
A
BS
OL
UT
E
A,X
A
,Y
(I,X
) (|
),Y
VE
RB
AL
MN
EM
ON
IC
BY
TE
SC
YC
LE
S =
SP
EE
D JU
S
2 2
23
33
22
2 3
4
4
4
+4
+6
5+
FL
AG
S I
N P
AF
FE
CT
ED
< <t t
• + t t t +2 2 2 2 <2 2+ t 1 > t > 1< < < < 2 < <
r> co Q incDr- LL
69
65
75
6D
7D
79
6
129
25
35
2D
3D
39
21
C9
C5
D
5
CD
D
D
D9
C
1
49
45
55
4
D
5D
59
4
1A
9 A
5
B5
A
D
BD
B
9
A09
05
1
5
0D
1D
19
01
E9
E5
F5
E
D
FD
F
9
E1
O cj cjN IU ru rw IU rw mz z z z z z z
AD
D W
ITH
CA
RR
YL
OG
ICA
L A
ND
LO
GIC
AL
CO
MP
AR
EL
OG
ICA
L E
XC
LU
SIV
EO
RL
OA
D A
CC
UM
UL
AT
OR
LO
GIC
AL
OR
SU
BT
RA
CT
WIT
HB
OR
RO
W/C
AR
RY
UQlDC < < oQ Z 2 O QO=m< < UUJ -i O c/)
2t<
- 85
95
8D
9D
99
8
1
91
ST
OR
E A
CC
UM
UL
AT
OR
ST
A
THE ADDRESS 0030 IS THE STARTING ADDRESS OF THE PROGRAM. THISPARTICULAR PROGRAM WILL WORK WITH ANY STARTING ADDRESS - IT ISSAID TO BE 'POSITION INDEPENDENT' OR 'RELOCATABLE' - BUT OTHERPROGRAMS MAY NOT. IF YOU ARE NEW TO THE GAME, IT WILL BE EASIER IFYOU ENTER PROGRAMS AT THE STARTING ADDRESS SHOWN IN THE MANUAL.
2.3.2 ENTERING A PROGRAM, THE GO COMMANDTO ENTER THIS PROGRAM, WE'LL GO THROUGH IT STEP BY STEP.I ENTER THE STARTING ADDRESS: PRESS M,0.0,3,0, kII ENTER A BYTE OF DATA A,DI11 USE THE t KEY TO TERMI NATE DATA ENTRY AND STEP UP
- CONTINUE WITH 0/0^F/E/t,8/5,t,2,0,t,4,C,t,0,4,t,F,FIV CHECK THAT THE PROGRAM IS ENTERED CORRECTLY BY, E.G, USING I
TO GO BACK DOWN THROUGH IT.- REMEMBER THAT MISTAKES AT KEY ENTRY (E.G. PRESSED 8,6) MAY BECORRECTED BY CONTINUING (PRESS 8,5) -
NOW THAT THE PROGRAM IS LOADED PRESS ONLY ONCE THE 'GO' (G) KEY
K. XXXX
APPEARS THE K ( R.) REMINDS YOU OF TWO THINGS: X THIS IS A DIFFERENTSTORED ADDRESS TO THE A. ADDRESS.1L YOU CANT GO BACK! (UNLESSYOU EITHER PRESS RESET OR ENTER ADDRESS FF04.THE MONITOR ENTRYADDRESS, AND GO) THE NEXT COMMAND KEY YOU PRESS Wl LL CAUSE THE/zPTO DO A KAMI-KAZE DIVE TO THE ADDRESS SHOWN, SO ITS AS WELL TOGET IT RIGHT!! ENTER 0,0,3,0
K. 0 0 3 0
AND PRESS ANY COMMAND KEY. NOTHING HAPPENED? WELL IT DID, REALLY.IT JUST HAPPENED VERY QUICKLY:
PROGRAM EXECUTION TIMES,juSLDA FE00 4STA Z 20 3JMP FF04 3
TOTAL 101OMSITTOOKTENMILLIONTHSOF A SECOND TO HAPPEN. WE'RE NOW BACK INTHE MONITOR. PRESSING ANY DIGIT KEY WILL CAUSE THE (BY NOW)FAMILIAR DOTS TO REAPPEAR. PRESS M,0,0,2,0 k :
A. 0 0 2 0 A0
WHICH CHECKS THAT THE PROGRAM ACTUALLY DID WORK. YOU COULDCHANGE 0020 AND RUN THE PROGRAM AGAIN BY THE KEYS
F, F, G,G,M, MWHICH SUCCESSIVELY PUT FF IN 0020, RUN THE PROGRAM AND RE-EXAMINE
LOCATION 0020. A LOT QUICKER FOR YOU THE SECOND TIME, WASN'T IT?THIS ISBECAUSEM&G REMEMBER WHAT THEY WERE POINTING AT. LET'SMAKE THE PROGRAM BETTER. AT THE MOMENT WE HAVE NO IDEA IF IT RAN,AND WE DON'T KNOW IF IT RAN CORRECTLY UNTIL WE LOOK AT 0020. IF THEPROGRAM WROTE OUT THE BYTE ON THE DISPLAY AS WELL AS STORING ITIN 0020, WE'D KNOW THAT IT HAD ALL HAPPENED. INSIDE THE ACORNMONITOR PROGRAM IS A SET OF INSTRUCTIONS TO WRITE A BYTE ONTO THETWO RIGHT HAND DISPLAY DIGITS. THIS PROGRAM IS LOCATED AT FE60 ANDEXPECTS THE BYTE TO BE DISPLAYED TO BE IN THE ACCUMULATOR, WHICHIT IS. THE PROGRAM DESTROYS THIS BYTE AS IT PUTS IT ONTO THE DISPLAYSO WE MUST PUT IT IN 0020 BEFORE USING THE PROGRAM.2.3.3 INSTRUCTIONS JMP, JSRIF WE SIMPLY WENT JMP FE60 THIS WOULD CORRECTLY EXECUTE THEPROGRAM BUT WE WOULD BE LEFT IN THE MIDDLE OF THE MONITOR SOME-WHERE SINCE THE PROGRAM DOES NOT HAVE AN ADDRESS TO JUMP BACKTO. WE CAN GIVE IT SUCH AN ADDRESS WITH THE INSTRUCTION JSR (OPCODE20 HEX) THIS IS EXACTLY LI KE A JUMP BUT IT SAVES THE PROGRAMCOUNTER BEFORE JUMPING. THEN THE SINGLE BYTE INSTRUCTION RTS(OPCODE 60 HEX) RESTORES THE PROGRAM COUNTER AND WE GET BACKAGAIN. JSR IS "JUMP TO SUBROUTINE" AND RTS IS "RETURN FROMSUBROUTINE". THE PROGRAM AT FE60 HAS AN RTS ATTACHED AT ITS END,ANDSOCANTRANSFERCONTROLBACKTOTHE PROGRAM WHICH CALLED IT.OUR NEW PROGRAM IS 3 BYTES LONGER:
APPENDIX A64 CHARACTER ASCII ON ACORN'S 7 SEGMENT DISPLAY
00300031
00330034003500360037
'00380039003A
AD00FE8520
"20"60FE
'4C04FF
LDA FE00
STA Z 20
JSR FE60
JMP FF04
AND WE Wl LL HAVE TO ENTER 6 BYTES FROM 0035 TO 003A WITHM,0,0,3,5, k , 2,0, t,6J3/T,F,E,t,4,C,t,0,4,t,F,F. WE HAVEN'T CHANGED THE STARTOFTHE PROGRAM SO G, G WILL RUN IT.
ASCII CODE0123456789ABCDEF
101112131415161718191A1B1C1D1E1F
DISPLAY
anbdEFGh
i
ZiR
nBpqr~
5.b=i i.
L_l
u95.CHZln
CHARACTER@ABCDEFGH1JKLMN0PQRSTUVwXYz[\]A
HEX5F777C585E79713D34050D753837545C736750ED789C1C7E496EBD39640F2308
ASCII CODE202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F
DISPLAY
I.I I
•c1—
E
C.Zl.H
i—
•1
E3H56"IBg
\i.
H
P.
CHARACTER
1
#£%&
()*+
-
10123456789
<=)?
HE008622633B2D7BffiB98F7642044080523F065B4F666D7D077F6F8284464870D3
K. 0 0 3 0 A0
APPEARS MEAN ING THAT 0020 HAS AGAIN HAD A0 WRITTEN INTO IT.INSTEAD OF STORING THINGS IN 0020, LET'S USE ITS INFORMATION AS PARTOF A LOGICAL OPERATION.
PROGRAM. THE STRATEGY OF THE PROGRAM IS NOT OBVIOUS, AND IS LEFTAS AN EXERCISE TO THE READER. A SMALL PRIZE Wl LL REWARD THESUBMISSION OF A SHORTER, FASTER PROGRAM; NOTE THAT WORKSPACEREQUIREMENTS CONTRIBUTE TO THE LENGTH!
8 QUEENS PROGRAM
020002010203020502070209020B020E0210021302160218021A021C021E022002220223022502270228022A022C022E022F023002320233023502370238023A023B023D023E024002410243024402470248024A024C024E02500253
F8A28484848420A5204CB5C9D0A56985601515A849F095C89835A8159598150A9598154A95E820CAB54935494C
201F202932161F600400FF071F001F
0912
FFF618
1B
0001
09
0A
12
13
16
01FF1BFF27
MAIN
02
FEFF
TRY
FINISH
LOOP
02
02
SEDLDX #20STY COUNTSTY ROWSTY LEFTSTY RIGHTJSR TRYLDA COUNTJSR RDHEXTDJMP RESTARTLDAZX 00CMP#FFBNE CONTINUELDA COUNTADC #00STA COUNTRTSORAZX09ORAZX 12TAYEOR#FFBEQ FINISHSTA2X 1BINYTAYANDZX 1BTV\YCRAZX 00STAHX 01TYAORAZX 09ASLASTAZX 0ATYAORAZX 12LSRASTAZX 13INXJSR TRYDEXLDAZX 01EOR #FFANDZX 1BEOR#FFJMP LOOP
- CLEAR COUNT- CLEAR ROW OCCUPIED- CLEAR LEFT DIAGONAL ATTACKS- CLEAR RIGHT DIAGONAL ATTACKS- FIND THE NO OF WAYS
- DISPLAY ANSWER
- FINISHED YET?
- FINISHED, SO INCREMENT COUNT
- CURRENT LEFT- CURRENT RIGHT
- NO CHANCE- CURRENT POSSIBLE PLACE
- NEW ROW
- NEW LEFT ATTACK
- NEW RIGHT ATTACK
2.3.4 THE LOGIC INSTRUCTIONS 'ORA', 'AND', 'EOR'.IF WE PUT 601 6 IN LOCATION 0020 (M,0,0,2,0, k, ,6,0 : YOU SHOULD KNOW BYNOW) AND ALTER THE STA Z INSTRUCTION AT 0033 TO, SAY, ORA Z (OPCODE05 HEX) (THE PROGRAM READS LDA FE00
ORA Z20JSR FE60JMP FFQ(4)
WE HAVE A PROGRAM THAT DISPLAYS THE LOGICAL yOR' BETWEEN THECONTENTS OF FE00 (A0) AND 0020, (60). THE HEX FOR ORA Z IS 05 AND ITCARRIES OUT A LOGICAL 'OR' BETWEEN THE ACCUMULATOR AND THESPECIFIED LOCATION IN Z PAGE. M,0,0,3,3, k 0,5 IS THE MODI FICATIONTO THE PROGRAM, THEN SINCE WE STILL START AT 0030, G,G RUNS IT :
K. 0 0 3 0 E0
THE OPERATION WAS 'OR' A060E0
or
1010000001100000 or11100000
TRY CHANGING 0020 TO 40 AND RUNNING THE PROGRAM AGAIN IS THEANSWER WHAT YOU EXPECTED?WE CAN CHANGE 0033 TO MAKE THE PROGRAM DO LOGICAL 'AND' OR'EXCLUSIVE - OR'. THE MNEMONICS AND OPCODES ARE:
LOGICAL AND ACCUMULATOR AND Z PAGEMEMORYLOGICAL EXCLUSIVE-OR ACCUMULATOR ANDZPAGE MEMORY
AND THE PROGRAMS WOULD READ
AND
EOR
Z
Z
251 6
451 6
LDA FE00AND Z 20JSR FE60JMP FF04
LDA FE00EOR Z20JSR FE60JMP FF04
BY NOW YOU MUST BE GETTING TIRED OF THE A0 IN FE00 SO WE'LL CHANGETHE PROGRAM TO READ
LDA Z21EOR Z20JSR FE60JMP FF04
THE SPACE TAKEN UP BY LDA Z 21 IS ONE BYTE LESS THAN THAT USED BYLDA FE00. WE COULD SIMPLY WRITE THE NEW TWO BYTES IN AT LOCATIONS0031 & 0032 AND CHANGE THE GO ADDRESS TO 0031. THIS IS VERY SIMPLEHERE SINCE THAT IS ALL WE HAVE TO DO. BUT IF THERE WERE MANYREFERENCES TO 0030 AS THE START OF THIS PROGRAM IT WOULD TAKE ALONG TIME TO FIND AND CHANGE THEM ALL, AND IF WE DIDN'T CHANGETHEM ALL SOMETHING WOULD GO WRONG. WE CAN'T MOVE THE REST OFTHE PROGRAM DOWN ONE BYTE: SOMETHING MIGHT BE REFERRING TO IT.THE PROBLEM ARISES BECAUSE LDA Z IS SHORTER THAN LDA. WE COULDSIMPLY USE LDA WITH A ZERO PAGE ADDRESS BUT THIS TAKES A WHOLE /iS
LONGER THAN LDA H! THE SOLUTION IS TO USE LDA Z AND TO INCORPORATEAN EXTRA BYTE IN 0030 AS PADDING. THIS MUST BE A SINGLE-BYTEINSTRUCTION, THAT DOES NOTHING TO AFFECT THE PROGRAM, AND ONE ISSPECIFICALLY PROVIDED
NOP EATHE PROGRAM READS0030 EA0031 A5 21
'NO OPERATION"
0033 45
0038 4C04FF
NOPLDA 2 21EOR Z20JSR FE60JMP FF04
-NOTICE THE MORE COMPACT MODE OF WRITING IT DOWN. THIS IS MORECONSISTENT WITH THE WAY MNEMONICS ARE WRITTEN. IT IS EXACTLYEQUIVALENT TO0030 EA NOP0031 A5 LDA Z 210032 210033 45 EOR 2200034 200035 20 JSR FE600036 600037 FE0038 4C JMP FF040039 04003A FFAND IT WILL BE USED THROUGHOUT THE REST OF THE MANUAL:THIS PROGRAM TAKES THE CONTENTS OF (WHICH MAY BE WRITTEN BYPUTTING BRACKETS AROUND THE PARTICULAR ADDRESS) 0020 & 0021 ANDPRESENTS THEIR LOGICAL EXCLUSIVE - OR ON THE DISPLAY. APART FROMTHEIR LOGICAL FUNCTIONS, THESE OPERATORS ARE OFTEN USED TOMANIPULATE SINGLE BITS. FOR INSTANCE ORA #01 WOULD SET BIT 0 OF THEACCUMULATOR, AND #FE WOULD CLEAR IT AND EOR #01 WOULD COMPLENTIT, ALL WITHOUT AFFECTING ANY OTHER BITS IN THE ACCUMULATOR.
2.3.5 ARITHMETIC INSTRUCTIONS 'ADC, 'SEC, CLC'.FROM LOGIC OPERATIONS WE PROGRESS AGAIN TO ARITHMETIC. LOOKINGAT ORA Z, EOR Z, AND Z WOULD LEAD ONE TO ASSUME THE EXISTENCE OFADD Z. WELL, THERE ISN'T ONE, THERE'S ONLY ADC Z.BYTES: 2 ADC Z 65 "ADD WITH CARRY, ZERO PAGE"
1 SEC 38 "SET CARRY FLAG"1 CLC 18 "CLEAR CARRY FLAG"
THIS IS MOST UNUSUAL AND A TRAP FOR UNWARY PROGRAMMERS,ESPECIALLY THOSE USED TO /iPs WHICH POSSESS AN ADD INSTRUCTION: THECARRY FLAG MUST BE CLEARED BEFORE AN ADC (OR IT MUST BE IN AKNOWN STATE E.G. f SEC = f CLC
1 ADC # 0 0 1 ADC #01 OR'UNEXPECTED' ANSWERS Wl LL APPEAR. WHEN THE juP LEAVES THE MONITORUSING THE GO ROUTINE THE CARRY FLAG IS SET: FAILURE TO CLEAR ITBEFORE AN ADC RESULTS IN AN ANSWER 1 GREATER THAN EXPECTED.
THE METRONOME PRODUCES A PULSE AT THE TAPE OUTPUT PIN, PA6, WITH AREGULAR PERIOD. THE "UP" AND "DOWN" KEYS WILL INCREASE ANDDECREASE THE PERIOD RESPECTIVELY. WITH SUITABLE ADDITIONALCIRCUITRY THIS COULD DRIVE A LOUDSPEAKER OR A 'STROBE' LIGHT. INFACT A SMALL SOUND CAN BE OBTAINED BY SIMPLY CONNECTING A LOUD-SPEAKER ACROSS THE TAPE OUTPUT AND EARTH PINS.THE CONSTANTS USED AT PRESENT MEAN THAT THE PULSE IS OF 1/300 SEC.AND THE DELAY BETWEEN PULSES CAN BE VARIED FROM 1/20 SEC. TOABOUT 13 SECS. YOU CAN DEFINE THE PERIOD BEFORE STARTING THEPROGRAM BY PUTTING THE REQUIRED VALUE INTO MEMORY LOCATION0020. 20 WILL GIVE ABOUT 1 SEC BETWEEN PULSES, AND ANYTHING ELSEPROPORTIONATELY MORE OR LESS. ONCE THE PROGRAM IS RUNNING THE'UP' AND 'DOWN' KEYS WILL INCREMENT AND DECREMENT THE PERIOD BYABOUT 1/20 SEC EACH TIME THEY ARE PRESSED. THEY ALSO RESET THECYCLE. THIS FACILITY COULD USEFULLY BE USED FOR FINE TUNING BUTWOULD BE TEDIOUS FOR LARGE CHANGES OF PERIOD.
METRONOME
\DDR
02000202020402060209020C020F0212021402170219021B021D
021F022102230225
02270229022C022D022F023002320234
HEXCODE
A985A98D8D208DA620C9D0E6B0
C9D0C6B0
A0208810CAD0F0
1F0E402216CD
to200C160420E5
170420DD
0CCD
FA
E2D0
0E0EFE0E
FE
FE
LABEL
PULSE
DELZ
DOWN
DELIDELJ
INSTRUCTION
LDA#1FSTA REPEATLDA #40STA1ADDRSTA SET PI A6JSR WAITSTACLR PIA6LDXZ PERIODJSR DISPLAYCMP #16BNE DOWNINCZ PERIODBCS PULSE
CMP #17BNE DELIDEC^ PERIODBCS PULSE
LDY #0CJSR WAITDEYBPLDELJDEXBNEDEL2BEQ PULSE
COMMENTS
- SET DISPLAY TO SINGLE SCAN
- DEFINE PA6 AS OUTPUT- USE INS8154 SET BIT MODE- USE THE 300 BAND WAIT- USE IN58154 CLEAR BIT MODE
- LOOK AT KEYBOARD- UP KEY?- NO- INCREASE PERIOD- CARRY WAS SET BY THE COMPARE
ALWAYS- DOWN KEY?- NO- DECREASE PERIOD- CARRY WAS SET BY THE COMPARE
ALWAYS- CYCLE TIME OF flYS SEC.
- END OF THIS PERIOD SO PULSE
4THE EIGHT QUEENS PROBLEM IS TO FIND THE NUMBER OF WAYS IN WHICHEIGHT QUEENS MAY BE PLACED ON A CHESS BOARD WITHOUT ATTACKINGEACH OTHER. THE PROGRAM FINDS 92 WAYS SINCE IT COUNTS ROTATIONSAND REFLECTIONS, ALLPOSSIBLE POSITIONS ARE TRIED AS SOLUTIONS INTHIS HIGH SPEED RECURSIVE (I.E. IS DEFINED IN TERMS OF ITSELF)
COUNTER KEYBOARD
ADDR
001D0020
0022002400260028002A002C002E00300032003500370039003B003E00N0041004300450048004B004D004F005100530056
0058005A005B
005D005D005F
HEXCODE
2090
C9F0C9F0D0C985F020C610302020
D0F02020D0F0A9852090
A960A9
A98560
COUNTER i
ADDF
0060006200640066006700690063006D006F007100730076
0C0A
071F0611F10019ED6019F7E26045
CFF6694FD9F61F0E0C03
00
FF
FF0E
FE
00
m00
0000
FE
LABEL
DISP
CHANGE
MORE
UP
DOWN
ZOOM
SUBROUTINE
\ HEXCODE
F6D0E638B0A5D0C6C6A22060
1A0D1B
081A021B1A1A64
LABEL
INCR
DECR
NOTUPDATE
FE
INSTRUCTION
JSR DISPLAYBCCCHANGE
CMP # ' 0 7BEQ DOWNCMP# 06BEQ UPBNE DISPCMP# 00STA COUNTBEQ DISP ^JSR INCR IDEC COUNT >BPLMOREBMI DISP )JSR INCR >JSR ZOOM
BNE DISP ?BEQ UP JJSR DECR >|JSR ZOOM IBNE DISP fBEQ DOWN JLDA#1FSTA0EJSR DISPLAYBCC STOP
L D A # 00RTSL D A # FF
L D A # FFSTA0ERTS
INSTRUCTION
INCCNTLBNE UPDATEINCCNTHSECBCS UPDATELDACNTLBNE NOTDEC CNTHDECCNTLLDX#IEJSR QHEXTD1RTS
COMMENTS
- START OF 001C- LOOK FOR KEY- CHECK IF CONTROL KEY CARRY
SET IF SO
INCREMENT NO OF TIME OF TEY
RAPID INCREMENT
RAPID INCREMENT
SET FOR ONE SCAN ONLY
CHECK IF KEY DEPRESSED CLEARIF ONE IS
RESET SO THAT JSR DISPLAYWAITS FOR INPUT
COMMENTS
ANOTHER TRAP FOR THOSE USED TO DIFFERENT juPs IS THE DECIMAL FLAG.INSTEAD OF A SINGLE "DECIMAL ADJUST" INSTRUCTION TO ADJUST THERESULT OF BINARY ARITHMETIC ON B.C.D. NUMBERS TO B.C.D. THERE ARETWO INSTRUCTIONSBYTES: 1 SED F8 "SET DECIMAL MODE"
1 CLD D8 "CLEAR DECIMAL MODE"WHICH INSTRUCT THE PROCESSOR TO DO AUTOMATICALLY (OR NOT DO) THEADJUSTMENT AFTER ARITHMETIC OPERATIONS. THIS RESULTS IN SHORTER,FASTER PROGRAMS FOR HANDLING B.C.D. ARITHMETIC WHICH, MERELYBY CHANGING THE DECIMAL MODE FLAG, Wl LL HANDLE BINARY ARITHMETIC.IN ORDER TO FULLY UTILISE THE /zP's POWER THE MONITOR SUBROUTINESFOR FETCHING KEYS & OUTPUTTING DATA TO THE DISPLAY HAVE BEENWRITTEN WITHOUT ARITHMETIC SO THEY MAY BE CALLED WITH THEDECIMAL FLAG SET OR CLEARED & THEY Wl LL NOT AFFECT IT.SO LET'S DO A DECIMAL ADDITION;
SEDCLCLDA Z 21ADC Z 20JSR FE60JMP FF04
OUR STANDARD PROGRAM HAS BEEN EXTENDED BACKWARDS BY ONE BYTE,THE SED INSTRUCTION. THIS SHOULD BE INCLUDED (BY ,0,0,2,F,$T<3-'—••-„THE FIRST TIME THE PROGRAM IS RUN, BUT MAY BE OMMITTED (K,0,0,3,0,4)ON SUBSEQUENT RUNS. THIS LITTLE PROGRAM Wl LL TELL US THAT22 + 11 = 33, IT Wl LL SAY THAT 35 + 26 = 61 AND THAT 50 + 51 = 01 WHOOPS!THE PROGRAM AT FE60 ONLY DEALS WITH PUTTING THE BYTE IN THEACCUMULATOR ON THE DISPLAY. IT PAYS NO ATTENTION TO THE CARRYFLAG, INDEED IT CHANGES THE STATE OF THE CARRY FLAG ITSELF, SOTHAT WE CANT IMMEDIATELY CALL FE60, HAVE IT WRITE ON THE DISPLAY& RETURN THEN WRITE OUT THE STATE OF THE CARRY SOMEHOW.WHAT WENEED IS:I SAVE THE CARRY FLAGII USE FE60III GET THE CARRY FLAG BACK & WRITE IT OUT SOMEHOWA FRENZIED SEARCH THROUGH THE MNEMONICS REVEALS THAT THERE ARENO MNEMONICS LIKE LDC (LOAD C) OR STC (STORE C)A CLOSER LOOK AT THE MICROPROCESSOR IS REQUIRED.
002 F00300081003300350038
F818A5 2165 2020 60FE4C04 FF
CHAPTER 3: INSIDE THE 6502SO FAR THE PROCESSOR'S INTERNAL WORKINGS ARE
3.1 THE ACCUMULATOR, PROGRAM COUNTER, STATUS REGISTER
15PC
0 BIT NUMBER
I A I ACCUMULATOR
0| PROGRAM COUNTER
~C~l CARRY FLAG
F D I DECIMAL MODE FLAG
THE CARRY & DECIMAL MODE FLAGS HAVE BEEN TREATED SEPARATELY TODATE. THEY ARE ACTUALLY MEMBERS OF A SPECIAL REGISTER CALLED THEPROCESSOR STATUS REGISTER^.
N V B D
INTERRUPT DISABLE
ZERO (THIS FLAG 1 WHEN0 SOMETHING HAS BECOME 00)
] — CARRY
DECIMAL FLAG
BREAK COMMAND EXECUTED
OVERFLOW
NEGATIVE
CAN WE, THEN, USE LDP & STP? NO, THEY DON'T EXIST EITHER.(FUME). INORDER TO SOLVE THIS PROBLEM WE MUST INTRODUCE THE STACK.DID YOU WONDER JUST WHAT HAPPENED TO PC DURING A JSR? YOU WERETOLD THAT IT WAS'SAVED'. WHERE? HOW? IT WOULD BE TERRIBLE TO HAVETO SPECIFY WHERE IT HAD TO BE STORED. WHAT'S NEEDED IS SOME PLACEWHERE IT CAN BE PUT DOWN AND PICKED UP AGAIN. IT WOULD BE GOOD TOALLOW NESTED SUBROUTINES:
ADDR HEXCODE
0213 95 100215 A9 610217 CA0218 10 02
021A A2 07021C 95 10021E 86 200220 A2 0E
0222 20 0C0225 C5 200227 F0 050229 CA022A D0 F6022C F0 E1022E A9 1C0230 A6 200232 95 100234 A9 FF0236 85 0E0238 20 0C023B 90 C3023D 4C 04023F
LABEL
INSERT
OLDX
FE WAIT
HIT
€>FF \
INSTRUCTION
STAZ X 10LDA#DUCKDEXBPLOLDX
LDX #07STAZ X 10STX Z 20LDX #TIME
JSR DISPLAYCMP Z 20BEQ H1TDEXBNEWAITBEQ REMOVELDA #DEAD DUCKLDX Z 20STAZ X10LDA#F,F.ST&Z 0EJSR DISPLAYBCC BEGINJMP RESTART
COMMENTS
PUT NEW DUCK ONIN NEW POSITIONBUT NOT OVER THE END OF THEDISPLAY
- DISPLAY INTERVAL IS SET BY THEBYTE LOADED INTO X
- HIT?
FINISHED WAITTIMEPUTIN A DEAD DUCK
TEST FOR CONTINUATION
OR BACK TO THE MONITOR
MISCELLANEOUS1THE COUNTER PROGRAM COULD BE USED AS A SUBROUTINE IN A LONGERPROGRAM WHEN "JSR INCR" AND "JSR DECR" WOULD INCREMENT ORDECREMENT THE DISPLAY. IF THE PROGRAM APPENDED IS ALSO ENTEREDTHE DISPLAY WILL INCREASE OR DECREASE RAPIDLY IF "UP" OF "DOWN"KEYS ARE DEPRESSED. THIS Wl LL BE STOPPED BY ANY HEX KEY. IT Wl LLINCREMENT BY THE INDICATED AMOUNT IF KEYS 1-F ARE DEPRESSED ANDWILL IGNORE ALL OTHER KEYS.YOU SHOULD PARTICULARLY NOTICE THAT A JSR DISPLAY RETURNS WITHTHE CARRY BIT CLEAR AND THE ACCUMULATOR HOLDING THE VALUE OFTHE KEY PRESSED FOR THE NUMERICAL KEYS, AND THE CARRY BIT SET ANDTHE VALUES 0-7 IN THE ACCUMULATOR FOR THE CONTROL KEYS. IFMEMORY LOCATION 0E, WHICH IS DEDICATED TO THE MONITOR AND SHOULDNOT NORMALLY BE USED IN PROGRAMS, HAS THE MOST SIGNIFICANT BITCLEAR THEN JSR DISPLAY Wl LL SCAN ONLY ONCE, IF IT IS SET IT Wl LL WAITFOR A KEY TO BE DEPRESSED BEFORE RETURNING TO THE PROGRAM. IT ISA GOOD IDEA TO LOAD IT WITH ' IF' IF YOU WISH TO USE THIS FACILITY ASOTHER VALUES MAY CAUSE YOU DIFFERENT PROBLEMS. AGAIN SEE THEREST OF THIS MANUAL IF YOU REALLY WISH TO UNDERSTAND THE PROCESS.
\DDR
027C027 E028002820284028602870289028B028D
028 F02910293029402960299029B029D029 F02A002A202A302A502AY02A902AC02AD02AE02 A F02B102B2
HE>C LABELCODE69466946694AB0C6D0A2
B595CA104CA9A295CA10D8A2A0B520
Q£CAD060
002A002B00
BF1FE803
24 BAT20
F900 0200 DSPGAP0710 CLEAR
FB
04mo**1F AROUND7A FEn
F6
INSTRUCTION COMMENTS
ADC #00LSR ANAL + 2ADC #00LSR ANAL+ 3ADC #00LSRABCSONEOFF - NOT A GOOD MOVEDEC COUNTBNECONT - KEEP CHECKING THE MOVELDX#03 - GOOD MOVE, TRANSFER TO
ACTUAL STACKSLDA2X POSSSTAZX STACKDEXBPL BATJMPHUMMOV - OPPONENT.LDA#00LDX #07STAZXD - CLEAR THE DISPLAY FIRSTDEXBPL CLEARCLD - CLEAR DECIMAL MODELDX #04 - DISPLAY STACKSLDY#01 0"?LDAZX STACK - 1JSR HEXTDhNY 3>e VWY T>£ yDEXBNEAROUND
THE DUCKSHOOT GAME IS A SPEED TEST: YOU HAVE TO SHOOT THE FLYINGDUCKS. THEY SUCCESSIVELY ENTER FROM THE RIGHT AND FLY TOWARDSTHE LEFT AT A SET SPEED. YOU SHOOT A DUCK BY PRESSING ITS CURRENTPOSITION ON THE KEYBOARD. THE LEFT MOST DISPLAY IS 0,THE RIGHTMOSTDISPLAY IS 7. WHEN A DUCK IS HIT IT DIES. THE GAME MAY BE RESTARTEDWITH ANY HEX DIGIT KEY
DUCK
ADDR
02000202020402060208020A020C020D020F0211
SHOOT
HEX
CvJucA9 1F85A9A28695CA10A9A6
0E00072010
FB0020
LABEL
BEGIN
CLEAR
REMOVE
INSTRUCTION
LDA#1FSTA Z 0ELDA #00LDX #07STX Z 20STAZX 10DEXBPL CLEARLDA #00LDX H 20
COMMENTS
- SINGLE SCAN DISPLAY ROUTINE
- CLEAR THE DISPLAY
- TAKE THE OLD DUCK OFF
MAIN PROGRAM
JSR ALBERT ALBERT PROGRAM
JSR ALGERNON - ALGERNON PROGRAM
RTS RTS
WE CANT JUST SAY THAT PC IS TO BE SAVED IN LOCATION, SAY, L & M - W EWOULDN'T GET BACK FROM ALBERT SINCE THE CALL TO ALGERNON WOULDHAVE DESTROYED THE NECESSARY INFORMATION IN L & M. (IT IS WORTHNOTING HERE THAT L & M COULD BE " C A L L E D " - 2 " C A L L E D " - 1 . THEN ACALL TO ALBERT AS A SUBROUTINE WOULD STORE THE RETURN ADDRESSJUST BEFORE THE START OF ALBERT ALLOWING NESTED SUBROUTINES ASABOVE. A PROBLEM IS THAT THIS DOES NOT WORK WITH READ ONLYMEMORY, LIKE THE MONITOR).3.2 THE STACK POINTERWE NEED SOMETHING WHICH WILL DECIDE WHAT L & MARE TO BE,DEPENDING ON WHICH SUBROUTINE WE ARE IN.AN OBVIOUS CHOICE IS TOUSE AN ARRAY OF MEMORY LOCATIONS, AND A VARIABLE WHICH POINTS TOTHE CURRENT LOCATION OF L & M.EACH TIME WE DO A JSR WE STEP UP THEPOINTER & EACH TIME WE DO AN RTS WE STEP IT DOWN.
RETURN ADDRESS ARRAY
[POINTER I '
WITH ACORN WE'LL NEED TWO BYTES FOR EACH RETURN ADDRESS. THIS ISNO TROUBLE, WE JUST INCREMENT & DECREMENT THE POINTER TWICE. THEWHOLE PROCESS IS CARRIED OUT BY THE PROCESSOR AUTOMATICALLY ONEACH JSR & RTS, THE POINTER IS CALLED THE STACK POINTER AND IS ASPECIAL8 BIT REGISTER INSIDE THE PROCESSOR. THE ARRAY IS USUALLYCALLED A STACK SINCE IT CAN ALSO BE USED TO STORE THINGS OTHERTHAN RETURN ADDRESSES. THE ACTUAL STACK RUNS FROM 01 FF DOWN TO01)00, AND IT STARTS AT THE TOP: AN EMPTY STACK HAS STACK POINTERAT FF. A BYTE IS PUT ON THE STACK AND THE POINTER IS DECREMENTED TOPOINT AT THE NEXT LOCATION; THE POINTER IS INCREMENTED AND A BYTELOADED FROM THE STACK IN THE REVERSE OPERATION. NO CHECK IS MADEFOR THE 00 TO FF DECREMENT INDICATING AN OVERFLOWED STACK, SOPROGRAMS THAT REQUIRE MORE THAN 256 BYTES OF STACK SPACE Wl LLMYSTERIOUSLY FAIL. SINCE THIS IS 128 CONSECUTIVE JSR'S, THE PROBLEMWONT BE ENCOUNTERED VERY OFTEN.. .NOW THE PROCESSOR STATUS REGISTER CAN BE PUSHED ONTO THE STACK:
PLP 28 "PULLP"PHP 08 "PUSH P"
AND SO WE MAY SAVE IT BEFORE A SUBROUTINE CALL AND RECOVER IT
AFTERWARDSPHPJSR. . . .PLP
THE SEQUENCE OF STACK OPERATIONS IS
TOPTOP
TOP
PCHPCL
TOP
PCHPCL
TOP
PCHPCL
PHP JSR PROGRAM OPERATES RTS PLP
SO WE HAVE NOW MANAGED TO SAVE THE CARRY FLAG, USE FE60, ANDREGAIN THE CARRY FLAG. WE WISH TO WRITE IT OUT, SO IT WOULD HAVEBEEN BETTER TO WRITE.
PHPJSR FE60PLA PULL BYTE FROM STACK INTO A
SINCETHISGIVESTHE CARRY FLAG IN A, AS THE LEAST SIGNIFICANT BIT,TO GET RID OF THE REST OF THE BITS OF THE RECOVERED STATUSREGISTER, WE CAN SIMPLY AND # 01. NOW A CONTAINS 0 OR 1 DEPENDINGON THE CARRY FROM ORIGINAL SUM. OUR PROGRAM NOW IS
SED SET UP FOR DECIMAL ADDCLCLDA Z 21 DOITADC Z 20PHP SAVE CARRYJSR FE60 WRITE OUT TWO DIGITS
ON DISPLAYS6&7
ADDR
021002120214021502160218021A021C021E021 F0221022202230224022502270229022B022 E023002320235023602380239023B023D023F
HEX LABELCODE29 7F95 11E8E8E0 0790 E9A2 00F0 E5A8 MINUSF0 E88A4AAA38B5 20E5 0D95 2020 99 02 COMMOV84 0EA2 0020 0C FE WAITCAD0 FACA86 0EA0 03A2 03B5 20
0241 95 240243 CA0244 10 F90246 A2 030248 B5 24
NEXTSBLOCK
ONEOFFBRICK
«•
PLAAND #01 A = 0 (NO CARRY FROM SUM)
OR A = 1 (CARRY FROM SUM)
NOW ALL WE NEED TO DO IS WRITE OUT THE ACCUMULATOR ON DISPLAYNO.5. THE WAY WE WROTE OUT THE FIRST TWO DIGITS OF THE RESULT WASTO USE A MONITOR SUBROUTINE WHICH DID JUST THAT. YOU'VE PROBABLYNOTICED THAT THE MONITOR ONLY PUTS A DOT ON DISPLAY 5 (THE 3RD
024A 95 28024C CA024D 10 F9024F A2 030251 B9 24 000254 380255 E9 000257 99 24 00025A 99 28 00025D B0 12025F 880260 10 DB0262 B5 200264 F0 050266 D6 200268 4C 00 02026B CA026C 10 F4026E 4C 04 FF0271 A9 04 CHECK0273 85 1F0275 A9 00 CONT0277 46 280279 2A027A 46 29
o l
TRY
EMPTY
INSTRUCTION
AND#7FSTA2X D + 1INXINXCPX #07BCCSHIFTPTLDX #00BEQSHIFTPTTAYBEQ CHEATTXALSRATAXSECLDAZX STACKSBC KEYSTAHX STACKJSR DSPGAPSTY REPEATLDX #00JSR DISPLAYDEXBNE WAITDEXSTX REPEATLDY #03LDX #03LDAHX STACK
STA2X POSSDEXBPLBLOCKLDX # 0 3LDA2X POSS
STA2X ANALDEXBPLBRICKLDX #03LDA, Y POSSSECSBC #01STA, Y POSSSTA, Y ANALBCSCHECKDEYBPLNEXTSLDAZX STACKBEQ EMPTYDECZX STACKJMP HUMMOVDEXBPLTRYJMP RESTARTLDA #04STA COUNTLDA #00LSR ANALROLALSR ANAL+ 1
COMMENTS
- MOVE FORWARD
- END OF STACKS?
- PREVENT ZERO FROM BEING USED
- ADDRESS OF REQUIRED STACK
- DO THE PLAYER'S MOVE
- SHOW STACKS
- THINKING TIME
- CLEAR REPEAT STATUS
- TRANSFER STACK TO POSS- POSS REPRESENTS THE POSSIBLE
COMPUTER- MOVES
TRANSFER POSS TO ANALANAL REPRESENTS THE MOVEBEINGANALYSED
POSS CONTAINS POSS IB LE MOVEANAL CONTAINS POSSIBLE MOVE
- TRY ALL STACKS- CHECK IF STACK EMPTY
- MAKE DESPERATE MOVE
- LOST.
- EVALUATE MOVE
ADDR
02070209020B020D020 E
HEX LABELCODEE0 07D0 F785 1760
GAMES PROGRAMS1
INSTRUCTION
CPX #07BNE LOOPSTA Z D + 7RTS.
COMMENTS
- KEEP GOING- NEW DATA
NIM ISATRADITIONALGAME INWHICHTHE PLAYERS ALTERNATIVELY REMOVESTICKS, OR COINS, OR WHATEVER FROM ONE OF SEVERAL STACKS. THEONLY RULES ARE THAT YOU MUST TAKE AT LEAST ONE PIECE PER MOVEAND THAT YOU CAN ONLY REMOVE PIECES FROM ONE STACK PER MOVE.THERE IS A WELL-DEFINED STRATEGY FOR OPTIMAL PLAY BUT THIS DOESNOT GUARANTEE A WIN UNLESS THE OPPONENT MAKES A MISTAKE OR THEINITIAL SITUATION IS AGAINST HIM. THE COMPUTER PLAYS WELL BUT, WITHLUCK, CAN BE BEATEN. THE WINNER IS THE PLAYER WHO REMOVES THELAST PIECE
IN THIS VERSION OF THE GAME THERE ARE FOUR STACKS OF FROM 0-FPIECES. YOU MUST ENTER THE SIZE OF YOUR STACKS IN MEMORYLOCATIONS20-23 BEFORE STARTING THE GAME. THE GAME STARTS AT 002FAND YOUR MOVE OR 0180 AND THE COMPUTER'S MOVE. ON RUNNING, THEDISPLAY WILL SHOW A- B C D WHERE A,B,C,D ARE THE CONTENTS OFTHE STACKS. ANY CONTROL KEY Wl LL MOVE THE POINTER (FULL STOP)AROUND THE STACKS. WHEN IT POINTS TO THE STACK FROM WHICH YOUWISH TO REMOVE PIECES PRESS THE KEY CORRESPONDING TO THE NUMBERYOU WISH TO REMOVE. ZERO IS I LLEGAL AND WILL NOT BE ALLOWED. IFYOU SUBTRACT MORE PIECES THAN ARE IN THE STACK THE GAME WILL GETVERY CONFUSED.AFTER REMOVALOF PIECES THE DISPLAY WILL SHOW THE CURRENTSITUATION AND THE COMPUTER Wl LL MAKE ITS MOVE.CONTINUE UNTIL SOMEONE (SOMETHING?) WINS.YOU MIGHT LIKE TO TRY AND WRITE SUBROUTINES TO PRINT MESSAGESON THE DISPLAY IN THE EVENT OF EITHER A HUMAN OR COMPUTERVICTORY. A CHECK WOULD HAVE TO BE INSERTED TO DECIDE ACOMPUTER WIN BUT THE JUMP FOR A HUMAN WIN IS ALREADY THEREUNDER THE MNEMONIC JMP MESSAGE, THOUGH THE CODE IN FACT JUMPSTO THE HUMAN MOVE.
NIM
02000203020502070209020C020E
20B509952090B5
991180110C1011
02
FE
HUMMOVSHIFTPT
CHEAT
JSR DSPGAPLDZX D + 1ORA#80STAZX D + 1JSR DISPLAYBCC MINUSLDAHX D + 1
NOT RELOCATABLECLEAR DECIMALDISPLAY STACKSSET DECIMAL POINT ON
WAIT FOR INPUT
REMOVE CURRENT DECIMAL POINT
FROM THE RIGHT) AND SUSPECT THAT IT CAN'T PUT ANYTHING ELSE THERE.THIS IS TRUE, BUT IT DOESN'T MEAN THAT THERE ISN'T A MONITOR SUB-ROUTINE THAT CAN DO THE JOB. SUCH A SUBROUTINE LIVES AT FE7A. IT ISDESIGNED TO PUT THE LOWEST FOUR BITS OF THE ACCUMULATOR ONTOANY OF THE DISPLAYS, ASA READABLE CHARACTER. THIS IS JUSTWHATWENEED - BUT HOW DO WE TELL THE SUBROUTINE WHICH DISPLAY TO USE?
3.3 THE INTERNAL REGISTERS X ANDY.WELL, BACK TO THE/iP. THIS IS WHAT IT LOOKS LIKE INSIDE
7
A
BIT NUMBER
ACCUMULATOR
15Y
J X-REGISTER l lNDEX~\ Y-REGISTER /REGISTERS
PC PROGRAM COUNTER
STACK POINTER
PROCESSOR STATUS
TWO NEWCOMERS, YOU'LL NOTICE! X & Y ARE'INDEX REGISTERS', THEY Wl LLBE DEALT WITH MORE THOROUGHLY IN A FEW MORE PAGES, BUT WHATMATTERS NOW IS THE USE FE7A MAKES OF THEM:I FE7A NEITHER CARES ABOUT, NOR CHANGES XII FE7A DOESN'T CHANGE Y, BUT THE DISPLAY IT PUTS A ONTO ISCONTROLLED BY Y THAT IS, THE LOWER 4 BITS OF A ARE TRANSFORMEDINTO THE CORRECT SEQUENCE OF BITS TO REPRESENT THEIR HEXADECIMALCHARACTER AS IT SHOULD APPEAR ON THE 7 SEGMENT DISPLAY. THEN THISIS STORED IN MEMORY TO AWAIT THE SUBROUTINE WHICH ACTUALLY PUTSTHINGS ON DISPLAY.ALTHOUGH FE7A MAKES NO RESTRICTIONS ON THE SIZE OF Y, THE MONITORSUBROUTINE WHICH DISPLAYS THEM ONLY KNOWS ABOUT THE FIRST 8(NUMBERED. OF COURSE, 0-7) OF THEM, IN LINE WITH THE ACTUAL DISPLAYHARDWARE. DISPLAY 0 IS THE LEFTMOST, DISPLAY 7 IS THE RIGHTMOST.TO KEEP THE MONITOR AS EFFICIENT AS POSSIBLE THE SUBROUTINE ATFE60 USES FE7A. IT FOLLOWS THAT IT MUST HAVE LOADED Y WITH 7 & 6,AND SINCE FE7A DOESN'T CHANGE Y, Y IS STI LL SET TO THE LAST USED OFTHESE WHICH IS 6. SO. INSTEAD OF USING
LDY#05 A0 05 "LOAD Y WITH THE NEXT BYTE" (05 HERE)WE CAN USE
DEY 88 "DECREMENT (IN HEXADECIMAL) Y BYONE"
TO SET Y TO 5, THUS SAVING A WHOLE BYTE! (BUT NO TIME, THE TWOINSTRUCTIONS ARE EXECUTED IN THE SAME TIME, 2/xS). THE COMPLETEPROGRAM IS
SEDCLCLDA £21ADC Z 20PHPJSR FE60PLAAND # 0 1DEYJSR FE7AJMP FF04
002 F F80030 180031 A5 210033 65 200035 080036 20 600039 68003A29 01003C 88003D20 7AFE0040 4C04FF
FE
AND SO, AT LAST, WE FIND THE ANSWER TO501O + 501O IS
K. 002F 100
PERHAPS WE SHOULD HAVE CLEARED THE DISPLAY? OR MADE IT SHOW THENUMBERS TO BE ADDED TOGETHER? OR ACTUALLY FETCHED THE TWONUMBERS USING KEYBOARD AND DISPLAY LIKE THE MONITOR DOES? ORSOME COMBINATION OF THESE?
3.4 MAKING OUR PROGRAM 'FRIENDLY'USING THE MONITOR SUBROUTINE AT FE88 IT IS EASY TO DO THE THIRDOPTION. FE88 IS THE ROUTINE WHICH FETCHES 4 DIGIT NUMBERS,TERMINATED BY ANY COMMAND KEY, INTO THE TWO BYTES IN ZERO PAGEX & X + 1 [i.e. IF X CONTAINS 20, INTO 0020 (LOW BYTE = RH PAIR OFNUMBERS) & 0021] JUST WHAT WE NEED!002A002B002D003000310033003500360039003A003C003D0040
F8A2 2020 88FE18A5 2165 20082060 FE6829 018820 7AFE4C04 FF
SEDLDX# 20JSR FE88CLCLDAZ21ADC Z 20PHPJSR FE60PLAAND#01DEYJSR FE7AJMP FF04
ONCE AGAIN THE PROGRAM HAS BEEN EXTENDED BACKWARDS SINCE THEGREATER PART OF IT HAS ALREADY BEEN ENTERED (UNLESS YOU'VESWITCHED OFF AND LOST IT ALL)RUNNING THIS PROGRAME (G0,0,2,A, k ) PRODUCES
K. 5 05 0 (ON THE ASSUMPTION THAT 0020 &0021 STILLCONTAIN THE 50S ADDED TOGETHER AS BEFORE)
THE Fl RST PROGRAM, TEST, IS TRIVIAL: IT JUST SENDS A PARTICULAR BYTETO TAPE REPETETIVELY. IT MUST BE STOPPED BY RESET. RECORD A FEWMINUTES OF THIS,THEN LOAD IT USING LOAD. DEVIATIONS FROM THESTATIONARY PATTERN ARE EASY TO SEE. THE SECOND PROGRAM, RETAG,IS RELOCATABLE. IT ACTS JUST LIKE THE MONITOR'S STORE ROUTINE,EXCEPT THAT IT ASKS FOR AN EXTRA ADDRESS. THE DATA WHICH ISSTORED IS THAT STARTING AT THIS LAST ADDRESS, IT PRETENDS TO BESITUATED BETWEEN THE FIRST TWO ADDRESSES. INCORPORATE THEREQUIRED STATE OF ZERO PAGE REGISTERS IN FRONT OF YOUR DATA,THEN TOAD AND AUTO RUN' PROGRAMS MAY BE CREATED.
NOT RELOCATABLETAPE PROGRAMS
ADDR HEX LABELCODE
0200 A9 55 TEST0202 20 B1 FE0205 4C 00 020208 A9 F1 RETAG020A 85 10020C A2 06020E 20 88 FE0211 A2 080213 86 100215 20 88 FE0218 A9 46021A 85 10021C A2 20021E 20 88 FE
0221 A2 040223 B5 05 ADRSS0225 20 B1 FE0228 CA0229 D0 F8022B A0 00 DATAS022D B1 20022F E6 20
0231 D0 020233 E6 210235 20 B1 FE NOI1NC0238 20 A0 FE023B D0 EE023D 4C 04 FF0240
INSTRUCTION
LDA #55JSR PUTBYTEJMP TESTLDA#F1STADLDX #06JSR QDATFETLDX #08STX DJSR QDATFETLDA #46STADLDX #20JSR QDATFE7
LDX #04LDA Z,X 05JSR PUTBYTEDEXBNE ADDRSSLDY #00LDA(20),YINC 20
BNENOINCINC 21JSR PUTBYTEJSR COM16BNE DATASJMP RESTART
COMMENTS
- THE TEST BYTE- SEND IT- KEEP SENDING IT- F. PROMPT
FIRST ADDRESS
PROMPTSECOND ADDRESS
PROMPT
- LAST ADDRESS: ACTUAL DATASTART
- SEND FAKE ADDRESSES
PROPER DATAINCREMENT PROPER DATACOUNTER
SEND DATACHECK FAKE ADDRESSES FOR END
THE SCROLL PROGRAM SHIFTS THE WHOLE DISPLAY ONE LEFT, ANDENTERS THE NEW INFORMATION, IN A, ON THE FAR RIGHT.SCROLL
^DDR
0200020202040206
HEXCODEA2 00B4 1194 10E8
LABEL
LOOP
INSTRUCTION
LDX #00LDY ZX D + 1STY ZX DINX
COMMENTS
- MUST GO FORWARDS- PICK-UP DATA ON RIGHT- & MOVE IT ONE LEFT
025A 00 71025D 50 00025F
77
THE RELOCATOR FIRST FETCHES THE THREE ADDRESSES IT REQUIRES, THEADDRESSES OF THE START & END OF THE MEMORY SECTION TO BE MOVED,AND THE ADDRESS OF THE START OF THE AREA TO WHICH THE MOVE IS TOTAKE PLACE. THE PROMPTS ARE F., & t RESPECTIVELY. AFTERTERMINATING THE LAST ADDRESS, THE MOVE TAKES PLACE. MOVES UP BYLESS THAN THE LENGTH OF THE MATERIAL TO BE USED WILL NOT BESUCCESSFUL (I.E. t - F ., IF POSITIVE, SHOULD BE GREATER THAN - t )
RELOCATORADDR
02000202020402060209020B020D020 F
0212021402160218
021B021D021 F02210222022402260229022B022D
HEXCODEA286A220A286A220
A286A220
A2A191C8D0E620D04C
F110208846102288
78102488
1A0624
0225A0F204
LABEL
FE
FE
FE
MOVE
FE NOINC
FF
INSTRUCTION
LDX #F1STXZ DLDX #20JSR QDATFETLDX #46STXZ DLDX #22JSR QDATFET
LDX #78STXZ DLDX #24JSR QDATFET
LDX #1ALDA (06,X)STA (24,Y)INYBNE NOINCINC 2 25JSR COM16BNE MOVEJMP RESTART
COMMENTS
- SET UP FROM PROMPT F.
- AND GET ADDRESS
- SET UP END PROMPT
- AND GET SECOND ADDRESS-MOVE THE DATA BETWEEN THESEADDRESSES
- SET UP TO PROMPT
- AND GET BASE ADDRESS-MOVETO HERE & SUCCESSIVELOCATIONS
- DO THE MOVE
- INCREMENT THE TO ADDRESS
- USECOM16TO DO THE LIMIT TES1
YOU SHOULD ENTER THE TWO PAIRS OF NUMBERS YOU WISH ADDEDTOGETHER AS IF THEY FORMED AN ADDRESS. TERMINATING YOUR ENTRYWITH k INSTANTLY PRODUCES THE RESULT
K. 5 05 0 100
LOOKING BACK OVER THE PROGRAM, AND EXAMINING THE MONITORLISTING,WILLREVEALTHAT IT TOOK AD 1 6 (OR 1731O) BYTES OF CODE TOACHI EVE THIS. THE ACTUAL OPERATION USED 6 BYTES OF CODE (SED; CLC;LDAZ; ADC Z) WHILE THE OTHER 1671O ARE THERE 'MERELY'TO DISPLAYTHE RESULT& FETCH THE INFORMATION NEATLY(THE CODE CALCULATIONSDO NOT CONSIDER THE 161O BYTES OF CHARACTER FONT OR THE 11 1 O
BYTES OF TEMPORARY STORAGE ALSO USED)
CHAPTER 4: THE REMAINDER OF THE INSTRUCTION SET4.1 BRANCHESTHINKING ABOUT THE FE88 PROGRAM, YOU SHOULD REALIZE THAT IT DOESSOMETHING OF THE FORM
FETCH NEXT KEYi f KEY IS A COMMAND KEY THEN RETURN
THIS IS A CONDITIONAL TRANSFER OF CONTROL AND REPRESENTS SOMENEW INSTRUCTIONS AND A DIFFERENT WAY OF CHANGING THE PROGRAMCOUNTER. AN OPERATION LIKE ADC DOES MORE THAN ADDING TWO BYTESAND THE CARRY FLAG TOGETHER AND OUTPUTTING A CARRY. IT ALSO SET!SOME OF THE OTHER FLAGS IN P:
THE £ FLAG IS SET IF THE RESULTING BYTE WAS ZEROTHE V FLAG IS SET IFTHERE WAS A 2'S COMPLEMENT OVERFLOWTHE N FLAG IS SET IF THE RESULT WAS A NEGATIVE 2'S COMPLEMENTNUMBER - I.E. BECOMES BIT 7 OF THE RESULT.
THESE FLAGS ARE ABLE TO CAUSE CONDITIONAL TRANSFER BY USINGTHE APPROPRIATE ONE OF THE EIGHT 'BRANCH' INSTRUCTIONS. THEMECHANISM EMPLOYED IS TO PERFORM A 2'S COMPLEMENT ADD BETWEENTHE PROGRAM COUNTER AND THE SECOND BYTE OF THE BRANCHINSTRUCTION THUS PERMITTING THE TRANSFER TO BE -128. . . +127 BYTESFROM THE NEXT INSTRUCTION. THIS IS CALLED 'RELATIVE ADDRESSING'AND IS A POSITION INDEPENDENT METHOD OF TRANSFER, THE EIGHTBRANCH INSTRUCTIONS ARE ASSOCIATED TWO TO EACH OF THE C, 2, V &N FLAGS, ONE OF WHICH BRANCHES IF THE FLAG IS SET, THE OTHERBRANCHES IF IT IS CLEAR.
TO CLARIFY THIS LET'S LOOK AT AN EXAMPLE:"BRANCH IF CARRY SET"SET CARRY
* + 0 ^BCS 03* + 2 SEC* + 3 " ^ C S 0 1* + 5 L i C L C CLEAR CARRY* + 6 U(THE ARROWS ARE PUT IN FOR CLARITY)WE'LL NEED TO CONSIDER THIS PROGRAM BOTH WITH THE CARRY SET &WITH IT CLEARI CARRY IS CLEAR
INSTRUCTION I DOES NOT TRANSFER CONTROL SO WE DO INSTRUCTION I I ,SEC,NOW INSTRUCTION III TRANSFERS CONTROL SINCE THE CARRY IS NOWSET. 01 IS ADDED TO THE PC (= * + 5) TO GIVE* + 6 AS THE ADDRESS OF THENEXT INSTRUCTION.
II CARRY IS SETINSTRUCTION I TRANSFERS CONTROL. 03 IS ADDED TO THE PC (= * + 2) TOGIVE * + 5 AS THE ADDRESS OF THE NEXT INSTRUCTION, INSTRUCTION IV.CLC.
SO IF THE CARRY WAS CLEAR IT IS SET; IF IT WAS SET IT IS CLEARED, SO THEPROGRAM COMPLEMENTS THE CARRY (THERE ARE QUICKER METHODS,INDEED IT CAN BE DONE WITH 3 INSTRUCTIONS IN 4 BYTES)*AND WE CAN GO BACKWARDS:
0235
BCSI SECT BCS
CLCFB
BRANCH IF CARRY SETSET CARRYBRANCH IF CARRY SETCLEAR CARRY
IF THE CARRY IS SET THE PROGRAM IS AS BEFORE IF IT IS CLEARED WE SET IT& BRANCH FB
/ 2's COMPLEMENT ADD * + 5 \_ £ B +
\ *+0 /-BACK TO THE BEGINNING. A RATHER COMPLICATED WAY OF CLEARINGTHE CARRY.MOST OF THE NON-BRANCH INSTRUCTIONS Wl LL CHANGE SOME OF THESE 4TESTABLE FLAGS, USUALLY THE N & Z FLAGS SINCE THEY CONSTANTLYMONITOR THE STATUS OF OPERANDS SO BRANCHES Wl LL APPEAR RATHERFREQUENTLY IN PROGRAMS.
4.2 INDEXINGIF YOU WISHED TO CLEAR (SET EACH BYTE TO 0) A PATCH OF MEMORY, e.g.THE MEMORY USED TO STORE THE DATA WHICH IS TO BE OUTPUT TO THEDISPLAYS, WHICH IS FROM 0010 TO 0017, YOU MIGHT THINK
LDA# 00 LOAD ACCUMULATOR IMMEDIATE WITH 00STAZ10 STORE ACCUMULATOR IN ADDRESS 0010STA Z 11 STORE ACCUMULATOR IN ADDRESS 0011STA 2 12 STORE ACCUMULATOR IN ADDRESS 0012
STA 2 17 STORE ACCUMULATOR IN ADDRESS 0017IS NECESSARY. THIS LOOKS SUFFICIENTLY REGULAR THAT THE COMPUTERSHOULD BE ABLE TO DOT IT. THIS IS WHERE THE INDEX REGISTERSREAPPEAR. WE CAN STORE THE ACCUMULATOR INDEXED BY EITHER INDEXREGISTER
STAZ,X 95 "STORE A INDEXED BY X IN ZEROPAGE"
STAZ,X 10
THE OFFSET CALCULATOR CALCULATES THE OFFSET TO BE ENTERED ASTHE SECOND BYTE OF A BRANCH INSTRUCTION. IT WILL PROMPT WITHXX0000XX AND YOU SHOULD ENTER THE ADDRESS OF THE BRANCHINSTRUCTION. AFTER A CONTROL KEY IT WILL PROMPT AGAIN WITHXX1111XX AND YOU SHOULD ENTER THE ADDRESS YOU WISH TO BRANCHTO. THE REPLY WILL BE EITHER "OFFSET XX" WHERE XX IS THE VALUE TOBE ENTERED, OR "TOO FAR" IF THAT IS THE CASE. A CONTROL KEYRESTARTS THE SEQUENCE.
OFFSET CALCULATOR NOT RELOCATABLEADDR
020002010203020502070209020B020E02100212021402160219
021B021D021 F022102230224022602280229022B022D022F023102320235
0236
0239023C023E
0241024402460248024A024D024E0250025102540257
HE>CODED8A9858484A220A98585A220A5
E985B0C638A5E5AAA5E5D0A9208A49
20
4CA920
4C85A0B1998810605CED78
022122232288112425248822
7E220323
2422
25230E5144
80
60
045744
0120072010
F8
71795C
LABEL
AGAIN
FE
FE
HSUB
02
FE
FFTOOFAR
02
02MESSAGE
LOOP00
71785C
INSTRUCTION
CLDLDA #02STAMESSHSTY FROMHSTY FROMLLDX#FROMLJSR QDATFETLDA #11STA TO LSTA TOHLDX #TOLJSR QDATFETLDAFROML
SBC #7ESTA FROMLBCS HSUBDECFROMHSECLDATOLSBCFROMLTAXLDA TOHSBC FROMHBNETOOFARLDA #51JSR MESSAGETXAEOR #80
JSR RDHEXTD
JMP RESTARTLDA #57JSR MESSAGE
JMP AGAINSTA M ESS LLDY #07LDA (MESSL),YSTA D, YDEYBPL LOOPRTS
COMMENTS
- INITIALIZE MESSAGE POINTER- SET UP PROMPT
- FETCH FIRST ADDRESS- SET UP 2ND PROMPT
- FETCH SECOND ADDRESS- OFFSET TO MAKE OVERLENGTH
C A OS/
LASY- CARRY KNOWN SET BY QDATFET
- DONTSETTHE CARRY AGAIN!
- CALCULATE THE LENGTH
- PRINTOUT
- COMPLEMENT TOP BIT BECAUSE OFTHE OFFSET APPLIED
- PRINTOUT ANSWER, OVERWRITING THE
- FINISHED- WHOOPS- TELL THE PROGRAMMER THAT IT'S
WRONG- AND GET IT DONE AGAIN- MESSAGE DESCRIBED BY A- EIGHT BYTES OF DATA TO DISPLAY- FETCH THEM
- THE DATA
THE HEXADECIMAL TO DECIMAL CONVERTER PROMPTS WITH XX0000XXAND AFTER A CONTROL KEY IS PRESSED WILL PROVIDE AN ANSWER IN THEFORM ????????, AFTER A WAIT!THE PROGRAM WORKS BY DECREMENTING THE HEX. NUMBER ANDINCREMENTING THE DECIMAL NUMBER UNTILTHE HEX. NUMBER REACHESZERO.THIS PROGRAM, LIKE THE DECIMAL TO HEX. CONVERTER, WHICH USESVIRTUALLY THE SAME METHOD, ILLUSTRATES THE USE OF THEDECIMAL MODE, AN IMPORTANT FACET OF THIS PROCESSOR.THEY ALSO PROVIDE AN EXCELLENT DEMONSTRATION OF THE TRADEOFFFREQUENTLY FOUND BETWEEN PROGRAM LENGTH AND SIMPLICITY, ANDPROGRAM EXECUTION TIME. THE METHOD USED IS BOTH SHORT AND SIMPLE,BUT CAN TAKE UP TO THREE SECONDS FOR SOME CALCULATIONS. A MUCHLONGER AND MORE COMPLEX (RELATIVELY) PROGRAM COULD HAVE BEENWRITTEN BASED ON ABCD = A(16*16*16)+B(16*16)+C(16)+D AND WOULD HAVEBEEN VIRTUALLY INSTANTANEOUS.
HEX-*
ADDR
02000202020402060209020A020C020E02100212021402160218021A021B021C021E021F022002220223022502270229022B022D022F0232023302350238023A
•DEC
HEXCODE8484A220F8A286A5D0A5F0C6C6189869A88A69AA90E6B08486A22088A5204C
20212088
0022200621132120
01
00
E922E520212064
227A04
LABEL
FE
DECRHEX
NODEC
DEAD
FE
FEFF
INSTRUCTION
STYZ HEXLSTY Z HEXHLDX#HEXLJSR QDATFETSEDLDX #00STX Z DECOUTLDAZ HEXLBNE NODELLDA2 HEXHBEQDEADDECZ HEXHDECZ HEXLCLC >TYAADC #01TAYTXAADC #00TAXBCC DECRHEXINC 2 DECOUTBCSDECRHEX >STYZ HEXLSTX Z HEXHLDX #HEXLJSR QHEXTD1DEYLDAZ DECOUTJSR HEXTDJMP RESTART
COMMENTS
- SET UP ZERO PROMPT—
- AND FETCH THE DATA- DECIMAL MODE- SETX & Y & DECOUT TO ZERO
- TEST FOR ZERO,THENDECREMEh
- IFHEXNO.ISZERO,THENFINISHE
ADD 1 TO THE DECIMAL NUMBER' USING X & Y AS TWO BYTE
ACCUMULATOR
- FINISHED,SO STORE X & Y
- DISPLAY 4 DIGITS
- DISPLAY 5 DIGIT
10
X =07, SAY
000F00100011001200130014001500160017
A IS STORED IN 17 WHICH IS 10 THE "BASE ADDRESS"+07 THE "INDEX"
IF WE DOA2 07 LDX # 0795 10 STAZ,X10THE STORE IS TO LOCATION 17 (=10 + X). THE ADDITION IS STRAIGHT-FORWARD BINARY,TRUNCATEDTOA LOCATION IN ZERO PAGE SO
LDX# FFSTAZ,X 10
STORES IN LOCATION 0FWE ALSO HAVE
"STORE A INDEXED BY X""STORE A INDEXED BY Y"
9D99
STA, XSTA, Y
(BUT NO STA Z, Y) WHICH DO NOT NEED TO TRUNCATE THE ADDITIONTHEY EXPECT A TWO BYTE ADDRESS SO
LDX# FFSTA, X 0010
STORES IN LOCATION 010FNOW
DEX CA "DECREMENT (IN HEX) X BY ONE"SETS THEZ FLAG IF X IS ZERO, & THE N FLAG EQUAL TO BIT 7 OF X.
BPL 10 "BRANCH IF PLUS"TAKES THE BRANCH IF THEN FLAG IS CLEAR I.E. IS SAYING'NOT NEGATIVE'I.E. PLUS. IT'S EASY TO SE'E THAT THE COMBINATION
DEXBPL FD
DECREMENTS X ONCE, AND, IF THE RESULT WAS POSITIVE (I.E. IN THERANGE 0 - 7 F ) IT TAKES THE BRANCH AND DECREMENTS X AGAIN ANDAGAIN UNTIL IT REACHES A NON-POSITIVE NUMBER, WHICH Wl LL BE FF,WHEN IT DOESN'T TAKE THE BRANCH. IF WE START AT 7 AND EACH TIMEAROUND THE LOOP CLEAR THE RELEVANT DISPLAY:CODE LABEL MNEMONICSA9 00 LDA#00A2 07 LDX #0795 10 LOOP: STA Z, X 10——i
CA10 FB
DEXBPL LOOP
COMMENTLOAD ACCUMULATOR IMMEDIATELOADX IMMEDIATESTORE-* IN ZERO PAGE INDEXEDBYX *DECREMENT X BY ONEBRANCH IF PLUS TO "LOOP"
SO WE CAN WRITE A VERY SHORT PROGRAM TO CLEAR THE DISPLAY. BYMAKING THE LOOP SLIGHTLY LARGER (WITH THE SAME LENGTH OFPROGRAM)0060 A2 07 LDX #070062 B5 48 LOOP: LDA Z, X 480064 95 10 STAZ,X100066 CA DEX0067 10 F9 BPLLOOP0069 4C 04 FF JMP FF04WE CAN, INSTEAD OF CLEARING THE DISPLAY, CAUSE A BLOCK OF MEMORY,0048 - 004F, TO BE TRANSFERRED TO THE DISPLAY. THE PROGRAM ISPOSITION INDEPENDENT SO YOU CAN WRITE IT INTO MEMORY ANYWHERE. . .EXCEPT LOCATIONS 0010-0017. IF YOU PUT THE PROGRAM IN 0048 ITWl LL FUNCTION PERFECTLY BUT YOU WON'T BE ABLE TO CHANGE THE DATAWHICH IS MOVED, SINCE THIS IS THE PROGRAM. YOU CAN TRY THE PROGRAMUSING THIS DATA0048 00 77 58 5C 50 54 00 00OR YOU COULD CONSTRUCT YOUR OWN DATA, USING APPENDIX A.THE INDEXING MECHANISM SHOWN ABOVE IS ONLY CAPABLE OF DEALINGWITH 256 (CONSECUTIVE) BYTES, STARTING AT A GIVEN ADDRESS. THUSA9 00 LDA # 0 0 LOAD A IMMEDIATE WITH "00"A8 TAY TRANSFER A TOY18 LOOP:CLC CLEAR CARRY79 00 FE ADC, Y FE00 ADD WITH CARRY INDEXED BY YC8 INY INCREMENTYD0F9 BNE LOOP BRANCH IF NOT EQUAL20 60FE JSR FE60 JUMP SUBROUTINE4C04FF JMPFF04 JUMPCOMPUTES THE LOWEST BYTE OF THE 256 BYTE ADDITION. (NOTE THAT,SINCE Y IS ZERO WHEN YOU LEAVE THE MONITOR BY THE GO FUNCTION,THE INITIALISATION OF A & Y CAN BE ACCOMPLISHED BY TYA INSTEAD OFLDA #00, TAY) HOW COULD THIS BE DONE FOR ALL 65536 MEMORY BYTES?CLEARLY IT IS POSSIBLE TO HAVE AN ADC, Y FOR EACH PAGE:98 TYA18 LOOP: CLC79 0000 ADC, Y 00001879 00FF
1879 00FFC8F0 034C??20 60 FE END4C04FF
CLCADC, Y 0100
CLCADC,YFF00
CLC> 256 ADC, Y INSTRUCTION PAIRS
INYBEQENDJMP LOOPJSR FE60JMP FF04
IN ORDER TO SHORTEN THIS PROGRAM WE WILL INTRODUCE THBCONCEPTOF "INDIRECTION".
ADDR
0240024202450247
HEXCODE
A2 2420 664C 04
LABEL
FEFF
INSTRUCTION
LDX #24JSR QHEXTD2JMP RESTART
COMMENTS
- SET UP X- PUT NEXT 4 OUT- DISPLAY RESULT
SYSTEMTHE DECIMAL TO HEX CONVERTER WILL PROMPT WITH 0XXXX FOR THEFIRST DIGIT OF THE 5 DIGIT DECIMAL NUMBER. THEN X0000. FOR THE LASTFOUR DIGITS OF THE DECIMAL NUMBER. CLEARLY ANYTHING OVER 65535Wl LL GIVE THE REMAINDER WHEN DIVIDED BY 10000 HEX. TO ENTER THISNUMBER YOU WOULD KEY 6, CONTROL KEY, 5535, CONTROL KEY, AND FFFFWILL APPEAR ON THE DISPLAY (AFTER A SLIGHT DELAY!)THE PROGRAM WORKS BY A PROCESS OF DECREMENTING THE DECIMALNUMBER AND THEN INCREMENTING THE HEX. NUMBER.
DEO*HEX
020002010203020502070209020C020F02110214021502170219021A021C021E022002210222
02240225022602280229022B
022D022F0231023302350236
0238023A023D023F
988585A28520209020F884A69885A4853898E9
A88AE9AAB0C6
30E6D0E638B0
A2204C
202120227A0CF688
1021
212020
01
00
0422
0920ED21
E9
206404
AGAINFEFE
FE
NEXTALSO
NODEC
RESULTFEFF
TYASTAZDECLSTA Z DECHLDX #DECCSTAZDECVH "]JSR HEXTD IJSR DISPLAYBCC AGAIN JJSR QDATFETSEDSTYZDLDXZ DECHT Y ASTA 2 DECHLDYZ DECLSTAZ DECLSEC NT Y ASBC #01
TAYT X ASBC #00TAX y
BCS NODECDECZDECVH
BMI RESULTINC2DECLBNENEXTINC 2 DECHSEC
- CLEAR A- CLEAR NO
y -FETCH THE FIRST DIGIT
- AND THEN THE LAST FOUR DIGITS- DECIMAL MODE- CLEAR LEFT DISPLAY- X & Y AS DOUBLE ACCUMULATOR
- CLEAR AREA FOR RESULT
> - DO A DECIMAL SUBTRACT, DOUBLEBYTE
- LAST OF THE DECIMAL SUBTRACT,TO DO 5 DIGITS
- IF MINUS THEN FINISHED- DOUBLE HEX INCREMENT
- CREATE BRANCH ALWAYS, BUTBCS ALSO f DON'T BOTHER TO SET THE CARRY
LDX #20JSR QHEXTDJMP RESTART
TWICE
- DISPLAY RESULT
ADDR
0208020A020D020E0210
021202140215
0217021802190213021 D021F02220224
HEXCODEA22098A066
901865
6A88D085662020
2088
0820
03
21
F521206464
DOUBLE BYTE
ADDR
020002010203020502070209020B020D02100212021502770219021B021D021F02210222022402260228022A022C022E023002320233023502370239023B
HEXCODED88484A98585A220A2208484A066669018A56585A56585666688D06666A020
20211122232088228824251023220D
2024242125252524
E623220666
LABEL
FE
LOOP
NAD
FEFF
MULTIPLY
LABEL
1r'
FE
FE
LOOP
NAD
FE
INSTRUCTION
LDX #20JSR QDATFETTYALDY #08ROR £20
BCCNADCLCADC 2 21
ROR ADEYBNE LOOPSTA 2 21ROR 2 20JSR QHEXTDJMP RESTART
INSTRUCTION
CLDSTY 2 20 MPIERSTY-2 21LDA #11STA 2 22 MPICANDSTA 2 23LDX #20JSR QDATFETLDX #22JSR QDATFETSTY 2 24STY 2 25LDY #10ROR 2 23ROR 2 22BCCNADCLCLDA 2 20ADC 2 24STA 2 24LDA 2 21ADC 2 25STA 2 25ROR 2 25ROR 2 24DEYBNE LOOPROR 2 23ROR 2 22LDY #06JSR QHEXTD2
COMMENTS
- FETCH THE NUMBERS- CLEARS A- LOOP COUNTER- SHIFT MULIPLIER (AND HIGH BYTE
OF RESULT)- NO ADD IF NO BIT
- ADD MULTIPLICAND INTO LOWBYTE OF RESULT
- AND SHIFT LOW BYTE OF RESULT
- PUT IN LOW BYTE- FINAL JUSTIFICATION SHIFT- DISPLAY ANSWER
COMMENTS
- BINARY ONLY- FORM PROMPT FOR THE ZERO
INPUT
- FORM PROMPT FOR THE FIRSTINPUT
- FETCH ZERO INPUT
- AND FIRST INPUT- CLEAR WORKING SPACE
- LOOP COUNT INITIALISATION- TWO BYTE SHIFT RIGHT
- NO ADD IF THE O/P BIT ISN'T A ONE
- TWO BYTE ADD
- NO CARRY OUT OF THE ADD- SHIFT AGAIN
- GO ROUND LOOP 16 TIMES- FINAL SHIFT ON RESULT
- SET UP POSITION- X ALREADY POINTING AT
023E A0 02 LDY #02
CORRECT LOCATIONS-PUT 4 HEXOUTNEXT POSITION
4.3.INDIRECTIOIM:YOU'LL NOTICE THAT THE PROGRAM IS NOT POSITION INDEPENDENT: THEADDRESS OF THE CLC INSTRUCTION MUST BE WRITTEN INTO THE PROGRAM.THIS IS ANOTHER DISADVANTAGE OF THIS METHOD: (THERE IS ANADVANTAGE: THIS PROGRAM IS VERY FAST, TAKING ONLY 6JUS PER BYTE).THE INSTRUCTION REQUIRED MUST HAVE A 16 BIT UNFIXED ADDRESS ANDTHIS CAN ONLY GO IN ONE PLACE : MEMORY. A LIMITATION IS THATGENERALLY IT CAN ONLY BE IN ZERO PAGE MEMORY. THE CONCEPT ISKNOWN AS INDIRECTION. THE MOST DIRECT VERSION OF THIS IS THEINDIRECTJUMP.6C02 00 JMP (0002)THIS IS THE ONE VERSION OF INDIRECTION THAT DOESN'T NEED TO REFERTO ZERO PAGE MEMORY. WHAT HAPPENS IS THIS:
DATA6C02
BUS R/W11
TIMERS ADDRESS BUS0 PC1 PC+12 PC+2 00 13 0002 V 14 0003 U 15 UV OPCODE 1
THE MONITOR USES A JUMP INDIRECT FOR THE GO FUNCTION, HAVINGBUI LT THE ADDRESS IN 0002 & 0003 : A JUMP INDIRECT VIA 0002 & 0003,ASSUMING THAT THESE LOCATIONS HAVEN'T BEEN ALTERED, WILL THUSRETURN TO THE START OF THE PROGRAM -WITHOUT KNOWING WHEREIT HAD BEEN ENTERED INTO MEMORY AT THE TIME OF WRITING.INDIRECTJUMP
JUMP INDIRECT
LOWER BYTEHIGHER BYTEOLD 6C COMPLETED
MAIN
JMP
PROGRAM
(0002)
ZERO PAGE
1234 ':
00020003
4ROUTINE
XXXXXX
123412351236
WELL, THAT WAS SIMPLE INDIRECTION. NOW WE'LL MOVE ONTO THE MORECOMPLICATED MODES OF INDIRECTION. HAVING FETCHED THE ADDRESSOUT OF MEMORY WITH THE INDIRECTION STAGE, WE CAN INDEX IT. THIS ISCALLED POST-INDEXED INDIRECTION. WITH THE 65XX SERIES OF MICRO-PROCESSORS YOU MAY ONLY
I INDEX IN THIS MODE WITH THE Y INDEX REGISTERII USE ZERO PAGE MEMORY
LDA(I),Y
(AN EXTRAMS IS NEEDED IF J+YRESULTS IN A CARRY)
TIMERS ADDRESS BUS DATA BUS R/W0 PC B1 11 PC+1 I 12 001 J 13 001+1 K 14 KJ+Y DATA 15 PC+2 OPCODE 1
THIS IS THE MODE OF ADDRESSING NEEDED TO SOLVE THE 65536 BYTEADDITION PROBLEM. MEANWHILE WHAT ABOUT THE X REGISTER ANDINDIRECTION? HERE WE HAVE PRE-INDEXED INDIRECTIONT I M E R S ADDRESS BUS DATA BUS R/W
LDA (I,X)
NO CARRY TO HIGH ORDER BYTE
PUT I N A
THIS IS THE OPPOSITE TO POST-INDEXED ... HERE THE INDEXING SWITCHESBETWEEN DIFFERENT INDIRECTION LOCATIONS. THE EFFECTS OF THESETWO INDEXING MODES ARE ONLY THE SAME IN THE TRIVIAL CASE OF ZEROINDEXES. HERE IS THE SOLUTION TO THE 65536 BYTE ADDITION:
012
34
CJI
6
PCPC+1001
00I+X00I+X+1KJPC+2
A1 11 1DATA, 1DISCARDEDJ 1K 1DATA 1OPCODE 1
9885 2085 2118 LOOP71 20C8D0FAE6 21D0F62060 FE4C04FF
TYASTA Z 20STA Z 21CLCADC (20), YINYBNE LOOPINC Z 21BNE LOOPJSR FE60JMP FF04
-ZERO Y & A
? SETUP INDIR
THE PROGRAM IS, ONCE AGAIN, POSITION INDEPENDENT. IT IS, AS IMPLIED INTHE FIRST SOLUTION, SLOW : 12;uS PER BYTE. THIS IS MAINLY DUE TO THESMALL SIZE OF THE LOOP : THE 3jLtS 'NEARLY ALWAYS TAKEN' BRANCH ISTAKING A DISPROPORTIONATE AMOUNT OF TIME, IN THE FIRST SOLUTIONTHE EQUIVALENT 5/xS BRANCH AND JUMP COMBINATION OCCURS ONLYEVERY 256 BYTES AND IS THUS IGNORED IN THE TIME CALCULATIONS.THE INSTRUCTION INC Z 21 HAS AN OBVIOUS FUNCTION : INCREMENT (INHEXADECIMAL) LOCATION 0021. IT ACTS JUST LIKE INX OR I N Y - B U T ITTAKES 5MS INSTEAD OF 2/xS.
4.4 READ-MODIFY WRITE INSTRUCTIONSTHERE ARE COMPANION INSTRUCTIONS TO INC Z THAT CAN DIRECTLYALTER MEMORY CONTENTS, THESE ARE CALLED READ-MODIFY-WRITEINSTRUCTIONSJHENEXTOF WHICH IS THE OBVIOUS DEC INSTRUCTION.
ADDR
0217
0219021B021C021D021F022002210223022402260228022A022C022 E02300232023402360238023B023D02400242
HEX LABELCODEA4
A63898E5A88AE9AA9084A56985A5698590A220A5204C
20
21
22
00
102324002425
0025E524 RESULT64 FE2360 FE04 FF
INSTRUCTION COMMENTS
LDY £ 20 - USE Y & X AS DOUBLEACCUMULATOR
LDXZ21SUB SEC >
T Y ASBC 2 22TAYT X ASBC #00
> - SUBTRACT THE DIVISOR
TAX )BCC RESULT - IF NEGATIVE THEN FINISHEDSTY Z 23 - ELSE UPDATE THE REMAINDERLDA Z 24ADC #00STA Z 24LDA 2 25ADC #00STA Z 25 J
> - AND ADD ONE TO THE RESULT(CARRY WAS SET ON INPUT).
BCC SUB - NO CARRY IS POSSIBLE (USUALLY)LDX #24JSR QHEXTDI - DISPLAY RESULTLDA 2 23JSR RDHEXTD - AND REMAINDERJMP RESTART
THE TWO MULTIPLY ROUTINES ARE FOR SINGLE AND DOUBLE BYTE BINARYMULTIPLICATION. THE FIRST PROMPTS XX0011XX AND THE TWO NUMBERSTO BE MULTIPLIED SHOULD BE ENTERED SEQUENTIALLY. (E.G. 1234WOULDGIVE 12X34). THE SECOND PROMPTS XX0000XX FOLLOWED BYXX1111XXFOR THE TWO NUMBERS. ANSWERS ARE, AS USUAL, DISPLAYED AFTER ACONTROL KEY HAS BEEN PRESSED.BOTH ARE BASED ON AN EQUIVALENT TO THE NORMAL METHOD OF LONGMULTIPLICATION.E.G. 11010
001100000000000000000000
1101000110100
-(0X2 4) X 11010-(0X2 3) X 11010-(1X2 2
-(1X2)-(0X2°)
X 11010X 11010X 11010
10011100
SINGLE BYTE MULTIPLY
ADDR
02000202
02040206
HEXCODED884
A985
20
1121
LABEL INSTRUCTION
CLD
STY 2 20
LDA #11STA 2 21
COMMENTS
- SET UP PROMPT FOR ZERO-MULTIPLIER
- PROMPT FOR FIRST- MUIT
ADDR
020F0211
02130215021602170219021A021B021D021 E0220
0222022402260228022A022C022E02300232
023402360239024B
HEX : LABELCODE84A4
A63898E5A88AE5AA90A9
6585A56985A5698590
A5204C
2320
21NXTSUB
23
24
1400
2222230223240024E1
22 RESULT60 FE04 FF
INSTRUCTION
STY2SUBLLDYZSQL
LDXZSQHSEC 1̂TYASBCZSUBL ITAY >TXASBC2SUBHTAX 'BCC RESULTLDA#00
ADCZ ROOTSTA Z ROOTLDAESUBLADC #02STA2SUBLLDAZSUBHADC #00STA2SUBHBCC NXTSUB
LDA 2 ROOTJSR DHEXTDJMP RESTART
COMMENTS
- SUBTRACT 0001 AT START- USE Y & X AS DOUBLE SIZED
ACCUMULATOR
- SUBTRACT SUB FROM X & Y
- IF NEGATIVE THEN STOP- NOT FINISHED YET. INCREMENT
ROOT
- INCREMENT SUB
- THERE CAN BE NO CARRY:BRANCH ALWAYS
- DISPLAY ANSWER
THE DIVIDE ROUTINE WILL CALCULATE THE INTEGER RESULT ANDREMAINDER OF A FOUR DIGIT NUMBER DIVIDED BY A TWO DIGIT NUMBER.BY ENTERING CLD (FOR HEX.) OR SED (FOR DECIMAL) EITHER BASE MAY BEUSED, SINCE IT WORKS BY SUBTRACTING THE DIVISOR SUCCESSIVELY FROMTHE DIVIDEND. THE ROUTINE PROMPTS WITH XX0000XX FOR THE DIVIDENDAND THEN XXXX11XX FOR THE DIVISOR. THE ANSWER WILL APPEAR INTHE FORM ABCD.EF WHERE ABCD IS THE INTEGER RESULT AND EF IS THEREMAINDER.
DIVIDERADDR
020002010203020502070209020B020E021002130215
HEXCODED88484A985A220A2208484
OR202111
22208822882425
LABEL
F8
FE
FE
INSTRUCTION
CLD OR SEDSTY 2 20 DIVIDEDSTY 2 21LDA #11STA 2 22 DIVISORLDX #20JSR QDATFETLDX #22JSR QDATFETSTY 2 24 RESULTSTY 2 25
COMMENTS
- BINARY (DECIMAL) OPERATION- CLEAR DIVIDEND - PROMPT FOR
NUMBER- PROMPT FOR SECOND NUMBER
- FETCH DIVIDEND
- FETCH DIVISOR- CLEAR RESULT
THE OTHER FOUR ARE NEW,AS AN EXAMPLE0070 A9 55
72 0A73 20 60FE76 4C04FF
THEY ARE SHIFTS AND ROTATES. LET'S USE ASL
LDA #55AS LAJSR FE60JMP FF04
LOAD A IMMEDIATE WITH 55ARITHMETIC SHIFT LEFTJUMP TO SUBROUTINEJUMP
THE RESULT OF RUNNING THIS PROGRAM IS AA ON THE DISPLAY. EACH BITIN THE ACCUMULATOR HAS BEEN SHIFTED ONE BIT LEFT.
BEFOREAFTER
0101010110101010 0
ROLA, ROTATE LEFT ACCUMULATOR, (2A) WILL HAVE THE SAME EFFECT,EXCEPT THAT THE RIGHT INPUT 0 IS REPLACED BY C, IN THIS CASE 1,SOTHE RESULT IS AB.LSRA,LOGICAL SHIFT RIGHT ACCUMULATOR (4A)
CBEFORE ffl 01010101
10101010AFTER LL|RORA, ROTATE RIGHT ACCUMULATOR (6A) WILL REPLACE THE LEFT INPUT 0WITH C TO GIVE AAALL THESE INSTRUCTIONS MAY BE USED DIRECTLY ON MEMORY LIKE INCZ.4.5 MISCELLANEOUS REMAINING INSTRUCTIONSTHERE ARE A FEW INSTRUCTIONS LEFT,WHICH WILL HAVE TO BE DEALTWITH PIECE-MEAL:BRK00 :THE MICROPROCESSOR HAS TWO INTERRUPTS, AS EXPLAINED IN
THE HARDWARE SECTION, AND THE INSTRUCTION SIMULATES ANJRQ, FIRST SETTING THE B FLAG IN THE STATUS REGISTER. THERETURN AFTER A BREAK WILL BE AT THE NEXT BUT ONE BYTE: A COMBINATION OF TWO INSTRUCTIONS
I READ MEMORY BITS 6 & 7 INTO THE OVERFLOW &NEGATIVE FLAGS
II LOGICAL AND ACCUMULATOR AND MEMORY, A ZERORESULT SETTING THE Z FLAG. THE RESULT IS NOTLOADED INTO THE ACCUMULATOR. THE INSTRUCTIONIS USUALLY USED TO TEST THE STATUS OFPERIPHERAL DEVICES, WITHOUT UPSETTING A,X OR Y.
RTI, RTS 40,60 BOTH INSTRUCTIONS PULL THE PROGRAM COUNTER FROM* THE STACK, RTI FIRST PULLS THE PROCESSOR STATUS1 FROM THE STACK.
BIT2C
CHAPTER 5: ACORN HARDWARE5.1 CHIP LAYOUT AND BUSBEFORE PLUNGING DEEPER INTO SOFTWARE WE'LL TAKE A REST AND LOOKAT THE HARDWARE. WE'LL START WITH THE CPU BOARD
CO
CO
(NDO
00
CO
CM
LL)00
•00QQ
Q
o
CDCOr—
C/)_ l
CNO
DO
<X
aDC
aavoaA3>il UJCO
ROUTINES BY ENTERING THE SECTION OF PROGRAM FROM THE TITLE LABEL(E.G. DIVIDE) TO THE RESULT LABEL AND SUBSTITUTING THE LINE
60 RESULT RTS .ALL ARE RELOCATABLE.
SYSTEM PROGRAMSTHESE PROGRAMS ARE ALL SHORT ROUTINES WHICH CAN PROVE USEFULTIME SAVERS AT THE DEVELOPMENT AND INPUT STAGES OF PROGRAMWRITING.IT MAY BE FOUND USEFUL TO KEEP COPIES OF THEM ON TAPE AND TO HAVETHEM IN THE ACORN AND BESIDE YOU WHILE DEVELOPING PROGRAMS.BRANCH CALCULATIONS IN PARTICULAR ARE A FERTILE SOURCE OFERRORS AND TIME WASTING IN ANY HAND ASSEMBLED PROGRAM.THE RELOCATOR Wl LL MOVE PROGRAMS AROUND MEMORY FOR YOU. AGODSEND TO ANYONE WHO FINDS THEMSELVES WITH THE NEED TOREENTER LARGE CHUNKS OF CODE MANUALLY.
MISCELLANEOUSTHIS IS A SELECTION OF PROGRAMS AND ROUTINES INCLUDED BECAUSETHEY ARE INTERESTING, ELEGANT OR IMPORTANT. THEY SHOW SOME OFOF THE THINGS THAT CAN BE DONE WITH THE SYSTEM, WHICH MAY BE MORETHAN YOU IMAGINE. WE HAVE, FOR INSTANCE, RUN A CHESS GAME IN THE 1KSYSTEM.IN PARTICULAR THE METRONOME AND COUNTER PROGRAMS ARE INTENDEDTO DEMONSTRATE SOME OF THE USES OF THE KEYBOARD. IN ORDER TOUNDERSTAND WHAT IS GOING ON WITH THESE PROGRAMS YOU WOULD BEWELL ADVISED TO STUDY THE MONITOR LISTING AND PART 1 OF THISMANUAL.
MATHEMATICALTHE SQUARE ROOT PROGRAM Wl LL CALCULATE EITHER DECIMAL OR HEXA-DECIMAL SQUARE ROOTS ACCORDING AS CLD (FOR HEX) OR SED (FORDECIMAL) IS ENTERED AS THE FIRST LINE. IN EITHER CASE THE PROMPTWILL BE XX0000XX . THE SQUARE SHOULD BE ENTERED, A CONTROL KEYPRESSED AND THE ROOT WILL APPEAR ON THE DISPLAY.THE PROGRAM IS BASED ON THE EQUALITY
((N+1)*(N+1))-(N*N)=(2*N)+1AND SUCCESIVELY SUBTRACTS 1,3,7,9 ETC. FROM THE SQUARE. WHEN THERESULT OF A SUBTRACTION GOES NEGATIVE THE NUMBER OF SUBTRACTIONSDONE TO DATE IS THE ROOT.HEX/DEC SQ ROOT.ADDR
02000201020302050207
020A
020C020E
HE>r
CODEF88484A220
84
84C8
OR21202088
24
22
LABEL
D8
FE
INSTRUCTION
SED (OR CLD)STY E SQHSTY Z SQLLDX #SQLJSR QDATFET
STYHSUBH
STY 2 ROOTINY
COMMENTS RELOCATABLE
- SETDECIMAL(BINARY)OPERATING- CLEAR SQUARE TO PROMPT
- FETCH THE NO. WHOSE ROOT IS TOBE FOUND
- CLEAR HIGH PART OFSUBTRACTING NO.
- CLEAR ROOT
PART 2APPLICATION PROGRAMS
MATHEMATICAL1. SQUARE ROOT (HEX. OR DECIMAL)2. DIVIDE (HEX. OR DECIMAL)3. SINGLE BYTE MULTIPLY4. DOUBLE BYTE MULTIPLY
SYSTEM1. DECIMAL TO HEX.2. HEX. TO DECIMAL3. BRANCH OFFSET CALCULATOR4. RELOCATOR5. TAPE USE PROGRAMS6. SCROLL
GAMES1. NIM2. DUCK SHOOT
MISCELLANEOUS1. COUNTER2. KEYBOARD COUNTER ROUTINE3. METRONOME4. EIGHT QUEENS PROBLEM
GENERALTHESE APPLICATIONS PROGRAMS ARE INTENDED TO DEMONSTRATE SOMEOF THE CAPABILITIES OF THE SYSTEM AND OF THE PROCESSOR. THEY HAVEBEEN DESIGNED FOR CLARITY AND SIMPLICITY AND IN MANY CASES ARENOT OPTIMAL EITHER IN TERMS OF LENGTH OF PROGRAM OR OF EXECUTIONTIME. THEY ARE INTENDED SIMPLY TO GIVE YOU A FEEL FOR THE SYSTEMAND SOMEWHERE TO START OFF FROM.ALL PROGRAMS MARKED RELOCATABLE CAN BE ENTERED ANYWHERE INAVAILABLE MEMORY, SUBJECT TO NOT IMPINGING IN VARIABLE STORAGESPACE FOR EITHER THE PROGRAM OR MONITOR AND NOT USING SPACENEEDED BY THE STACK. (FOR STACK USAGE SEE RELEVANT SECTIONS OFPART 1 OF THIS MANUAL.)AS FAR AS HAS PROVED POSSIBLE THE CONVENTION OF A XX 0000 XXPROMPT FOR THE FIRST NUMBER TO BE ENTERED AND XX 1111 XX FOR THESECOND HAS BEEN OBSERVED IN THESE PROGRAMS. AFTER ENTERING ANUMBER CHECK THAT IT IS CORRECT AND THEN PRESS A CONTROL KEY(ANY ONE Wl LL DO) TO PROGRESS THROUGH THE PROGRAM.YOU SHOULD NOW BE READY TO TYPE IN THE PROGRAMS AND RUN THEM#
BOTH TO ASSURE YOURSELF THAT THE SYSTEM IS OPERABLE AND TOFAMILIARISE YOURSELF WITH ITS OPERATION.THROUGHOUT THESE NOTES X INDICATES AN UNDEFINED/UNIMPORTANTCHARACTER.MOST OF THE PROGRAMS WERE WRITTEN BY MARK I'ANSON, THANK YOUMARK I.
MATHEMATICAL PROGRAMSALL THESE ROUTINES RESET THEMSELVES WHEN A CONTROL KEY IS PRESSEDAFTER THE NUMBER HAS BEEN OBTAINEQTHEY MAY ALL BE USED AS SUB
THE OBVIOUS IMPORTANT DEVICE HERE IS A, THE MICROPROCESSOR. THIS ISWHERE A,X,Y,P,S,PC LIVE. FROM HERE COME THE COMMANDS TO RUNEVERYTHING ELSE. THERE ARE TWO PRIMARY BUSSES, CONSISTING OFPARALLEL PATHS OF BINARY DATA, THE BIGGEST BUS IS THE ADDRESS BUS.THIS CONSISTS OF 16 LINES TO TRANSFER THE ADDRESS GENERATED BYTHE PROCESSOR TO THE ADDRESS INPUTS OF ALL OTHER SYSTEM CHIPS.THIS BUS IS UNIDIRECTIONAL : ONLY THE PROCESSOR (IN A NORMALSYSTEM) GENERATES ADDRESSES, AND IT HAS 2 1 6 STATES (=65536,) THESECOND BUS ISTHE DATA BUS. THIS IS8 BI-DIRECTIONAL LINES, ALLOWINGA SINGLE WORD/BYTE TO BE TRANSFERRED EITHER FROM THE PROCESSORTO MEMORY - A W R I T E , OR FROM MEMORY TO PROCESSOR - A READ.THE REMAINING BUS IS THE CONTROL BUS, ITS MEMBERS HAVE NOPARTICULAR RELATIONSHIP WITH EACH OTHER, BUT THEY ARE ALL SUPER-VISORY SIGNALS FOR THE SYSTEM. THE FIRST CONTROL SIGNAL ISTHE R/WLINE. THIS SPECIFIES THE TYPE OF DATA TRANSFER THAT THE PROCESSORWISHES TO MAKE: WHEN THE R/W LINE IS HIGH (LOGIC ONE; > 2.4 V DC) THEPROCESSOR IS READING WHEN THE R/W LINE IS LOW (LOGIC ZERO <0 .8 V DC)THE PROCESSOR IS WRITING/THE NEXT CONTROL LINES ARE THE SYSTEMCLOCK, WHICH CONTROLS THE TIMING OF ALL DATA TRANSFERS. THEPROCESSOR, WITH HELP FROM 1/6 OF A TTL IC, GENERATES THE SYTEMCLOCK AS TWO NON-OVERLAPPING SQUARE WAVES, PHASE ONE (01) & PHASETWO (02) w
DURING 01 THE ADDRESS BUS AND THE R/W LINE CHANGE, AT THE END OF,OR DURING, 02 THE DATA IS TRANSFERRED. OTHER CONTROL SIGNALS ALSOCHANGE AT TIMES SPECIFIED WITH RESPECT TO THE SYSTEM CLOCK, E.G.THE SYNC SIGNAL : THIS GOES HIGH DURING 01 WHEN THE PROCESSOR ISFETCHING AN INSTRUCTION,AND RETURNS LOW WITH THE TRAILING EDGEOF 02.
5.2 RESET. INTERRUPT REQUEST AND NON-MASKABLE INTERRUPTANOTHER CONTROL LINE IS RESET. THIS IS GENERATED BY SUITABLE HARD-WAREJIN THE ACORNTHE CORNER SWITCH ON THE CPU BOARD, AND THE RE-SET SWITCH ON THE KEYBOARD,) ANDCAUSES ALL PARTS OF THE SYSTEM TOBE RESET TO A SAFE, KNOWN STATE. IN THE PROCESSOR'S CASE RESETINITIALIZES THE PROGRAM COUNTER TO THE CONTENTS OF ADDRESSESFFFC AND FFFD WHICH, FOR ACORN, CONTAIN THE ADDRESS FEF3.EXECUTION OF THE ACORN MONITOR STARTS THERE. PERIPHERAL DEVICESSHOULD BE SET TO THEIR LEAST DANGEROUS STATE BY RESET, E.G.REMOVE INTERRUPT CAPABILITY, SET ALL PROGRAMMABLE INPUT/OUTPUTLINES TO INPUTS.THE TWO PUSH BUTTONS ON THE CPU BOARD ON EITHER SIDE OF THE RESETBUTTON ARE INTERRUPT BUTTONS. THE IDEA OF AN INTERRUPT IS TOPULL THE PROCESSOR AWAY FROM IT'S CURRENT TASK, LET IT BRIEFLY DOSOMETHING IMPORTANT AND THEN RETURN TO IT'S TASK AS IF NOTHINGHAD HAPPENED. THE 6502 HAS TWO DISTINCT INTERRUPT CAPABI LITIESIRQ
WITH AN INTERRUPT REQUEST, IRQ,THE PROCESSOR HAS THE OPTION OFIGNORING IT. AN IRQ IS ONLY GRANTED IF THE FLAG I (INTERRUPTDISABLE) IN THE PROCESSOR STATUS REGISTER IS 0. THE PROCESSORTHEN PUSHES PC & P & THEN SETS I TO 1. (THE STATE OF THE IRQ LINE ISCHECKED BETWEEN INSTRUCTIONS . . . IF IT REMAINS LOW,WE DON'TWANT ANOTHER INTERRUPT). THEN THE PROCESSOR LOADS PC FROMLOCATIONS FFFE & FFFF AND CONTINUES. NOTE THAT AN RTI RETURNSTHE ORIGINAL P, WHICH HAD THEI FLAG 0.
NMIWITH A NON-MASKABLE INTERRUPT, NMI, THE PROCESSOR HAS NOOPTIONS; WHEN THE LINE HAS BEEN LOW FOR AT LEAST TWO CLOCKCYCLES, THE PROCESSOR WILL FINISH ITS CURRENT INSTRUCTION, SAVEITS STATUS & PC, SETIHIGH AND FETCH A NEW PC FROM FFFA & FFFB.TO AVOID RECOGNISING ANOTHER INTERRUPT NMI IS EDGE-SENSITIVE:NO FURTHER INTERRUPTS ARE RECOGNISED UNTIL NMI HAS RETURNEDHIGH.SINCE NMI SETSIHIGH, IRQ Wl LL NOT SUCCEED DURING THENORMAL OPERATION OF AN NMI PROGRAM, BUT NMI Wl LL BE ABLE TOTAKE CONTROL DURING EXECUTION OF AN IRQ PROGRAM; IT HAS AHIGHER PRIORITY.
IRQ, NMI, & RESET ARE OPEN-COLLECTOR LINES ON THE CPU BOARD: MANYINTERRUPTING/RESETTING DEVICES MAY BE CONNECTED.
RST, IRQ, NMI
+5V
DEVICE 1
DEVICE 2
FFB3
B5B7B9BABBBD
BF
C1C3
C6C7C9
CACC
CDD0D1D3D6D8DBDDE0E2
E4FFE7
FFEA
EEF2F6
FFFAFFFCFFFE
85
8684684885A2
A9
8520
BA86C8
84D8
BD38E59D85BDE99D85A2
204C
3F
667F58ADF3B0
0A
0B0C
0D0D
FF
0E00
13
12
02
1?02110300031013
0007
06
6D6F5EFFFEFF
FE
01
•i £
01
01
01
FEFF
5B
7D7779
4F
077C71
BREAK
or** -
FONT
NMIVECRSTVECIRQVEC
STA Z R0
STXZ R1STY Z R2PLAPHASTA Z R3LDX #R3
LDA # FF
STAZ REPEATJSR QUAD
TSXSTX Z R7INY
STY Z R6CLD
LDA, X 0102SECSBC-Z RECALSTA, X 0102STA Z R5LDA, X 0103SBC #00STA, X 0103STA Z R4LDX#R7
JSR QUADJMP RE-ENTER
'0' ' 1 ' '2' '3'
'4' '5' '6' '7''8' '9' 'A' 'b''c' 'd ' 'E' T 'NMIRESETIRQ
- WHEN THE IRQ/BREAK VECTOR
POINTS HERE THEN DISPLAYDISPLAY EVERYTHING - SAVE A
- SAVE X- SAVE Y- GET P OFF STACK- PUT IT BACK FOR FUTURE USE- STORE Q IN REGISTER 3- SET X TO POINT AT REGISTERS
3 ^ 0 FOR QUAD- KILL POSSIBILITY OF DISPLAY
BEING ON SINGLE SCAN
- USE QUAD TO WRITE OUT A X Y P
- GET STACK POINTER
- Y ZERO SINE QUAD ENDED WITHDISPLAY SO THIS FORMS 01
- CLEAR DECIMAL MODE FOR BINARYSUBTRACT - DOESN'T AFFECTUSER SINCE PIS STACKED
- GET PCL OFF STACK
- CORRECT IT BY AMOUNT IN RECAL- PUT IT BACK ON STACK- AND STORE IT FOR QUAD- PCH OFF STACK- REST OF TWO BYTE SUBTRACTION- PUT IT BACK ON STACK- AND STORE IT FOR QUAD- POINT X AT THESE REGISTERS-
QUAD WILL DESTROY THEM- QUAD WRITES OUT PC SP- AND THE WHOLE SHEBARG STARTS
OVER AGAIN- 7 SEGMENT FORMS OF THE HEX
DIGITS
POINT TO THE ADDED INDIRECTIONPOINT TO THE RESET ENTRY POINTPOINT TO THE ADDED INDIRECTION
FF45484B4D4F505152535557
FF5AFF5CFF5F
6163
6567
FF6AFF6C
6E71
FF72FF74
76797C7E
FF80FF82
85
8788
FF8A8D8F
929597
FF99
9B
2020B0A10A0A0A0A05814CD06CE0F0A2
8620A2B520CAD0A1
2020D0F0A22095
CAD020818D
20D0F0A1
F01
5E0CBC00
00450302043608
10880405B1
F806
(31A0F62A04DD05
F8DD0621
A0F31100
FEFE
& T>
FF
00
FE
FE
FEFE
FE
FE
0E
FE
'MODIFY"
N1"GO"N2
"STORE"
DATAS
"LOAD"ADDRSL
DATAL
"POINT"
JSR MHEXTDJSR DISPLAYBCS SEARCHLDA (00, X)ASLAASLAASLAASLAORA 2 KEYSTA (00, X)JMP "MODIFY"BNE N2JMP (GAP)CPX #04BEQ POINTLDX #08
STXZ DJSR QDATFETLDX #04
J LDA 2,X 05JSR PUTBYTEDEXBNE ADDRESSLDA (06, X)
JSR PUTBYTEJSR COM 16BNE DATASBEQWAYOUTLDX #04JSR GETBYTESTAZ,X05
DEXBNE ADDRSLJSR GETBYTESTA (06, X)STA 1PIB
JSR COM16BNE DATALBEQWAYOUTLDA (00, X)
BEQ SET
9D 85 18
9FA1
FFA3
FFA5
A7
A9 00F0 02A5 18
81 00
20 5E FE
SET
OUT
FFAA 4C 04 FF WAYOUTFFAD 6C 1C 00 NMIFFB0 6C 1E 00 IRQ
STAZP
LDA #00BEQ OUTLDAZ P
STA (00, X)
JSR MHEXTD
JMP RESTARTJMP (USERNMI)JMP (USERIRQ)
DISPLAY THE MEMORYAND GET KEYIF NOT HEX DO OVERHEX SO GET OLD INFO
MOVED ALONGAND PUT IN NEW INFOAND PUT IT BACKTHEN KEEP DOING ITMUST BE 4 OR 6 AS 2 ISTHE VERY SIMPLE GOIS IT 4 OR 6?WELL IT'S NOT 4SO IT MUST BE 6 - X NOW POINTSTO TAPGIVE PROMPTAND GET 2ND STORE INFOLOOP COUNTSEND ADDRESSES TO TAPE
X NEATLY ZEROED ON EXITDATA SEND - GET INFO FROMMEMORYAND SEND IT TO TAPESEE IF PRINTEDNOYES
RESCUE ADDRESSES FROM TAPEPUT THEM IN FAP & TAP, THOUGHIT COULD BE ELSEWHERE
X NEATLY SERVED AGAINGET DATA FROM TAPEAND STORE IT IN MEMORYAND ON THE DISPLAY SO IT CAN BESEENSEE IF FINISHEDNOYESSET/CLEAR BREAK POINT - GETDATA FROM ADDRESSED MEMORYIF ZERO BREAK POINT HASALREADY BEEN SET = MUST CLEARITNOT ZERO SO SAVE THEINFORMATIONAND PUT IN A BREAK POINT
WAS SET SO GET OLDINFORMATION BACKINSERT BREAK POINT OR OLDINFORMATIONNOW READ IT OUT AGAIN TOREVEAL ROMGO BACK & DO IT ALL OVER AGAININDIRECTION ON NMIINDIRECTION ON IRQ
TO DECIDE WHICH DEVICE CAUSED AN INTERRUPT THE PROCESSOR CHECKSA STATUS REGISTER OF EACH DEVICE, USING THE BJT INSTRUCTION TO TESTBIT 7 OF THE DEVICE. AFTER EXECUTING THE PROGRAM REQUIRED FORAPARTICULAR DEVICE THE PROCESSOR RESETS THE DEVICE'S INTERRUPTBEFORE EXECUTING ITS RTJ. IF THE INTERRUPT LINE IS STILL LOW (IRQ) ORMAKES ANOTHER NMI THE WHOLE THING IS REPEATED. THIS PRIORITIES THEINTERRUPTS IN SOFTWARE.
5.3 6502 INTERNAL ARCHITECTURE
REGISTERS
(4)IRQ
(b) I (40) CONTROLNMI RST
ADDRESSBUS
(9)1 -
(10)2 -
(11)3 -
(12)4 -
(13)5 -
(14)6 -
(15)7 "
(16)
8 - * -(17)
9 - * -(18)10 - * -
(19)11 - « -
(20)12 - * -
(22)13 * * -
(23)14 - * -
(24)15 **~
—
(25)
RDY (2)TIED HIGH ON ACORN
•-SYNC (7)
S.O.(38)TIED HIGH ON ACORN
CLOCKINPUT
01 (3)02 (39)
- • R/W (34)
0 (37)
= BYTE LINE
= 1 BIT LINE
PIN NUMBER
5.4 PROMS, EPROM, RAM, RAM I/OTHE NEXT THINGS CONNECTED TO THE CPU ARE DEVICES D. THESE AREPROMS: PROGRAMMABLE READ ONLY MEMORYS. EACH CONTAINS 512 X 4BITS OF INFORMATION WHICH HAS BEEN FIXED AS HALF OF THE ACORNMONITOR. SHORT OF CATASTROPHIC DESTRUCTION THERE IS NO WAY TOMAKE A 'HIGH' PART OF THE MEMORY 'LOW', BUT 'LOW' PARTS CAN BEPROGRAMMED 'HIGH' BY PASSING EXCESS CURRENT THROUGH A FUSE ANDDESTROYING IT. IN NORMAL ACORN OPERATION THESE TWO DEVICES WILLBE ENABLED BY ANY ADDRESS IN THE RANGE F800 TO FFFF: THEY THUSOCCUR IN THE MEMORY FOUR SEPARATE TIMES, MORE ON THIS ANON.AKIN TO D, IS DEVICE E. THIS IS NOT PART OF THE KIT, BUT IS INTENDEDTO BE A2048X8 EPROM: ERASEABLE PROGRAMMABLE READ ONLY MEMORY.LIKE THE PROM, THE EPROM CAN BE PROGRAMMED ALTHOUGH FUSES ARENOT BLOWN BUT CHARGE IS STORED ON THE GATE OF AFIELD EFFECTTRANSISTOR (F.E.T.). THIS CHARGE CAN ONLY LEAK AWAY SLOWLY - ABOUTTEN YEARS, UNLESS THE GATE IS EXPOSED TO ULTRA-VIOLET LIGHT WHICHHAS ENOUGH ENERGY TO SET THE DEVICE BACK TO IT'S STANDBY STATE.(IF YOU MAKE ONE PROGRAM MISTAKE THE WHOLE DEVICE MUST BEERASED TO ALLOW YOU TO CORRECT THE MISTAKE. STI LL, IT'S BETTERTHAN NOT BEING ABLE TO CORRECT A MISTAKE AS WITH THE PROM). ANENABLE SIGNAL IS PROVIDED BETWEEN F000 & F7FF FOR THIS DEVICE, ORELSE IT MAY BE PROGRAMMED WITH A LARGER MONITOR AND ENABLED BYTHE F 8 0 0 - FFFF SIGNAL SMALLER (1024 X 8 or 512 X 8) EPROMS MAY ALSOBE FITTED IN SOCKET E, BUT THESE OLDER DEVICES USUALLY REQUIREADDITIONAL POWER SUPPLIES, AND TWO MODIFICATIONS TO THE CIRCUITBOARD ARE REQUIRED TO ALLOW THIS.THE LAST TYPE OF MEMORY ON THE CPU BOARD IS TYPE C. THIS IS A STATICREAD/WRITE MEMORY: INFORMATION CAN BE CREATED AND DESTROYEDBY THE MICROPROCESSOR ITSELF, BUT ALL IS LOST WHEN THE POWER ISREMOVED. TOGETHER WITH THE DYNAMIC VERSION, THIS TYPE OF DEVICEHAS RECEIVED THE NAME RANDOM ACCESS MEMORY R.A.M., ALTHOUGHTHEY ARE NO MORE RANDOM THAN P.R.O.M.S. OR E.P.R.O.M.S. DEVICES CARE 1024X4 RAMS, TWO ARE REQUIRED LIKETHETWO PROMS TO BUILD UPA WHOLE BYTE, AND THEY ARE ENABLED BY ADDRESSES IN THE RANGE0000 TO 03FF. THEY THUS CONTAIN ZERO PAGE & PAGE 1, THE STACK PAGE,AS WELL AS TWO FURTHER PAGES.THE ENABLE SIGNALS FOR ALL I.C.S. ON THE CPU BOARD ARE PROVIDED BYTHE LOGIC I.C.'S G. THESE I.C.S. DECODE CERTAIN RANGES OF ADDRESSESFROM THE ADDRESS BUS BY RECOGNISING A PATTERN ON HIGH ADDRESSLINES, E.G. FOR THE SIGNALTO THE TWO RAM'S THE TOP 6 (A15-A10)ADDRESS LINES MUST BE LOW (LOGIC ZERO).THE SIGNALS ARE ALLBROUGHTTO THE SOCKET F, WHERE LINKS CAN BE MADE (OR A D.I.L.HEADER USED) TO TAKE THE ENABLE SIGNALS AWAY TO THE CHOSENDEVICES THUS MANY DIFFERENT SYSTEM CONFIGURATIONS CAN BE USED,FROM JUST THE TWO P.R.O.M.S AND DEVICE B1, THROUGH TO BOTH C'S, B2 &E OR ANY COMBINATION.
DEVICES B HAVE TWO FUNCTIONS. IN THE FIRST PLACE EACH CONTAINS A128 X 8 RAM, BRINGING THE CPU BOARD UP TO 1280 BYTES OF R.A.M.SECONDLY EACH HAS THE FACILITIES FOR MAKING TWO WORDS OF MEMORY
EAEDEEEF
FEF1
FEF3F5F6F9
FEFB
FD
FFFF01
FF02
FF04
FF07FF09
0B0D
0F111315
FF17191B1D
FF1E202224
FF26282A
FF2CFF2E
31
FF3436
38FF39
3A3C3E
41
43
0E6A88D0F0
A2
86A0
A2
94CA
D0
20
9029
C990
F0C9F0B0A5A6A440
F6D0F6B0
B5D0D6D6204C
8484
0AAA
498520
E0
B0
20
F6DA
FF
230E80
09
0E
FB
0C
F207
0425
6F06090F0A0B0C
000C0108
000201006445
1617
F71088
02
15
0E
0E
FE
F'F'
FE
RESET
INIT
RO^J>
RESTART
RE-ENTERSEARCH
"RETURN"
"UP"
"DOWN"
NODECENTERM
FETADD
ASL 1PIAROR ADEYBNE INPUTBEQ WAIT
LDX #FFTXSSTX 1BDDRSTX Z REPEATLDY #80
LDX #09
STYZ,X REPEATDEX
BNE ROUND
JSR DISPLAY
BCC INITAND #07
CMP #04BCC FETADD
BEQ LOADCMP #06BEQ "UP"BCS "DOWN"LDAZ R0LDX Z R1LDY Z R2RTI
INCZ,X00BNE ENTERMINCZ,X01BCS ENTERM
LDAZ,X00BNE NODECDECZ,X01DEC Z,X 00JSR QHEXTD1JMP "MODIFY"
STY Z D+6STY Z D+7
ASL ATAX
EOR #F7STAZDJSR QDATFET
CPX #02
BCSNI
GET SAMPLE AUTO CARRYAND AUTO A
KEEP GOINGUSE WAIT TO GET OUT ONTO THETHE SHOP BIT HIGHMAIN PROGRAMINITIALIZE STACKAND B DATA DIRECTION REGISTERMULTI-SCAN DISPLAY MODETHE FAMILIAR DOT ON THEDISPLAYALL EIGHT DISPLAYS ANDINITIALIZE EXECY USED FOR AMUSEMENT
X ZERO ON EXIT, SO UP & DOWNIMMEDIATELY VALIDMARK RETURN TO MONITOR POINTDISPLAY DISPLAY & GET KEYHEX KEY GETS THE DOTS BACKREMOVE ANY STRAY BITS(EFFECTIVELY SUBTRACT 10)
KEYS OF VALUE LESS THAN 4NEED AN ADDRESSKEY 4 IS THE LOAD KEY
KEY 6 IS UP& KEY 7 IS DOWNMUST BE KEY 5 - GET A BACKGET X BACKGET Y BACKGET P & PC BACK & CONTINUEFROM WHERE YOU WERE16 BIT INDEXED INCREMENT
A BRANCH ALWAYS : THE CARRYWAS SET BY THE FF11 COMPARE16 BIT INDEXED DECREMENT
NOW DISPLAY THE VALUEAND GET INTO THE MODIFYSECTIONCLEAR DISPLAYS 6& 7 _ Y WAS ZERO ON EXIT FROMDISPLAYDOUBLE ATHE ZERO PAGE ADDRESSES MAP,GAP, PAP & FAPFIX UP DIGIT 0 COMMAND SYMBOL
FETCH THE ADDRESS, AUTO MAP,GAP, PAP OR FAPCHECK X TO FIND OUT WHICHCOMMAND WE'RE DOINGMUST BE 2, 4 OR 6 - AS 0 IS
87FE88
8B8E9092939495
FE96
FE97999B9C9E
FEA0
A2A4
FEA6
A8AAACAE
FEB0FEB1
B3B6B8BBBC
FEBDC0G1C4C5C7CA
FECD
FED0D2D4D5DY
D8DADC
FEDD
FEDF
E2E4
FEE7
6020
20B0A00A0A0A0A0A
363688D0F0F6
D0F6B5
D5D0B5D560A0
8CA08C6A6A206A8D8810208C20
84A088D088
D0A460A0
2C
3020
90
64
0C2004
0001
F8E806
020706
(07040709
40
220720
CD
20
F6CD20D0
1A48
FD
FD1A
08
20
FBD0
CD
FE
FE
I
o%
0E
0E
FE
0E
FE0EFE
0E
FE
FF
QDATFE7
SHIFTIN
COM 16
UDINC
RETURNPUTBYTE
AGAIN
WAIT
y2 W A I T
WAIT 1
WAIT 2
GETBYTE
START
INPUT
RTSJSR QHEXTD1
JSR DISPLAYBCS RETURNLDY #04ASLAASLAASLAASLAASLA
ROLZ,X00ROLZ,X01DEYBNE SHIFTINBEQ QDATFETINCZ,X06
BNE NOINCINCZ,X07LDAZ,X06
CMPZ,X08BNE RETURNLDAZ,X07CMPZ,X 09RTSLDY #40
STY1ADDRLDY #07STY 1PIAROR AROR AJSR WAITROR ASTA 1PIADEY ,. '£ f
(BNE^GAINJSR WAITSTY 1PIAJSR 1/2WAIT
STY Z TYLDY #48DEYBNE WAIT 1DEY
BNE WAIT 2LDYZTYRTSLDY #08
BIT 1PIA
BMISTARTJSR 1/2WAIT
JSR WAIT
QUAD DATA FETCH - DISPLAY OLDDATAGET KEYNON HEX RETURNLOOP COUNTER
DIGIT IN A IN CORRECT PLACEMULTI SHIFT TO GET DIGIT INTOMEMORYINDEXED
- KEEPSHIFTING IN- GO AND DO IT ALL AGAIN- INCREMENTS COMPARE 16 BIT
NOS - INCREMENT LOWER- NO HIGH INCREMENT
- LOW BYTE EQUALITY TEST
- NO NEED TO DO HIGH BYTE- HIGH BYTE EQUALITY TEST
- PUT BYTE TO TAPE-CONFIGUREI/O PORT
- LOOP COUNTER- AND SEND THE START BIT
- BACK A UP A COUPLE OF BITS- WAIT TO SEND OUT RESET BIT- SENDING ORDER IS BIT 0->BIT 7- SEND BIT
- KEEP GOING- WAIT FOR THAT BIT TO END- SEND STOP BIT : Y IS FF- 300 BAND WAITING TIME - IN TWO
PARTS- 1/2THE WAITING TIME-SAVE Y- 72X5JUS DELAY- PART ONE OF THE WAIT
- Y WAS ZERO ON ENTRY - 256 x 5/LtSDELAY
- RETRIEVE Y
- GET BYTE FROM TAPE - LOADCOUNTER
- WAIT FOR 1 ~>0TRANSISITON -A START BIT
- WAIT HALF THE TIME, SOSAMPLING IN THE CENTRE
- FULL WAIT TIME BETWEENSAMPLES
(16 BITS) APPEAR IN A USABLE FORM FOR THE OUTSIDE WORLD. THE ACORNMONITOR USES DEVICE B1 TO CONTROL THE DISPLAY, CASSETTE INTERFACEAND KEYBOARD.EACH ONE OF THE 16 LINES MAY BE PROGRAMMED TO BE AN INPUT OR AN
CONTROLLINES
DB7-D80
OutputDefinitionRegister
OutputDefinitionRegister
PA7-PA0
INTR
PB7-PB0
BitOperation
ADG-AD0f[
128x8 RAM
if
8154 RAM I/O
OUTPUT DEPENDING ON THE STATE OF INTERNAL CONTROL REGISTERS.ONLY A GENERAL DESCRIPTION OF THE DEVICE IS GIVEN HERE, INADDITION TO THE FOLLOWING FUNCTIONS PORT A MAY BE SET TOOPERATE IN A VARIETY OF DIFFERENT HANDSHAKING TRANSFER MODESBY USE OF THE MODE DEFINITION REGISTER. IT SHOULD BE NOTED THATTHESE MODES REQUIRE CONNECTION OF INTERRUPT AND THAT THEINS8154 INTERRUPT LINE IS THE INVERSE OF THAT REQUIRED BY THEPROCESSOR.
THE 16 LINES ARE, AS YOU MIGHT EXPECT, DIVIDED INTO TWO SEPERATEBYTE SECTIONS A & B. A & B BOTH HAVE AN "OUTPUT DEFINITIONREGISTER" ASSOCIATED WITH THEM. EACH BIT IN THE O.D.R. DEFINES THEASSOCIATED BIT IN THE TORT' AS EITHER AN INPUT (0) OR AN OUPUT (1).THUS, IN THE MONITOR WE WRITE FF TO THE SEGMENT O.D.R. TO USE ALLITS LINES AS OUTPUTS, AND 'DISPLAY' WRITES 07 TO THE DIGIT DRIVEO.D.R. TO HAVE 3 OUTPUTS AND 5 INPUTS.NOT ONLY MAY WE READ/WRITE TO THE OUTPUT PORT USING THEPARALLEL READ & WRITE OPERATIONS, BUT WE MAY ALSO READ/WRITESINGLE BITS:
OPERATIONSETSETCLEARCLEARREADREADSETSETCLEARCLEARREAD
BIT0BIT 7BIT0BIT 7BIT0BIT 7BIT1BIT 6BIT 2BIT 5BIT4
PORTPORTPORTPORTPORTPORTPORTPORTPORTPORTPORT
AAAAAABBBBB
ADDRESS LOW1017000700 or 1007 or 17191E0A0D0Cor1C20212223
R/WWWWWRRWWWWRRorWRorWWW
PORT APORTBO.D.R.A.O.D.R.B.
IF YOU READ A SINGLE BIT IT WILL END UP IN BIT 7 OF A BYTE, THUS THEBIT INSTRUCTION WILL ASSIGN IT TO THE TESTABLE N FLAG.THE INS8154 ALSO CONTAINS A USEFUL 128 BYTES OF RAM. THIS ISCONTINUOUS FROM (ADDRESS LOW) 80 TO FF.DEVICE B1 IS ENABLED FOR ADDRESS HIGH OF 0E, DEVICE B2 IS AT 09.
FE3E
4042
4446
48FE4A
4C
4E50
FE52
54
56
585A5D
FE5E
FE60
62FE64
FE666868
FE6C
6D
FE6F
707174
7576777879
FE7A7C7E7F8284
E4
D0C9
90A9
D0C5F0
8549
29
C9
85
A68260A0
A0
D0A0
B5208888
B5
C8
482088
684A4A4A4A
8429A8B9A499
19
F038
0480
E60FE4
0F38
1F
10
0D
1A21
00
06
0B03
006F
01
7A
1A0F
EA1A10
0E
FE
FE
FF
00
BUTTON
PRESSED
OUTPUT
MHEXTD
RDHEXTD
QHEXTD1
QHEXTD2
DHEXTD
HEXTD
CPX
BNECMP
BCCLDA
BNECMPBEQ
2 COL
DELAY#38
PRESSED#80
KEYCLEAR2 EXECDELAY
STAZ EXECEOR #38
AND
CMP
# I F
#10
STA^-KEY
LDXSTYRTSLDA
LDY
BNELDY
LDAJSR IDEY
DEY
LDA
INY
PHAJSR IDEY
PLALSRLSRLSRLSR
STYANDTAYLDALDYSTA,
ZTX1PIB
(00, X)
#06
DHEXTD#03
Z&00DHEXTD
2,X 01
HEXTD
AAAA
2TY#0F
, Y FONTZTY,YD
ARE WE ON THE SAME KEY'SCOLUMN?NOHAS A KEY ACTUALLY BEENPRESSED?YESNO, THEN CLEAR THE EXECUTIONSTATUS - THE KEY HAS BEENPRESSED & RELEASEDALWAYS BRANCHA KEY HAS BEEN PRESSEDBUT IT HAS ALREADY BEENEXECUTEDSET IT AS BEING EXECUTEDJIGGERY POKERY TO ENCODE THEROW INPUTS TO BINARYALSO ENSURE THE KEY IN REPEATWAS OF REASONABLE SIZEA HEX KEY OR NOT? CARRY CLEARIF HEXPUT THE KEY IN A TEMP LOCATIONFOR FURTHER USE (BY "MODIFY")RETRIEVE XTURN THE SEGMENT DRIVES OFFAND RETURNMEMORY HEX TO DISPLAY = GET ABYTE FROM MEMORYRIGHT (OF DISPLAY) DOUBLE HEXTO DISPLAY : SET Y TO RIGHT OFDISPLAYAND USE DHEXTDQUAD HEX TO DISPLAY 1: SET YTO USE POSNS 1,2,3 & 42: USE ANY Y: GET THE DATAAND USE DHEXTD
HAVING DECREMENTED THEPOSITIONGET THE HIGH BYTE OF THE DATA& USE DHEXTDDOUBLE HEX TO DISPLAY : FIRSTHEX ON RIGHTEST POSITIONSAVE AUSE HEX TO DISPLAYGET Y BACK TO CORRECTPOSITIONRETRIEVE A
ORIENTATED FOR OTHER HEXDIGITHEX TO DISPLAY = SAVE YREMOVE SURPLUS BITS FROM A& PUT IT IN 7GET THE 7 SEGMENT FORMRETRIEVE YAND POSITION THE 7 SEG FORM ONTHE DISPLAY
ACORN MONITOR
ADDR HEXCODE
FE00 A0 06
LABEL
QUAD
FE0204
0708090A
FE0CFE0E
10
FE1315
171A
1D2022
2426
B5 00 STILL20 6F FE
CA888810 F6
86 1A DISPLAYA2 07 R ESC AN8E 22 0E
A0 00B5 10
SCAN
8D 21 0E8E 20 0E
AD 20 0E29 3F24 0F
10 1870 0A
INSTRUCTION
LDY #06
LDA ZX 00JSR DHEXTD
DEXDEYDEYBPLSTILL
STX Z TXLDX #07STX 1 ADDR
LDY #00LDA Z,X D
STA 1PIBSTX 1PIA
LDA 1PIAAND#3FBIT Z EXEC
BPL BUTTONBVS DELAY
28
2A
2C
2E
FE30
FE32
3335
FE36
38
3A3C
C9
B0
86
A9
85
88
D0CA10
A5
3010
38
06
19
40
0F
FD
DB
0E
D214
KEYCLEARDELAY
CMP #38
BCSDELAY
STX Z COL
LDA #40
STA 2 fecEC 'DEY
BNE DELAYDEXBPL SCAN
LDA Z REPEAT
BMI RESCANBPL OUTPUT
COMMENTS
DISPLAY THE 4 BYTES AT X - 3 . X - 2 ,X - 1 & X IN THAT ORDER ON THEDISPLAY- GET THE BYTE POINTED TO BY X- USE DOUBLE HEX TO DISPLAY
ROUTINE- NEXTX- NEXT Y POSITION
- FALL AUTO DISPLAY WHENFINISHED - Y POSITION & ALSOLOOP COUNTER
- SAVE X!!!!- SCAN 8 DIGITS, NO MATTER WHAT- SET UP DATA DIRECTION
REGISTER- CLEAR Y FOR LATER USE- GET DISPLAY DATA FROM THE
ZERO PAGE MEMORY- & PUT IT ONTO SEGMENTS- SET DIGIT DRIVE ON AND THE KEY
COLUMNS- GET KEY DIGIT BACK- REMOVE SURPLUS TOP BITS- CHECK STATUS ='I 'MEANS NOT
PROCESSING A KEY- BUT 0 MEANS THAT WE ARE- THUS CAN BE BLOWN TO AN
ESCAPE FROM THE DISPLAYROUTINE ALTOGETHER ON STATUSC0 AT THE MOMENT IT IGNORESKEYS IF GIVEN THIS STATUS
- CHECK FOR ALL 1'S ROW INPUTFROM KEYBOARD = SET COPY IOFSO
- IF ALL 1's THEN NO KEY HAS BEENPRESSED
- STORE THE PRESSED KEY'SCOLUMN INFORMATION
- SET STATUS TO "WE AREPROCESSING A KEY"
- Y WAS ZERO SO HERE IS A 256X5/JSDELAY
- Y WILL BE ZERO ON EXIT
- IF X WAS STILL TVE,CONTINUETHIS SCAN
- IF WE SHOULD CONTINUESCANNING THEN TOP BIT IS SET
- CONTINUE SCANNING- IF TOP BIT IS ZERO, THEN USE THIS
DATA AS THE KEY ITSELF
ALSO ON THE CPU BOARD ISA5V REGULATOR. THIS PROVIDES THEREGULATED +5V POWER SUPPLY USED BY ALLTHE I.C.S. ON THE BOARD, ANDTHE KEYBOARD/INTERFACE BOARD WHEN CONNECTED. IF THE 2704 OR2708 TYPE OF E.P.R.O.M. IS EMPLOYED IN SOCKET E, EXTRA +12 & - 5 VPOWER SUPPLY LINES ARE REQUIRED, AND TWO TRACKS ON THE P.C.B.NEED CUTTING.
THE TWO CUTS ARE ON THE REAROF THE MPU BOARD IN THE TOPLEFT HAND CORNER. X's MARKTHE SPOTS
(THERE IS NO PROVISION FOR ON-BOARD REGULATORS FOR THESE TWOEXTRA SUPPLIES).OF COURSE, THE 2716 EPROM NEEDS NO EXTRA SUPPLY LINES, AND IS THEDEVICE THAT THE P.C.B. WAS DESIGNED FOR, IT PLUGS STRAIGHT INTOSOCKET E.THE CONNECTOR H CARRIES THE ADDRESS BUS, THE DATA BUS, THECONTROL BUS, POWER SUPPLY LINES AND THE 16 INPUT/OUTPUT LINESFROM B2. THIS Wl LL PLUG INTO A BACKPLANE WHICH TAKES THE BUSSESTO OTHER ACORN CARDS.
5.5 THE KEYBOARD AND TAPE INTERFACEAT THE OTHER END OF THE BOARD, CONNECTOR I CARRIES ALL 16 I/O LINESFROM DEVICE B1, AS WELL AS OV, +5V, 02 & RESET LINES. WITH THEINTELLIGENT ACORN MONITOR AND THE KEYBOARD BOARD, THE I/O LINESARE DEDICATED AS FOLLOWS
SEGMENT DRIVESBINARY ENCODED DIGIT DRIVESKEYBOARD ROW INPUTSFROM COMPUTER TO CASSETTEFROM CASSETTE TO COMPUTER
B1 PORT B0-7A0-2A3-5A6A7
OUTPUTSOUTPUTSINPUTSOUTPUTINPUT
- A COMMENT FOR THOSE INTERESTED: ALTHOUGH THE KEYBOARD ONLYCONSISTS OF 24 KEYS AT PRESENT, IT IS POSSIBLE, WITH A PRIORITYENCODER ON THE ROW INPUTS, TO USE UP TO 56 KEYS. THE DISPLAYSUBROUTINE Wl LL COPE CORRECTLY WITH THE UNKNOWN KEYS, EXCEPTTHAT, AT THE POINT, OUTPUT, IT THROWS AWAY A SIGNIFICANT BIT OFINFORMATION. HOWEVER, THE ACTUAL KEY VALUE HAS BEEN STORED INLOCATION 000F AND SO CAN BE RECOVERED. THE UNKNOWN KEYS WILL NOTAFFECTTHE MONITOR ITSELF, SINCE AT THE POINT SEARCH MORE ITS OFINFORMATION IS THROWN AWAY, LEAVING THE MONITOR WITH A CHOICEOF EIGHT VALUES.THE SUBROUTINE DISPLAY RUNS THE DISPLAY IN A MULTIPLEXED MANNER,AT THE SAME TIME STROBING AND DEBOUNCING THE MATRIXED KEYBOARDON THE KEYBOARD BOARD. EACH OF THE EIGHT COLUMNS OF THE 8 X 3KEYBOARD IS DRIVEN BY ONE OF THE EIGHT DIGIT DRIVER LINES, THETHREE ROW LINES ARE CONNECTED TO DEVICE B1, AND THEY ARE PULLEDTO LOGIC ONE BY THE 4K7 RESISTORS. IN CONJUNCTION WITH ITS COLUMNBEING DRIVEN LOW, A CLOSED KEY PRODUCES A LOW ON ONE OF THE ROWINPUTS . • . +5V
4K7
M
8
0
G
9
1
P
A
2
S
B
3
L
C
4
R
D
5
t
E
6
F
7
1
ALL THE INTERFACE BETWEEN THE MICROPROCESSOR AND THE KEYBOARDAND DISPLAY IS THUS ACCOMPLISHED BY ONE OCTAL DECODER/DRIVERAND THREE RESISTORS.THE REST OF THE CIRCUITRY ON THE INTERFACEBOARD ALLOWS PROGRAMS TO BE RECORDED ON CASSETTE AT THIRTYBYTES PER SECOND, THE INTERFACE IS SLIGHTLY MORE COMPLICATEDTHAN THE SINGLE I.C. AND THREE RESISTORS USED ABOVE, IT HAS TWOTASKS.
I CONVERTTHE SERIALSTREAM OF INFORMATION PRODUCED BY PUTBYTEINTO TONES SUITABLE FOR AN UNMODIFIED CASSETTE RECORDER TORECORD.THE FREQUENCIES USED ARE 2403.8 HZ FORA LOGIC ONE AND1201.9 HZ FOR A LOGIC ZERO. THE FREQUENCIES ARE PRODUCED BYDIVIDING 02, WHICH IS CRYSTAL CONTROLLED AT 1 MHZ, BY 416 OR 832.
II CONVERT THE PLAYED BACK FREQUENCIES INTO A STREAM OF BINARYINFORMATION. THE PLAYBACK IS 'AMPLIFIED' INTO A SQUARE WAVE, ANDITS PERIOD IS COMPARED WITH THE PERIOD OF A REFERENCE DIGITALMONOSTABLE ON THE CIRCUIT BOARD
BECAUSE OF THE AMPLIFICATION STAGE, THE OUTPUT FROM A TAPERECORDER'S 'LINE' OUTPUT, OR THE 'EAR' JACK SOCKET, SHOULD PERFORMSATISFACTORILY EVEN AT MODEST VOLUME LEVEL. HOWEVER THECOMPUTER OUTPUT IS AT QUITE HIGH LEVEL AND SHOULD BE ATTENUATEDFOR THE TAPE RECORDER. TO PREVENT NOISE PICK-UP THIS SHOULD BE
WITH THE COMPLETE PROCESSOR STATUS RECOVERED. THUS, IF WE FINISHTHE PROGRAM020D 69 19 ADC #19020F 20 60FE JSR RDHEXTD0212 4C04FF JMP RESTART0215
AND PRESS R,THE DISPLAYED ANSWER WILL BE 03
6.3 THE SINGLE STEPPING FACILITYA MORE INTERESTING USE OF THE ROUTINE BREAK AT FFB3 IS IF YOU GENERATEGENERATE A NMI EVERY OPCODE FETCHED NOT IN THE MONITOR, AS DISCUSSEDDISCUSSED IN THE HARDWARE SECTION THE SYNC PULSE ISSUED DURING ANOPCODE FETCH IS LESS THAN 1 CYCLE LONG, WHILE NMI REQUIRES AT LEAST 2CYCLES. A LATCH IS REQUIRED TO STRETCH THE SYNC SIGNAL
V274L574BC 107
SYNC _ T L
PROMENABLESIGNAL
TO NMIOPENCOLLECTOR LINE
SINGLE STEP OPEN./ 4K7
AND IT ALSO ONLY PROVIDES AN NMI WHEN NOT IN THE MONITOR. BEFOREEXECUTING A PROGRAM SET THE NMI VECTOR (LOCATIONS 001C & 001D) TOBREAK (FFB3) THE PROGRAM COUNTER RECALCULATION, IN 001 B, SHOULDBE 00. EACH INSTRUCTION EXECUTED CAUSES THE MONITOR TO DISPLAY THESTATUS OF THE PROCESSOR, PRESSING R CAUSES THE NEXT INSTRUCTION TOBE EXECUTED. YOU MAY USE THE MONITOR TO ALTER A,X,Y (LOCATIONS)000A, B & C) OR P (AT STACK POINTER + 1), BEFORE THE NEXT STEP. IT ISINADVISABLE TO CHANGE PC (STACK POINTER +2 &+3), BUT THIS CAN BEDONE AS WELL. THE SINGLE STEP EXECUTION CAN BE STOPPED IN TWO WAYS1 GROUND NMI LINE/GROUND THE SET INPUT OF THE D FLIP-FLOPJi POINT THE NMI VECTOR AT AN RTI INSTRCTION, SAY THE ONE AT FFID(EXECUTION OF A PROGRAM WILL BE SLOWED DOWN BY A FACTOR OF 5 ORSO DUE TO THE PERSISTENT NMI'S.)AN IMPORTANT NOTE: THE BREAK ROUTINE SETS THE REPEAT LOCATIONTO FF, SO THAT IT, AND THE MONITOR, MAY SAFELY USE THE DISPLAYROUTINE. IF YOU NEED TO USE SINGLE SCANS AND BREAKS TO THE BREAKROUTINE, SOME INGENUITY WILL BE REQUIRED, OR SOME DEDICATEDBUTTON PUSHING.NOW THE COMPLETE MONITOR LISTING. THIS IS WRITTEN TO FIT IN THE TWO512X4 PROMS.
A F T E R T H E ADDRESS IS SET UP, THEN ANY KEY Wl LL CHANGE THE STATEOF IT'S CONTENTS: IF NOT A BREAK, A BREAK IS INSERTED, THEORIGINAL DATA IS SAVED IN LOCATION 0018. IF A BREAK,THEN THECONTENTS OF 0018 ARE INSERTED. THE RESULTING STATE OF THELOCATION IS DISPLAYED
DONE IN THE PLUG CONNECTING TO THE RECORDER
P. 0 2 0 0 0 0.
WE ARE NOW BACK AT FF04. BUT t & i NOW OPERATE ON THE P ADDRESS.CONTENTS OF A LOCATION MAY BE CHANGED AS IF THIS WERE M.PRESSING P TWICE WILL INSERT A BREAKPOINT (ONLY A SINGLELOCATION'S BACK-UP COPY IS RETAINED) AND SEND YOU BACK TO FF04.THE M KEY WILL RETURN IT'S MEMORY ADDRESS WHEN PRESSED
NOW THE PROGRAM IS SITTING THERE WITH A BREAK AT 0200. EXECUTIONOF THIS BREAK Wl LL CAUSE AN I RQ AND CONTROL IS TRANSFERRED TOTHE ADDRESS IN LOCATION 00IE & 001 F: FOR DIAGNOSTICS THIS ADDRESSSHOULD BE FFB3 (THE B3 IN 00IE&THE FF IN 00TE) ALSO .--•• 1^THE PROGRAM COUNTER REQUIRES RESETTING AFTER A BREAK. THEAMOUNT BY WHICH THIS IS DONE, 02, SHOULD BE STORED IN LOCATION 00IBNOW EXECUTING THE BREAK CAUSES THE STATUS OF THE PROCESSOR TOBE DISPLAYED IN THE FOLLOWING FORM
(HEX PAIRS OF DATA IN EACH)(TWO BYTES EACH, SECOND SET DISPLAYED
AFTER ANY KEY IS PRESSED).
-SET INTERRUPT DISABLE-CLEAR OVERFLOW-CLEAR CARRY-SET DECIMAL MODE11
33-INITIALISE STACK22
FOR THE FIRST DISPLAY SET AND
FOR THE SECOND SET.THE ACTIVE FLAGS ARE THE DECIMAL AND INTERRUPT DISABLE FLAGS,(THE 2 PART OF THE STATUS REGISTER'S 2C IS AN UNUSED FLAG), THEPROGRAM WAS STOPPED AT LOCATION 020D WITH AN EMPTY STACK (THREEBYTES, PCH, PCL, P, WERE AUTOMATICALLY STACKED BY THE BRKINSTRUCTION). YOU MAY NOW CONTINUE TO WRITE (OR CORRECT) THEPROGRAM, USING THE MONITOR AS USUAL (BUT AVOID PRESSING THE RESETKEY SINCE THE STACKED PCH, PCL & P WILL BE DESTROYED) PRESSING THER KEY WILL RETURN YOU TO 0200 TO TRY CONTINUING THE PROGRAM,
FIRST DISPLAY SETSECOND DISPLAY SET:
THIS PROGRAM02000201020202030204020602080209020B020 D020 ECAUSES
78B818F8A9 11A2 FFA0339AAZ2200
1 102
A XPC
SEICLVCLCSEDLDALDXLDYTXSLDXBRK
2 2 30 D0
Y PSP
#11#FF#33
#22
3 3 C1 FC
PLUGSCREENED LEAD
'FROM'TAPEGROUND
BEST RECORDING RESULTS WITH A LEVEL OF ABOUT TWO-THI RDS MAXIMUMLEVEL. THE VERY CHEAPEST TAPE RECORDERS SOMETIMES USE A DC. ERASESYSTEM, AND SUBSTANTIALLY POORER RESULTS MAY OCCUR ON RECORDINGOVER AN ALREADY RECORDED SECTION OF TAPE. HIGH FREQUENCYRESPONSE IS ATAPREMIUM IN THIS APPLICATION, THE TAPE RECORDER'SHEADS SHOULD BE CLEANED FREQUENTLY, AND, PREFERABLY,DEMAGNETISED EVERY'8-10 HOURS. LOW QUALITY TAPES SHOULD BEAVOIDEDSINCETHEYOFTENCAUSEVERY FAST BUILD UP OF DIRT ON THEHEADS. THE SPEED OF THE REPLAYED DATA SHOULD NOT DEVIATE BEYOND±5% OF THE RECORDED SPEED, SO DON'T USE BATTERIES FOR POWER, (OR C12<ZCASSETTES SINCE THE THINNER, HEAVIER TAPE OFTEN GETS STUCK). CLEANTHE EXPOSED CAPSTAN AND PRESSURE WHEEL WHEN YOU CLEAN THEHEADS: A HEAD CLEANING TAPE MAY NOT MANAGE TO REMOVE OXIDEBUILD-UP FROM THE MECHANISM.
5.6 POWER SUPPLYTHETWOBOARDSARESUPPLIEDBYTHE5V REGULATOR ON THE CPU BOARD.IF ALL THE I.C.S. ARE IN PLACE ON THE CPU BOARD, THEN AT LEAST 600 MAIS REQUIRED. PROPER REGULATION IS ENSURED BY NEVER LETTING THEINPUT UNREGULATED SUPPLY DROP BELOW +7V. WHI LE THE REGULATOR ISPERFECTLY HAPPY WITH+27V INPUT, IT WILL NEED TO DISSIPATE 13.2W ANDWILL GET EXTREMELY HOT.. . AND TURN ITSELF OFF DUE TO THERMALOVERLOAD, LOSING YOUR NICE PROGRAM IN THE R.A.M. UNLESS ANADDITIONAL HEAT SINK IS USED,+12V SHOULD BE REGARDED AS ANABSOLUTE MAXIMUM UNREGULATED INPUT, THE REGULATOR WILL NOT GETSO HOT ASTO TURN ITSELF OFF, BUT YOU MIGHT RECEIVE ABURN IF YOUTOUCH IT.
ADDITIONAL HEATSINK
CHAPTER 6: FIRMWARE6.1 TAPE STORE AND LOADIN THE SOFTWARE SECTION WE USED SOME OF THE FUNCTIONS OF THEACORN MONITOR TO WRITE AND EXECUTE SOME SIMPLE PROGRAMS WHICHDEMONSTRATED FEATURES OF THE MICROPROCESSOR AND PROGRAMMING.THE MONITOR IS MORE POWERFUL THAN DEMONSTRATED IN THAT SECTION,AND HERE WE'LL EXAMINE IT MORE CLOSELY, AND GIVE A COMPLETELISTING OF IT. AFTER THE M# G, t AND I KEYS, THE MOST USEFUL KEYS Wl LLPROBABLY BE S AND L THESE ENABLE YOU TO STORE AND LOADPROGRAMS OF ANY SIZE USING CASSETTE TAPE OR A SIMI LAR RECORDINGMEDIUM. LET'S ASSUME WE WISH TO CREATE A TAPE VERSION OF THE DUCK-SHOOT GAME. THIS WILL HAVE BEEN ENTERED IN MEMORY FROM ADDRESS,SAY, 0200 TO ADDRESS 023F INCLUSIVE. AFTER TESTING THAT THEPROGRAM ACTUALLY DOES WORK, PRESS THE S KEY.
F. XXXX
THE MONITOR IS PROMPTING YOU TO ENTER THE ADDRESS FROM WHICHYOU WANT TO RECORD. THE DISPLAYED ADDRESS IS EITHER GARBAGEOR THE LAST END ADDRESS USED. ENTER THE ADDRESS, TERMINATINGWITH ANY COMMAND KEY
F. 0 2 00XXXX
THE MONITOR IS NOW PROMPTING YOU TO ENTER THE END ADDRESS. THISIS THE ADDRESS OF THE LAST BYTE IN YOUR PROGRAM + 1. THEDISPLAYED ADDRESS IS EITHER GARBAGE OR THE LAST END ADDRESSUSED. ENTER THE ADDRESS, BUT DONT TERMINATE IT YET
0 2 4 0
THE SYSTEM IS NOW READY TO SERIALLY OUTPUT THAT SECTION OFMEMORY. YOU SHOULD RECORD A BRIEF VERBAL DESCRIPTION OF THEPROGRAM - "DUCKSHOOT" - AND ALSO THE ADDRESSES (OR ADDRESS OFSTART AND LENGTH) WHICH THE PROGRAM USES. KEEP A LIST OF WHICHPROGRAMS ARE STORED ON EACH TAPE. NOW CONNECT IN THE COMPUTERAND START RECORDING. AFTER A FEW SECONDS, PRESS ANY COMMANDKEY TO TERMINATE THE ADDRESS ENTRY. THE DISPLAY Wl LL GO BLANK,WHILE THE PROCESSOR DEVOTES ITSELF TO SENDING THE INFORMATIONTO THE TAPE. WHEN THE DISPLAY
0 2 4 0
REAPPEARS, YOU MAY STOP THE TAPE-RECORDER: THE RECORDING ISCOMPLETE, AND YOU ARE BACK AT FF04. ANY HEX KEY HERE Wl LL BRINGBACK THE MONITOR'S DOTS, OR YOU MAY JUST START USING THEMONITOR. THE RECORDING PROCEEDS AT 30 BYTES PER SECOND, THISPROGRAM, AT 68 BYTES (PROGRAM LENGTH + 4 BYTES OF ADDRESSINFORMATION) TOOK ONLY TWO SECONDS TO RECORD.
TO LOAD A PROGRAM FROM THE TAPE YOU SHOULD BE IN A SITUATIONWHERE MONITOR COMMANDS ARE ACCEPTED, NOT WHERE YOU AREALLOWED ANY KEY TO TERMINATE AN ADDRESS ENTRY. PLAY THE TAPE,AND, WHEN THE 2403.8 HZ LEADER IS HEARD, PRESS THE L KEY. THEDISPLAY WILL BE BLANK UNTIL DATA IS ENCOUNTERED ON TAPE, WHENEACH BYTE ENTERED WILL BE DISPLAYED AS A SYMBOL ON THE LEFTMOSTDIGIT. WHEN THE LAST BYTE HAS BEEN READ THE PREVIOUS DISPLAY Wl LLRETURN - YOU'RE AT FF04 AGAIN. THE ADDRESSES INTO WHICH THEPROGRAM IS LOADED WILL BE THOSE WITH WHICH IT WAS STORED ON TAPE,BUT YOU MAY WISH TO DELIBERATELY AVOID THIS. JUST USING THE MONITOR,THE BEST THAT CAN BE DONE IS TO TREAT THE ENTIRE RECORDING AS DATAAND LOAD ENOUGH OF IT TO FIT BETWEEN TWO ADDRESSES: THE FIRSTFOUR BYTES LOADED WILL THUS BE THE ORIGINAL ADDRESSES THEPROCEDURE IS
I SET ADDRESSES 0008 & 0009 TO THE LOW & HIGH BYTE OF THE ADDRESSINTO WHICH YOU WISH TO PUT THE FIRST BYTE.
II SET ADDRESSES 000A&000B TO THE LOW & HIGH BYTE OF THE LASTADDRESS +1 INTO WHICH YOU WANT THE DATA TO BE LOADED.
I11 SET UP THE GO ADDRESS OF FF8A. START THE PLAYBACK, WHEN YOUHEAR THE 2403.8 HZ LEADER, PRESS ANY KEY TO GO. LOADING Wl LLOCCUR BETWEEN THE ADDRESSES SPECIFIED.
THE ABOVE PROCEDURE MAY NOT BE SATISFACTORY: IT LOADS THEPROGRAM'S ADDRESSES AS DATA, AND DESTROYS THE DATA IN REGISTERS0 AND 1 (A & X AFTER A BREAKPOINT) BETTER METHODS ARE GIVEN IN THESYSTEM SECTION OF THE APPLICATION PROGRAMSTHE LAST COMMENT ON LOAD FROM TAPE IS THAT IT IS POSSIBLE TOCREATE A PROGRAM ON TAPE THAT WILL, WHEN LOADED, SEIZE CONTROLAND EXECUTE ITSELF THIS IS IDEAL FOR, SAY, A BASIC INTERPRETER: YOUJUST HAVE TO LOAD IT, AND IT AUTOMATICALLY SETS ITSELF RUNNINGAND PROMPTS READY. THE IDEA IS TO LOAD THE PROGRAM INTO THEMONITOR^ ZERO PAGE REGISTERS, LOADING THE PROGRAM START ADDRESSINTO GAP AND THE GO KEY (II) INTO REPEAT. CARE MUST BE TAKEN WHENYOU LOAD INTOfAPANDTAP: YOU MUST BE SURE TO LOAD WHAT'SALREADY THERE, OR SOMETHING SENSIBLE!
6.2 THE BREAKPOINT AND RESTORE COMMANDTHE FINAL TWO MONITOR FUNCTIONS ARE EMBODIED BY THE KEYS R ANDP. YOU MAY ALREADY HAVE DISCOVERED THAT PRESSING R IS DISASTROUS,AND THAT PIS LIKE M, BUT WITH A PENCHANT FOR INSERTING 00 INTO THEADDRESS SPECIFIED. WITH THESE KEYS YOU ARE EXPECTED TO DEBUG (ABUG IS ANY SMALL MISTAKE PREVENTING A PROGRAM FROMFUNCTIONING) YOUR PROGRAMS. THE P KEY ALLOWS YOU TO INSERT THEBREAK INSTRUCTION ON TOP OF AN INSTRUCTION AT A POINT WHERE YOUSUSPECT SOMETHING SUSPICIOUS IS HAPPENING, SAY 0200:
P. 0 2 0 0