ZXNet эхоконференция «code.zx»
тема: PC <-> ZX link sourse (ZX)
от: Aleksandr Majorov
кому: Dmitriy Dobretsov
дата: 07 Jan 1999
Пpиветствую тебя, о дpажайший(ая/ое) Dmitriy!
Once in morning 07-01-98 04:18:53 somebody Dmitriy Dobretsov has
written to Aleksandr Majorov about 'Гальваническая развязка'.
[ ]
AM>> если интересно могу сорцы кинуть в .code, покажешь
AM>> где можно оптимизнуть..
DD> кинь,если не влом...
Вот кидаю...
Сразу говорю - для ZX я более-менее все оптимизнул,
а для ПЦ - нет...
Тама я вообще все задержки ожидания подбирал
эксперементально, чтоб оно нормально принимало...
Ессно все константы выставились под мой ПЦ (166)
2_FK0: сразу говорю - если сможешь что сказать
по существу, омпимизнуть код и т.п. то нет проблем.
Если-же будешь только кричать что все глюки и МД,
то лучше и не пиши...
Если не можешь предложить альтернативу так хоть
не мешай!
=================================================
;СКАHИРОВАHИЕ PC-ЛИHИИ
;эта п/п вызывается ММД-хой весьма часто...
;если CY=1 нет данных,
;CY=0 - данные приняты, BC - длина
SCAN_PC IN A,(#1F): AND 3: JR Z,PCL_PAS
CP 2: SCF: RET NZ
PCL_ACT LD A,2: LD (PCLINK),A
OUT (#DD),A: SCF: RET
PCL_PAS LD A,(PCLINK): OR A: SCF: RET Z
XOR A: LD (PCLINK),A: OUT (#DD),A
;ПОЙМАЛИ СИHХРОИМПУЛЬС
LD A,3: LD (BAUD),A ;запомнили скорость
;вначале блока идут байты #AA и #55 для контроля
CALL PC_IN: CP #AA: SCF: RET NZ
CALL PC_IN: CP #55: SCF: RET NZ
;затем идет длина блока
CALL PC_IN: LD E,A
CALL PC_IN: LD D,A
LD (BLEN),DE ;длина блока
LD HL,(ABUF) ;адрес буфера
;а теперь пошли данные
PC_IND CALL PC_IN: LD (HL),A
INC HL: DEC DE
LD A,D: OR E: JP NZ,PC_IND
;выставляем регистры и флаги - приняли блок
LD BC,(BLEN) ;длина
LD D,3 ;это номер скорости
LD A,1 ;CY=1, A=1 приняли блок
RET
;************************************
;передача блока длиной BC
;ждем готовности ПЦ
PC_TRANS CALL PCWAIT_0
RET C ;не отвечает
LD A,2: OUT (#DD),A
CALL PCWAIT_1
LD A,0: OUT (#DD),A
RET C ;не отвечает
;передаем синхро
LD A,#AA: CALL PC_OUT
LD A,#55: CALL PC_OUT
;передаем длину блока
LD A,C: CALL PC_OUT
LD A,B: CALL PC_OUT
LD HL,(ABUF)
LD E,C: LD D,B
;полетели данные
PC_OUTD LD A,(HL): CALL PC_OUT
INC HL: DEC DE
LD A,D: OR E: JR NZ,PC_OUTD
OR A: RET
;----------------------------------
;передать байт
PC_OUT EXX: LD B,8: LD C,A
PC_OUT1 LD DE,1000 ;ожидание ответа
PCW0OUT IN A,(#1F): AND 2: JP Z,PCW0OUT1
DEC DE:LD A,D:OR E:JP NZ,PCW0OUT
JR PC_ERR ;ПЦ повис....
PCW0OUT1 LD A,1: RL C: RLA: OUT (#DD),A
LD DE,1000 ;ожидание ответа
PCW1OUT IN A,(#1F):AND 2: JP NZ,PCW1OUT1
DEC DE:LD A,D:OR E:JP NZ,PCW1OUT
;ошибка... снимаем адрес возврата и сразу
;прыгаем наверх с флагом "нет данных"
PC_ERR OUT (#DD),A: POP HL: SCF: RET
PCW1OUT1 XOR A: OUT (#DD),A
DJNZ PC_OUT1
EXX: OR A: RET
;-------------------------------
;прием байта
PC_IN EXX: LD B,8
PC_IN1 LD DE,1000 ;ожидание ответа
PCW1IN IN A,(#1F): AND 2: JP NZ,PCW1IN1
DEC DE:LD A,D:OR E:JP NZ,PCW1IN
JR PC_ERR ;ПЦ повис....
PCW1IN1 IN A,(#1F): RRA: RL C
LD A,2: OUT (#DD),A
LD DE,1000 ;ожидание ответа
PCW0IN IN A,(#1F): AND 2: JP Z,PCW0IN1
DEC DE:LD A,D:OR E:JP NZ,PCW0IN
JR PC_ERR
PCW0IN1 XOR A: OUT (#DD),A
DJNZ PC_IN1
LD A,C: EXX: OR A: RET
;-----------------------
;долгие ожидания ответа ПЦ - вызываются
;перед передачей.
;ждут долго, а то вдруг ПЦ чем-то занят ;-)
;ожидаем пока ПЦ не выставит "0"
PCWAIT_0 LD DE,2000
PCWAIT0 IN A,(#1F): AND 2: RET Z
DEC DE
LD A,D: OR E: JP NZ,PCWAIT0
SCF: RET
;ожидаем пока ПЦ не выставит "1"
PCWAIT_1 LD DE,2000
PCWAIT1 IN A,(#1F): AND 2: RET NZ
DEC DE
LD A,D: OR E: JP NZ,PCWAIT1
SCF: RET
;********************************
=================================================
Hу вот и все *MAS* с кувалдой
|