add QFST
This commit is contained in:
parent
b847f0d4a5
commit
82a28b82e4
3 changed files with 162 additions and 0 deletions
34
NTSC-J 1.0/QFST.txt
Normal file
34
NTSC-J 1.0/QFST.txt
Normal file
|
@ -0,0 +1,34 @@
|
||||||
|
$ QF Segment Timer (v0.1.0, 2022/10/22) [sup39]
|
||||||
|
040F9DD0 496FDE78
|
||||||
|
042069D0 495F128C
|
||||||
|
077F7C48 000000F0
|
||||||
|
3BA00000 3C60817F
|
||||||
|
93A37C40 93A37C44
|
||||||
|
4A90217C 38610E90
|
||||||
|
4A83D5C9 3821FFE0
|
||||||
|
BF81000C 3C60817F
|
||||||
|
3BE37C00 83C37C40
|
||||||
|
3BA00096 80C300BC
|
||||||
|
2C060000 41A2002C
|
||||||
|
808300B8 80A37C44
|
||||||
|
7C042800 40A1001C
|
||||||
|
7C052050 57CC16BA
|
||||||
|
7C1F612E 90837C44
|
||||||
|
3BDE0001 93C37C40
|
||||||
|
3B9EFFF0 2C1E0010
|
||||||
|
40800008 3B800000
|
||||||
|
7C1CF000 41A00014
|
||||||
|
BB81000C 38210020
|
||||||
|
3C60803B 4AA0ED00
|
||||||
|
578316BA 7C1F182E
|
||||||
|
1C0003E9 39600078
|
||||||
|
7D405B96 396003E8
|
||||||
|
7D2A5B96 1D6903E8
|
||||||
|
7D4B5050 38600214
|
||||||
|
7FA4EB78 38A0000D
|
||||||
|
38C0FFFF 7CC73378
|
||||||
|
48000011 2532642E
|
||||||
|
25303364 00000000
|
||||||
|
7D0802A6 4CC63182
|
||||||
|
4BFF8511 3B9C0001
|
||||||
|
3BBD000D 4BFFFF8C
|
12
src/QFST.ld
Normal file
12
src/QFST.ld
Normal file
|
@ -0,0 +1,12 @@
|
||||||
|
/* @ha MUST be 0x817f */
|
||||||
|
$QFST.ts = 0x817f7c00;
|
||||||
|
$QFST.cnt = 0x817f7c40;
|
||||||
|
$QFST.t0 = 0x817f7c44;
|
||||||
|
$$ = 0x817f7c48;
|
||||||
|
|
||||||
|
$QFT.tFreeze = 0x817f00b8;
|
||||||
|
$QFT.freezeDur = 0x817f00bc;
|
||||||
|
|
||||||
|
$b$.QFST.reset = 0x800f9dd0;
|
||||||
|
$b$.QFST.render = 0x802069d0;
|
||||||
|
drawText = 0x817f0238;
|
116
src/QFST.s
Normal file
116
src/QFST.s
Normal file
|
@ -0,0 +1,116 @@
|
||||||
|
.set x, 532
|
||||||
|
.set y, 150
|
||||||
|
.set fontSize, 13
|
||||||
|
.set colorTop, 0xffffffff
|
||||||
|
.set colorBot, 0xffffffff
|
||||||
|
.set logN, 4
|
||||||
|
|
||||||
|
.set aBase, 0x817f<<16
|
||||||
|
.QFST.reset:
|
||||||
|
li r29, 0 # orig
|
||||||
|
lis r3, aBase@h
|
||||||
|
stw r29, $QFST.cnt-aBase(r3)
|
||||||
|
stw r29, $QFST.t0-aBase(r3)
|
||||||
|
b 4+$b$.QFST.reset
|
||||||
|
|
||||||
|
.set rmw, r28
|
||||||
|
.set rmwOff, 0xC
|
||||||
|
.set rmwAdd, 0x20
|
||||||
|
.set rTArr, r31
|
||||||
|
.set rCnt, r30
|
||||||
|
.set rY, r29
|
||||||
|
.set rIdx, r28
|
||||||
|
.QFST.render:
|
||||||
|
.QFST.render.setup:
|
||||||
|
addi r3, r1, 0xE90
|
||||||
|
bl J2DGrafContext.setup2D
|
||||||
|
## prepare
|
||||||
|
addi r1, r1, -rmwAdd
|
||||||
|
stmw rmw, rmwOff(r1)
|
||||||
|
lis r3, aBase@h
|
||||||
|
la rTArr, $QFST.ts-aBase(r3)
|
||||||
|
lwz rCnt, $QFST.cnt-aBase(r3)
|
||||||
|
li rY, y
|
||||||
|
.QFST.render.update:
|
||||||
|
### check is QFT frozen
|
||||||
|
### r6 = freeze duration
|
||||||
|
lwz r6, $QFT.freezeDur-aBase(r3)
|
||||||
|
cmpwi r6, 0
|
||||||
|
beq+ .QFST.render.update.done
|
||||||
|
### check is new frozen time
|
||||||
|
### r4 = tFreeze = QFT display time when freezed
|
||||||
|
### r5 = t0
|
||||||
|
lwz r4, $QFT.tFreeze-aBase(r3)
|
||||||
|
lwz r5, $QFST.t0-aBase(r3)
|
||||||
|
cmpw r4, r5
|
||||||
|
ble+ .QFST.render.update.done
|
||||||
|
### store diff
|
||||||
|
sub r0, r4, r5 # diff
|
||||||
|
rlwinm r12, rCnt, 2, 30-logN, 29
|
||||||
|
stwx r0, rTArr, r12
|
||||||
|
### update t0 = tFreeze
|
||||||
|
stw r4, $QFST.t0-aBase(r3)
|
||||||
|
### update cnt
|
||||||
|
addi rCnt, rCnt, 1
|
||||||
|
stw rCnt, $QFST.cnt-aBase(r3)
|
||||||
|
.QFST.render.update.done:
|
||||||
|
.QFST.render.preDraw:
|
||||||
|
### idx = max(0, cnt-N)
|
||||||
|
subi rIdx, rCnt, 1<<logN
|
||||||
|
cmpwi rCnt, 1<<logN
|
||||||
|
bge .QFST.render.preDraw.L1
|
||||||
|
li rIdx, 0
|
||||||
|
.QFST.render.preDraw.L1:
|
||||||
|
.QFST.render.loop:
|
||||||
|
cmpw rIdx, rCnt
|
||||||
|
blt+ .QFST.render.loop.body
|
||||||
|
.QFST.render.done:
|
||||||
|
lmw rmw, rmwOff(r1)
|
||||||
|
addi r1, r1, rmwAdd
|
||||||
|
## orig
|
||||||
|
lis r3, 0x803b
|
||||||
|
b 4+$b$.QFST.render
|
||||||
|
.QFST.render.loop.body:
|
||||||
|
### QF -> s
|
||||||
|
rlwinm r3, rIdx, 2, 30-logN, 29 # offset
|
||||||
|
lwzx r0, rTArr, r3
|
||||||
|
#### r0 = dQF*1001
|
||||||
|
mulli r0, r0, 1001
|
||||||
|
#### r10 = dQF*1001/120 = ms
|
||||||
|
li r11, 120
|
||||||
|
divwu r10, r0, r11
|
||||||
|
#### r9 = ms/1000 = s
|
||||||
|
li r11, 1000
|
||||||
|
divwu r9, r10, r11
|
||||||
|
#### r10 = ms-s*1000 = ms%1000
|
||||||
|
mulli r11, r9, 1000
|
||||||
|
sub r10, r10, r11
|
||||||
|
### params
|
||||||
|
li r3, x
|
||||||
|
mr r4, rY
|
||||||
|
li r5, fontSize
|
||||||
|
.if colorTop < 0x8000 || colorTop >= 0xffff8000
|
||||||
|
li r6, colorTop@l
|
||||||
|
.else
|
||||||
|
lis r6, colorTop@h
|
||||||
|
ori r6, r6, colorTop@l
|
||||||
|
.endif
|
||||||
|
.if colorTop == colorBot
|
||||||
|
mr r7, r6
|
||||||
|
.elseif colorBot < 0x8000 || colorBot >= 0xffff8000
|
||||||
|
li r7, colorBot@l
|
||||||
|
.else
|
||||||
|
lis r7, colorBot@h
|
||||||
|
ori r7, r7, colorBot@l
|
||||||
|
.endif
|
||||||
|
bl .draw2D.fmt
|
||||||
|
.string "%2d.%03d"
|
||||||
|
.align 2
|
||||||
|
.draw2D.fmt:
|
||||||
|
mflr r8
|
||||||
|
crclr 6
|
||||||
|
bl drawText
|
||||||
|
## next
|
||||||
|
addi rIdx, rIdx, 1
|
||||||
|
addi rY, rY, fontSize
|
||||||
|
b .QFST.render.loop
|
Loading…
Reference in a new issue