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