FRIY2 ;DS #404;from ldlens ldlens DS 298 ddlens DS 48 rdlens DS 28 ;#2AA+256 FRIY2ln=$-FRIY2 disp DS 3 ARCBEG DS 7 ;FIRST 7 BYTES OF RAR align 256 bdlens=$-19 HEXBUF=$-19;24;TOO MUCH DECBUF ;DB 0 ;begin midBT ;круглый адрес! ;tree added 3,bits sub L(bits=0 оставлено) ;L=00 2 4 6 8 A C E db #00,#03,#00,#04,#00,#05,#00,#06,#00,#07,#00,#08,#00,#09,#00,#0A ;10 12 14 16 18 1A 1C 1E db #F1,#0B,#EF,#0D,#ED,#0F,#EB,#11,#EA,#13,#E8,#17,#E6,#1B,#E4,#1F ;20 22 24 26 28 2A 2C 2E db #E3,#23,#E1,#2B,#DF,#33,#DD,#3B,#DC,#43,#DA,#53,#D8,#63,#D6,#73 ;30 32 34 36 db #D5,#83,#D3,#A3,#D1,#C3,#CF,#E3 ;tree added 1 litBT db #02,#01,#02,#05,#03,#09,#04,#11,#05,#21,#06,#41,#06,#81,#06,#C1 DISPLAY litBT,"(don't cross 256)",$ ;added 1 bigBT db #00,#00,#01,#00 db #00,#00,#02,#00 db #00,#00,#03,#00 db #00,#00,#04,#00 db #00,#01,#05,#00 db #00,#01,#07,#00 db #00,#02,#09,#00 db #00,#02,#0D,#00 db #00,#03,#11,#00 db #00,#03,#19,#00 db #00,#04,#21,#00 db #00,#04,#31,#00 db #00,#05,#41,#00 db #00,#05,#61,#00 db #00,#06,#81,#00 db #00,#06,#C1,#00 db #00,#07,#01,#01 db #00,#07,#81,#01 db #00,#08,#01,#02 db #00,#08,#01,#03 db #00,#09,#01,#04 db #00,#09,#01,#06 db #00,#0A,#01,#08 db #00,#0A,#01,#0C db #00,#0B,#01,#10 db #00,#0B,#01,#18 db #00,#0C,#01,#20 db #00,#0C,#01,#30 db #00,#0D,#01,#40 db #00,#0D,#01,#60 db #00,#0E,#01,#80 db #00,#0E,#01,#C0 db #01,#0F,#01,#00 db #01,#0F,#01,#80 db #02,#10,#01,#00 db #03,#10,#01,#00 db #04,#10,#01,#00 db #05,#10,#01,#00 db #06,#10,#01,#00 db #07,#10,#01,#00 db #08,#10,#01,#00 db #09,#10,#01,#00 db #0A,#10,#01,#00 db #0B,#10,#01,#00 db #0C,#10,#01,#00 db #0D,#10,#01,#00 db #0E,#10,#01,#00 db #0F,#10,#01,#00 DEPK if 1==0 LD HL,s8 LD DE,8 LD BC,#105 ;LD HY,B ;это была защита от im 1, чтобы можно было использовать ly (под мл. байт остатка длины файла) TODO CALL DOD LD HL,(s8+#E1) ;LD A,(doSAVEk) ;SUB "y" ;JR NZ,$+4 ;LD H,A,L,A ;depack as trd LD (stsec),HL ;начиная с какого сектора пишем endif LD A,128 EXA LD A,(FLAGF) AND 16 JR NZ,DPsol ;;;nosolid CALL PRTHEE CALL RdTabs LD A,-1 LD (restoreLAST),A ;;;~nosolid DPsol if 1==0 LD HL,(DEPADR) LD (gegAD),HL ;for hobeta LD A,(doSAVEk) CP "$" LD A,(curPG) LD (gegPG),A JR NZ,nohobski LD B,17 INC L CALL Z,Lil DJNZ $-4 LD (stAD),HL LD (stPG),A nohobski endif LD HL,uNPremn LD A,(HL) ;LD (SAVElenLS1),A XOR A SUB (HL) LD lx,a;LY,A ;TODO fix, что-то не так с длиной распакованного файла INC HL LD A,0 SBC A,(HL) LD (HL),A LD C,A INC HL SBC A,A SUB (HL) LD (HL),A LD B,A RET Z if frmcnt ex af,af' ;' push af push bc push ix push iy OS_GETTIMER ;dehl=timer pop iy pop ix pop bc pop af ex af,af' ;' LD (wastimer),hl ENDIF XOR A LD L,A ld H,L if frmcnt LD (swaps),HL ENDIF SBC HL,BC ;LD (SAVEsz),HL ;??? TODO LD (SAVErmn),HL CALL OUTcur DEPADR=$+1 LD DE,0;THEEND CALL DEPK0 LD (DEPADR),DE ;LD IY,23610 ;;; if frmcnt call RST16 DB #D,#a,"frames=",0 OS_GETTIMER ;dehl=timer wastimer=$+1 ld de,0 or a sbc hl,de LD A,5 CALL PRDEC call RST16 DB "+swaps=",0 swaps=$+1 LD HL,0 LD A,5 CALL PRDEC ENDIF jp SAVE DEPK0i LD HL,uNPremn+1 INC (HL) ;jr $ JR NZ,DEPK0 JP GPqI if retree==0 NEWDEMN ;?/frame ;LD A,(IX) ;INC LX ;CALL Z,LDAsec rarrdbyte ;SCF RLA JR C,DEMNC JP DEMNNC endif yBs CALL store JP yBse yBYTE EXX LD (DE),A ;page=curPG INC E JR Z,yBs yBse INC lx;LY JR Z,DEPK0i DEPK0 EXX DEPK0X if retree if 1==0 exx jr $ ld a,d sub 0xc2 ld d,a ld a,e sub 0x5e or d jr z,$ ld a,d add a,0xc2 ld d,a exx endif ex af,af' call reld ex af,af' ld a,c ;1.5t/frame djnz yBYTE else LD HL,ld EXA DEMN0 ADD A,A JR Z,NEWDEMN JR NC,$+4 ;ноль DEMNC INC L ;единица INC L;HL DEMNNC LD C,(HL) INC L LD H,(HL) LD L,C IF (ld/256)( BIT 6,H ELSE if (ld/256)P BIT 7,H else IF (ld/256) BIT 5,h ENDIF endif ENDIF JP NZ,DEMN0 EXA LD A,C ;1.5t/frame DEC H JR NZ,yBYTE endif nBYTE SUB 270&0xff JP C,m270 ;<270 ;270..297 ADD A,A LD H,midBT/256 LD L,A ;LD BC,midBT ;ADD HL,BC ADD A,(HL) INC L LD L,(HL) if retree ld h,b;0 else LD H,0 endif JP NC,na270 CALL LDA18 ADD HL,BC na270 ex de,hl;PUSH HL;!!!!!!! ;TODO ex de,hl LD HL,dd CALL DEHUFF SLA L sla L LD BC,bigBT ADD HL,BC ;LD H,'bigBT XOR A OR (HL) LD (disp+2),A JR NZ,diN0 INC L ADD A,(HL) JR Z,diNADD INC L CALL LDA LD A,(HL) INC L LD H,(HL) LD L,A ADD HL,BC LD (disp),HL JR C,dIIputs ;3t/frame LD A,H ex de,hl;POP HL ;!!!!!!! ;TODO ex de,hl CP #20 JP C,putsPUT INC HL JP putsPUT dIIputs LD A,1 JP eIIputs diNADD INC L LD A,(HL) LD (disp),A LD HL,0 LD (disp+1),HL ex de,hl;POP HL ;!!!!!!! ;TODO ex de,hl JP putsPUT diN0 ;10t/frame INC L LD A,(HL) ;#F/#10 INC L CALL LDA LD A,(HL) INC L LD H,(HL) LD L,A ADD HL,BC LD (disp),HL LD A,(disp+2) ADC A,0 eIIputs LD (disp+2),A ex de,hl;POP HL ;!!!!!!! ;TODO ex de,hl INC HL CP 4 JP C,putsPUT INC HL JP putsPUT y269 EXX PUSH DE CALL RdTabs POP DE JP DEPK0 m270 INC A JR Z,y269 ;269 n256 ADD A,8 JP C,br261 ;261..268 ADD A,4 JP NC,GETPUT;256 ;257..260->0..3 RRCA RRCA LD HL,(ind03) ADD A,L LD L,A ;only +5 frames: ;LD B,0 ;DJNZ $ LD DE,disp LDI LDI LDI ;jr $ LD HL,rd CALL DEHUFF SLA L ;LD BC,midBT ;ADD HL,BC LD H,midBT/256 LD A,L ADD A,(HL) INC L LD L,(HL) LD BC,0 LD H,B CALL C,LDA18 ADD HL,BC LD A,(disp+2) CP 4 JR C,$+3 INC HL ;INC HL OR A JR NZ,I1puts LD BC,(disp) LD A,B CP #20 JR NC,I1puts DEC HL DEC BC DEC B JP M,putsPUT I1puts INC HL JP putsPUT ;261..268 br261 ADD A,A LD HL,litBT ADD A,L LD L,A LD A,(HL) INC L LD L,(HL) CALL LDA18 LD H,B ADD HL,BC LD (disp),HL XOR A LD (disp+2),A LD HL,2 putsPUT LD (puts),HL GETPUT ;2t/frame in haets20.rar ind03=$+1 LD HL,TAB44 LD A,L SUB 64 LD L,A LD (ind03),A LD A,(disp) LD (HL),A INC L LD BC,(disp+1) LD (HL),C INC L LD (HL),B _2 LD HL,+(1-INITIALMEMPAGES)*64+(THEEND/256)-256 ;INITIALMEMPAGES;6 = число страниц памяти? ADD HL,BC GPaddrpatch=$+1 JP NC,GPmem ;подменяется на копию p48 (оригинал p48 копируется поверх окончания GPmem, т.к. изначально инициализатор затирался, и p48 тоже, и так быстрее выход из p48) ;jr $ ;сюда не попадаем ;TODO if 1==0 GPdisk ;глючит :( ;FROM=disk ;solid shift EXX PUSH DE EXX POP HL LD BC,(stAD) LD B,0 OR A SBC HL,BC ; LD B,A LD A,L SUB B PUSH AF ;beg.buf on disk=stsecnw ;sub secs back PUSH AF LD A,(curPG) SLA H sla H ADC A,0 ;V0.42 RRA RR H RRA RR H LD L,H ld H,A POP AF LD BC,(disp+1) SBC HL,BC ;LD BC,0 ;#80-'THEEND ;ADD HL,BC ;??? ;HL=secs add dup 4 add hl,hl edup stsecnw=$+1 ;C<<4 LD BC,0 ADD HL,BC ; JR C,notr0 ; LD A,H ; ADD A,160 ; LD H,A ;notr0 LD A,L RRCA RRCA RRCA RRCA LD L,A LD (resec),HL EXX CALL restore POP AF LD L,A LD BC,(puts) ADD A,C LD A,(curPG) DEC B JR Z,GPftor JR C,GPftor LD B,D INC B JP NZ,GPmfst DEC B ;B=-1 GPftor INC B CALL OUTME GPf1 LD A,(HL) LD (DE),A INC L CALL Z,restore ;read known sector from destination file INC E CALL Z,store DEC BC LD A,B OR C JR NZ,GPf1 endif GPqSLOW LD HL,(puts) LD C,lx;LY LD A,(uNPremn+1) LD B,A ADD HL,BC LD A,L LD lx,a;LY,A LD A,H LD HL,uNPremn+1 LD (HL),A JP NC,DEPK0 JP GPqI GPmem EXX LD H,D ld L,E LD BC,(disp) LD A,(curPG) SLA H sla H ;CY=1 ADC A,-1;V0.42 RRA RR H ;CY=0 RRA RR H ;CY=0 ;AHL=adrinbuf-hwost SBC HL,BC EXX SBC A,B EXX ;RL H ;RLA ;RL H ;ADC A,A ;CY=1 or M ;JP P,$+5 ;V0.42 RL H RLA RL H RLA SCF RR H SCF RR H CP 128 ;что это? TODO JR C,GPendif LD C,A ;что это? TODO LD A,H ADD A,#C0-(THEEND/256) JR NC,GPelse INC C JR Z,GPthen GPelse OR 192 LD H,A _p1 LD A,INITIALMEMPAGES;6 ;число страниц памяти? ADD A,C JR C,GPendif GPthen RES 6,H XOR A GPendif GPmemsz=$-GPmem LD (frPG),A puts=$+1 LD BC,0 ;2..261 DEC B JR Z,GPmtor LD B,D INC B JR Z,GPmt2 LD B,H INC B JR Z,GPmt2 curPG=$+1 CP 0 JR NZ,GPmt3 GPmfst LD B,0 LD A,C LDIR GPq ADD A,lx;LY LD lx,a;LY,A JP NC,DEPK0 LD HL,uNPremn+1 INC (HL) JP NZ,DEPK0 GPqI INC HL INC (HL) JP NZ,DEPK0 RET GPm2 LD A,(frPG) GPmt2 CALL OUTME LD B,(HL) INC L CALL Z,corFROM CALL OUTcur LD A,B LD (DE),A INC E CALL Z,store DEC C JP NZ,GPm2 JR GPe ;t=2f GPm3 LD A,(frPG) GPmt3 CALL OUTME LD A,(HL) PUSH AF INC L CALL Z,corFROM LD B,(HL) INC L CALL Z,corFROM curPG2=$+1 LD A,0 CALL OUTME POP AF LD (DE),A INC E CALL Z,store DEC C JR Z,GPe LD A,B LD (DE),A INC E CALL Z,store DEC C JP NZ,GPm3 GPe LD A,(puts) JP GPq GPmtor INC B GPm0tor LD A,(frPG) CALL OUTME LD A,(HL) PUSH AF INC L ; CALL Z,corFROM ;v0.60! CALL OUTcur POP AF LD (DE),A INC E CALL Z,store DEC BC LD A,B OR C JR NZ,GPm0tor JP GPqSLOW store INC D RET NZ LD A,(curPG) INC A LD D,#C0 _4 CP INITIALMEMPAGES;6 ;число страниц памяти? JR Z,storer jp OUTMEcu storer ;first store - ADDR to ENDMEM, ; ADDR=bufstor+hwostik ;posledujushie - ADDR to ENDMEM ;hwostik ENDMEM -> bufstor, save next time ; iz SAVErmn ne wychitaetsa ;SAVE saves ADDR, (SAVErmn) SECTORS. IF border LD A,4 OUT (-2),A ENDIF PUSH BC,HL push iy;IX CALL SAVbeg ;HL=addr,A=page PUSH AF storePG0 LD A,H INC A JR NZ,nRAZLOM LD DE,bufstor PUSH DE LD B,A SUB L LD C,A DEC C INC BC EXA INC A _5 CP INITIALMEMPAGES;6 ;число страниц памяти? JR Z,storQQQ LDIR LD H,#C0 ;V0.42 PUSH AF CALL OUTME POP AF EXA XOR A SUB E JR Z,$+5 LD C,A LDIR DEC H LD A,1 JR yRAZLOM nRAZLOM PUSH HL NEG yRAZLOM LD E,A ADD A,H LD H,A EX (SP),HL PUSH DE ;e=number of sectors to save ;hl=addr if 1==1 ld d,e ld e,0 call SAVEBLOCK else LD C,6 LD B,E stsec=$+1 LD DE,0 CALL DOD LD HL,(#5CF4) LD (stsec),HL endif POP DE SAVErmn=$+1 LD HL,0 XOR A LD D,A ;de=number of sectors to save (saved) SBC HL,DE LD (SAVErmn),HL POP HL JR storePG0 storQQQ POP AF ;de LD E,L PUSH DE LDIR POP HL if 1==0 ;TODO это для возможности чтения уже записанного ;TODO длину сохраняемого файла - SAVErmn*256, сделать SEEK, прочитать, а потом SEEK обратно (будет ли это работать в FATFS? в TRDOSFS не будет) PUSH HL LD DE,(stsec) LD BC,#106 CALL DOD LD HL,(#5CF4) LD A,L ADD A,A add A,A add A,A add A,A LD L,A LD (stsecnw),HL POP HL endif POP AF EXA XOR A ;! IF border OUT (-2),A ENDIF LD (stPG),A LD (stAD),HL LD DE,THEEND POP iy;IX pop HL,BC JP OUTMEcu corFROM INC H RET NZ frPG=$+1 LD A,0 INC A LD (frPG),A LD H,#C0 _3 CP INITIALMEMPAGES;6 ;число страниц памяти? JP NZ,OUTME XOR A LD H,THEEND/256 LD (frPG),A JP OUTME Lil INC H RET NZ LD H,#C0 INC A L_pg CP 0 JR NZ,$+5 XOR A LD H,THEEND/256 LD C,A CALL OUTME LD A,C RET