Jump to content


  • Content Count

  • Joined

  • Last visited

Community Reputation

642 Excellent

About pixelpedant

  • Rank

Profile Information

  • Gender
  • Location

Recent Profile Visitors

2,152 profile views
  1. Yeah, you'll have lots to explore even just in the 8K domain. And the 32K sidecar (or a NanoPEB) may have appeal down the line, if you ever want to open yourself up to the remainder of the library.
  2. Well, considering this problem at length, I concluded that while I had not initially found myself solution there, Harry Wilhelm was still probably the solution to all the problems in the XB universe (or at least those not addressed by RXB). So I dug through the TML 2.0 documentation and used HMLOADER, provided and documented there, to embed and run the text-to-speech routines from high memory, with XB256 loaded in low memory. This worked, and constitutes a solution, it would seem, to the desire to use the text-to-speech routines (well, I don't actually care about text-to-speech per se - really just allophone to LPC translation) in XB256, with its timing and sound features.
  3. Thanks. Alas, that probably addresses that then. If the text-to-speech disk pretty much fills the low 8K. Too bad. If it were possible, they'd be a killer solution for timed and tone and slope adjusted speech with music (i.e., the TI-99 "singing" in time and in tune) since XB256 provides a solution for loop timing and creation and use of of compressed/assembled sound lists independent/simultaneous with execution of XB code, and the text-to-speech disk provides a solution for playing allophone speech from XB. So at present, I can get speech from within an XB program that is simultaneously playing music (using XB256), and which even handles timing of loops involving speech events. And I can get tone and slope adjusted speech from within XB (using the Text-to-Speech disk). But the dream would be to do both those things at once. Perhaps my quest continues. To make my TI-99/4A (LPC) sing to its own (PSG) music from within XB. But that would have been a sweet combo to make it happen.
  4. Well, a timely thread, as stuck I am, at the moment. What I'm interested in doing, is using the routines from the Text-to-Speech disk (SPEAK and XLAT, but really just SPEAK for present purposes) under XB256. Now, they work fine via standard XB, via the straightforward setup: CALL INIT :: CALL LOAD("DSKl.SETUP","DSKl.XLAT","DSKl.SPEAK") And if going in to standard XB via the XB256 menu, that'll still work as long as I don't CALL INIT. But in XB256, I get "* MEMORY FULL" when attempting to load any of these (on all of MAME, Classic99 and real iron). Is it possible, do you think, for these two packages to be made to coexist? Or is this truly just a case of two sets of libraries that want too much low memory to themselves.
  5. Yep. Still have my TI-99/4A. I occasionally think about replacing it, as it's not the most aesthetically appealing TI-99/4A out there. But it still works (and I use it literally every day, with almost no exceptions). I don't have a lot of carts from the 80s. I never tried to collect any but the ones I had regular use for. And those were few enough. Extended BASIC and Terminal Emulator II account for about 95% of my TI-99/4A usage.
  6. Thank you for explaining the data structure! And confirming you can dump just any damn data you feel like into a DATA statement (given the means). It just seems to me that in a scenario where you've got, say, 120 bytes of allophone data you want to read and use all at once at some point in a program, it's appealing to just have a single DATA line inside the program from which you read it, instead of either 1) having an extra supporting data file just for the sake of it or 2) listing 120 decimal values in DATA statements, which you then CHR$() and concatenate one by one.
  7. So there are scenarios where it would be really nice for the sake of portability to be able to dump sequences of semi-arbitrary byte/string data not strictly limited to the set of visible characters into DATA statements, in XB. XB256 does this sort of thing with compressed strings (of screen image data, etc.). My main question towards this end, consequently is: what special characters/values/ranges need to be avoided (e.g., as values with special significance to the file and DATA statement structure itself), in this sort of scenario? What byte values are illegal or reserved, in an XB DATA statements (or program text in general)? I suppose this option is only really relevant to scenarios where bytes will never be of certain illegal values (or the data has been encoded to avoid them). But the one I'm thinking about right now (Text-to-Speech disk allophone data) might happen to be one such case (only a relatively small subset of values are ever going to be used). I'm actually pretty sure I've seen someone do this before with allophone data, but I can't remember where. I suppose it's also worth asking whether this answer differs in Console BASIC. Since at the moment, I'm dealing with allophone data in XB. But more often, I've dealt with it in Console BASIC (because TE2).
  8. Huh. Wonder why that space doesn't appear in the TI99Dir listing of the program. Bug I guess. Since it's definitely there, in the program itself.
  9. Huh, neat, yeah. Here's source, if anyone without Gamebase wants to play with it: 100 ! NEW SOFT TI 99/4A 110 GOTO 150 :: S,A$,PT,K,C,A,TM,FRD,HT :: CALL CLEAR :: CALL SCREEN :: CALL CHAR :: CALL MAGNIFY 120 DATA 32,2,1000,36,12,10,104,15,300,108,10,0,128,5,500,124,16,0,132,5,500,124,16,0 130 DIM PAT(15),COL(15),AM(15) 140 [email protected] 150 ON WARNING NEXT 160 CALL CLEAR :: CALL SCREEN(2) 170 FOR A=4 TO 15 :: READ PAT(A),COL(A),AM(A) :: NEXT A 180 CALL CHAR(92,"000000030000000000000000000000000C30C000000000000000000") 190 CALL CHAR(36,"03071F1F1F3F3F7F7FFFFFFF7F1F00008080808000000000C0E0E0E0C") 200 CALL CHAR(32,"6030180C050103273F0E00000000000000000080000080C08") 210 CALL CHAR(108,"000000003F3F3F3F3F3F3F3F3F1F070000000000FCFCFCFCFCFCFCFCFCF8E") 220 CALL CHAR(104,"071F3F7F7F3F1F474020180700000000E0F8FCFEFEFCF8E2020418E") 230 CALL CHAR(120,"102349D367339E7117317BA76DF0B71105123871C46E55022AF2CFE64C196F86") 240 CALL CHAR(96,"FFFF0C183060FFFF183C66C3FFFFC3C3C3E7663C3C66E7C37EFFC3C3C3C3FF7E") 250 CALL CHAR(100,"C3E3F3DBCFC7C3C37EE7C1781E83E77E",64,"3C4299A1A199423C") 260 FOR A=3 TO 8 :: CALL COLOR(A,16,2) :: NEXT A :: CALL COLOR(1,2,2,9,8,2) 270 DISPLAY AT(12,8):"`abbcde TRAINER" :: DISPLAY AT(20,5):"PRESS ANY KEY TO BEGIN": : : :"@1985 NEW SOFTWARE TI 99/4A" 280 CALL KEY(0,K,S) :: IF S=0 THEN 280 290 DISPLAY AT(1,12)ERASE ALL BEEP:"OPTIONS": : : :"PRESS": :" 1 FOR FIRE": :" 2 FOR ESCAPE": :" 3 FOR GROUND": :" 4 FOR ENDING" 300 CALL KEY(0,K,S) :: IF K>52 OR K<49 THEN 300 310 IF K=52 THEN CALL CLEAR :: STOP 320 DISPLAY AT(20,1):"NUMBER OF TIMES? 200" :: ACCEPT AT(20,19)BEEPSIZE(-3)VALIDATE(DIGIT):TM 330 DISPLAY AT(1,1)BEEP ERASE ALL :: RANDOMIZE 340 CALL MAGNIFY(3) :: A$="0000000000000000" :: CALL CHAR(96,"181E1FFF3F0F0F00"&A$&"1C7CF8F0F0F0F0F03") 350 CALL CHAR(124,"0000071F3F7F7F3F1F070000000000000000E0F8FCFEFEFCF8E") 360 CALL CHAR(128,"030F0F03000000000000000000000000C0F0F0C030F80E030") 370 CALL CHAR(132,"030F0F030C1F70C00000000000000000C0F0F0C0000000000") 380 CALL CHAR(100,"000003FF3F0F0F00"&A$&"0C7CF8F0F0F0F0F03") 390 CALL CHAR(112,"000002201406334B1F3F5F3F2F050000002122889CB8F8FCFFFCFDFCFEF88") 400 CALL CHAR(116,"000000000000000101070F0701000000000000000000002040E0E0F04") 410 CALL CHAR(136,"0C0F0F0F0F0F1F3E300000000000000060E0F0F0FCFFE0000") 420 CALL COLOR(1,14,14,3,2,14,4,2,14) 430 CALL SPRITE(#1,96,16,147,90,#2,100,2,154,90) 440 ON K-48 GOSUB 580,460,500 450 GOTO 240 460 CALL COLOR(1,2,2) :: FOR A=3 TO 5 :: C=INT(58*RND)+28 :: HT=C*2+50 :: CALL SPRITE(#A,136,A+9,C,HT) :: NEXT A :: FRD=1 470 CALL LOCATE(#2,147,90) :: CALL PATTERN(#2,112) 480 HT=3 :: FOR A=1 TO TM :: DISPLAY AT(1,1):A :: CALL SHIP :: FRD=-FRD :: HT=HT+1+3*(HT=5) :: C=INT(3*RND)+2 :: K=C*2 :: CALL MOTION(#HT,FRD*C,FRD*K) 490 CALL THEY(HT+1+3*(HT=5)) :: NEXT A :: CALL DELSPRITE(ALL) :: CALL CLEAR :: RETURN 500 FOR A=4 TO 14 STEP 2 :: C=INT(255*RND)+1 :: CALL SPRITE(#A,PAT(A),COL(A),C,248,4,-8,#A+1,PAT(A+1),COL(A+1),C,247,4,-8) :: NEXT A 510 FOR A=1 TO TM :: CALL SHIP :: CALL DEST :: NEXT A 520 CALL MOTION(#1,0,0,#2,0,0) :: DISPLAY AT(12,5)BEEP:"PRESS REDO OR BACK" 530 FOR A=1 TO 200 :: NEXT A 540 FOR A=1 TO 300 :: CALL KEY(0,K,S) 550 IF K=6 THEN CALL CLEAR :: GOTO 510 ELSE IF S THEN 570 560 NEXT A 570 CALL DELSPRITE(ALL) :: CALL CLEAR :: RETURN 580 FOR A=4 TO 10 STEP 2 :: C=INT(255*RND)+1 :: CALL SPRITE(#A,PAT(A),COL(A),C,248,3,-6,#A+1,PAT(A+1),COL(A+1),C,247,3,-6) :: NEXT A 590 PT,HT,FRD=0 600 FOR A=1 TO TM :: CALL FIRE(PAT(),COL(),AM(),HT,FRD,PT) :: DISPLAY AT(24,3):A :: NEXT A :: CALL DELSPRITE(ALL) 610 DISPLAY AT(3,1)ERASE ALL BEEP:"TIMES:";TM: :"SHOTS FIRED:";FRD: :"HIT TARGETS:";HT 620 DISPLAY AT(9,1):"PERCENTAGE OF HITS:";INT(HT*100/FRD): :"ABILITY:";INT(HT*100/TM): :"SCORE:";PT: :"SCORE RATE:";INT(PT/TM) 630 FOR A=1 TO 500 :: NEXT A 640 CALL KEY(0,K,S) :: IF S=0 THEN 640 650 CALL CLEAR :: RETURN 660 DATA 32,2,0,36,12,0,104,15,0,108,10,0 670 [email protected]+ 680 SUB SHIP 690 CALL KEY(2,K,S) :: X=3*((K=2)-(K=3)) 700 Y=6*((K=2)-(K=3)) :: CALL MOTION(#1,X,Y,#2,X,Y) 710 SUBEND 720 SUB FIRE(PAT(),COL(),AM(),HT,FRD,PT) 730 CALL SHIP :: CALL KEY(1,K,S) :: IF S=0 THEN SUBEXIT ELSE CALL POSITION(#1,X,Y,#2,X1,Y) :: FRD=FRD+1 740 CALL SPRITE(#3,92,16,X,Y,-60,120) :: FOR A=4 TO 10 STEP 2 :: CALL POSITION(#A,X,Y2) 750 IF ABS((Y2-Y)/(X1-X)-2)<.3 THEN CALL COLOR(#A,12,#A+1,10) :: CALL PATTERN(#A,116,#A+1,112) :: CALL SOUND(-400,-5,0)ELSE 780 760 CALL DELSPRITE(#3) :: CALL SHIP :: C=INT(256*RND)+1 :: CALL PATTERN(#A,120) :: PT=PT+AM(A) :: DISPLAY AT(1,1):USING "######":PT 770 HT=HT+1 :: CALL SPRITE(#A,PAT(A),COL(A),C,248,3,-6,#A+1,PAT(A+1),COL(A+1),C,247,3,-6) :: SUBEXIT 780 NEXT A :: CALL DELSPRITE(#3) 790 SUBEND 800 SUB DEST 810 CALL SHIP :: FOR A=4 TO 14 STEP 2 :: CALL COINC(#1,#A,9,DE) 820 IF DE THEN CALL SOUND(500,-7,0) :: C=250*RND+3 :: CALL LOCATE(#A,C,248,#A+1,C,247) :: SUBEXIT 830 NEXT A 840 SUBEND 850 SUB THEY(HT) 860 CALL POSITION(#1,X,Y,#HT,X1,Y1) :: CALL SPRITE(#6,92,9,X1,Y1,45,-90) :: IF ABS((Y1-Y)/(X-X1)-2)>.3 THEN SUBEXIT 870 CALL PATTERN(#1,120) :: CALL COLOR(#1,12,#2,10) :: CALL SOUND(-300,-7,0) :: CALL DELSPRITE(#6) :: CALL DEST :: CALL COLOR(#2,2,#1,16) 880 CALL PATTERN(#1,96) 890 SUBEND
  10. Can't really blame the vendor for advertising it though, given Datasoft had explicitly announced an April release. Presumably that ad was submitted well ahead of time and was just assuming the title would be available by publication (as promised).
  11. Oh, here's another tidbit, for Zaxxon. Compute! Magazine, July 1983: Zaxxon for TI-99/4A (on Disk) being explicitly advertised (jumping the gun a bit, it would seem) by one vendor with a list price of $28:
  12. Wow. Seems like a pretty comprehensive set of routines callable from XB. This is some juicy stuff. Dangit. Just when I thought I'd safely talked myself out of ever blowing money on one of these things
  13. Yeah, Championship Baseball is really the only game anyone wants to play that fundamentally requires the system, so it's hard to see the price matching the payoff. Another thing that makes the MBX less desirable than it might otherwise be to me is just that it seems to be poorly understood, poorly documented, and utterly unsupported by any TI-99 libraries or development tools. It'd be one thing if I could "play" with its sound or speech synth or voice recognition. But if it's just a mysterious box that let's me play Championship Baseball? Kind of boring.
  14. Yeah, the disk version music is pretty awesome. Even as a Trekkie, I can admit Star Wars has some fantastic music, and this is a brilliant treatment of it: But I'm kind of glad the cart version has music that isn't just cribbed from Star Wars, as amazing as that music is. Though the end of stage jingle is still Star Wars.
  15. One key tactic, I think, is paying attention to the ship's shadow even more than the ship itself: Since this tells you both the ship's true horizontal position with respect to objects at ground level, and its height. The geometry takes a bit of getting used to. But all the information is actually there, as long as the shadow is visible. Note that flying enemy targets also produce shadows which reveal their position and height:
  • Create New...