;DEMO OF BANK SWITCHING WITH ›;DISPLAY LIST INTERRUPTS IN›;GRAPHICS 18›››MODULE››DEFINE››BANK0="0",›BANK1="4",›BANK2="8",›BANK3="12",›MODE="0",››RTI="$40",›PHA="$48",›PLA="$68",›TXA="$8A",›TAX="$AA",›TYA="$98",›TAY="$A8",›JMP="$4C"›››;ARRAY USED FOR ADDRESSES OF›;"CHAINED" DISPLAY LIST INTERRUPTS›››CARD ARRAY DLIADRS(4)››;VDSLST IS VECTOR TO CURRENT DLI›;DLIST IS ADDRESS OF DISPLAY LIST››CARD VDSLST=512,DLIST=560››;NMIEN ENABLES/DISABLES DLI'S›;WSYNC MAKES SURE DLI OCCURS ON›; THE CORRECT SCREEN LINE›;PORTB IS THE CONTROL REGISTER›; FOR THE BANK SWITCHING›››BYTE NMIEN=$D40E,› WSYNC=$D40A,› PORTB=54017››;TWO ARRAYS TO SET UP DISPLAY LIST›;DL IS "FIXED" AT THE BEGINNING›;OF A 1K BOUNDARY. DL2 CONTAINS›;THE DATA TRANSFERRED INTO DL.››;EVERY THREE MODE LINES IS AN ANTIC›;LMS INSTRUCTION RESETTING THE›;SCREEN MEMORY BACK TO 16384, THE›;BEGINNING OF THE "SWITCHABLE" AREA ›;OF MEMORY. IF THE LMS ISN'T RESET›;BACK TO THE START OF SCREEN MEMORY›;THE BANKS DO NOT APPEAR IN ORDER.››;FOR EVERY 3 MODE LINES BIT 7 IS SET›;TO ENABLE THE DLI ON THE NEXT MODE›;LINE. THE NUMBERS ARE 240 AND 135.›››BYTE ARRAY DL=32768,DL2=›[112 112 240 71 0 64›7 135 71 0 64›7 135 71 0 64›7 135 71 0 64›7 7 65 0 0]›››; DLI ROUTINES›››; *********›; * BANK0 *›; *********›››PROC DLI1()››; SAVE 6502 REGISTERS ONTO STACK››[PHA TXA PHA TYA PHA]››;SETTING WSYNC TO "1" TELLS IT TO›;WAIT UNTIL IT IS DONE DRAWING›;THE MODE LINE BEFORE EXECUTING THE›;DLI.› ›WSYNC=1››;SET PORTB WITH VALUES TO SWITCH›;TO BANK0››PORTB=193+MODE+BANK0››;PLUG ADDRESS OF NEXT DLI INTO›;DLI VECTOR›››VDSLST=DLIADRS(2)››;PUT 6502 REGISTERS BACK ON THE ›;STACK.››[PLA TAY PLA TAX PLA RTI]›››; *********›; * BANK1 *›; *********››PROC DLI2()››[PHA TXA PHA TYA PHA]››WSYNC=1›PORTB=193+MODE+BANK1››VDSLST=DLIADRS(3)››[PLA TAY PLA TAX PLA RTI]››; *********›; * BANK2 *›; *********››PROC DLI3()›››[PHA TXA PHA TYA PHA]››WSYNC=1›PORTB=193+MODE+BANK2››VDSLST=DLIADRS(4)››[PLA TAY PLA TAX PLA RTI]››; *********›; * BANK3 *›; *********››PROC DLI4()›››[PHA TXA PHA TYA PHA]››WSYNC=1›PORTB=193+MODE+BANK3››VDSLST=DLIADRS(1)››[PLA TAY PLA TAX PLA RTI]››;**********************************›;STORE ADDRESSES OF DLIS IN DLIADRS›;**********************************›››PROC INIT_DLIS()››DLIADRS(1)=DLI1›DLIADRS(2)=DLI2›DLIADRS(3)=DLI3›DLIADRS(4)=DLI4››RETURN››;************************************›;SET UP DISPLAY LIST AND ENABLE DLI'S›;************************************››PROC DLSETUP()››BYTE I››CARD POINTER C››;TRANSFER DL2 TO DL AT ADDRESS 32768››FOR I=1 TO 26 DO› DL(I)=DL2(I-1) ›OD››;SET POINTER C TO ADDRESS OF DL›;THEN MOVE TO OF DL+25››C=DL : C==+25››;STORE STARTING ADDRESS OF DL›;AFTER ANTIC JVB INSTRUCTION ›;IN DISPLAY LIST (DL)››C^=DL››;DISABLE DLI'S››NMIEN=$40››;PLUG STARTING ADDRESS OF DLI1›;INTO DLI VECTOR››VDSLST=DLI1››DLIST=DL ; ENABLE DISPLAY LIST››NMIEN=$C0 ;ENABLE DLI'S››RETURN››;**************************›; FILL UP START OF BLOCK OF›; MEMORY WITH CHARACTER›;**************************››PROC FILL(BYTE C)››BYTE I››BYTE POINTER NUSCREEN››NUSCREEN=16384››FOR I=0 TO 239 DO› NUSCREEN^=C› NUSCREEN==+1›OD››RETURN››; ***************************›; FILL BANKS WITH CHARACTERS›; AND ENABLE DISPLAY LIST/DLI›; SETUP›; ***************************›››PROC XESWITCH()›››BYTE FILLER››INIT_DLIS() ››GRAPHICS (18)›› ›; FILL BANK0 WITH "A"››PORTB=193+MODE+BANK0›FILLER=33 : FILL(FILLER)››; FILL BANK1 WITH "B"››PORTB=193+MODE+BANK1›FILLER=34 : FILL(FILLER)››; FILL BANK2 WITH "C"››PORTB=193+MODE+BANK2›FILLER=35 : FILL(FILLER)››; FILL BANK3 WITH "D"››PORTB=193+MODE+BANK3›FILLER=36 : FILL(FILLER)››››DLSETUP()››; INFINITE LOOP››DO››OD››RETURN››