Mixed Mode Graphics#
General Information
Author: Karl E. Wiegers
Published: ANALOG
Mixed Mode Graphics Display#
0100 ;Mixed-Mode graphics displays 0110 ;in Atari assembly language 0120 ; 0130 ;by Karl E. Wiegers 0140 ; 0150 .OPT NO LIST 0160 ; 0170 OPEN = $03 ;equates for CIO 0180 PUTREC = $09 ;operations 0190 CLOSE = $0C 0200 DRAW = $11 0210 EOL = $9B ;carriage return 0220 ROWCRS = $54 ;cursor row 0230 COLCRS = $55 ;cursor column 0240 DINDEX = $57 ;graphics mode 0250 SAVMSC = $58 ;screen RAM area 0260 SDMCTL = $022F ;screen on/off 0270 SDLSTL = $0230 ;starting address 0280 ; of display list 0290 CRSINH = $02F0 ;disable cursor 0300 ATACHR = $02FB ;select color reg 0310 ; 0320 ;equates for IOCB #0 0330 ; 0340 ICCOM = $0342 ;command byte 0350 ICBAL = $0344 ;buffer address, 0360 ICBAH = $0345 ;low and high 0370 ICBLL = $0348 ;buffer length, 0380 ICBLH = $0349 ;low and high 0390 ICAX1 = $034A ;auxiliary byte 1 0400 ICAX2 = $034B ;auxiliary byte 2 0410 CIOV = $E456 ;CIO entry point 0420 CONSOL = $D01F ;console buttons 0430 STRGNO = $CB ;work byte I need 0440 SCRRAM = $4000 ;screen RAM start 0450 ; 0460 ;Display list starts at address 0470 ;$3F00, screen RAM at $4000 0480 ; 0490 *= $3F00 0500 DLIST 0510 .BYTE 112,112,112,70,0,$40 0520 .BYTE 6,7,7,7,7,7,7,13,13 0530 .BYTE 13,13,13,13,13,13,13 0540 .BYTE 13,13,13,13,13,13,13 0550 .BYTE 13,13,13,13,13,13,13 0560 .BYTE 13,2,2,2,2,65,0,$3F 0570 ; 0580 ;program begins here 0590 ; 0600 *= $5000 0610 ; 0620 CLD ;binary mode! 0630 LDA #0 ;zero current 0640 STA STRGNO ;text line counter 0650 TAX 0660 ; 0670 ;zero out screen RAM area 0680 ; 0690 ZERO 0700 STA SCRRAM,X ;loop goes 0710 STA SCRRAM+$0100,X ;256 times 0720 STA SCRRAM+$0200,X ;each line 0730 STA SCRRAM+$0300,X ;does one 0740 STA SCRRAM+$0400,X ;page of RAM 0750 INX 0760 BNE ZERO 0770 ; 0780 ;open screen device, "S:" 0790 ; 0800 JSR OPENSCREEN 0810 LDA #1 ;turn off cursor 0820 STA CRSINH 0830 LDA DLIST+4 ;tell ANTIC 0840 STA SAVMSC ;where to find 0850 LDA DLIST+5 ;display memory 0860 STA SAVMSC+1 0870 LDA #0 ;turn off the 0880 STA SDMCTL ;screen briefly, 0890 LDA #DLIST&255 ;tell ANTIC 0900 STA SDLSTL ;where to 0910 LDA #DLIST/256 ;find the 0920 STA SDLSTL+1 ;display list, 0930 LDA #34 ;turn screen 0940 STA SDMCTL ;back on 0950 ; 0960 ;start printing text lines 0970 ; 0980 LDA #1 ;graphics mode 1 0990 STA DINDEX 1000 JSR POSITION ;position cursor 1010 LDX #$60 ;use IOCB #6 1020 LDA #LINE1&255 ;print first 1030 STA ICBAL,X ;line of text, 1040 LDA #LINE1/256 ;in Graphics 1 1050 STA ICBAH,X ;segment 1060 JSR PRINTLINE 1070 LDA #40 ;skip ahead 40 1080 JSR ADDMEM ;bytes in RAM 1090 LDA #2 ;Graphics mode 2 1100 STA DINDEX 1110 JSR POSITION ;position cursor 1120 LDX #$60 ;use IOCB #6 1130 LDA #LINE2&255 ;print all 1140 STA ICBAL,X ;text lines 1150 LDA #LINE2/256 ;in Graphics 2 1160 STA ICBAH,X ;segment 1170 JSR PRINTLINE 1180 LDA #120 ;go up 120 bytes 1190 JSR ADDMEM ;in screen RAM to 1200 LDA #7 ;Graphics 7 1210 STA DINDEX ;segment 1220 ; 1230 ;plot 1st point of rocket ship 1240 ; 1250 LDA #60 ;set coordinates 1260 STA COLCRS ;of first point 1270 LDA #8 ;to plot for 1280 STA ROWCRS ;rocket 1290 LDX #$60 ;use IOCB #6 1300 LDA #REG1&255 ;color register 1 1310 STA ICBAL,X 1320 LDA #REG1/256 1330 STA ICBAH,X 1340 JSR PLOTPOINT 1350 ; 1360 ;routine to draw the rocket 1370 ; 1380 LDA #2 ;color register 1 1390 STA ATACHR 1400 LDY #0 1410 POINT ; loop to plot 1420 LDA XDATA,Y ;points and 1430 STA COLCRS ;connect them 1440 LDA YDATA,Y ;with lines 1450 STA ROWCRS 1460 TYA 1470 PHA 1480 JSR DRAWLINE ;drawing sub. 1490 PLA 1500 TAY 1510 INY 1520 CPY #13 ;done all 13 pts? 1530 BNE POINT ;no, loop 1540 ; 1550 ;plot points for rocket exhaust 1560 ; 1570 LDX #$60 1580 LDA #REG0&255 ;color reg. 0 1590 STA ICBAL,X 1600 LDA #REG0/256 1610 STA ICBAH,X 1620 LDY #0 1630 POINT2 ; loop to get 1640 LDA EXHAUSTX,Y ;coordinates 1650 STA COLCRS ;for points 1660 LDA EXHAUSTY,Y ;from table, 1670 STA ROWCRS 1680 TYA 1690 PHA 1700 JSR PLOTPOINT ;plotting sub. 1710 PLA 1720 TAY 1730 INY 1740 CPY #4 ;done 4 pts? 1750 BNE POINT2 ;no, loop 1760 ; 1770 ;add 960 bytes to current screen 1780 ;RAM starting point, 10*96 1790 ; 1800 LDX #10 1810 ADDEMUP 1820 LDA #96 1830 JSR ADDMEM 1840 DEX 1850 BNE ADDEMUP 1860 ; 1870 ;now in bottom segment, Gr. 0 1880 ; 1890 LDA #0 ;Graphics 0 1900 STA DINDEX 1910 JSR POSITION ;set cursor 1920 LDX #$60 ;use IOCB #6 1930 LDA #LINE3&255 ;print first 1940 STA ICBAL,X ;text line 1950 LDA #LINE3/256 ;in Graphics 0 1960 STA ICBAH,X ;segment 1970 JSR PRINTLINE 1980 JSR POSITION ;print last 1990 LDX #$60 ;text line 2000 LDA #LINE4&255 2010 STA ICBAL,X 2020 LDA #LINE4/256 2030 STA ICBAH,X 2040 JSR PRINTLINE 2050 ; 2060 ;loop until START pressed, then 2070 ;close screen & reopen so blank 2080 ; 2090 LDA #8 ;initialize 2100 STA CONSOL ;buttons 2110 EXIT 2120 LDA CONSOL ;value of 6 here 2130 CMP #6 ;means START 2140 BNE EXIT ;no? try again 2150 LDX #$60 ;close screen 2160 JSR CLOSEANY 2170 JSR OPENSCREEN ;and reopen 2180 END JMP END ;wait for reset 2190 ; 2200 ;subroutine to open the screen 2210 ; 2220 OPENSCREEN 2230 LDX #$60 ;use IOCB #6 2240 LDA #OPEN ;command is OPEN 2250 STA ICCOM,X 2260 LDA #SCREEN&255 ;device to open 2270 STA ICBAL,X 2280 LDA #SCREEN/256 2290 STA ICBAH,X 2300 LDA #12 ;no text window 2310 STA ICAX1,X 2320 LDA #0 ;graphics mode 0 2330 STA ICAX2,X 2340 JSR CIOV ;go do it 2350 RTS 2360 ; 2370 ;subroutine to close any IOCB 2380 ; 2390 CLOSEANY 2400 LDA #CLOSE ;close screen 2410 STA ICCOM,X 2420 JSR CIOV 2430 RTS 2440 ; 2450 ;subroutine to position cursor 2460 ;for next text string to write 2470 ; 2480 POSITION 2490 LDX STRGNO ;get point number 2500 LDA XPOS,X ;get x-coordinate 2510 STA COLCRS ;and store 2520 LDA YPOS,X ;get y-coordinate 2530 STA ROWCRS ;and store 2540 INC STRGNO ;ready for next 2550 RTS ;point, and exit 2560 ; 2570 ;subroutine to print line up to 2580 ;120 chars long at cursor 2590 ; 2600 PRINTLINE 2610 LDA #120 ;maximum length 2620 STA ICBLL,X ;of text string 2630 LDA #0 ;is 120 chars. 2640 STA ICBLH,X 2650 LDA #PUTREC ;operation is to 2660 STA ICCOM,X ;PUT a RECord 2670 JSR CIOV ;go do it 2680 RTS 2690 ; 2700 ;subroutine to add a constant 2710 ;(in accumulator) to current 2720 ;address for start of screen RAM 2730 ; 2740 ADDMEM 2750 CLC 2760 ADC SAVMSC ;add constant to 2770 STA SAVMSC ;low byte & save 2780 BCC NOINC ;if carry set, 2790 INC SAVMSC+1 ;increment high 2800 NOINC RTS ;byte,then exit 2810 ; 2820 ;subroutine to plot a point 2830 ;using current color register 2840 ; 2850 PLOTPOINT 2860 LDA #PUTREC 2870 STA ICCOM,X 2880 LDA #1 2890 STA ICBLL,X 2900 LDA #0 2910 STA ICBLH,X 2920 JSR CIOV 2930 RTS 2940 ; 2950 ;subroutine to draw from last 2960 ;plotted point to current one 2970 ; 2980 DRAWLINE 2990 LDX #$60 3000 LDA #DRAW 3010 STA ICCOM,X 3020 JSR CIOV 3030 RTS 3040 ; 3050 ;data values needed for opening 3060 ;screen and picking color regs. 3070 ; 3080 SCREEN .BYTE "S" 3090 REG0 .BYTE "A" 3100 REG1 .BYTE "B" 3110 ; 3120 ;tables of X- and Y-positions 3130 ;for lines to be printed 3140 ; 3150 XPOS .BYTE 3,0,5,11 3160 YPOS .BYTE 0,0,1,3 3170 ; 3180 ;text strings to print 3190 ; 3200 LINE1 3210 .BYTE "attack of the",EOL 3220 LINE2 3230 .BYTE " SUICIDAL " 3240 .BYTE " " 3250 .BYTE " ROAD-RACING " 3260 .BYTE " " 3270 .BYTE " ALIENS " 3280 .BYTE EOL 3290 LINE3 3300 .BYTE "*** Press START to" 3310 .BYTE " begin ***",EOL 3320 LINE4 3330 .BYTE "Analog" 3340 .BYTE " Productions",EOL 3350 ; 3360 ;tables of coordinates for 3370 ;drawing silly-looking rocket 3380 ; 3390 XDATA 3400 .BYTE 100,130,100,60,60,95 3410 .BYTE 68,81,60,60,95,68,81 3420 YDATA 3430 .BYTE 8,11,14,14,8,8,0,8 3440 .BYTE 8,14,14,22,14 3450 EXHAUSTX .BYTE 40,46,52,58 3460 EXHAUSTY .BYTE 11,11,11,11
Add new attachment
Only authorized users are allowed to upload new attachments.