VERSIONS(DOCS) Optical Printer Control System VERSIONS(DOCS)
OPCS VERSION HISTORY/RELEASE NOTES
----------------------------------
These are in order of most recent versions first, oldest last.
K2.24c/TC - 04/14/2025
> cam/pro/rep/velrep/autofilt all now support mixed-mode
counting during shoots; non-shutters (>CAMERA) now count
in steps
> Added 'LastRotCount' to Kuper struct, to allow mixed-mode
rotational AND step counting all in the same run. Necessarily
this changed all motor drivers: A800DRV, MDRIVE, RTMC48
> velsav now records JOG(OPCS) movement, and handles tallying
properly when jog key released; handles Allstop and jumps
to the ASA (AllStopAddress).
K2.24b/TC - 04/10/2025
> Rewrote OPCSSHUT.C: simple and accurate linear ramping for
shutter runs. rampcurve(DEFS) now obsolete and ignored.
Should be better for running half-step drives now.
> Fixed autofilt; it's been broken for a while now, no one noticed.
It's undefined what happens if filter vels take longer than
the shutter closed period, esp. at highest camera speeds.
> velsave: added "<-STOP" indicator for final vels
> GR
> Moved help menu down one line
> Moved graph bottom above menu a bit so zero vels don't hit menu
K2.24a/TC - 03/27/2025
> OPCSSHUT.C: MakeRamp(): qsort() vels when correcting aliasing.
Fixes small jitter during middle of rup/rdn during 400 PPR motor runs
(e.g. spd=0.25, ppr=400, mrp=150, velsav, cam 1)
> filter(OPCSDEFS): checks for malloc() errors
> 'ldefs -c': fixed bug with parsing past '!' and '#', e.g.
ldefs -c bigcounters small ! del foo
^
Wasn't handling this properly
> GR
> Added 'distance to cursor' in legend
> Fixed cursor update issues
> Improved help
> Added VERSION/BUILD info if no args spec'd
> Fixed Up/Dn for small positions
K2.23/TC - 02/02/2025
> Added ALLSTOP check during fader movement (opn/cls/shu/etc).
Before it was set to NOCONDITION, which caused a loop like:
do 10 opn cls
..to be unaffected by ALLSTOP
> Fix allstop check during command parse in OPCSCMDS.C's execute_argument()
Before one could not interrupt a DO loop, e.g.
do 200 res 0 0 0 res 200 200 200
Fixing this involved:
> Creating a new allstop_cmds() func in OPCSCMDS.C,
and calling that to check outside of motor run routines
where ints are off.
> Disable/EnableKeyboardInts() around all_stop() check
> Adding a delay(10) after disabling keyboard ints to allow time
for a keyboard check to be done with ints off.
K2.22/TC - xx/xx/2024
> Removed all references to caddr, caddr_t, c_addr -- use void* now
> INTERNALS: Moved feed management to OPCSFEED.[CH]
> OPCSLINE: uncommented MNOP chans from stopvels[] and finalvels[]
K2.21/TC - 06/04/2024
> Added OPCS_NOMOTOR_FRAME_DELAY environment variable to control
the per-frame delay when simulating shutter runs with 'motors off'.
Default is zero (no delay).
> Restored Allstop key during 'motors off' shutter simulation,
which was being ignored. (Needed to DisableKeyboardInts()
for new allstop keyboard checking to work correctly)
> Applied proofreader mods to manual pages. (MM)
> Replaced break_up_line() with better, regression tested
code that passes on linux with valgrind.
K2.20/TC - 05/11/2024
> a800drv.com MUST block kb ints during motor runs.
We /have/ to. If user keeps typing while motors are running
with kb ints on, the buffer will fill and starts BEEPING
which causes missed feeds to motors causing overtravel,
and WITHOUT tripping a sync fault..!
> Fixed weird issue with how INT 10 scrollup intercept handled.
Noticed if A800DRV was installed, in VI if I G2 to goto line 2
in a file, then hit 'dd', the line above would repeat into
line 2. Fixed how comparisons work in that code, and BIOS fallthrus.
> Makefile now maintains VERSION for all programs.
Changed all .C and .ASM code to use new datetime.h/datetime.inc
and made those files a dependency. Tweaked the datetime build tool
to take -asm/-c arguments as well as the VERSION# info.
> Added call to ForceUpdateCounters() to name_defs() so counters
get renamed right away. (Old names A/B/C remained during 'home'
operation.. only fixed up once OPCS fully initialized)
> Moved all keyboard reading stuff to readkey.c::ReadKeyboard()
which now checks the keyboard busy bit before reading inp(0x60),
and handles extended keycodes and such.
Doing this means ALL keyboard reading must use ReadKeyboard(),
and never read inp(0x60) directly, otherwise it will miss key release
events and such. Also, kb interrupts MUST BE OFF for ReadKeyboard()
to work reliably, and the BIOS keyboard buffer must be flushed before
and after, to avoid weirdness occurs.
ReadKeyboard() should probably check (inp(0x21) & 2) to see if
keyboard interrupts are on or off: if on, use kbhit() and getch(),
and if off, read the raw hardware.
K2.15/TC - 05/11/2024 (not released, cleanup)
TODO: Add code to a800drv INT 99 to halt on any fun call
that's out of range. Use "jae" to test the value,
and use existing print hex to show the bad AH value.
Then port this change to RTMC48 and MDRIVE!
o OPCS:
> Supports 80x25, 80x40, 80x50 size screens.
> Removed "Scroll Lock" key stuff, now adjust scroll height directly.
o A800DRV:
> Fixed screen scrolling intercept to support different sized screens.
> Fixed INT 99/AH=05h "set video address".
Was saving AX as address, but AH is already used for func#.
Switched to use BX. (Apparently function unused, so bug unnoticed)
> Unused scroll lock key stuff removed
> Added GetScrollHeight() function (INT 99/AH=13) to return
the current scroll height last set. Used by OPCS to restore
scroll height during DOS commands.
> Unused keyboard intercept stuff removed
What was that all about anyway? Thought it might be affecting
key release stuff. It seems unused??
TODO: PORT THIS CHANGE (AND OTHERS) TO MDRIVE AND RTMC48
TODO2: Also, it's important that port 21h is saved during
motor start, and restored on motor stop. The keyboard
int bit must NOT DISTURBED OR CHANGED THROUGHOUT:
If 'key' or 'jog' turns kb ints off, they must REMAIN OFF
or the keyboard polling thing won't work; the BIOS KB INT
routines will read port 60h, removing the scancode from the
hardware buffer such that OPCS's ReadKeyboard() won't see it.
This causes it to miss key release events.
o Key events getting eaten: Is it the printf() library??
Try not using printf/fprintf to put msgs on screen while
kb ints are disabled.
o home.exe (2.21):
> Fixed sync fault issue caused by kbhit() in krun.c allstop checks
> Added generation of "fault.txt" info file on sync fault errors.
> Cleaned up 'home -v' output to be greppable/redirectable
> Cleaned up print_cmd a bit
o Rewrote keyboard reading from simple inp(0x60) to smarter
handling of extended and typematic key codes (e.g. repeating HOME key
problem)
o jog: Added extra 4 channels MNOP for full 16 channel support (ferriter)
UNTESTED WITH ACTUAL HARDWARE! Use 16chan board to test
o Fixed weird keyboard hang when 'key' mode invokes DOS commands, e.g.
keyfunc -add "! echo OK" 0060 ff 52 0060 80 80
^^^^^^^^^^^ ^^^^^
DOS via OPCS Insert key (extended)
Seems on return from execute_string() it's important to call
clear_kb_buffer(), which uses kbit()/getch() to read any pending chars.
Doing this before disabling keyboard ints seems to solve it.
o 'hardware off' - now shutters run 1x at a time at 0.25sec spd
(cam/pro/etc). This way 'key' mode for pro/cam slew works, and
doesn't just immediately jump to the huge numbers it uses for slew.
o readline:
> Various small tweaks to support different sized screens.
Also can now make use of last row. (Could not before)
K2.14/TC - 04/23/2024
o Small code cleanup of opcs.c:
> Move "Defs" struct initialization to opcsdefs.c -> InitDefs()
> Keep init_globals() in opcs, which calls above
> Remove old comments from opcs.c and new InitDefs() function
> Removed commented out code
o Small code cleanup of opcskuper.c:
> Removed commented out code
o Added ppr to homedefs.hom to affect motor speeds.
K2.13/TC - 04/21/2024
o opcs.exe and home.exe: fixed bug detecting motor resident routines.
They both would test a byte of the segement of the INT 99 vector
for zero to see if motor routines not installed. But if DOS is
efficiently stored in high memory, the segment byte CAN be zero,
causing OPCS to not think motor drivers are installed when they are.
We now test BOTH bytes of segment register for zero.
o Fixed a bug that caused intermittant hangs when motors stopped running.
This was in the A800DRV.COM driver. Particularly noticeable when
running the HOME program repeatedly, e.g. do 200 home a b c.
Details:
Motor driver restores the old IRQ vector when motors come to a stop,
but the IRQ interrupt service was using DOS (INT 21H) to do this.
DOS must not be called from WITHIN an interrupt service, even for
something as simple as changing interrupt vectors. Changed the code
to change the vector directly, and that solved the instability.
o gr: only rewrites file if changes were made
o Created movop - general mocon file operations
o velrep checked: pretty sure it detects buckle,
even tho the manpage for velrep says:
---
FUTURE
o Add a way to specify BUCKLE/VIEWER/TRIP checks in .vrp file.
(We only have AllStop checks currently)
---
That warning does not seem to be true, if it ever was,
so it was removed from the man pages.
o readline(): uses BIOS to update cursor and print crlf
on hitting ENTER, so "opcs > file" still lets user see
what they're editing.
o Fixed MRP manpage that was missing the [chan] spec
o Fixes were made to the 'man ansi' that had errors in describing
how to program keys using ANSI codes.
o Fixed SAMPSPERSEC manpage to include new A800 REV-B firmware
that runs the IRQs at 120 Hz, same value as the RTMC cards.
Some other man pages were updated for this.
o Found old calc program's source code, and added it to build,
added readline() features for editing.
K2.12/TC - 08/19/2023
o 'show' man page improved to show example output
o gr: fixed text rendering problem
Turned out the BEETLE computer's BIOS graphics pixel plot
(INT 10H) corrupts the app! Wrote my own pixel plotting into
screen memory and the problem went away. Phoenix BIOS pixel plot
can't be trusted!
After writing my own text rendering code in grfont/*, it's probably
all for naught, and can fall back to printf() and friends, and just
replace the Plot() code in gr.c with grfont/grfont.c's gr_plot() code.
K2.11/TC - 03/22/2022
o jog: fixed problem with slew (9) and (3) keys
"jumping" on short runs.
o a800drv: Had to detect display: color (b800) vs. mono (b000)
for beetle to keep up. update_counters updating both color+mono
seemed to prevent motor updates from being fast enough (?)
OLD: update_counters was slapping to BOTH b800h and b000h
NEW: Code now determines video mem address using INT 11H
XXX: ***WHY*** wasn't the above problem causing a sync fault?!
If user program not fast enough, should have triggered a fault.
Look into what was happening/why this is.
K2.10/TC - 02/16/2022
o Added new "velsav" OPCS command
o A800DRV.COM + RTMC48.COM + MDRIVE.COM
Fixed recursion error: kb_int handler was calling 'int 99h' to
redisplay counters which eventually cause a reentry, tripping a
"@@@ RECURSION" error w/main app! All previous releases have
this bug, not only K2.00 - K2.05, but even all K100 releases!
NOTE: In Feb 2022, backported this fix to 2.05 and older versions;
see "K2.06" for details.
o TODO: TEST MDRIVE.COM MODS WITH MOTORS!
---
o A800DRV.COM - added -b/-i/-h command line flags to set irq/baseaddr.
This is now the only way to set the IRQ/baseaddr.
Obsoletes the 'baseaddr' command in OPCSDEFS.OPC and HOMEDEFS.HOM
o 'baseaddr' removed from the Kuper structure from 'OPCS' and 'HOME'
applications. NOTE: All DOS drivers must be updated:
A800DRV.COM - Done K2.10/TC - working 01/17/22 TESTED
RTMC48.COM - Done K2.10/TC - working 01/19/22 UNTESTED <-- found above recursion error during testing
MDRIVE.COM - DONE K2.10/TC - working 01/21/22 UNTESTED
o PrintRing() modified to show DSEG:OFFS for addresses instead of just
decimal numeric offsets. (Useful for debugging)
o jog: get rid of "To zero fader use 'cls'" msg (uses cls automatically)
o jog: 'Reset' now shows blinking cursor at line being edited
o 'interp d - 0 0 0' (to disable previous interp) is now in man page
o 'bigcounters yes' now shows warning hashmark on digit overflows
o Added 'velsav' command
o (WIP) velrep: add 'lastrep <label>'
K2.06/TC - 02/17/2022
o THERE'S NO CHANGES TO OPCS IN THIS MAINTEANCE RELEASE,
but it's being given a number anyway. It's really K2.05
with a fix to the A800DRV driver.
Back ported "reentry" recursion fix to A800DRV from K2.10.
The src fix is in OPCSK200\SRC-BAK\FERRITER.FIX\*.*
This 2.06 "maintenance release" was *NEEDED*, because in K2.10
the kuper struct changed size making it ABI incompatible with K2.05.
(The baseaddr removed from kuper struct in favor of setting it
as a driver cmd line option).
So:
A800DRV.BAD -- Has reentry BUG (v4.01), released w/K2.05 and older
A800DRV.ASM -- Has fix (v4.02), should be given to anyone with
K2.00 - K2.05.
K2.05/TC - 07/30/2021
o 'bigcounters yes': moved cam/pro/rat/fade labels right one char
to line up with inside of box (like nixie) so single letter labels
(A,B,C..) indicate CLEARLY which box they're labeling.
K2.04/TC - 07/29/2021 -- Carl Spencer release
o Changed nixie display to be one line smaller by optimizing
the use of inverse text. This led to complications due to
how x,y addressing is affected by the invisible mode chars,
necessitating a FindXY() function that works but is kinda
inefficient. See opcsdisp.c for "FUTURE" to improve this maybe.
o Copied over slap_screen: code from A800DRV.ASM
to RTMC48.ASM and MDRIVE.ASM (without it, nixie counters
weren't drawing properly, due to changes in mode chars)
o Verified runbar shows msg correctly in all counter types
o Verified counters don't wrap into runbar for all counter types
o Force jog to always leave cursor in same position so when
'unlock' is used (U), message prompts during unlock are seen correctly
o Made sure that running 'rep 5 cam 5 pro 5' shows in runbar
for all counters: "Rep", then "Cam Shoot", then "Pro Shoot".
K2.03/TC - 03/09/2021
o Fixed bug in LOG(OPCS) that caused a "division by zero"
if 'log' was used with FPF(OPCSDEFS) set to 0 for a channel.
o Fixed bug with: cam >-1'30
..where negative footage counts wouldn't correctly range-check
the trailing frames value
o Aborted attempt to support floating point fpf.
Saved work in "floatfpf", previous work in "intfpf".
See floatfpf.txt for info.
K2.02/TC - 03/07/2021 - Mike Ferriter IMAX <-> 10 Perf 70
o Fixed bug in 'POST MORTEM'; when debugging enabled,
junk[] array was [12] instead of [16]
K2.01/TC - 03/04/2021
o When 'respond' enabled, 'cmdline' forced to 'dos' mode
K2.00/TC - 05/17/2020
Ported k1.16 to Turbo C 3.0, fixed various bugs in the process.
o log off: forces log_counters() before closing log
(so previous command's effects shown in log before 'log off')
o flog: fixed bug in fade_log(), where flog=(-1 .. 1)
was returning the raw fraction (0..1) instead of (start..end).
SHOULD BACK PORT FIX TO K1.16
o Got rid of redundant defs->nomotors, replaced with postive logic
of env->motors.hardware
o Various fixes to expand_vars/string_replace handling:
Sometimes args[2] referenced even if NULL
Variables could expand to garbage if beyond range of args[].
(Had a > vs >= test error)
Better warning messages for corner cases
o Fix commands that act badly when no args given:
seek check chk go rat rep cam pro pro2 fdi/fdo/dxi/dxo
o Errors in OPCSDEFS file now report line#.
o INTERNAL CHANGES:
> Got rid of all old EMC subroutines, nuked MOTORSUB module.
Switched to a cleaner module arrangement; see README.txt
for more info on the module breakdown.
> RTMC48.ASM modified (now v3.10 - 05/04/2020):
Changed STI to CLI at top of kuper_int to prevent timer
interrupt from triggering during motor servicing.
/|\
|
K200 (Turbo C 3.0 "Pandemic Port" 05/17/2020)
================================================================
================================================================
================================================================
K100
|
\|/
K1.16 - 05/02/2020
o Fixed 'show' command not showing if other commands followed it. e.g.
show cam 1
..would not show anything, but ran cam command OK.
o Added 'check' command, e.g. 'check abc 1000,2000,3000'.
Also now uses channel names from startup.defs instead of
hard coded names.
o Added check for OPCS_NORESSHU variable -- if set,
using 'go' with abc channels will leave step values in counters.
o There may be a bug in 'go' with long motor runs, e.g.
go ab 2000 go ab -8000
\_________/
This will sometimes run MORE THAN 8000,
in a scope grab, it ran 8100 instead of 8000
Might be a bug in driver's or code's handling when buffer full,
or handling wrap around. INVESTIGATE! Scope says a800 is sending
sometimes more/sometimes less pulses than the software sends. WHY?
Either bug in driver, or bug in 8255 communications timing, or..???
K1.15 - 04/16/08 o velrep would crash if filename didn't exist,
or on other file related errors. velrep
'Free' routines were not checking for NULL.
o velrep docs modified to indicate the + postfix
would either increment OR decrement the frame
counter based on the velocity's sign (direction).
o home: added OPCSDEBUG to help and man page
o velrep mem leak: wasn't free()ing stop/goto/loop labels
o go mem leak: seems like hfree() wasn't freeing the
halloc()s correctly, causing mem to slowly leak.
Solution: FreeRingBuffer() hfree() commented out,
run hfree() only on opcs_exit()
o To make room for more ram:
rtmc48/mdrive: Made environment smaller: 25000 -> 20000
(Only need 19660) Run 'defs' or 'show -d' to determine
Environment size.
Changed MAXSCRIPTS from 20 to 16
velrep: Added CHUNKSIZE to realloc()s to prevent
mem fragmentation.
o Added 'log <MM-DD-YY>" to automatically create
a datestamped log file.
K1.14 - 04/27/03 o Adding new OPCS command 'velrep', added VelRep.C.
(For Technicolor)
o Modified 'man rtmc48' to include kuper diagram.
o Fixed bugs in evalnum.c as per linux port
o Fixed bug in opcssubs.c as per linux port
K1.13d - 03/15/02 Fixed 'mov' docs; references to 'h' channel changed to 'f'
8255.exe modified to let user change outputs (v2)
No changes to OPCS that I know of otherwise.
K1.13c - 12/19/00 BUGFIX: seek couldn't handle different PPR values
K1.13b - 02/05/99 BUGFIX: ARGH! All math functions were offset!! ALL WERE WRONG!
BUGFIX: seek 10 10 - seek 10 10 seek 10 10 -
------------
This would run at NON-slew spd
BUGFIX: (6*(3'0)) and (6+4'0) doesn't work!
Unfortunatly all this stuff was broken; parser
numeric parser was checking for ' anywhere in
the ENTIRE FORMULA, and not stopping at end of
numeric value.
ENH: Added (?) to print actual evalnum help
K1.13a - 07/11/98 BUGFIX: ease had trouble with numbers >+-32768.
Problem was Round() returned an int, and
easediff variables were int instead of Pos.
ENH: home now has 'reset [chan] [val]'
ENH: gr has 'v' to plot vels
ENH: pending feeds are now shown in the runbar
BUGFIX: BAD BUG in shutter.c since k1.13: 'cam 110' didn't
actually shoot 110 frames, and left motor out of
sync. Bug was in DumpVels() being called under non-
allstop situations.
ENH: runcmd now allows -1 as #args for variable args.
Also, existence of .HLP files are checked, and printed
during errors in number of arguments.
ENH: $* now expands ALL variables.
K1.13 - 06/18/98 BUG FIX - 'FDI 2 CAM 10' would stop/go shoot last 8
BUG FIX - 'SHU 50 RESET D 0 SEEK 1 1' moves fader?!
Created SetCounter() that updates both counter and
defs->fader.
BUG FIX - mods to shutter.c so key release while in key(OPCS)
mode dumps part of ring buffer, making motors stop
quicker. [ Added DumpHalfStack() ]
ENH: Added cam/pro variables to evalnum
ENH: Added 'DO UNTIL (CAM=12) ..', modified manpage
DOC: Added manpage for debugger(OPCSDEFS)
ENH: home program now has a 'default' clause, so 'home'
without args can be _controlled_
ENH: Added spdinterp(DEFS) to allow zoom to affect exposure
automatically.
Introduced: ease.exe and gr.exe for doing pans/zooms.
k1.12f - 05/13/98 Added faderdisplay [on|off] for cinetech
k1.12e - 04/10/98 Added defs:
'@', 'echo' 'buckle' 'viewer' 'filter' 'keyfunc'
Obsolete:
'buckview' 'deenergize' 'keydef'
Added opcs: 'autofilt'
Seek now ignores viewer, but still senses buckles
Redraws allstop msgs w/out flashing after cont/abt.
Added autofilt(OPCS) and filter(OPCSDEFS)
Made man pages for logformat, and all new commands
Added +-*/ to SPD(OPCS): OK
Added '-all' flag to SHOW(OPCS): OK
k1.12d - 04/07/98 BUGFIX: pro2display disables ratio too
BUGFIX: Enabled runbar() again (been off how long?!)
Status line is now:
<-0 RUNBAR 24-><-25 SCRIPT 52-><-53 FADE/DX 79->
k1.12c - 04/02/98 added defs: pro2display, set/clr/xorbit
k1.12b - xx/xx/9x added 'logformat' command
k1.12a - xx/xx/9x added feet/frames to logcounters
k1.12 - xx/xx/9x FINAL FIX for stupid screen scroll problem (mdrive.asm)
k1.11e - xx/xx/9x -x flag added to fdi/fdo/dxi/dxo
k1.10e - xx/xx/9x rat 1 0 1: fix to run in tandem
k1.10d - xx/xx/9x key: projector run keys don't check buckview now.
k1.10c - xx/xx/9x Bugfix for (176'-32) vs (176'0-32) in evalnum.
k1.10b - 08-06-92 key wont cls after called from script
k1.10a - 07-24-92 ALT-letter works a little better.
k1.10 - 05-29-92 Added softlatch to handle kuper's I/O port card
(which can be written to, but not read). Added
'rat 4 4' to shoot 4, advance 4, shoot 4, etc.
k1.09 - 04-22-92
SPD BUGFIX: opcsdefs wasn't passing speed scale to kuper subs
BIG BUG FIX --> in shutter: ContShut(): slow speeds caused
no ramping (ok), but an allstop failed (stopped out
of home) because rdsamp/allstop checking weird.
Put allstop opportunity AFTER vels get sent.
ALSO: ShutterStop() wasn't checking for non-ramp case
properly, and incorrectly computed if in midst of
rampdown (added /32, and more reliable check. TESTED)
Symptoms were stalls.
ALSO: ContShutter() wasn't pointing ASADDR to velstop stack
values (non-ramp), caused intermittent stall if ASTOP
occurred during ShutterFlush() (which uses ASADDR if
someone hits allstop)
k1.08 - 04-21-92 prophase added, spd(DEFS) handles '-' for any args.
k1.07 - 04-13-92 Added frange(OPCSDEFS) command at Tony's request.
k1.06 - 04-08-92 Bug fix in motorsubs.c: RampDownNow():
ONTHEFLYRAMPDOWN. Bug fix: JOG: crawl FWD/REV now updates
large display, improved bar() subroutine for faster display.
k1.05 - Added keydef(OPCSDEFS), JogRelease() etc.
k1.04 - is_all_stop_key() checks for allstop key even if 'motors off'.
execute_args() now checks custom commands for all arguments.
k1.03 - Added 'respond', centralized the ALLSTOP handlers to the
subroutines in OPCSSUBS, put in IFDEF OPCS clause for code
in motorsubs.c, Evalnum: hex() function added,
opcsjog: key->changed=0 when called. Seek added to KEY(OPCS).
k1.02f - run()'s ReadLine() modified: 199 changed to MAXLINECHARS,
ReadLine() modified to handle 'Line too long' errors.
Added ALT+chan letter to JOG.
Fix run() to break when skipping if EOF reached.
Jog comes up with 'D' as default instead of 'A'
k1.00 - This is a complete rewrite for use with kuper card and EMC subs.
Customers wanted a microstepper version for their precision printers.
/|\
|
K100 MICROSTEPPER
== =====================================
== k1.00 - Kuper Microstepper Version =====================================
== =====================================
HALF STEPPER
|
\|/
3.00f - OPCSDEFS.C modified out redundant 'IsBadMotor()' calls.
3.00e - EFW Bugfixes:
o PANIC/ABORT in a RUN file would continue anyway
with next line. err=execute_string() in OPCSCMDS.
3.00d - REP >54 and REP PRO >54, added fpf_eval_num_expr(), fixed
'K' in bignum.
3.00c - Fix:'motors off cam 12 motors off' screws up old counts.
Added $1 $2 variable passing to RUNCMD.
VCE's "102 PRINTER" RELEASE.
3.00b - Fix to seek() [seek 1 1 1 then seek 1 would run 1 1 1]
3.00a - JOG has inching, frame windoffs. (needs set-keys, slaving)
Motor routines called w/func ptrs for counter updates. Slop
routine bugfix. opcs has arg for different OPCSDEFS.OPC file.
3.00 - 12 channels supported, added +/- ratio to KEY. MANY subroutines
have been modified in OPCSRAMP.C, and allstop() handling was
greatly modified. Fix to SlopCorrection(). Fix to EvalFrameSpec:
changed (int) typecast to (Frame). Added counter/rat sets to
key_cmd, et al. Put back load_cmd.
2.10f - fixes to opcsinterp.c Lookup2Steps(using a [high] value would
produce huge numbers) and to opcsramp (0xff instead of 0xffff).
CS_WAIT has STI now. (bug came up in 103.00)
2.10e - timeinterp uses seconds/cycles, feed allows floats for interp
channels.
2.10d - fixes to opcsinterp.c (free samp), jog added, fix ppr=1 slow
added * for a chan spec, Chan2Bin() 'total' now a ptr, bug
fix in GetFaderValue() to check for defs->interp==NULL,
res2,rat2,seek2,chk2 have been phased out.
2.10c - floor(), fixes to step_cmd, opcsline.c, opcseval.c
2.10b - feed, step uses interps (ffocus, etc), PreCamEvent()
2.10a - timeinterp uses pps instead of seconds
2.10 - Large model, float interps, time interp, all 8 motors run
2.01b - buckle check BEFORE running motors, load removed
VCE's "103 PRINTER" RELEASE
2.01a - key, load, lineup, less runbar calls, step abc no counter
2.01 - ramping, fast seek, pro2display bugfix, dirxor bugfix
2.00c - fix to SEEK..ShootRatio() contained wrong ratio
2.00b - fix to OPCSBIG (added NULL in pattern[] init), dutycycle, deen
2.00a - fix to shutdrvr.asm for projectors going 1/2 out of phase
2.00 - Parallel/steps/direction, 8 motor max, concurrent shooting.
1.50 - Commands and code added for DUAL projectors.
1.40a - Fixes to allstop handler, and DBXSAVE->COUNTER is now 'int'
1.40 - Lock command added, check buckle during shoot, allstop/buck
checked in C, DBX saves/restores counters.
1.38 - Local/Public motor subs, contrived msg, (needs init code)
1.37d - step modified with optional arguments,log handles #-----
1.37c - better /etc/crash handling, LPT1/LPT2 hardware checks
1.37b - cam >-2 bugfix, debug info commented out (ONEIL 1/3/89)
1.37a - spacebar for allstop, double_check_hardware().
VERSION HISTORY
---------------
APPLE ][+ OPCS: 1985 - 198x
---------------------------
OPCS was initially conceived in the mid 1980's while I was a
student at Calarts (82-86). Written in APPLE ][+ BASIC and 6502
Assembly, this version was used by students until the late 80's.
HALF STEPPER (PARALLEL PORT) OPCS
---------------------------------
In 1988 Pat O'Neil asked if I could provide OPCS for one of his
printers. The software was rewritten on the IBM PC in C and 8086
assembly. This version built with the Microsoft V1.0 compiler,
and was used by Pat O'Neil (Lookout Mountain Films) and Pete Kuran
(VCE), and
replaced the Apple ][+ system at Calarts.
, using the parallel port to drive the motors dirctly.
MICROSTEPPER (KUPER) OPCS: 1.xx
-------------------------------
When Bill Tondreau started Kuper Controls, he and I worked a deal
where I could use his RTMC16 microstepper pulse generator cards
on the PC to drive motors instead of parallel ports. This was
used on Pat O'Neil's second printer, with Centent microsteppers.
This became the "K100" version of OPCS. This version was licensed
to many companies; Title House, Introvision, Technicolor, YCM,
Cinetech, etc, etc. This version supports the RTMC16, RTMC48, and
Kuper Industrial cards using different DOS TSR drivers.
KUPER OPCS: 2.xx
During the world pandemic of 2020, I ported the code to Turbo C 3.0,
and also developed my own microstepper card, the A800. This version
continued support of all the above Kuper cards and the new A800.
Turbo C had better error checking and modern C prototyping.