• Please review our updated Terms and Rules here

Making TI-74 LOAD.PGM a bit more convenient

I'm no hardware guy, but my knowledge about cassette-routines is, that for a CI-7 a TMS70C46 is mandatory! TI designed TMS70C46 with additional I/O lines/functions for that purpose, so that this routines won't run on a CC-40 (TMS70C40 or less). Afaik the CC-40+ is equipped with a (pre serial) TMS70C46 (Code 75xxx). As you can see in pic this CPU is a way different to 70C40. There is an extension called Dock Bus IO-Port-Logic which is influenced by (external) interrupt 1 - I'm not sure how this exactly works...
70C46 is a embedded CPU, which seems to be special developed for TI-74 and there is one interesting sentence in discription: "The TMS70C46 incorporates the necessary circuitry to generate the signal timing and impedance interface to connect directly to the DOCK-BUS."

2nd: This routines will also lack the abilility of loading assembler-progs - this seems also to be part of this low-level-routines.

In my opinion it would be easier to write a new custom-routine to transfer data directly to/from Dock/Hexbus and do serialisation by hardware (and D/A-conversion). Perhaps there is another, better way - think, JGardner can say something more about controlling Hexbus/Dockbus.

MPU70C46.jpg
 
Attendum to my post #119 to BASECONV (forgot to explain):

I believe, that no one realized, that very high and floating point(!) numbers can be converted!

some examples:

from base g to base h
for g>1, h<37 and |y|
From base g= 16 to base h= 2
Number y( 16 ) = adf12.a5
y( 2 )= 10101101111100010010.10100101


New calculation...
Same base [y/n]?
From base g= 16 to base h= 2
Number y( 16 ) = 45abef89
y( 2 )= 1000101101010111110111110001001


New calculation...
Same base [y/n]?
New Base
From base g= 10 to base h= 8
Number y( 10 ) = 25897
y( 8 )= 62451


New calculation...
Same base [y/n]?
New Base
From base g= 20 to base h= 10
Number y( 20 ) = 5freh
From base g= 37 to base h= 10
Number y( 37 ) = 5gkmnr7w
y( 10 )= 517140321164
Stop
 
Next version of 8KB and 32KB ASM-Cartridge to test.
Added CALL PRTPAR command and 2 small subs for use with Centronics-Interface:

1. CALL PRINTOUT(A$)
As its name says: Prints a string to CENTRONICS-device. Maximum length of string is 79 characters.

2. CALL PRTSTYLE(COD,PAR)
This small sub let you set different ESC-codes to your printer. COD is the ESC-code and PAR a optional parameter (all decimal).
eg. COD=120, PAR=1 sets letter-quality, or COD=10, PAR=0 gives a linefeed. If PAR isn't needed is has to be set to 0 anyway..

CALL PRTPAR has no arguments - it copies the displaybuffer to interface.
As always: remove .txt-extension!
 

Attachments

Correction: It's CALL PRTOUT(A$) not CALL PRINTOUT! Right names can be seen by CATALOG(1).
 
RWRAM.B74 is very usefull for loading/saving 8/32KB cartridges. But if you want to load/save a free defined range in memory, then you have to prog your own peek/poke routines or have to write a propper PAB for IOX . Or have to convert it for loading with LOAD.PGM, which requires a relocatable routine - all methods are not very convenient for quick-testing asm-routines during developing...
Therefore I modyfied RWRAM slightly, to load/save ranges too and called it RWRANGE.B74. You will additionally find now a possibility to load/save/verify a range to/from a device to RAM (or dump only visible ROM-parts).
Range is defined by startaddress (top-address) and amount of bytes down. Input is base 10! No hex (too lazy to implement yet). Do not use upper case lock!
If you want to save BFFF to BF00 type Startadress: 49151, bytes 255.
If you use "V)erify" you may get unexpected Error "24": Turn off calculator AND reset device (TIFF: close, start again) - then it should be OK. I compared data several times with a monitor: they where allways OK, even error occurs. I think, only writing to tape (#1) may realy need a verify. Yes, you can write/read to/from tape even a complete 32KB-image, but needs ~15min! In fact you also can do the same as CALL GET/PUT does, but to tape (or any other storage device)!

Hope, someone find it usefull...
Find .B74 and .C74 (.PGM) attatched (remove .txt). Will be implemented in next version of asmcartidge.
 

Attachments

Last edited:
Time for next Update:

I've added RWRANGE and VS-SUB, which calculates some usefull system-variables. Also new integrated SYSINFO - program shows you calculated data by VS. SUB UP slightly improved.

What is in the cartridge (summary): (*) signed only in 32KB-Image!

HEADER includes:
Direct Basic-Statements :
@ACCEPT, @EVAL, @REDIM, @UNDIM, CATALOG, DFK
CALL-able Subroutines:
CALL IOX, CALL INDIC, CALL PEEK, CALL POKE, CALL GETMEM, CALL RELMEM, CALL EXEC, CALL CHAR, CALL OFF, CALL CLEANUP, CALL VS
CONVAR Package (CV) : CALL ALLOC, direct statements: @SAV, @SAV$, @RET, @RET$
ASM-MAIN-PGM: CALL PRTPAR

************
BASIC-SUBs (CALL ...): CALL BASE, CALL SCROLLTEXT, CALL UP CALL PRTOUT(*), CALL PRTSTYLE(*)
************
BASIC-MAIN (RUN "..."): BASECONVERT(*), HISTOGRAM(*), HORNER(*), MONITOR(*), PLOTTER(*), RWRANGE, SYSINFO
************

DFK: FN-Keys set (at moment ) - can be changed at your suggestions:

F0: CATALOG
F7: @RET(1) Needed to use stringexpressions (like functions) in cartridge-progs
F8: RUN "100.LOADED" Synchronize currently in TIIF edited progs with TI-74
F9: CALL BUILT ("TESTCARTRIDGE") Build up a cartridge (for developing/TIIF-only)

CALL PRTPAR, CALL PRTOUT, CALL PRTSTYLE: only for use with "insurance" CENTRONICS-Interface! Don't use, if no interface is attatched - TI will hang.....

Think, HEADER is complete now. Basicprogs a mostly for testing and may be changed.

Documentation to all assembler commands can be find in CC-40 documentation. Will do some more documentation soon .....

Find 8KB and 32KB image attatched. Remove.txt. Response wellcome!

Have fun!
 

Attachments

Last edited:
I've a issue with my 32K-RAM-Cartridge (Build from Jim Brains Circuit diagram). It seems that I've got some faulty RAM-Chips (ISSI IS62C256-70 - see pdf). On all my cartridges byte >76B0 flips to >A5 during loading a image. After setting the right value to this byte with CALL POKE, it works flawless and can be saved back correct to PC!
Now I ask: can this anyone confirm, useing this circuit diagram? I'm pretty sure that Jim's layout is correct, but I will exclude any other reason before contacting ISSI for this issue...
At moment I'm going out of a faulty RAM-batch by ISSI.
You will find attatched a testversion of ASMCART.BIN to test. If this problem occurs, program "HISTOGRAM" will break before asking for output-device. (You need no PCIF to test this)
Former versions of ASMCART are not affected, because this address was'nt used (new version is longer). If someone will look to binary with a monitor: it's address >494F (dec 18767).
If this error occurs, enter CALL POKE(18767,80) - then it should work.
And to make it more mysterious: loading a "dummy"-32K.BIN to RAM-Cartride, which includes only FF at every byte, does NOT show that behaviour, while any other BIN (like Mathematics, Statistics, Pascal, etc. does).

So, if anyone can test it, pls let me also know what RAM-Chip you are useing....thank you!
Loading BIN as always with RWRAM or RWRANGE. (Be sure, this both progs are not the reason - Cartridge-binary-build-up routine of SDS does the same too).
 

Attachments

Last edited:
Time for a update!!

Added some new features:

1. LS-Package (Loadable Subprogram!) CALL LS and CALL CS

This package allows you to load progams, located in the cartridge down to sys-RAM. This is normaly not really needed, bu there are exceptions. One of this exeptions is the behaviour of some 256K-FlashROMs - they won't fall back to bank 0, even if they removed from calculator. If you now on a bank without a POKE-command and don't have TIIF2 or HEXTIr, it is not possible to change the bank! Bad situation!

Solution:
You load down the POKE-command to your system RAM from cartridge! And this is exactly what this package can do. I've added PEEK/POKE/EXEC for download. More progs aren't possible at moment, because from other commands no source-code is available to transfer it into a special, relocatable format (.CVE).
Additional I had to rename this commands to RPOKE, RPEEK and REXEC to avoid conflicts with "real" PEEK/POKE/EXEC in cartridge, if downloaded to RAM. Till they are not downloaded, they are "invisible". If once downloaded, this progs will be reset-resistant (as like loaded with LOAD.PGM). But NEW ALL and CALL CS will remove them!

CALL LS opens a menue for download (self explaining), pressing key "Q" quits menue.
CALL CS kills every sub-program in RAM, but not a main-program

It is also possible to load down commands and change after the cartridge. May also help in some situations.....

Please attention: LS-package *MUST* not be used at same time as CONVAR-package (CALL ALLOC)- both need the same range in RAM for data. Calculator will crash in that case!!!

2. DFK (define FNKEY)
is now able to run twice in header! I modyfied DFK.OBJ to realize this (it's a hack and not TI-conform, but works flawless). Now you have two commands for defining FKT-Keys: DFK and DFKS! Each of them can redefine former defined keys..
RUN "DFK" defines FN0, FN7,FN8,FN9 as you have seen til yet.
RUN "DFKS" defines on FN1,FN2,FN3 german umlauts, greek and mathematical letters for direct use.
Usage: Press FNKEY and delete all not needed letters. This is much easier an more efficient in PRINT-statements, instead of useing PRINT CHR$(xyz) and it saves bytes....
Keydefinition has to be assembled into header and can not be done "on the fly" by user. It's up to your imagine what can be done with that in future.....

If you do yourself: keep in mind, that some ASCII-codes will be translated due to different codesets of TI and PC. In some cases you well not get that chars on TI74, what you have expected. This problem can only be solved by correcting binary with a HEX-Monitor. This will not occour for chars below ASCII 127. And above only a few chars are influenced by this issue. Interessted user may contact me - can explain how to do.....

Last but not least did small improvements in MONITOR for output to dev 14/26/27/44/45.

Tried to test all of that, but cannot do all combinations! If you find mistakes or an error pls let me know.
Find Cartridge Binary attatched as always (remove .txt).

Have fun!
 

Attachments

Very nice, Harry!

Question: You mention "...improvements in MONITOR for output to dev 14/26/27/44/45."

MONITOR? Seems I've missed something...

/br
 
MONITOR is only a small pgm to show bytes in RAM/ROM and has some capabilities to convert between HEX/DEC/BIN and 16Bit-Addresses - nothing more! (far away from RBUG, but usefull to check data in RAM). Don't know the original author - found it on web......

This is the version from the cartridge:

Code:
  100 PRINT "TI-74 Monitor":PAUSE .5
  110 CALL UP(PN)
  120 PRINT "Monitor/Basisconv [M/B]?"
  130 CALL KEY(J,K)
  140 IF K<>0 AND(J=77 OR J=109) THEN CALL PRY(PN)
  150 IF K<>0 AND(J=66 OR J=98) THEN CALL HEX(PN)
  160 GOTO 120
  170 END
  180 SUB PRY(PN)
  190 IMAGE ##### |###|###|###|###|###|###|###|###| #####
  200 INPUT "ADDRESS: ";X:IF X=-1 THEN END
  210 IMAGE ADR   | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | ADR+8
  220 PRINT #PN,USING 210:PRINT #PN,RPT$("-",45)
  230 CALL PEEK(X,A,B,C,D,E,F,G,H):PRINT X
  240 PRINT #PN,USING 190,X,A,B,C,D,E,F,G,H,X+7:IF PN=0 THEN PAUSE
  250 CALL KEY(J,K)
  260 IF K<>0 AND J=232 THEN X=X+8:GOTO 230
  270 IF K<>0 AND J=233 THEN X=X-8:GOTO 230
  280 IF K<>0 AND J=113 THEN 200
  290 GOTO 250
  300 SUBEND
  310 !
  320 SUB HEX(PN)
  330 ON ERROR 830
  340 DATA A,B,C,D,E,F
  350 INPUT "HEX~DEC: ";Z$
  360 IF Z$="" THEN 470
  370 Y=LEN(Z$):G=0
  380 FOR X=1 TO Y
  390 X$(X)=SEG$(Z$,X,1)
  400 NEXT X
  410 FOR X=1 TO Y
  420 IF NOT NUMERIC(X$(X)) THEN W(X)=ASC(X$(X))-55  ELSE W(X)=VAL(X$(X))
  430 G=G+(W(X)*(16^(Y-X)))
  440 NEXT X
  450 PRINT #PN,TAB(2);"HEX ";Z$;" DEC ";G:PAUSE:GOTO 350
  460 !
  470 INPUT "DEC~HEX: ";G$:IF G$="" THEN 580
  480 A$="":Z=VAL(G$)
  490 Z$=STR$(((Z/16)-INT(Z/16))*16):GOSUB 550
  500 A$=Z$&A$
  510 Z=INT(Z/16)
  520 IF Z>15 THEN 490 ELSE Z$=STR$(Z):GOSUB 550
  530 A$=Z$&A$
  540 PRINT #PN,TAB(2);"DEC ";G$;" HEX ";A$:PAUSE:GOTO 470
  550 RESTORE:FOR X=10 TO 15
  560 READ B$:IF X=VAL(Z$) THEN Z$=B$:RETURN
  570 NEXT X:RETURN
  580 INPUT "DEC~BINARY: ";F$:IF F$="" THEN 650
  590 F=VAL(F$):J$=""
  600 G=F/2:IF G=.5 THEN J$="1"&J$:GOTO 630
  610 H=INT(G):I=(G-H)*2:I$=STR$(I):J$=I$&J$
  620 IF H>0 THEN F=H:GOTO 600
  630 PRINT #PN,TAB(2);"DEC ";F$;" BIN ";J$:PAUSE:GOTO 580
  640 !
  650 INPUT "BINARY~DEC: ";K$:IF K$="" THEN 740
  660 X=LEN(K$):N=0
  670 FOR Y=1 TO X
  680 L$=SEG$(K$,Y,1):L=VAL(L$)
  690 M=L*2^(X-Y)
  700 N=M+N
  710 NEXT Y
  720 PRINT #PN,TAB(2);"BIN ";K$;" DEC ";N:PAUSE:GOTO 650
  730 !
  740 INPUT "DEC~16-bit HEX ADDR: ";DH$:IF DH$="" THEN 790 ELSE DH=VAL(DH$)
  750 HI=INT(DH/256):LO=DH-(HI*256)
  760 PRINT #PN,"DEC ";DH;TAB(14);"HI=";HI;"LO=";LO
  770 PAUSE:GOTO 740
  780 !
  790 INPUT "16-bit addr~Dec,Hi byte: ";DE$:IF DE$="" THEN 350 ELSE DE=VAL(DE$)
  800 INPUT "16-bit addr~Dec,Lo byte: ";DF
  810 DG=(DE*256)+DF:PRINT #PN,"LO=";DE$;" HI=";DF;" = ";DG:PAUSE:GOTO 790
  820 !
  830 CALL ERR(E0,E1,E2,E3)
  840 IF E0=12 AND E3=270 THEN ON ERROR 830:RETURN NEXT
  850 IF E0=12 AND E3=290 THEN ON ERROR 830:RETURN NEXT
  860 PRINT "UNEXPECTED ERROR ";E0;E1;E2;E3:PAUSE
  870 SUBEND
 
Some info to post #128 - issue with 32KB RAM-Cartridge:

It seems factual to be an issue of RAM-Chip! No clue why byte >76B0 (= DEC 18767 in 32KB-range of cartridge-binary) always flips to A5 during load-process.
No big chance, but to be sure: Testing shematic of PCB, whether there could be any influence from this side....
Crazy!
 
Thanks, Harald! About 35 years ago I tried to write a 74 Hot-Key pop-up that would do all that,

& eventually gave up - But did do a BASIC template for all the calculations, which still lurks in

WHT's repository, last time I looked... 🤠
 
Hot summer is gone - now feel like going on with TI....

First: Updated 8KB-ASMCartridge to last header with DFKS and LS-Package for all those who owns only a 8KB Cartridge. Had to clear all BASIC-Progs, because header alone needs now nearly 8KB...
Remove .txt and load binary to Cartridge with RWRAM. You may need to turn off / on calculator, to activate cartridge. Have fun with this bunch of assembler-extensions. See CATALOG(1) what's in.

Next: Searching for Ideas and/or usefull programs to integrate in 32KB-ASMCartridge.....
 

Attachments

Something I'm thinking about:
Is it possible to set start-address of a cartridge to another value then >4000? In other words: can a header be located for e.g. at >8000 ? (How it can be found then is another issue),
But I'm afraid that >4000 is hard-coded in ROM (would be a nice challenge for Jim's ROM-replacement...).

Background of this idea are two nice possibilties:

1. Build a splitted 32KB Cartridge with e.g. 16KB RAM and 16 KB ROM (Why that? Because unfortunately TI can only mount continuous linear RAM - no segmentation possible and assembler-progs starts bottom-up from lowest address, while Basic-progs starts top-down from highest RAM-address )

2. Using space at >E000 to >EFFF (4KB unused space for custom applications) for most common assembler-extensions. Needs a redesign of cartridge to reach this space or a modding inside TI with additional 4KB RAM, or better FlashROM, there.
 
Back
Top