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

}}}