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.
« This page (revision-1) was last changed on 03-Feb-2023 16:21 by Carsten Strotmann  
G’day (anonymous guest) My Prefs
© 2010-2021 AtariWiki
All content in the Wiki is licensed under Creative Commons Share Alike License, unless otherwise noted.
JSPWiki v2.8.3