10 *=$C000 20 ! ********************************** 30 ! 40 ! SEUCK EXTENSION BLOCK/SCREEN 50 ! EXPANSION ROUTINE BY IAN (null)FFE 60 ! OCTOBER, 1989 FOR CDU. 70 ! 80 ! SOURCE FILE COMPATIBLE WITH: 90 ! 100 ! 110 ! > MIKRO ASSEMBLER 120 ! > 6510+ 130 ! > MY MACRO ASSEMBLER 140 ! 150 ! (CHANGE ASL A TO ASLA 160 ! WITH MACRO ASSEMBLER) 170 ! 180 ! ********************************** 190 ! 200 ! THIS PROGRAM TAKES THE DATA 210 ! SAVED FROM THE S.E.U.C.K EXTENSION 220 ! EDITOR, AND DISPLAYS A GIVEN 230 ! SCREEN. 240 ! 250 ! WE ARE USING BANK 0 (DEFAULT) 260 ! WITH THE FOLLOWING SET OF DATA:- 270 ! 280 ! BLOCK COLOURS AT $2000-$2080 290 ! BLOCK DEFINITIONS AT $2100-$2D80 300 ! CHARACTER SET AT $3000-$3800 310 ! SCREEN DATA AT $4000-$6000 320 ! SCREEN AT $0400>DEFAULT 330 ! 340 ! FIRST GIVE VALUES TO 350 ! LABELS REFERING TO THE ABOVE 360 ! 370 BLOCKBASE=$2100 380 SCREENDATA=$4000 390 BB=BLOCKBASE ! A SHORTER LABEL FOR 400 ! LATER ON!! 410 COLBLOCK=$2000 420 SC=1024 430 ! 440 ! USED TO FIND COLOUR MAP 450 ! FROM SCREEN ADDRESS... 460 ! 470 DIFFERENCE=55296-SC 480 ! 490 ! INIT ZERO PAGE LOCATIONS TO 500 ! HOLD THE ADDRESSES TO WORK ON 510 ! 520 BLOCKAD=$FE 530 COLOURAD=$FC 540 SCREENAD=$FA 550 SAD=$F8 560 ! 570 ! ***************************** 580 ! 590 ! THIS IS ALL THAT IS REQUIRED 600 ! OF YOU TO PRINT A SCREEN!!! 610 ! 620 SEI 630 LDA #28 ! MOVE CHAR SET TO 12288 640 STA 53272 650 LDA #216 660 STA 53270 ! MULTICOLOUR ON 670 ! 680 LDA #0 ! SET COLOURS AS YOU WISH 690 STA 53281 700 STA 53282 710 LDX #6 720 STX 53282 730 INX 740 STX 53283 750 LDA #0 ! LOAD A WITH SCREEN # 760 JSR EXPASCR 770 CLI 780 RTS 790 ! ***************************** 800 ! 810 ! ---------------------------------- 820 ! THE ROUTINE BELOW PRINTS 830 ! A SINGLE BLOCK TO THE SCREEN 840 ! AT THE GIVEN X AND Y COORDS. 850 ! CALL THIS ROUTINE WITH: 860 ! A=BLOCK NUMBER 870 ! "XINIT" ANY "YINIT" 880 ! HOLDING THE RELEVANT COORDINATES. 890 ! 900 ! ---------------------------------- 910 EXPBLOCK ! 920 ! 930 ! 940 STA BLOCKNUM 950 TAX 960 ! 970 ! 980 ! ! GET Y=BLOCK NUMBER*2 990 ! 1000 ASL A ! SHIFT LEFT IE. *2 1010 TAY 1020 ! 1030 ! GET THE COLOUR OF THIS BLOCK 1040 LDA COLBLOCK,X 1050 STA COLOUR 1060 ! 1070 ! NOW WE NEED TO GET THE START 1080 ! ADDR. OF THIS BLOCK'S DEFINITION 1090 ! 1100 ! TO DO THIS WE NEED TO GET :- 1110 ! (BLOCK NO.*25)+BLOCK BASE ADDR. 1120 ! THIS MAY TAKE MUCH PROCESSOR 1130 ! TIME AS "MULTIPLE-ADDITION" 1140 ! TECHNIQUES ARE REQUIRED. 1150 ! 1160 ! INSTEAD I HAVE SET UP A 256-BYTE 1170 ! TABLE HOLDING EACH OF THE 128 1180 ! BLOCK ADDRESSES. 1190 ! TO INDEX A PARTICULAR BLOCK DEF. 1200 ! INDEX=BLOCK NO. *2 1210 ! 1220 ! AS Y=BLOCK NO*2 1230 ! 1240 ! 1250 LDA BLOCKTABAD,Y ! GET LO BYTE 1260 STA BLOCKAD 1270 LDA BLOCKTABAD+1,Y ! HI BYTE 1280 STA BLOCKAD+1 1290 ! 1300 ! SIMPLE ISN'T IT, NOW"?" 1310 ! 1320 ! THIS TIME SAVING IS REQUIRED 1330 ! AS THIS ROUTINE IS CALLED 32 1340 ! TIMES FOR EACH SCREEN - YOU WILL 1350 ! NOTICE THE TIME DIFFERENCE 1360 ! IF THE ADDRESS WASN'T TABULATED! 1370 ! WE NEED TO BANG DATA ONTO THE 1380 ! SCREEN LIKE A BAT OUT OF HELL, 1390 ! SO IT'S WELL WORTH THE 256 BYTES! 1400 ! ------------------------------- 1410 ! SUMMARY:- 1420 ! BLOCKAD HOLDS BLOCK/CHAR ADDR 1430 ! FOR BLOCK IN "BLOCKNUM" 1440 ! ------------------------------- 1450 ! 1460 ! NOW GET SCREENAD TO HOLD THE 1470 ! SCREEN ADDRESS FOR THE Y COORD. 1480 ! 1490 ! IE. SO AS SCREENAD HOLDS THE 1500 ! SCREEN ADDRESS FOR WHEN X=0. 1510 ! 1520 ! I AM EMPLOYING THE SAME 1530 ! "GET THE ADDRESS OUT OF THE 1540 ! TABLE[171]QUICK" METHOD AGAIN AS 1550 ! IT IS IN THE MAIN ROUTINE STILL! 1560 ! GET Y COORDINATE*2 FOR OFFSET 1570 ! IN THE SCREEN ADDRESS TABLE. 1580 ! 1590 LDA YINIT 1600 ASL A 1610 TAY 1620 LDA SCREENTABLE,Y 1630 STA SCREENAD 1640 LDA SCREENTABLE+1,Y 1650 STA SCREENAD+1 1660 ! 1670 ! 1680 ! 1690 ! 1700 ! ----------------------------- 1710 ! NOW SCREENAD=THE Y COORD ADDRESS 1720 ! OF THE SCREEN FOR X=0 1730 ! ----------------------------- 1740 ! 1750 LDA #0 1760 STA BLKREAD ! COUNT THROUGH 0-24 1770 ! CHARS. IN THIS BLOCK 1780 LDA #5 1790 STA YCOUNT ! HEIGHT OF BLOCK 1800 ! 1810 DO1Y LDA XINIT ! EACH NEW Y COORD - 1820 ! GIVE THE X START 1830 ! INDEX ACROSS THE 1840 ! THE SCREEN IE. 1850 ! VALUE FROM 0-39. 1860 STA XCOORD 1870 LDY #5 ! WIDTH OF BLOCK 1880 STY XCOUNT 1890 ! 1900 DO1X LDY BLKREAD ! INDEX (0-24) 1910 ! THROUGH BLOCK 1920 ! DEFINITION. 1930 ! 1940 ! READ A CHAR. TO PRINT 1950 ! FROM THIS BLOCK'S BASE 1960 ! 1970 READBLOCK LDA (BLOCKAD),Y 1980 ! 1990 LDY XCOORD ! STORE ON SCREEN 2000 ! TAKING INTO ACCOUNT 2010 ! THE COLUMN INDEX 2020 ! 2030 STA (SCREENAD),Y 2040 ! 2050 ! CREATE THE COLOURMAP ADDRESS 2060 ! RELATIVE FROM THE SCREEN. 2070 ! 2080 ! NOTE THAT IF A SCREEN ADDRESS 2090 ! IS BEING USED THAT IS >55296 2100 ! THEN THE LABEL DIFFERENCE 2110 ! WOULD NEED TO BE CHANGED TO:- 2120 ! DIFFERENCE=SCR-55296 2130 ! 2140 ! AND THE "ADC" INSTRUCTIONS 2150 ! BELOW WOULD NEED TO BE CHANGED 2160 ! TO "SBC" - MAKING SURE THAT YOU 2170 ! SET CARRY (SEC) FIRST INSTEAD OF 2180 ! "CLC" - NUFF SAID! 2190 ! 2200 CLC 2210 LDA SCREENAD 2220 ADC #DIFFERENCE 2260 STA COLOURAD+1 2270 LDA COLOUR 2280 ! 2290 ! Y STILL HOLDS COLUMN INDEX 2300 ! SO COLOUR IN THAT CHAR ON SCREEN! 2310 STA (COLOURAD),Y 2320 ! 2330 INC XCOORD ! MOVE ALONG SCREEN 2340 ! COLUMN 2350 INC BLKREAD ! THROUGH 0-24 INDEX 2360 ! IN BLOCK 2370 ! 2380 ! 2390 DEC XCOUNT LOOP WIDTH 2400 BNE DO1X 2410 ! 2420 ! 2430 ! NOW MOVE DOWN ONE Y COORDINATE - 2440 ! JUST ADD 40 TO THE SCREEN ADDR. 2450 ! 2460 CLC 2470 LDA SCREENAD 2480 ADC #40 2490 STA SCREENAD 2500 BCC OKE 2510 INC SCREENAD+1 2520 ! 2530 OKE DEC YCOUNT ! LOOP HEIGHT 2540 BNE DO1Y 2550 RTS 2560 XCOORD BYT 0 2570 BLKREAD BYT 0 2580 XINIT BYT 0 2590 YINIT BYT 0 2600 BLOCKNUM BYT 0 2610 YCOUNT BYT 0 2620 XCOUNT BYT 0 2630 ! ------------------------------ 2640 ! 2650 ! THIS ROUTINE EXPANDS A COMPLETE 2660 ! SCREEN BY CALLING THE "EXPAND 2670 ! A BLOCK ROUTINE" FOR EACH OF THE 2680 ! 32 BLOCKS ON A SCREEN.. 2690 ! 2700 !IT IS CALLED WITH A=SCREEN NUMBER 2710 ! - SIMPLICITY IT'SELF FOR YOU! 2720 ! 2730 ! ------------------------------ 2740 EXPASCR ! 2750 ! 2760 ! RIGHT - WHAT WE MUST DO 2770 ! IS FIND THE SCREEN DATA ADDRESS. 2780 ! EACH DATA ADDRESS FOR A SCREEN 2790 ! IS 32 BYTES LONG - SO WE MUST 2800 ! GET (32*SCREEN)+BASE 2810 ! OF DATA ADDRESSES - OK... 2820 ! 2830 LDX #0 2840 STA SAD 2850 STX SAD+1 ! INIT MULTIPLY 2860 ! 2870 CLC 2880 ASL SAD 2890 ROL SAD+1 ! *2 2900 ASL SAD 2910 ROL SAD+1 ! *4 2920 ASL SAD 2930 ROL SAD+1 ! *8 2940 ASL SAD 2950 ROL SAD+1 ! *16 2960 ASL SAD 2970 ROL SAD+1 ! *32 2980 ! 2990 ! NOW TO ADD IN THE BASE 3000 ! ADDRESS OF THE SCREEN DATA 3010 ! 3020 CLC 3030 LDA SAD 3040 ADC #SCREENDATA 3080 STA SAD+1 3090 ! 3100 ! -------------------------- 3110 ! WICKED! - SCRAD/+1 HOLDS BASE 3120 ! ADDRESS FOR THE SCREEN - PHEW! 3130 ! --------------------------- 3140 ! 3150 ! 3160 STX XINIT ! X COORD ON SCREEN 3170 STX YINIT ! Y " " " 3180 STX BLOKC ! INDEX IN SCREEN [131] 3190 ! [164] [135] BLOCK NUMBERS 3200 BKA ! 3210 LDY BLOKC 3220 LDA (SAD),Y ! [135] BLOCK IN 3230 ! THIS SCREEN 3240 ! 3250 INC BLOKC ! [130] BLOCK IN SCREEN 3260 ! 3270 ! BANG THAT BLOCK [145][164] THE SCREEN ! 3280 JSR [189]BLOCK 3290 ! 3300 LDA XINIT 3310 CLC 3320 ADC #5 ! START [130] BLOCK 3330 ! AL[145]G BY 5 CHARACTERS 3340 STA XINIT 3350 CMP #40 ! RIGHT[171]MOST COLUMN 3360 ! REACHED 3370 ! 3380 BNE NOXREAC 3390 ! 3400 ! [171][171][177] [139] X REACHED LAST COLUMN 3410 ! [167] RESET X [164] 0, [175] MOVE 3420 ! DOWN BY 5 Y CO[176]DINATES!! 3430 ! 3440 LDA #0 3450 STA XINIT 3460 CLC 3470 LDA YINIT 3480 ADC #5 ! DOWN 5 CHARS(Y) 3490 STA YINIT 3500 ! 3510 ! 3520 CMP #20 ! CHECK FOR MAX Y COORD. 3530 ! (MUST BE A MULTIPLE OF 5 3540 ! - OR ELSE !!!!) 3550 ! 3560 BEQ [142] 3570 NOXREAC JMP BKA 3580 ! 3590 ! FINALLY THE WHOLE SCREEN HAS 3600 ! BEEN DISPLAYED [171] SIT BACK & 3610 ! ADMIRE YOUR W[176]K.......... 3620 ! 3630 [142] ! 3640 RTS 3650 BLOKC BYT 0 3660 COLOUR BYT 0 3670 ! 3680 ! 3690 !THE ADDRESSES OF BLOCK DEFINITIONS 3700 ! (ALL 128 OF THEM!) 3710 ! 3720 BLOCKTABAD ! 3730 W[176] BB,BB[170]25,BB[170]50,BB[170]75,BB[170]100,BB[170]125,BB[170]150,BB[170]175,BB[170]200,BB[170]225 3740 W[176] BB[170]250,BB[170]275,BB[170]300,BB[170]325 3750 W[176] BB[170]350,BB[170]375,BB[170]400,BB[170]425 3760 W[176] BB[170]450,BB[170]475,BB[170]500,BB[170]525 3770 W[176] BB[170]550,BB[170]575,BB[170]600,BB[170]625 3780 W[176] BB[170]650,BB[170]675,BB[170]700,BB[170]725,BB[170]750,BB[170]775,BB[170]800,BB[170]825,BB[170]850,BB[170]875 3790 W[176] BB[170]900,BB[170]925,BB[170]950,BB[170]975,BB[170]1000,BB[170]1025 3800 W[176] BB[170]1050,BB[170]1075,BB[170]1100,BB[170]1125,BB[170]1150,BB[170]1175,BB[170]1200,BB[170]1225 3810 W[176] BB[170]1250,BB[170]1275,BB[170]1300,BB[170]1325,BB[170]1350,BB[170]1375,BB[170]1400,BB[170]1425 3820 W[176] BB[170]1450,BB[170]1475,BB[170]1500,BB[170]1525,BB[170]1550,BB[170]1575,BB[170]1600,BB[170]1625 3830 W[176] BB[170]1650,BB[170]1675,BB[170]1700,BB[170]1725,BB[170]1750,BB[170]1775,BB[170]1800,BB[170]1825 3840 W[176] BB[170]1850,BB[170]1875,BB[170]1900,BB[170]1925 3850 W[176] BB[170]1950,BB[170]1975,BB[170]2000,BB[170]2025,BB[170]2050,BB[170]2075,BB[170]2100,BB[170]2125 3860 W[176] BB[170]2150,BB[170]2175,BB[170]2200,BB[170]2225,BB[170]2250,BB[170]2275,BB[170]2300,BB[170]2325 3870 W[176] BB[170]2350,BB[170]2375,BB[170]2400,BB[170]2425,BB[170]2450,BB[170]2475,BB[170]2500,BB[170]2525 3880 W[176] BB[170]2550,BB[170]2575,BB[170]2600,BB[170]2625,BB[170]2650,BB[170]2675,BB[170]2700,BB[170]2725 3890 W[176] BB[170]2750,BB[170]2775,BB[170]2800,BB[170]2825,BB[170]2850,BB[170]2875,BB[170]2900,BB[170]2925 3900 W[176] BB[170]2950,BB[170]2975,BB[170]3000,BB[170]3025,BB[170]3050,BB[170]3075,BB[170]3100,BB[170]3125 3910 W[176] BB[170]3150,BB[170]3175 3920 ! 3930 ! [175] THE SCREEN ADDRESSES..... 3940 ! 3950 SCREENTABLE W[176] SC,SC[170]40,SC[170]80,SC[170]120,SC[170]160,SC[170]200,SC[170]240,SC[170]280,SC[170]320 3960 W[176] SC[170]360,SC[170]400,SC[170]440,SC[170]480,SC[170]520,SC[170]560,SC[170]600,SC[170]640,SC[170]680,SC[170]720 3970 W[176] SC[170]760,SC[170]800 3980 ! 3990 ! 4000 ! IG'89 4010 ! 4020 ! 4030 !