[Coco] Help with some HiRes CoCo 3 MMU settings

Glen Hewlett glen.hewlett at sympatico.ca
Wed Dec 7 16:00:12 EST 2016


Thanks Art,

No that was a typo, it was supposed to be stored at $FF91.

Cheers,
Glen

> On Dec 7, 2016, at 6:22 AM, Arthur Flexser <flexser at fiu.edu> wrote:
> 
> Looks like you store a value into $FF90 (INIT0) and immediately store a
> different value in the same place.  Was the second store supposed to be to
> $FF91?
> 
> Art
> 
> On Tue, Dec 6, 2016 at 11:23 PM, Glen Hewlett <glen.hewlett at sympatico.ca>
> wrote:
> 
>> 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 -
>> 
>> 
>> --
>> Coco mailing list
>> Coco at maltedmedia.com
>> https://pairlist5.pair.net/mailman/listinfo/coco
>> 
> 
> -- 
> Coco mailing list
> Coco at maltedmedia.com
> https://pairlist5.pair.net/mailman/listinfo/coco



More information about the Coco mailing list