Sorry if it's off topic...

ZXNet echo conference «code.zx»

From Aleksandr Majorov To Evgeny Ivanov 15 January 1999

Greetings, oh dearest Evgeny! 13-01-99 at 22:08:40 someone Evgeny Ivanov wrote 2 All on the topic 'Sorry if not on topic...'. [ ] EI> Here I have the following situation. I need the modem driver source code EI> (the one that is connected to Tape In/Out) from some terminal EI> programs. and why, actually, “off topic”??? here, catch it... ============================================================================ CALLING EQU 01 ORG #C000 JP D_INSTAL JP D_NAME JP D_RD_STAT JP D_WAIT_INS JP D_WAIT_LN JP D_WAIT_BLC JP D_TRANSMIT JP D_ON_LINE JP D_OFF_LINE JP D_CALL JP D_AON JP SET_CON_A JP SET_CON_P JP D_SET_TIME JP D_RD_TIME JP D_CAL_TIM JP D_SET_ALR JP D_ADD_ALR JP D_RD_ALR ;*********************************** LINE_STATUS DB 0 SPEED DB 0 LCOUNT_A DB 0 LCOUNT_B DB 0 LCOUNT_C DB 0 ZERO_BYTE DB 0 ;BYTE COMING BEFORE LENGTH SYNC_TABL DS 15 ;*********************************** ;INSTALLING THE DRIVER ;in: [HL] MODEM BUFFER ADDRESS ; [BC] POLLING KEY WHEN DIALING ;out: IN ASCII FORM OF SPEED VALUES ;HA 4 BYTES FOR EACH SPEED, ;NUMBER OF SPEEDS 8, ENDS #00 D_INSTAL RET C LD (MOD_BUFF1),HLLD (MOD_BUFF2),HL LD (MOD_BUFF3),HL LD (MOD_BUFF4),HL EX DE,HL LD HL,SPD_MODEM LD BC,ESPD_MODEM-SPD_MODEM LDIR RET SPD_MODEM DB "600","1800","2400" DS 5*5 ESPD_MODEM ;******************************** ;READ COPYRIGHR TO DRIVER ;out: BY [DE] THE NAME IS RECORDED ;DRIVERS (UP TO 80 CHARACTERS), AFTER #00 D_NAME LD HL,NAME_MODEM LD BC,ENAME_MODEM-NAME_MODEM LD DE,(MOD_BUFF1) LDIR RET NAME_MODEM DB "Vicomm-modem driver v1.04" DB "(C) 1997 *MAS*",0 ENAME_MODEM ;*********************************** ;READ LINE/DRIVER STATUS ;in: [A] CURB COLOR ;out: [A] - DATA FOR PORT #FE ;[B]: 0 LINE STATUS ;3 presence of tone dialing ;4 TURN OFF TUBRO 5 LINE CONTROL ;6 HAS A TIMER 7 HAS A CLOCK D_RD_STAT AND 7: LD C,A LD A,(LINE_STATUS) LD B,A:OR C OUT (#FE),A: LD (BORDER_0+1),A OR #08: LD (BORDER_1+1),A PUSH AF XOR A: INC B: DEC B JR Z,$+3: INC A IF CALLING ;TURN OFF TURBO, LINE CONTROL IS AVAILABLE, ;NO CLOCK, TIMER OR %00110000 ELSE ;TURN OFF TURBO, NO LINE CONTROL, ;NO CLOCK, NO TIMER, HANDSET IS OFF OR %00010001 ENDIF LD B,A POP AF: RET ;*********************************** ;PICK UP D_ON_LINELD A,#20: JR ON_OFF_L ;Hang up D_OFF_LINE XOR A ON_OFF_L IF CALLING LD(LINE_STATUS),A LD B,A: LD A,(BORDER_0+1) OR B: LD (BORDER_0+1),A OUT(#FE),A OR #08: LD (BORDER_1+1),A ENDIF RET ;*********************************** ;DIAL NUMBER FROM [HL] ;in: [A] - 0 pulse, 1 tone ;[B] pulse period (60+40) ms std. 100 ;[C] interdigit pause ms/10 ;CY=1 ERROR, ERROR CODE IN [A]: ; 0 DIALING ERROR ; 1 NO LONG BEEP ; 2 INTERRUPT ;CY=0: CONNECTION ESTABLISHED: ;DATA IS RETURNED AS FROM SET_CON_P D_CALL IF CALLING LD (ID_CALL+1),HL PUSH BC CALL D_WAIT_INS POP B.C. LD A,C: LD (CDEL_COD+1),A LD A,B: LD B,0 DIV5 SUB 5: JR C,EDIV5 INC B: JR DIV5 EDIV5 INC B: DEC B: JR NZ,$+3: INC B LD A,B: RLCA LD(CDEL_1+1),A ADD A,B: LD (CDEL_0+1),A LD A,(BORDER_0+1): AND #0F LD(DCAL_OFF+1),A LD A,(BORDER_1+1): OR #20 LD(DCAL_ON+1),A EI: LD B.45: HALT: DJNZ $-1 LD BC,200*256+30 WAIT_DIA CALL WAIT_CALL: JR C,DWAIT_R DEC C: JR Z,ID_CALL JR DWAIT_N DWAIT_R LD C,30 DWAIT_N LD A,#7F: IN A,(#FE) RRCA: JR NC,BRK_CALL DJNZ WAIT_DIA NO_DIAL LD A,1: SCF: RET ;NO SIGNAL BRK_CALL LD A,2: SCF: RET ;INTERRUPTERRD_CALL XOR A: SCF: RET ;ОШИБКА ED_CALL XOR A: RET ;HОМЕР HАБРАH ID_CALL LD HL,#2121 LD A,(HL): INC HL LD (ID_CALL+1),HL OR A: JR Z,ED_CALL CP "-": JR Z,ID_CALL CP "(": JR Z,ID_CALL CP ")": JR Z,ID_CALL CP " ": JR Z,ID_CALL SUB "0": JR C,ERRD_CALL JR NZ,$+4: LD A,10 CP 11: JR NC,ERRD_CALL LD B,A ;HАБИРАЕМ ЦИФРУ [B] CALL_C ;РАЗРЫВ ЛИHИИ HА 60ms DCAL_OFF LD A,0: OUT (#FE),A CDEL_0 LD A,0 DDEL_0 LD C,248 DEC C: JP NZ,$-1 DEC A: JP NZ,DDEL_0 ;ВКЛЮЧЕHИЕ ЛИHИИ И ПАУЗА 40ms DCAL_ON LD A,0: OUT (#FE),A CDEL_1 LD A,0 DDEL_1 LD C,248 DEC C: JP NZ,$-1 DEC A: JP NZ,DDEL_1 DJNZ CALL_C ;МЕЖЦИФРОВАЯ ПАУЗА В 600ms CDEL_COD LD B,0 W_CDEL NOP: NOP: LD DE,1457 DEC DE: LD A,D OR E: JP NZ,$-3 DJNZ W_CDEL LD A,#7F: IN A,(#FE) RRCA: JR NC,BRK_CALL JR ID_CALL ;---------------------------- ;ОПРАШИВАЕМ ЛИHИЮ 32 РАЗА WAIT_CALL DI: PUSH BC LD B,32 LD HL,0 CALL_DIAL LD DE,#0B59 CALL SCAN_IN CALL DELAY_37 LD E,A: LD D,0: ADD HL,DE DJNZ CALL_DIAL POP BC ;КОHТРОЛЬ ГУДКА, СРЕДH. АРИФМ. ;ЗHАЧЕHИЕ ЧАСТОТЫ ЗА 32 ОПРОСА SRA H: RR L : SRA H: RR L SRA H: RR L : SRA H: RR L SRA H: RR L LD A,L: SRA A ;В ИHТЕРВАЛЕ 150...250 - ЧАСТОТА ГУДКАCP 150: RET C CP 250: CCF RET ELSE XOR A:SCF:RET ENDIF ;************************************** ;CALLED WHEN A CALL IS DETECTED. ;THE TUBE IS REMOVED. + NUMBER IDENTIFICATION ;out: MOD_BUFF NUMBER IN ASCII, AT THE END 0 D_AON CALL D_ON_LINE LD B,75: EI: HALT: DJNZ $-2: DI MOD_BUFF3 EQU $+1: LD DE,#1111 LD HL,AON_TXT LD BC,EAON_TXT-AON_TXT LDIR RET AON_TXT DB 13,"Modem connected to line", 13.0 EAON_TXT ;*********************************** ;establish connection, transfer SET_CON_A ;*********************************** ;establish connection, receive SET_CON_P MOD_BUFF4 EQU $+1: LD HL,#2121 PUSH HL IF CALLING LD (HL),13: LD BC,1: XOR A CALL D_TRANSMIT ENDIF POP DE ;ESTABLISHING CONNECTION ;IN MOD_BUFF THE TEXT MESSAGE IS RETURNED. ;ABOUT CONNECTION (CARRIER/SPEED), AT THE END 0 ;B [A] SET SPEED OR #80 ;IF UNDEFINED LD HL,CARR_TXT LD BC,ECARR_TXT-CARR_TXT LDIR LD A,#80 ;SPEED UNDETERMINED RET CARR_TXT DB 13,"Connection established", 13.0 ECARR_TXT ;*********************************** ;INSTALLATION BEFORE LINE SCAN D_WAIT_INS LD HL,#4000: LD (LCOUNT_A),HL AND #0F: SET 6,A: LD (SOUND+1),A JR Z,D_WAIT_INS1 LD BC,#FFFD: LD A,7: OUT (C),ALD B,#BF: LD A,#3F: OUT (C),A D_WAIT_INS1 XOR A: LD (LAST_DT+1),A LD(COUNT0+1),A LD(COUNT1+1),A LD(LAST0+1),A LD (OFFCOU+1),A RET ;*********************************** ;SCAN LINE ;out ;CY=1: NOTHING ; [B] NUMBER OF POLLING CYCLES ; [C] HOW MANY CYCLES SHOULD BE IN TOTAL? ;CY=0 ;[A]=#01: BLOCK RECEIVED ; #02: BUSY #03: CALLING D_WAIT_LN D.I. LD HL,0 LD DE,16*256+12 ;11 LD BC,#FFFD: LD A,8: OUT (C),A LD A,(SOUND+1) AND #0F: JR Z,$+4: LD B,#BF ;POLLING THE LINE TO THE SYNCHRO UNIT AND CONTROL ;LOT BEEPING, FIRST MEDIUM. ARIFMS. ;FREQUENCY VALUE FOR 16 SURVEYS MDLOOP1 IN A,(#FE): AND #20 IF CALLING: JP Z,RING : ELSE: JP $+3 ENDIF CALL IN_LINE_F CP 11: JP C,MDLOOP2 CP 89: JP NC,MDLOOP2 DEC E: JP Z,INPUT_BLOCK ;BLOCK? MDLOOP2 ADD A,L: LD L,A JR NC,$+3: INC H DEC D: JP NZ,MDLOOP1 SRA H: RR L : SRA H: RR L SRA H: RR L : SRA H: RR L LD A,L: SRA A ;INTERVAL 150...250 - BEEP FREQUENCY ;IF BEEP: A=1 ELSE A=0 CP 150: JR C,TST_OFFL CP 250: JR C,TST_ONL TST_OFFL XOR A: JR $+4 TST_ONL LD A,1 ;IF CONDITION THE SIGNAL HAS NOT CHANGED, THEN ;JUST INCREASE THE COUNTER. IF ;THE CHANGED, THEN SWITCH THE COUNTER LAST_DT CP 0: LD (LAST_DT+1),A JR NZ,NEW_DTLADR_IDL LD HL,0: INC (HL): LD A,(HL) CP 200: CALL NC,D_WAIT_INS1 JR E_WAIT_LN ;FREQUENCY CHANGED: NEW_DTL DEC A: JR Z,NEW_DTL1 ;BECAME "0": SWITCHING THE COUNTER LD HL,COUNT0+1 : LD (HL),0 LD (ADR_IDL+1),HL ;IF THERE WERE >4 ONES AND >4 ZEROES IN A CONTRACT, ;MEANS WE CAUGHT A CLEAR SIGNAL COUNT1 LD A,0: CP 4: JP C,RES_OFF LAST0 LD A,0: CP 4: JP C,RES_OFF ;HAVING 3 BEEPS, IT WILL TURN OFF OFFCOU LD A,0: INC A: LD (OFFCOU+1),A CP 3: JR Z,BUSY_FOUND ;FREQUENCY BECAME "1": SWITCHING THE COUNTER NEW_DTL1 LD HL,COUNT1+1 : LD (HL),0 LD (ADR_IDL+1),HL COUNT0 LD A,0 JPE_WAIT_LN LD (LAST0+1),A JR E_WAIT_LN RES_OFF XOR A LD(COUNT0+1),A LD(COUNT1+1),A JR JPE_WAIT_LN BUSY_FOUND OR A: LD A,2 ;CY=0, A=2 "BUSY" RET ;GOT A CALL, REALITY CHECK RING LD C,2 RING1 LD B,30: NOP: DJNZ $-1 IN A,(#FE): AND #20 JP NZ,D_WAIT_LN DEC C: JR NZ,RING1 ;THERE IS A CALL, WE ARE WAITING FOR ITS END RING2 IN A,(#FE): AND #20: JR Z,RING2 LD A,3 ;CY=0, A=3 "CALL" RET E_WAIT_LN LD BC,#0101 SCF: RET ;CY=1 - NOTHING ;---------------------------------- ;LOGIN POLL IN_LINE_F PUSH HL: PUSH DE LD DE,(LCOUNT_A) SOUND LD L,0 LP_TIN_F INC E: JP Z,END_TIN_F INC E: JP Z,END_TIN_F IN A,(#FE) RLCA: RLCA: SBC A,AAND L: NOP: OUT (C),A AND #40: XOR D: JP Z,LP_TIN_F XOR D: LD (LCOUNT_B),A RET_TIN_F LD A,E LD HL,LCOUNT_A SUB (HL): LD (HL),A LD A,E POP DE: POP HL RET END_TIN_F DEC E: JR RET_TIN_F ;******************************* ;ПРИЕМ БЛОКА INPUT_BLOCK CALL IN_LINE CALL CONTR_SPEED CALL LOAD_DATA RET C E_LOAD_DT LD A,(SPEED): LD D,A BLOCK_LEN EQU $+1: LD BC,#0101 ;CY=0 ПРИHЯЛИ БЛОК OR A: LD A,1 RET ;------------------------------ ;ДОЛГОЕ ОЖИДАHИЕ ;out: CY HЕТ БЛОКА ;[BC] ДЛИHА ;[D] СКОРОСТЬ (#80 HЕОПРЕДЕЛЕHА) D_WAIT_BLC CALL WAIT_LINE: RET C CALL LOAD_DATA CALL LINE_FREE JR E_LOAD_DT ;///////////////////\n SCAN_IN CALL IN_LINE CP D : RET C CP E : CCF RET IN_LINE_D ;ЗАДЕРЖКА 22, ОПРОС ВХОДА PUSH BC : POP BC ;ОПРОС ВХОДА IN_LINE PUSH HL : PUSH BC LD A,(LCOUNT_A) : LD C,A LD A,(LCOUNT_B) : LD B,A LOOP_TIN INC C : JP Z,END_TIN IN A,(#FE) : AND #40 XOR B : JP Z,LOOP_TIN XOR B : LD (LCOUNT_B),A RET_TIN LD A,C LD HL,LCOUNT_A SUB (HL) : LD (HL),A LD A,C POP BC : POP HL RET END_TIN DEC C: JR RET_TIN ;*************************************** ;ОЖИДАHИЕ ОСВОБОЖДЕHИЯ ЛИHИИ LINE_FREE PUSH AF : PUSH DE : PUSH BCXOR A : LD (LCOUNT_A),A LD A,#40 : LD (LCOUNT_B),A CALL IN_LINE LD DE,#0570 ;#0180 NOP : NOP LN_FREE1 NOP: NOP LN_FREE2 LD B,4 CALL DELAY_37 CALL SCAN_IN NOP : JP NC,LN_FREE1 LN_FREE3 DEC B : JP Z,LINE_FREE4 CP #FF : JP NC,LINE_FREE4 CALL DELAY_37 CALL SCAN_IN JP C,LN_FREE3 JP LN_FREE2 ;ЛИHИЯ СВОБОДHА LINE_FREE4 POP BC : POP DE : POP AF RET ;СИHХРОHИЗАЦИЯ С ЗАДЕРЖКОЙ 10 SYNCD1_IN JP SYNC1_IN SYNC1_IN NOP : NOP CALL IN_LINE CP D : JP C,ED_SYNCD CP E : CCF JP C,ED_SYNCD LD B,A LD A,(HL) OR A : JP Z,SYNC1_I1 ADD A,B : LD (HL),A SYNC1_I2 ADD A,0 INC HL RET SYNC1_I1 JP SYNC1_I2 SYNCD2_IN JP SYNC2_IN SYNC2_IN NOP : NOP SYNC2_I6 CALL IN_LINE CP D JP C,ED_SYNCD CP E CCF JP C,ED_SYNCD LD B,A LD A,(HL) SUB B JP P,SYNC2_I2 XOR A : ADD A,0 SYNC2_I1 LD (HL),A INC HL RET SYNC2_I2 JP SYNC2_I1 ED_SYNCD INC SP : INC SP ERR_SYNC POP DE : POP HL RET ;ЗАДЕРЖКА HА СООТВ. ЧИСЛО ТАКТОВ DELAY_57 JP DELAY_47 DELAY_47 JP DELAY_37 DELAY_37 CALL DELAY_27 DELAY_27 RET DELAY_68 CALL DELAY_27 CALL DELAY_27 NOP RET DELAY_C LD B,#FECALL DELAY_47 CALL DELAY_47 DJNZ DELAY_C+2 DEC C : JP NZ,DELAY_C RET ============================================================================ But that's not all! *MAS* with a sledgehammer

From Aleksandr Majorov To Evgeny Ivanov 15 January 1999

Пpиветствую тебя, о дpажайший(ая/ое) Evgeny! =========================================================== ;---------------------------- WAIT_LINE DI LD HL,#4000 : LD (LCOUNT_A),HL LD D,3 WT_LINE1 LD E,3 WT_LINE2 LD H,1 WT_LINE3 LD B,16 LD A,H LD (LCOUNT_C),A LP_WLINE CALL IN_LINE CP MIN+1 : JP C,WAIT_CONTR1 CP #2D : JP C,WAIT_SPEED WAIT_CONTR ADD A,L : JP NC,$+4 : INC H ADD A,6 : LD L,A JP NC,$+4 : INC H LD A,(LCOUNT_C) CP H JP C,WT_LINE3 JP Z,WAIT_CONTR2 DEC E : JP NZ,WT_LINE2 DEC D : JP NZ,WT_LINE1 SCF RET WAIT_CONTR1 CP 5 JP WAIT_CONTR WAIT_CONTR2 LD B,16 JP LP_WLINE ;КОHТРОЛЬ СКОРОСТИ ПРИ ОЖИДАHИИ WAIT_SPEED CALL DELAY_47: NOP DEC B : JP NZ,LP_WLINE CALL IN_LINE ;КОHТРОЛЬ СКОРОСТИ. ПОДСЧЕТ ЧИСЛА ИМПУЛЬ- ;СОВ => СКОРОСТЬ CONTR_SPEED LD BC,#0006 CALL IN_LINE CALL IN_LINE_D CALL IN_LINE_D PUSH BC: POP BC C_SPEED CALL IN_LINE ADD A,B: LD B,A DEC C: JR NZ,C_SPEED OR A RET ;ПРИЕМ БЛОКА. ;В [B] ЧИСЛО ИМПУЛЬСОВ (СКОРОСТЬ) LOAD_DATA MOD_BUFF1 EQU $+1: LD HL,#2121 LD A,195 : CP B JP C,INP_600 ;?>195 = 600 LD A,130 : CP B JP C,INP_1800 ;?>130 = 1800 LD A,60 : CP BCCF : RET C ;?>060 = FAST ;------------------------------ INP_FAST LD A,2: LD (SPEED),A CALL SYNC_FAST: RET C LD D,0 CALL LOAD_BYTE_FAST : RET C LD (ZERO_BYTE),A CP 8: JR NZ,$+3: INC D ;ПРИHИМАЕМ ДЛИHУ CALL LOAD_BYTE_FAST: RET C LD E,A: OR A: JR NZ,$+3: INC D LD A,D: CP 2: CCF: RET C LD (BLOCK_LEN),DE LD_BLOCK_FAST CALL LOAD_BYTE_FAST: RET C LD (HL),A INC HL: DEC DE LD A,D: OR E JP NZ,LD_BLOCK_FAST RET LOAD_BYTE_FAST LD B,8 CALL IN_LINE CP MIN : JP C,ERR_LDFAST CP MAX : JP NC,ERR_LDFAST CP ZERO : RL C ;ПРИHЯЛИ БИТ CALL DELAY_47 ;27 DEC B: JP Z,_LOAD_BYTE_FAST CALL IN_LINE JP LOAD_BYTE_FAST+2 _LOAD_BYTE_FAST LD A,C: CPL PUSH AF CALL IN_LINE POP AF OR A: RET ERR_LDFAST POP BC SCF: RET SYNC_FAST PUSH HL LD DE,MIN*256+ZERO-3 LD A,1 LD (SYNC_TABL),A LD (SYNC_TABL+1),A CALL IN_LINE CALL DELAY_68 CALL IN_LINE S1_FAST CALL DELAY_57 CALL IN_LINE CP D : JP C,ERR_SYNC CP E : JP C,S1_FAST LD E,MAX-1 LD HL,SYNC_TABL CALL DELAY_47 CALL IN_LINE CALL DELAY_68 CALL DELAY_27 CALL IN_LINECALL DELAY_68 CALL DELAY_27 CALL IN_LINE CALL DELAY_47 CALL DELAY_27 CALL SYNCD1_IN CALL SYNCD1_IN LD HL,SYNC_TABL CALL SYNC2_IN CALL SYNCD2_IN LD HL,SYNC_TABL CALL SYNC1_IN CALL SYNCD1_IN LD HL,SYNC_TABL CALL SYNC2_IN CALL SYNCD2_IN LD HL,SYNC_TABL CALL SYNC1_IN LD C,A CALL SYNCD1_IN CP C : JP M,S2_FAST CALL IN_LINE CALL DELAY_68 CALL DELAY_27 S2_FAST CALL IN_LINE CALL DELAY_68 CALL IN_LINE POP HL OR A: RET ;------------------------------ INP_1800 LD A,1: LD (SPEED),A CALL IN_LINE CALL DELAY_27 NOP LD DE,#0E19 LD DE,#0E19 CALL SYNC_1800: RET C LD D,0 CALL LOAD_BYTE_1800: RET C LD (ZERO_BYTE),A CP 8: JR NZ,$+3: INC D ;ПРИHИМАЕМ ДЛИHУ CALL LOAD_BYTE_1800: RET C LD E,A: OR A: JR NZ,$+3: INC D LD A,D: CP 2: CCF: RET C LD (BLOCK_LEN),DE LD_BLOCK_1800 CALL LOAD_BYTE_1800: RET C LD (HL),A INC HL: DEC DE LD A,D: OR E JP NZ,LD_BLOCK_1800 RET LOAD_BYTE_1800 PUSH BC : LD B,8 CALL IN_LINE CP #0F: JP C,ERR_LD1800 CP #2D: JP NC,ERR_LD1800 CP #1C: LD A,C: RLA: LD C,A CALL DELAY_27 DEC B: JP NZ,NEXT_B1800 LD A,C: CPL POP BC PUSH AF CALL IN_LINE POP AF OR A: RET NEXT_B1800 CALL DELAY_27 NOP CALL IN_LINE CALL DELAY_57 CALL DELAY_27 NOP JP LOAD_BYTE_1800+3 ERR_LD1800 POP BC SCF: RET SYNC_1800 PUSH HL PUSH DE OR A : LD A,1 LD (SYNC_TABL),A LD (SYNC_TABL+1),A CALL IN_LINE CALL DELAY_68 CALL DELAY_27 NOP CALL IN_LINE CALL DELAY_27 NOP S1_1800 CALL DELAY_68 CALL IN_LINE NOP CP D: JP C,ERR_SYNC CP E: JP C,S1_1800 LD DE,#0E2E LD HL,SYNC_TABL CALL DELAY_47 CALL IN_LINE CALL DELAY_68 CALL DELAY_27 NOP CALL IN_LINE CALL DELAY_68 CALL DELAY_27 NOP CALL IN_LINE CALL DELAY_47 CALL DELAY_27 ADD A,0 CALL SYNCD1_IN CALL SYNCD1_IN LD HL,SYNC_TABL CALL SYNC2_IN CALL SYNCD2_IN LD HL,SYNC_TABL CALL SYNC1_IN CALL SYNCD1_IN LD HL,SYNC_TABL CALL SYNC2_IN CALL SYNCD2_IN LD HL,SYNC_TABL CALL SYNC1_IN LD C,A ADD A,0 CALL SYNCD1_IN CP C: JP M,S2_1800 CALL IN_LINE CALL DELAY_68 CALL DELAY_27 NOP S2_1800 CALL IN_LINE CALL DELAY_68 CALL DELAY_27 NOP CALL IN_LINE POP DE POP HL OR A: RET ;------------------------------ INP_600 XOR A: LD (SPEED),A CALL IN_LINE NOP LD DE,#1728 LD DE,#1728 CALL SYNC_600: RET C LD D,0 CALL LOAD_BYTE_600 : RET C LD (ZERO_BYTE),A CP 8: JR NZ,$+3 : INC D ;ПРИHИМАЕМ ДЛИHУ CALL LOAD_BYTE_600 : RET C LD E,A: OR A: JR NZ,$+3: INC D LD A,D: CP 2: CCF: RET C LD (BLOCK_LEN),DE LD_BLOCK_600 CALL LOAD_BYTE_600: RET C LD (HL),A INC HL: DEC DE LD A,D: OR E JP NZ,LD_BLOCK_600 RET LOAD_BYTE_600 PUSH DE: PUSH BC LD B,8 CALL IN_LINE CALL IN_LINE CALL IN_LINE CP #17: JP C,ERR_LD600 CP #59: JP NC,ERR_LD600 CP #2D: LD A,E: RLA: LD E,A CALL IN_LINE DEC B JP NZ,LOAD_BYTE_600+4 LD A,E: CPL: OR A POP BC POP DE RET ERR_LD600 POP BC: POP DE SCF: RET SYNC_600 PUSH HL: PUSH DE OR A LD A,1 LD (SYNC_TABL),A LD (SYNC_TABL+1),A LD (SYNC_TABL+2),A LD (SYNC_TABL+3),A CALL IN_LINE CALL DELAY_68 CALL DELAY_27 NOP CALL IN_LINE CALL DELAY_27 NOP S1_600 CALL DELAY_68 CALL IN_LINE NOP CP D: JP C,ERR_SYNC CP E: JP C,S1_600 LD A,(SYNC_TABL+4) INC A LD (SYNC_TABL+4),A ADD A,0 LD DE,#0E59 LD HL,SYNC_TABL CALL SYNCD1_IN CALL SYNCD1_IN CALL SYNCD1_IN CALL SYNCD1_IN LD HL,SYNC_TABL CALL SYNC2_IN CALL SYNCD2_IN CALL SYNCD2_IN CALL SYNCD2_IN LD HL,SYNC_TABL CALL SYNC1_IN CALL SYNCD1_IN CALL SYNCD1_IN CALL SYNCD1_IN LD HL,SYNC_TABL CALL SYNC2_IN CALL SYNCD2_IN CALL SYNCD2_IN CALL SYNCD2_IN LD HL,SYNC_TABL CALL SYNC1_IN CALL SYNCD1_IN CALL SYNCD1_IN CALL SYNCD1_IN LD HL,SYNC_TABL CALL SYNC2_IN CALL SYNCD2_IN CALL SYNCD2_IN CALL SYNCD2_IN LD HL,SYNC_TABL CALL SYNC1_IN CALL SYNCD1_IN CALL SYNCD1_IN CALL SYNCD1_IN LD HL,SYNC_TABL CALL SYNC2_IN LD C,A ADD A,0 CALL SYNC2_IN CP C : JP M,EXT_SYNC LD C,A CALL SYNC2_I6 CP C : JP M,EXT_SYNC LD C,A CALL SYNC2_I6 CP C : JP M,EXT_SYNC OR A : JP Z,ERR_SYNC NOP CALL IN_LINE EXT_SYNC POP DE: POP HL OR A: RET ;******************************** ;TRANSFER BLOCK FROM MOD_BUFF, ;BC - LENGTH, A - SPEED D_TRANSMIT DI LD(SPEED),A PUSH AF ;SAVE SPEED MOD_BUFF2 EQU $+1: LD HL,#2121 DEC HL PUSH HL ADD HL,BC EX (SP),HL ;SEQ ADDRESS BYTE LD(HL),C DEC HL: LD (HL),7 LD A,B:OR A JR Z,$+3: INC (HL) ;LENGTH >256 DEC HL: LD (HL),#AA ;SYNCHRO XOR A DEC HL: LD (HL),A DEC HL: LD (HL),A DEC HL POP DE ;ADDRESS OF LAST BYTE POP AF ;BAD RATE OR A: JP Z,TRANSMIT_600 DEC A: JP Z,TRANSMIT_1800 TRANSMIT_FAST XOR A: LD (HL),A ;SYNCHRO DEC HL: LD (HL),A DEC HL: LD (HL),A DEC HL: LD (HL),A DEC HL: LD (HL),A CALL LINE_FREE PUSH BC LD C,1: CALL DELAY_C POP B.C. CALL OUTPUT_FAST PUSH HL PUSH DE LD BC,#020C LD A,0 NOP: NOP: NOP: NOP JP OUT_BIT2600 OUTPUT_FAST LD A,(HL) CALL OU_BYTE_FAST NOP CALL COMP_HL_DE: RET Z INC HL: JP OUTPUT_FAST OU_BYTE_FAST PUSH HL: PUSH DE LD BC,#080C OUT_BIT2600 PUSH AF RLA : JP C,BIT1_FASTLD HL,D0_FAST : JP OB_FAST ;=0 BIT1_FAST LD HL,D1_FAST : JP OB_FAST ;=1 ;WHEN TRANSMISSING THE 1st BIT, MIC OFF IS LESS BY HA ;12 (168 bars), T.K. 168 BARKS REQUIRED ;TO OBTAIN THE NEXT. BYTE, CONTROL,... OB_FAST RRA LD A,(HL) SUB C : LD D,A : INC HL LD E,(HL) : INC HL CALL OUT_DATA POP AF RLCA DEC B LD C,0 : LD C,0 : NOP JP NZ,OUT_BIT2600 POP DE : POP HL RET ;------------------------- TRANSMIT_1800 XOR A : LD (HL),A DEC HL : LD (HL),A CALL LINE_FREE PUSH BC LD C,1 : CALL DELAY_C POP B.C. CALL OUTPUT_1800 PUSH HL : PUSH DE LD BC,#020C LD A,0 NOP: NOP: NOP: NOP JP OUT_BIT1800 OUTPUT_1800 LD A,(HL) CALL OU_BYTE_1800 NOP CALL COMP_HL_DE RET Z INC HL: JP OUTPUT_1800 OU_BYTE_1800 PUSH HL: PUSH DE LD BC,#080C OUT_BIT1800 PUSH AF RLA: JP C,BIT1_1800 LD HL,D0_1800: JP OB_1800 ;=0 BIT1_1800 LD HL,D1_1800: JP OB_1800 ;=1 OB_1800 RRA LD A,(HL) SUB C: LD D,A: INC HL LD E,(HL): INC HL CALL OUT_DATA POP AF RLCA DEC B LD C,0: LD C,0: NOP JP NZ,OUT_BIT1800 POP DE: POP HL RET ;------------------------- TRANSMIT_600CALL LINE_FREE PUSH BC LD C,1: CALL DELAY_C POP BC CALL OUTPUT_600 PUSH HL: PUSH DE LD BC,#020D LD A,0 NOP: NOP: NOP: NOP JP OUT_BIT600 OUTPUT_600 LD A,(HL) CALL OU_BYTE_600 RLA: LD B,A CALL COMP_HL_DE LD A,B: RRA RET Z INC HL: JP OUTPUT_600 OU_BYTE_600 PUSH HL: PUSH DE LD BC,#080D NOP OUT_BIT600 PUSH AF RLA: JP C,B71_600 ;B7=1 RRA: JP C,B70_B01 ;B7=0,B0 =1 LD HL,D00_600 ;B7 =0 B0 =0 JP OB_600 B71_600 RRA: JP NC,B71_B01 LD HL,D10_600 ;B7=1 B0=0 JP OB_600 B71_B01 LD HL,D11_600 ;B7=1 B0=1 JP OB_600 B70_B01 LD HL,D01_600 ;B7=0 B0=1 JP OB_600 OB_600 NOP LD A,(HL) SUB C: LD D,A: INC HL LD E,(HL): INC HL CALL OUT_DATA CALL OUT_DATA POP AF RLCA DEC B LD C,0: NOP : NOP JP NZ,OUT_BIT600 POP DE: POP HL RET ;------------------------- ;СРАВHИТЬ HL И DE COMP_HL_DE NOP LD A,H : CP D JP NZ,$+6: LD A,L: CP E: RET NOP: NOP: RET ;ПЕРЕДАЧА БИТА OUT_DATA DEC D: JP NZ,$-1 ;ЗАДЕРЖКА D BORDER_0 LD A,#00 ;MIC OFF JP $+3: OUT (#FE),A DEC E: JP NZ,$-1 ;ЗАДЕРЖКА E BORDER_1 LD A,#08 ;MIC ONJP $+3: OUT (#FE),A LD D,(HL): INC HL LD E,(HL): INC HL NOP RET D0_1800 DB 36.36+13 D1_1800 DB 67.67+13 D00_600 DB #36,#44,#40,#44 ;B7 =0 B0 =0 D01_600 DB #57,#58,#49,#44 ;B7 =0 B0 =1 D10_600 DB #57,#65,#61,#65 ;B7 =1 B0 =0 D11_600 DB #36,#4D,#54,#65 ;B7 =1 B0 =1 D0_FAST DB 28,28+13 ; TRANSMISSION CODE "0" D1_FAST DB 51,51+13 ;SPEED FAST "1" MIN EQU 11 MAX EQU 37 ZERO EQU 23 ;NUMBER OF CLOCKS IN BIT TRANSMISSION ;T=(2*D+13)*14+56 D - NUMBER FROM THE TABLE ;D0_?? FOR TRANSMISSION "0" AND D1_?? FOR "1" ;AVERAGE SPEED: ;SPEED=(SPD0+SPD1)/2 ;SPD0=3500000/T0 SPD1=3500000/T1 ;RECEIVER: ;IF A NUMBER < MIN IS RECEIVED FROM THE LINE - ERROR ;IF > MAX : ERROR ;IF MIN < ?? < ZERO : RECEIVED "0" ;IF ZERO < ?? < MAX : RECEIVED "1" ;ZERO=T0/46 ;MAX=T1/46 ;MIN=ZERO-11..13 ;*********************************** ;SET TIME D_SET_TIME ;-------------------------- ;COUNT TIME D_RD_TIME ;-------------------------- ;IF THE WATCH IS SEMI-AUTONOMOUS, THEN THIS P/P ;CALCULATES TIME D_CAL_TIM ;-------------------------- ;SET TIMER TO [BC] SECONDS D_SET_ALR ;-------------------------- ;ADD TO TIMER [BC] SECONDS D_ADD_ALR ;*********************************** ;IF TIME IS UP, CY=1 D_RD_ALR XOR A: RET ;*********************************** END ============================================================================Well that's it *MAS* with a sledgehammer