TITLE FELANZ.MAC (c) 1989 Tesla Elstroj & JaMeSoft .Z80 ;***************************************************************************** ; DEFINICE ZROM EQU 0 ZROM_SIZE EQU 4 * 1024 ZRAM EQU 0C000H ZRAM_SIZE EQU 2 * 1024 STACK EQU 0 SWITCH_PORT EQU 4000H SELF_RESET_ADR EQU 8000H TX_IDLE EQU 0 TX_REQUEST EQU 1 TX_REJECTED EQU 80H TX_WAITING_ACK EQU 0FEH TX_TIMEOUTED EQU 0FFH POST_OK EQU 'OK' POST_ERROR EQU 'ER' MIN_PACKET EQU 10 MIN_FRAME EQU MIN_PACKET-1 MAX_FRAME EQU 600 DATA_A EQU 0 CTRL_A EQU DATA_A+1 DATA_B EQU DATA_A+2 CTRL_B EQU DATA_A+3 RR0 EQU 0 RR1 EQU 1 RR2 EQU 2 WR0 EQU 0 WR1 EQU 1 WR2 EQU 2 WR3 EQU 3 WR4 EQU 4 WR5 EQU 5 WR6 EQU 6 WR7 EQU 7 ;............................................................................. ; RR 0 RX_CHAR_AVAIL EQU 00000001B INT_PENDING EQU 00000010B TX_BUF_EMPTY EQU 00000100B DCD_ACTIVE EQU 00001000B RX_DIS_OR_HUNT EQU 00010000B CTS_ACTIVE EQU 00100000B TX_UNDERRUN EQU 01000000B ABORT_DETECTED EQU 10000000B ;............................................................................. ; RR 1 TX_FINISHED EQU 00000001B RX_LAST_COUNT EQU 00001110B PARITY_ERROR EQU 00010000B RX_OVERRUN EQU 00100000B CRC_ERROR EQU 01000000B EOF_DETECTED EQU 10000000B ;............................................................................. ; WR 0 NX_REG_MASK EQU 00000111B TX_SDLC_ABORT EQU 00001000B RES_INT_REENBL EQU 00010000B RES_CHANNEL EQU 00011000B A1ST_ENBL_NX EQU 00100000B TX_UNK EQU 00101000B RES_POFC_ERR EQU 00110000B RES_DAISY EQU 00111000B RES_RX_CRC EQU 01000000B RES_TX_CRC EQU 10000000B RES_TX_UNDERRUN EQU 11000000B ;............................................................................. ; WR 1 ENBL_EXT_INT EQU 00000001B ENBL_TXBE_INT EQU 00000010B ENBL_VECT_INT EQU 00000100B DSBL_RX_INT EQU 00000000B ENBL_RX_1ST_INT EQU 00001000B RX_INT_ALL_VECT EQU 00010000B RX_INT_ALL EQU 00011000B RX_WAIT EQU 00100000B TX_WAIT EQU 00000000B USE_READY EQU 01000000B USE_WAIT EQU 00000000B ENBL_WAIT_READY EQU 10000000B ;............................................................................. ; WR 3 RX_ENBL EQU 00000001B RX_ADR_OK_ONLY EQU 00000100B RX_ANY EQU 00000000B RX_ENBL_CRC EQU 00001000B RX_REENBL_HUNT EQU 00010000B ENBL_CTS_DCD EQU 00100000B RX_8_BITS EQU 11000000B ;............................................................................. ; WR 4 SDLC_MODE EQU 00100000B ;............................................................................. ; WR 5 TX_ENBL_CRC EQU 00000001B RTS_LOW EQU 00000010B RTS_HIGH EQU 00000000B SDLC_CRC EQU 00000000B TX_ENBL EQU 00001000B TX_8_BITS EQU 01100000B DTR_LOW EQU 10000000B ;............................................................................. ; WR 7 SDLC_FLAG EQU 01111110B ;############################################################################# CMD_A MACRO DATA IFNB LD A,DATA ENDC OUT (CTRL_A),A ENDM CMD_B MACRO DATA IFNB LD A,DATA ENDC OUT (CTRL_B),A ENDM STAT_A MACRO DEST IN A,(CTRL_A) IFNB LD DEST,A ENDC ENDM OFS MACRO IDENT IDENT EQU ALLOC ALLOC DEFL ALLOC+1 ENDM ALLOC DEFL 0 OFS SEMAFOR OFS LO_LEN OFS HI_LEN OFS DESTINATION OFS ACK_RQ OFS SOURCE OFS R1 OFS R2 OFS R3 OFS R4 OFS LO_PACKET_LEN OFS HI_PACKET_LEN OFS PACKET_TYPE ;***************************************************************************** ; DUAL PORT RAM DSEG SWITCHES: DS 1 SWITCHES.BOOT EQU 01000000B SWITCHES.NO EQU 10000000B LOCAL_ADR: DS 1 CNT_COLISSION: DS 1 CNT_RX_ERROR: DS 1 TX_SEMAFOR: DS 1 TX_LEN: DS 2 ZMSG: TX_BUF: DS MAX_FRAME RX1_SEMAFOR: DS 1 RX1_LEN: DS 2 RX1_BUF: DS MAX_FRAME+2 RX2_SEMAFOR: DS 1 RX2_LEN: DS 2 RX2_BUF: DS MAX_FRAME+2 POST: DS 2 ISR_ABORT: DS 1 WAIT_CNT: DS 1 ACK_ADR: DS 1 DS 6 ACK_LEN: DS 2 STACK_END EQU $ ;***************************************************************************** ; ROM CSEG ;***************************************************************************** RESET: JP ENTRY SUM_COR: DB 80H,40H,20H,10H,8,4,2,1 REPT 38H-11 DB 0FFH ENDM ;***************************************************************************** ISR: JP (IX) ;***************************************************************************** SELF_RESET: LD (SELF_RESET_ADR),HL JR RESET ;***************************************************************************** VERS: DB 'ZROM (c) JaMeSoft 89-06-19 14:04',0 ;***************************************************************************** RAM_ERROR: LD HL,RAM_ERR_MSG ;***************************************************************************** FATAL_REPORT: LD DE,ZMSG .1.FATAL_REPORT: LD A,(HL) INC HL LD (DE),A OR A JR NZ,.1.FATAL_REPORT ;----------------------------------------------------------------------------- LD HL,POST_ERROR LD (POST),HL ;***************************************************************************** FATAL_STOP: JR $ ;***************************************************************************** ENTRY: LD HL,RESET LD DE,ZROM OR A SBC HL,DE JR NZ,FATAL_STOP ;----------------------------------------------------------------------------- LD HL,SWITCHES LD DE,ZRAM OR A SBC HL,DE JR NZ,FATAL_STOP ;----------------------------------------------------------------------------- LD HL,RESET LD BC,ZROM_SIZE XOR A SUM_ROM: ADD A,(HL) CPI JP PE,SUM_ROM ;----------------------------------------------------------------------------- OR A LD HL,SUM_ERR_MSG JR NZ,FATAL_REPORT ;----------------------------------------------------------------------------- LD IX,TEST_DATA MEM_TEST: LD A,(IX) INC IX OR A JR Z,RAM_OK ;----------------------------------------------------------------------------- LD HL,ZRAM LD BC,ZRAM_SIZE LD D,A .1.MEM_TEST: LD (HL),A CPI JP PE,.1.MEM_TEST ;----------------------------------------------------------------------------- LD HL,ZRAM LD BC,ZRAM_SIZE LD A,D CPL LD E,A .2.MEM_TEST: LD A,(HL) CP D JR NZ,RAM_ERROR ;----------------------------------------------------------------------------- LD (HL),E CPI JP PE,.2.MEM_TEST ;----------------------------------------------------------------------------- LD HL,ZRAM+ZRAM_SIZE-1 LD BC,ZRAM_SIZE .3.MEM_TEST: LD A,(HL) CP (E) JR NZ,RAM_ERROR ;----------------------------------------------------------------------------- LD (HL),D CPD JP PE,.3.MEM_TEST ;----------------------------------------------------------------------------- JR MEM_TEST ;***************************************************************************** RAM_OK: LD SP,STACK LD HL,ZRAM LD DE,ZRAM+1 LD BC,ZRAM_SIZE-1 LD (HL),0 LDIR LD HL,VERS LD DE,TX_BUF SAY_VERS: LD A,(HL) INC HL LD (DE),A INC DE OR A JR NZ,SAY_VERS ;----------------------------------------------------------------------------- LD A,(SWITCH_PORT) LD (SWITCHES),A AND 63 LD (LOCAL_ADR),A LD HL,RESET_DATA LD B,RESET_DATA_SIZE PUSH HL LD C,CTRL_A OTIR POP HL LD B,B_RESET_DATA_SIZE LD C,CTRL_B OTIR LD HL,POST_OK LD (POST),HL JR MAIN_LOOP ;***************************************************************************** TEST_DATA: DB 00000001B DB 00000010B DB 00000100B DB 00001000B DB 00010000B DB 00100000B DB 01000000B DB 10000000B DB 11111110B DB 11111101B DB 11111011B DB 11110111B DB 11101111B DB 11011111B DB 10111111B DB 01111111B DB 0 ;EOT ;***************************************************************************** RESET_DATA: DB RES_CHANNEL DB RES_CHANNEL DB WR5, 0 B_RESET_DATA_SIZE EQU $-RESET_DATA DB RES_INT_REENBL+RES_RX_CRC DB RES_INT_REENBL+RES_TX_CRC DB RES_POFC_ERR DB WR1, ENBL_EXT_INT DB WR3, ENBL_CTS_DCD DB WR4, SDLC_MODE DB WR5, SDLC_CRC DB WR7, SDLC_FLAG RESET_DATA_SIZE EQU $-RESET_DATA ;***************************************************************************** ; TEXTY SUM_ERR_MSG: DB 'CHYBA SUMY ZROM',0 RAM_ERR_MSG: DB 'CHYBA RAM', 0 ;***************************************************************************** MAIN_LOOP: DI LD SP,STACK LD IX,SELF_RESET IM 1 WAIT_SEMAFOR: LD HL,RX1_SEMAFOR LD A,(HL) OR A CALL Z,RECEIVE_PACKET ;----------------------------------------------------------------------------- LD HL,RX2_SEMAFOR LD A,(HL) OR A CALL Z,RECEIVE_PACKET ;----------------------------------------------------------------------------- LD HL,TX_SEMAFOR LD A,(HL) CP TX_REQUEST CALL Z,TRANSMIT_PACKET JR WAIT_SEMAFOR ;***************************************************************************** TRANSMIT_PACKET: PUSH HL POP IY LD C,(IY+LO_LEN) LD B,(IY+HI_LEN) LD A,(IY+LO_PACKET_LEN) CP C JR Z,.1.TX_PACKET ;----------------------------------------------------------------------------- .0.TX_PACKET: LD (IY+SEMAFOR),TX_REJECTED RET ;============================================================================= .1.TX_PACKET: LD A,(IY+HI_PACKET_LEN) CP B JR NZ,.0.TX_PACKET ;----------------------------------------------------------------------------- LD A,B OR C JR Z,.0.TX_PACKET ;----------------------------------------------------------------------------- EX DE,HL LD HL,MIN_PACKET OR A SBC HL,BC JR Z,.2.TX_PACKET ;----------------------------------------------------------------------------- JP P,.0.TX_PACKET ;----------------------------------------------------------------------------- .2.TX_PACKET: LD HL,MAX_FRAME OR A SBC HL,BC JP M,.0.TX_PACKET ;----------------------------------------------------------------------------- LD A,(SWITCHES) AND 63 LD (IY+SOURCE),A EX DE,HL INC HL INC HL INC HL CALL TRANSMIT_FRAME RET C ;----------------------------------------------------------------------------- LD A,(IY+ACK_RQ) OR A JR Z,.3.TX_PACKET ;----------------------------------------------------------------------------- LD A,TX_WAITING_ACK LD (IY+SEMAFOR),A XOR A LD (WAIT_CNT),A RET ;============================================================================= .3.TX_PACKET: LD A,TX_IDLE LD (IY+SEMAFOR),A ;***************************************************************************** GEN_IRQ2: LD HL,IRQ2_DATA LD B,IRQ2_DATA_SIZE LD C,CTRL_B OTIR RET ;***************************************************************************** IRQ2_DATA: DB WR5,0 DB WR5,DTR_LOW DB WR5,DTR_LOW+RTS_LOW DB WR5,DTR_LOW+RTS_LOW DB WR5,DTR_LOW DB WR5,DTR_LOW DB WR5,0 IRQ2_DATA_SIZE EQU $-IRQ2_DATA ;***************************************************************************** TRANSMIT_FRAME: STAT_A D CMD_A RES_INT_REENBL LD A,D AND DCD_ACTIVE SCF RET NZ ;----------------------------------------------------------------------------- CMD_A WR5 CMD_A RTS_LOW .0.TX_FRAME: STAT_A AND DCD_ACTIVE JR NZ,.1.TX_FRAME ;----------------------------------------------------------------------------- CMD_A RES_INT_REENBL JR .0.TX_FRAME ;============================================================================= .1.TX_FRAME: CMD_A RES_INT_REENBL STAT_A AND CTS_ACTIVE JR NZ,TRANSMIT_BUF ;----------------------------------------------------------------------------- CALL ABORT_TX SCF RET ;***************************************************************************** TRANSMIT_BUF: CMD_A RES_TX_CRC+WR1 CMD_A ENBL_EXT_INT+TX_WAIT+USE_WAIT+ENBL_WAIT_READY CMD_A WR5 CMD_A TX_ENBL_CRC+RTS_LOW+SDLC_CRC+TX_8_BITS STAT_A AND DCD_ACTIVE+CTS_ACTIVE CP DCD_ACTIVE+CTS_ACTIVE JR Z,.0.TX_BUF ;----------------------------------------------------------------------------- CALL ABORT_TX SCF RET ;============================================================================= .0.TX_BUF: CMD_A RES_INT_REENBL CMD_A RES_DAISY XOR A LD (ISR_ABORT),A LD IX,ISR_TX LD E,TX_ENBL_CRC+RTS_LOW+SDLC_CRC+TX_ENBL+TX_8_BITS DEC B JR Z,.2.TX_BUF ;256..511 JP P,.3.TX_BUF ;512..MAX_FRAME ;----------------------------------------------------------------------------- ;<=255 .0A.TX_BUF: LD B,C LD C,DATA_A CMD_A WR5 CMD_A E EI OTIR .1.TX_BUF: LD A,(ISR_ABORT) OR A SCF RET NZ ;----------------------------------------------------------------------------- CMD_A RES_TX_UNDERRUN STAT_A AND TX_BUF_EMPTY JR Z,.1.TX_BUF ;----------------------------------------------------------------------------- DI CMD_A RR1 STAT_A EI AND TX_FINISHED JR Z,.1.TX_BUF ;----------------------------------------------------------------------------- STAT_A AND DCD_ACTIVE+CTS_ACTIVE CP DCD_ACTIVE+CTS_ACTIVE DI CMD_A WR5 CMD_A RTS_HIGH+SDLC_CRC SCF RET NZ ;----------------------------------------------------------------------------- OR A RET ;============================================================================= ;256..511 .2.TX_BUF: LD A,C OR A JR Z,.0A.TX_BUF ;256 ;----------------------------------------------------------------------------- .2A.TX_BUF: LD B,C LD C,DATA_A CMD_A WR5 CMD_A E EI OTIR OTIR JR .1.TX_BUF ;============================================================================= ;512..MAX_FRAME .3.TX_BUF: LD A,C OR A JR Z,.2A.TX_BUF ;512 ;----------------------------------------------------------------------------- LD B,C LD C,DATA_A CMD_A WR5 CMD_A E EI OTIR OTIR OTIR JR .1.TX_BUF ;***************************************************************************** ISR_TX: PUSH AF STAT_A AND DCD_ACTIVE+CTS_ACTIVE CP DCD_ACTIVE+CTS_ACTIVE JR Z,.1.ISR_TX ;----------------------------------------------------------------------------- LD A,1 LD (ISR_ABORT),A CALL ABORT_TX .1.ISR_TX: POP AF RET ;***************************************************************************** ABORT_TX: PUSH HL PUSH BC DI LD HL,CNT_COLISSION INC (HL) CMD_A WR5 CMD_A SDLC_CRC LD B,0 LD A,R INC A .0.ABORT_TX: DJNZ $ ;----------------------------------------------------------------------------- DEC A JR NZ,.0.ABORT_TX ;----------------------------------------------------------------------------- POP BC POP HL RET ;***************************************************************************** RECEIVE_PACKET: PUSH HL POP IY INC HL INC HL INC HL LD A,(LOCAL_ADR) CALL RECEIVE_FRAME RET C ;----------------------------------------------------------------------------- LD HL,MIN_PACKET-2 OR A SBC HL,BC JP M,.1.RX_PACKET ;----------------------------------------------------------------------------- .0.RX_PACKET: LD HL,CNT_RX_ERROR INC (HL) RET ;============================================================================= .1.RX_PACKET: LD L,(IY+LO_PACKET_LEN) LD H,(IY+HI_PACKET_LEN) OR A SBC HL,BC JR NZ,.0.RX_PACKET ;----------------------------------------------------------------------------- LD HL,MIN_PACKET-1 OR A SBC HL,BC JR NZ,.2.RX_PACKET ;----------------------------------------------------------------------------- LD A,(LOCAL_ADR) CP (IY+DESTINATION) RET NZ ;----------------------------------------------------------------------------- LD HL,TX_SEMAFOR LD A,TX_WAITING_ACK CP (HL) RET NZ ;----------------------------------------------------------------------------- LD (HL),TX_IDLE CALL GEN_IRQ2 RET ;============================================================================= .2.RX_PACKET: LD (IY+LO_LEN),C LD (IY+HI_LEN),B LD A,(IY+DESTINATION) INC A JR Z,.2A.RX_PACKET ;----------------------------------------------------------------------------- LD A,(IY+ACK_RQ) OR A JR NZ,.3.RX_PACKET ;----------------------------------------------------------------------------- .2A.RX_PACKET: LD (IY+SEMAFOR),1 JP GEN_IRQ2 ;============================================================================= .3.RX_PACKET: LD HL,ACK_ADR LD A,(IY+SOURCE) LD (HL),A LD BC,MIN_PACKET-1 LD (ACK_LEN),BC LD (IY+SEMAFOR),1 LD A,24 .3A.RX_PACKET: DEC A JR NZ,.3A.RX_PACKET ;----------------------------------------------------------------------------- .3B.RX_PACKET: LD HL,ACK_ADR LD BC,MIN_PACKET-1 CALL TRANSMIT_FRAME JR C,.3B.RX_PACKET ;----------------------------------------------------------------------------- JP GEN_IRQ2 ;***************************************************************************** RECEIVE_FRAME: EXX LD HL,RESET_DATA LD B,RESET_DATA_SIZE LD C,CTRL_A OTIR EXX LD D,A CMD_A WR6 CMD_A D INC D JR Z,.0.RX_FRAME ;----------------------------------------------------------------------------- LD D,RX_ADR_OK_ONLY .0.RX_FRAME: CMD_A WR1 CMD_A ENBL_RX_1ST_INT+RX_WAIT+USE_WAIT+ENBL_WAIT_READY CMD_A RES_RX_CRC+RES_POFC_ERR CMD_A WR5 CMD_A SDLC_CRC+DTR_LOW LD IX,ISR_RX_1ST LD C,DATA_A LD B,0FFH AND (MAX_FRAME+2) LD A,RX_ENBL+RX_ENBL_CRC+RX_REENBL_HUNT+ENBL_CTS_DCD+RX_8_BITS OR D LD D,A CMD_A WR3 CMD_A D LD D,H LD E,L CMD_A RES_DAISY EI .1.RX_FRAME: LD A,(TX_SEMAFOR) CP TX_WAITING_ACK JR NZ,.2.RX_FRAME ;----------------------------------------------------------------------------- LD A,(WAIT_CNT) INC A LD (WAIT_CNT),A JR NZ,.1.RX_FRAME ;----------------------------------------------------------------------------- LD A,TX_TIMEOUTED LD (TX_SEMAFOR),A DI CALL GEN_IRQ2 CMD_A RES_DAISY EI JR .1.RX_FRAME ;============================================================================= .2.RX_FRAME: CP TX_REQUEST JR NZ,.1.RX_FRAME ;----------------------------------------------------------------------------- DI CMD_A WR3 CMD_A ENBL_CTS_DCD SCF RET ;***************************************************************************** ISR_RX_1ST: INI CMD_A RES_DAISY CMD_A A1ST_ENBL_NX LD IX,ISR_RX_FINISH EI INIR INIR INIR DI PUSH HL ;***************************************************************************** ISR_RX_FINISH: POP BC POP BC CMD_A RR1 STAT_A AND RX_OVERRUN+CRC_ERROR+EOF_DETECTED CP EOF_DETECTED JR Z,.1.RX_FINISH ;----------------------------------------------------------------------------- .0.RX_FINISH: CMD_A WR3 CMD_A ENBL_CTS_DCD CMD_A RES_DAISY LD HL,CNT_RX_ERROR INC (HL) SCF RET ;============================================================================= .1.RX_FINISH: CMD_A RES_DAISY CMD_A WR3 CMD_A ENBL_CTS_DCD OR A DEC HL DEC HL SBC HL,DE LD B,H LD C,L LD HL,MIN_FRAME OR A SBC HL,BC JR Z,.2.RX_FINISH ;----------------------------------------------------------------------------- JP P,.0.RX_FINISH ;----------------------------------------------------------------------------- .2.RX_FINISH: OR A RET ;***************************************************************************** END ;*****************************************************************************