]> Git Repo - qemu.git/blobdiff - hw/sm501.c
Remove io_index argument from cpu_register_io_memory()
[qemu.git] / hw / sm501.c
index 54d176b83fa7b9c39b85b7be447956436acfa717..df40aaa1f726d859b52872cae79b63a0e144bdb2 100644 (file)
@@ -23,7 +23,6 @@
  */
 
 #include <stdio.h>
-#include <assert.h>
 #include "hw.h"
 #include "pc.h"
 #include "console.h"
@@ -47,9 +46,9 @@
 //#define DEBUG_BITBLT
 
 #ifdef DEBUG_SM501
-#define SM501_DPRINTF(fmt...) printf(fmt)
+#define SM501_DPRINTF(fmt, ...) printf(fmt, ## __VA_ARGS__)
 #else
-#define SM501_DPRINTF(fmt...) do {} while(0)
+#define SM501_DPRINTF(fmt...) do {} while(0)
 #endif
 
 
@@ -450,12 +449,12 @@ static const uint32_t sm501_mem_local_size[] = {
 typedef struct SM501State {
     /* graphic console status */
     DisplayState *ds;
-    QEMUConsole *console;
 
     /* status & internal resources */
     target_phys_addr_t base;
     uint32_t local_mem_size_index;
     uint8_t * local_mem;
+    ram_addr_t local_mem_offset;
     uint32_t last_width;
     uint32_t last_height;
 
@@ -514,7 +513,7 @@ static uint32_t get_local_mem_size_index(uint32_t size)
     uint32_t norm_size = 0;
     int i, index = 0;
 
-    for (i = 0; i < sizeof(sm501_mem_local_size)/sizeof(uint32_t); i++) {
+    for (i = 0; i < ARRAY_SIZE(sm501_mem_local_size); i++) {
        uint32_t new_size = sm501_mem_local_size[i];
        if (new_size >= size) {
            if (norm_size == 0 || norm_size > new_size) {
@@ -940,22 +939,16 @@ static draw_line_func * draw_line32_funcs[] = {
 
 static inline int get_depth_index(DisplayState *s)
 {
-    switch(s->depth) {
+    switch(ds_get_bits_per_pixel(s)) {
     default:
     case 8:
        return 0;
     case 15:
-       if (s->bgr)
-           return 5;
-       else
-           return 1;
+        return 1;
     case 16:
-       if (s->bgr)
-           return 6;
-       else
-           return 2;
+        return 2;
     case 32:
-       if (s->bgr)
+       if (is_surface_bgr(s->surface))
            return 4;
        else
            return 3;
@@ -970,7 +963,7 @@ static void sm501_draw_crt(SM501State * s)
 
     uint8_t  * src = s->local_mem;
     int src_bpp = 0;
-    int dst_bpp = s->ds->depth / 8 + (s->ds->depth % 8 ? 1 : 0);
+    int dst_bpp = ds_get_bytes_per_pixel(s->ds) + (ds_get_bits_per_pixel(s->ds) % 8 ? 1 : 0);
     uint32_t * palette = (uint32_t *)&s->dc_palette[SM501_DC_CRT_PALETTE
                                                    - SM501_DC_PANEL_PALETTE];
     int ds_depth_index = get_depth_index(s->ds);
@@ -979,6 +972,7 @@ static void sm501_draw_crt(SM501State * s)
     int y_start = -1;
     int page_min = 0x7fffffff;
     int page_max = -1;
+    ram_addr_t offset = s->local_mem_offset;
 
     /* choose draw_line function */
     switch (s->dc_crt_control & 3) {
@@ -1003,7 +997,7 @@ static void sm501_draw_crt(SM501State * s)
 
     /* adjust console size */
     if (s->last_width != width || s->last_height != height) {
-       qemu_console_resize(s->console, width, height);
+       qemu_console_resize(s->ds, width, height);
        s->last_width = width;
        s->last_height = height;
        full_update = 1;
@@ -1012,10 +1006,9 @@ static void sm501_draw_crt(SM501State * s)
     /* draw each line according to conditions */
     for (y = 0; y < height; y++) {
        int update = full_update;
-       uint8_t * line_end = &src[width * src_bpp - 1];
-       int page0 = (src - phys_ram_base) & TARGET_PAGE_MASK;
-       int page1 = (line_end - phys_ram_base) & TARGET_PAGE_MASK;
-       int page;
+       ram_addr_t page0 = offset & TARGET_PAGE_MASK;
+       ram_addr_t page1 = (offset + width * src_bpp - 1) & TARGET_PAGE_MASK;
+       ram_addr_t page;
 
        /* check dirty flags for each line */
        for (page = page0; page <= page1; page += TARGET_PAGE_SIZE)
@@ -1024,7 +1017,7 @@ static void sm501_draw_crt(SM501State * s)
 
        /* draw line and change status */
        if (update) {
-           draw_line(&s->ds->data[y * width * dst_bpp], src, width, palette);
+           draw_line(&(ds_get_data(s->ds)[y * width * dst_bpp]), src, width, palette);
            if (y_start < 0)
                y_start = y;
            if (page0 < page_min)
@@ -1040,6 +1033,7 @@ static void sm501_draw_crt(SM501State * s)
        }
 
        src += width * src_bpp;
+       offset += width * src_bpp;
     }
 
     /* complete flush to display */
@@ -1060,8 +1054,8 @@ static void sm501_update_display(void *opaque)
        sm501_draw_crt(s);
 }
 
-void sm501_init(DisplayState *ds, uint32_t base, unsigned long local_mem_base,
-               uint32_t local_mem_bytes, CharDriverState *chr)
+void sm501_init(uint32_t base, uint32_t local_mem_bytes, qemu_irq irq,
+                CharDriverState *chr)
 {
     SM501State * s;
     int sm501_system_config_index;
@@ -1078,23 +1072,27 @@ void sm501_init(DisplayState *ds, uint32_t base, unsigned long local_mem_base,
     s->misc_control = 0x00001000; /* assumes SH, active=low */
     s->dc_panel_control = 0x00010000;
     s->dc_crt_control = 0x00010000;
-    s->ds = ds;
 
     /* allocate local memory */
-    s->local_mem = (uint8 *)phys_ram_base + local_mem_base;
-    cpu_register_physical_memory(base, local_mem_bytes, local_mem_base);
+    s->local_mem_offset = qemu_ram_alloc(local_mem_bytes);
+    s->local_mem = qemu_get_ram_ptr(s->local_mem_offset);
+    cpu_register_physical_memory(base, local_mem_bytes, s->local_mem_offset);
 
     /* map mmio */
     sm501_system_config_index
-       = cpu_register_io_memory(0, sm501_system_config_readfn,
+       = cpu_register_io_memory(sm501_system_config_readfn,
                                 sm501_system_config_writefn, s);
     cpu_register_physical_memory(base + MMIO_BASE_OFFSET,
                                 0x6c, sm501_system_config_index);
-    sm501_disp_ctrl_index = cpu_register_io_memory(0, sm501_disp_ctrl_readfn,
+    sm501_disp_ctrl_index = cpu_register_io_memory(sm501_disp_ctrl_readfn,
                                                   sm501_disp_ctrl_writefn, s);
     cpu_register_physical_memory(base + MMIO_BASE_OFFSET + SM501_DC,
                                  0x1000, sm501_disp_ctrl_index);
 
+    /* bridge to usb host emulation module */
+    usb_ohci_init_sm501(base + MMIO_BASE_OFFSET + SM501_USB_HOST, base,
+                        2, -1, irq);
+
     /* bridge to serial emulation module */
     if (chr)
        serial_mm_init(base + MMIO_BASE_OFFSET + SM501_UART0, 2,
@@ -1102,6 +1100,6 @@ void sm501_init(DisplayState *ds, uint32_t base, unsigned long local_mem_base,
                       115200, chr, 1);
 
     /* create qemu graphic console */
-    s->console = graphic_console_init(s->ds, sm501_update_display, NULL,
-                                     NULL, NULL, s);
+    s->ds = graphic_console_init(sm501_update_display, NULL,
+                                NULL, NULL, s);
 }
This page took 0.033689 seconds and 4 git commands to generate.