Код:
HX.Read:
.IF NE MMG$T
Mov HXCQE, R4
.EndC
BiC #100, @#TPS
Mov #1, R0 ; Send SOH
Call ChOu
;; MovB #375, R0 ; Short packet
;; Call ChOu
;; Mov #7, R0 ; Packet size.
;; Call ChOu
Mov #176407, R0 ; Short packet ; Packet size = 7
Call WOu
;; Mov #'C, R0 ; Packet type = COMMAND
;; Call ChOs
;; Mov #'R, R0 ; Command = Cmd_READ_RAW
;; Call ChOs
;; Mov #"RC, R0 ; Packet type = COMMAND ; Command = Cmd_READ_RAW
Mov #"rC, R0 ; Packet type = COMMAND ; Command = Cmd_READ_PACKED_STREAM
Call WOs
Mov R3, R0 ; Unit
Call ChOs
Mov R2, R0 ; Block
Call WOs
Mov R1, R0 ; WordCount
Call WOs
Call TTKPrep
Mov ChSum, R0
Call WOu ; CheckSumm
................
Clr ChSum
1$:
Call ChIn
CmpB R0, #374 ; PACKED_STREAM ?
BEq GetPackedStream
CmpB R0, #376 ; Long packet == Data
BEq GetData
CmpB R0, #3 ; Ctrl_C ?
BEq ERR
CmpB R0, #375
BNE 1$
; Short packet == Error
Call ChIn
Mov R0, R3 ; R3 == Packet Size;
BEq ERR ; Packet Size == 0 ?
Skip:
CmpB (R3)+, (R3)+ ; R3 += 2;
Call ChIn
SOB R3, .-4. ; Get packet bytes.
Br ERR
GetData:
Call WInR3 ; R3 == Packet Size;
BEq ERR ; Packet Size == 0 ?
Call ChIn
CmpB R0, #'R ; Pcket type == REPLY ?
BNE Skip
Dec R3
BLE ERR
Add R0, ChSum
Call ChIn
CmpB R0, #'D ; Reply type == RAW DATA ?
BNE Skip
Dec R3
BLE ERR
Add R0, ChSum
ASL R1 ; R1 == Byte Count
2$:
Call ChIn
Add R0, ChSum
.IF EQ MMG$T
MovB R0, (R5)+
.IFF
Mov R0, -(SP)
Call @$PTBYT
.EndC
Dec R3
BEq 3$
SOB R1, 2$
3$:
Tst R3
BGt Skip
Call WInR3 ; R3 == CheckSumm
Dec R1
BNE ERR
CmpR3:
Cmp R3, ChSum
BNE ERR
OK: Tst (PC)+
ERR: SeC
Return
................
GetPackedStream:
NextPackedBlock:
Call ChIn ; R0 == PackedBlock Header
Add R0, ChSum
Dec R0 ;
BMi EndOfStream ; = 0 - End Of Stream
BEq GetRptBlock ; = 1 - RPT_Block
Inc R0 ; > 1 - RAW_Block
; Get RAW_Block
Mov R0, R2 ; R2 == RAW Bytes Count
1$:
Call ChIn
Add R0, ChSum
.IF EQ MMG$T
MovB R0, (R5)+
.IFF
Mov R0, -(SP)
Call @$PTBYT
.EndC
SOB R2, 1$
Br NextPackedBlock
EndOfStream:
Call WInR3 ; R3 == CheckSumm
Br CmpR3
GetRptBlock:
Call ChIn ;
Add R0, ChSum
Mov R0, R2 ; R2 == RPT Count
Call ChIn ; R0 == Byte to repeat.
Add R0, ChSum
1$:
.IF EQ MMG$T
MovB R0, (R5)+
.IFF
Mov R0, -(SP)
Call @$PTBYT
.EndC
DecB R2
BNE 1$
Br NextPackedBlock