Compucolor.org – Virtual Media

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