Skip to content

Commit f12c0e9

Browse files
author
none
committed
Bit rates matching other EmuTOS ports, output format to suit.
1 parent ae32dfa commit f12c0e9

File tree

1 file changed

+43
-16
lines changed

1 file changed

+43
-16
lines changed

bootrom/brg.py

+43-16
Original file line numberDiff line numberDiff line change
@@ -13,9 +13,33 @@
1313

1414
# For IP940
1515
CLOCK = 33333333
16-
OVERSAMPLE = 16
1716
PRE_FRAC = 8
1817

18+
rate_list = [
19+
921600,
20+
460800,
21+
230400,
22+
115200,
23+
153600,
24+
78600,
25+
57600,
26+
38400,
27+
19200,
28+
9600,
29+
4800,
30+
3600,
31+
2400,
32+
2000,
33+
1800,
34+
1200,
35+
600,
36+
300,
37+
]
38+
39+
oversample_list = [
40+
16
41+
]
42+
1943

2044
class Target:
2145
def __init__(self, rate):
@@ -35,9 +59,10 @@ def consider(self, sc, divisor, prescaler):
3559
def __str__(self):
3660
if self.best_error == self.rate:
3761
return f"{self.rate}: not available"
38-
return (f"{self.rate:10d}: "
39-
f"sc {self.sc} divisor {self.divisor >> 8},{self.divisor % 256} prescaler {self.prescaler} "
40-
f"=> {self.best_rate} error {self.best_error} / {self.best_error / self.rate * 100:.2f}%")
62+
# return (f"{self.rate:10d}: "
63+
# f"TCR {self.sc % 16:#04x} DLx {self.divisor >> 8:#04x},{self.divisor % 256:#04x} CPR {self.prescaler:#04x} "
64+
# f"=> {self.best_rate} error {self.best_error} / {self.best_error / self.rate * 100:.2f}%")
65+
return (f"B{self.rate}, {self.prescaler:#04x}, {self.divisor >> 8:#04x}, {self.divisor & 0xff:#04x}, {self.sc & 0xf:#04x}")
4166

4267

4368
def integer_sqrt(n):
@@ -50,19 +75,21 @@ def integer_sqrt(n):
5075

5176

5277
def guess(target):
53-
n = (CLOCK * PRE_FRAC) // (target.rate * OVERSAMPLE)
54-
lf = integer_sqrt(n)
55-
while lf > 0:
56-
hf = n // lf
57-
if (lf >= 8) and (lf < 256):
58-
target.consider(OVERSAMPLE, hf, lf)
59-
target.consider(OVERSAMPLE, hf + 1, lf)
60-
elif (hf >= 8) and (hf < 256):
61-
target.consider(OVERSAMPLE, lf, hf)
62-
target.consider(OVERSAMPLE, lf, hf + 1)
63-
lf -= 1
78+
for oversample in oversample_list:
79+
n = (CLOCK * PRE_FRAC) // (target.rate * oversample)
80+
lf = integer_sqrt(n)
81+
while lf > 0:
82+
hf = n // lf
83+
if (lf >= 8) and (lf < 256):
84+
target.consider(oversample, hf, lf)
85+
target.consider(oversample, hf + 1, lf)
86+
elif (hf >= 8) and (hf < 256):
87+
target.consider(oversample, lf, hf)
88+
target.consider(oversample, lf, hf + 1)
89+
lf -= 1
6490

6591

66-
for target in [Target(9600), Target(115200), Target(2062500)]:
92+
for rate in rate_list:
93+
target = Target(rate)
6794
guess(target)
6895
print(target)

0 commit comments

Comments
 (0)