ADDR HEX CODE A2 20 98 A0 66 LABEL INSTRUCTION COMMENTS 4.3.INDIRECTIOIM: 0208 020A 020D 020E 0210 20 88 LDX #20 JSR QDATFET TYA - FETCH THE NUMBERS - CLEARS A - LOOP COUNTER - SHIFT MULIPLIER (AND HIGH BYTE OF RESULT) - NO ADD IF NO BIT YOU'LL NOTICE THAT THE PROGRAM IS NOT POSITION INDEPENDENT: THE ADDRESS OF THE CLC INSTRUCTION MUST BE WRITTEN INTO THE PROGRAM. THIS IS ANOTHER DISADVANTAGE OF THIS METHOD: (THERE IS AN ADVANTAGE: THIS PROGRAM IS VERY FAST, TAKING ONLY 6JUS PER BYTE). THE INSTRUCTION REQUIRED MUST HAVE A 16 BIT UNFIXED ADDRESS AND THIS CAN ONLY GO IN ONE PLACE : MEMORY. A LIMITATION IS THAT GENERALLY IT CAN ONLY BE IN ZERO PAGE MEMORY. THE CONCEPT IS KNOWN AS INDIRECTION.
THE MOST DIRECT VERSION OF THIS IS THE INDIRECTJUMP. 6C02 00 JMP (0002) THIS IS THE ONE VERSION OF INDIRECTION THAT DOESN'T NEED TO REFER TO ZERO PAGE MEMORY. WHAT HAPPENS IS THIS:
FE LDY #08 ROR Ј20 08 20 LOOP 0212 0214 0215 90 03 BCCNAD CLC ADC 2 21 18 65 21 - ADD MULTIPLICAND INTO LOW BYTE OF RESULT - AND SHIFT LOW BYTE OF RESULT 0217 0218 0219 0213 021 D 6A 88 D0 85 66 20 20 NAD ROR A DEY BNE LOOP STA 2 21 F5 21 20 64 64 - PUT IN LOW BYTE - FINAL JUSTIFICATION SHIFT - DISPLAY ANSWER 021F 0222 0224 FE FF ROR 2 20 JSR QHEXTD JMP RESTART TIMERS ADDRESS BUS 0 PC 1 PC+1 2 PC+2 00 1 3 0002 V 1 4 0003 U 1 5 UV OPCODE 1 THE MONITOR USES A JUMP INDIRECT FOR THE GO FUNCTION, HAVING BUI LT THE ADDRESS IN 0002 & 0003 :
A JUMP INDIRECT VIA 0002 & 0003, ASSUMING THAT THESE LOCATIONS HAVEN'T BEEN ALTERED, WILL THUS DATA 6C 02 BUS R/W 1 1 JUMP INDIRECT DOUBLE BYTE MULTIPLY ADDR HEX CODE D8 84 84 A9 85 85 A2 20 A2 20 84 84 A0 66 66 90 LABEL INSTRUCTION COMMENTS LOWER BYTE HIGHER BYTE OLD 6C COMPLETED 0200 0201 0203 0205 0207 0209 020B 020D 0210 0212 0215 0277 0219 021B 021D 021F 0221 0222 0224 0226 0228 022A 022C 022E 0230 0232 0233 0235 0237 0239 023B 20 21 1 CLD STY 2 20 MPIER STY-2 21 - BINARY ONLY - FORM PROMPT FOR THE ZERO INPUT 11 22 23 20 88 22 88 24 25 r ' LDA #11 STA 2 22 MPICAND STA 2 23 - FORM PROMPT FOR THE FIRST INPUT RETURN TO THE START OF THE PROGRAM -WITHOUT KNOWING WHERE IT HAD BEEN ENTERED INTO MEMORY AT THE TIME OF WRITING.
INDIRECTJUMP FE LDX #20 JSR QDATFET - FETCH ZERO INPUT FE LDX #22 JSR QDATFET STY 2 24 STY 2 25 - AND FIRST INPUT - CLEAR WORKING SPACE MAIN PROGRAM ZERO PAGE 10 23 22 0D LDY #10 ROR 2 23 ROR 2 22 BCCNAD CLC - LOOP COUNT INITIALISATION - TWO BYTE SHIFT RIGHT JMP (0002) 12 34 ': 0002 0003 LOOP 4 ROUTINE XX XX XX 18 A5 65 85 A5 65 85 66 66 88 D0 66 66 A0 20 - NO ADD IF THE O/P BIT ISN'T A ONE 20 24 24 21 25 25 25 24 LDA 2 20 ADC 2 24 STA 2 24 - TWO BYTE ADD 1234 1235 1236 LDA 2 21 ADC 2 25 STA 2 25 NAD ROR 2 25 ROR 2 24 DEY BNE LOOP ROR 2 23 ROR 2 22 LDY #06 JSR QHEXTD2 - NO CARRY OUT OF THE ADD - SHIFT AGAIN WELL, THAT WAS SIMPLE INDIRECTION.
NOW WE'LL MOVE ONTO THE MORE COMPLICATED MODES OF INDIRECTION. HAVING FETCHED THE ADDRESS OUT OF MEMORY WITH THE INDIRECTION STAGE, WE CAN INDEX IT. THIS IS CALLED POST-INDEXED INDIRECTION. WITH THE 65XX SERIES OF MICRO- PROCESSORS YOU MAY ONLY E6 23 22 06 66 - GO ROUND LOOP 16 TIMES - FINAL SHIFT ON RESULT I INDEX IN THIS MODE WITH THE Y INDEX REGISTER II USE ZERO PAGE MEMORY - SET UP POSITION - X ALREADY POINTING AT FE CORRECT LOCATIONS-PUT 4 HEX OUT NEXT POSITION 023E A0 02 LDY #02