Listing of file='TUTE4C.BAS;01' on disk='vmedia/asmtut_disk2-sector.ccvf'
100 REM BRANCHING GROUP TUTE4C 22/8/81 110 GOTO 146:REM 142 W/O MENU 120 Z= CALL (0):PLOT 3,0,31,11:RETURN 130 PLOT 3,62,31:POKE KB,0:Z= CALL (18) 131 IF PEEK (KB)= 0THEN 131 132 GOSUB 120:PRINT "/":GOTO 120 133 GOSUB 120:GOTO 120 140 FOR I= 1TO 1000:NEXT :RETURN 142 POKE 32941,191:POKE 32940,172:CLEAR 100:PLOT 27,4:PRINT "LOA SCROLL.PRG":PLOT 27,27 144 POKE 33283,173:POKE 33284,191 146 BL$= " ":KB= 33278:DU= 49113:POKE DU,255:SC= 28672 148 PLOT 6,2,15,12,27,24,27,4:PRINT "LOA ARCH.DSP":PLOT 27,27 150 A$= "11110101":F$= "10 0 1 0":B$= "2D":C$= "05":D$= "2B":E$= "C2":H$= "3A":L$= "F5" 152 GOSUB 5000:GOSUB 5100:GOSUB 5200:GOSUB 5300:GOSUB 5400:GOSUB 5500:GOSUB 5600:GOSUB 5700 154 PLOT 3,45,4:PRINT BL$BL$:PLOT 3,45,6:PRINT BL$BL$:SP$= "BE 00":PC$= "00 18" 156 GOSUB 5800:GOSUB 5900:PLOT 3,1,9:PRINT BL$" ":PLOT 3,45,9:PRINT BL$BL$:GOSUB 6300:GOSUB 133 158 FOR I= 20TO 12STEP - 2:Z= CALL (I):NEXT 160 PRINT "IN THIS TUTORIAL WE WILL COMMENCE BY LOOKING AT THE":GOSUB 120 162 PRINT "BRANCHING INSTRUCTIONS.":GOSUB 130:GOTO 210 200 BL$= " ":KB= 33278:DU= 49113:POKE DU,255:SC= 28672 210 PRINT "THE BRANCHING GROUP OF INSTRUCTIONS ALTER NORMAL":GOSUB 120 220 PRINT "SEQUENTIAL PROGRAM FLOW, EITHER UNCONDITIONALLY OR":GOSUB 120 230 PRINT "CONDITIONALLY.":GOSUB 130 240 PRINT "THE UNCONDITIONAL BRANCH INSTRUCTIONS ARE:-":GOSUB 133 250 PRINT " JMP JUMP <ADDR.>":GOSUB 120 260 PRINT "CALL CALL <SUBR. ADDR.>":GOSUB 120 270 PRINT " RET RETURN (TO ADDR. STORED AT TOP OF STACK)":GOSUB 130 280 PRINT "BEING UNCONDITIONAL, THESE INSTRUCTIONS BRANCH AS INDICATED":GOSUB 120 290 PRINT "WITHOUT REFERENCE TO ANY REGISTER STATUS.":GOSUB 130 300 PRINT "NOTE THAT BOTH JMP AND CALL REQUIRE TWO ADDRESS BYTES TO":GOSUB 120 310 PRINT "FOLLOW THEIR OPCODE AND ARE THUS THREE BYTE INSTRUCTIONS.":GOSUB 120 320 PRINT "RET, ON THE OTHER HAND, GETS IT'S ADDRESS FROM THE TOP OF THE":GOSUB 120 330 PRINT "STACK WHERE THE CALL INSTRUCTION PUSHED IT AND THUS IS ONLY":GOSUB 120 340 PRINT "ONE BYTE LONG.":GOSUB 130 350 PRINT "CALL AUTOMATICALLY PLACES THE ADDRESS OF THE NEXT INSTRUCTION":GOSUB 120 360 PRINT "BYTE ON THE TOP OF THE STACK AND ADJUSTS THE SP.":GOSUB 130 370 PRINT "BRANCHING IS EFFECTED BY PLACING THE JUMP, CALL OR RETURN":GOSUB 120 380 PRINT "ADDRESS INTO THE PC.":GOSUB 130 390 PRINT "THESE INSTRUCTIONS BECOME MORE VERSATILE WHEN THEY ARE":GOSUB 120 400 PRINT "ABLE TO BE EXECUTED CONDITIONALLY.":GOSUB 130 410 PRINT "CONDITIONAL BRANCH INSTRUCTIONS EXAMINE THE STATUS OF ONE OF":GOSUB 120 420 PRINT "FOUR CONDITION FLAGS TO DETERMINE WHETHER A SPECIFIED BRANCH":GOSUB 120 430 PRINT "IS TO BE EXECUTED.":GOSUB 130 440 PRINT "THE CONDITIONS THAT MAY BE SPECIFIED ARE:-":GOSUB 133 450 PRINT "NZ NOT ZERO Z=0":GOSUB 120 460 PRINT "Z ZERO Z=1":GOSUB 120 470 PRINT "NC NO CARRY C=0":GOSUB 120 480 PRINT "C CARRY C=1":GOSUB 120 490 PRINT "PO PARITY ODD P=0":GOSUB 120 500 PRINT "PE PARITY EVEN P=1":GOSUB 120 510 PRINT "P PLUS S=0":GOSUB 130 520 PRINT "THUS, THE CONDITIONAL BRANCHING INSTRUCTIONS ARE SPECIFIED AS:":GOSUB 120 530 PRINT "JC"TAB( 16)"CC"TAB( 32)"RC"TAB( 48)"CARRY":GOSUB 120 540 PRINT "JNC"TAB( 16)"CNC"TAB( 32)"RNC"TAB( 48)"NO CARRY":GOSUB 120 550 PRINT "JZ"TAB( 16)"CZ"TAB( 32)"RZ"TAB( 48)"ZERO":GOSUB 120 560 PRINT "JNZ"TAB( 16)"CNZ"TAB( 32)"RNZ"TAB( 48)"NOT ZERO":GOSUB 120 570 PRINT "JP"TAB( 16)"CP"TAB( 32)"RP"TAB( 48)"PLUS":GOSUB 120 580 PRINT "JM"TAB( 16)"CM"TAB( 32)"RM"TAB( 48)"MINUS":GOSUB 120 590 PRINT "JPE"TAB( 16)"CPE"TAB( 32)"RPE"TAB( 48)"PARITY EVEN":GOSUB 120 600 PRINT "JPO"TAB( 16)"CPO"TAB( 32)"RPO"TAB( 48)"PARITY ODD":GOSUB 130 610 PRINT "TWO OTHER INSTRUCTIONS CAN EFFECT A BRANCH BY REPLACING":GOSUB 120 620 PRINT "THE CONTENTS OF THE PC:":GOSUB 133 630 PRINT "PCHL MOVES H & L INTO PC.":GOSUB 120 640 PRINT "RST A SPECIAL RESTART INSTRUCTION USED WITH INTERRUPTS.":GOSUB 130 650 PRINT "A GRAPHICAL VIEW OF JMP, CALL, & RET WILL ILLUSTRATE THEIR":GOSUB 120 660 PRINT "EFFECTS. A CONDITIONAL BRANCH WHICH FAILS HAS NO EFFECT":GOSUB 120 670 PRINT "ON THE REGISTERS APART FROM ADVANCING THE PC TO THE NEXT":GOSUB 120 680 PRINT "INSTRUCTION.":GOSUB 120 690 PRINT "PRESS ENTER TO EXECUTE JMP 8200H.":GOSUB 130 700 I$= "11001001":HI$= "C9":P$= "JMP ":GOSUB 6000:GOSUB 140 710 PC$= "82 00":GOSUB 5900:GOSUB 140:GOSUB 6300 720 PRINT "NOTE:":GOSUB 120 730 PRINT "THE ONLY REGISTER AFFECTED WAS PC.":GOSUB 130 740 PRINT "PRESS ENTER TO EXECUTE CALL 9000H.":GOSUB 130 750 I$= "11001101":HI$= "CD":P$= "CALL ":GOSUB 6000:GOSUB 140 760 PC$= "90 00":SP$= "BD FE":GOSUB 5800:GOSUB 140:GOSUB 5900:GOSUB 140 770 PLOT 6,2,3,18,19:SP$= "BD FF":PRINT "BDFF":GOSUB 5800:GOSUB 140 780 PLOT 6,6,3,26,19:PRINT "82":GOSUB 140 790 PLOT 6,2,3,18,18:SP$= "BD EE":PRINT "BDEE":GOSUB 5800:GOSUB 140 800 PLOT 6,6,3,26,18:PRINT "03":GOSUB 140:GOSUB 6300 810 PRINT "NOTE THAT:":GOSUB 133 820 PRINT "PC LOADED WITH 9000.":GOSUB 120 830 PRINT "SP DECREMENTED BY TWO.":GOSUB 120 840 PRINT "8203, THE RETURN ADDRESS PAST THE CALL WAS STACKED.":GOSUB 130 850 PRINT "PRESS ENTER TO EXECUTE RET (FROM THE ABOVE CALL).":GOSUB 130 860 I$= "11001001":HI$= "C9":P$= "RET ":GOSUB 6000:GOSUB 140 870 SP$= "BD FF":GOSUB 5800:GOSUB 140 880 SP$= "BE 00":PC$= "82 03":GOSUB 5800:GOSUB 140:GOSUB 5900:GOSUB 140:GOSUB 6300 890 PRINT "NOTE THAT:":GOSUB 133 900 PRINT "THE RETURN ADDRESS, 8203, WAS POPPED OFF THE STACK INTO PC.":GOSUB 120 910 PRINT "THE SP INCREMENTED BY TWO.":GOSUB 120 920 PRINT "THE CONTENTS OF THE STACK AT BDFF AND BDFE ARE UNALTERED,":GOSUB 120 930 PRINT "ONLY THE POINTER MOVED.":GOSUB 130 940 PRINT "WITH THE BRANCHING INSTRUCTIONS, WE HAVE SEEN PART OF THE":GOSUB 120 950 PRINT "OPERATION OF THE STACK. HOWEVER THERE IS A GROUP OF":GOSUB 120 960 PRINT "INSTRUCTIONS WHICH ENABLE YOU TO DIRECTLY MANIPULATE THE":GOSUB 120 970 PRINT "STACK.":GOSUB 130 980 PRINT "THE FIRST TWO ARE PUSH AND POP WHICH TRANSFER 16 BITS OF":GOSUB 120 990 PRINT "DATA BETWEEN DOUBLE REGISTERS AND THE STACK.":GOSUB 120 1000 PRINT "THE ALLOWED REGISTERS ARE B, D, H, & PSW AND BOTH PUSH AND":GOSUB 120 1010 PRINT "POP ARE SINGLE BYTE INSTRUCTIONS.":GOSUB 130 1020 PRINT "E.G. PUSH B DECREMENTS SP, MOVES THE BYTE IN B INTO LOCATION":GOSUB 120 1030 PRINT "SP, DECREMENTS SP, MOVES THE BYTE IN C INTO LOCATION SP AND":GOSUB 120 1040 PRINT "LEAVES B AND C UNALTERED.":GOSUB 130 1050 PRINT "SIMILARLY POP D MOVES THE BYTE STORED AT SP INTO E,":GOSUB 120 1060 PRINT "INCREMENTS SP, MOVES THE BYTE AT SP INTO D AND":GOSUB 120 1070 PRINT "FINALLY INCREMENTS SP.":GOSUB 130 1080 PRINT "THIS MAY BE BETTER UNDERSTOOD WHEN VIEWED GRAPHICALLY":GOSUB 130 1090 BP$= ">":CC$= " " 1100 FOR I= 12TO 21:PLOT 3,0,I,11:NEXT 1110 PLOT 3,24,10:PRINT "BDF6 FF" 1120 PLOT 3,24,11:PRINT "BDF7 FF" 1130 PLOT 3,24,12:PRINT "BDF8 00" 1140 PLOT 3,24,13:PRINT "BDF9 00" 1150 PLOT 3,24,14:PRINT "BDFA FF" 1160 PLOT 3,24,15:PRINT "BDFB FF" 1170 PLOT 3,24,16:PRINT "BDFC 9A" 1180 PLOT 3,24,17:PRINT "BDFD 82" 1190 PLOT 3,24,18:PRINT "BDFE 00" 1200 PLOT 3,24,19:PRINT "BDFF 90" 1210 PLOT 3,24,20:PRINT "BE00 1F" 1220 PLOT 3,24,21:PRINT "BE01 A9" 1230 PLOT 3,23,20:PRINT BP$:GOSUB 6300 1240 PRINT "EXAMINE THE BLOCK OF MEMORY ABOVE IN WHICH THE STACK IS":GOSUB 120 1250 PRINT "CURRENTLY LOCATED. SP = (BE00).":GOSUB 130 1260 PRINT "IF BE00 IS THE INITIAL TOP OF THE STACK THEN THE MEMORY FROM":GOSUB 120 1270 PRINT "BE00 TO FFFF IS NOMINALLY AVAILABLE FOR OTHER PURPOSES AS":GOSUB 120 1280 PRINT "THE STACK BUILDS DOWNWARD IN TERMS OF NUMERICAL ADDRESS,":GOSUB 120 1290 PRINT "AND ITS INITIAL ADDRESS IS NORMALLY NEVER LOADED.":GOSUB 130 1300 PRINT "WHEN AN ADDRESS IS PUSHED ONTO THE STACK, AND SP = SP:":GOSUB 133 1310 PRINT "SP IS DECREMENTED AND THEN":GOSUB 120 1320 PRINT "THE HI BYTE OF THE ADDRESS IS STORED AT LOCATION SP," 1330 SP$= "BD FF":GOSUB 5800:CY= 20:CZ= 19:GOSUB 6500:GOSUB 130 1340 PRINT "SP IS AGAIN DECREMENTED AND THEN":GOSUB 120 1350 PRINT "THE LO BYTE OF THE ADDRESS IS STORED AT LOCATION SP," 1360 SP$= "BD FE":GOSUB 5800:CY= 19:CZ= 18:GOSUB 6500:GOSUB 130 1370 PRINT "WHEN AN ADDRESS IS POPPED OFF THE STACK, AND SP = SP:":GOSUB 133 1380 PRINT "THE LO BYTE OF THE ADDRESS COMES FROM LOCATION SP,":GOSUB 130 1390 PRINT "SP IS INCREMENTED AND THEN":GOSUB 120 1400 PRINT "THE HI BYTE OF THE ADDRESS COMES FROM LOCATION SP," 1410 SP$= "BD FF":GOSUB 5800:CY= 18:CZ= 19:GOSUB 6500:GOSUB 130 1420 PRINT "SP IS INCREMENTED AGAIN." 1430 SP$= "BE 00":GOSUB 5800:CY= 19:CZ= 20:GOSUB 6500:GOSUB 130 1440 PLOT 3,23,20:PRINT CC$:AD= SC+ 128+ 65:POKE AD,90:POKE AD+ 4,90:POKE AD+ 8,90:GOSUB 6300 1450 PRINT "IN PUSHING AND POPPING REGISTER PAIRS, A SPECIAL CASE ARISES":GOSUB 120 1460 PRINT "WITH PUSH PSW.":GOSUB 130 1470 PRINT "WE HAVE ONLY FIVE FLAGS FOR AN EIGHT BIT BYTE.":GOSUB 120 1480 PRINT "THE 8080 IMPLANTS THE BITS SHOWN ABOVE THE FLAGS REGISTER":GOSUB 120 1490 PRINT "DURING PUSH PSW TO FORM THE SIXTEEN BIT PSW, AND DELETES":GOSUB 120 1500 PRINT "THEM DURING POP PSW.":GOSUB 130 1510 POKE AD,24:POKE AD+ 4,24:POKE AD+ 8,24 1520 PRINT "BECAUSE OF THE LAST IN - FIRST OUT NATURE OF THE STACK,":GOSUB 120 1530 PRINT "REGISTERS MUST BE POPPED IN REVERSE ORDER TO THAT IN WHICH":GOSUB 120 1540 PRINT "THEY WERE PUSHED.":GOSUB 130 1550 PRINT "FOR EXAMPLE:":GOSUB 120 1560 PRINT "PUSH PSW":GOSUB 120 1570 PRINT "PUSH H":GOSUB 120 1580 PRINT "PUSH D":GOSUB 120 1590 GOSUB 1600:GOSUB 1600:GOSUB 1600:GOTO 1610 1600 PRINT "------------":GOSUB 120:RETURN 1610 PRINT "POP D":GOSUB 120 1620 PRINT "POP H":GOSUB 120 1630 PRINT "POP PSW":GOSUB 130 1640 PRINT "PUSHING REGISTERS DOES NOT AFFECT THEIR CONTENTS,":GOSUB 120 1650 PRINT "POPPING REGISTERS OVERWRITES THEIR CONTENTS.":GOSUB 130 1660 PRINT "ADDITIONAL INSTRUCTIONS AFFECTING THE STACK THAT HAVE BEEN":GOSUB 120 1670 PRINT "NOTED EARLIER ARE:-":GOSUB 120 1680 PRINT "LXI SP,ADDR"TAB( 16)"LOAD SP IMMEDIATE":GOSUB 120 1690 PRINT "INX SP"TAB( 16)"INCREMENT SP.":GOSUB 120 1700 PRINT "DCX SP"TAB( 16)"DECREMENT SP.":GOSUB 120 1710 PRINT "DAD SP"TAB( 16)"ADD CURRENT SP TO HL, RESULT IN HL.":GOSUB 120 1720 PRINT "XTHL"TAB( 16)"EXCHANGE HL WITH CURRENT STACK ENTRY,":GOSUB 120 1730 PRINT TAB( 16)"WITHOUT ALTERING SP.":GOSUB 130 1740 PRINT "ANOTHER INSTRUCTION AFFECTING THE STACK IS:":GOSUB 130 1750 PRINT "SPHL"TAB( 16)"LOAD SP WITH CONTENTS OF HL.":GOSUB 130 1760 PRINT "THIS INSTRUCTION ALLOWS THE PROGRAM TO DYNAMICALLY GENERATE AN":GOSUB 120 1770 PRINT "ADDRESS FOR SP, USEFUL FOR ACCESSING TABLES ETC.":GOSUB 130 1780 PRINT "AS NOTED EARLIER, CALL AND RET INVOLVE AN AUTOMATIC":GOSUB 120 1790 PRINT "PUSH AND POP.":GOSUB 130 1800 PRINT "CALL PUSHES THE ADDRESS OF THE NEXT INSTRUCTION,":GOSUB 120 1810 PRINT "RET POPS IT BACK INTO THE PROGRAM COUNTER.":GOSUB 130 1820 PRINT "WHEN WRITING MACHINE LANGUAGE ROUTINES, YOU OFTEN WISH TO":GOSUB 120 1830 PRINT "RETURN TO FCS AFTER EXECUTION.":GOSUB 120 1840 PRINT "TO DO THIS, EXECUTE THE FOLLOWING ON ENTRY TO THE PROGRAM:":GOSUB 130 1850 PRINT TAB( 16)"LXI H,00"TAB( 32)";ZERO HL":GOSUB 120 1860 PRINT TAB( 16)"DAD SP"TAB( 32)";SP IN HL":GOSUB 120 1870 PRINT TAB( 16)"SHLD FCSSP"TAB( 32)";SAVE IT AT LOCATION FCSSP":GOSUB 120 1880 PRINT TAB( 16)"LXI SP,PRGSP"TAB( 32)";OFFSET STACK HERE":GOSUB 130 1890 PRINT "AND AT THE END OF THE ROUTINE EXECUTE:":GOSUB 120 1900 PRINT TAB( 16)"LHLD FCSSP"TAB( 32)";FCSSP BACK IN HL":GOSUB 120 1910 PRINT TAB( 16)"SPHL"TAB( 32)";NOW IN SP":GOSUB 120 1920 PRINT TAB( 16)"RET"TAB( 32)";RETURN TO FCS.":GOSUB 130 1930 PRINT "A ROUTINE IN THE FCS ROM IS BOTH USEFUL AND EDUCATIONAL IN":GOSUB 120 1940 PRINT "THE WAY IT UTILISES THE STACK.":GOSUB 130 1950 PRINT "THE ROUTINE IS NAMED 'SAVE' AND IT IS CALLED IMMEDIATELY":GOSUB 120 1960 PRINT "YOU ENTER A SUBROUTINE IN YOUR PROGRAM THAT WILL USE MANY OF":GOSUB 120 1970 PRINT "THE REGISTERS THAT ARE CURRENTLY IN USE.":GOSUB 130 1980 PRINT "'SAVE' WILL STACK ALL THE WORKING REGISTERS AND FLAGS AND":GOSUB 120 1990 PRINT "RESTORE THEM WHEN YOUR SUBROUTINE RETURNS USING A MINIMUM OF":GOSUB 120 2000 PRINT "CODE.":GOSUB 130 2010 PLOT 6,6,3,0,11:PRINT "SAVE: XTHL" 2020 PLOT 3,7,12:PRINT "PUSH D" 2030 PLOT 3,7,13:PRINT "PUSH B" 2040 PLOT 3,7,14:PRINT "PUSH PSW" 2050 PLOT 3,7,15:PRINT "CALL JMPHL" 2060 PLOT 3,7,16:PRINT "POP PSW" 2070 PLOT 3,7,17:PRINT "POP B" 2080 PLOT 3,7,18:PRINT "POP D" 2090 PLOT 3,7,19:PRINT "POP H" 2100 PLOT 3,7,20:PRINT "RET" 2110 PLOT 3,0,21:PRINT "JMPHL: PCHL" 2120 PLOT 6,2:CZ= 20:GOSUB 6510:GOSUB 140 2130 PC$= "AB 12":GOSUB 5900:GOSUB 6300 2140 PRINT "ASSUME THAT WE HAVE JUST ENTERED A SUBROUTINE BY A CALL":GOSUB 120 2150 PRINT "THAT PLACED ITS RETURN ADDRESS (A91F) ON THE STACK LEAVING":GOSUB 120 2160 PRINT "SP = BE00 AS SHOWN ABOVE.":GOSUB 120 2170 PRINT "WE WILL NOW CALL 'SAVE'.":GOSUB 130 2180 PC$= "3F D0":GOSUB 5900:GOSUB 140:GOSUB 140:PC$= "3F D1":GOSUB 5900 2190 CY= 20:CZ= 19:GOSUB 6500:PLOT 6,6,3,32,19:PRINT "AB":SP$= "BD FF":GOSUB 5800:GOSUB 140 2200 CY= 19:CZ= 18:GOSUB 6500:PLOT 6,6,3,32,18:PRINT "29":SP$= "BD FE":GOSUB 5800:GOSUB 6300 2210 PRINT "CALLING 'SAVE' STACKS THE ADDRESS OF THE FIRST SUBROUTINE":GOSUB 120 2220 PRINT "INSTRUCTION FOLLOWING 'SAVE' AT BDFE, (ASSUME IT WAS AB29)":GOSUB 130 2230 PLOT 6,6,3,32,19:PRINT "F8":GOSUB 140 2240 PLOT 6,6,3,32,18:PRINT "F5":GOSUB 140 2250 H$= "AB":L$= "29":PC$= "3F D1":GOSUB 5600:GOSUB 5700:GOSUB 5900:GOSUB 6300 2260 PRINT "THE FIRST INSTRUCTION IN 'SAVE' IS XTHL WHICH WILL PUT AB29":GOSUB 120 2270 PRINT "FROM THE STACK INTO HL AND STACK HL, CURRENTLY F8F5, THUS":GOSUB 120 2280 PRINT "SAVING THE FIRST REGISTER PAIR AND LOADING THE ADDRESS NEEDED":GOSUB 120 2290 PRINT "TO PROCEED WITH THE SUBROUTINE.":GOSUB 130 2300 PRINT "THE NEXT INSTRUCTION, PUSH D, WILL STACK D, CURRENTLY 2BC2.":GOSUB 120 2310 PRINT "LET'S LOOK AT THAT.":GOSUB 130 2320 D$= "2B":E$= "C2":PC$= "3F D2":GOSUB 5400:GOSUB 5500:GOSUB 5900:GOSUB 140 2330 CY= 18:CZ= 17:GOSUB 6500:PLOT 6,6,3,32,17:PRINT "2B":SP$= "BD FD":GOSUB 5800:GOSUB 140 2340 CY= 17:CZ= 16:GOSUB 6500:PLOT 6,6,3,32,16:PRINT "C2":SP$= "BD FC":GOSUB 5800:GOSUB 6300 2350 PRINT "SIMILARLY, PUSH B, STACKS BC, CURRENTLY EC05.":GOSUB 130 2360 B$= "EC":C$= "05":PC$= "3F D3":GOSUB 5200:GOSUB 5300:GOSUB 5900:GOSUB 140 2370 CY= 16:CZ= 15:GOSUB 6500:PLOT 6,6,3,32,15:PRINT "EC":SP$= "BD FB":GOSUB 5800:GOSUB 140 2380 CY= 15:CZ= 14:GOSUB 6500:PLOT 6,6,3,32,14:PRINT "05":SP$= "BD FA":GOSUB 5800:GOSUB 6300 2390 PRINT "THE LAST REGISTER TO BE SAVED IS PSW. A EVALUATES TO F5":GOSUB 120 2400 PRINT "AND THE FLAGS + FILLERS TO A4.":GOSUB 130 2410 CY= 14:CZ= 13:GOSUB 6500:PLOT 6,6,3,32,13:PRINT "F5":SP$= "BD F9":GOSUB 5800:GOSUB 140 2420 CY= 13:CZ= 12:GOSUB 6500:PLOT 6,6,3,32,12:PRINT "A4":SP$= "BD F8":GOSUB 5800:GOSUB 6300 2430 PC$= "3F D4":SP$= "BD F8":GOSUB 5800:GOSUB 5900:GOSUB 6300 2440 PRINT "'SAVE' THEN CALL'S JMPHL. THE NEXT INSTRUCTION AFTER":GOSUB 120 2450 PRINT "CALL JMPHL, IS POP PSW, WHICH IS AT 3FD7.":GOSUB 120 2460 PRINT "THE CALL STACKS THAT ADDRESS TOO.":GOSUB 130 2470 CY= 12:CZ= 11:GOSUB 6500:PLOT 6,6,3,32,11:PRINT "3F":SP$= "BD F7":GOSUB 5800:GOSUB 140 2480 CY= 11:CZ= 10:GOSUB 6500:PLOT 6,6,3,32,10:PRINT "D7":SP$= "BD F6":GOSUB 5800:GOSUB 6300 2490 PC$= "3F D5":SP$= "BD F6":GOSUB 5800:GOSUB 5900:GOSUB 6300 2500 PRINT "THE STACK IS NOW 6 ADDRESSES DEEP. JMPHL THEN INSTRUCTS PCHL":GOSUB 120 2510 PRINT "(EFFECTIVELY A JUMP TO THE ADDRESS POINTED BY HL).":GOSUB 120 2520 PRINT "THEREFORE PROGRAM EXECUTION WILL JUMP TO THE NEXT INSTRUCTION":GOSUB 120 2530 PRINT "IN OUR SUBROUTINE PAST 'SAVE' AT AB29.":GOSUB 130 2540 PC$= "3F D7":GOSUB 5900:GOSUB 140:GOSUB 140:PC$= "AB 29":GOSUB 5900:GOSUB 140:GOSUB 6300 2550 PRINT "OUR SUBROUTINE MAY NOW PROCEED, USING DEEPER STACK LEVELS IF":GOSUB 120 2560 PRINT "NECESSARY BY CALLING OTHER SUBROUTINES, UNTIL FINALLY WE REACH":GOSUB 120 2570 PRINT "THE RET AT THE END OF OUR SUBROUTINE.":GOSUB 130 2580 PRINT "PRIOR TO RET, THE TOP OF THE STACK SHOULD BE THE ADDRESS":GOSUB 120 2590 PRINT "OF THE POP PSW IN 'SAVE'. (3FD7)":GOSUB 130 2600 CY= 10:CZ= 12:GOSUB 6500:SP$= "BD F8":GOSUB 5800:GOSUB 140:PC$= "3F D7":GOSUB 5900:GOSUB 140:GOSUB 6300 2610 PRINT "RET POP'S THE CURRENT TOP OF THE STACK INTO PC.":GOSUB 130 2620 PRINT "THE RET AT THE END OF OUR SUBROUTINE PLUS FOUR POP'S IN 'SAVE'":GOSUB 120 2630 PRINT "PLUS THE RET AT THE BOTTOM OF 'SAVE' WILL STRIP ALL OF THE":GOSUB 120 2640 PRINT "REGISTERS OFF THE STACK BACK INTO THE CPU,":GOSUB 120 2650 PRINT "AND RETURN US TO THE INSTRUCTION PAST OUR ORIGINAL CALL TO":GOSUB 120 2660 PRINT "OUR SUBROUTINE (PC = A91F), AND SP IS RESTORED TO BE02":GOSUB 120 2670 PRINT "WHERE IT WAS PRIOR TO THE ACTIONS DESCRIBED ABOVE.":GOSUB 130 2680 FOR CY= 12TO 21:CZ= CY+ 1:GOSUB 6500:GOSUB 140:NEXT 2690 SP$= "BE 02":GOSUB 5800:PC$= "AF 19":GOSUB 5900:GOSUB 140:GOSUB 6300 2700 PRINT "GREAT CARE MUST BE EXERCISED IN MANIPULATING THE STACK BUT":GOSUB 120 2710 PRINT "A CLEAR UNDERSTANDING OF THE INSTRUCTIONS RELATING TO IT":GOSUB 120 2720 PRINT "OPENS THE WAY TO VERY EFFECTIVE PROGRAMMING.":GOSUB 130 2730 PRINT "THAT CONCLUDES THE DISCUSSION ON THE STACK. WE WILL NEXT":GOSUB 120 2740 PRINT "LOOK AT THE CPU'S CONNECTION WITH THE OUTSIDE WORLD:":GOSUB 120 2750 PRINT "THE INPUT AND OUTPUT PORTS.":GOSUB 130 2760 FOR I= 12TO 20:Z= CALL (I):NEXT 2770 INPUT "DO YOU WANT TO PROCEED TO DISCUSS INPUT/OUTPUT PORTS? Y/N ";YN$ 2780 IF YN$< > "Y"THEN PLOT 12,1 2790 LOAD "TUTE4D":RUN 200 2800 END 5000 PLOT 6,6,3,20,2:PRINT A$:RETURN 5100 PLOT 6,6,3,30,2:PRINT F$:RETURN 5200 PLOT 6,6,3,23,4:PRINT B$:RETURN 5300 PLOT 6,6,3,33,4:PRINT C$:RETURN 5400 PLOT 6,6,3,23,6:PRINT D$:RETURN 5500 PLOT 6,6,3,33,6:PRINT E$:RETURN 5600 PLOT 6,6,3,23,8:PRINT H$:RETURN 5700 PLOT 6,6,3,33,8:PRINT L$:RETURN 5800 PLOT 6,6,3,50,4:PRINT SP$:RETURN 5900 PLOT 6,6,3,50,6:PRINT PC$:RETURN 6000 PLOT 6,34,3,2,4:PRINT I$:PLOT 3,12,4:PRINT HI$:PLOT 6,2,3,2,7:PRINT P$:RETURN 6100 PLOT 6,2,3,5,9:PRINT DD$:RETURN 6200 PLOT 6,2,3,45,9:PRINT AD$:RETURN 6300 PLOT 6,2,3,0,31:RETURN 6400 GOSUB 6100:GOSUB 140:I$= DD$:DD$= BL$:GOSUB 6100:RETURN 6500 PLOT 6,2,3,23,CY:PRINT CC$ 6510 PLOT 3,23,CZ:PRINT BP$:GOSUB 6300:RETURN