Jump to content

Search the Community

Showing results for tags 'ti 99/4a'.

More search options

  • Search By Tags

    Type tags separated by commas.
  • Search By Author

Content Type


  • Atari Systems
    • Atari 2600
    • Atari 5200
    • Atari 7800
    • Atari Lynx
    • Atari Jaguar
    • Dedicated Systems
    • Atari 8-Bit Computers
    • Atari ST/TT/Falcon Computers
  • Gaming General
  • Marketplace
  • Community
  • Game Programming
  • Site
  • Classic Gaming News
  • The Club of Clubs's Discussion
  • I Hate Sauron's Topics
  • 1088 XEL/XLD Owners and Builders's Topics
  • Atari BBS Gurus's Community Chat
  • Atari BBS Gurus's BBS Callers
  • Atari BBS Gurus's BBS SysOps
  • Atari BBS Gurus's Resources
  • Atari Lynx Programmer Club's CC65
  • Atari Lynx Programmer Club's ASM
  • Atari Lynx Programmer Club's Lynx Programming
  • Atari Lynx Programmer Club's Music/Sound
  • Atari Lynx Programmer Club's Graphics
  • The Official AtariAge Shitpost Club's Shitty meme repository
  • The Official AtariAge Shitpost Club's Read this before you enter too deep
  • Arcade Gaming's Discussion
  • Tesla's Vehicles
  • Tesla's Solar
  • Tesla's PowerWall
  • Tesla's General
  • Harmony/Melody's CDFJ
  • Harmony/Melody's DPC+
  • Harmony/Melody's BUS
  • Harmony/Melody's General
  • ZeroPage Homebrew's Discussion
  • Furry Club's Chat/RP
  • PSPMinis.com's General PSP Minis Discussion and Questions
  • PSPMinis.com's Reviews
  • Atari Lynx 30th Birthday's 30th Birthday Programming Competition Games
  • 3D Printing Club's Chat
  • Drivers' Club's Members' Vehicles
  • Drivers' Club's Drives & Events
  • Drivers' Club's Wrenching
  • Drivers' Club's Found in the Wild
  • Drivers' Club's General Discussion
  • Dirtarians's General Discussion
  • Dirtarians's Members' Rigs
  • Dirtarians's Trail Runs & Reports
  • Dirtarians's Wrenching
  • The Green Herb's Discussions
  • Robin Gravel's new blog's My blog
  • Atari Video Club's Harmony Games
  • Atari Video Club's The Atari Gamer
  • Atari Video Club's Video Game Summit
  • Atari Video Club's Discsuuions
  • Star Wars - The Original Trilogy's Star Wars Talk
  • DMGD Club's Incoming!
  • DASM's General
  • AtariVox's Topics
  • Gran Turismo's Gran Turismo
  • Gran Turismo's Misc.
  • Gran Turismo's Announcements
  • The Food Club's Food
  • The Food Club's Drinks
  • The Food Club's Read me first!
  • The (Not So) Official Arcade Archives Club's Rules (READ FIRST)
  • The (Not So) Official Arcade Archives Club's Feedback
  • The (Not So) Official Arcade Archives Club's Rumor Mill
  • The (Not So) Official Arcade Archives Club's Coming Soon
  • The (Not So) Official Arcade Archives Club's General Talk
  • The (Not So) Official Arcade Archives Club's High Score Arena
  • Adelaide South Australia Atari Chat's General Chat & Welcome
  • Adelaide South Australia Atari Chat's Meets
  • Adelaide South Australia Atari Chat's Trades & Swaps
  • KC-ACE Reboot's KC-ACE Reboot Forum
  • The Official Lost Gaming Club's Lost Gaming
  • The Official Lost Gaming Club's Undumped Games
  • The Official Lost Gaming Club's Tip Of My Tounge
  • The Official Lost Gaming Club's Lost Gaming Vault
  • The Official Lost Gaming Club's Club Info
  • GIMP Users's Discussion


There are no results to display.

There are no results to display.


  • AtariAge Calendar
  • The Club of Clubs's Events
  • Atari BBS Gurus's Calendar
  • ZeroPage Homebrew's Schedule

Find results in...

Find results that contain...

Date Created

  • Start


Last Updated

  • Start


Filter by number of...


  • Start










Custom Status



Currently Playing

Playing Next

Found 9 results

  1. The ELF computer, which first made its appearance in August 1976 in the Popular Electronics magazine, was a very basic experimenter's board based on the RCA CDP1802 CPU, a rather obscure processor primarily used in embedded systems by the likes of the DOD and NASA. It's main advantage was its simplicity of interfacing and ease of programming. Needless to say that the ELF developed a large following as many hobbyists built their own boards from scratch using the published details in the magazine, and several companies sprung up offering upgraded versions of it. Here's the original article: PopularElecELF.pdf A modern iteration of it is the so-called Membership Card designed by Lee Hart, which reduces the ELF to the size of an Altoids tin, adds 32K of memory (as compared to the original 256 bytes) and replaces the hexadecimal display with a row of LEDs. It also conveniently incorporates a DB25 connector with the computer signals routed to it for easy interfacing. In fact, it is still being developed and sold here. The ELF is programmed by entering CDP1802 machine language in binary using the 8 data switches, and as you might imagine this could become extremely tedious for long programs and very error prone, not to mention the horrendous debugging process using just this set up. Incidentally, I did write a basic monitor for the ELF which could help alleviate the difficulty of program development called ELFMON, and it can be found on the attached disk, but it was still clunky at best. Happily, there was a far better way to go about programming the ELF, using a full-fledged computer to write the program in 1802 assembler, assemble it, and transfer it directly to the ELF using the DB25 connector. And while this could be done using any computer, I decided to do it using the TI 99/4A computer. Essentially it became a retrocomputing project inside another retrocomputer! 😊 The way to go about this is to place a byte on the data lines of the ELF's connector (pins 2-9), toggle the ELF's input switch using pin 1 to store the byte in the ELF's memory, then repeat the process for the rest of the instructions. Clearly, the TI's parallel port would be ideal for this, so I created an adapter cable to connect it to the ELF. The pinout is as follows: TI PIO ELF DB25 1 -------------------->1 2 -------------------->2 3 -------------------->3 4 -------------------->4 5 --------------------->5 6 -------------------->6 7 -------------------->7 8 -------------------->8 9 -------------------->9 12 ------------------->14 From there, it was just a matter of software. The ELF program can written directly on the TI using any one of the available text editors, with the following format: <label><opcode><operand><comment> Each part needs to be separated by a single space. The label is optional and can be up to 6 alpha-numeric characters, the opcode cannot exceed 4 characters, the operand cannot exceed 7 characters, and the comment is optional and of arbitrary length. When referring to a label in the operand field, the label needs to be preceded by a *. Register numbers should be entered as a single hex digit from 0 to F. Numbers should be entered as either 2 or 4 digit hex digits from 0 to F preceded by a >. For example F is entered as >0F. B41 is entered as >0B41. Finally, the last opcode of the program should be the reserved word END . If the formatting is wrong, then the assembler output will be wrong as well! Once the program is typed in, it should be saved in the standard TI DV/80 format. I wrote a primitive CDP 1802 assembler in Rich Extended Basic (RXB) which is my favorite interfacing language because it has facilities to access hardware at the low-level. The assembler is sloooooooooow, but hey it beats flipping switches! The operation of the assembler is self-explanatory: just follow the prompts. Below is a listing of the program: //1802 ASSEMBLER FOR ELF MEMBERSHIP CARD //BY WALID MAALOULI //JANUARY 2020 //VERSION 0.1 CALL CLEAR OPTION BASE 0 DIM REFTABLE$(100),HEX$(16),REFADR(100) RESTORE HexData FOR I=0 TO 15 READ HEXVALUE$:: HEX$(I)=HEXVALUE$ NEXT I CRU=2432 !RS232 CRU OF >1300 DIVIDED BY 2 PRINT " CDP 1802 ASSEMBLER" PRINT " WALID MAALOULI - JAN 2020" PRINT::PRINT::PRINT::PRINT //GET SOURCE FILE ON ERROR InputSource InputSource: INPUT "ENTER SOURCE FILE PATH: ":SOURCE$ OPEN #1:SOURCE$ ON ERROR STOP PRINT::PRINT "1- SEND HEX FILE TO ELF" PRINT "2- ASSEMBLE FILE" PRINT::INPUT FCTN IF FCTN=1 THEN SendELF PRINT::PRINT "ENTER DECIMAL START ADDRESS:" INPUT OFFSET PRINT::PRINT "SELECT OUTPUT OPTION:" PRINT "1- LIST TO SCREEN" PRINT "2- SEND TO PRINTER" PRINT "3- SAVE TO FILE" PRINT "4- SEND TO MEMBERSHIP CARD" PRINT GetOutputSelect: INPUT OUTSEL IF OUTSEL<>1 AND OUTSEL<>2 AND OUTSEL<>3 AND OUTSEL<>4 THEN GetOutputSelect IF OUTSEL=2 THEN OPEN #2:"PIO",OUTPUT IF OUTSEL=4 THEN SendELF IF OUTSEL<>3 THEN StartAsm ON ERROR InputSource1 InputSource1: PRINT INPUT "ENTER SAVE FILE PATH: ":DEST$ OPEN #2:DEST$,OUTPUT ON ERROR STOP GOTO StartAsm SendELF: PRINT PRINT "PREPARE ELF TO RECEIVE DATA:" PRINT PRINT "1-CONNECT CABLE" PRINT "2-LOAD AND CLR SWITCHES DOWN" PRINT "3-READ SWITCH UP" PRINT "4-ALL DATA SWITCHES UP" PRINT PRINT "PRESS ANY KEY WHEN READY" CALL KEY("",0,K,S) IF FCTN=2 THEN StartAsm //TRANSFER HEX FILE TO ELF TransferHex: IF EOF(1) THEN CLOSE #1:: PRINT:: PRINT "TRANSFER COMPLETE!":: STOP LINPUT #1:LINE$ PRINT LINE$ HVAL$=SEG$(LINE$,6,2) CALL HEXDEC(HVAL$,DECVAL) GOSUB SendByte IF SEG$(LINE$,9,1)="" OR SEG$(LINE$,9,1)=" " THEN TransferHex HVAL$=SEG$(LINE$,9,2) CALL HEXDEC(HVAL$,DECVAL) GOSUB SendByte IF SEG$(LINE$,12,1)="" OR SEG$(LINE$,12,1)=" " THEN TransferHex HVAL$=SEG$(LINE$,12,2) CALL HEXDEC(HVAL$,DECVAL) GOSUB SendByte GOTO TransferHex //START OF ASSEMBLY StartAsm: LINE=OFFSET RPOINT=0 PASS=1 PRINT::PRINT "FIRST PASS"::PRINT //READ LINE FROM FILE ReadLine: TEMP$="" TEMP1$="" LINPUT #1:LINE$ IF PASS=1 THEN PRINT SEG$(LINE$,1,19) IF PASS=2 THEN SkipLabel LABEL$=SEG$(LINE$,1,6) FOR I=1 TO LEN(LABEL$) IF SEG$(LABEL$,I,1)<>" " THEN TEMP1$=TEMP1$&SEG$(LABEL$,I,1) NEXT I LABEL$=TEMP1$ SkipLabel: OPCODE$=SEG$(LINE$,8,4) IF SEG$(OPCODE$,1,1)=">" AND PASS=1 THEN OPRNUM=0:: GOTO FirstPass IF SEG$(OPCODE$,1,1)=">" THEN HEXVAL$=SEG$(OPCODE$,2,2):: OPRNUM=0:: OPERAND$="":: GOTO FoundLabel FOR I=1 TO LEN(OPCODE$) IF SEG$(OPCODE$,I,1)<>" " THEN TEMP$=TEMP$&SEG$(OPCODE$,I,1) NEXT I OPCODE$=TEMP$ OPERAND$=SEG$(LINE$,13,7) IF SEG$(OPERAND$,1,1)<>">" THEN NotNumber OPERAND$=SEG$(OPERAND$,2,LEN(OPERAND$)-1) TEMP$="" FOR I=1 TO LEN(OPERAND$) IF SEG$(OPERAND$,I,1)<>" " THEN TEMP$=TEMP$&SEG$(OPERAND$,I,1) NEXT I OPERAND$=TEMP$ NotNumber: IF OPCODE$="END" AND PASS=2 THEN PRINT:: PRINT "ASSEMBLY COMPLETE!":: CLOSE#1:: IF OUTSEL=3 THEN CLOSE #2:: STOP ELSE STOP IF OPCODE$="END" THEN RESTORE #1:: PASS=2:: LINE=OFFSET:: PRINT:: PRINT "SECOND PASS":: PRINT:: GOTO ReadLine //ASSEMBLE LINE IF PASS=2 THEN SearchData IF RPOINT=49 THEN PRINT "REFERENCE TABLE FULL!":: STOP IF LABEL$<>"" THEN REFTABLE$(RPOINT)=LABEL$:: REFADR(RPOINT)=LINE:: RPOINT=RPOINT+1 SearchData: IF SEG$(OPCODE$,1,1)="A" THEN RESTORE AData IF SEG$(OPCODE$,1,1)="B" THEN RESTORE BData IF SEG$(OPCODE$,1,1)="D" THEN RESTORE DData IF SEG$(OPCODE$,1,1)="G" THEN RESTORE GData IF SEG$(OPCODE$,1,1)="I" THEN RESTORE IData IF SEG$(OPCODE$,1,1)="L" THEN RESTORE LData IF SEG$(OPCODE$,1,1)="M" THEN RESTORE MData IF SEG$(OPCODE$,1,1)="N" THEN RESTORE NData IF SEG$(OPCODE$,1,1)="O" THEN RESTORE OData IF SEG$(OPCODE$,1,1)="P" THEN RESTORE PData IF SEG$(OPCODE$,1,1)="R" THEN RESTORE RData IF SEG$(OPCODE$,1,1)="S" THEN RESTORE SData IF SEG$(OPCODE$,1,1)="X" THEN RESTORE XData ReadData: READ OPC$,HEXVAL$,OPRNUM IF OPC$="XXX" THEN PRINT:: PRINT "INCORRECT OPCODE IN LINE ";LINE:: STOP IF OPC$<>OPCODE$ THEN ReadData IF (OPRNUM>0 OR OPRNUM=-1) AND OPERAND$=" " THEN PRINT:: PRINT "MISSING OPERAND IN LINE ";LINE:: STOP IF OPCODE$="INP" THEN OPERAND$=HEX$(VAL(OPERAND$)+8) IF OPRNUM=-1 THEN HEXVAL$=SEG$(HEXVAL$,1,1)&SEG$(OPERAND$,1,1):: OPERAND$="" IF SEG$(OPERAND$,1,1)<>"*" OR PASS=1 THEN FoundLabel OPERAND$=SEG$(OPERAND$,2,LEN(OPERAND$)-1) TEMP$="" FOR I=1 TO LEN(OPERAND$) IF SEG$(OPERAND$,I,1)<>" " THEN TEMP$=TEMP$&SEG$(OPERAND$,I,1) NEXT I OPERAND$=TEMP$ FOR I=0 TO 49 IF REFTABLE$(I)<>OPERAND$ THEN NextEntry CALL HEX(REFADR(I),OPERAND$) IF OPRNUM=1 THEN OPERAND$=SEG$(OPERAND$,3,2) GOTO FoundLabel NextEntry: NEXT I PRINT "LABEL NOT FOUND IN LINE ";LINE:: STOP FoundLabel: IF PASS=1 THEN FirstPass CALL HEX(LINE,HEXLINE$) ASMLINE$=HEXLINE$&" "&HEXVAL$&" "&OPERAND$ PRINT ASMLINE$ IF OUTSEL=4 THEN ElfSend IF OUTSEL=2 OR OUTSEL=3 THEN PRINT #2:ASMLINE$ GOTO FirstPass ElfSend: CALL HEX(HEXVAL$,DECVAL) GOSUB SendByte IF OPRNUM<=0 THEN FirstPass IF LEN(OPERAND$)>2 THEN OPR1$=SEG$(OPERAND$,1,2):: CALL HEX(OPR1$,DECVAL):: GOSUB SendByte:: OPERAND$=SEG$(OPERAND$,3,2) CALL HEXDEC(OPERAND$,DECVAL) GOSUB SendByte FirstPass: IF OPRNUM=-1 THEN OPRNUM=0 LINE=LINE+OPRNUM+1 GOTO ReadLine //OPCODE DATABASE AData: DATA ADC,74,0 DATA ADD,F4,0 DATA ADI,FC,1 DATA AND,F2,0 DATA ANI,FA,1 DATA XXX,XX,0 BData: DATA B1,34,1 DATA B2,35,1 DATA B3,36,1 DATA B4,37,1 DATA BDF,33,1 DATA BN1,3C,1 DATA BN2,3D,1 DATA BN3,3E,1 DATA BN4,3F,1 DATA BNF,3B,1 DATA BNQ,39,1 DATA BNZ,3A,1 DATA BQ,31,1 DATA BR,30,1 DATA BZ,32,1 DATA XXX,XX,0 DData: DATA DEC,20,-1 DATA DIS,71,0 DATA XXX,XX,0 GData: DATA GHI,90,-1 DATA GLO,80,-1 DATA XXX,XX,0 IData: DATA IDL,00,0 DATA INC,10,-1 DATA INP,60,-1 DATA IRX,60,0 DATA XXX,XX,0 LData: DATA LBDF,C3,2 DATA LBNF,CB,2 DATA LBNQ,C9,2 DATA LBNZ,CA,2 DATA LBQ,C1,2 DATA LBR,C0,2 DATA LBZ,C2,2 DATA LDA,40,-1 DATA LDI,F8,1 DATA LDN,00,-1 DATA LDX,F0,0 DATA LDXA,72,0 DATA LSDF,CF,0 DATA LSIE,CC,0 DATA LSKP,C8,0 DATA LSNF,C7,0 DATA LSNQ,C5,0 DATA LSNZ,C6,0 DATA LSQ,CD,0 DATA LSZ,CE,0 DATA XXX,XX,0 MData: DATA MARK,79,0 DATA XXX,XX,0 NData: DATA NOP,C4,0 DATA XXX,XX,0 OData: DATA OR,F1,0 DATA ORI,F9,1 DATA OUT,60,-1 DATA XXX,XX,0 PData: DATA PHI,B0,-1 DATA PLO,A0,-1 DATA XXX,XX,0 RData: DATA REQ,7A,0 DATA RET,70,0 DATA XXX,XX,0 SData: DATA SAV,78,0 DATA SD,F5,0 DATA SDB,75,0 DATA SDBI,7D,1 DATA SDI,FD,1 DATA SEP,D0,-1 DATA SEQ,7B,0 DATA SEX,E0,-1 DATA SHL,FE,0 DATA SHLC,7E,0 DATA SHR,F6,0 DATA SHRC,76,0 DATA SKP,38,0 DATA SM,F7,0 DATA SMB,77,0 DATA SMBI,7F,1 DATA SMI,FF,1 DATA STR,50,-1 DATA STXD,73,0 DATA XXX,XX,0 XData: DATA XOR,F3,0 DATA XRI,FB,1 DATA XXX,XX,0 //Hexadecimal numbers HexData: DATA 0,1,2,3,4,5,6,7,8,9,A,B,C,D,E,F //SEND DATA TO ELF ROUTINE SendByte: CALL IO(3,1,CRU,1) !TURN ON RS232 CARD CALL IO(3,1,CRU+7,1) !TURN ON RS232 LED CALL IO(3,1,CRU+2,1) !SET HANDSHAKE OUT LINE TO HIGH CALL IO(3,1,CRU+1,0) !SET PIO PORT TO OUTPUT CALL LOAD(20480,DECVAL) !PLACE BYTE ON PIO PORT CALL IO(3,1,CRU+2,0) !CYCLE THE HANDSHAKE OUT LINE CALL IO(3,1,CRU+7,0) CALL IO(3,1,CRU+2,1) !TURN RS232 LED OFF CALL IO(3,1,CRU,0) !TURN OFF RS232 RETURN The attached disk contains the assembler called ELFASM as well as 3 programs for the ELF. I use the extension _S to indicate that this is the text source file which contains the assembly language code as well as the program instructions, and the _HEX extension to indicate that this is the assembled hexadecimal version of the program suitable for downloading to the ELF. Feel free to use your own extensions as you see fit. ELFMON is the ELF monitor program I mentioned earlier CYLON is a small demo of the Cylon Eyes effect on the ELF's LED's (a.k.a Battlestar Galactica) HILO is a small game where you have to guess a random computer picked number with as few guesses as possible ELFASM can assemble a source file and then output it to the screen, to a file in HEX format, to the parallel printer, or transfer it to the ELF directly using the adapter cable. You can also load a previously assembled HEX file and transfer it to the ELF without the need of assembling it. And here's a video of the entire project. As is usual with my hobby projects, it is highly unlikely anyone else will find this useful outside of myself, but hey, it was a great learning experience ELF.dsk
  2. Hey all, I haven't been using my TI much as of late, and I wanted to get back into things with a nice game of centipede. I don't own the game, but I have a ROM of it and in the past was able to play it using the editor assembler cart along with my nanoPEB so that I could assemble and run the game from my CF card. Unfortunately, I cannot remember how to do it now. Everything is set up, I have the editor/assembler diskettes on the CF card as well and they are working just fine. I can load the assembler and everything, I just can't figure out how to get this centipede assembly file working. From what I remember I need a .DSK file, and to copy that to the CF card, then I need to mount it on the TI into disk 3, then I need to call something like DSK3.CENT, but that doesn't seem to be working. Any ideas?
  3. The Heathkit Hero Jr robot came out in 1984 as a more home friendly version of the original Hero 1 robot, but was still equipped with multiple sensors, speech and programming capabilities albeit without a robotic arm attachment. I bought my robot on Ebay and upgraded it with extra memory (24K), an updated ROM, serial communication and a multi-cartridge which combined all of the cartridges produced for the Hero Jr into one master cart, as well as a beefy 10Ah battery and full documentation. The Robot Workshop (https://www.robotworkshop.com/robotweb/) still has most parts, upgrades and documentation for the Hero Jr at very reasonable prices. Manufacturer Heathkit Type robot Release date 1984 Introductory price Kit US$599.95, Assembled US$1000[3] Discontinued Before October 1987 (Assembled)[15] 1995 (Kit) Units sold 4000 (across 8 years) CPU Motorola 6808 1 MHz Memory RAM: 2 kB, expandable to 24 kB Monitor ROM: 32 kB Display 9 LEDs Sound Votrax SC-01 speech synthesizer[5] Input Hex keypad with 17 keys Power Batteries:6 V 3.8 A·h x2, x4 optional Dimensions 19 inches high[16] Mass 21.5 pounds[16] The interesting thing is that all the electronics are located in the "head" of the robot and under the front panel, while the drive mechanism and battery are in the bottom part, leaving most of the mid-section open, which was very inviting for modifications and modern upgrades. And while I dabbled with this idea for a while, I ended up deciding not to modify the robot from its original condition and opting to experiment with using the serial port as the only means of communication with it. The Hero Jr is capable of baud rates from 300 to 9600 with Even parity and 7 data bits. An early experiment I did involved a wired serial connection to a Raspberry Pi Model B where I had a Pi camera recognize a ball using the OpenCV framework running on the Rpi, and the result was communicated to the Hero Jr who in turn verbalized it using its on-board speech synthesizer: This served as a proof of concept, but I really wanted to ditch the serial tether and go completely wireless. I also wanted to use the TI 99/4A computer, and I already had quite a bit of experience with wireless serial communication on it from my previous wireless weather station project: The main problem I ran into was the the Xbee transceiver I used for that project did not support 7 data bits, only 8, and it turned out that almost all available modern transceivers had the same issue!. Luckily, I finally was able to find a very cheap Chinese transceiver called the HC-12 which costs less than $5 per module and supports a wide range of communication parameters. It's really designed for use with an Arduino, but with the addition of a GPIO to serial converter, one can connect it to a standard computer terminal. From there, I went through a couple of experimental tests as shown below. The main difficulty encountered was the very short range of the coil antenna that comes stock with the HC-12 module, and so this required upgrading it to beefier coax antenna. From there I was finally ready to put the project together using the TI 99/4A computer. I opted to use RXB on the TI side because it allowed low-level access to the serial card using the CALL IO command, something not available on other Basics. This was necessary because the HC-12 was not very reliable in its wireless transmissions and communication was frequently dropped, thus requiring a form of communication time-out feature in order to resend dropped data packets. Here's the code for the TI. You might note that there are a lot of repetitive routines which could not be consolidated into subroutines because the ON ERROR command in Extended Basic does not work within subroutines. // HERO Jr remote exploration program // November 2019 // INITIALIZATION CALL CLEAR OPTION BASE 1 DIM MAP(23,32) HOMEX=16 HOMEY=12 PRANGE=0 TCOUNT=0 DIR=1 !1=N 2=E 3=S 4=W OPEN #1:"RS232.BA=9600.DA=7.PA=E.EC",UPDATE CRU=2464 !CRU ADDRESS OF TMS9902 (>1340) DIVIDED BY 2 // CHECK IF ROBOT IS READY PRINT "CHECKING ROBOT STATUS" CheckStatus: CALL IO(3,1,CRU+18,0) PRINT #1:65 GOSUB BytePresent IF FLAG=0 THEN CheckStatus Status: ON ERROR Status INPUT #1:ANS$ ON ERROR STOP IF VAL(ANS$)<> 1 THEN CheckStatus ELSE PRINT "ROBOT IS READY!": : PRINT "PRESS ANY KEY TO START" GetKey: CALL KEY(0,K,S) IF S=0 THEN GetKey // SET UP DISPLAY CALL CLEAR // CHARACTER DEFINITIONS CALL CHAR(104,"FFFFFFFFFFFFFFFF") !BLACK LEVEL 0-20 CALL CHAR(112,"FFFFFFFFFFFFFFFF") !GRAY LEVEL 21-100 CALL CHAR(120,"FFFFFFFFFFFFFFFF") !WHITE LEVEL 101-255 CALL CHAR(105,"FFC3A59999A5C3FF") !OBSTACLE CALL CHAR(106,"183C5A9918181818") !UP ARROW CALL CHAR(107,"080402FFFF020408") !RIGHT ARROW CALL CHAR(108,"18181818995A3C18") !DOWN ARROW CALL CHAR(109,"102040FFFF402010") !LEFT ARROW DIRSPR=106 CALL COLOR(10,2,16,11,15,16,12,16,16) CALL SPRITE(#1,DIRSPR,9,(HOMEY-1)*8+1,(HOMEX-1)*8+1) // START EXPLORATION RX=HOMEX RY=HOMEY Explore: TCOUNT=TCOUNT+1 IF TCOUNT>10 THEN Home // GET LIGHT LEVEL LightInput: CALL IO(3,1,CRU+18,0) !CLEAR RECEIVE BUFFER PRINT #1:6 !Read light sensor GOSUB BytePresent !WAIT FOR BYTE TO COME IN IF FLAG=0 THEN LightInput Status1: ON ERROR Status1 INPUT #1:LIGHT$ ON ERROR STOP IF VAL(LIGHT$)<21 THEN CALL HCHAR(RY,RX,104) ELSE IF VAL(LIGHT$)<101 THEN CALL HCHAR(RY,RX,112) ELSE CALL HCHAR(RY,RX,120) CALL DELAY(1) // Check for movement in front of robot MotionCheck: CALL IO(3,1,CRU+18,0) ! CLEAR RECEIVE BUFFER PRINT #1:8 !Read infrared sensor GOSUB BytePresent IF FLAG=0 THEN MotionCheck Status7: ON ERROR Status7 INPUT #1:HEAT$ ON ERROR STOP IF VAL(HEAT$)=0 THEN RangeInput DISPLAY AT(24,1)BEEP:"MOTION DETECTED!" Speak1: CALL IO(3,1,CRU+18,0) !CLEAR RECEIVE BUFFER PRINT #1:9 !Speak CALL DELAY(1) PRINT #1:1 !PLEASE MOVE CLEAR OF ME GOSUB BytePresent IF FLAG=0 THEN Speak1 Status8: ON ERROR Status8 INPUT #1:ANS$ ON ERROR STOP IF VAL(ANS$)<>89 THEN Speak1 DISPLAY AT(24,1):" " GOTO MotionCheck // Check for obstacles RangeInput: CALL IO(3,1,CRU+18,0) !CLEAR RECEIVE BUFFER PRINT #1:7 !Read sonar GOSUB BytePresent IF FLAG=0 THEN RangeInput Status2: ON ERROR Status2 INPUT #1:RANGE$ ON ERROR STOP IF VAL(RANGE$)>40 AND ((DIR=1 AND RY>2) OR (DIR=2 AND RX<31) OR (DIR=3 AND RY<22) OR (DIR=4 AND RX>2)) THEN GOTO PathClear IF DIR=1 THEN CALL HCHAR(RY-1,RX,105):: MAP(RY-1,RX)=1 IF DIR=2 THEN CALL HCHAR(RY,RX+1,105):: MAP(RY,RX+1)=1 IF DIR=3 THEN CALL HCHAR(RY+1,RX,105):: MAP(RY+1,RX)=1 IF DIR=4 THEN CALL HCHAR(RY,RX-1,105):: MAP(RY,RX-1)=1 Speak2: CALL IO(3,1,CRU+18,0) !CLEAR RECEIVE BUFFER PRINT #1:9 !Speak CALL DELAY(1) PRINT #1:2 !OBSTACLE DETECTED GOSUB BytePresent IF FLAG=0 THEN Speak2 StatusObs: ON ERROR StatusObs INPUT #1:ANS$ ON ERROR STOP IF VAL(ANS$)<>89 THEN Speak2 //Back up Reverse: CALL IO(3,1,CRU+18,0) !CLEAR RECEIVE BUFFER PRINT #1:2 GOSUB BytePresent IF FLAG=0 THEN Reverse Status3: ON ERROR Status3 INPUT #1:ANS$ ON ERROR STOP IF ANS$<>"89" THEN Reverse IF DIR=1 THEN RY=RY+1 IF DIR=2 THEN RX=RX-1 IF DIR=3 THEN RY=RY-1 IF DIR=4 THEN RX=RX+1 CALL LOCATE(#1,(RY-1)*8+1,(RX-1)*8+1) CALL DELAY(2) //Check for surrounding blocked path IF DIR=1 THEN CALL GCHAR(RY,RX+1,BLOCK):: GOTO Turn IF DIR=2 THEN CALL GCHAR(RY+1,RX,BLOCK):: GOTO Turn IF DIR=3 THEN CALL GCHAR(RY,RX-1,BLOCK):: GOTO Turn CALL GCHAR(RY-1,RX,BLOCK) Turn: IF BLOCK<>105 THEN Go_Right ELSE Go_Left //Turn right Go_Right: CALL IO(3,1,CRU+18,0) !CLEAR RECEIVE BUFFER PRINT #1:4 GOSUB BytePresent IF FLAG=0 THEN Go_Right Status4: ON ERROR Status4 INPUT #1:ANS$ ON ERROR STOP IF ANS$<>"89" THEN Go_Right DIR=DIR+1 DIRSPR=DIRSPR+1 IF DIR>4 THEN DIR=1::DIRSPR=106 CALL PATTERN(#1,DIRSPR) CALL DELAY(2) IF HFLAG=1 THEN Home GOTO Explore //Turn left Go_Left: CALL IO(3,1,CRU+18,0) !CLEAR RECEIVE BUFFER PRINT #1:5 GOSUB BytePresent IF FLAG=0 THEN Go_Left Status6: ON ERROR Status6 INPUT #1:ANS$ ON ERROR STOP IF ANS$<>"89" THEN Go_Left DIR=DIR-1 DIRSPR=DIRSPR-1 IF DIR<1 THEN DIR=4::DIRSPR=109 CALL PATTERN(#1,DIRSPR) CALL DELAY(2) IF HFLAG=1 THEN Home GOTO Explore //Move forward PathClear: CALL DELAY(1) Forward: CALL IO(3,1,CRU+18,0) !CLEAR RECEIVE BUFFER PRINT #1:3 GOSUB BytePresent IF FLAG=0 THEN Forward Status5: ON ERROR Status5 INPUT #1:ANS$ ON ERROR STOP IF ANS$<>"89" THEN Forward IF DIR=1 THEN RY=RY-1 IF DIR=2 THEN RX=RX+1 IF DIR=3 THEN RY=RY+1 IF DIR=4 THEN RX=RX-1 CALL LOCATE(#1,(RY-1)*8+1,(RX-1)*8+1) CALL DELAY(2) IF HFLAG=1 THEN Home GOTO Explore // Go home routine Home: HFLAG=1 IF RX=HOMEX AND RY=HOMEY THEN DISPLAY AT(24,1)BEEP:"AT HOME!":: GOTO GetKey1 ELSE DISPLAY AT(24,1)BEEP:"GOING HOME..." Speak3: CALL IO(3,1,CRU+18,0) !CLEAR RECEIVE BUFFER PRINT #1:9 !Speak CALL DELAY(1) PRINT #1:3 !GOING HOME GOSUB BytePresent IF FLAG=0 THEN Speak3 StatusHome: ON ERROR StatusHome INPUT #1:ANS$ ON ERROR STOP IF VAL(ANS$)<>89 THEN Speak3 IF RY>HOMEY AND MAP(RY-1,RX)=0 THEN TDIR=1:: GOTO CheckFacing IF RY<HOMEY AND MAP(RY+1,RX)=0 THEN TDIR=3:: GOTO CheckFacing IF RX>HOMEX AND MAP(RY,RX-1)=0 THEN TDIR=4:: GOTO CheckFacing IF RX<HOMEX AND MAP(RY,RX+1)=0 THEN TDIR=2:: GOTO CheckFacing GOTO Explore CheckFacing: IF DIR<>TDIR THEN FacingTurn ForwardH: CALL IO(3,1,CRU+18,0) !CLEAR RECEIVE BUFFER PRINT #1:3 GOSUB BytePresent IF FLAG=0 THEN ForwardH StatusHF: ON ERROR StatusHF INPUT #1:ANS$ ON ERROR STOP IF ANS$<>"89" THEN ForwardH IF DIR=1 THEN RY=RY-1 IF DIR=2 THEN RX=RX+1 IF DIR=3 THEN RY=RY+1 IF DIR=4 THEN RX=RX-1 CALL LOCATE(#1,(RY-1)*8+1,(RX-1)*8+1) CALL DELAY(2) GOTO Home FacingTurn: IF ABS(TDIR-DIR)>2 AND TDIR<DIR THEN TurnRightH IF ABS(TDIR-DIR)>2 AND TDIR>DIR THEN TurnLeftH IF TDIR<DIR THEN TurnLeftH TurnRightH: CALL IO(3,1,CRU+18,0) !CLEAR RECEIVE BUFFER PRINT #1:4 GOSUB BytePresent IF FLAG=0 THEN TurnRightH StatusHR: ON ERROR StatusHR INPUT #1:ANS$ ON ERROR STOP IF ANS$<>"89" THEN TurnRightH DIR=DIR+1 DIRSPR=DIRSPR+1 IF DIR>4 THEN DIR=1::DIRSPR=106 CALL PATTERN(#1,DIRSPR) CALL DELAY(2) GOTO CheckFacing TurnLeftH: CALL IO(3,1,CRU+18,0) !CLEAR RECEIVE BUFFER PRINT #1:5 GOSUB BytePresent IF FLAG=0 THEN TurnLeftH StatusHL: ON ERROR StatusHL INPUT #1:ANS$ ON ERROR STOP IF ANS$<>"89" THEN TurnLeftH DIR=DIR-1 DIRSPR=DIRSPR-1 IF DIR<1 THEN DIR=4::DIRSPR=109 CALL PATTERN(#1,DIRSPR) CALL DELAY(2) GOTO CheckFacing // Resume exploration GetKey1: CALL KEY(0,K,S) IF S=0 THEN GetKey1 DISPLAY AT(24,1):" " HFLAG=0 GOTO Explore // Check for incoming byte over serial line BytePresent: COUNTER=0 CheckByte: CALL IO(2,1,CRU+21,BYTEIN) IF BYTEIN=0 THEN COUNTER=COUNTER+1 ELSE FLAG=1:: RETURN IF COUNTER>50 THEN FLAG=0:: DISPLAY AT(24,1)BEEP:"TIME OUT! RETRYING...":: CALL DELAY(1):: DISPLAY AT(24,1):" ":: RETURN ELSE GOTO CheckByte // Delay routine SUB DELAY(DUR) FOR I=1 TO DUR*100 NEXT I SUBEND On the Hero Jr side, I ran a very simple Basic program which accepted coded commands mapped to specific robot functions and executed them, and also sent back sensor data and communication acknowledgments. All actual control and decision making was made by the TI. 1 REM HERO ROAM PROGRAM 10 INPUT C 20 IF C<>65 THEN GOTO 10 21 FOR I=1 TO 100:NEXT I 22 PRINT 1 30 INPUT C 35 IF C<1 THEN GOTO 30 36 IF C>9 THEN GOTO 30 40 ON C GOSUB 500,600,700,800,900,1000,1100,1200,1300 50 GOTO 30 500 REM FORWARD 5 UNITS 510 FWD 5 511 GOSUB 1510 515 PRINT 89 520 RETURN 600 REM BACKWARD 5 UNITS 610 BWD 5 611 GOSUB 1510 615 PRINT 89 620 RETURN 700 REM FORWARD 10 UNITS 710 FWD 10 711 GOSUB 1510 715 PRINT 89 720 RETURN 800 REM RIGHT ROTATION 810 RIGHT 90 811 GOSUB 1510 815 PRINT 89 820 RETURN 900 REM LEFT ROTATION 910 LEFT 90 911 GOSUB 1510 915 PRINT 89 920 RETURN 1000 REM LIGHT LEVEL DETECTION 1010 L=EYE 1011 GOSUB 1510 1015 PRINT L 1020 RETURN 1100 REM RANGE MEASUREMENT 1105 R=SONAR 1110 GOSUB 1510 1115 PRINT R 1120 RETURN 1200 REM INFRARED HEAT DETECTION 1210 I=MOTION 1211 GOSUB 1510 1215 PRINT I 1220 RETURN 1300 REM SPEAK FUNCTION 1305 INPUT C 1306 IF C<1 THEN GOTO 1305 1307 IF C>3 THEN GOTO 1305 1308 ON C GOTO 1310,1340,1370 1309 REM PLEASE MOVE CLEAR OF ME 1310 SPEAK "PLEZHPA1MOO1VPA1KLEERPA1OVPA1MEE" 1315 GOSUB 1510 1320 PRINT 89 1330 RETURN 1335 REM OBSTACLE DETECTED 1340 SPEAK "OBSTAEKLPA1DE1TEH3KTEHD" 1345 GOSUB 1510 1350 PRINT 89 1360 RETURN 1365 REM GOING HOME 1370 SPEAK "GOWINGPA1HO1O1MM" 1375 GOSUB 1510 1380 PRINT 89 1390 RETURN 1500 REM DELAY SUBROUTINE 1510 FOR T=1 TO 200:NEXT T 1520 RETURN > And here's the final result: Another fun one
  4. Our intention is to collect as much historical background to the Why, When, Who and How GPL came to be. Please contribute by commenting to this topic. Things like : 1. When did it all start ? 2. Why ? 3. Who worked on it's development and interpreter ? 4. What was the real purpose ? 5. How does it compare to other languages ? 6. What can we do with it today ? 7. Coding in GPL in the 1980's compared to 2020 the stark difference. 8. What commercial software was written in GPL ? 9. Who were the important people around this language ? 10. Links to important material. If we can collect snippets of information from as many people as possible we can then compile it into a solid web page that will serve as a historical snapshot of this quirky yet beautiful language that time almost forgot. Thanks for your contributions. We will share a link to the webpage that will contain all you need to know about GPL as soon as we set it up.
  5. Hi, So I'm getting my computer room/office set up and I just got my TI 99/4a setup and now I've run into a strange issue. When I turn on my TI 99/4a with the PEB turned on, the screen flashes for a moment and then turns black. When I turn the TI 99/4a on without the PEB being on, I get the usual ready screen and can access basic or cartridges. the disk drive in the PEB spins the disk with the red ractivity light on for a moment when the computer is turned on. I've tried cleaning out the connectors on the 99's expansion port and the PEB's connector with quick drying contact cleaner, which got a lot of grime out but hasn't change the function. Anyone here know how this is supposed to work/know whats up? I've got a couple floppies that are supposed to be new with games and an auto loader on them as well as the disk manager 2 cartridge.
  6. So a while back I bought a 5.25 floppy drive to copy old floppies. I found out my PC was to new and the BIOS couldn't work with it. The other day I rescued a Compaq Deskpro 2000 from the curb and I stuck the drive in there. I popped in an old Lotus 1 2 3 disk and the thing works. Now I want to start copying some 99/4a roms onto some floppies but I'm not sure how to go about it. What software will I use for this? Do I want to use an emulator? This thing is running Win 98 and has no USB or ethernet so im probably going to have to burn cd's to bring files to it so I want to get this right without burning coasters. I'm hoping someone experienced with this can point me in the right direction. Thanks.
  7. Sid1968

    WTB: TI-99/4a

    If someone would sell me a working TI-99/4a for a friendly price i would be glad. Alternativly i can offer in exchange for a full working TI-99/4a a full working recapped (New electolytic capacitors) Commodore C64 (PAL) or VIC-20 (NTSC or PAL). Kind Regards from Germany Sid1968
  8. I've got my old TI 99/4A but can't find the power supply. The CV PS has the same connector. I read that the CV PS is regulated but that the 99/4A PS is unregulated, so you should never use the 99/4A PS on the CV. However, what about the other way around? Can I use the CV PS on the 99/4A without frying the computer? Thanks for any thoughts.
  9. Davvel

    ti99 VRAM 1

    From the album: Repairing TI 99/4A

    A few photos whilst repairing my TI 99/4A

    © None

  • Create New...