[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