[comp.sys.cbm] RS-232 routines to allow 2400 on C-64.

rhebi@pnet02.gryphon.com (Roy Hebi) (10/24/89)

Hello all!
 As I promised, I hereby include a message downloaded from another place on
the net, which gives a source in assembler for new routines to replace the ROM
routines for handling RS-232. These routines are supposed to work in 2400.

Following is the original message sent on the net somewhere else:

-------------------- BEGIN QUOTE --------------------------
Article 1322 of comp.sys.cbm:

Path: taurus!rocky8!cmcl2!rutgers!usc!merlin.usc.edu!nunki.usc.edu!aliu

From: aliu@nunki.usc.edu (Terminal Entry)

Newsgroups: comp.sys.cbm

Subject: RS232 Replacement Routine (MEDIUM LENGTH)

Summary: do relable 2400 on the c64.

Keywords: source, 2400, rs232

Message-ID: <4843@merlin.usc.edu>

Date: 24 Aug 89 00:14:48 GMT

Sender: news@merlin.usc.edu

Reply-To: aliu@nunki.usc.edu (Terminal Entry)

Organization: Classified

Lines: 417





I found this source on a bbs, and thought I'd share it with everybody.

It replaces the bult-in RS232 routines on the c64 allowing reliable 2400

baud communications.



The file was originally in PAL format, and had absolutelly no comments. So,

you may blame me for faulty commenting. But please don't blame me for faulty

coding.



When I tested it out, I first called SETUP and INABLE (sic) after I opened

the channel as file #2 (or 5,  use them interchangebly). Then, I used RSGET

instead of the kernal getin ($ffe4) to get bytes from the modem. I am not sure

what you would use RSOUT for, I didn't find it required. However, I did NOT

make extensive test wth it. Just a couple of minutes on-line at 2400. The

text came throught crystal clear at 2400.



Enjoy.



------------------------------- CUT HERE --------------------------------------



.obj "new-rs232.ml"   ; buddy pseudo-op to assemble  to disk

 

 

;   Replacement  rs-232 routine for the Commodore 64

;   to enable reliable transmission at 2400 bits/sec

    

;    Note: file is in Power Assembler 'EBUD' format 

;           object file is $1ee bytes.





;-----  equates table  -------------------------------



ribuf  = $f7    ; rs232 input buffer pointer

robuf  = $f9    ; rs232 ouput buffer pointer

baudof = $0299  ; rs232 baud rate

ridbe  = $029b  ; rs232 index to end of input buffer

ridbs  = $029c  ; rs232 start of input buffer

rodbs  = $029d  ; rs232 start of output buffer

rodbe  = $029e  ; rs232 index to end of ouput buffer

enabl  = $02a1  ; rs232 enable

nminv  = $0318  ; vector: nmi

ichkin = $031e  ; vector: chkin

ibsout = $0326  ; vector: chrout

dataa  = $dd00  ; data port a

datab  = $dd01  ; data port b

timblo = $dd06  ; timer B lo byte

timbhi = $dd07  ; timer B hi byte

rdnmi  = $dd0d  ; read/mask nmi

crega  = $dd0e  ; cia control reg a

cregb  = $dd0f  ; cia control reg b

rstkey = $fe56  ; 

norest = $fe72

return = $febc

oldout = $f1ca

oldchk = $f21b

findfn = $f30f

devnum = $f31f 

nofile = $f701 





;  jump table



jmp setup     ; setup new rs-232 routine

jmp inable    ; enable the new routine

jmp disabl    ; disable the new routine

jmp rsget 

jmp rsout 





nop



strt24 .byte 203,1

strt12 .byte  66,4

strt03 .byte  51,19

full24 .byte 165,1

full12 .byte  77,3

full03 .byte  82,13



setup = *



lda #<nmi64    ; redirect nmi vector

ldy #>nmi64

sta nminv+00

sty nminv+01

:

lda #<nchkin   ; redirect chkin vector

ldy #>nchkin

sta ichkin+00

sty ichkin+01

:

lda #<nbsout   ; redirect chrout vector

ldy #>nbsout

sta ibsout+00

sty ibsout+01

rts



;-----  new nmi routine here  -----------------------



nmi64 = *

:

pha          ; save registers

txa

pha

tya

pha

cld

ldx timbhi   ; $dd07

lda #$7f

sta rdnmi    ; $dd0d

lda rdnmi

bpl notcia

cpx timbhi   ; $dd07

ldy datab    ; $dd01

bcs mask

ora #$02

ora rdnmi    ; $dd0d



mask = *

:

and enabl

tax

lsr

bcc ckflag

lda dataa    ; $dd00

and #$fb

ora $b5

sta dataa    ; $dd00

ckflag txa

and #$10

beq nmion

 

strtlo = *

:

lda #$42

sta timblo   ; $dd06

 

strthi = *

:

lda #$04

sta timbhi   ; $dd07

             

lda #$11

sta cregb    ; $dd0f

lda #$12

eor enabl

sta enabl

sta $dd0d

 

fulllo = *

:

lda #$4d

sta timblo   ; $dd06

 

fullhi = *

:

lda #$03

sta timbhi   ; $dd07

 

lda #$08

sta $a8

bne chktxd

 

notcia = *

:

ldy #00

jmp rstkey

 

nmion = *

:

lda enabl

sta rdnmi    ; $dd0d

txa

and #$02

beq chktxd

tya

lsr

ror $aa

dec $a8

bne txd

ldy ridbe

lda $aa

sta (ribuf),y

inc ridbe

lda #$00

sta cregb    ; $dd0f

lda #$12

 

switch = *     

:

ldy #$7f

sty rdnmi    ; $dd0d

sty rdnmi    ; $dd0d  (redundand?)

eor enabl

sta enabl

sta rdnmi    ; $dd0d

 

txd = *

:

txa

lsr

 

chktxd = *

:

bcc exit

dec $b4

bmi char

lda #$04

ror $b6

bcs store

 

low = *

:

lda #$00

 

store = *

:

sta $b5

 

exit = *

:

jmp return

 

char = *

:

ldy rodbs

cpy rodbe

beq txoff

 

getbuf = *

:

lda (robuf),y

inc rodbs

sta $b6

lda #$09

sta $b4

bne low

 

txoff = *

:

ldx #$00

stx crega    ; $dd0e

lda #$01

bne switch





;-----  routine to disable the new-rs232  ------------



disabl = *

:

pha

  

test = *

:

lda enabl

and #$03

bne test

lda #$10

sta $dd0d

lda #$02

and enabl

bne test

sta enabl

pla

rts





;-----------------------------------------------------



nbsout = *

:

pha

lda $9a

cmp #$02

bne notmod

pla

 

rsout = *

:

sta $9e

sty $97

 

point = *

:

ldy rodbe

sta (robuf),y

iny

cpy rodbs

beq fulbuf

sty rodbe

 

strtup = *

:

lda enabl

and #$01

bne ret3

sta $b5

lda #$09

sta $b4

ldy rodbs

lda (robuf),y

sta $b6

inc rodbs

lda baudof

sta $dd04

lda baudof+1

sta $dd05

lda #$11

sta crega    ; $dd0e

lda #$81

 

change = *

:

sta rdnmi    ; $dd0d

php

sei

ldy #$7f

sty rdnmi    ; $dd0d

sty rdnmi    ; $dd0d (redundand?)

ora enabl

sta enabl

sta rdnmi

plp

 

ret3 = *

:

clc

ldy $97

lda $9e

rts

 

fulbuf = *

:

jsr strtup

jmp point

 

notmod = *

:

pla

jmp oldout





;



nchkin = *

:

jsr findfn

bne nosuch

jsr devnum

lda $ba

cmp #$02

bne back

sta $99

 

inable = *

:

sta $9e

sty $97

 

baud = *

:

lda baudof+1

and #$06

tay

lda strt24,y

sta strtlo+1

lda strt24+1,y

sta strthi+1

lda full24,y

sta fulllo+1

lda full24+1,y

sta fullhi+1

lda enabl

and #$12

bne ret1

sta cregb    ; $dd0f

lda #$90

jmp change

 

nosuch = *

:

jmp nofile

 

back = *

:

lda $ba

jmp oldchk





;-----  new rs232 get routine  -----------------------



rsget = *

:

sta $9e

sty $97

ldy ridbs

cpy ridbe

beq ret2

lda (ribuf),y

sta $9e

inc ridbs

 

ret1 = *

:

clc



ret2 = *

:

ldy $97

lda $9e



last = *

:

rts



;-----------------------------------------------------



.end






------------------------- END QUOTE --------------------

I am very sorry about the double line spacing. It happened because of the
ascii translation I made when I transported the text to my IBM for uploading.

I hope this satisfies those of us who wanted this file.
About my 80-columns routines, I have so far recieved only one request for them
I am still waiting for more requests so I can post them to the net.

If you are interested in my sources for the 80-columns driver (read previous
postings about VIP & 2400 for more info), just send private email to me.

If there are not enough people wanting my routines, I will send them
personally to each one.

        Yours,


 Roy Hebi,

UUCP: {ames!elroy, <routing site>}!gryphon!pnet02!rhebi
INET: rhebi@pnet02.gryphon.com