From: Christian Johansson (c64_at_comhem.se)
Date: 2004-06-21 19:08:56
> Has anyone ported the Hug RS-232 routines to the VIC? > Also, has anyone built a 6551 cart for the VIC? > > I was going to do both for a prj I have in mind, but no sense > re-inventing the wheel. > > Jim > Unfortunately, I don't have an answer to that question. However, I have a similar question: Has anybody been able to use the Hug RS-232 routines to get 4800 bps on the C128? I think it should be possible since if it is possible to achieve 2400 bps on the C64 in 1 MHz with the routines, it should also be possible to achieve 4800 bps on the C128 in 2 MHz (with the built-in Kernal routines it is only possible to get 2400 bps in 2 MHz on the C128 and 1200 bps in 1 MHz on the C64). I think it should mainly be a matter of changing the bit times below to get 4800 bps working on the C128 in 2 MHz mode but since I don't understand how the bit times have been calculated I don't know what to set them to. Perhaps, the answer is in Transactor , Vol 9, Issue 3 but nobody has scanned it yet :-(. Apart from that, there is already a flag for C128 mode. Here is the code: ; Start bit times. ; strt24 .word 459 ; 2400 strt12 .word 1090 ; 1200 strt03 .word 4915 ; 300 ; ; Full bit times. ; full24 .word 421 ; 2400 full12 .word 845 ; 1200 full03 .word 3410 ; 300 -------------------------------------------------------------- ; ; NEWMODEM.SRC ; ; Routines by George Hug ; Transactor, Vol 9, Issue 3 ; ; Modified 9-26-90 by Fuzzy Fox to ; allow 7 bits plus parity to be ; sent. Multiple stops bits are ; still not supported. ; ;----------------------------------- ; ; Set the following flag to 1 ; for C128 mode. ; c128 = 0 ; .ifn c128 ; C128 mode ; ctrlreg1 = $0a10 ctrlreg2 = $0a11 ribuf = $c8 robuf = $ca baudof = $0a16 ridbe = $0a18 ridbs = $0a19 rodbs = $0a1a rodbe = $0a1b enabl = $0a0f rstkey = $fa4b norest = $fa5f return = $ff33 oldout = $ef79 oldchk = $f10e ochrin = $ef06 ogetin = $eeeb findfn = $f202 devnum = $f212 nofile = $f682 ; *= $1900 ; Start addr ; .else ; C64 mode ; ctrlreg1 = $0293 ctrlreg2 = $0294 ribuf = $f7 robuf = $f9 baudof = $0299 ridbe = $029b ridbs = $029c rodbs = $029d rodbe = $029e enabl = $02a1 rstkey = $fe56 norest = $fe72 return = $febc oldout = $f1ca oldchk = $f21b ochrin = $f157 ogetin = $f13e findfn = $f30f devnum = $f31f nofile = $f701 ; *= $cd00 ; .endif ; ;----------------------------------- ; ; Jump table. ; xx00 jmp setup xx03 jmp inable xx06 jmp disabl xx09 jmp rsget xx0c jmp rsout ; ; Start bit times. ; strt24 .word 459 ; 2400 strt12 .word 1090 ; 1200 strt03 .word 4915 ; 300 ; ; Full bit times. ; full24 .word 421 ; 2400 full12 .word 845 ; 1200 full03 .word 3410 ; 300 ; ;----------------------------------- ; setup .ifn c128 ; C128 mode. lda #<nmi128 ldy #>nmi128 .else ; C64 mode. lda #<nmi64 ldy #>nmi64 .endif sta $0318 sty $0319 lda #<nchkin ldy #>nchkin sta $031e sty $031f lda #<nbsout ldy #>nbsout sta $0326 sty $0327 lda #<nchrin ldy #>nchrin sta $0324 sty $0325 lda #<ngetin ldy #>ngetin sta $032a sty $032b rts ; ;----------------------------------- ; .ife c128 ; C64 mode. ; nmi64 pha ; Must save registers txa ; on the C64. pha tya pha .endif ; nmi128 cld ldx $dd07 ; Sample timer B high byte. lda #$7f ; Disable CIA NMI's. sta $dd0d lda $dd0d ; Read/clear flags. bpl notcia ; (Restore key). cpx $dd07 ; Timer B timeout? ldy $dd01 ; Sample pin C. bcs mask ; No Timer B timout. ora #$02 ; Yes, set flag in Acc. ora $dd0d ; Read/clear flags again. mask and enabl ; Mask out non-enabled. tax ; These must be serviced. lsr a ; Timer A? (Bit 0). bcc ckflag ; No lda $dd00 ; Yes, put bit on pin M. and #$fb ora $b5 sta $dd00 ckflag txa and #$10 ; Flag NMI? (Bit 4). beq nmion ; No. strtlo lda #$42 ; Yes, Start bit to Timer B. sta $dd06 strthi lda #$04 ; These values are self-modifying. sta $dd07 lda #$11 ; Start Timer B counting. sta $dd0f lda #$12 ; Flag NMI off, Timer B on. eor enabl ; Update mask. sta enabl sta $dd0d ; Enable new configuration. fulllo lda #$4d ; Change reload latch. sta $dd06 ; to full-bit time. fullhi lda #$03 ; These values are self-modifying. sta $dd07 lda #$08 ; Number of bits to receive. sta $a8 bne chktxd ; Branch always. notcia ldy #$00 jmp rstkey ; or JMP NOREST to disable Restore. nmion lda enabl ; Re-enable NMI's. sta $dd0d txa and #$02 ; Timer B? (Bit 1). beq chktxd ; No. tya ; Yes, sampled from way back when. lsr a ror $aa ; RS232 is LSB first. dec $a8 ; Byte finished? bne txd ; No. ldy ridbe ; Yes, put byte to buffer. lda $aa sta (ribuf),y ; (No over-run test!) inc ridbe lda #$00 ; Stop Timer B. sta $dd0f lda #$12 ; Timer B NMI off, Flag on. switch ldy #$7f ; Disable NMI's. sty $dd0d sty $dd0d ; Twice. eor enabl ; Update mask. sta enabl sta $dd0d ; Enable new config. txd txa lsr a ; Timer A? chktxd bcc exit ; No. dec $b4 ; Yes, byte finished? bmi char ; Yes. lda #$04 ; No, prep next bit. ror $b6 ; (Fill with stop bits). bcs store low lda #$00 store sta $b5 exit jmp return ; Restore regs, RTI. char ldy rodbs cpy rodbe ; Buffer empty? beq txoff ; Yes. getbuf lda (robuf),y ; No, prep next byte. inc rodbs sta $b6 lda #$09 ; Number of bits to send. sta $b4 bne low ; Always - do start bit. txoff ldx #$00 ; Stop Timer A. stx $dd0e lda #$01 ; Disable Timer A NMI. bne switch ; Always. ; ;----------------------------------- ; disabl pha ; Turns off modem port. test lda enabl and #$03 ; Any current activity? bne test ; Yes, test again. lda #$10 ; No, disable Flag NMI. sta $dd0d lda #$02 and enabl ; Currently receiving? bne test ; Yes, start over. sta enabl ; All off, update mask. pla rts ; ;----------------------------------- ; nbsout pha ; New BSOUT. lda $9a cmp #$02 bne notmod pla rsout sta $9e ; Output to modem. sty $97 ; ---- Patch by Fox ---- lda #$20 bit ctrlreg2 ; Parity being generated? beq point ; No, so send the full 8 bits. php ; Save flag settings. lda $9e and #$7f ; Set byte to 7 bits. tay plp ; Restore flags. bmi 10$ ; Mark/Space parity. lda parity,y 10$ bvs 90$ eor #$80 ; Flip parity if wrong sense. 90$ sta $9e ; ---- End Patch ---- point ldy rodbe lda $9e sta (robuf),y ; Not official yet. iny cpy rodbs ; Buffer full? beq fulbuf ; Yes. sty rodbe ; No, bump pointer. strtup lda enabl and #$01 ; Transmitting now? bne ret3 ; Yes. sta $b5 ; No, prep start bit. lda #$09 sta $b4 ; Number of bits to send. ldy rodbs lda (robuf),y sta $b6 ; and next byte. inc rodbs lda baudof ; Full Tx bit time to Timer A. sta $dd04 lda baudof+1 sta $dd05 lda #$11 ; Start Timer A. sta $dd0e lda #$81 ; Enable Timer A NMI. change sta $dd0d ; NMI clears flag if set. php ; Save IRQ status. sei ; Disable IRQ's. ldy #$7f ; Disable NMI's. sty $dd0d sty $dd0d ; Twice. ora enabl ; Update mask. sta enabl sta $dd0d ; Enable new configuration. plp ; Restore IRQ status. ret3 clc ldy $97 lda $9e rts fulbuf jsr strtup jmp point notmod pla ; Back to old BSOUT. jmp oldout ; ;----------------------------------- ; nchkin jsr findfn ; New CHKIN. bne nosuch jsr devnum lda $ba cmp #$02 bne back sta $99 inable sta $9e ; Enable RS232 input. sty $97 baud lda baudof+1 ; Set receive to same and #$06 ; baud rate as xmit. tay lda strt24,y sta strtlo+1 ; Self-mod lda strt24+1,y sta strthi+1 lda full24,y sta fulllo+1 lda full24+1,y sta fullhi+1 lda enabl and #$12 ; Flag or Timer B on? bne ret1 ; Yes. sta $dd0f ; No, stop Timer B. lda #$90 ; Turn on Flag NMI. jmp change nosuch jmp nofile back lda $ba jmp oldchk ; ;----------------------------------- ; nchrin lda $99 ; New CHRIN. cmp #$02 beq rsget jmp ochrin ngetin lda $99 ; New GETIN. cmp #$02 beq rsget jmp ogetin ; rsget sta $9e ; Input from modem. sty $97 ldy ridbs cpy ridbe ; Buffer empty? beq ret2 ; Yes. lda (ribuf),y ; No, fetch character. sta $9e ; ---- Patch by Fox ---- ldy ctrlreg2 ; Parity expected? cpy #$20 bcc 10$ ; No, so keep all 8 bits. and #$7f ; Otherwise reduce to 7 bits. sta $9e 10$ ; ---- End Patch ---- inc ridbs ret1 clc ; CC = char in acc. ret2 ldy $97 lda $9e last rts ; CS = buffer empty. ; ;----------------------------------- ; ; This table looks up the odd parity value for a byte between 0-7F. ; If the parity to be sent is even parity, the high bit is simply ; toggled. ; parity .byte $00,$81,$82,$03,$84,$05,$06,$87 .byte $88,$09,$0a,$8b,$0c,$8d,$8e,$0f .byte $90,$11,$12,$93,$14,$95,$96,$17 .byte $18,$99,$9a,$1b,$9c,$1d,$1e,$9f .byte $a0,$21,$22,$a3,$24,$a5,$a6,$27 .byte $28,$a9,$aa,$2b,$ac,$2d,$2e,$af .byte $30,$b1,$b2,$33,$b4,$35,$36,$b7 .byte $b8,$39,$3a,$bb,$3c,$bd,$be,$3f .byte $c0,$41,$42,$c3,$44,$c5,$c6,$47 .byte $48,$c9,$ca,$4b,$cc,$4d,$4e,$cf .byte $50,$d1,$d2,$53,$d4,$55,$56,$d7 .byte $d8,$59,$5a,$db,$5c,$dd,$de,$5f .byte $60,$e1,$e2,$63,$e4,$65,$66,$e7 .byte $e8,$69,$6a,$eb,$6c,$ed,$ee,$6f .byte $f0,$71,$72,$f3,$74,$f5,$f6,$77 .byte $78,$f9,$fa,$7b,$fc,$7d,$7e,$ff ; .end Message was sent through the cbm-hackers mailing list
Archive generated by hypermail pre-2.1.8.