[vcf-midatlantic] 2:00am BASIC epiphany
Evan Koblentz
evan at vcfed.org
Fri Aug 31 02:30:56 EDT 2018
I had a spontaneous idea tonight for removing two lines of my Lego robot
code.
As usual, this epiphany on my part is probably TOTALLY FRIGGIN' OBVIOUS
to most of you, but I'm proud that I figured it out on my own. :)
Before, on the forklift robot, this was my code for checking the
upper/lower touch sensors (limit switches) and moving the forklift motor
appropriately. I had it at 9 lines (not counting REMarks) which was
greatly reduced from Dan R.'s original 16 lines.
3010 IF PEEK (49249) > 127 AND PEEK(L) = 64 THEN RETURN
3020 IF PEEK (49249) > 127 THEN POKE L,16
3030 IF PEEK(L) = 80 THEN RETURN
3040 IF PEEK(49249) > 127 THEN GOTO 3020
3050 IF PEEK(49250) > 127 AND PEEK(L) = 128 THEN RETURN
3060 IF PEEK(49250) > 127 THEN POKE L,32
3070 IF PEEK(L) = 160 THEN RETURN
3080 IF PEEK(49250) > 127 THEN GOTO 3060
3090 RETURN
Background: In that code, PEEK(49249) in Applesoft checks joystick
button 0 and PEEK(49250) checks button 1. If their value is greater than
127 then you know they're currently being pressed. PEEK(L) checks the
value at the address of the interface card. 64/128 are the sensors
attached to ports (bits) 6 and 7, respectively. POKE L,16/32 turns on
the motor (in opposite directions) that's attached via a connector
spanned to ports 4/5. Lines 3030 and 3070 stop the motors if the sensors
become active ** while ** the motor is moving, because then the total
value being read from the interface box is sensor + the motor.
The idea that popped into my head tonight: you can combine lines
3010/3020 into one, and also lines 3050/3060 into one, thereby reducing
the routine by two lines and having the same effect.
3010 IF PEEK (49249) > 127 AND PEEK(L) <> 64 THEN POKE L,16
3020 IF PEEK(L) = 80 THEN RETURN
3030 IF PEEK(49249) > 127 THEN GOTO 3010
3040 IF PEEK(49250) > 127 AND PEEK(L) <> 128 POKE L,32
3050 IF PEEK(L) = 160 THEN RETURN
3060 IF PEEK(49250) > 127 THEN GOTO 3040
3070 RETURN
So instead of saying, "Exit the routine if the lower/upper touch sensors
are active, which we know is true if the value at address L is 64 or
128," instead I'm saying, "Turn on the motor ** ONLY IF ** the
lower/upper touch sensors aren't active."
I can't test it until this weekend at the soonest, but I am ** pretty
sure ** it'll work -- or at least I don't see any obvious reason why it
would ** not ** work. After all, the forklift motor can't turn on when
either sensor is active, because I'm not programmatically allowing it --
right?
If it works, then I'll convert it to IBM BASIC too. The button PEEKs
become STRIG (stick trigger) values, and the POKEs become OUT.
Saving two lines of interpreted / non-compiled BASIC isn't going to have
any significant impact on program execution speed or disk space, but it
makes the code that much easier for non-programmers to understand, and
it gives me that much more confidence of about being than just another
English major. :)
More information about the vcf-midatlantic
mailing list