Commit 777428f2d23cfc62326933398c009b7955eed011
1 parent
5b60212f
fixed 2.88 MB boot (aka FreeBSD 5.2.1 boot fix)
git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@849 c046a42c-6fe2-441c-8c8c-71466251a162
Showing
1 changed file
with
25 additions
and
29 deletions
hw/pc.c
@@ -76,6 +76,30 @@ static inline int to_bcd(RTCState *s, int a) | @@ -76,6 +76,30 @@ static inline int to_bcd(RTCState *s, int a) | ||
76 | return ((a / 10) << 4) | (a % 10); | 76 | return ((a / 10) << 4) | (a % 10); |
77 | } | 77 | } |
78 | 78 | ||
79 | +static int cmos_get_fd_drive_type(int fd0) | ||
80 | +{ | ||
81 | + int val; | ||
82 | + | ||
83 | + switch (fd0) { | ||
84 | + case 0: | ||
85 | + /* 1.44 Mb 3"5 drive */ | ||
86 | + val = 4; | ||
87 | + break; | ||
88 | + case 1: | ||
89 | + /* 2.88 Mb 3"5 drive */ | ||
90 | + val = 5; | ||
91 | + break; | ||
92 | + case 2: | ||
93 | + /* 1.2 Mb 5"5 drive */ | ||
94 | + val = 2; | ||
95 | + break; | ||
96 | + default: | ||
97 | + val = 0; | ||
98 | + break; | ||
99 | + } | ||
100 | + return val; | ||
101 | +} | ||
102 | + | ||
79 | static void cmos_init(int ram_size, int boot_device) | 103 | static void cmos_init(int ram_size, int boot_device) |
80 | { | 104 | { |
81 | RTCState *s = rtc_state; | 105 | RTCState *s = rtc_state; |
@@ -133,35 +157,7 @@ static void cmos_init(int ram_size, int boot_device) | @@ -133,35 +157,7 @@ static void cmos_init(int ram_size, int boot_device) | ||
133 | fd0 = fdctrl_get_drive_type(floppy_controller, 0); | 157 | fd0 = fdctrl_get_drive_type(floppy_controller, 0); |
134 | fd1 = fdctrl_get_drive_type(floppy_controller, 1); | 158 | fd1 = fdctrl_get_drive_type(floppy_controller, 1); |
135 | 159 | ||
136 | - val = 0; | ||
137 | - switch (fd0) { | ||
138 | - case 0: | ||
139 | - /* 1.44 Mb 3"5 drive */ | ||
140 | - val |= 0x40; | ||
141 | - break; | ||
142 | - case 1: | ||
143 | - /* 2.88 Mb 3"5 drive */ | ||
144 | - val |= 0x60; | ||
145 | - break; | ||
146 | - case 2: | ||
147 | - /* 1.2 Mb 5"5 drive */ | ||
148 | - val |= 0x20; | ||
149 | - break; | ||
150 | - } | ||
151 | - switch (fd1) { | ||
152 | - case 0: | ||
153 | - /* 1.44 Mb 3"5 drive */ | ||
154 | - val |= 0x04; | ||
155 | - break; | ||
156 | - case 1: | ||
157 | - /* 2.88 Mb 3"5 drive */ | ||
158 | - val |= 0x06; | ||
159 | - break; | ||
160 | - case 2: | ||
161 | - /* 1.2 Mb 5"5 drive */ | ||
162 | - val |= 0x02; | ||
163 | - break; | ||
164 | - } | 160 | + val = (cmos_get_fd_drive_type(fd0) << 4) | cmos_get_fd_drive_type(fd1); |
165 | rtc_set_memory(s, 0x10, val); | 161 | rtc_set_memory(s, 0x10, val); |
166 | 162 | ||
167 | val = 0; | 163 | val = 0; |