748 karma · joined August 1, 2019
I know I know. It's so hard to believe you can manipulate signals without a processor. ;-)
If you are asking how the thread pitch motor controller was working I have no in depth knowledge but it would likely be an analog envelope detector. (simple RC filter/integrator would suffice) That would be rectified to make a DC control voltage and the control voltage would be used to modulate the power to the motor in an inverse fashion. ( more audio signal -> less power )
No digits would be harmed in the process. :)
At that time they used a Studer A80 (if memory serves) 1/2 track machine, modified, with an extra playback head that was placed before the head stack so it read the music on tape about 500mS before the playback head got it. The extra head sound was fed to the motor controller that controlled the speed of the cutting head feed motor that turned the screw that controlled the pitch depth of the grooves.
When the preview head sound was loud, the screw motor would slow down to make bigger grooves and then return to normal when the audio envelope was smaller.
That's how they optimized groove spacing before digital buffers. :-)
Internally Forth can be direct threaded code, indirect threaded code, byte code, sub-routine calls or optimized native code.
UNIX99 uses an after market card with 1Mbyte of RAM on an 8bit external buss used for peripherals. This card replaces the old 32K RAM card made by TI in the 1980s.
Not saying it's like that now, but it should be possible to "emulate" emotions. ?? Our nets seem to believe we have emotions. :-)
The end result of that is one doesn't write the program in "Forth" per se but in the domain specific language you create for the job. This is how Forth gets more productive than pure assembly language if the team documents things well and follows the prescribed system.
And modern systems compile optimized native code (VFX Forth, SwiftForth) but still remain fully interactive at the console.
And yes I know that outcomes after detection have improved, but the HPV vaccine shows an alternative that to me deserves more resources.
I am simply frustrated by 60 years of research and lots of dead friends and family. If that's a crime get the tar and feathers while I strip down to my shorts.
My laymans take: Cancer is a disease of the DNA of a cell. Viruses survive by altering cellular DNA. It begs the question: How many other viruses cause cancer?
It also seems clear to me that the virus may not be the sole cause since not everybody gets cancer so it is a multi-variable problem.
Virus + X = cancer
This will be harder to nail down but with modern data tools we should be able to get there.
Makes me wonder: Is the cancer "industry" searching for causes or just after-the-fact treatment?
The interference was caused when the spectrum of the color sub-carrier over-lapped the spectrum of the horizontal interval in the broadcast signal. Tweaking the frequencies allowed the two spectra to interleave in the frequency domain.
"And if you tell the kids that today, they won't believe it!"
:-))))
Did I miss it?
(I am sure they meant nm, but nobody is checking the AI output)
I will take a run at explaining IF ENDIF (endif is the Fig Forth term, used here to avoid confusion)
?BRANCH is an instruction in the virtual machine. It jumps if top of stack=0 . The offset (or address)that it jumps to is the memory word right after the ?BRANCH token. Like this: <?BRANCH><number>
Forth definition of IF
: IF COMPILE ?BRANCH HERE 0 , ; IMMEDIATE
At compile time IF "compiles" the token for ?BRANCH but then interprets "HERE 0 ,"
(IF is an IMMEDIATE word that executes even if the compiler is turned on)
HERE is like $ in Assembler, ie: the address where code is being laid down. It is simply left on the data stack. HERE is the address where the <number> will be stored... later.
0 is a zero, that is pushed onto the data stack.
"Comma" (,) pops the zero and puts it in memory address HERE but! it advances the system memory pointer 1 integer width.
The zero is now a place holder in memory to be filled in by ENDIF.
: ENDIF( addr -- ) HERE OVER - SWAP ! ; IMMEDIATE
ENDIF needs that address left behind by IF shown in comment as addr.
ENDIF gets the new value of HERE which of course is different because we will have compiled some code after the IF keyword.
All we need to do is do NEWHERE-OLDHERE to get the offset for ?BRANCH.
That is covered by the forth code ( oldhere-on-stack) HERE OVER -
This will make the data stack be: ( OLDHERE offset )
If we do a SWAP we just need the store operator '!' to put the offset into memory.
For the morbidly curious here is the definition of ELSE. :-)
: ELSE COMPILE BRANCH HERE 0 , SWAP [COMPILE] ENDIF ; IMMEDIATE
So loops are just more of the same... (all loops jump back to BEGIN. BRANCH is an unconditional jump instruction)
: BEGIN HERE ; IMMEDIATE
: AGAIN COMPILE BRANCH HERE - , ; IMMEDIATE
: UNTIL COMPILE ?BRANCH HERE - , ; IMMEDIATE
: WHILE [COMPILE] IF SWAP ; IMMEDIATE
: REPEAT [COMPILE] AGAIN [COMPILE] ENDIF ; IMMEDIATE
The thing Chuck explored, related to abstraction, which I don't see much in conventional machines was reducing calling overhead. (1 cycle call and intrinsic return on many instructions ie: free return)
Some of the decisions we make today have a lot to do with what happens at the hardware level when we add abstraction. It just costs more than we are prepared to pay so it is avoided ... but for the wrong reason.
Users want a toaster.
Input stuff, turn a knob, push something, -> output
The author explores why with some surprises along the way. I would say it is like the "Mythical Man Month" from the Japanese side of computing.
The book also opened my eyes to the difficulty of mastering Japanese.
https://www.amazon.com/Fifth-Generation-Fallacy-Artificial- Intelligence/dp/019504939X
That's when professional musicians were musically "literate", so many acts showed up with just their soloists and boxes with their "charts". One rehearsal and the show was ready to go.