[Coco] Frank Hogg Labs E-Forth, which is the only thing I’ve found that won’t run on the CoCo3FPGA ?

Stephen Pereira stephen.m.pereira.sr at gmail.com
Sat Feb 24 08:44:24 EST 2018


Well, if any of you smart guys can produce a patched version of the FHL E-Forth, would you please be kind enough to share it, so I can finally get it on my CoCo3FPGA?  That way, I will finally be able to read the screen and finally be able to actually use it!  8-)

Thanks a million, in advance!

smp
- - -
Stephen Pereira
Bedford, NH  03110
KB1SXE


> On Feb 23, 2018, at 5:13 AM, Leslie Ayling <layling at bigpond.net.au> wrote:
> 
> Hi Stephen, Dave, et al.
> 
>> If you smart guys can find a work-around to get FHL E-Forth to work on the CoCo3FPGA, I will be very grateful!
> 
> Yep, certainly do-able.
> 
> I've located the routine in the Forth executable which scans the keyboard matrix.
> See below with some comments.
> 
> As Dave surmised, it does indeed drive the keyboard ports in a non-standard way.
> 
> The routine relies on the fact that a *real* 6821 PIO has internal pull-up resistors on Port A.
> Instead of driving all bits of $F002 as outputs, it only drives one column at a time, the other bits will float high
> and appear as '1' when reading the row value from $F000.
> 
> From what I can see, only David Keil's MS-DOS emulator correctly emulates the pull-ups on port A.
> 
> Coco3FPGA certainly doesn't handle it, neither does VCC or Jeff V's emulators. 
> 
> Probably easiest to patch the routine so that it will just work on both real hardware and *all* the emulators. 
> 
> 
> RAM:302C
> RAM:302C                READ_KBD_PIO:                           ; CODE XREF: RAM:loc_3086↓p
> RAM:302C 34 1E                          pshs    a,b,dp,x
> RAM:302E 86 FF                          lda     #$FF
> RAM:3030 1F 8B                          tfr     a, dp           ; Direct Page = $FFXX now
> RAM:3032 DC 02                          ldd     <byte_2         ; read A <= $FF02, B <= $FF03
> RAM:3034 34 02                          pshs    a
> RAM:3036 C8 04                          eorb    #4              ; Flip DDR select bit for port B ($FF02)
> RAM:3038 D7 03                          stb     <byte_3         ; save old contents of $FF03 back to $FF03 ???
> RAM:303A 96 02                          lda     <byte_2         ; A <= $FF02
> RAM:303C 34 06                          pshs    a,b             ; $FF $10 on first run through
> RAM:303E 8E 30 24                       ldx     #word_3024
> RAM:3041 86 01                          lda     #1              ; start at column 0 : @,H,P,X,0,8,<ENTER>
> RAM:3043
> RAM:3043                loc_3043:                               ; CODE XREF: READ_KBD_PIO+32↓j
> RAM:3043 C6 30                          ldb     #$30 ; '0'
> RAM:3045 D7 03                          stb     <byte_3         ; $FF03 select DDR in $FF02
> RAM:3047 97 02                          sta     <byte_2         ; *$FF02 select only *1* column as output, rest are HI-Z (value in A)
> RAM:3049 C6 34                          ldb     #$34 ; '4'
> RAM:304B D7 03                          stb     <byte_3         ; select output register
> RAM:304D 0F 02                          clr     <byte_2         ; $FF02 <= $00, but only one bit will be selected as an output.
> RAM:304D                                                        ; ** Next instruction relies on the internal pull-ups on port A **
> RAM:304D                                                        ; Only one bit can be low!
> RAM:304F D6 00                          ldb     <byte_0         ; read B <= $FF00,
> RAM:3051 53                             comb
> RAM:3052 E4 10                          andb    -$10,x          ; $3014 -> $301B
> RAM:3054 E7 10                          stb     -$10,x
> RAM:3056 D6 00                          ldb     <byte_0
> RAM:3058 53                             comb
> RAM:3059 EA 84                          orab    ,x              ; $3024 -> $302B
> RAM:305B E7 80                          stb     ,x+
> RAM:305D 48                             asla                    ; shift column select bit left for next run through
> RAM:305E 24 E3                          bcc     loc_3043        ; have we done all 8 columns yet?
> RAM:3060 35 06                          puls    b,a
> RAM:3062 D7 03                          stb     <byte_3
> RAM:3064 97 02                          sta     <byte_2
> RAM:3066 C8 04                          eorb    #4
> RAM:3068 D7 03                          stb     <byte_3
> RAM:306A 35 02                          puls    a
> RAM:306C 97 02                          sta     <byte_2
> RAM:306E 35 9E                          puls    pc,x,dp,b,a
> RAM:306E                ; End of function READ_KBD_PIO
> 
> 
> Cheers,
> Leslie
> 
> 
> -----Original Message-----
> From: Coco [mailto:coco-bounces at maltedmedia.com] On Behalf Of Stephen Pereira
> Sent: Friday, 23 February 2018 12:03 PM
> To: CoCoList for Color Computer Enthusiasts
> Subject: Re: [Coco] Frank Hogg Labs E-Forth, which is the only thing I’ve found that won’t run on the CoCo3FPGA ?
> 
> If you smart guys can find a work-around to get FHL E-Forth to work on the CoCo3FPGA, I will be very grateful!
> 
> smp
> - - -
> Stephen Pereira
> Bedford, NH. 03110
> KB1SXE
> 
> 
>> On Feb 22, 2018, at 7:27 PM, Leslie Ayling <layling at bigpond.net.au> wrote:
>> 
>> Hi Dave, et al.
>> 
>> I'm finding it very interesting indeed.
>> 
>> I've tried E-Forth out on all the available emulators I have.
>> 
>> Only works correctly on David Keil's MS-DOS emulator, but it's difficult to debug there.
>> 
>> Doesn't work on VCC or Jeff V's emulators, you just get a row of chars for each keypress.
>> 
>> Still trying to work out exactly what it is doing....
>> 
>> 
> 
> 
> -- 
> Coco mailing list
> Coco at maltedmedia.com
> https://pairlist5.pair.net/mailman/listinfo/coco



More information about the Coco mailing list