terça-feira, 19 de fevereiro de 2008

RX232 - Primeira versão compilável

Integrei hoje a rotina de recepção de um único byte na rotina de recepçao de buffer, e já tenho uma estimativa do tamanho do 'driver' de recepção após compilado: 122 bytes.
Agora tenho que passar um pente fino na lógica, no uso dos registradores e da pilha. Mas eventuais correções não vão alterar sensivelmente o tamanho do código gerado.

Tenho ainda que construir o adaptador RS232 (com um MAX232) para poder testar o hardware.

Segue abaixo o código:
;
; Recepcao serial via
; porta de Joystick do MSX
;
; danjovic@hotmail.com
; http://hotbit.blogspot.com
;
; Versao 0.1 18/02/2008
;
; Licenca de uso: GNU GPL
;
;
; Compilado no ASMSX
; http://www.robsy.net/asmsx.htm

ORG 0E000H

.BASIC
.START RX232

;
; Bits do Registro 14 do PSG
;
BRTS EQU 0 ; UP
BRXD EQU 1 ; DOWN
MRXD EQU 0FDH ; mask for bit BRXD
;
; Bits do Registro 15 do PSG
;
BTXD EQU 2 ; TRG1
BCTS EQU 5 ; TRG2
ABSEL EQU 6 ; A/B Port select

;
; Registros do PSG
;
PSGAD EQU 0A0H
PSGWR EQU 0A1H
PSGRD EQU 0A2H

; Variaveis em RAM
PSGSAV EQU 0F974H ; RS232 putback
; Not used in MSX
;
; Constantes

; BaudRates
;RBAUD EQU 6 ; 19200 Bauds, (6)
;RBAUD EQU 10 ; 14400 Bauds, (10)
RBAUD EQU 18 ; 9600 Bauds, (17-19)
;RBAUD EQU 42 ; 4800 Bauds, (41-43)
;RBAUD EQU 92 ; 2400 Bauds, (90-93)
;RBAUD EQU 190 ; 1200 Bauds, (188-191)

ERFUL EQU 0FFH ; Buffer cheito
ERFRM EQU 0FEH ; Framing error
ERBRK EQU 0FDH ; RTS off antes startbit


RX232:
; Entradas: HL = Ender Buffer em RAM
; C = Tam maximo do buffer
; Saicas : D = Bytes recebidos
; CY = 0, OK
; CY = 1, Error; A=Codigo erro
;
LD A,15
OUT [PSGAD],A
IN A,[PSGRD]
LD [PSGSAV],A
SET ABSEL,A
LD E,A
LD D,0
NEWBYTE: LD A,14
OUT [PSGAD],A
IN A,[PSGRD]
AND A ; Clear carry
BIT BRTS,A
LD A,D
JR NZ,EXIT ; RTS off

LD A,D
CP C
LD A,ERFUL
JR C,EXIT ; Buffer full

PUSH BC
PUSH HL
CALL RECEIVE
POP HL
POP BC
JR C,EXIT ; Error

LD [HL],A ; Save byte
INC HL
INC D ; Incr counter
JR NEWBYTE ; Next byte

EXIT: PUSH AF
LD A,15
OUT [PSGAD],A
LD A,[PSGSAV]
OUT [PSGWR],A
POP AF
RET


RECEIVE:
; Recebe um único caractere
; E - State of PSG register 15
; Currently selected PSG rgister 14
; Return Byte received in Register A

; init local variables
LD B,10 ; bits to receive
LD H,RBAUD ; Baud rate delay
LD L,H
AND A ; Clear CY
RR L ; L= L\2, Half bit timer
SET BCTS,E ; CTS ON

; CTS=ON
; Set PSG register 15
LD A,15
OUT [PSGAD],A
LD A,E
RES BCTS,E ; Reg 15 with CTS OFF
OUT [PSGWR],A

; Set PSG register 14
LD A,14
OUT [PSGAD],A

WAITSTRT: ; Awaits Start Bit
IN A,[PSGRD]
BIT BRXD,A
JR Z,MEIOBIT ;
BIT BRTS,A
JR NZ,WAITSTRT

;Break: RTS went off before
; Start bit
LD A,ERBRK
SCF
RET

; Receive 10 bits
; First is discarded,
; last is the Stop Bit
RXBIT: LD L,H ; Reload delay time

; Delay for bit time
MEIOBIT: DEC L
JR NZ,MEIOBIT

RR C
IN A,[PSGRD]
AND MRXD ; Mask RXD bit
NEG ; RXD to Carry Flag
DJNZ RXBIT ;
; Here Carry contains Stop Bit

; CTS=OFF
; Set PSG register 15
LD A,15
OUT [PSGAD],A
LD A,E ; Reg E has bit CTS off
OUT [PSGWR],A

LD A,ERFRM
CCF ; invert CY to indicate
; Framing error
RET C

LD A,C ; Se sucesso, retorna
RET ; NC, A=byte recebido

Nenhum comentário: