925 lines
26 KiB
Plaintext
925 lines
26 KiB
Plaintext
|
|
**************************************************************
|
|
* MACHINE LANGUAGE TUTORIAL *
|
|
* *
|
|
* *
|
|
* BROUGHT TO YOU BY: *
|
|
* *
|
|
* THE SHOALIN TEMPLE OF THE DRAGON BBS *
|
|
* ([408] 739-5370) *
|
|
**************************************************************
|
|
|
|
MACHINE CODE
|
|
|
|
BY
|
|
|
|
TOM O'BRIEN
|
|
|
|
[EDITOR'S NOTE: THIS TUTORIAL FROM TOM O'BRIEN OF THE GREEN APPLE
|
|
USERS GROUP IN CEDAR FALLS IOWA IS DERIVED FROM A SERIES OF LESSONS ON
|
|
MACHINE LANGUAGE PROGRAMMING WHICH WERE DISTRIBUTED ON A TUTORIAL DISK
|
|
PRODUCED BY THAT CLUB. I HAVE TAKEN THE LIBERTY OF ALTERING HIS WORK
|
|
TO SUIT THE FORMAT OF THIS DISK. ]
|
|
|
|
INTRODUCTION
|
|
|
|
IT IS DIFICULT TO TELL WHERE TO START WITH SOMETHING LIKE THIS COURSE.
|
|
MAYBE "COURSE" ISN'T THE RIGHT WORD. WHAT I HOPE TO BE ABLE TO DO IS
|
|
TO GIVE YOU A ROADMAP WHICH YOU CAN FOLLOW TO EXPLORE THE INSIDE
|
|
WORKINGS OF YOUR COMPUTER. I'LL TRY TO START OUT WITH LOTS OF DETAILS
|
|
SO YOU CAN TELL WHICH WAY TO GO. AS THINGS GO ON, THE DETAILS WILL GET
|
|
LEFT BEHIND. THEY WILL BE THINGS FOR YOU TO FIGURE OUT ON YOUR OWN.
|
|
|
|
I'M NOT GOING TO DO THE WORK FOR YOU. I'LL TRY TO ANSWER QUESTIONS YOU
|
|
HAVE AND I'LL TRY TO HELP YOU....BUT, YOU WILL HAVE TO DO THE WORK
|
|
YOURSELF.
|
|
|
|
STARTING WITH THE MINI-ASSEMBLER
|
|
|
|
WE WILL USE THE MINI-ASSEMBLER THAT IS AVAILABLE IN INTEGER BASIC. IF
|
|
YOU HAVE AN INTEGER CARD OR A LANGUAGE CARD (16K RAM CARD) OR HAVE A
|
|
64K MACHINE (EG THE APPLE //E), THEN THE MINI- ASSEMBLER IS AVAILABLE
|
|
TO YOU. IF YOU HAVE AN APPLE ][ PLUS WITHOUT A 16K RAM CARD, YOU WILL
|
|
NEED TO ACCESS THE MINI-ASSEM BLER FROM THE FILE ON THIS COPY OF THE
|
|
IAC MACHINE LANGUAGE UTILITIES DISK.
|
|
|
|
I WON'T TRY TO TELL YOU WHAT A MINI-ASSEMBLER IS AT THIS TIME, OTHER
|
|
THEN IT IS A TOOL WHICH WILL HELP YOU TO CREATE MACHINE LANGUAGE
|
|
PROGRAMS.
|
|
|
|
LET'S START WITH A SIMPLE PROGRAM.
|
|
|
|
ENTER:
|
|
|
|
]CALL-151
|
|
|
|
TO JUMP INTO THE APPLE'S MONITOR.
|
|
|
|
* IS THE PROMPT CHARACTER WHICH INDICATES THAT YOU ARE IN THE HEART OF
|
|
THE MACHINE.
|
|
|
|
TYPE IN THE FOLLOWING:
|
|
|
|
1000:A9 C8 8D 48 06
|
|
|
|
1000G
|
|
|
|
YOU SHOULD SEE THE CHARCTER "H" ON THE THE RIGHT HAND SIDE IN THE
|
|
MIDDLE OF THE SCREEN.
|
|
|
|
TYPE IN THE FOLLOWING:
|
|
|
|
1000:A9 C5 8D 48 06
|
|
|
|
1000G
|
|
|
|
YOU SHOULD NOW SEE THE CHARACTER "E" WHERE THE "H" WAS LOCATED.
|
|
|
|
BY NOW YOU MAY BE WONDERING WHERE THIS IS LEADING TO. MACHINE CODE IS
|
|
A LOT CLOSER TO THE ACTUAL HEART OF THE MACHINE THAN IS BASIC. THERE
|
|
ARE SOME ADDRESSES THAT YOU MUST KEEP TRACK OF (EG $0648 IS AN ADDRESS
|
|
IN THE LOW-RES SCREEN). THERE ARE NUMBERS WHICH YOU MUST KEEP TRACK OF
|
|
(EG. $C8 IS "H" AND $C5 IS "E").
|
|
|
|
YOU MUST THINK IN TERMS OF HEXADECIMAL INSTEAD OF DECIMAL. $1000 IN
|
|
HEX IS 4096 IN DECIMAL.
|
|
|
|
4096 256 16 1
|
|
|
|
1000 100 10 1
|
|
|
|
$100 IN HEX IS 256 DECIMAL $ 16 IN HEX IS 22 DECIMAL $ A IN HEX IS 10
|
|
DECIMAL
|
|
|
|
IN BASIC WE COULD HAVE THE STATEMENT
|
|
|
|
GET A$
|
|
|
|
IN ASSEMBLY LANGUAGE WE WOULD HAVE SOMETHING LIKE:
|
|
|
|
1000: LDA $C000
|
|
1003: BPL $1000
|
|
|
|
AS WE WILL SEE IN THE LESSON ON THE KEYBOARD, $C000 IS A PHYSICAL
|
|
ADDRESS OR LOCATION WHICH REFERS TO THE APPLE'S KEYBOARD. WHEN A KEY
|
|
HAS BEEN PRESSED THE ADDRESS $C000 WILL BE NEGATIVE. (ANOTHER WAY OF
|
|
SAYING THE SAME THING IS THAT ITS HIGH BIT WILL BE SET OR EQUAL TO ONE
|
|
WHEN A KEY IS PRESSED.)
|
|
|
|
TO RESET THE KEYBOARD SO THAT WE CAN TELL WHEN ANOTHER KEY HAS BEEN
|
|
PRESSED WE HAVE TO LOOK AT ADDRESS $C010. BY STORING SOMETHING OR
|
|
GETTING SOMETHING AT THAT ADDRESS ($C010), THE COMPLEMENTARY LOCATION
|
|
$C000 IS NOW READY TO CAPTURE AND HOLD THE CODE FOR THE NEXT KEY THAT
|
|
IS PRESSED. (STORING OR WRITING TO $C010 CAUSES THE HIGH BIT AT $C000
|
|
WILL GO LOW [=0]).
|
|
|
|
IT MIGHT BE PARENTHETICALLY ADDED THAT THE APPLE II REFERENCE MANUAL
|
|
IS OF GREAT HELP IN UNDERSTANDING MACHINE CODE ON THE APPLE. THE
|
|
MANUAL HAS CHARTS AND LISTS ON THE ACTUAL ADDRESSES THAT WE WILL NEED
|
|
TO KNOW. JUST LIKE YOU MUST KNOW SOMEONE'S MAILING ADDRESS TO SEND
|
|
THEM A LETTER, YOU MUST KNOW YOUR COMPUTER'S ADDRESSES TO DISPLAY
|
|
SOMETHING ON THE SCREEN. (IT HAS MORE THAN ONE SCREEN). THE APPLE II
|
|
REFERENCE MANUAL WILL THEREFORE BE USED TO FIND LOCATIONS INSIDE THE
|
|
COMPUTER LIKE WE WOULD USE A PHONE BOOK TO LOOK UP A FRIENDS ADDRESS.
|
|
|
|
LETS GO INTO THE MINI-ASSEMBLER:
|
|
|
|
]INT
|
|
|
|
> CALL -151
|
|
|
|
* F666G
|
|
|
|
NOW ENTER:
|
|
|
|
!1000:LDA #$C1
|
|
STA $0468
|
|
LDA #$C2
|
|
STA $0469
|
|
|
|
AS YOU TYPE IN THE ABOVE, YOU WILL SEE:
|
|
|
|
1000- A9 C1 LDA #$C1
|
|
1002- 8D 68 04 STA $0468
|
|
1005- A9 C2 LDA #$C2
|
|
1007- 8D 69 04 STA $0469
|
|
|
|
A WORD OF EXPLANATION:
|
|
|
|
1000 IS THE ADDRESS OF A9 WHICH IS THE MACHINE CODE FOR LOAD THE
|
|
ACCUMULATOR (LDA) IMMEDIATELY. 1001 IS THE ADDRESS OF C1 WHICH IS THE
|
|
HEXADECIMAL NUMBER THAT WILL BE LOADED INTO THE ACCUMULATOR. LDA #$C1
|
|
IS A EASIER WAY FOR US TO DEAL WITH THE MACHINE.
|
|
|
|
1002 IS THE ADDDRESS OF 8D WHICH IS THE MACHINE CODE FOR STORE WHAT IS
|
|
IN THE ACCUMULATOR (STA) AT THE ABSOLUTE ADDRESS IN THE NEXT TWO
|
|
BYTES, IN THIS CASE 1003 AND 1004.
|
|
|
|
IF THIS DOESN'T MAKE SENSE TO YOU, PLEASE KEEP AT IT. HOPEFULLY AS
|
|
YOU SEE AND FOLLOW MORE EXAMPLES, THE FOG WILL LIFT A LITTLE.
|
|
|
|
NOW LET'S RUN THE ROUTINE BY JUMPING TO MEMORY LOCATION $1000 WITH THE
|
|
MINI-ASSEMBLER COMMAND
|
|
|
|
! $1000G
|
|
|
|
(THIS TELLS THE APPLE TO GO TO LOCATION $1000 AND START EXECUTING
|
|
WHAT'S THERE.)
|
|
|
|
WHAT HAPPENED? DID ANY CHARACTERS APPEAR ON THE SCREEN? WERE THEY "A"
|
|
AND "B"? WERE THEY NEXT TO EACH OTHER?
|
|
|
|
IN STARTING TO LEARN MACHINE LANGUAGE PROGRAMMING, IT IS COMMON TO USE
|
|
THE LOW-RESOLUTION SCREEN... GETTING TO KNOW HOW WE CAN CONTROL WHAT
|
|
IS ON THE SCREEN. WE WILL INPUT DATA FROM THE KEYBOARD AND DISPLAY IT
|
|
ON THE SCREEN.
|
|
|
|
LETS' GO BACK TO THE MINI-ASSEMBLER AND ENTER:
|
|
|
|
*F666G
|
|
|
|
! 1000: LDA $C000
|
|
BPL $1000
|
|
STA $0468
|
|
LDA $C010
|
|
JMP $1000
|
|
|
|
AS YOU TYPE IN THE ABOVE, YOU SHOULD SEE
|
|
|
|
1000- AD 00 C0 LDA $C000
|
|
1003- 10 FB BPL $1000
|
|
1005- AD 68 04 STA $0468
|
|
1008- AD 10 C0 LDA $C010
|
|
100B- 4C 00 10 JMP $1000
|
|
|
|
! $1000G
|
|
|
|
NOW PRESS DIFFERENT KEYS ON YOUR COMPUTER. TRY CONTROL CHARACTERS...
|
|
WHAT DOES ESCAPE LOOK LIKE? WHAT DOES A RETURN LOOK LIKE?
|
|
|
|
CAN YOU GET OUT OF THE PROGRAM? DOES CONTROL-C STOP IT?
|
|
|
|
ONE THING YOU PROBABLY KNOW IS THAT IF YOU HAVE AN OLD APPLE ][
|
|
WITHOUT THE AUTOSTART ROM, HITTING THE RESET KEY WILL EXIT FROM THE
|
|
MINI-ASSEMBER INTO THE MONITOR (* PROMPT). WITH THE NEWER AUTOSTART
|
|
ROM MADE IN THE PAST COUPLE OF YEARS, EXITING THE MONITOR CAN BY DONE
|
|
BY THE RESET WHICH DUMPS YOU TO APPLESOFT AND THEN RE-ENTER THE
|
|
MONITOR BY
|
|
|
|
>CALL -151
|
|
|
|
OR REQUIRES THE COMMAND:
|
|
|
|
! $FF69G
|
|
|
|
WHICH TELLS THE COMPUTER TO GO TO THE MACHINE LANGUAGE LOCATION $FF69
|
|
AND DO WHATEVER IS THERE.
|
|
|
|
LET'S LOOK AT THE LAST PROGRAM WE RAN.
|
|
|
|
1000- AD 00 C0 LDA $C000
|
|
|
|
THIS COMMAND MEANS LOAD THE ACCUMULATOR WITH THE VALUE OF THE BYTE
|
|
THAT IS AT HEXIDECIMAL ADDRESS $C000. THIS IS THE ADDRESS OF THE
|
|
KEYBOARD, AND SO THIS LINE OF CODE LOOKS AT THE KEYBOARD.
|
|
|
|
THE NEXT LINE IS:
|
|
|
|
1003- 10 FB BPL $1000
|
|
|
|
WHICH IS BRANCH POSITIVE TO $1000 (OR BRANCH ON PLUS TO $1000). 10 IS
|
|
THE OP CODE...BRANCH POSITIVE FB IS THE OFFSET....HOW FAR TO BRANCH
|
|
|
|
TO DIGRESS TO THE PROGRAM COUNTER (PC) FOR A MOMENT, WHEN THE
|
|
MICROPROCESSOR GETS CODE, THE PROGRAM COUNTER POINTS AT 1005, WHICH IS
|
|
ONE BYTE PAST THE INSTRUCTION BEING EXECUTED. WE ADD $FB TO THE LOW
|
|
BYTE OF THE PROGRAM COUNTER, $05
|
|
|
|
$FB+$05= $00 DISREGARD CARRY
|
|
|
|
PUTTING THE PROGRAM COUNTER, PC, BACK TOGETHER, WE BRANCH TO MEMORY
|
|
LOCATION $1000 IF THE ACCUMULATOR IS POSITIVE AFTER BEING LOADED WITH
|
|
THE VALUE OF THE BYTE THAT IS IN $C000.
|
|
|
|
THIS CAUSES THE PROGRAM TO STAY IN THE LOOP
|
|
|
|
1000- LDA $C000
|
|
1003- BPL $1000
|
|
|
|
UNTIL A KEY IS PRESSED. THE EQUIVALENT BASIC PROGRAM WOULD BE:
|
|
|
|
10 X = PEEK ( - 16384 )
|
|
20 IF X >= 128 GOTO 10
|
|
30 REM CONTINUE...
|
|
|
|
IF YOU ARE INTERESTED IN TECHNICAL DESCRIPTIONS, HERE IS WHAT
|
|
HAPPENED. PRESSING A KEY SETS CLOCKS THE "D" VALUE OF A D- FLIP FLOP
|
|
INTO THE "Q" OUTPUT. SINCE "D" IS TIED HIGH, THE "Q" OUTPUT GOES HIGH.
|
|
THIS IS BIT 8 (THE HIGH BIT) OF WHAT IS AT $C000. FOR THOSE OF YOU WHO
|
|
KNOW HARDWARE, THE FLIP-FLOP IS A 74LS74 AT LOCATION B-10 ON THE
|
|
APPLE'S MOTHERBOARD.
|
|
|
|
ONCE THE KEY IS PRESSED AND $C000 IS NEGATIVE (A NUMBER IS NEGATIVE IF
|
|
ITS HIGH BIT IS SET), WE FALL THROUGH THE BRANCH INSTRUCTION
|
|
|
|
1005- STA $0468
|
|
|
|
THIS INSTRUCTS THE CPU (MICROPROCESSOR) TO STORE WHAT IS IN THE
|
|
ACCUMULATOR AT LOCATION $0468. $0468 IS ONE LOCATION IN THE LOW- RES
|
|
SCREEN, PAGE ONE.
|
|
|
|
THE NEXT INSTRUCTION IS
|
|
|
|
1008- LDA $C010
|
|
|
|
OR LOAD THE ACCUMULATOR WITH WHAT IS AT $C010. THIS WILL CLEAR THE
|
|
FLIP-FLOP THAT WAS SET WHEN A KEY WAS PRESSED. THE ADDRESS $C010 IS
|
|
DECODED BY SEVERAL CHIPS AND SENT THROUGH A NOR GATE (74LS02 AT
|
|
LOCATION A12) TO THE CLEAR INPUT OF THE FLIP-FLOP AT LOCATION B10. NOW
|
|
WHEN WE LOOK AT LOCATION $C000 THE HIGH BIT WILL BE LOW AND THE NUMBER
|
|
WE SEE WILL BE POSITIVE. (ONE NOTE:THE HIGH BIT OF THE FLIP-FLOP IS
|
|
HELD LOW DURING POWER-UP OR A RESET)
|
|
|
|
THE NEXT INSTRUCTION IS
|
|
|
|
100B- JMP $1000
|
|
|
|
OR JUMP TO LOCATION $1000 WHICH GETS THE NEXT KEYSTROKE AND STARTS THE
|
|
PROCESS OVER AGAIN.
|
|
|
|
LESSON THREE
|
|
|
|
LET'S USE A SHORT MACHINE CODE PROGRAM WITH A BASIC PROGRAM.
|
|
|
|
GO TO BASIC (USE INTEGER BASIC IF YOU HAVE IT, TO AVOID RELOADING THE
|
|
MINI-ASSEMBLER AGAIN).
|
|
|
|
10 CALL 4096
|
|
20 END
|
|
|
|
GO TO MONITOR
|
|
|
|
CALL-151
|
|
|
|
* F666G (OR WHATEVER CALL GETS THE MINI-ASSEMBLER)
|
|
|
|
! 1000: LDA #$B1
|
|
1002: STA $0770
|
|
1005: RTS
|
|
|
|
* $9DBFG RETURN TO BASIC THRU DOS
|
|
|
|
RUN
|
|
|
|
WHAT HAPPENED? DID YOU SEE "1" ON THE SCREEN IN THE LOWER RIGHT HAND
|
|
SIDE?
|
|
|
|
LINE 10....CALL 4096
|
|
|
|
IF WE CONVERT 4096 TO HEXIDECIMAL WE END WITH $1000. THIS IS THE
|
|
ADDRESS ON THE SHORT MACHINE CODE PROGRAM WE WROTE. THE BASIC LINE
|
|
INSTRUCTED TO COMPUTER TO JUMP TO THE MACHINE LANGUAGE SUBROUTINE AT
|
|
MEMORY LOCATION 4096 AND EXECUTE THE INSTRUCTIONS THERE.
|
|
|
|
OUR MACHINE CODE PROGRAM LOADS THE ACCUMULATOR WITH THE HEX NUMBER $B1
|
|
AND THEN STORES THE ACCUMULATOR IN THE LOW-RES SCREEN AT LOCATION
|
|
$0770.
|
|
|
|
WE THEN DID A "RTS" WHICH STANDS FOR RETURN FROM SUBROUTINE. THE
|
|
PROGRAM RETURNS TO THE PROGRAM THAT CALLED IT, WHICH IN THIS CASE IS
|
|
THE SHORT BASIC PROGRAM.
|
|
|
|
LATER WE WILL LOOK AT WHAT IS CALLED THE STACK AND THE STACK POINTER
|
|
AND SEE HOW TO USE IT. (THE STACK IS THE AREA OF MEMORY FROM $0100 TO
|
|
$01FF. THE STACK POINTER IS A NUMBER BETWEEN $00 AND $FF.)
|
|
|
|
MEANWHILE, LET'S DO ANOTHER SHORT PROGRAM.
|
|
|
|
GO TO MONITOR.
|
|
|
|
CALL-151
|
|
|
|
AND ENTER THE MINI-ASSEMBLER WITH
|
|
|
|
*F666G (OR WHEREVER YOU HAVE LOCATED IT. IT MAY BE NECESSARY TO RELOAD
|
|
THE MINI-ASSEMBLER IF YOU WERE IN APPLESOFT.)
|
|
|
|
! NOW WE ARE IN THE MINI-ASSEMBER
|
|
|
|
! 1000: LDA #$00
|
|
STA $0400
|
|
INC $1001
|
|
INC $1003
|
|
JMP $1000
|
|
|
|
THIS SHOULD LOOK LIKE:
|
|
|
|
1000- A9 00 LDA #$00
|
|
1002- 8D 00 04 STA $0400
|
|
1005- EE 01 10 INC $1001
|
|
1008- EE 03 10 INC $1003
|
|
100B- 4C 00 10 JMP $1000
|
|
|
|
THE FIRST LINE: LDA #$00 LOAD THE ACCUMULATOR IMMEDIATELY WITH THE
|
|
HEX NUMBER $00.
|
|
|
|
THE SECOND LINE: STA $0400 STORE THE VALUE IN THE ACCUMULATOR IN
|
|
MEMORY LOCATION $0400.
|
|
|
|
THE THIRD LINE: INC $1001 INCREMENT MEMORY LOCATION $1001 OR, SAID IN
|
|
ANOTHER WAY, ADD ONE TO THE VALUE THAT IS IS IN MEMORY LOCATION
|
|
$1001.
|
|
|
|
THE FOURTH LINE: INC $1003 INCREMENT MEMORY LOCATION $1003 OR, SAID
|
|
ANOTHER WAY, ADD ONE TO THE VALUE IN MEMORY LOCATION $1003.
|
|
|
|
THE FIFTH LINE: JMP $1000 JUMP TO MEMORY LOCATION $1000 WHICH IS THE
|
|
START OF OUR PROGRAM.
|
|
|
|
BEFORE YOU RUN THIS PROGRAM, TRY TO STEP THROUGH THE PROGRAM. CAN YOU
|
|
PREDICT WHAT IT IS GOING TO DO?
|
|
|
|
NOW, GO TO BASIC (INTEGER IF POSSIBLE)
|
|
|
|
> CALL-151
|
|
|
|
* F666G
|
|
|
|
! TYPE IN THE PROGRAM. WE ARE IN THE MINI-ASSEMBLER.
|
|
|
|
WHEN YOU ARE FINISHED, ENTER THE MONITOR WITH
|
|
|
|
! $FF69G
|
|
|
|
OR GO TO BASIC AND ENTER THE MONITOR WITH
|
|
|
|
> CALL -151
|
|
|
|
* 1000G WILL START THE PROGRAM.
|
|
|
|
DID IT DO WHAT YOU THOUGHT IT WOULD DO? DO A LIST OF THE PROGRAM:
|
|
|
|
* 1000L
|
|
|
|
DOES IT LOOK THE SAME AS WHEN YOU TYPED IT IN? WHAT IS DIFFERENT?
|
|
MEMORY LOCATIONS $1001 AND $1003 HAVE BEEN CHANGED BY THE PROGRAM.
|
|
THIS IS A PROGRAM THAT CHANGES ITSELF AS IT RUNS!
|
|
|
|
WE WILL GET INTO OTHER EXAMPLES WHERE THIS IS HELPFUL AS THESE
|
|
LESSIONS CONTINUE.
|
|
|
|
|
|
LESSON 4...COMPUTER NUMBERS
|
|
|
|
BINARY, HEXIDECIMAL AND DECIMAL ARE NUMBER SYSTEMS HAVING DIFFERENT
|
|
BASES. ALL ARE USED IN DEALING WITH COMPUTERS. THE FIRST TWO, BINARY
|
|
AND HEXADECIMAL, MAY BE NEW TO SOME PEOPLE.
|
|
|
|
LET'S TALK ABOUT DECIMAL NUMBERS FIRST.
|
|
|
|
129 IS ONE HUNDRED TWENTY NINE
|
|
|
|
129 = 1*100 + 2*10 + 9*1
|
|
|
|
23 IS TWENTY THREE
|
|
|
|
23 = 2*10 + 3*1
|
|
|
|
WE KNOW THAT DECIMAL NUMBERS ARE POWERS OF TEN.
|
|
|
|
10000 1000 100 10 1
|
|
|
|
EACH ONE IS 10 TIMES THE ONE BEFORE IT.
|
|
|
|
1200 IS TWELVE HUNDRED
|
|
|
|
1200 = 1*1000 + 2*100 + 0*10 + 0*1
|
|
|
|
IN BINARY NUMBERS THE ONLY SYMBOLS WHICH ARE USED ARE 0 AND 1.
|
|
COUNTING IN BINARY (AS SHOWN FROM RIGHT TO LEFT) IS:
|
|
|
|
2048 1024 512 256 128 64 32 16 8 4 2 1
|
|
|
|
WHERE WE CAN SEE THAT EACH NUMBER IS 2 TIMES THE ONE BEFORE (GOING
|
|
RIGHT TO LEFT).
|
|
|
|
3 = 1*2 + 1*1
|
|
|
|
9 = 1*8 + 0*4 + 0*2 + 1*1
|
|
|
|
16 = 1*16 + 0*8 + 0*4 + 0*2 + 0*1
|
|
|
|
THE DECIMAL NUMBER 3 IS 11 IN BINARY. OR ANOTHER WAY, 3(BASE 10)= 11
|
|
(BASE 2)
|
|
|
|
9 (BASE 10) = 1001 (BASE 2). THE DECIMAL NUMBER 9 EQUALS THE BINARY
|
|
NUMBER 1001.
|
|
|
|
IF YOU HAVE BEEN FOLLOWING THIS, DO YOU KNOW THE ANSWER TO
|
|
|
|
101 (BASE 2) = ?????? (BASE 10)
|
|
|
|
WHAT HAVE WE SEEN BEFORE? EACH ONE IS TWICE THE ONE BEFORE....
|
|
|
|
16 8 4 2 1
|
|
|
|
SO THAT
|
|
101 STANDS FOR 1*4 + 0*2 + 1*1 IN DECIMAL OR 5.
|
|
|
|
YOU MIGHT BE WONDER WHY YOU WOULD WANT TO KNOW THIS. YOU DO NOT NEED
|
|
TO KNOW THIS, BUT IT CERTAINLY HELPS.
|
|
|
|
THE 6502 PROCESSOR HAS WHAT IS CALLED A STATUS REGISTER, "P". MOST OF
|
|
THE 6502 CPU INSTRUCTIONS AFFECT THE STATUS REGISTER P. FOR EXAMPLE,
|
|
IF WE HAD JUST EXECUTED THE INSTRUCTION
|
|
|
|
LDA #$00
|
|
|
|
(LOAD THE ACCUMULATOR IMMEDIATELY WITH THE HEXIDECIMAL NUMBER 00), THE
|
|
P REGISTER WOULD CHANGE TO REFLECT THE ZERO. BIT 1 WOULD BE SET (EQUAL
|
|
TO ONE). THE P REGISTER MIGHT BE 2 (BASE 10) OR 00000010 (BASE 2).
|
|
|
|
WE WILL EXAMINE THIS MORE AS WE CONTINUE, SO IF YOU DO NOT FEEL
|
|
COMFORTABLE AT THIS POINT, DON'T FEEL LEFT OUT.
|
|
|
|
|
|
|
|
LESSON 5 : THE 6502 PROCESSOR
|
|
|
|
LET'S NOW EXAMINE DIFFERENT PARTS OF THE ANATOMY OF THE 6502
|
|
MICROPROCESSOR. WE WILL TALK ABOUT THE ACCUMUATOR, INDEX REGISTER X,
|
|
INDEX REGISTER Y, PROGRAM COUNTER, STACK POINTER, AND THE PROCESSOR
|
|
STATUS REGISTER P.
|
|
|
|
IF WE WERE TO TALK ABOUT THE APPLE II AS A LARGE POSTOFFICE, THEN THE
|
|
ADDRESS OF A MEMORY LOCATION WOULD BE LIKE THE NUMBER OF A POSTOFFICE
|
|
BOX. FOR EXAMPLE, WE SAY THAT $C000 IS THE ADDRESS OF THE MEMORY
|
|
LOCATION THAT IS CHANGED BY THE KEYBOARD. ANOTHER EXAMPLE IS THAT $400
|
|
IS THE ADDRESS OF THE FIRST BYTE OF PAGE ONE OF THE LOW-RES SCREEN, AT
|
|
THE TOP LEFT CORNER OF THE SCREEN.
|
|
|
|
IN A POSTOFFICE THERE ARE SORTING BINS OR BOXES WHICH SERVE AS
|
|
TEMPORARY PLACES TO KEEP THINGS.
|
|
|
|
LIKEWISE IN THE APPLE, THE ACCUMULATOR, INDEX REGISTER X AND INDEX
|
|
REGISTER Y CAN BE COMPARED TO THESE TEMPORARY PLACES TO KEEP LETTERS.
|
|
|
|
WE CAN PUT NUMBERS IN THEM AND TAKE NUMBERS OUT OF THEM. ONE
|
|
DIFFERENCE IS THAT WHEN WE TAKE WHAT IS IN THEM AND STORE THAT NUMBER
|
|
ELSEWHERE, THAT ORIGINAL NUMBER IS STILL LEFT IN THE REGISTER. (FOR
|
|
EXAMPLE, WE CAN TAKE THE NUMBER IN THE ACCUMULATOR AND STORE IT
|
|
ELSEWHERE, AND IT IS STILL PRESENT IN THE ACCUMULATOR.)
|
|
|
|
THE PROCESSOR STATUS REGISTER P IS RATHER LIKE A BLACKBOARD WHERE WE
|
|
MIGHT MAKE A CHECK MARK IF THE LETTER WE PICKED UP WAS AN AIRMAIL
|
|
LETTER, WHILE WE WOULD REMOVE THAT CHECK MARK IF THE NEXT LETTER WE
|
|
PICK UP IS NOT AN AIRMAIL LETTER.
|
|
|
|
SOME EXAMPLES OF HOW TO USE THE MOST IMPORTANT OF THE REGISTERS IN THE
|
|
6502, THE ACCUMULATOR, ARE AS FOLLOWS:
|
|
|
|
STA $05 STORE WHAT IS IN THE
|
|
ACCUMULATOR IN MEMORY
|
|
LOCATION $05
|
|
|
|
STA $0400 STORE WHAT IS IN THE
|
|
ACCUMULATOR IN MEMORY
|
|
LOCATION $0400
|
|
|
|
LDA $0568 LOAD THE ACCUMULATOR WITH
|
|
WHAT IS IN MEMORY
|
|
LOCATION $0568
|
|
|
|
LESSON 6 : KEYBOARD
|
|
|
|
ONE OF THE THINGS YOU NEED TO KNOW IF YOU ARE GOING TO PRINT MESSAGES
|
|
ON THE SCREEN IS THE LIST OF ASCII CODES FOR THE DIFFERENT LETTERS.
|
|
DID YOU KNOW THE ASCII CODE FOR "1" IS $B1 (HEXADECIMAL)? ($B1 = 11*16
|
|
+ 1*1 = 177 ).
|
|
|
|
THIS INFORMATION CAN BE FOUND ON PAGE SEVEN OF THE APPLE II REFERENCE
|
|
MANUAL. LOCATED THERE IS TABLE 2, WHICH IS A LIST OF THE APPLE II
|
|
KEYBOARD CHARACTERS AND THEIR ASSOCIATED ASCII CODES.
|
|
|
|
LET'S WRITE A SHORT MACHINE CODE PROGRAM TO CHECK THE TABLE. TO DO
|
|
THAT, WHAT THINGS DO WE NEED TO KNOW?
|
|
|
|
1) THE MEMORY LOCATION OF THE KEYBOARD
|
|
2) A WAY TO PRINT TO THE SCREEN
|
|
|
|
$C000 IS THE MEMORY LOCATION INSIDE THE APPLE II WHICH HOLDS THE CODE
|
|
OF THE LAST KEY PRESSED.
|
|
|
|
$FDF0 IS A ROUTINE IN THE MONITOR ROM THAT WILL PRINT TO THE SCREEN.
|
|
|
|
$FDDA IS A ROUTINE IN THE MONITOR ROM THAT WILL PRINT HEXADECIMAL
|
|
NUMBERS TO THE SCREEN.
|
|
|
|
NOW LETS'S WRITE A PROGRAM!
|
|
|
|
CALL-151 (TO GO INTO MONITOR)
|
|
|
|
*F666G (USE THE MINI-ASSEMBLER)
|
|
|
|
!1000:LDA $C000 (LOAD THE ACCUMULATOR WITH WHAT IS IN THE KEYBOARD)
|
|
|
|
JSR $FDF0 (JUMP TO THE SUBROUTINE AT $FDF0, USING THE MACHINE
|
|
CODE PROGRAM THAT IS IN THE MONITOR ROM)
|
|
|
|
JMP $1000 (JUMP TO THE START AND DO IT AGAIN)
|
|
|
|
NOW RUN THE ABOVE PROGRAM BY EXITING THE MINI-ASSEMBLER AND THEN GOING
|
|
TO LOCATION $1000:
|
|
|
|
! $1000G
|
|
|
|
DID THE SCREEN FILL WITH CHARACTERS? DID IT CHANGE IF YOU PRESSED ANY
|
|
KEY?
|
|
|
|
LET'S MAKE THE PROGRAM A LITTLE BETTER.
|
|
|
|
GET INTO THE MINI-ASSEMBLER
|
|
|
|
*F666G
|
|
|
|
!1000:LDA $C000 LOAD THE ACC WITH KEYBOARD DATA
|
|
|
|
BPL $1000 GOTO $1000 IF THE KEYBOARD DATA IS POSITIVE.
|
|
WHEN A KEY IS PRESSED THE HIGH-BIT IN $C000
|
|
WILL BE "1"...WHICH MAKES IT A NEGATIVE
|
|
NUMBER TO THE 6502 MICROPROCESSOR CHIP
|
|
INSIDE YOUR APPLE.
|
|
|
|
JSR $FDF0 USE THE MONITOR ROUTINE TO PRINT TO THE SCREEN
|
|
|
|
LDA $C010 CLEAR THE KEYBOARD STROBE. THIS MAKES
|
|
THE HIGH-BIT IN $C000 ="0"..WHICH
|
|
MAKES IT A POSITIVE NUMBER TO YOUR APPLE.
|
|
|
|
JMP $1000 DO IT AGAIN
|
|
|
|
! $1000G WILL RUN THE PROGRAM
|
|
|
|
NOW, IF THINGS ARE RIGHT, EVERYTIME YOU PRESS A KEY YOU SHOULD SEE IT
|
|
ON THE SCREEN.
|
|
|
|
LET'S MAKE OUR PROGRAM A LITTLE LONGER.
|
|
|
|
*F666G GOTO THE MINI-ASSEMBER
|
|
|
|
!1000: LDA $C000
|
|
BPL $1000
|
|
JSR $FDF0
|
|
LDA #$A0 THIS IS A BLANK " "
|
|
JSR $FDF0 PRINT IT ON SCREEN
|
|
LDA $C010
|
|
JMP $1000
|
|
|
|
RUN THAT BY GOING TO $1000.
|
|
|
|
! $1000G
|
|
|
|
NOW, A PROGRAM THAT IS EVEN LONGER:
|
|
|
|
*F666G !1000:LDA $C000
|
|
BPL $1000
|
|
JSR $FDF0
|
|
LDA #$A0
|
|
JSR $FDF0
|
|
LDA $C000
|
|
JSR $FDDA PRINT HEXIDECIMAL NUMBER
|
|
LDA $C010
|
|
JMP $1000
|
|
|
|
NOW, WHEN YOU RUN THIS PROGRAM, YOU SHOULD SEE ALL THE VALUES IN THE
|
|
TABLE ON PAGE 7 IN YOUR APPLE II REFERENCE MANUAL.
|
|
|
|
MAYBE, A COUPLE WORDS OF EXPLANATION ARE NEEDED.
|
|
|
|
JSR $FDF0 TELLS THE APPLE TO JUMP TO THE SUBROUTINE LOCATED AT $FDF0
|
|
AFTER SAVING THE RETURN ADDRESS, AND EXECUTE THE MACHINE CODE LOCATED
|
|
THERE.
|
|
|
|
THE PROGRAM JUMPS TO LOCATION $FDF0 AND DOES THE INSTRUCTION AT THAT
|
|
LOCATION. THIS IS A PROGRAM ALREADY IN EXISTANCE WHICH WE WILL USE TO
|
|
MAKE OUR PROGRAM SHORTER.
|
|
|
|
LESSON 7 : INDEXED ADDRESSING
|
|
|
|
LET'S FIND AN EXAMPLE OF SOMETHING WE KNOW ABOUT IN ORDER TO DESCRIBE
|
|
THIS FORM OF ADDRESSING.
|
|
|
|
ALL OF US IN GIVING DIRECTIONS TO SOMEONE HAS SAID SOMETHING LIKE
|
|
"IT'S THE THIRD HOUSE ON THE LEFT AFTER YOU PASS THE STOPLIGHT".
|
|
INDEXED ADDRESSING IS THE SAME TYPE THING.
|
|
|
|
THE INDEX WOULD BE LIKE "IT'S THE THIRD HOUSE ON THE LEFT ". THE BASE
|
|
ADDRESS IS LIKE "AFTER YOU PASSED THE STOPLIGHT".
|
|
|
|
LDA $4000,X
|
|
|
|
LOAD THE ACCUMULATOR REGISTER (LDA) WITH WHAT IS IN THE MEMORY
|
|
LOCATION X ADDRESSES AFTER THE ADDRESS $4000.
|
|
|
|
IF X=$05, THEN WE WOULD BE TALKING ABOUT ADDRESS $4000+$05 OR $4005.
|
|
|
|
THE INDEX IS THE REGISTER X. THE BASE ADDRESS (IN THIS CASE ) IS
|
|
$4000.
|
|
|
|
WHY?
|
|
|
|
WHY DO YOU WANT TO KNOW WHAT THIS DOES?
|
|
|
|
EXAMPLE:
|
|
|
|
SUPPOSE WE HAD 5 NUMBERS IN MEMORY LOCATIONS $3500, $3501, $3502,
|
|
$3503 AND $3504... AND THAT WE WANT TO MOVE THEM TO $0408, $0409,
|
|
$040A, $040B AND $040C.
|
|
|
|
WE COULD DO IT LIKE THIS:
|
|
|
|
LDA $3500 LOAD THE A-REG WITH WHAT IS IN $3500
|
|
STA $0408 STORE WHAT IS IN REG-A AT MEMORY
|
|
LOCATION $0408
|
|
LDA $3501 LOAD THE ACCUMULATOR WITH WHAT IS IN $3501
|
|
STA $0409 STORE THE ACC IN MEMORY LOCATION $0409
|
|
LDA $3502 LOAD ACCUMULATOR
|
|
STA $040A STORE ACC IN $040A
|
|
LDA $3503 LOAD ACCUMULATOR
|
|
STA $040B STORE ACC IN $040B
|
|
LDA $3504 LOAD THE ACCUMULATOR WITH WHAT IS IN
|
|
MEMORY LOCATION $3504
|
|
STA $040C STORE THE ACCUMULATOR IN MEMORY LOCATION
|
|
$040C.
|
|
|
|
AT THIS POINT YOU MAY WANT TO GO TO THE MINI-ASSEMBER AND ENTER THE
|
|
ABOVE PROGRAM INTO MEMORY AT $1000 AND PUT SOME NUMBERS IN
|
|
$3500...$3504 AND SEE IF THE NUMBERS ARE MOVED.
|
|
|
|
DID THE SCREEN CHANGE WHEN YOU RAN THE PROGRAM? GOOD...IF IT DID.
|
|
|
|
RUN IT AGAIN WITH $C8 IN $3500, $C5 IN $3501, $CC IN $3502, $3503, AND
|
|
$CF IN $3504.
|
|
|
|
DID "HELLO" SHOW UP ON THE SCREEN?
|
|
|
|
LET'S DO THE SAME PROGRAM...MOVE $3500...$3504 TO $0408...$040C. USE
|
|
THE INDEX ADDRESSING INSTRUCTION.
|
|
|
|
LDX #$00 SET THE X-REGISTER EQUAL TO ZERO...OR
|
|
...LOAD X-REGISTER IMMEDIATELY WITH $00.
|
|
LDA $3500,X LOAD ACC WITH WHAT IS X BYTES
|
|
PAST ADDRESS $3500.
|
|
LDA ( $3500+$00)
|
|
LDA $3500
|
|
STA $0408,X STORE THE ACC AT X MEMORY LOCATIONS
|
|
PAST $0408...STORE THE ACCUMULATOR
|
|
AT $0408 INDEXED BY THE X-REGISTER.
|
|
INX INCREMENT THE X REGISTER BY ONE.
|
|
SINCE IT WAS ZERO, IT IS NOW $0+$1=$1.
|
|
LDA $3500,X LOAD THE ACC WITH WHAT IS THE MEMORY
|
|
LOCATION X BYTES AFTER $3500... OR
|
|
SINCE X=$01...
|
|
LOAD THE ACC WITH WHAT IS AT $3501
|
|
STA $0408,X STORE THE ACC AT $0408 INDEXED BY
|
|
THE X-REGISTER...
|
|
INX X = $01 +$01 = $02
|
|
LDA $3500,X
|
|
STA $0408,X STA $0408+$02
|
|
STA $040A
|
|
INX X=$02 + $01 = $03
|
|
LDA $3500,X $3500+$03=$3503
|
|
STA $0408,X $0408+$03=$040B
|
|
INX
|
|
LDA $3500,X
|
|
STA $0408,X
|
|
|
|
THIS PROGRAM WILL DO THE SAME AS THE PROGRAM WE LOOKED AT BEFORE.
|
|
|
|
LETS LOOK AT IT ONCE AGAIN.
|
|
|
|
LDX #$00
|
|
LDA $3500,X
|
|
STA $0408,X
|
|
INX
|
|
LDA $3500,X
|
|
STA $0408,X
|
|
INX
|
|
LDA $3500,X
|
|
STA $0408,X
|
|
INX
|
|
LDA $3500,X
|
|
STA $0408,X
|
|
INX
|
|
LDA $3500,X
|
|
STA $0408,X
|
|
|
|
NOTICE THAT WE USED "LDA $3500,X"
|
|
AND "STA $0408,X" 5 TIMES ...ONCE EACH TIME WE WANTED
|
|
TO MOVE A NUMBER.
|
|
|
|
LETS WRITE ONE MORE PROGRAM TO DO THE SAME THING. (THIS ONE WILL
|
|
REQUIRE AN ASSEMBLER.)
|
|
|
|
LDX #$00
|
|
LINE2 LDA $3500,X
|
|
STA $0408,X
|
|
INX
|
|
CPX #$05
|
|
BNE LINE2
|
|
|
|
NOW THE PROGRAM IS SHORTER.
|
|
|
|
WE ADDED TWO NEW INSTRUCTIONS...
|
|
|
|
CPX #$05
|
|
|
|
BNE LINE2
|
|
|
|
CPX #$05 COMPAGE THE X-REGISTER WITH THE NUMBER $05
|
|
|
|
BNE LINE2 IF THE X-REGISTER DOES NOT EQUAL $05, THEN GOTO LINE2.
|
|
|
|
IF WE WANTED TO MOVE $53 NUMBERS, OUR LATEST PROGRAM IS EASIER TO
|
|
WRITE...
|
|
|
|
LDX #$00 LINE2 LDA $3500,X
|
|
STA $0408,X
|
|
CPX #$53
|
|
BNE LINE2
|
|
|
|
AND I LIKE TO DO THINGS THE EASY WAY. THIS WAS ONE EXAMPLE OF HOW TO
|
|
USE INDEXED ADDRESSING, AND OBVIOUSLY THERE ARE MANY OTHER WAYS TO USE
|
|
IT.
|
|
|
|
LESSON 8: THE STACK
|
|
|
|
THE "STACK" CAN BE COMPARED TO A NOTE PAD USED TO WRITE THINGS DOWN
|
|
ON... NOTES THAT TELLS US THINGS TO DO.
|
|
|
|
IF WE HAVE FOUR OR FIVE THINGS TO DO IN ONE DAY WE MIGHT WRITE THEM
|
|
DOWN IN OUR NOTE PAD.
|
|
|
|
IF THE APPLE ][ HAS ONE OR MORE SUBROUTINES TO DO, IT WRITES DOWN IN
|
|
THE "STACK" WHAT TO DO.
|
|
|
|
IT IS SORT OF LIKE WRITING A NOTE ON A PIECE OF PAPER AND THEN PLACING
|
|
THE NOTE ON A SPINDLE. LATER, WHEN WE THING OF SOMETHING ELSE WE
|
|
SHOULD DO WE PUT ANOTHER NOTE ON THE SPINDLE. THEN, WHEN WE GET TIME
|
|
TO DO THINGS, WE TAKE THE TOP NOTE OFF THE SPINDLE AND DO IT... THEN
|
|
THE NEXT NOTE OFF THE SPINDLE ...
|
|
|
|
FIRST ON ------- LAST OFF
|
|
|
|
SUPPOSE, FOR AN EXAMPLE, OUR STACK LOOKED LIKE :
|
|
|
|
01FF C1
|
|
01FE C8
|
|
01FD 23
|
|
<-- STACK POINTER
|
|
|
|
NOTE: THE STACK POINTER POINTS TO THE NEXT AVAILABLE SPACE.
|
|
|
|
IF OUR PROGRAM LOOKED LIKE:
|
|
|
|
C11A: A9 8D LDA #$89
|
|
C11C: 20 58 FF JSR $FF58
|
|
C11F: BA TSX
|
|
|
|
WHEN THE COMPUTER GOT TO THE JUMP TO SUBROUTINE (JSR) AT $FF58, IT
|
|
WOULD PUT THE HIGH BYTE OF THE ADDRESS OF THE LAST PART OF THE JSR
|
|
INSTRUCTION ON THE STACK FIRST
|
|
|
|
01FF C1
|
|
01FE C8
|
|
01FD 23
|
|
01FC C1
|
|
<-- STACK POINTER AND THEN THEN LOW BYTE
|
|
|
|
01FF C1
|
|
01FE C8
|
|
01FD 23
|
|
01FC C1
|
|
01FB 1E
|
|
<-- STACK POINTER
|
|
|
|
ON THE STACK. NOTICE THAT THE ADDRESS $C11E IS ON THE BOTTOM OF THE
|
|
STACK... THIS IS THE ADDRESS OF THE LAST PART OF THE JSR $FF58
|
|
INSTRUCTION....
|
|
|
|
NOW THE COMPUTER WOULD GO TO THE SUBROUTINE AT $FF58, DO WHAT IT IS
|
|
TOLD TO DO, AND WHEN IT COMES ACROSS A RETURN FROM SUBROUTINE (RTS)
|
|
INSTRUCTION, IT WILL GET THE LOW BYTE $1E FROM THE BOTTOM OF THE STACK
|
|
$01FB AND THEN IT WILL INCREMENT THE STACK POINTER AND GET THE HIGH
|
|
BYTE $C1 OFF THE STACK $01FC.
|
|
|
|
IT WILL THEN HAVE THE ADDRESS $C11E INTERNALLY TO THE CPU AND WILL
|
|
PLACE THEM IN THE PROGRAM COUNTER, ADD ONE
|
|
|
|
$C11E +$01 = $C11F
|
|
|
|
AND THE GOTO THAT ADDRESS TO CONTINUE DOING INSTRUCTIONS....
|
|
|
|
PLEASE NOTICE THAT $C11F IS THE ADDRESS ON THE INSTRUCTION THAT WAS
|
|
JUST AFTER THE JUMP TO SUBROUTINE INSTRUCTION (JSR $FF58).
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|