diff --git a/SP__48.ASM b/SP__48.ASM index f1ce615..4e9258e 100644 --- a/SP__48.ASM +++ b/SP__48.ASM @@ -1395,28 +1395,31 @@ L04AA: CALL L24FB ; routine SCANNING to evaluate expression. RET ; return. ELSE ;--------------------------------------------------------------------- -NEW_TAP.MAIN: ; достаём параметры -.MAIN: ; ставим SYS_PAGE - PUSH AF - LD C,SLOT3 - IN B,(C) - LD A,SYS_PAGE - OUT (C),A - ; берём указатель на текущее положение в блоке и втыкаем блок - EXX - ; LD HL,(SYS_PAGE.TAP_RAM_BLK) - ; LD H, high SYS_PAGE.RAM_TABLE - ; LD A,(HL) - LD A,(SYS_PAGE.TAP_RAM_BLK) - ;!TODO check error - 0 or FF - LD HL,(SYS_PAGE.TAP_RAM_POINT) - EX AF,AF' +NEW_TAP: ; достаём параметры + ; ставим SYS_PAGE + PUSH AF + ; + LD A,#0F ; make the border white and mic off. + OUT (BorderColor),A ; output to port. + ; + LD C,SLOT3 + IN B,(C) + IN A,(SLOT2) + LD H,A +.skip: LD A,SYS_PAGE + OUT (C),A + ; берём указатель на текущее положение в блоке и втыкаем блок EXX + ; LD HL,(SYS_PAGE.TAP_FULL_SIZE) + ; LD A,(SYS_PAGE.TAP_FULL_SIZE + 2) + ; OR H + ; IN A,(SLOT2) + ; LD C,A + LD A,(SYS_PAGE.TAP_RAM_BLK) + INC A + JP NEW_TAP2.MAIN ; - OUT (C),B - POP AF - JP NEW_TAP.MAIN2 - BLOCK #04C2-$,#FF + _mInfoBLOCK #04C2-$,#FF ENDIF ;------------------------------------------------------------------------------ @@ -1926,121 +1929,175 @@ L05ED: INC B ; increment the time-out counter. ELSE ;--------------------------------------------------------------------- L0556: -NEW_TAP: DI - ;JR NC,.Error ; не поддерживается Verify - RET NC +NEW_TAP2: LD HL,L053F ; Address: SA/LD-RET + PUSH HL ; is saved on stack as terminating routine. + RET NC ; !FIXIT не поддерживается Verify ; +.next_blk: DI EXX PUSH BC PUSH DE PUSH HL - EXX - CALL NEW_TAP.MAIN + ;LD L,1 ; маркер блока пропуск/чтение - 0/1 + CALL NEW_TAP ; - EX AF,AF' - LD A,SYS_PAGE - OUT (SLOT3),A - INC HL - LD (SYS_PAGE.TAP_RAM_POINT),HL + EX AF,AF' ; AF ------------------v + LD A,SYS_PAGE + OUT (SLOT3),A + LD (SYS_PAGE.TAP_RAM_POINT),HL + EXX + OUT (C),B POP HL POP DE POP BC EXX - LD DE,0 - OUT (C),B - EX AF,AF' - EI +.shared_Exit: EX AF,AF' ; AF ------------------^ + ;LD DE,0 + ;LD A,1 + RET + ; + + + + ;!FIXIT сделать перемотку блока +.error_size: POP AF +.error_end_tap: XOR A + INC A RET ; -.MAIN2: PUSH DE ; размер данных - ; обработка блока TAP - EX AF,AF' - OUT (SLOT3),A - ; берём длину блока - EXX - LD A,(HL) - INC HL - LD D,(HL) - INC HL - LD E,(HL) - INC HL - EX AF,AF' - ; проверяем тип блока и требуемый блок - CP E - EX AF,AF' - LD E,A - EX AF,AF' - DEC DE - DEC DE - EXX - JR NZ,.skipThatBlock -.skipThatBlock: ;!FIXIT - ; восстанавливаем страницу пользователя - EX AF,AF' - IN A,(SLOT3) - EX AF,AF' - OUT (C),B - ; проверяем соответствие размера блока запрашиваемому - EXX - POP BC - EX DE,HL - AND A - SBC HL,BC - EX DE,HL - SCF - CCF - RET NZ - ; - ;EXX -.LoopTAP: EX AF,AF' - OUT (SLOT3),A - EX AF,AF' - LD A,(HL) - ;CPI - INC HL - DEC BC - EXX - OUT (C),B - EXX - LD (IX),A - INC IX - LD A,H - OR L - JR NZ,.NoSetNewPage - ; - ;;;;;;;;;;;;;;;;;;;; - LD A,SYS_PAGE - OUT (SLOT3),A - ; - LD HL,#C000 - EXX +.SetNewPage: LD A,SYS_PAGE + OUT (SLOT3),A + EX AF,AF' ; AF ------------------v + ; A = current page of ram block LD HL,(SYS_PAGE.TAP_RAM_BLK) LD H, high SYS_PAGE.RAM_TABLE - EX AF,AF' LD A,(HL) LD (SYS_PAGE.TAP_RAM_BLK),A - OUT (C),B + LD HL,#C000 + EXX + OUT (C),B + EXX + CP #FF + JR NZ,.shared_Exit + ; error + EX AF,AF' ; AF ------------------^ + SCF + RET ; error + ; + + + +.MAIN: ;======================================================= + JP Z,.error_size + DEC A + ;;;;; + OUT (SLOT2),A + LD L,A + LD H, high SYS_PAGE.RAM_TABLE + LD A,(HL) + ; + LD HL,(SYS_PAGE.TAP_RAM_POINT) + RES 6,H + OUT (SLOT3),A + ;IN A,(SLOT2) + ;;;;; + ;EX AF,AF' ; AF ------------------v + ; EXX + ; OUT (C),B + ; EXX + ; ; + ; POP AF + + ; ; обработка блока TAP + ; EX AF,AF' ; AF ------------------v + ; OUT (SLOT3),A + ; берём длину блока + LD A,(HL) + INC HL + ; + LD B,(HL) + INC HL + ; + LD C,(HL) + INC HL + SET 6,H + EX AF,AF' ; AF ------------------^ + EXX + OUT (C),B + RES 5,C + IN A,(SLOT2) + OUT (C),H + LD H,A + SET 5,C + LD L,1 ; маркер блока пропуск/чтение - 0/1 + EXX + ; проверяем тип блока и требуемый блок + POP AF + CP C + ; ZF = 0 если нужный блок + EX AF,AF' ; AF ------------------v + LD C,A + EX AF,AF' ; AF ------------------^ + DEC BC + DEC BC ; EXX - CP #FF - JR NZ,.NotEnd - ; - EX AF,AF; - LD A,B - OR C - RET NZ - EX AF,AF; -.NotEnd: EX AF,AF' - ;;;;;;;;;;;;;;;;;;;; - ; -.NoSetNewPage: LD A,B - OR C - JR NZ,.LoopTAP + ; ZF = 0 если нужный блок + LD A,H + JR Z,.ThatBlock + LD L,0 ; пропуск блока + ;LD E,A ; требуемый блок +.ThatBlock: EXX + ; восстанавливаем страницу пользователя + ; EX AF,AF' + ; IN A,(SLOT3) + EX AF,AF' + ; ZF = 0 если нужный блок + JR NZ,.normSize + ; проверяем соответствие размера блока запрашиваемому + EX HL,DE ; (адрес в рамблоке TAP) <-> (размер входной) + AND A + SBC HL,BC ; (размер входной) - (размер из тап) + EX HL,DE ; (размер данных) <-> (адрес в рамблоке TAP) + SCF + CCF + RET NZ ;!FIXIT сделать перемотку блока ; - SCF - RET +.normSize: INC BC ; с учётом байта контрольной суммы в конце блока TAP +.LoopTAP: LD A,H + OR L + CALL Z,.SetNewPage + JR C,.error_end_tap ; - BLOCK #0605-$,#FF + EX AF,AF' + OUT (SLOT3),A + EX AF,AF' + LD A,(HL) + CPI + EXX + OUT (C),B + LD H,A + LD A,L + EXX + SCF + RET PO + AND A + JR Z,.LoopTAP ; skip write + EXX + ;!FIXIT добавить тут Verify + ;LD A,H + ;XOR (IX) + ;RET NZ + ; + LD (IX),H + EXX + INC IX + JR .LoopTAP + ;======================================================= + + + + _mInfoBLOCK #0605-$,#FF ENDIF ;------------------------------------------------------------------------------ diff --git a/Shared_Includes b/Shared_Includes index a9cc74a..4da18d5 160000 --- a/Shared_Includes +++ b/Shared_Includes @@ -1 +1 @@ -Subproject commit a9cc74a9eba4044c35c930159bda0b0dde5d429b +Subproject commit 4da18d54c12e0f2ff4183be7a1cbf5882da1bd4f