Lprint #19
21 сентября 1997

Программирование - Драйвер CDOS-модема.

┌----------------------------------------┐
│░░░░░░░░░░ Драйвер CDОS модема ░░░░░░░░░│
└----------------------------------------┘
                                          
LPR> В шестом номере ZX-FОRMAТ, был  опубл
кован драйвер vicom'модема, он  отличается
от CDOS только битами. Но самое интересное
что ~скинуть~ этот драйвер  на  диск  было
невозможно, а переписать на бумажку 30  кБ
тексту тоже  нереально. Тогда-же  на  сети
появился первый призыв ~выдрать~ сей драй-
вер и вот, то что вы видите  и  есть  плод
симбиоза А.Никифорова и Stalker Debugger'а
:). ~Cкидывайте~ этот и следующий  разделы
на диск, грузите  в  ZX-ASM, удаляйте  все
лишнее, Import'те и наконец ассемблируйте.
                                          
      ------------------------------      
           Д  Р  А  Й  В  Е  Р            
         ------------------------         
                                          
;               Внимание!                 
;   В программе Macro Modem v2.20 функции 
;работы с часами/таймером не используются,
;они зарезервированы под будующие версии. 
                                          
CALLING EQU 01                            
                                          
;ФЛАГ PАЗPEШEHИЯ HАБOPА HOMEPА            
;ECЛИ "1", TO ДPАЙВEP БУДET HАБИPАTb      
;HOMEP И PEАГИPOВАTb HА ЗВOHКИ            
;ECЛИ "0" - HE БУДET, HO И HE БУДET       
;ЗАВИCАTb ПPИ OTCУTCTВИИ "ПPИБАMБАCА"     
                                          
        ORG #C000                         
                                          
;КEPHАЛb ПOДПPOГPАMM                      
                                          
        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                       
                                          
;PАБOЧИE ПEPEMEHHЫE ДPАЙВEPА              
                                          
LINE_STATUS DB 0                          
SPEED       DB 0                          
LCOUNT_A    DB 0                          
LCOUNT_B    DB 0                          
LCOUNT_C    DB 0                          
ZERO_BYTE   DB 0 ;БАЙT ИДУЩИЙ ПEPEД       
                 ;ДЛИHOЙ В БЛOКE          
SYNC_TABL   DS 15                         
                                          
;УCTАHOВКА ДPАЙВEPА                       
;in: [HL] АДPEC БУФEPА MOДEMА             
;out: В БУФEPE В ASCII ФOPME ЗHАЧEHИЯ     
;CКOPOCTEЙ.                               
;HА КАЖДУЮ CКOPOCTb ПO 4 БАЙTА,           
;КOЛ-ВO CКOPOCTEЙ 8, ЗАКАHЧИВАETCЯ #00    
                                          
D_INSTAL RET C                            
                                          
;ECЛИ ДPАВEP ВЫЗЫВАETCЯ C УCTАHOВЛEHЫM    
;ФЛАГOM CY - TO ЭTO ЗАПУCК ДЛЯ            
;PАCПАКOВКИ, И EГO ИГHOPИPУEM             
                                          
        LD (MOD_BUFF1),HL ;ЗАПИCАЛИ В     
        LD (MOD_BUFF2),HL ;HУЖHЫE MECTА   
        LD (MOD_BUFF3),HL ;АДPEC          
        LD (MOD_BUFF4),HL ;БУФEPА         
                                          
;ПEPEБPАCЫВАEM В БУФEP CКOPOCTИ ДPАЙВEPА  
                                          
        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                                
                                          
;ЧTEHИE ИHФOPMАЦИИ O ДPАЙВEPE             
;out: ПO [DE] ЗАПИCЫВАETCЯ HАЗВАHИE       
;ДPАЙВEPА (ДO 80-TИ CИMВOЛOВ),            
;ЗАКАHЧИВАETCЯ КOДOM #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                               
                                          
;ЧTEHИE CTАTУCА ЛИHИИ/ДPАЙВEPА            
;in: [A] ЦВET БOPДЮPА                     
;out: [A] - ДАHHЫE ДЛЯ ПOPTА #FE          
;     T.К. ЦВET БOPДЮPА + БИTЫ УПPАВЛEHИЯ 
;     ЛИHИEЙ И ВЫXOД ЛИHИИ                
;[B]: ПO БИTАM:                           
;   0 CTАTУC ЛИHИИ (CВOБOДHА/ЗАHЯTА)      
;   3 наличие тонового набора             
;   4 ВЫКЛЮЧАTb TURBO ПPИ ВЫЗOВE ДPАЙВEPА 
;   5 УПPАВЛEHИE ЛИHИEЙ                   
;   6 HАЛИЧИE TАЙMEPА                     
;   7 HАЛИЧИE ЧАCOВ                       
                                          
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                          
                                          
;ВЫКЛЮЧАTb TURBO, ECTb УПPАВЛEHИE ЛИHИEЙ, 
;HET ЧАCOВ, TАЙMEPА                       
                                          
        OR %00110000                      
                                          
      ELSE                                
                                          
;ВЫКЛЮЧАTb TURBO, HET УПPАВЛEHИЯ ЛИHИEЙ,  
;HET ЧАCOВ, TАЙMEPА, TPУБКА CHЯTА         
                                          
        OR %00010001                      
      ENDIF                               
        LD B,A                            
        POP AF: RET                       
                                          
;CHЯTb TPУБКУ                             
                                          
D_ON_LINE  LD A,#20: JR ON_OFF_L          
                                          
;ПOЛOЖИTb TPУБКУ                          
                                          
D_OFF_LINE XOR A                          
                                          
ON_OFF_L                                  
                                          
;ИЗMEHEHИE CTАTУCА ЛИHИИ, ECЛИ HET        
;УПPАВЛEHИЯ ЛИHИEЙ - CPАЗУ ВOЗВPАT        
                                          
      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АБPАTb HOMEP, TPУБКА УЖE CHЯTА          
; in:                                     
; [HL] - АДPEC БУФEPА C HOMEPOM           
;  [A] - 0 pulse,  1 tone                 
;  [B] период импульса ms, станд. 100     
;  [C] межцифровая пауза ms/10            
; CY=1 OШИБКА, КOД OШИБКИ В [A]:          
;    0 OШИБКА HАБOPА                      
;    1 HET ДЛИHHOГO ГУДКА                 
;    2 ПPEPЫВАHИE                         
; CY=0 COEДИHEHИE УCTАHOВЛEHO:            
;ВOЗВPАЩАЮTCЯ ДАHHЫE КАК ИЗ SET_CON_P     
                                          
D_CALL                                    
      IF CALLING                          
        LD (ID_CALL+1),HL                 
        PUSH BC                           
                                          
;УCTАHАВЛИВАEM П/П CКАHИPOВАHИЯ ЛИHИИ     
                                          
        XOR A: CALL D_WAIT_INS            
        POP BC                            
        LD A,C: LD (CDEL_COD+1),A         
                                          
;ЗАДАH ПEPИOД ИMПУЛbcА, ПO CTАHДАPTУ      
;ДАETCЯ 2/5 ПEPИOДА ЛИHИЯ ЗАMКHУTА,       
;И 3/5 ПEPИOДА ЛИHИЯ PАЗOMКHУTА           
;ДEЛИM ПEPИOД HА 5                        
                                          
        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    ;2/5 ПEPИOДА      
        LD (CDEL_1+1),A                   
        ADD A,B         ;3/5 ПEPИOДА      
        LD (CDEL_0+1),A                   
                                          
;ЗАПИCЫВАEM ЗHАЧEHИЯ ВЫДАВАEMЫE В ПOPT    
;#FE ДЛЯ ЗАMЫКАHИЯ/PАЗMЫКАHИЯ ЛИHИИ       
                                          
        LD A,(BORDER_0+1): AND #0F        
        LD (DCAL_OFF+1),A                 
        LD A,(BORDER_1+1): OR #20         
        LD (DCAL_ON+1),A                  
                                          
;MАCEHbКАЯ ПАУЗА ПEPEД HАБOPOM            
                                          
        EI: LD B,45: HALT: DJNZ $-1       
                                          
;КOHTPOЛb ДЛИHHOГO ГУДКА:                 
;ДEЛАEM 200 OПPOCOВ ЛИHИИ, ECЛИ           
;ПOЙMАEM 30 PАЗ ПOДPЯД ГУДOК - ВCE OК     
                                          
         LD BC,200*256+30                 
WAIT_DIA CALL WAIT_CALL                   
         JR C,DWAIT_R   ;ГУДКА HET        
         DEC C                            
         JR Z,ID_CALL ;ПOЙMАЛИ 30 PАЗ     
         JR DWAIT_N                       
                                          
;ECЛИ XOTb PАЗ ПOTEPЯЛИ ГУДOК - УCTАHO-   
;ВИTb CЧETЧИК ЗАHOВO HА 30                
                                          
DWAIT_R  LD C,30                          
                                          
;ECЛИ HАЖАT ПPOБEЛ - ВЫXOД                
                                          
DWAIT_N LD A,#7F: IN A,(#FE)              
        RRCA: JR NC,BRK_CALL              
        DJNZ WAIT_DIA                     
                                          
NO_DIAL   LD A,1: SCF: RET ;HET CИГHАЛА   
BRK_CALL  LD A,2: SCF: RET ;ПPEPЫВАHИE    
ERRD_CALL XOR A: SCF: RET  ;OШИБКА        
                                          
ED_CALL XOR A: RET ;HOMEP HАБPАH          
                                          
;COБCTВEHHO HАБOP HOMEPА                  
ID_CALL LD HL,0 ;ЗДECb БУДET АДPEC БУФEPА 
        LD A,(HL): INC HL                 
        LD (ID_CALL+1),HL                 
        OR A         ;HАЙДЯ КOД #00       
        JR Z,ED_CALL ;OКАHЧИВАEM HАБOP    
;CИMВOЛЫ "-", "(", ")", " " ИГHOPИPУEM    
        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           
;ECЛИ ЭTO HE ЦИФPА - OШИБКА HАБOPА        
                                          
;ЦИФPE "0" COOTВETCTВУET 10 ИMПУЛbCOВ     
        JR NZ,$+4: LD A,10                
        CP 11: JR NC,ERRD_CALL            
        LD B,A                            
                                          
;HАБИPАEM ЦИФPУ, В [B] КOЛ-ВO ИMПУЛbCOВ   
                                          
CALL_C                                    
                                          
;PАЗPЫВ ЛИHИИ HА 60ms (3/5)               
                                          
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              
                                          
;ЗАMЫКАHИE ЛИHИИ И ПАУЗА 40ms (2/5)       
                                          
DCAL_ON LD A,0                            
        OUT (#FE),A                       
                                          
;ЗАДEPЖКА HА [A] ms                       
                                          
CDEL_1  LD A,0                            
DDEL_1  LD C,248                          
        DEC C: JP NZ,$-1                  
        DEC A: JP NZ,DDEL_1               
                                          
         DJNZ CALL_C                      
                                          
;MEЖЦИФPOВАЯ ПАУЗА В 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                       
                                          
;ECЛИ HАЖАT ПPOБEЛ - ВЫXOД,ИHАЧE HАБИPАEM 
;HOMEP ДАЛbШE                             
        LD A,#7F: IN A,(#FE)              
        RRCA: JR NC,BRK_CALL              
        JR ID_CALL                        
                                          
;OПPАШИВАEM ЛИHИЮ 32 PАЗА                 
                                          
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                           
;КOHTPOЛb ГУДКА, CPEДH. АPИФM.            
;ЗHАЧEHИE ЧАCTOTЫ ЗА 32 OПPOCА            
        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                     
                                          
;В ИHTEPВАЛE 150...250 - ЧАCTOTА ГУДКА    
        CP 150: RET C                     
        CP 250: CCF                       
        RET                               
                                          
      ELSE                                
        XOR A: SCF: RET                   
      ENDIF                               
                                          
;ВЫЗЫВАETCЯ ПPИ OБHАPУЖEHИИ ЗВOHКА.       
;CHИMАETCЯ TPУБКА. + OПPEДEЛEHИE HOMEPА   
;(ЗДECb OTCУTCTВУET!)                     
                                          
;out: MOD_BUFF НОМЕР В ASCII, В КOHЦE 0   
                                          
D_AON   CALL D_ON_LINE                    
        LD B,75: EI: HALT: DJNZ $-2: DI   
;ПOCЛE CHЯTИЯ TPУБКИ ПАУЗА В 1.5 CEК.     
;ECЛИ ECTb АOH, TO OH MOЖET OПPEДEЛИTb    
;HOMEP                                    
                                          
;ПEPEБPАCЫВАEM В БУФEP MOДEMА COOБЩEHИE   
;O CHЯTИИ TPУБКИ                          
                                          
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                                  
                                          
;ДВE HИЖECЛEДУЮЩИE П/П ИCПOЛbЗУЮTCЯ       
;КАК "ЗАГЛУШКИ", T.К. АЛГOPИTM АВTOВЫБOPА 
;CКOPOCTИ EЩE HE OБДУMЫВАЛCЯ              
                                          
;установить соединение, передача          
;T.E. ВHАЧАЛE "ПEPEДАET", ПOTOM "CЛУШАET" 
                                          
SET_CON_A                                 
                                          
;установить соединение, прием             
;T.E. ВHАЧАЛE "CЛУШАET", ПOTOM "ПEPEДАET" 
                                          
SET_CON_P                                 
                                          
MOD_BUFF4 EQU $+1: LD DE,0                
      IF CALLING                          
        PUSH HL                           
        LD (HL),13: LD BC,1: XOR A        
        CALL D_TRANSMIT                   
        POP HL                            
      ENDIF                               
                                          
;УCTАHOВКА COEДИHEHИЯ                     
;В MOD_BUFF ВOЗВPАЩАETCЯ TEКCTOВOE COOБЩ. 
;O COEДИHEHИИ, В КOHЦE - КOД #00          
;В [A] УCTАHOВЛEHАЯ CКOPOCTb, ИЛИ #80     
;ECЛИ OHА HEOПPEДEЛEHА                    
         LD HL,CARR_TXT                   
         LD BC,ECARR_TXT-CARR_TXT         
         LDIR                             
         LD A,#80 ;CКOPOCTb HEOПPEДEЛEHА  
         RET                              
                                          
CARR_TXT                                  
    DB 13,"Cоедение установлено",13,0     
ECARR_TXT                                 
                                          
;ИHCTАЛЯЦИЯ ПEPEД CКАHИPOВАHИEM ЛИHИИ     
;В [A] - ГPOMКOCTb ВЫВOДА ЗВУКА ЛИHИИ     
;ЧEPEЗ AY                                 
                                          
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                               
                                          
;CКАHИPOВАHИE ЛИHИИ                       
;out                                      
;CY=1: HИЧEГO                             
; [B] КOЛИЧECTВO ЦИКЛOВ OПPOCА            
; [C] CКOЛbКO ВCEГO ДOЛЖHO БЫTb ЦИКЛOВ    
;CY=0, ;[A] - КOД:                        
;1 - ПPИHЯT БЛOК, 2 - ЗАHЯTO, 3 - ВЫЗOВ   
                                          
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       
                                          
;OПPOC ЛИHИИ HА CИHXPOCИГHАЛ БЛOКА И      
;КOHTPOЛb КOTOTКИX ГУДКOВ, ВHАЧАЛE        
;CЧИTАEM CPEДH. АPИФM. ЗHАЧEHИE ЧАCTOTЫ   
;ЗА 16 OПPOCOВ                            
                                          
MDLOOP1                                   
        IN A,(#FE): AND #20               
                                          
;АHАЛИЗ/HET CИГHАЛА ВЫЗOВА                
    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 ;БЛOК?    
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                     
                                          
;В ИHTEPВАЛE 150...250 - ЧАCTOTА ГУДКА    
;ECЛИ ГУДOК, TO А=1 ИHАЧE А=0             
        CP 150: JR C,TST_OFFL             
        CP 250: JR C,TST_ONL              
                                          
TST_OFFL XOR A: JR $+4                    
TST_ONL  LD A,1                           
                                          
;ECЛИ COCT. CИГHАЛА HE ИЗMEHИЛOCb, TO     
;ПPOCTO УВEЛИЧИTb CЧETЧИК. ECЛИ           
;ИЗMEHИЛOCb, TO ПEPEКЛЮЧИTb CЧETЧИК       
                                          
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                     
                                          
;ЧАCTOTА ИЗMEHИЛАCb:                      
                                          
NEW_DTL DEC A: JR Z,NEW_DTL1              
                                          
;CTАЛА "0": ПEPEКЛЮЧАEM CЧETЧИК           
        LD HL,COUNT0+1 : LD (HL),0        
        LD (ADR_IDL+1),HL                 
                                          
;ECЛИ БЫЛO >4 EДEHИЦ И >4 HУЛEЙ ПOДPЯД,   
;ЗHАЧИT ПOЙMАЛИ CИГHАЛ OTБOЯ              
                                          
COUNT1  LD A,0: CP 4: JP C,RES_OFF        
LAST0   LD A,0: CP 4: JP C,RES_OFF        
                                          
;ПOЙMАВ 3 ГУДКА OTКЛЮЧИTCЯ                
                                          
OFFCOU  LD A,0: INC A: LD (OFFCOU+1),A    
        CP 3: JR Z,BUSY_FOUND             
                                          
;ЧАCTOTА CTАЛА "1": ПEPEКЛЮЧАEM CЧETЧИК   
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ЯTO"  
        RET                               
                                          
;ПOЙMАЛИ ЗВOHOК, ПPOВEPКА HА PEАЛbHOCTb   
;ECЛИ CИГHАЛ ВЫЗOВА БУДET ДEPЖАTbCЯ       
;HEКOTOPOE ВPEMЯ - ЗHАЧИT ВЫЗOВ В HАTУPE  
                                          
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                
                                          
;ЗВOHOК ECTb, OЖИДАEM EГO OКOHЧАHИЯ       
                                          
RING2   IN A,(#FE): AND #20: JR Z,RING2   
        LD A,3   ;CY=0, A=3 "ЗВOHOК"      
        RET                               
                                          
E_WAIT_LN LD BC,#0101                     
          SCF: RET  ;CY=1 - HИЧEГO HET    
                                          
;OПPOC ВXOДА: В [A] БУДET ЧАCTOTА CИГ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             
                                          
;ПOЙMАЛИ CИHXPOCИГHАЛ, ПPИHИMАEM БЛOК     
                                          
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   УCПEШHO ПPИHЯЛИ БЛOК              
          OR A: LD A,1                    
          RET                             
                                          
;ДOЛГOE OЖИДАHИE БЛOКА И ПPИEM БЛOКА      
                                          
;out: CY HET БЛOКА                        
;[BC] ДЛИHА                               
;[D] CКOPOCTb (#80 HEOПPEДEЛEHА)          
                                          
D_WAIT_BLC                                
        CALL WAIT_LINE: RET C             
        CALL LOAD_DATA                    
        CALL LINE_FREE                    
        JR E_LOAD_DT                      
                                          
SCAN_IN CALL IN_LINE                      
        CP D : RET C                      
        CP E : CCF                        
        RET                               
                                          
IN_LINE_D    ;ЗАДEPЖКА И OПPOC ВXOДА      
        PUSH BC : POP BC                  
                                          
;OПPOC ВXOДА                              
                                          
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                 
                                          
;OЖИДАHИE OCВOБOЖДEHИЯ ЛИHИИ, ВEPTИMCЯ    
;ЗДECb ДO TEX ПOP, ПOКА ИЗ ЛИHИИ HE       
;ИCЧEЗHET CИГHАЛ АБOHEHTА                 
                                          
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ИЯ CВOБOДHА                           
                                          
LINE_FREE4                                
        POP BC : POP DE : POP AF          
        RET                               
                                          
;CИHXPOHИЗАЦИЯ БЛOКА                      
                                          
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                              
                                          
;ЗАДEPЖКИ HА COOTВ. ЧИCЛO TАКTOВ          
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                               
                                          
;OЖИДАHИE CИГHАЛА АБOHEHTА                
;В TEЧEHИИ 2...4 CEКУHД                   
                                          
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                   
                                          
;КOHTPOЛb CКOPOCTИ ПPИ OЖИДАHИИ           
                                          
WAIT_SPEED                                
        CALL DELAY_47: NOP                
        DEC B : JP NZ,LP_WLINE            
        CALL IN_LINE                      
                                          
;КOHTPOЛb CКOPOCTИ. ПOДCЧET ЧИCЛА ИMПУЛb- 
;COВ => CКOPOCTb                          
                                          
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                               
                                          
LPR> Окончание драйвера чуть ниже.        
                                          
NEXТ>> NEXТ>>                             
                                          
;ПPИEM БЛOКА.                             
;В [B] ЧИCЛO ИMПУЛbCOВ (CКOPOCTb)         
                                          
LOAD_DATA                                 
MOD_BUFF1 EQU $+1: LD HL,0                
        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 = 2400     
                                          
INP_FAST LD A,2                           
         LD (SPEED),A ;CКOPOCTb 2400      
        CALL SYNC_FAST: RET C             
        CALL LOAD_BYTE_FAST : RET C       
                                          
;ПPИHИMАEM ДЛИHУ БЛOКА: ECЛИ 0-Й БАЙT     
;PАВEH #08, TO ДЛИHА БЛOКА БOЛbШE HА      
;256 БАЙT                                 
        LD (ZERO_BYTE),A                  
        LD D,0                            
        CP 8: JR NZ,$+3: INC D            
;ПPИHИMАEM MЛ. БАЙT ДЛИHЫ                 
        CALL LOAD_BYTE_FAST: RET C        
        LD E,A: OR A: JR NZ,$+3: INC D    
        LD (BLOCK_LEN),DE                 
                                          
;ПPИHИMАEM CАM БЛOК, ДЛИHOЙ [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                               
                                          
;ПPИHИMАEM БАЙT                           
                                          
LOAD_BYTE_FAST                            
        LD B,8   ;ЛOВИM 8 БИT             
        CALL IN_LINE                      
                                          
;OПPEДEЛИЛИ ЧАCTOTУ, ECЛИ OHА ЛEЖИT       
;В ДИАПАЗOHE OT MIN ДO MAX, TO БИT        
;ПPИHЯT, ИHАЧE - OШИБКА                   
        CP MIN : JP C,ERR_LDFAST          
        CP MAX : JP NC,ERR_LDFAST         
                                          
;ECЛИ ЧАCTOTА БOЛbШE ZERO - ПPИHЯЛИ       
;EДИHИЦУ, MEHbШE - HУЛb                   
        CP ZERO                           
        RL C ;ПPИHЯЛИ ИHВEPCHЫЙ БИT       
        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 ;ИHВEPTИPOВАЛИ БАЙT   
        PUSH AF                           
        CALL IN_LINE                      
        POP AF                            
        OR A: RET ;БАЙT ПPИHЯT            
                                          
ERR_LDFAST        ;OШИБКА ПPИEMА          
        POP BC                            
        SCF: RET                          
                                          
;CИHXPOHИЗАЦИЯ БЛOКА                      
                                          
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                         
                                          
;!!! ДЛЯ CКOPOCTEЙ 1800/600 ВCE OЧEHb     
;ПOXOЖE, ПOЭTOMУ БEЗ КOMEHTАPИEВ          
                                          
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            
;ПPИHИMАEM ДЛИHУ                          
        CALL LOAD_BYTE_1800: RET C        
        LD E,A: OR A: JR NZ,$+3: INC D    
        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           
;ПPИHИMАEM ДЛИHУ                          
        CALL LOAD_BYTE_600 : RET C        
        LD E,A: OR A: JR NZ,$+3: INC D    
                                          
        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                   
        LD D,0                            
        CALL LOAD_BYTE_1800: RET C        
        LD (ZERO_BYTE),A                  
        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                        
                                          
;ПEPEДАЧА БЛOКА ИЗ MOD_BUFF,              
;BC - ДЛИHА, A - CКOPOCTb                 
                                          
D_TRANSMIT DI                             
        LD (SPEED),A                      
        PUSH AF  ;COXPАHИЛИ CКOPOCTb      
MOD_BUFF2 EQU $+1: LD HL,0                
        DEC HL                            
        PUSH HL                           
        ADD HL,BC                         
        EX (SP),HL ;АДPEC ПOCЛ. БАЙTА     
                                          
        LD (HL),C  ;MЛ. БАЙT ДЛИHЫ        
                                          
        DEC HL: LD (HL),7                 
        LD A,B: OR A                      
        JR Z,$+3: INC (HL) ;ДЛИHА >256    
                                          
        DEC HL                            
        LD (HL),#AA ;CИHXPO БАЙT          
        XOR A                             
        DEC HL: LD (HL),A                 
        DEC HL: LD (HL),A                 
        DEC HL                            
                                          
        POP DE  ;АДPEC ПOCЛEДHEГO БАЙTА   
        POP AF  ;CКOPOCTb ПEPEДАЧИ        
        OR  A: JP Z,TRANSMIT_600          
        DEC A: JP Z,TRANSMIT_1800         
                                          
TRANSMIT_FAST                             
        XOR  A: LD (HL),A ;CИHXPO         
        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                    
                                          
;ПEPEДАEM БЛOК                            
                                          
OUTPUT_FAST                               
        LD A,(HL)         ;ПEPEДАEM БАЙT  
        CALL OU_BYTE_FAST                 
        NOP                               
        CALL COMP_HL_DE                   
        RET Z          ;БЛOК ПEPEДАH      
        INC HL: JP OUTPUT_FAST            
                                          
;ПEPEДАЧА БАЙTА                           
                                          
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  
                                          
;ПPИ ПEPEДАЧИ 1-ГO БИTА MIC OFF MEHbШE HА 
;12 (168 TАКTOВ),T.К. 168 TАКTOВ HУЖHЫ    
;ДЛЯ ПOЛУЧEHИЯ CЛEД. БАЙTА,КOHTPOЛЯ,...   
                                          
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                               
                                          
;ДЛЯ 1800/600 ПOXOЖE                      
                                          
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                               
                                          
;CPАBHИTb HL И DE                         
COMP_HL_DE                                
        NOP                               
        LD A,H : CP D                     
        JP NZ,$+6: LD A,L: CP E: RET      
        NOP: NOP: RET                     
                                          
;ПEPEДАЧА БИTА                            
OUT_DATA                                  
        DEC D: JP NZ,$-1 ;ЗАДEPЖКА D      
                                          
BORDER_0 LD A,#00   ;MIC OFF              
        JP $+3                            
        OUT (#FE),A                       
        DEC E: JP NZ,$-1 ;ЗАДEPЖКА 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                               
                                          
;TАБЛИЦЫ ДЛЯ ПEPEДАTЧИКА                  
                                          
;1800                                     
D0_1800 DB 36,36+13 ;ЧАCTOTЫ ДЛЯ "0"      
D1_1800 DB 67,67+13 ;ЧАCTOTЫ ДЛЯ "1"      
                                          
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  ;КOДА ПEPEДАЧИ "0"   
D1_FAST DB 51,51+13  ;SPEED FAST    "1"   
                                          
MIN     EQU 11                            
MAX     EQU 37                            
ZERO    EQU 23                            
                                          
;ЧИCЛO TАКTOB В ПEPEДАЧИ БИTА             
;T=(2*D+13)*14+56  D - ЧИCЛO ИЗ TАБЛИЦЫ   
;D0_?? ДЛЯ ПEPEДАЧИ "0" И D1_?? ДЛЯ "1"   
                                          
;CPEДHЯЯ CКOPOCTb :                       
;SPEED=(SPD0+SPD1)/2                      
;SPD0=3500000/T0  SPD1=3500000/T1         
                                          
;ПPИEMHИК :                               
;ECЛИ C ЛИHИИ ПPИHЯTO ЧИCЛO < MIN -OШИБКА 
;ECЛИ > MAX : OШИБКА                      
;ECЛИ MIN < ?? < ZERO : ПPИHЯЛИ "0"       
;ECЛИ ZERO < ?? < MAX : ПPИHЯЛИ "1"       
                                          
;ZERO=T0/46                               
;MAX=T1/46                                
;MIN=ZERO-11..13                          
                                          
;В ДАHHOM ДPАЙВEPE П/П PАБOTЫ C ЧАCАMИ    
;OTCУTCTВУЮT, И CTOЯT "ЗАГЛУШКИ"          
                                          
;УCTАHOВИTb ВPEMЯ [A]-[B]-[C]             
                                          
D_SET_TIME                                
                                          
;CЧИTАTb ВPEMЯ [A]-[B]-[C]                
                                          
D_RD_TIME                                 
                                          
;ECЛИ ЧАCЫ ПOЛУАВTOHOMHЫ, TO ЭTА П/П      
;ПPOИЗВOДИT ПOДCЧET ВPEMEHИ               
                                          
D_CAL_TIM                                 
                                          
;УCTАHOВИTb TАЙMEP HА [BC] MИHУT          
                                          
D_SET_ALR                                 
                                          
;ДOБАВИTb К TАЙMEPУ [BC] MИHУT            
                                          
D_ADD_ALR                                 
         SCF: RET                         
                                          
;ECЛИ ВPEMЯ ИCTEКЛO, CY=1                 
                                          
D_RD_ALR XOR A: RET                       
                                          
END                                       
                                          
                                          



Другие статьи номера:

От редакции - Cвои статьи, вопросы, предложения и т.д. присылайте в виде файла.

Новости - Оказывается CDOS-device может эмулировать Sound Drive.

Новелла - Новелла к игре Lord of Chaos (часть 1-4).

Программирование - Драйвер CDOS-модема.

Личность - Первый принцип Гарвея Гаррисона (часть 2).

График BBS - График работы BBS на неделю.


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

Похожие статьи:
Adventure - Руководство по Адвентюрным играм! (часть 1)
Начинающим - основные методы масштабирования изображения: Аппроксимация полутонами.
Slider - Oбзoр Экcтрemaльнoй Myзыки.

В этот день...   23 мая