Jump to content
IGNORED

VCF SE - Atlanta, GA July 19-21st


Recommended Posts

We are celebrating the TI-99/4’s 45th birthday this year.  Come join us!  Details:   https://vcfed.org/events/otherevents/vintage-computer-festival-southeast/
 

@OLD CS1, @Ksarul, and I will all likely be there!  And we will have the most complete 99/4 on exhibit for the first time, with every sidecar, including the video controller and P-Code thanks to @Ksarul

Thanks to @arcadeshopper for helping me with a working disk drive!  I’m setting the whole system (minus Jim’s components) up this weekend to test everything together and give it a good burn in!


I just need to find a good selection of compatible carts since the FinalGROM doesn’t like the 99/4 key map (it runs - but I can’t press any keys.)  Anyone know if there’s a patch for the FG for this?

 

I do lack are the original /4  Zenith TV and the original /4 joysticks, but that’s ok, the /4A’s monitor and pain sticks will be there to substitute!


Hope to see you there!

 

Tbis years draft shirt art:

image.thumb.png.349d14a41074a0152fdf18a55cfc0168.png
 

 

  • Like 9
Link to comment
Share on other sites

If not for the tee shirt design, I would not be rushing back from Alaska for the show.

 

@acadiel I have a bunch of carts that should be compatible with the /4, but then I reckon you have them, as well.  Let me know if there is anything you are missing and want me to bring.

 

This year, I am planning to have my regular assortment of exhibits: two board-mounted units, a standard and a QI, running Dragon's Lair and Don't Mess With Texas, respectively, a SuperSketch (still no way to print, sorry,) an F18A-enhanced system for playing, and this year a stock system on a TV via modulator and playing a selection of classics.  If I have room, the projector will be up, again, mainly for Dragon's Lair, but I will also be able to switch between all of the systems on display!

 

As with previous years, I will also be streaming the event on Rumble.  I expect to have cameras up facing the exhibits showing them in use, positioned to not catch faces of attendees, but I may forego the cameras in favor of more 4A outputs in the stream.  We shall see.

 

As well, if all goes to plan, I will have a vast selection of items for sale via consignment.

 

A very special thank you to @acadiel for his assistance this year.  If not for him letting me stash my exhibits at his place for a week, and my program manager's generousness in allowing me to return from Alaska a day early, I would not be able to do this show.

  • Like 3
Link to comment
Share on other sites

8 hours ago, acadiel said:

We are celebrating the TI-99/4’s 45th birthday this year.  Come join us!  Details:   https://vcfed.org/events/otherevents/vintage-computer-festival-southeast/
 

@OLD CS1, @Ksarul, and I will all likely be there!  And we will have the most complete 99/4 on exhibit for the first time, with every sidecar, including the video controller and P-Code thanks to @Ksarul

Thanks to @arcadeshopper for helping me with a working disk drive!  I’m setting the whole system (minus Jim’s components) up this weekend to test everything together and give it a good burn in!


I just need to find a good selection of compatible carts since the FinalGROM doesn’t like the 99/4 key map (it runs - but I can’t press any keys.)  Anyone know if there’s a patch for the FG for this?

 

I do lack are the original /4  Zenith TV and the original /4 joysticks, but that’s ok, the /4A’s monitor and pain sticks will be there to substitute!


Hope to see you there!

 

Tbis years draft shirt art:

image.thumb.png.349d14a41074a0152fdf18a55cfc0168.png
 

 

@acadielDoes the FinalROM have the same issue with the keys?

 

I'm gonna have to try to drive the 4.5 hours up from south GA. and attend too, if I can.

Edited by RickyDean
added content
Link to comment
Share on other sites

On 6/21/2024 at 9:20 AM, RickyDean said:

@acadielDoes the FinalROM have the same issue with the keys?

 

I'm gonna have to try to drive the 4.5 hours up from south GA. and attend too, if I can.

I haven't tried it, but it likely uses the same source or a derivative.  All the TI assembler is in here:  https://github.com/endlos99/finalgrom99/tree/master/ti and the code in question that is likely causing the issue is here: https://github.com/endlos99/finalgrom99/blob/master/ti/browser.a99

 

@Tursi can check me for correctness on this below file (I don't know remember if it's the authoritative one).  This was the header than @F.G. Kaal and I were using to turn his disk utilities into modules.  It had 99/4 support for lower case and the key scan in the boot code that the Final GROM can likely use.

 

We made this a long time ago - originally, it was the unspool code, then Tursi put all the 99/4 stuff in, and then we wound up with a very tightly, well written package that could copy any executable to 32K and cover the 99/4 and 99/4A very well.  Maybe someone can get this to the FinalGROM author to try?  Edit:  Just read through it - I don't see any key scan code - but I thought I had one that had some keyscan code.  I'll keep looking.  (I thought we had some cart header source that had some key scan differences, but maybe my memory is failing me.)  @Lee Stewart - you're a key scan guru - any ideas on why the above code in the 2nd Gitlab link isn't working on the 99/4?

 

* THREE PROGRAM HEADER FOR 32K BANKED SWITCHED CART
* TURSI 99/4 SUPPORT ADDED BASED ON HEXBUS 
* "COPY TO 32K AND RUN" CODE AND REFINED 2010
       DEF SFIRST,SLAST,SLOAD
       UNL

* ROM HEADER
       AORG >6000

SFIRST EQU $
SLOAD  EQU $

GRMHDR BYTE >AA,1,1,0,0,0
       DATA PROG
       BYTE 0,0,0,0,0,0,0,0

PROG   DATA 0
       DATA CF2K
       BYTE 8
       TEXT 'CF2K 2.0'
       EVEN

***************
* Copy Data for Modules *
* Format is:
* First, the address to load for the first source bank.
* Number of 32-bit words, source address, target address
* To end list, provide a start address greater than >8000
* (This means you can't start in the low RAM bank)
***************
CF2KDT DATA >6000
		DATA >076A,>6258,>A000,>076A,>6258,>BDA8
		DATA >076A,>6258,>DB50,>03BE,>7106,>2000
		DATA >A000

***************
* CF2K Module *
***************
CF2K	LWPI >8300
        LI R14,CF2KDT	 * address of copy table
	JMP COPYLP

***************
* Common Code *
***************
COPYLP	BL @GOGO * Set up Char Sets

		MOV *R14+,R7	 * get bank

ONEBLK	MOV *R14+,R4	 * Get bytes divided by 4
		JGT CONT		 * Branch if positive (less than >8000)
		B *R4			 * Else it's the jump address, so start the program

CONT	MOV *R14+,R9	 * Address to copy from
		MOV *R14+,R10	 * Address to copy to
		BL @COPYME		 * COPY IT!

		INCT R7			 * Next Bank

		JMP ONEBLK

****************
* Copy Routine *
****************
* R4  - Bytes Div 4
* R7  - Bank switch address
* R9  - Address to copy from
* R10 - Address to copy to
* R11 - Return spot

COPYME
    MOV R0,*R7   * Do the bank switch
LOOPIT
    MOV *R9+,*R10+
    MOV *R9+,*R10+
    DEC R4
    JNE LOOPIT
    B *R11         * We're done.

****************************
* Load lower case charsets *
****************************
* Note, if you still need space, you can remove support for the
* 99/4 by deleting the code marked between * +++ 99/4 support +++ begin/end
* blocks

GOGO
 MOV R11,R9   * Save our return spot

* +++ 99/4 support begin +++

* load R3 with 6 for 99/4, or 7 for 99/4A
 CLR R0
 BL @GPLSET
 BL @GETGPL   * read GROM >0000
 LI R3,7
 CI R0,>AA01  * 99/4 is AA01, all versions of 99/4A seem to be AA02 (even 2.2!)
 JNE IS4A     * note we also assume unknown is 99/4A just to be safe
 DEC R3

* make a copy of the capitals for the 99/4 to 'support' lowercase
* this will be partially overwritten by the main set, but it works!

 LI R0,>0018  * GPL vector address
 LI R1,>4A00  * dest in VDP - must OR with >4000 for write
 LI R2,>0040  * how many chars
 BL @GPLVDP   * this function goes somewhere later in your ROM
 JMP MNSET

* +++ 99/4 support end +++
* If you delete the above block, replace with
* LI R3,7
* so that the character size counter is still valid

IS4A
* 'lowercase' letters
 LI R0,>004A  * GPL vector address (not available for 99/4)
 LI R1,>4B00  * dest in VDP - must OR with >4000 for write
 LI R2,>001F  * how many chars
 BL @GPLVDP   * this function goes somewhere later in your ROM

* main set
MNSET
 LI R0,>0018  * GPL vector address
 LI R1,>4900  * dest in VDP - must OR with >4000 for write
 LI R2,>0040  * how many chars
 BL @GPLVDP   * this function goes somewhere later in your ROM
 B *R9        * RETURN TO CALLER

*****************
* GROM routines *
*****************

* Set GROM address
GPLSET
 MOVB R0,@>9C02
 SWPB R0
 MOVB R0,@>9C02
 B *R11

* Get a word from GPL
GETGPL
 MOVB @>9800,R0
 SWPB R0
 MOVB @>9800,R0
 SWPB R0
 B *R11

* Copy R2 characters from a GPL copy function vectored at
* R0 to VDP R1. GPL vector must be a B or BR and
* the first actual instruction must be a DEST with an
* immediate operand. Set R3 to 6 for 99/4 (6 byte characters)
* or 7 for a 99/4A (7 byte characters)
GPLVDP
 MOV R11,R10    * save return address
 BL @GPLSET     * set GROM address
 BL @GETGPL     * Get branch instruction (not verified!)
 ANDI R0,>1FFF  * mask out instruction part
 AI R0,3        * skip instruction and destination
 BL @GPLSET     * set new GROM address
 BL @GETGPL     * get actual address of the table
 BL @GPLSET     * and set that GROM address - GROM is now ready!

 SWPB R1        * assume VDP is already prepared for write to save space
 MOVB R1,@>8C02
 SWPB R1
 MOVB R1,@>8C02 * VDP is now ready!

 CLR R0
LP8
 MOVB R0,@>8C00 * pad the top of the char with a space
 MOV R3,R0      * then copy 7 (or 6) bytes

* +++ 99/4 support begin +++

 CI R3,6        * check for 99/4
 JNE LP9
 MOVB R0,@>8C00 * extra blank line for 99/4

* +++ 99/4 support end +++
* no changes needed if this block removed

LP9
 MOVB @>9800,@>8C00  * copy a byte (both sides autoincrement)
 DEC R0
 JNE LP9

 DEC R2         * next character
 JNE LP8

 B *R10

FINISH EQU $
SLAST  END

 

Link to comment
Share on other sites

On 6/23/2024 at 11:22 AM, acadiel said:

I haven't tried it, but it likely uses the same source or a derivative.  All the TI assembler is in here:  https://github.com/endlos99/finalgrom99/tree/master/ti and the code in question that is likely causing the issue is here: https://github.com/endlos99/finalgrom99/blob/master/ti/browser.a99

 

@Tursi can check me for correctness on this below file (I don't know remember if it's the authoritative one).  This was the header than @F.G. Kaal and I were using to turn his disk utilities into modules.  It had 99/4 support for lower case and the key scan in the boot code that the Final GROM can likely use.

 

We made this a long time ago - originally, it was the unspool code, then Tursi put all the 99/4 stuff in, and then we wound up with a very tightly, well written package that could copy any executable to 32K and cover the 99/4 and 99/4A very well.  Maybe someone can get this to the FinalGROM author to try?  Edit:  Just read through it - I don't see any key scan code - but I thought I had one that had some keyscan code.  I'll keep looking.  (I thought we had some cart header source that had some key scan differences, but maybe my memory is failing me.)  @Lee Stewart - you're a key scan guru - any ideas on why the above code in the 2nd Gitlab link isn't working on the 99/4?

 

* THREE PROGRAM HEADER FOR 32K BANKED SWITCHED CART
* TURSI 99/4 SUPPORT ADDED BASED ON HEXBUS 
* "COPY TO 32K AND RUN" CODE AND REFINED 2010
       DEF SFIRST,SLAST,SLOAD
       UNL

* ROM HEADER
       AORG >6000

SFIRST EQU $
SLOAD  EQU $

GRMHDR BYTE >AA,1,1,0,0,0
       DATA PROG
       BYTE 0,0,0,0,0,0,0,0

PROG   DATA 0
       DATA CF2K
       BYTE 8
       TEXT 'CF2K 2.0'
       EVEN

***************
* Copy Data for Modules *
* Format is:
* First, the address to load for the first source bank.
* Number of 32-bit words, source address, target address
* To end list, provide a start address greater than >8000
* (This means you can't start in the low RAM bank)
***************
CF2KDT DATA >6000
		DATA >076A,>6258,>A000,>076A,>6258,>BDA8
		DATA >076A,>6258,>DB50,>03BE,>7106,>2000
		DATA >A000

***************
* CF2K Module *
***************
CF2K	LWPI >8300
        LI R14,CF2KDT	 * address of copy table
	JMP COPYLP

***************
* Common Code *
***************
COPYLP	BL @GOGO * Set up Char Sets

		MOV *R14+,R7	 * get bank

ONEBLK	MOV *R14+,R4	 * Get bytes divided by 4
		JGT CONT		 * Branch if positive (less than >8000)
		B *R4			 * Else it's the jump address, so start the program

CONT	MOV *R14+,R9	 * Address to copy from
		MOV *R14+,R10	 * Address to copy to
		BL @COPYME		 * COPY IT!

		INCT R7			 * Next Bank

		JMP ONEBLK

****************
* Copy Routine *
****************
* R4  - Bytes Div 4
* R7  - Bank switch address
* R9  - Address to copy from
* R10 - Address to copy to
* R11 - Return spot

COPYME
    MOV R0,*R7   * Do the bank switch
LOOPIT
    MOV *R9+,*R10+
    MOV *R9+,*R10+
    DEC R4
    JNE LOOPIT
    B *R11         * We're done.

****************************
* Load lower case charsets *
****************************
* Note, if you still need space, you can remove support for the
* 99/4 by deleting the code marked between * +++ 99/4 support +++ begin/end
* blocks

GOGO
 MOV R11,R9   * Save our return spot

* +++ 99/4 support begin +++

* load R3 with 6 for 99/4, or 7 for 99/4A
 CLR R0
 BL @GPLSET
 BL @GETGPL   * read GROM >0000
 LI R3,7
 CI R0,>AA01  * 99/4 is AA01, all versions of 99/4A seem to be AA02 (even 2.2!)
 JNE IS4A     * note we also assume unknown is 99/4A just to be safe
 DEC R3

* make a copy of the capitals for the 99/4 to 'support' lowercase
* this will be partially overwritten by the main set, but it works!

 LI R0,>0018  * GPL vector address
 LI R1,>4A00  * dest in VDP - must OR with >4000 for write
 LI R2,>0040  * how many chars
 BL @GPLVDP   * this function goes somewhere later in your ROM
 JMP MNSET

* +++ 99/4 support end +++
* If you delete the above block, replace with
* LI R3,7
* so that the character size counter is still valid

IS4A
* 'lowercase' letters
 LI R0,>004A  * GPL vector address (not available for 99/4)
 LI R1,>4B00  * dest in VDP - must OR with >4000 for write
 LI R2,>001F  * how many chars
 BL @GPLVDP   * this function goes somewhere later in your ROM

* main set
MNSET
 LI R0,>0018  * GPL vector address
 LI R1,>4900  * dest in VDP - must OR with >4000 for write
 LI R2,>0040  * how many chars
 BL @GPLVDP   * this function goes somewhere later in your ROM
 B *R9        * RETURN TO CALLER

*****************
* GROM routines *
*****************

* Set GROM address
GPLSET
 MOVB R0,@>9C02
 SWPB R0
 MOVB R0,@>9C02
 B *R11

* Get a word from GPL
GETGPL
 MOVB @>9800,R0
 SWPB R0
 MOVB @>9800,R0
 SWPB R0
 B *R11

* Copy R2 characters from a GPL copy function vectored at
* R0 to VDP R1. GPL vector must be a B or BR and
* the first actual instruction must be a DEST with an
* immediate operand. Set R3 to 6 for 99/4 (6 byte characters)
* or 7 for a 99/4A (7 byte characters)
GPLVDP
 MOV R11,R10    * save return address
 BL @GPLSET     * set GROM address
 BL @GETGPL     * Get branch instruction (not verified!)
 ANDI R0,>1FFF  * mask out instruction part
 AI R0,3        * skip instruction and destination
 BL @GPLSET     * set new GROM address
 BL @GETGPL     * get actual address of the table
 BL @GPLSET     * and set that GROM address - GROM is now ready!

 SWPB R1        * assume VDP is already prepared for write to save space
 MOVB R1,@>8C02
 SWPB R1
 MOVB R1,@>8C02 * VDP is now ready!

 CLR R0
LP8
 MOVB R0,@>8C00 * pad the top of the char with a space
 MOV R3,R0      * then copy 7 (or 6) bytes

* +++ 99/4 support begin +++

 CI R3,6        * check for 99/4
 JNE LP9
 MOVB R0,@>8C00 * extra blank line for 99/4

* +++ 99/4 support end +++
* no changes needed if this block removed

LP9
 MOVB @>9800,@>8C00  * copy a byte (both sides autoincrement)
 DEC R0
 JNE LP9

 DEC R2         * next character
 JNE LP8

 B *R10

FINISH EQU $
SLAST  END

 

 

I don’t have access to commented code for the 99/4 console ROM, so I can’t walk the code that matters. What I can say is that the likely culprit is in the following code:

input:
       mov  r7, @more_items
       li   r0, >9e7e
       mov  r0, @>8372        ; restore stack pointers for SCAN
       li   r0, >05ff
       mov  r0, @keymode
wait_key:

 

Storing >05FF at >8374 tells KSCAN to use keyboard (KBD) #5. The >FF gets stored in >8375 to initialize it to “no key pressed”. On the 99/4A, KSCAN stores keyboard#–3 (if KBD# is 3[99/4 mode], 4[Pascal mode], or 5[Basic mode]) at >83C6 (2 in this case) and then zeroes >8374 (which tells KSCAN to check >83C6 for the default KBD#). Since the 99/4 does not know KBD#s other than 0[whole KBD], 1(left-side KBD), and 2(right-side KBD), there is no reason to zero >8374. And, it does not, to my knowledge, do anything with >83C6. By changing >8374 to 5, the above code has effectively disabled KSCAN on the 99/4. This is easy to verify in Classic99 (99/4 mode) by opening the debugger and setting >8374 to 5. From that point on, >8374 never changes and keypresses are ignored until the next software change of KBD# to 0, 1, or 2. FYI, you can also disable KSCAN (until KBD# is properly set to 0, 1, 2, 3, 4, or 5) on the 99/4A by setting the KBD# higher than 5.

 

I would change the value stored at >8374 to >00FF.

 

If there is some concern that the keyboard number for a 99/4A has changed, then it could be rewritten to test for the 99/4A before putting 5 at >8374.

 

...lee

Edited by Lee Stewart
BETTER EXPLANATION
  • Like 2
Link to comment
Share on other sites

7 hours ago, Lee Stewart said:

 

I don’t have access to commented code for the 99/4 console ROM, so I can’t walk the code that matters. What I can say is that the likely culprit is in the following code:

input:
       mov  r7, @more_items
       li   r0, >9e7e
       mov  r0, @>8372        ; restore stack pointers for SCAN
       li   r0, >05ff
       mov  r0, @keymode
wait_key:

 

Storing >05FF at >8374 tells KSCAN to use keyboard #5. The >FF gets stored in >8375 to initialize it to “no key pressed”. On the 99/4A, KSCAN stores keyboard#–3 at >83C6 (2 in this case) and then zeroes >8374. Since the 99/4 does not know what a keyboard number is, it does not zero >8374 unless a joystick was activated and it does not change >83C6. By changing >8374 to 5, the above code has effectively disabled KSCAN on the 99/4. This is easy to verify in Classic99 (99/4 mode) by opening the debugger and setting >8374 to 5. From that point on, >8374 never changes and keypresses are ignored.

 

I would change the value stored at >8374 to >00FF.

 

If there is some concern that the keyboard number has changed, then it could be rewritten to test for the 99/4A before putting 5 at >8374.

 

...lee

Thanks, Lee!  I updated the Git issue and we will see if we can try it!

 

Edit:  I got your update and edited the Git issue and linked to your revision.  Thank you!

 

  • Like 2
Link to comment
Share on other sites

On 7/3/2024 at 12:57 PM, arcadeshopper said:

@ralphb hey Ralph, Jon ( @acadiel ) asked me to ping you regarding this, he's made a note in your github regarding 99/4 compatibility with the keyscan routine

All patched - new thread here - I have it working.  

@ralphb - there were quite a few incompatibilities with the FinalGROM scripts and your cross assemblers, specifically looking for .asm files vs .a99 files, as well as some library pathing issues (I solved that by putting the "ti" directory in the xdt directory - and copied the libs over too.)  FWIW, I was on a Mac.

 

 

 

  • Like 2
Link to comment
Share on other sites

  • 2 weeks later...

Well, I am sorry to say that as I was caught up in the whole Microsoft outage thing.  I am stuck in San Francisco until Saturday night, which means that I will not have time to set up or run my exhibit, but I will be able to hang out with everybody and go check out things for once. So, I will see everybody Saturday evening.

  • Sad 1
Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Loading...
  • Recently Browsing   0 members

    • No registered users viewing this page.
×
×
  • Create New...