!!!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
}}}