[Coco] Help with some HiRes CoCo 3 MMU settings

Glen Hewlett glen.hewlett at sympatico.ca
Tue Dec 6 23:23:26 EST 2016


Hi All,

I’ve been fighting for days trying to figure out why the program I’ve written is crashing.  I think it’s the MMU doing some bank switching in the background while my program is running.

My program disables all the interrupts the sets up the graphic mode in my case a 256x225 2 colour screen.  I’m trying to use blocks 0 ($0000 to $1fff) and block 1 ($2000 to $3fff) for my graphics output screen and variables.  My program code is running at $4000 and the stack is at $7FFF.

While testing my program with the MAME emulator in debug mode, my program shows some graphics on the screen and runs along for a about 10 seconds then blamo, it crashes.  As far as I can tell the bank memory is coming into play somehow.  With Mame’s debugger I can see the banks of memory have wiped out my graphics screen and my program and filled it all with a bunch of $CD values in my RAM.  Does this sound familiar to anyone maybe you know what I’m missing or doing wrong that would cause such a thing to happen.

I looked all over the internet to see if anyone has some example code for  setting up graphics modes and the MMU in assembly.  All I’ve been able to find is tons and tons of technical manuals that do a great job of explaining what all the values do, but there aren’t any real world examples that I could find.  If someone has some nice code that they want to share that would be awesome…

Below is the initializing code that I’ve written and plan to use over and over for future programs.

Thanks for looking,
Glen

*****************************************************
** Used Labels                                      *
*****************************************************

TEXT_SCREEN_START       EQU $0400
TEXT_SCREEN_END         EQU $0600

IRQ_Jump_position       EQU $FEF7       * Store  $7E which is the JMP opcode
IRQ_Start_Address       EQU $FEF8       * Store the address you want the IRQ to jumpt to at this address
IRQ_POINT               EQU $FEF7       * $FEF7 is the usual CoCo3 SuperBasic IRQ value

PIA0_Byte_0_KeyRw_Joy   EQU $FF00
PIA0_Byte_1_HSYNC       EQU $FF01
PIA0_Byte_2             EQU $FF02
PIA0_Byte_3_VSYNC       EQU $FF03

PIA1_Byte_0_IRQ         EQU $FF20
PIA1_Byte_1_IRQ         EQU $FF21
PIA1_Byte_2             EQU $FF22
PIA1_Byte_3_IRQ_Ct_Snd  EQU $FF23

INIT0_Register0         EQU $FF90

INIT1_Register1         EQU $FF91
IRQENR                  EQU $FF92
FIRQENR                 EQU $FF93

Timer_register_LSB      EQU $FF95
Timer_register_MSB      EQU $FF94

Video_Mode_Register     EQU $FF98
Vid_Res_Reg             EQU $FF99
Border_Register         EQU $FF9A
VidStart                EQU $FF9D           *
Hor_Offset_Reg          EQU $FF9F

MMU_Reg_0               EQU $FFA0
MMU_Reg_1               EQU $FFA1
MMU_Reg_2               EQU $FFA2
MMU_Reg_3               EQU $FFA3
MMU_Reg_4               EQU $FFA4

*Screen Colour Settings
Palette_Start           EQU $FFB0
Palette_0               EQU $FFB0
Palette_1               EQU $FFB1
Palette_2               EQU $FFB2
Palette_3               EQU $FFB3
Palette_4               EQU $FFB4
Palette_5               EQU $FFB5
Palette_6               EQU $FFB6
Palette_7               EQU $FFB7
Palette_8               EQU $FFB8
Palette_9               EQU $FFB9
Palette_10              EQU $FFBA
Palette_11              EQU $FFBB
Palette_12              EQU $FFBC
Palette_13              EQU $FFBD
Palette_14              EQU $FFBE
Palette_15              EQU $FFBF

Regular_Speed           EQU $FFD8
High_Speed_Mode         EQU $FFD9
ROM_Mode_Enable         EQU $FFDE
RAM_Mode_Enable         EQU $FFDF

Screen_Start            EQU $8000
Border_Colour           EQU $00     * 00 - Black

*Stack_Space            RMB $100    * Example for making some stack space

***********************************************************
        ORG         $4000           * Start in low memory after Disk Basic usage
START   LDS         #$7FFF	    * Start of program
***********************************************************
System_EnableGraphics
        ORCC    #$50                    * disable interrupts
        LDA     #%01001100              * Coco3, MMU on, IRQ disabled, FIRQ Disabled, DRAM constant, standard SCS 16K internal 16K external ROM
        STA     INIT0_Register0
		
	LDA	#%00100000
	STA     INIT0_Register0		* Select MMU Task Register 0 which is $FFA0 - $FFA7

        LDA     #%10000000              * graphics mode, Colour output, 60 hz, max vertical res
        STA     Video_Mode_Register

***********************************************************
* Set Hires Screen Resolution and the number of Colours
*
* Bit Pattern   Rows Displayed
*    x00xxxxx   192
*    x01xxxxx   200
*    x10xxxxx   *zero/infinite lines on screen (undefined)
*    x11xxxxx   225
* Bit Pattern   Bytes/Row (Graphics)
*    xxx000xx   16
*    xxx001xx   20
*    xxx010xx   32
*    xxx011xx   40
*    xxx100xx   64
*    xxx101xx   80   320 4 Colours 01
*    xxx110xx   128
*    xxx111xx   160
* Bit Pattern   Colours     Pixels/Byte
*    xxxxxx00   2           8
*    xxxxxx01   4           4
*    xxxxxxl0   16          2
*    xxxxxx11   Undefined   Undefined
***********************************************************
* Most Common used settings (Uncomment the one you want to use)
*       LDA     #%00001000            * 256 x 192 x 2 Colours  requires 6,144  bytes = $1800 RAM
*       LDA     #%00101000            * 256 x 200 x 2 Colours  requires 6,400  bytes = $1900 RAM
       LDA     #%01101000            * 256 x 225 x 2 Colours  requires 7,200  bytes = $1C20 RAM
*       LDA     #%00010001            * 256 x 192 x 4 Colours  requires 12,288 bytes = $3000 RAM
*       LDA     #%00110001            * 256 x 200 x 4 Colours  requires 12,800 bytes = $3200 RAM
*       LDA     #%01110001            * 256 x 220 x 4 Colours  requires 14,400 bytes = $3840 RAM
*       LDA     #%00011010            * 256 x 192 x 16 Colours requires 24,576 bytes = $6000 RAM
*       LDA     #%00111010            * 256 x 200 x 16 Colours requires 25,600 bytes = $6400 RAM
*       LDA     #%01111010            * 256 x 225 x 16 Colours requires 28,800 bytes = $7080 RAM
*       LDA     #%00001100            * 320 x 192 x 2 Colours  requires 7,680  bytes = $1E00 RAM
*       LDA     #%00101100            * 320 x 200 x 2 Colours  requires 8,000  bytes = $1F40 RAM
*       LDA     #%01101100            * 320 x 225 x 2 Colours  requires 10,240 bytes = $2800 RAM
*       LDA     #%00010101            * 320 x 192 x 4 Colours  requires 15,360 bytes = $3C00 RAM
*       LDA     #%00110101            * 320 x 200 x 4 Colours  requires 16,000 bytes = $3E80 RAM
*       LDA     #%01110101            * 320 x 225 x 4 Colours  requires 18,000 bytes = $4650 RAM
*       LDA     #%00011110            * 320 x 192 x 16 Colours requires 30,720 bytes = $7800 RAM
*       LDA     #%00111110            * 320 x 200 x 16 Colours requires 32,00  bytes = $7D00 RAM
*       LDA     #%01111110            * 320 x 225 x 16 Colours requires 36,000 bytes = $8CA0 RAM
*       LDA     #%00010100            * 640 x 192 x 2 Colours  requires 15,360 bytes = $3C00 RAM
*       LDA     #%00110100            * 640 x 200 x 2 Colours  requires 16,000 bytes = $3E80 RAM
*       LDA     #%01110100            * 640 x 225 x 2 Colours  requires 18,000 bytes = $4650 RAM
*       LDA     #%00011101            * 640 x 192 x 4 Colours  requires 30,720 bytes = $7800 RAM
*       LDA     #%00111101            * 640 x 200 x 4 Colours  requires 32,000 bytes = $7D00 RAM
*       LDA     #%01111101            * 640 x 225 x 4 Colours  requires 36,000 bytes = $8CA0 RAM

        STA     Vid_Res_Reg

***********************************************************
* Border settings
        LDA     #Border_Colour          *
        STA     Border_Register         *

        LDD     #$E000                  * Point video screen veiwer at $70000 (Hi-Res page start)
        STD     VidStart                * which is at $70000 / 8 = $E000

* Load GIME pages $30 & $31 into CPU RAM $0000-$1FFF & $2000-$4000
        LDA     #$38                    * Start at Hi-Res page #1
	STA	$FFA0
	LDA	#$39
	STA	$FFA1

* My program here….



Final	END     START                   * set exec address

* end of file -



More information about the Coco mailing list