@echo off REM #################################################################### REM # Polaroid SX-70 serial Calculator REM # Olivier BORDRON - 2018 REM # REM # This script reads the serial number of your Polaroid SX-70 REM # or SLR680 and returns related informations REM #################################################################### SETLOCAL EnableDelayedExpansion SET SERIAL_NUMBER=%1 TITLE Polaroid SX-70 Serial Calculator COLOR 1F &::White with dark blue back REM ******************************************************************** REM * Code start REM ******************************************************************** call :display_welcome_message call :init_months call :init_shutter_models call :init_camera_models :code_loop SET ERROR_NUMBER=0 echo: REM If SERIAL_NUMBER is not defined, enter it from the keyboard. REM If just 'Enter' is typed, set a wrong serial. IF NOT DEFINED SERIAL_NUMBER SET /P SERIAL_NUMBER=Please enter your camera's serial number : || SET SERIAL_NUMBER=0 echo: REM Get serial number length call :str_len %SERIAL_NUMBER% SERIAL_LENGTH REM Control if the length of the serial is OK IF NOT %SERIAL_LENGTH% EQU 10 IF NOT %SERIAL_LENGTH% EQU 11 ( SET ERROR_NUMBER=1 ) REM Process the two kinds of serial at once IF %ERROR_NUMBER% EQU 0 call :process_serial_%SERIAL_LENGTH% IF %ERROR_NUMBER% EQU 0 call :check_shift %SERIAL_SHIFT% IF %ERROR_NUMBER% EQU 0 call :check_month %SERIAL_MONTH% IF %ERROR_NUMBER% EQU 0 call :process_shift IF %ERROR_NUMBER% EQU 0 call :set_decade REM Set a fake ERROR_NUMBER to the length of the serial entered. REM That way, I can display the message related to the serial. IF %ERROR_NUMBER% EQU 0 SET ERROR_NUMBER=%SERIAL_LENGTH% call :display_message_%ERROR_NUMBER% REM Loop to :code_loop to enter a new serial echo: choice /M "Do you want to enter a new serial ? " IF %ERRORLEVEL% EQU 1 ( SET SERIAL_NUMBER= cls goto :code_loop ) call :destroy_variables echo: echo Thank you for using Polaroid SX-70 Serial Calculator echo: pause REM ******************************************************************** REM * Exit script with a return value = 200 REM ******************************************************************** exit /B 200 REM ******************************************************************** REM * End of main code. No execution after this line, except REM * functions called. REM * Add exit with return value of 201, just in case REM ******************************************************************** exit /B 201 REM ******************************************************************** REM * Process serial number of 10 chars REM ******************************************************************** :process_serial_10 SET SERIAL_NUMBER=0%SERIAL_NUMBER% SET SERIAL_LENGTH=11 call :process_serial_%SERIAL_LENGTH% exit /B 0 REM ******************************************************************** REM * Process serial number of 11 chars REM ******************************************************************** :process_serial_11 SET SERIAL_CONF=%SERIAL_NUMBER:~0,1% SET SERIAL_MONTH=%SERIAL_NUMBER:~1,1% SET SERIAL_YEAR=%SERIAL_NUMBER:~2,1% SET SERIAL_MODEL=%SERIAL_NUMBER:~3,1% SET SERIAL_SERIAL=%SERIAL_NUMBER:~4,5% SET SERIAL_SHIFT=%SERIAL_NUMBER:~9,2% exit /B 0 REM ******************************************************************** REM * Compute date and shift from the shift code. REM ******************************************************************** :process_shift FOR %%A IN (0 1 2) DO ( SET /A SSN=!SERIAL_SHIFT!+%%A SET /A SHIFT_MODULUS=!SSN!%%3 IF !SHIFT_MODULUS! EQU 0 ( SET SHIFT_SHIFT=%%A SET /A SHIFT_DAY=!SSN!/3 ) ) IF %SHIFT_SHIFT% EQU 0 SET SHIFT_SHIFT=C IF %SHIFT_SHIFT% EQU 1 SET SHIFT_SHIFT=B IF %SHIFT_SHIFT% EQU 2 SET SHIFT_SHIFT=A SET SSN= SET SHIFT_MODULUS= exit /B 0 REM ******************************************************************** REM * Set decade when the camera was built REM ******************************************************************** :set_decade IF %SERIAL_CONF% LSS 7 ( SET DECADE=7 ) ELSE ( SET DECADE=8 ) IF %SERIAL_CONF% GEQ 4 IF %SERIAL_YEAR% LEQ 2 SET DECADE=8 exit /B 0 REM ******************************************************************** REM * Check shift coherence REM ******************************************************************** :check_shift SET TEMPVAR= IF %~1 LSS 01 SET TEMPVAR=1 IF %~1 GTR 93 SET TEMPVAR=1 IF DEFINED TEMPVAR SET ERROR_NUMBER=2 SET TEMPVAR= exit /B 0 REM ******************************************************************** REM * Check month coherence REM ******************************************************************** :check_month IF NOT DEFINED MONTH[%~1] SET ERROR_NUMBER=3 exit /B 0 REM ******************************************************************** REM * Destroy environment variables REM ******************************************************************** :destroy_variables FOR %%A in (A B C D E F G H J K L M) do ( SET MONTH[%%A]= ) FOR /L %%A in (0,1,9) do ( SET SHUTTER_MODEL[%%A]= ) FOR /L %%A in (0,1,6) do ( SET CAMERA_MODEL[%%A]= ) SET SERIAL_NUMBER= SET SERIAL_LENGTH= SET SHIFT_SHIFT= SET SHIFT_DAY= SET SERIAL_CONF= SET SERIAL_MONTH= SET SERIAL_YEAR= SET SERIAL_MODEL= SET SERIAL_SERIAL= SET SERIAL_SHIFT= SET DECADE= SET ERROR_NUMBER= SET DAY_SUFFIX= SET SUFFIX= SET LEN= SET S= exit /B 0 REM ******************************************************************** REM * Destroy environment variables REM @echo off REM Setlocal EnableDelayedExpansion REM :: strLen String [RtnVar] REM :: -- String The string to be measured, surround in quotes if it contains spaces. REM :: -- RtnVar An optional variable to be used to return the string length. REM Endlocal& REM ******************************************************************** :str_len Set "s=#%~1" Set "len=0" For %%N in (4096 2048 1024 512 256 128 64 32 16 8 4 2 1) do ( if "!s:~%%N,1!" neq "" ( set /a "len+=%%N" set "s=!s:~%%N!" ) ) if "%~2" neq "" (set %~2=%len%) else echo %len% Exit /b 0 REM ******************************************************************** REM * If error number = 1 display message "bad serial" REM ******************************************************************** :display_message_1 echo Usage : %~n0 serial_number_of_your_film echo: echo or %~n0 echo --^> then enter the serial number when asked echo: echo The serial number must be 10 or 11 characters. echo: exit /B 0 REM ******************************************************************** REM * If error number = 2 display message "bad day" :P REM ******************************************************************** :display_message_2 echo Error in shift code : %SERIAL_SHIFT%. Should be between 1 and 93. exit /B 0 REM ******************************************************************** REM * If error number = 3 display message "bad month" REM ******************************************************************** :display_message_3 echo Error in month : %SERIAL_MONTH%. exit /B 0 REM ******************************************************************** REM * If error number = 11 display message 11-chars-serial related REM ******************************************************************** :display_message_11 call :set_day_suffix %SHIFT_DAY% DAY_SUFFIX REM IF the camera model is unknown, the variable won't be set. Therefore, set message accordingly. IF DEFINED CAMERA_MODEL[%SERIAL_MODEL%] ( SET CAMERA_MODEL_MESSAGE=Your camera is probably an !CAMERA_MODEL[%SERIAL_MODEL%]!. ) ELSE ( SET CAMERA_MODEL_MESSAGE=I don't know which camera model you have. ) REM Set those variables here as the copy_to_clipboard function is unable to interpret expanded variables. SET SHUTTER_MODEL_MESSAGE=!SHUTTER_MODEL[%SERIAL_CONF%]! SET MONTH_MESSAGE=!MONTH[%SERIAL_MONTH%]! echo: echo #################################################################### echo # SX-70 Serial Number Calculator Results # echo #################################################################### echo: echo The SX-70 serial number calculator has determined the following statistics about your camera: echo: echo The complete serial number you entered is %SERIAL_NUMBER%. echo Your camera has the %SHUTTER_MODEL_MESSAGE%. echo %CAMERA_MODEL_MESSAGE%. echo The serial number itself is: %SERIAL_SERIAL%. echo Your camera was made on %MONTH_MESSAGE% the %SHIFT_DAY%%DAY_SUFFIX%, 19%DECADE%%SERIAL_YEAR% during the %SHIFT_SHIFT% shift. echo: choice /M "Do you want to copy the result to the clipboard ? " IF %ERRORLEVEL% EQU 1 call :copy_to_clipboard SET CAMERA_MODEL_MESSAGE= SET SHUTTER_MODEL_MESSAGE= SET MONTH_MESSAGE= exit /B 0 REM ******************************************************************** REM Copy result to clipboard REM ******************************************************************** :copy_to_clipboard ( echo #################################################################### echo # SX-70 Serial Number Calculator Results # echo #################################################################### echo: echo The SX-70 serial number calculator has determined the following statistics about your camera: echo: echo The complete serial number you entered is %SERIAL_NUMBER%. echo Your camera has the %SHUTTER_MODEL_MESSAGE%. echo %CAMERA_MODEL_MESSAGE%. echo The serial number itself is: %SERIAL_SERIAL%. echo Your camera was made on %MONTH_MESSAGE% the %SHIFT_DAY%%DAY_SUFFIX%, 19%DECADE%%SERIAL_YEAR% during the %SHIFT_SHIFT% shift.)| CLIP exit /B 0 REM ******************************************************************** REM Initialize months. REM ******************************************************************** :init_months SET MONTH[A]=January SET MONTH[B]=February SET MONTH[C]=March SET MONTH[D]=April SET MONTH[E]=May SET MONTH[F]=June SET MONTH[G]=July SET MONTH[H]=August SET MONTH[J]=September SET MONTH[K]=October SET MONTH[L]=November SET MONTH[M]=December exit /B 0 REM ******************************************************************** REM Initialize camera models. REM ******************************************************************** :init_camera_models rem SET CAMERA_MODEL[0]=Model 1 or Alpha 1 rem SET CAMERA_MODEL[1]=Model 1 or Alpha 1 SET CAMERA_MODEL[0]=original SX-70 or Alpha / Alpha 1 SET CAMERA_MODEL[1]=original SX-70 or Alpha / Alpha 1 SET CAMERA_MODEL[2]=SX-70 Model 2, SE, Sears or Alpha 2 SET CAMERA_MODEL[3]=SX-70 Model 3 SET CAMERA_MODEL[4]=SX-70 Sonar OneStep SET CAMERA_MODEL[6]=SLR 680 exit /B 0 REM ******************************************************************** REM Initialize known shutter models. REM ******************************************************************** :init_shutter_models FOR /L %%A in (0,1,9) do ( SET SHUTTER_MODEL[%%A]=unknown shutter design ) SET SHUTTER_MODEL[0]=original SX-70 shutter electronic design ("hybrid shutter") SET SHUTTER_MODEL[1]=Delta Hybrid shutter design SET SHUTTER_MODEL[2]=third-generation SX-70 shutter design (inhibits shutter from operating with an empty Flashbar) REM SET SHUTTER_MODEL[2]=6th Flash Inhibit Shutter design SET SHUTTER_MODEL[3]=Alpha 1 shutter design with the Alpha produciton focus wheel SET SHUTTER_MODEL[4]=Alpha 1 shutter design with the Hybrid focus wheel SET SHUTTER_MODEL[5]=Alpha 1 shutter design with the Alpha "K" focus wheel SET SHUTTER_MODEL[6]=Alpha 1 shutter design with the ABS plated moldings REM SET SHUTTER_MODEL[7]=Alpha 1 shutter design with Sonar and electronic flash (SLR 680) SET SHUTTER_MODEL[8]=Alpha 1 shutter design with Sonar and electronic flash (SLR 680) EXIT /B 0 REM ******************************************************************** REM Set the suffix of the day number REM ******************************************************************** :set_day_suffix SET NUMBER=%~1 SET LAST_NUMBER=%NUMBER:~-1% SET %~2=th IF %LAST_NUMBER% EQU 1 IF %~1 NEQ 11 SET %~2=st IF %LAST_NUMBER% EQU 2 IF %~1 NEQ 12 SET %~2=nd IF %LAST_NUMBER% EQU 3 IF %~1 NEQ 13 SET %~2=rd SET LAST_NUMBER= SET NUMBER= EXIT /B 0 :display_welcome_message echo #################################################################### echo # Welcome to Polaroid SX-70 serial calculator echo # Olivier BORDRON - 2018 echo # echo # This script reads the serial number of your Polaroid SX-70 echo # or SLR680 and returns related informations echo #################################################################### exit /B 0