TI-99/4A Corcomp Floppy Disk Controller

There are 2 ROM sets available for this floppy controller. The original ROMs shipped with the controller completely replaced the TI title screen. This interfered with some other systems or software on the TI-99/4A. Consequently Miller Graphics released an updated set of ROMs that provided a substantially more neutral experience, while still including some of the BASIC subroutine enhancements.

But still pisses on the TI title screen

The Miller Graphics ROMs still overwrite part of the stock TI title screen with their own branding. I find this distasteful. So I set about to eliminate this from the ROMs I have.

To start I disassembled the ROM header to find the POWER entry in the power-up link list. Luckily it was in the bank 1 ROM that I started with.

A subset of ROM 1 disassembly

POWER   MOV     r11,r7           ; pc:>4126 w:>c1cb     ; stash return addr
        CLR     @L2UNIT          ; pc:>4128 w:>04e0
        LI      r1,>001e         ; pc:>412c w:>0201     ; specify subroutine in bank 2 to call
        BL      @CBANK           ; pc:>4130 w:>06a0     ; trampoline
        STWP    r9               ; pc:>4134 w:>02a9     ; get GPLWS addr
        AI      r9,>ff20         ; pc:>4136 w:>0229     ; subtract e0 for base of scratchpad addr
        MOV     @>8370,r0        ; pc:>413a w:>c020     ; copy screen address
        MOV     r0,r2            ; pc:>413e w:>c080
        AI      r0,>f7d8         ; pc:>4140 w:>0220     ; subtract 2088 bytes
        MOV     r0,@>8370        ; pc:>4144 w:>c800     ; stash this new addr
        INC     r0               ; pc:>4148 w:>0580     ; erase some buffers ??
        BL      @SETVWA          ; pc:>414a w:>06a0
        LI      r1,>0828         ; pc:>414e w:>0201
        LI      r4,VDPWD         ; pc:>4152 w:>0204
LZERO   CLR     *r4              ; pc:>4156 w:>04d4     ; write 0 to VDP
        DEC     r1               ; pc:>4158 w:>0601
        JNE     LZERO            ; pc:>415a w:>16fd
        BL      @SETVWA          ; pc:>415c w:>06a0
        LI      r3,>aa03         ; pc:>4160 w:>0203
        MOVB    r3,*r4           ; pc:>4164 w:>d503
        JMP     >4168            ; pc:>4166 w:>1000     ; NOP
        MOVB    r2,*r4           ; pc:>4168 w:>d502
        SWPB    r2               ; pc:>416a w:>06c2
        MOVB    r2,*r4           ; pc:>416c w:>d502
        JMP     >4170            ; pc:>416e w:>1000     ; NOP
        MOVB    r12,*r4          ; pc:>4170 w:>d50c
        SWPB    r3               ; pc:>4172 w:>06c3
        MOVB    r3,*r4           ; pc:>4174 w:>d503
        BL      @>43cc           ; pc:>4176 w:>06a0
        AI      r12,>0008        ; pc:>417a w:>022c
        LDCR    @>426a,5         ; pc:>417e w:>3160
        AI      r12,>fff8        ; pc:>4182 w:>022c
        SBZ     1                ; pc:>4186 w:>1e01
        SBO     1                ; pc:>4188 w:>1d01
        MOVB    @>426c,@>5ff8    ; pc:>418a w:>d820
        BL      @>5c26           ; pc:>4190 w:>06a0
        SZC     *r12+,r10        ; pc:>4194 w:>42bc
        LI      r0,>0020         ; pc:>4196 w:>0200     ; set VDP write address to 2nd line of screen : OR replace this with JMP @>41c4 a.k.a. >1016
        BL      @SETVWA          ; pc:>419a w:>06a0
        LI      r0,>2000         ; pc:>419e w:>0200     ; load SPACE into r0
        LI      r1,>0020         ; pc:>41a2 w:>0201     ; r1 count with 32 characters
LSPAC   MOVB    r0,@>fffe(r15)   ; pc:>41a6 w:>dbc0     ; write a SPACE to indirect WD address
        DEC     r1               ; pc:>41aa w:>0601
        JNE     LSPAC            ; pc:>41ac w:>16fc
        CLR     r0               ; pc:>41ae w:>04c0     ; set address to beginning of screen
        BL      @SETVWA          ; pc:>41b0 w:>06a0
        LI      r0,>43aa         ; pc:>41b4 w:>0200     ; copy 32 bytes from ROM 43AA to screen
        LI      r1,>0020         ; pc:>41b8 w:>0201
LBANR   MOVB    *r0+,@>fffe(r15) ; pc:>41bc w:>dbf0
        DEC     r1               ; pc:>41c0 w:>0601
        JNE     LBANR            ; pc:>41c2 w:>16fc     ; can NOP down to here to avoid the loop entirely
        SBZ     1                ; pc:>41c4 w:>1e01

From this I determined that the title screen VDP memory area was being overwritten at PC 0x4196. It starts on the second line of the title screen. Then clears 32 (1 line) characters. Then it goes back to the beginning of that second line and copies 32 characters from the ROM onto the screen.

Note: Clearing the line first is completely wasteful. While the powerup routine is running the screen is ‘off’ only showing the background color.

It is done copying the new text onto the screen at PC 41c4 where it begins to initialize the state of the controller card.

So, simply jumping over the 2 loops will eliminate the title screen change and leave it the pristine, nostalgic image that I am used to from my youth.

To do this, simply replace the LI r0,>0020 instruction >0200 at address 0x4196 with forward jump of 22 words, >1016 in machine code. This is at offset 0x0196 in an eprom programmer memory editor, as the ROMs base address is 0x4000.

These instructions apply to a bank 1 (1 of 2) ROM that has an original md5sum of 444886597c3c8002808751688f90dcd7. If the change is performed correctly, the new md5sum will be 395eade664216a8b320fd0f02c421de8.