aequit Цитата: Порылся в закромах, нашел
Это что досовая, что ли. Там нет СДЛД.
Genue Сам ваять что ли будешь?
Держи, может еще кто подключится. Давно бы уж всем миром начали бы ваять, что нибудь типа st mem.
С) А.Stepanov.Опубликовано в ФИДО.
>> Я же написал не D, а d. Если ты, судя по нижеописанному, нашел в
>> коде таблицу команд, то должен видеть разницу.
IM> барракуде (шуршит и скрежещет, ИМХО, хуже ей уже не будет). А что
IM> вообще эта команда делает? Мой сабж по ней толи виснет, толи ждёт
IM> некий блок,
Он ждет синхропоследовательности CC 33, на которые отвечает, соответственно,
77 и 88, затем ждет блок данных, # блока и контрольную сумму.
Подробно описывать лень, если интересно и знаком с ассемблером
Motorola 68HC11, могу выслать текст подпрограммы, обрабатывающей
эту команду.
Hу, держи, раз так хочешь. Только вряд ли тебе это сильно поможет -
с куском чужого кода в отрыве от остального разбираться - занятие еще то.
Впрочем, может быть, кому и пригодится.
Core:C2EB ; --------------- S U B R O U T I N E
Core:C2EB
Core:C2EB ; Прием CERT-модуля через итерфейс
Core:C2EB ;
Core:C2EB ; Блоки идут 1-2-3-4 итд, а последним идет блок 0
Core:C2EB ; Все размещается по адресам 1000-FFFF буферной памяти.
Core:C2EB ;
Core:C2EB ; Порядок приема блоков такой:
Core:C2EB ;
Core:C2EB ; HS - блок1 - блок2 - блок3 - ..... - блок34 - блок0 - общая КС
Core:C2EB ;
Core:C2EB ; HS - синхропоследовательность ( ->CC 77-> ->33 88->)
Core:C2EB ;
Core:C2EB ; блок имеет формат
Core:C2EB ;
Core:C2EB ; HS - 512 байт блока - 1 байт # блока - HS - 2 байта КС
Core:C2EB ;
Core:C2EB
Core:C2EB Recv_CERT_module: ; CODE XREF: CMD_1_d+C P
Core:C2EB ; CMD_T_f+9 P
Core:C2EB pshx
Core:C2EC tsx
Core:C2ED xgdx
Core:C2EE subd #$E
Core:C2F1 xgdx ; выделяем место в стеке
Core:C2F2 txs
Core:C2F3 std 0,x ; аргумент - адрес
Core:C2F5 clr 2,x
Core:C2F7 inc 2,x ; =1 номера блоков
Core:C2F9 ldd 0,x ; адрес
Core:C2FB addd #$200 ; следующий блок
Core:C2FE xgdy ; -> Y
Core:C300 jsr Handshake_start ; начинаем обмен
Core:C303
Core:C303 loc_C303: ; CODE XREF:
Core:C303 ; Recv_CERT_module+72 j
Core:C303 ldd #0
Core:C306 std 4,x ; счетчик
Core:C308 jsr Handshake_start ; синхронизация
Core:C30B
Core:C30B loc_C30B: ; CODE XREF:
Core:C30B jsr Recv_wait_byte ; читаем байт
Core:C30E jsr Print_wait_byte ; возвращаем как эхо
Core:C311 jsr Store_buf ; засовываем в буфер
Core:C314 iny ; адрес в буфере ++
Core:C316 ldd 4,x
Core:C318 addd #1 ; счетчик ++
Core:C31B std 4,x
Core:C31D cpd #$1FF ; сектор закончен?
Core:C321 ble loc_C30B ; нет - вычитываем весь
; сектор
Core:C323 jsr Recv_wait_byte ; читаем номер блока
Core:C326 jsr Print_wait_byte ; эхо
Core:C329 staa 6,x ; временно сохраненный #
Core:C32B beq loc_C330 ; # блока = 0
Core:C32D inca
Core:C32E staa 2,x ; новый # блока
Core:C330
Core:C330 loc_C330: ; CODE XREF:
Core:C330 jsr Handshake_start ; синхронизация
Core:C333 jsr Recv_wait_byte ; читаем 1 байт КС
Core:C336 staa 8,x
Core:C338 jsr Print_wait_byte
Core:C33B jsr Recv_wait_byte ; читаем 2 байт КС
Core:C33E staa 9,x
Core:C340 jsr Print_wait_byte
Core:C343 jsr Check_cert_buf_csum ; проверяем КС
Core:C346 beq loc_C356 ; совпала
Core:C348 ldaa #$15
Core:C34A jsr Print_wait_byte ; 15 - признак несовпадения
; КС
Core:C34D xgdy
Core:C34F subd #$200 ; блок назад
Core:C352 xgdy
Core:C354 bra loc_C303 ; перечитываем
Core:C356
Core:C356 loc_C356:
Core:C356 ldaa #6
Core:C358 jsr Print_wait_byte ; 6 - КС совпала
Core:C35B ldaa 6,x ; # блока
Core:C35D bne loc_C303 ; != 0 - продолжаем прием
; блоков
Core:C35F jsr Recv_wait_byte
Core:C362 staa 8,x ; 1 байт сигнатуры
Core:C364 jsr Recv_wait_byte
Core:C367 staa 9,x ; 2 байт сигнатуры
Core:C369 xgdy
Core:C36B subd #$200
Core:C36E std 6,x ; конечный адрес
Core:C370 ldd 0,x
Core:C372 std 4,x ; начальный адрес
Core:C374
Core:C374 loc_C374: ; CODE XREF:
Core:C374 ldy 6,x
Core:C377 jsr Get_buf ; 1 байт последнего сектора
Core:C37A ldy 4,x
Core:C37D jsr Store_buf ; в 1 байт 1 сектора
Core:C380 clra
Core:C381 ldy 6,x ; очищаем байт
Core:C381 ; последнего сектора
Core:C384 jsr Store_buf
Core:C387 ldd 6,x ; адрес конца++
Core:C389 addd #1
Core:C38C std 6,x
Core:C38E ldd 4,x ; адрес начала++
Core:C390 addd #1
Core:C393 std 4,x
Core:C395 ldd 0,x
Core:C397 addd #$1FF ; и так идем до конца сектора
Core:C39A cpd 4,x
Core:C39D bcc loc_C374
Core:C39F ldy 0,x ; адрес начала буфера
Core:C3A2 jsr calc_common_cs ; вычисляем общую КС
Core:C3A5 beq loc_C3B3 ; правильная
Core:C3A7 ldaa #$15
Core:C3A9 jsr Print_wait_byte ; неправильная КС
Core:C3AC ldaa #$20 ; ' '
Core:C3AE staa Err_code
Core:C3B1 bne loc_C3B9
Core:C3B3
Core:C3B3 loc_C3B3: ; CODE XREF:
Core:C3B3 ldaa #6 ; правильная КС
Core:C3B5 jsr Print_wait_byte
Core:C3B8 clra
Core:C3B9
Core:C3B9 loc_C3B9: ; CODE XREF:
Core:C3B9 ldd 8,x ; принятая сигнатура
Core:C3BB tsx
Core:C3BC xgdx
Core:C3BD addd #$E ; восстанавливаем стек
Core:C3C0 xgdx
Core:C3C1 txs
Core:C3C2 pulx
Core:C3C3 rts
Core:C3C3 ; End of function Recv_CERT_module
Core:C3C3
Core:C3C4
Core:C3C4 ; --------------- S U B R O U T I N E
Core:C3C4
Core:C3C4 ; ачало процедуры заливки церта -
Core:C3C4 ;
Core:C3C4 ; Послылка CC
Core:C3C4 ; Ответ 77
Core:C3C4 ; Посылка 33
Core:C3C4 ; Ответ 88
Core:C3C4
Core:C3C4 Handshake_start: ; CODE XREF:
Core:C3C4 ; Recv_CERT_module+1D P ...
Core:C3C4 jsr Recv_wait_byte ; читаем байт с компорта
Core:C3C7 cmpa #$CC ; '¦' ; CC ?
Core:C3C9 bne Handshake_start ; нет - ждем CC
Core:C3CB ldaa #$77 ; 'w'
Core:C3CD jsr Print_wait_byte ; Эхо-ответ = 77
Core:C3D0 jsr Recv_wait_byte ; читаем следующий байт
Core:C3D3 cmpa #$33 ; '3' ; 33 ?
Core:C3D5 bne Handshake_start ; нет - начинаем цепочку
;сначала
Core:C3D7 ldaa #$88 ; 'И' ; эхо-ответ = 88
Core:C3D9 jsr Print_wait_byte
Core:C3DC rts
Core:C3DC ; End of function Handshake_start
Core:C3DC
Core:C3DD
Core:C3DD ; --------------- S U B R O U T I N E
Core:C3DD
Core:C3DD ; Вычисление контрольной суммы полученного CERT-блока
Core:C3DD ;
Core:C3DD ; КС считается так.
Core:C3DD ;
Core:C3DD ; КС=0
Core:C3DD ;
Core:C3DD ;
Core:C3DD
Core:C3DD Calc_Cert_buf_CS: ; CODE XREF:
Core:C3DD ldd #0
Core:C3E0 std 4,x ; счетчик байтов
Core:C3E2 std $A,x ; будущая КС
Core:C3E2 ; End of function Calc_Cert_buf_CS
Core:C3E2
Core:C3E4
Core:C3E4 ; --------------- S U B R O U T I N E
Core:C3E4
Core:C3E4
Core:C3E4 sub_C3E4: ; CODE XREF: sub_C3E4+1E j
Core:C3E4 ; calc_common_cs+B P
Core:C3E4 ldab $B,x ; младший байт будущей КС
Core:C3E6 andb #$AA ; 'к' ; выделяем только
Core:C3E6 ; нечетные байты
Core:C3E8 stab 3,x ; заготовка для XOR
Core:C3EA jsr Get_buf ; байт из буфера
Core:C3ED tab ; a = b - оба байты КС
Core:C3EE eorb 3,x ; XORим с заготовкой
Core:C3F0 clra ; старший байт = 0
Core:C3F1 addd $A,x ; + КС
Core:C3F3 std $A,x ; новая КС
Core:C3F5 iny ; адрес++
Core:C3F7 ldd 4,x
Core:C3F9 addd #1 ; счетчик ++
Core:C3FC std 4,x
Core:C3FE cpd #$1FF ; конец буфера?
Core:C402 ble sub_C3E4 ; нет - считаем КС дальше
Core:C404 rts
Core:C404 ; End of function sub_C3E4
Core:C404
Core:C405
Core:C405 ; --------------- S U B R O U T I N E
Core:C405
Core:C405 ; Сравнение вычисленной и полученной КС
Core:C405
Core:C405 Compare_CS: ; CODE XREF:
Core:C405 ; calc_common_cs+1B P
Core:C405 ldd $A,x ; вычисленная КС
Core:C407 cpd 8,x ; полученная КС
Core:C40A beq loc_C410 ; совпала
Core:C40C ldaa #$FF
Core:C40E bne locret_C411 ; не совпала
Core:C410
Core:C410 loc_C410: ; CODE XREF: Compare_CS+5 j
Core:C410 clra
Core:C411
Core:C411 locret_C411: ; CODE XREF: Compare_CS+9 j
Core:C411 rts
Core:C411 ; End of function Compare_CS
Core:C411
Core:C412
Core:C412 ; --------------- S U B R O U T I N E
Core:C412
Core:C412 ; Проверка КС блока полученного церта
Core:C412
Core:C412 Check_cert_buf_csum: ; CODE XREF:
Core:C412 pshy
Core:C414 xgdy
Core:C416 subd #$200 ; встаем на начало сектора
Core:C419 xgdy
Core:C41B jsr Calc_Cert_buf_CS ; считаем его сумму -> 0A,0B
Core:C41E ldab $B,x ; младший байт КС
Core:C420 andb #$AA ; 'к'
Core:C422 stab 3,x
Core:C424 ldab 6,x ; # блока
Core:C426 eorb 3,x
Core:C428 clra
Core:C429 addd $A,x ; добавляем и # блока к КС
Core:C42B std $A,x
Core:C42D jsr Compare_CS ; сравниваем КС
Core:C430 puly
Core:C432 rts
Core:C432 ; End of function Check_cert_buf_csum
По окончании заливки церт-модуля в память резидентная программа пытается
записать этот модуль в служебную зону. В случае проблем - форматирует ее
(пишет formatting CERT track) и еще раз пытается залить. Если не пишется -
возвращает код ошибки.