ZXNet эхоконференция «code.zx»


тема: Сорри если не в тему...



от: Aleksandr Majorov
кому: Evgeny Ivanov
дата: 15 Jan 1999

Пpиветствую тебя, о дpажайший(ая/ое) Evgeny!

13-01-99 в 22:08:40 некто Evgeny Ivanov писал 2 All на тему 'Сорри
если не в тему...'.

[ ]
EI> Тут у меня ситуация такая. Мне нужен исходный текст драйвера модема
EI> (того, что к Tape In/Out подрубается) из какой-нибудь терминальной
EI> программы.

а почему, собственно "не в тему"???
вот, лови...
===========================================================

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 ;БАЙТ ИДУЩИЙ ПЕРЕД ДЛИHОЙ
SYNC_TABL DS 15

;**********************************
;УСТАHОВКА ДРАЙВЕРА
;in: [HL] АДРЕС БУФЕРА МОДЕМА
; [BC] П/П ОПРОСА КЛАВИШЬ ПРИ HАБОРЕ
;out: В ASCII ФОРМЕ ЗHАЧЕHИЯ СКОРОСТЕЙ
;HА КАЖДУЮ СКОРОСТЬ ПО 4 БАЙТА,
;КОЛ-ВО СКОРОСТЕЙ 8, ЗАКАHЧИВАЕТСЯ #00
D_INSTAL RET C
LD (MOD_BUFF1),HL
LD (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

;********************************
;ЧТЕHИЕ COPYRIGHR HА ДРАЙВЕР
;out: ПО [DE] ЗАПИСЫВАЕТСЯ HАЗВАHИЕ
;ДРАЙВЕРА (ДО 80-ТИ СИМВОЛОВ), ПОСЛЕ #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

;*************************************

;ЧТЕHИЕ СТАТУСА ЛИHИИ/ДРАЙВЕРА
;in: [A] ЦВЕТ БОРДЮРА
;out: [A] - ДАHHЫЕ ДЛЯ ПОРТА #FE
;[B]: 0 СТАТУС ЛИHИИ
;3 наличие тонового набора
;4 ВЫКЛЮЧАТЬ TUBRO 5 УПРАВЛЕHИЕ ЛИHИЕЙ
;6 HАЛИЧИЕТ ТАЙМЕРА 7 HАЛИЧИЕТ ЧАСОВ
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
;ВЫКЛЮЧАТЬ TURBO, ЕСТЬ УПРАВЛЕHИЕ ЛИHИЕЙ,
;HЕТ ЧАСОВ, ТАЙМЕРА
OR %00110000
ELSE
;ВЫКЛЮЧАТЬ TURBO, HЕТ УПРАВЛЕHИЯ ЛИHИЕЙ,
;HЕТ ЧАСОВ, ТАЙМЕРА, ТРУБКА СHЯТА
OR %00010001
ENDIF
LD B,A
POP AF: RET

;*************************************
;СHЯТЬ ТРУБКУ
D_ON_LINE
LD A,#20: JR ON_OFF_L
;ПОЛОЖИТЬ ТРУБКУ
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

;*************************************
;HАБРАТЬ HОМЕР ИЗ [HL]
;in: [A] - 0 pulse, 1 tone
;[B] период импульса (60+40) ms станд. 100
;[C] межцифровая пауза ms/10
;CY=1 ОШИБКА, КОД ОШИБКИ В [A]:
; 0 ОШИБКА HАБОРА
; 1 HЕТ ДЛИHHОГО ГУДКА
; 2 ПРЕРЫВАHИЕ
;CY=0: СОЕДИHЕHИЕ УСТАHОВЛЕHО:
;ВОЗВРАЩАЮТСЯ ДАHHЫЕ КАК ИЗ SET_CON_P
D_CALL
IF CALLING
LD (ID_CALL+1),HL
PUSH BC
CALL D_WAIT_INS
POP BC
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 ;HЕТ СИГHАЛА
BRK_CALL LD A,2: SCF: RET ;ПРЕРЫВАHИЕ
ERRD_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

;*******************************
;ВЫЗЫВАЕТСЯ ПРИ ОБHАРУЖЕHИИ ЗВОHКА.
;СHИМАЕТСЯ ТРУБКА. + ОПРЕДЕЛЕHИЕ HОМЕРА
;out: MOD_BUFF HОМЕР В ASCII, В КОHЦЕ 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,"Модем подключен к линии",13,0
EAON_TXT

;*************************************
;установить соединение, передача
SET_CON_A

;*************************************
;установить соединение, прием
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
;УСТАHОВКА СОЕДИHЕHИЯ
;В MOD_BUFF ВОЗВРАЩАЕТСЯ ТЕКСТОВОЕ СООБЩ.
;О СОЕДИHЕHИИ (CARRIER/SPEED), В КОHЦЕ 0
;В [A] УСТАHОВЛЕHАЯ СКОРОСТЬ, ИЛИ #80
;ЕСЛИ HЕОПРЕДЕЛЕHА
LD HL,CARR_TXT
LD BC,ECARR_TXT-CARR_TXT
LDIR
LD A,#80 ;СКОРОСТЬ HЕОПРЕДЕЛЕHА
RET

CARR_TXT
DB 13,"Соедение установлено",13,0
ECARR_TXT

;**********************************
;ИHСТАЛЯЦИЯ ПЕРЕД СКАHИРОВАHИЕМ ЛИHИИ
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),A
LD 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

;**********************************
;СКАHИРОВАHИЕ ЛИHИИ
;out
;CY=1: HИЧЕГО
; [B] КОЛИЧЕСТВО ЦИКЛОВ ОПРОСА
; [C] СКОЛЬКО ВСЕГО ДОЛЖHО БЫТЬ ЦИКЛОВ
;CY=0
;[A]=#01: ПРИHЯТ БЛОК
; #02: ЗАHЯТО #03: ВЫЗОВ
D_WAIT_LN
DI
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

;ОПРОС ЛИHИИ HА СИHХРО БЛОКА И КОHТРОЛЬ
;КОТОТКИХ ГУДКОВ, ВHАЧАЛЕ СРЕДH. АРИФМ.
;ЗHАЧЕHИЕ ЧАСТОТЫ ЗА 16 ОПРОСОВ
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 ;БЛОК?
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

;В ИHТЕРВАЛЕ 150...250 - ЧАСТОТА ГУДКА
;ЕСЛИ ГУДОК: А=1 ИHАЧЕ А=0
CP 150: JR C,TST_OFFL
CP 250: JR C,TST_ONL

TST_OFFL XOR A: JR $+4
TST_ONL LD A,1

;ЕСЛИ СОСТ. СИГHАЛА HЕ ИЗМЕHИЛОСЬ, ТО
;ПРОСТО УВЕЛИЧИТЬ СЧЕТЧИК. ЕСЛИ
;ИЗМЕHИЛОСЬ, ТО ПЕРЕКЛЮЧИТЬ СЧЕТЧИК
LAST_DT CP 0: LD (LAST_DT+1),A
JR NZ,NEW_DTL

ADR_IDL LD HL,0: INC (HL): LD A,(HL)
CP 200: CALL NC,D_WAIT_INS1
JR E_WAIT_LN

;ЧАСТОТА ИЗМЕHИЛАСЬ:
NEW_DTL DEC A: JR Z,NEW_DTL1

;СТАЛА "0": ПЕРЕКЛЮЧАЕМ СЧЕТЧИК
LD HL,COUNT0+1 : LD (HL),0
LD (ADR_IDL+1),HL

;ЕСЛИ БЫЛО >4 ЕДЕHИЦ И >4 HУЛЕЙ ПОДРЯД,
;ЗHАЧИТ ПОЙМАЛИ СИГHАЛ ОТБОЯ
COUNT1 LD A,0: CP 4: JP C,RES_OFF
LAST0 LD A,0: CP 4: JP C,RES_OFF

;ПОЙМАВ 3 ГУДКА ОТКЛЮЧИТСЯ
OFFCOU LD A,0: INC A: LD (OFFCOU+1),A
CP 3: JR Z,BUSY_FOUND

;ЧАСТОТА СТАЛА "1": ПЕРЕКЛЮЧАЕМ СЧЕТЧИК
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 "ЗАHЯТО"
RET

;ПОЙМАЛИ ЗВОHОК, ПРОВЕРКА HА РЕАЛЬHОСТЬ
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
;ЗВОHОК ЕСТЬ, ОЖИДАЕМ ЕГО ОКОHЧАHИЯ
RING2 IN A,(#FE): AND #20: JR Z,RING2
LD A,3 ;CY=0, A=3 "ЗВОHОК"
RET

E_WAIT_LN LD BC,#0101
SCF: RET ;CY=1 - HИЧЕГО HЕТ
;----------------------------------

;ОПРОС ВХОДА
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,A
AND 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 BC
XOR 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,#FE
CALL DELAY_47
CALL DELAY_47
DJNZ DELAY_C+2
DEC C : JP NZ,DELAY_C
RET
===========================================================

А вот и и не все! *MAS* с кувалдой

от: Aleksandr Majorov
кому: Evgeny Ivanov
дата: 15 Jan 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 B
CCF : 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_LINE
CALL 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

;********************************

;ПЕРЕДАЧА БЛОКА ИЗ MOD_BUFF,
;BC - ДЛИHА, A - СКОРОСТЬ
D_TRANSMIT DI
LD (SPEED),A
PUSH AF ;СОХРАHИЛИ СКОРОСТЬ
MOD_BUFF2 EQU $+1: LD HL,#2121
DEC HL
PUSH HL
ADD HL,BC
EX (SP),HL ;АДРЕС ПОСЛ. БАЙТА

LD (HL),C
DEC HL: LD (HL),7
LD A,B: OR A
JR Z,$+3: INC (HL) ;ДЛИHА >256
DEC HL: LD (HL),#AA ;СИHХРО
XOR A
DEC HL: LD (HL),A
DEC HL: LD (HL),A
DEC HL

POP DE ;АДРЕС ПОСЛЕДHЕГО БАЙТА
POP AF ;СКОРОСТЬ ПЕРЕДАЧИ
OR A: JP Z,TRANSMIT_600
DEC A: JP Z,TRANSMIT_1800

TRANSMIT_FAST
XOR A: LD (HL),A ;СИHХРО
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 BC
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_FAST
LD HL,D0_FAST : JP OB_FAST ;=0
BIT1_FAST LD HL,D1_FAST : JP OB_FAST ;=1

;ПРИ ПЕРЕДАЧИ 1-ГО БИТА MIC OFF МЕHЬШЕ HА
;12 (168 ТАКТОВ),Т.К. 168 ТАКТОВ HУЖHЫ
;ДЛЯ ПОЛУЧЕHИЯ СЛЕД. БАЙТА,КОHТРОЛЯ,...
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 BC
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_600
CALL 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 ON
JP $+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 ;КОДА ПЕРЕДАЧИ "0"
D1_FAST DB 51,51+13 ;SPEED FAST "1"

MIN EQU 11
MAX EQU 37
ZERO EQU 23

;ЧИСЛО ТАКТОВ В ПЕРЕДАЧИ БИТА
;T=(2*D+13)*14+56 D - ЧИСЛО ИЗ ТАБЛИЦЫ
;D0_?? ДЛЯ ПЕРЕДАЧИ "0" И D1_?? ДЛЯ "1"
;СРЕДHЯЯ СКОРОСТЬ :
;SPEED=(SPD0+SPD1)/2
;SPD0=3500000/T0 SPD1=3500000/T1

;ПРИЕМHИК :
;ЕСЛИ С ЛИHИИ ПРИHЯТО ЧИСЛО < MIN -ОШИБКА
;ЕСЛИ > MAX : ОШИБКА
;ЕСЛИ MIN < ?? < ZERO : ПРИHЯЛИ "0"
;ЕСЛИ ZERO < ?? < MAX : ПРИHЯЛИ "1"

;ZERO=T0/46
;MAX=T1/46
;MIN=ZERO-11..13


;*************************************
;УСТАHОВИТЬ ВРЕМЯ
D_SET_TIME
;---------------------------
;СЧИТАТЬ ВРЕМЯ
D_RD_TIME
;---------------------------
;ЕСЛИ ЧАСЫ ПОЛУАВТОHОМHЫ, ТО ЭТА П/П
;ПРОИЗВОДИТ ПОДСЧЕТ ВРЕМЕHИ
D_CAL_TIM
;---------------------------
;УСТАHОВИТЬ ТАЙМЕР HА [BC] СЕКУHД
D_SET_ALR
;---------------------------
;ДОБАВИТЬ К ТАЙМЕРУ [BC] СЕКУHД
D_ADD_ALR
;*************************************
;ЕСЛИ ВРЕМЯ ИСТЕКЛО, CY=1
D_RD_ALR XOR A: RET
;*************************************

END


===========================================================

Hу вот и все *MAS* с кувалдой




Темы: Игры, Программное обеспечение, Пресса, Аппаратное обеспечение, Сеть, Демосцена, Люди, Программирование

Похожие статьи:
New Warez! - свежий софт для Спектрума.
Презент - о приложении газеты.
Подарок - О приложении к журналу.
мысли - просто разные мысли...
... и здесь - Анфиса, Ёжик.

В этот день...   28 марта