From Tim's website
Jump to: navigation, search

Minidisc Control Lead - Program

DECLARE SUB sendremote (send%, lptdat%, delay!)
DECLARE SUB WriteTitle (delay!)
' TitleAid 70X
' Program for remote control and title input on a
' Sharp MD-Recorder. Originally for the MD-MS701
' Thomas H. Meier, Germany, Mannheim, 12.07.1999 / QuickBasic 4.5
' Modified for the MD-MT161 by T. Styles and R. Jarvis, 15.01.2001
'
' Hardware from www.mannheim-netz.de/user/meierth/MD70X.html
' For the MD-MS701
' Key:          Resist. output value
' none pressed  212k    &HF8
' Play Mode      72k    &HF7
' Display        50k5   &HF6
' Bass           35k5   &HF5
' Minus-Key (-)  25k5   &HF4
' Plus-Key (+)   18k6   &HF3
' Rewind <--     14k    &HF2
' Forward -->    10k    &HF1
' Stop           6k8    &HF0
'
' For the MD-MT161:
CONST none% = &HFF
CONST mode% = &HFB
CONST DISP% = &HFA
CONST bass% = &HDD
CONST minus% = &HDC
CONST plus% = &HD8
CONST rew% = &HD5
CONST forw% = &HE6
CONST stopp% = &H80
CLS


' Get PrinterPort Address
DEF SEG = 64                            ' BIOS - DataSegment
lptdat% = PEEK(&H9) * 256 + PEEK(&H8)   ' get address of LPT1:
DEF SEG = 0                             ' Return to 0-Segment

maxloop = 10
PRINT "Please stand by !"
PRINT "Calibrating delay loop ";
calib:
PRINT ".";
'du$ = INKEY$
start = TIMER
FOR i = 1 TO maxloop: NEXT i
finish = TIMER
gone = finish - start                   ' choose a good period:
IF gone < 3! THEN maxloop = maxloop * 10: GOTO calib
cycles = maxloop / gone
delay = INT(cycles / 20)                ' one keytouch takes 2*1/10sec

' Init hardware of MD-Remote            ' none% = &HF8
send% = none%                           ' &HFx for voltage supply
sendremote send%, lptdat%, delay        ' &Hx8 for "No key pressed"

char$ = "X"

WHILE char$ <> "E"
CLS
PRINT "Minimal Control (Delay="; delay; ")"
PRINT "==============="
PRINT "Stop       s     Playmode    p"
PRINT "Forward -> v     Bass        b"
PRINT "Back <-    z     Display     d"
PRINT "Plus       +     Minus       -"
PRINT "End        E     Write Title w";

DO                                      ' wait for key
char$ = INKEY$
LOOP UNTIL char$ <> ""

SELECT CASE char$
      
       CASE "s"
       send% = stopp%
       CASE "v"
       send% = forw%
       CASE "z"
       send% = rew%
       CASE "+"
       send% = plus%
       CASE "-"
       send% = minus%
       CASE "b"
       send% = bass%
       CASE "d"
       send% = DISP%
       CASE "p"
       send% = mode%
       CASE "w"
        WriteTitle delay
       CASE "E"
       send% = none%
       CLS
       CASE ELSE
       send% = none%
       END

END SELECT
sendremote send%, lptdat%, delay
WEND                                            ' end of main loop

SUB sendremote (send%, lptdat%, delay)
OUT (lptdat%), send%                            ' press key ...
FOR i = 1 TO delay: NEXT i

OUT (lptdat%), none%                            ' ... and release it !
FOR i = 1 TO delay: NEXT i
END SUB

SUB WriteTitle (delay)
CONST DISP% = &HFA
CONST rew% = &HD5
CONST forw% = &HE6
CONST plus% = &HD8

' Get PrinterPort Address
DEF SEG = 64                            ' BIOS - DataSegment
lptdat% = PEEK(&H9) * 256 + PEEK(&H8)   ' get address of LPT1:
DEF SEG = 0                             ' Return to 0-Segment



REDIM strin$(3)
strin$(0) = "ABCDEFGHIJKLMNOPQRSTUVWXYZ.,/ "
strin$(1) = "abcdefghijklmnopqrstuvwxyz.,/ "
strin$(2) = "1234567890!" + CHR$(34) + "#$%&'()*+,-./:;<=>?@_` "

CLS
PRINT "Edit. Enter. Ensure cursor is selecting small 'a'"
INPUT "Enter title >", title$
curdisplay = 1
curposalpha = 1
curposnum = 1
LOCATE 3, 14: PRINT
FOR i = 1 TO LEN(title$)
      
        cur$ = MID$(title$, i, 1) 'current char
        PRINT cur$;
        WHILE cur$ = " "
                sendremote plus%, lptdat%, delay 'send a space
                i = i + 1
                cur$ = MID$(title$, i, 1) 'current char
                PRINT cur$;
        WEND

        FOR t = 0 TO 2                              ' find appropiate string containing char
                curstrin$ = strin$(t)
                IF INSTR(curstrin$, cur$) <> 0 THEN
                        nextdisplay = t
                END IF
        NEXT t
        curstrin$ = strin$(nextdisplay)
        
        skipdisplay = (nextdisplay - curdisplay + 3) MOD 3 'calc number of times to press disp
        FOR e = 1 TO skipdisplay   'press disp and record where you are
                sendremote DISP%, lptdat%, delay
                curdisplay = (curdisplay + 1) MOD 3
        NEXT e
        't = TIMER
        'DO: LOOP UNTIL TIMER - t > 1

       
        nextpos = INSTR(curstrin$, cur$)
       
        IF curdisplay = 2 THEN
        'deal in numbers
                skippos = (nextpos - curposnum)
                curposnum = nextpos
        ELSE
        'deal in chars
                skippos = (nextpos - curposalpha)
                curposalpha = nextpos
        END IF
      
        IF skippos > LEN(curstrin$) / 2 THEN
                skippos = skippos - LEN(curstrin$)
        ELSEIF skippos < -LEN(curstrin$) / 2 THEN
                skippos = skippos + LEN(curstrin$)
        END IF

        IF skippos > 0 THEN
                send% = forw%
        ELSE
                send% = rew%
        END IF
       
        FOR w = 1 TO ABS(skippos)
                sendremote send%, lptdat%, delay
        NEXT w
        SOUND 255, 5
        t = TIMER
        DO: LOOP UNTIL TIMER - t > .8  '0.8 sec pause to press 'Enter'


NEXT i

END SUB