Note on using a terminal (Zterm) to transfere text files to amforth. amforth used ''rx0'' and ''tx0'' as ''key'' and ''emit''. ''rx0'' and ''tx0'' where interupt driven and worked with an input and output queue to provide a fast I/O. But this queues caused trouble in text pacing with some terminals when sending textfiles instead of typing manualy. Characters got lost and buffer overrun ocured. The text pacing feature of Ztern - wait for character echo - worked best, when a simple key and emit mechanism was used that just polled the UASRT. This way the character echo done by ''accept'' had the funktion of a request for another character from terminal. There was no need to set a charcter delay time for the text pacing in terminal this way. This waiting for charcter echo includes control character ''cr'' (carriage return). As ''cr'' is not echoed by amforth until interpreting the terminal input buffer ''TIB'' is complete, terminal waits at the end of a line until amforth is ready to accept characters again. Compiling new words worked very well this way. (We remember: During compilation - i.e. writing the flash - the interupts have to be off, and turning them on again seemed to cause extra trouble with rx0 and tx0.) So if you have trouble sending text to amforth, try this simple I/O. ; Simple USART I/O in amforth polling the UDR of USART. ; USART funktions: ; USART I/O Data Register UDR ; Write to UDR --> transmit character to terminal. ; Read from UDR <-- recieve character send by terminal. ; USART Control and Status Register A UCSRA ; Bit 7 RXC: USART Receive Complete ; Bit 6 TXC: USART Transmit Complete ; Bit 5 UDRE: USART Data Register Empty ; Bit 4 FE: Frame Error ; Bit 3 DOR: Data OverRun ; Bit 2 UPE: USART Parity Error ; Bit 1 U2X: Double the USART Transmission Speed ; Bit 0 MPCM: Multi-processor Communication Mode ; USART Control and Status Register B UCSRB ; Bit 7 RXCIE: RX Complete Interrupt Enable ; Bit 6 TXCIE: TX Complete Interrupt Enable ; Bit 5 UDRIE: USART Data Register Empty Interrupt Enable ; Bit 4 RXEN: Receiver Enable ; Bit 3 TXEN: Transmitter Enable ; Bit 2 UCSZ2: Character Size ; Bit 1 RXB8: Receive Data Bit 8 ; Bit 0 TXB8: Transmit Data Bit 8 ; USART Control and Status Register C UCSRC ; Bit 7 - nc ; Bit 6 UMSEL: USART Mode Select ; Bit 5:4 UPM1:0: Parity Mode ; Bit 3 USBS: Stop Bit Select ; Bit 2:1 UCSZ1:0: Character Size ; Bit 0 UCPOL: Clock Polarity ; USART Baud Rate Registers BRRL and UBRRH ; bit ruler ; %76543210 ; 11000 ; 110 ; ( -- v) System Value ; R( -- ) ; returns usart0 baudrate VE_BAUD0: .db 05,"baud0" .dw VE_HEAD .set VE_HEAD = VE_BAUD0 XT_BAUD0: .dw PFA_DOVALUE PFA_BAUD00: .dw 10 ; adjust settings to your needs. VE_USART0INIT: .db 10 ,"initusart0", 0 .dw VE_HEAD .set VE_HEAD = VE_USART0INIT XT_USART0INIT: .dw DO_COLON PFA_USART0INIT: ; ( -- ) .dw XT_DOLITERAL .dw $18 ; $18 . 11000 ok .dw XT_DOLITERAL .dw UCSRB .dw XT_CSTORE .dw XT_DOLITERAL .dw $6 ; $6 . 110 ok .dw XT_DOLITERAL .dw UCSRC .dw XT_CSTORE .dw XT_BAUD0 ; get sytem value from eeprom. .dw XT_DUP .dw XT_BYTESWAP .dw XT_DOLITERAL .dw UBRRH .dw XT_CSTORE .dw XT_DOLITERAL .dw UBRRL .dw XT_CSTORE .dw XT_EXIT ; Data register empty? UDRE=bit5 ) VE_DOEMITQ: .db 7 ,"doemit?" .dw VE_HEAD .set VE_HEAD = VE_DOEMITQ XT_DOEMITQ: .dw DO_COLON PFA_DOEMITQ: ; ( -- f ) .dw XT_DOLITERAL .dw UCSRA .dw XT_CFETCH .dw XT_DOLITERAL .dw $20 .dw XT_AND .dw XT_EXIT VE_DOEMIT: .db $6 ,"doemit",0 .dw VE_HEAD .set VE_HEAD = VE_DOEMIT XT_DOEMIT: .dw DO_COLON PFA_DOEMIT: ; ( c -- ) PFA_DOEMIT0: .dw XT_DOEMITQ .dw XT_DOCONDBRANCH .dw PFA_DOEMIT0 .dw XT_DOLITERAL .dw UDR .dw XT_CSTORE .dw XT_EXIT ; Recieve comlplete? RXC=bit7 ) VE_DOKEYQ: .db 6 ,"dokey?",0 .dw VE_HEAD .set VE_HEAD = VE_DOKEYQ XT_DOKEYQ: .dw DO_COLON PFA_DOKEYQ: ; ( -- f ) .dw XT_DOLITERAL .dw UCSRA .dw XT_CFETCH .dw XT_DOLITERAL .dw $80 .dw XT_AND .dw XT_EXIT VE_DOKEY: .db $5 ,"dokey" .dw VE_HEAD .set VE_HEAD = VE_DOKEY XT_DOKEY: .dw DO_COLON PFA_DOKEY: ; ( -- c ) PFA_DOKEY0: .dw XT_DOKEYQ ; begin .dw XT_DOCONDBRANCH .dw PFA_DOKEY0 ; until PFA_UDRFETCH: ; ( -- c ) .dw XT_DOLITERAL .dw UCSRA ; Must be read *bevor* udr, else not valid. .dw XT_CFETCH .dw XT_DOLITERAL .dw UDR .dw XT_CFETCH .dw XT_SWAP .dw XT_DOLITERAL .dw $8 .dw XT_AND ; Data overrun bit set? DOR=bit3 .dw XT_DOCONDBRANCH .dw PFA_UDRFETCH0 .dw XT_DOLITERAL .dw $80 .dw XT_OR ; Set bit7 in char to indicate DOR. PFA_UDRFETCH0: .dw XT_EXIT ; ' DOKEY is key ; ' DOEMIT is emit ; ' DOKEYQ is key? ; ' NOOP is /key ; ( -- ) Hardware Access ; R( --) ; set teriminal i/o vectors VE_SET_TERMINAL_VECTORS: .db 6, "set-tv", 0 .dw VE_HEAD .set VE_HEAD = VE_SET_TERMINAL_VECTORS XT_SET_TERMINAL_VECTORS: .dw DO_COLON PFA_SET_TERMINAL_VECTORS: ; ( -- ) .dw XT_DOLITERAL .dw XT_DOEMIT .dw XT_DOLITERAL .dw XT_EMIT .dw XT_DEFERSTORE .dw XT_DOLITERAL .dw XT_DOEMITQ .dw XT_DOLITERAL .dw XT_EMITQ .dw XT_DEFERSTORE .dw XT_DOLITERAL .dw XT_DOKEY .dw XT_DOLITERAL .dw XT_KEY .dw XT_DEFERSTORE .dw XT_DOLITERAL .dw XT_DOKEYQ .dw XT_DOLITERAL .dw XT_KEYQ .dw XT_DEFERSTORE .dw XT_DOLITERAL .dw XT_NOOP .dw XT_DOLITERAL .dw XT_SLASHKEY .dw XT_DEFERSTORE .dw XT_EXIT ; finis