From d3a7f495405b340df16cd9439ecb713b2c8d808a Mon Sep 17 00:00:00 2001 From: d_m Date: Sun, 25 Aug 2024 23:51:17 -0400 Subject: [PATCH] parse frame output and calculate a width --- mp3.tal | 61 ++++++++++++++++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 58 insertions(+), 3 deletions(-) diff --git a/mp3.tal b/mp3.tal index a2eafce..c0d7bf7 100644 --- a/mp3.tal +++ b/mp3.tal @@ -81,12 +81,67 @@ ( INC2k LDA LIT "T EQU ?on-tag ) !printerr +( === START NEW CODE === ) + ( e.g. "@F 184 8713 4.81 227.60" ) ( seen when playing ) ( the fields here are: ) -( @F ) -@on-frame ( buf* -> ) - POP2 JMP2r +( @F ) +( ) +( debugging output on stderr is: ) +@on-frame ( buf0* -> ) + #0003 ADD2 ( buf1* ; skip "@F " ) + #20 find-next INC2 ( buf2* ; skip curr frame ) + #20 find-next INC2 ( buf3* ; skip next frame ) + parse-dec STH2 INC2 ( buf4* [curr*] ; parse curr time ) + LDAk LIT "5 LTH ?{ INC2r } ( buf4* [curr*] ; maybe round curr ) + #20 find-next INC2 ( buf5* [curr*] ; skip fractional part ) + parse-dec STH2 INC2 ( buf4* [curr* rem*] ; parse total time ) + LDAk LIT "5 LTH ?{ INC2r } ( buf4* [curr* rem*] ; maybe round rem ) + POP2 STH2r STH2r SWP2 ( curr* rem* ) + OVR2 emit #2019 DEO ( curr* rem* ; print curr ) + DUP2 emit #2019 DEO ( curr* rem* ; print rem ) + OVR2 ADD2 SWP2 ( total* curr* ) + calc-width emit #0a19 DEO ( width* ) + JMP2r ( width* ) + +( emit a short in hexadecimal notation. ) +@emit ( n* -> ) + SWP /byte + &byte DUP #04 SFT /hex #0f AND ( >> ) + &hex #30 ADD DUP #39 GTH #27 MUL ADD .Console/error DEO JMP2r + +( returns value between 0000 and 00d0 ) +( ) +( the basic idea is that we shift both values left until ) +( the total is small enough that it can be multiplied by ) +( 0xd0, i.e. 208. we take some care to round correctly, ) +( which helps give a smoother transition between values. ) +@calc-width ( total* curr* -> width* ) + STH2 ( total* [curr*] ) + DUP2 #013c LTH2 ?&ready + &scale DUP2 #0277 LTH2 ?&almost #01 SFT2 LITr 01 SFT2r !&scale + &almost INC2 #01 SFT2 INC2r LITr 01 SFT2r + &ready LIT2r 00d0 MUL2r STH2r SWP2 DIV2 JMP2r + +( find the next occurrence of a byte in the given string. ) +( ) +( returns the position of the character found. ) +@find-next ( buf* c^ -> buf+i* ) + STH &loop LDAk STHkr EQU ?{ INC2 !&loop } POPr JMP2r + +( parse a decimal number as a short ) +( ) +( returns an updated buffer position and the parsed short ) +@parse-dec ( buf* -> buf+i* x* ) + LIT2r 000a LIT2r 0000 ( buf* [10* acc*] ) + &loop LDAk LIT "0 SUB ( buf+i* n^ [10* acc*] ) + DUP #09 GTH ?&done ( buf+i* n^ [10* acc*] ) + OVR2r MUL2r #00 SWP ( buf+i* n* [10* 10acc*] ) + STH2 ADD2r INC2 !&loop ( buf+i+1* [10* 10acc+n*] ) + &done POP STH2r POP2r JMP2r ( buf+i* acc* ) + +( === END NEW CODE === ) ( e.g. "@H HELP/H: command listing (LONG/SHORT forms), command case insensitve" ) ( seen in response to the "help" command )