Sorry, but I am not able to transfer data between my TI and my Pc other than with .hfe-files. They are containers used by the HxC Floppy Emulator. Maybe someone with a HxC and the ability to transfer the data to a Pc might help us? I can convert .dsk-files on a Pc, safe them on a SD-card and use them with my Corcomp controller. But the other way round did not work for me in the past. Looks like an one-way solution. I am in the same situation as Owen. My system fails from time to time. I have to learn how to use Mess then the data-transfer problem would no longer exist. Sometimes ...
You are writing that the Geneve routine writes a rectangle (space?) and then writing 48 dots in series? Even(?) if someone uses the LM.. commands to print data to the screen, setting the right logical bit(s), makes a space write redundant, this is my thinking - feeling (we have to proof my feelings). They are great commands to generate colorful software sprites of any size. Please be patient with the routine to pre-process the characters. I have my handwritings in front of me with the thoughts to program it, but they are hard to understand, even for the author himself.
I hope that my denglish won't hurt you to much. Here is my translation attempt:
ST LWPI >B000 Workspace setting for debugging purposes - bad style
CLR 9 the hi-byte of register 9 will be used to check status bits from SR2 of the MSX video chip
LI 13,>9100 fixed register hi-byte contains VR17 for VWTR purposes
LI 14,>8C02 fixed register with port 1
LI 15,>8C06 fixed register with port 3
MOVB @G6+1,@>83D4 copy of VR1 for the time out routine of the TI99/4A
MOVB 9,*14 at the moment R9 is cleared so the routine to write VDP registers will
* start with VR0
BL @UNTERP this routine uses R0, R1, R11, R13, R14 and R15
DATA G6,12 12 video registers to write preset data - use your own routine here
MOVB @R36,*14 using the same routine but transfer data to * 11 consecutive command registers
DATA LO,11 preset data to clear the visible screen area * - change the color register to your own preferences VR44 set with >FF
BL @TSR2 this subprogram checks if the command is done and than will return
MOVB @R36,*14 * here you find code which should help me to track down the errors I made
BL @UNTERP * skip this
DATA HMMCA,11 * displays a pre calculated A 6*8 black (1) and transparent (0)
LI 0,ASCA * recycles R0 to point to the pre calculated char definition
SCHR3 BL @TR2 * a different version of the @TSR2 sub program - checking R9 inside the
* main program
COC @MASK,9 * important check here while testing the end of the command
JNE FERTI * if the bit found in @MASK is reset in R9 representing SR2 then we are * done
HALT3 BL @TR2 * this is the flowchart I found in the manual, so the VDP might be fast * enough to skip this bit checking - I never tried this without it
COC @MA,9 * check the bit if the VDP is busy or not
JNE HALT3 * busy here jump to hold on3 wait
MOVB *0+,*14 * ready to pump the data R0 is pointing to to port 1
MOVB @R44,*14 * direct these data to VR44 to make the command work
JMP SCHR3 * go to check, if the command is done
FERTI LI 12,>1400 * setting R12 with the cru of my video-card - obsolete on a geneve
FERTIG MOVB 1,*14 * writing my card game I noticed that is not a bad practice to read SR2 * from time to time - I think you can skip these too
MOVB @R15,*14 * starting a read of SR0 R1 is 0 at this time
MOVB @>8802,0 * do the read and forget the thing
MOVB 1,@>8374 prepare the TI for a key scan
MOVB 1,@>837C GPL status cleared
TASTE BLWP @>2108 E/A KSCAN
MOVB @>837C,1 is any key pressed?
JEQ TASTE no go to TASTE
CLR 2 prepare R2
MOVB @>8375,2 move the ascii code in hi-byte of R2
SRL 2,5 while the value is in the hi-byte, a right shift by 5 equals to *8
AI 2,>40E2 bad practice to use the absolute address here but with your Geneve you * have to use here a ram, rom address with the character definition you * want to start with: CALL CHAR(30,"0078787878787878") you get the * picture. I am using the null character as the starting point. The key * value times 8 gives us the position of the ascii based on our ram, rom * starting position.
LI 3,HMMC2+8 we want to use the HMMC command and the label contains the needed data * to write a 6*8 char. x position 0 and y position 256 are preset * (second page first visible area). We have to manipulate the byte at * HMMC2+8 with the first byte of the selected character. Remember that * this is forced by the way I used to set up the commands of the VDP
MOVB @LO,*3 get rid of an old entry at HMMC+8; I think you can skip this
CLR 4 preparing R4
LI 5,2 two bits of the old charset will be used for one byte
LI 6,3 3 pairs are used for a 6 pixel wide char but during the command setup * I have to strip one (3-1) but the position of the DEC 6 makes an extra * count, so we are again with LI 6,3
SBO 0 * strip this on the Geneve
MOVB *2+,4 VERDAMMT I forget to copy this, so this is the point you might stumble * over. Copies the first byte of our character to write in the HMMC+8 * position.
SBZ 1 * related to source of my TI data. see SBO 0
WIEDER SLA 4,1 here we go to check our bits
JOC AN is a bit shifted out then a pixel is set within the character definition. Go to* label AN
LI 7,HINTER-1 no pixel is set, so HINTER-1 prepares the color to be set if the bit is 0. * Remember our R5 starts with 2 decreases to one and than the loop is over.
A 5,7 our color code is build by two nibbles in a reversed order. I have preset the * values to >00 00. The first nibble contains the color of the second shifted bit
AB *7,*3 one of the preset data is put into HMMC2+8
DEC 5 did we handle 2 bits yet?
JNE WIEDER no, do it again
JMP ERLEDI yes, see what is next
AN LI 7,VORDER-1 if the sla jocs us here
A 5,7 find the preset color nibble
AB *7,*3 add it to HMMC2+8
ERLEDI BL @TSR2 * check, if the VDP is ready. I think you can skip this here. * But this is the save way.
MOVB @R36,*14 we can now start our HMMC command.HMMC+8 is ready
ERNEUT DEC 6 here I am one ahead. But we load R6 with 3 and we have no to worry
JEQ NEUER did we expand every 6 bits?
INCT 5 no, R5 equals to 0 but we need it to have 2 in it.
CLR 3 R3 gets a new task
WIEDE2 SLA 4,1 this is the same routine as above, but now VR44 will get its bytes.
AN2 LI 7,VORDER-1
ERLED2 BL @TR2 this is important here
JNE SCHLUS we are checking, if the command is over? Yes, go to SCHLUS
HALT2 BL @TR2 no, but you might skip this for faster execution.
COC @MA,9 see the flow chart in the manual
JNE HALT2 of the HMMC command
MOVB 3,*14 we are writing our bit crushing to port 1
MOVB @R44,*14 and directing it to VR44 - color register
JMP ERNEUT go and check the content of R6
NEUER SBO 0 skip this
MOVB *2+,4 R2 must point to your character definition
SBZ 0 skip this
LI 6,4 when the setting of HMMC+8 is done and the 4 remaining bits are processed than * we have to work on 3*2 bits. Due to the position of the DEC 6 the 3 is * incremented to 4
JMP ERNEUT do it again, Sam
SCHLUS B @FERTIG here starts the logic to write all chars into the VRAM you need.
*ENDE MOVB @G1,+1,@>83D4
* MOVB @G1,*14
* BL @UNTERP
* DATA G1,12
* B @>0000
UNTERP MOVB 13,*14 Videoregister 10010001 17 vorlegen
MOV *11+,1 DATA Werte abholen
UNTER1 MOVB *0+,15 Daten in Port 3 unterbringen
JNE UNTER1 alle geschrieben?
B *11 Ja, dann geht es zurück
TSR2 MOVB @SR2,*14
TR2 MOVB @SR2,*14
MASK DATA >0100 der Befehl ist noch am ackern the command is being executed
MA DATA >8000 der VDP ist noch beschäftigt VDP is busy
G6 DATA >0A62,>3F00,>00F7,>3E07,>0A82,>0003
G1 DATA >00E0,>0020,>0006,>0007,>0802,>0000
LO DATA >0000,>0001,>0002,>D400,>FF00,>C0A6 sichtbaren Bereich mit Weiß füllen
R38 EQU LO+11
LI DATA >0000,>0001,>0002,>0000,>0900,>70AC ist aus dem Programm geflogen not used anymore
LIX EQU LI+10
R44 EQU LI+11
R46 BYTE >AE
R36 BYTE >24
SR2 BYTE 2
R15 BYTE >8F
RS DATA >018E,>007A wird hier nicht mehr gebraucht not used here artefact
HMMC2 DATA >0000,>0001,>0600,>0800,>FF00,>F000
VORDER DATA >0110 Schwarz color code black
HINTER DATA >0000 Transparent
HMMCA DATA >0700,>0001,>0600,>0800,>0000,>F000 aus 06 wird 3 means there are only 3 bytes involved
ASCA DATA >0000,>0011,>1001,>0001,>0100,>0101,>1111