?login_element?

Subversion Repositories NedoOS

Rev

Rev 544 | Go to most recent revision | Blame | Compare with Previous | Last modification | View Log | Download

  1.         DEVICE ZXSPECTRUM128
  2.         include "../_sdk/sys_h.asm"
  3.  
  4.        MACRO rarrdbyte
  5.         INC LY
  6.         LD A,(IY)
  7.         CALL Z,RDBYH
  8.        ENDM
  9.  
  10. INITIALMEMPAGES=32;6
  11.        
  12. STACK=0x4000
  13. TCRC=0x6800 ;size 0x400, divisible by 0x400
  14. DISKBUF=0x6c00
  15. DISKBUFsz=0x1000
  16.  
  17. frmcnt=1;0
  18. mmc=1;0
  19. crc=1;0
  20. tcrc=0;1 ;TODO почему не работает?
  21. kb=0;1kIN
  22. opt=1
  23. border=0
  24. unexp=1;0
  25. masks=1
  26.  
  27. retree=1 ;работает? (генератор кода для разгребания дерева Хаффмана) ;требуется reld длиной 0x0b08 (298*19/2-7)
  28.  
  29. ;v1="0"
  30. ;v2="6"
  31. ;v3="1"
  32.  
  33. COLOR=7
  34. CURSORCOLOR=0x38
  35.  
  36. namln=MAXPATH_sz;100 ;#FA
  37. THEEND=#c000;#8000;#C000
  38. CODETOP=#7D00 ;константа-максимум,используется только в DISPLAY
  39. s8=#7D00;#5B00 ;sys
  40. TAB44=#5B00;#7A3D ;#7F00 нельзя (bufstor)
  41. stBUF=#7E00;#5800 ;TODO
  42. ;sec=stBUF      ;dir
  43. bufstor=THEEND-256
  44.  
  45. TREES=0x2000
  46. bd=TREES
  47. ld=bd ;должно быть выше 0x4000! TODO
  48. dd=ld+(298*4)
  49. rd=dd+(48*4)
  50. TREES_SZ=rd+(28*4)-TREES
  51.  
  52.         org PROGSTART
  53. cmd_begin
  54.         ld sp,STACK
  55.         call initstdio
  56.         ;ld e,6 ;textmode
  57.         ;OS_SETGFX
  58.        
  59.         ;OS_GETMAINPAGES
  60. ;dehl=номера страниц в 0000,4000,8000,c000
  61.         ld hl,PTABL
  62.         ld b,64 ;TODO меньше для ATM2
  63. getpgs0
  64.         push bc
  65.         push hl
  66.         OS_NEWPAGE
  67.         pop hl
  68.         ld (hl),e
  69.         inc hl
  70.         pop bc
  71.         djnz getpgs0
  72.        
  73.         ld hl,COMMANDLINE
  74.         call skipword
  75.         call skipspaces
  76.         ld a,(hl)
  77.         or a
  78.         jr nz,$+5
  79.          ld hl,defaultfilename
  80.         ld (curfilenameaddr),hl
  81.        
  82. ;curfilenameaddr=$+1
  83. ;        ld de,0
  84. ;        call openstream_file
  85. ;        or a
  86. ;        jp nz,openerror
  87.        
  88.         ;CALL initdepk;Z6629 ;ИНИЦИАЛИЗАЦИЯ ДЕПAKEPA
  89.  
  90.        call GO
  91.         ;call depack
  92.         QUIT
  93.        
  94. openerror
  95. error
  96. quit
  97.         QUIT
  98.  
  99. copyname83
  100. ;hl->de
  101. ;длина имени не увеличивается - можно поверх?
  102. ;перекодирует слэш в прямой
  103. copyname83_element
  104.         ld b,8
  105. copyname83_0
  106.         ld a,(hl)
  107.         inc hl
  108.         or a
  109.         jr z,copyname83_q
  110.         cp 0x5c;'\'
  111.         jr z,copyname83_endelement
  112.         cp '/'
  113.         jr z,copyname83_endelement
  114.         cp '.'
  115.         jr z,copyname83_ext
  116.         ld (de),a
  117.         inc de
  118.         djnz copyname83_0
  119. ;8 chars of name copied, wait for dot or slash or terminator
  120. copyname83_skipname0
  121.         ld a,(hl)
  122.         inc hl
  123.         or a
  124.         jr z,copyname83_q
  125.         cp 0x5c;'\'
  126.         jr z,copyname83_endelement
  127.         cp '/'
  128.         jr z,copyname83_endelement
  129.         cp '.'
  130.         jr nz,copyname83_skipname0
  131. copyname83_ext
  132.         ld (de),a ;'.'
  133.         inc de
  134.         ld b,3
  135. copyname83_ext0
  136.         ld a,(hl)
  137.         inc hl
  138.         or a
  139.         jr z,copyname83_q
  140.         cp 0x5c;'\'
  141.         jr z,copyname83_endelement
  142.         cp '/'
  143.         jr z,copyname83_endelement
  144.         cp '.'
  145.         jr z,copyname83_skipext0
  146.         ld (de),a
  147.         inc de
  148.         djnz copyname83_ext0
  149. copyname83_skipext0
  150.         ld a,(hl)
  151.         inc hl
  152.         or a
  153.         jr z,copyname83_q
  154.         cp 0x5c;'\'
  155.         jr z,copyname83_endelement
  156.         cp '/'
  157.         jr nz,copyname83_skipext0
  158. copyname83_endelement
  159.         ld a,'/'
  160.         ld (de),a ;'/'
  161.         inc de
  162.         jr copyname83_element
  163. copyname83_q
  164.         ld (de),a ;0
  165.         ret
  166.  
  167. skipword
  168. ;hl=string
  169. ;out: hl=terminator/space addr
  170. getword0
  171.         ld a,(hl)
  172.         or a
  173.         ret z
  174.         cp ' '
  175.         ret z
  176.         inc hl
  177.         jr getword0
  178.  
  179. skipspaces
  180. ;hl=string
  181. ;out: hl=after last space
  182.         ld a,(hl)
  183.         cp ' '
  184.         ret nz
  185.         inc hl
  186.         jr skipspaces
  187.  
  188. strcopy
  189. ;hl->de
  190. strcopy0
  191.         ld a,(hl)
  192.         ldi
  193.         or a
  194.         jr nz,strcopy0
  195.         ret
  196.  
  197. PTABL
  198.         ds 64 ;page numbers, patched
  199.  
  200. OUTMEcu LD (curPG),A
  201.         LD (curPG2),A
  202. OUTcur  LD A,(curPG)
  203. OUTME
  204.         PUSH BC
  205.        LD b,PTABL/256
  206.        ADD A,PTABL&0xff
  207.         LD c,A
  208.         LD A,(bc)
  209.         SETPG32KHIGH
  210.         POP BC
  211.         RET
  212.  
  213. minhl_bc_tobc
  214.         or a
  215.         sbc hl,bc
  216.         add hl,bc
  217.         ret nc ;bc<=hl
  218.         ld b,h
  219.         ld c,l
  220.         ret
  221.  
  222.        
  223. SAVEBLOCK
  224. ;de=bytes to save
  225. ;hl=addr
  226.         exx
  227.         push de
  228.         exx
  229.         ex af,af'
  230.        push af
  231.        ld a,(savefilehandle)
  232.        ld b,a
  233.        ex de,hl
  234.         push ix
  235.        push iy
  236.        OS_WRITEHANDLE
  237.        pop iy
  238.         pop ix
  239.        pop af
  240.        ex af,af'
  241.         exx
  242.         pop de
  243.         exx
  244.         ret
  245.  
  246. strlen
  247. ;hl=str
  248. ;out: hl=length
  249.         ld bc,0 ;чтобы точно найти терминатор
  250.         xor a
  251.         cpir ;найдём обязательно, если длина=0, то bc=-1 и т.д.
  252.         ld hl,-1
  253.         or a
  254.         sbc hl,bc
  255.         ret
  256.  
  257. SAVECREATE
  258.         push iy
  259.  
  260. ;сформировать filename 8.3 (во всех элементах):
  261.         ld hl,OUTNAM;Z664A
  262.         ld de,OUTNAM;filename
  263.         ;call strcopy
  264.         call copyname83 ;заодно перекодирует слэш в /
  265. ;TODO если нет такой директории, то create directory (например, "md scr/1" без слеша в конце):
  266.  
  267.         ld hl,OUTNAM
  268. SAVECREATE_dir0
  269. ;hl=текущий элемент пути
  270. ;1.проверить, что путь не кончился (т.е. дальше есть /)
  271.         push hl
  272.         call strlen
  273.         ld b,h
  274.         ld c,l
  275.         pop hl
  276.         ld a,'/'
  277.         cpir
  278.         jr nz,SAVECREATE_dirq
  279.         dec hl
  280. ;hl=at slash
  281. ;2.проверить, что есть i-й элемент пути (до слэша) - через CHDIR?
  282.         ld (hl),0
  283.         push hl
  284.         ld de,pathbuf
  285.         OS_GETPATH
  286.         ld de,OUTNAM
  287.         OS_CHDIR
  288.         push af
  289.         ld de,pathbuf
  290.         OS_CHDIR
  291.         pop af
  292.         or a
  293.         jr z,SAVECREATE_dirnomk ;такая директория уже есть
  294. ;3.если нет, то создать 0..i-й (текущий путь не меняем)
  295.         ld de,OUTNAM
  296.         OS_MKDIR
  297. SAVECREATE_dirnomk
  298.         pop hl
  299.         ld (hl),'/'
  300.         inc hl
  301.         jr SAVECREATE_dir0
  302. SAVECREATE_dirq
  303.  
  304.         ld de,OUTNAM;filename
  305.         OS_CREATEHANDLE
  306. ;b=new file handle
  307.         ld a,b
  308.         ld (savefilehandle),a
  309.         pop iy
  310.         ret
  311.  
  312. SAVECLOSE
  313.         push iy
  314. savefilehandle=$+1
  315.         ld b,0
  316.         OS_CLOSEHANDLE
  317.         pop iy
  318.         ret
  319.        
  320. ;;;
  321. SAVbeg
  322. stAD=$+1
  323.         LD HL,0
  324. stPG=$+1
  325.         LD A,0
  326.         ;BIT 7,H
  327.         ;JR NZ,$+3
  328.         ;INC A
  329.        PUSH AF
  330.         CALL OUTME
  331.        POP AF
  332.         EXA
  333.         RET
  334.  
  335. SAVE
  336. ;size = SAVErmn*256 (чуть меньше, т.к. учитываем (uNPremn) как мл.байт)
  337. doSAVEk=$+1
  338.         LD A,0
  339.         CP "N"
  340.         JR NZ,NLISTERLAST ;??? TODO
  341. ;LISTERLAST
  342.        LD HL,(DEPADR)
  343.        LD (stAD),HL
  344.        LD A,(curPG)
  345.        LD (stPG),A
  346.         RET
  347. NLISTERLAST
  348.        CALL SAVbeg
  349. savePG0
  350.         LD A,H
  351.         INC A
  352.         JR NZ,nRASLOM
  353.         LD DE,bufstor
  354.         PUSH DE
  355.         LD B,A
  356.         SUB L
  357.         LD C,A
  358.        DEC C
  359.        INC BC
  360.         LDIR
  361.         LD H,#C0
  362.         EXA
  363.         INC A
  364.        PUSH AF
  365.         CALL OUTME
  366.        POP AF
  367.         EXA
  368.         XOR A
  369.         SUB E
  370.         JR Z,$+5
  371.         LD C,A
  372.         LDIR
  373.        DEC H
  374.         LD A,1
  375.         JR yRASLOM
  376. nRASLOM
  377.         PUSH HL
  378.         NEG
  379. yRASLOM LD E,A
  380.         LD BC,(SAVErmn)
  381.         LD A,C
  382.         SUB E
  383.         LD C,A
  384.         JR NC,nKON
  385.         DEC B
  386.         JP P,nKON
  387.         ADD A,E
  388.         LD E,A
  389.         LD BC,0
  390. nKON
  391.         LD (SAVErmn),BC
  392.         LD A,E
  393.         ADD A,H
  394.         LD H,A
  395.        EX (SP),HL
  396.        PUSH BC
  397. ;e=number of sectors to save
  398. ;hl=addr
  399.         if 1==1
  400.         ld d,e
  401.         ld e,0
  402.         ld a,b
  403.         or c
  404.         jr nz,SAVE_notlastblock
  405.         ld a,(uNPremn)
  406.         or a
  407.         jr z,SAVE_notlastblock
  408.         ld e,a
  409.         dec d
  410. SAVE_notlastblock
  411.         call SAVEBLOCK
  412.         else
  413.        
  414.         LD C,6
  415.         LD B,E
  416.         LD DE,(stsec)
  417.         CALL DOD
  418.         LD HL,(#5CF4)
  419.         LD (stsec),HL
  420.         endif
  421.        
  422.        POP BC
  423.        POP HL
  424.         LD A,B
  425.         OR C
  426.        JR NZ,savePG0
  427.        LD HL,(DEPADR)
  428.        LD (stAD),HL
  429.        LD A,(curPG)
  430.        LD (stPG),A
  431.         RET
  432. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  433.        
  434. RDBYTE
  435.         INC LY
  436.         LD A,(IY)
  437.         RET NZ
  438. RDBYH
  439.         INC HY
  440.         LD A,HY
  441. ;RDBYHend=$+1
  442.         CP DISKBUF/256+(DISKBUFsz/256)
  443.         LD A,(IY)
  444.          ;ccf ;CY=0: OK ;TODO переделать на CY=1 длЯ скорости
  445.         RET nz
  446.        PUSH HL
  447.        PUSH DE
  448.         PUSH BC
  449.         push IX
  450.        ;CALL rdCS
  451.        ex af,af'
  452.       PUSH AF
  453.        exx
  454.        push bc
  455.        push de
  456.        push hl
  457.        ld de,DISKBUF
  458.        ld hl,DISKBUFsz
  459.         push de
  460.        call readstream_file
  461.         pop de
  462.         push de ;addr
  463. ;hl=actual size
  464.         ld a,h
  465.         or l
  466.         jp z,readerror
  467. ;move block to end of buf:
  468.        ld b,h
  469.        ld c,l
  470.        dec de ;ld de,DISKBUF-1
  471.        add hl,de ;end of data
  472.        ld de,DISKBUF+DISKBUFsz-1
  473.        sbc hl,de
  474.        add hl,de
  475.        jr z,ZIPRDBYHq
  476.         pop af
  477.        lddr
  478.        inc de ;begin of data
  479.         push de
  480. ZIPRDBYHq
  481.         pop iy ;addr = DISKBUF+
  482.        
  483.        pop hl
  484.        pop de
  485.        pop bc
  486.        exx
  487.       POP AF
  488.       ex af,af'
  489.         POP IX
  490.         pop BC
  491.        POP DE
  492.          pop hl
  493.        ;ld iy,DISKBUF
  494.        LD A,(IY)
  495.        scf;or a ;CY=0: OK ;TODO переделать на CY=1 длЯ скорости (нужно для retree, там add a,a:call z,bitik ... bitik:rarrdbyte(CY=1):rla:ret)
  496.         RET
  497.  
  498. prcrlf
  499.         ld hl,tcrlf
  500. prtext
  501.         ld a,(hl)
  502.         or a
  503.         ret z
  504.         push hl
  505.         push iy
  506.         PRCHAR_
  507.         pop iy
  508.         pop hl
  509.         inc hl
  510.         jr prtext
  511.        
  512. tcrcerror
  513.         db "CRC error"
  514. tcrlf
  515.         db 13,10,0
  516.  
  517.         include "../_sdk/file.asm"
  518.         include "../_sdk/stdio.asm"
  519.         include "rarfile.asm"
  520.         include "rardepk.asm"
  521.        
  522. defaultfilename
  523.         db "0:/rar/acnews47.rar",0
  524. ;filename
  525. ;        db "depkfile.fil"
  526. ;        ds filename+256-$ ;для длинных имён
  527.  
  528. CURFILE DS namln
  529. ;DESCRIP DS 16 ;TODO убрать
  530.  
  531. CURPOS  DS 4
  532. NXTPOS  DS 4
  533.  
  534. ;;;;;32 bytes rar file header
  535. CRCF    DW 0
  536. TYPEF   DB 0
  537. FLAGF   DW 0
  538. SIZEF   DW 0 ;head size
  539. ;;^^^7 bytes also form archive footer
  540. ADDSZF  DS 4 ;packed size
  541.  
  542. UNPSIZE DS 4
  543. HOSTOS DB 0;NU
  544. FILECRC DS 4
  545. FTIME   DS 4
  546. UNPVER  DB 0
  547. METHOD  DB 0
  548. NAMSIZE DW 0
  549. ATTR    DS 4
  550. ;;;;;;;;;;;;;;;;;;;
  551.  
  552. EXPTYP  DW 0 ;expected type&FLAGH
  553. ;CRCLO   DW 0
  554. ;YEFLAGH DB 0 ;TWICE;1=depk,0=view
  555. ;FREXPT  DB 0 ;TWICE
  556. ;FILEZ   DW 0;usable.FileCount
  557. ERRORS  DW 0;ErrCount
  558. ;unknown DW 0;NU=0.ExtrFile
  559. known   DB 0 ;NOT unknown.MDCode
  560. ;SCANres DW 0 ;TWICE.SCANres=HL.AllArgsUsed
  561. ;CANTCR  DW 0;NU=0!can't create.UserReject
  562. ;PASWFLG DW 0 ;(password?).TmpPassword
  563. ;BEFEXTR DB 0 ;1=до EXTRACT.FirstFile
  564. ;GDEIX   DW 0 ;ArcPtr
  565. VOLFLG  DB 0;ArcType,2=vol
  566. SOLFLG  DB 0;SolidType(1)
  567. TSTARES DB 0;ArcFormat
  568.  
  569. volPKSZ DS 4
  570. volUNSZ DS 4
  571. pieces  DW 0 ;FileCount
  572. ;zagol   DW 0;1=загол уже напеч
  573. uNPremn DS 4;DestUnpSize
  574.  
  575.  IF crc
  576. CRCArea DS 4
  577.  ENDIF
  578. CRCA    DW 0 ;TWICE=BUF32
  579. TYPEA  DB 0;NU
  580. FLAGA   DW 0
  581. SIZEA   DW 0
  582. _62ae  DW 0;NU
  583. _62b0  DW 0;NU
  584. _62b2  DW 0;NU
  585.  
  586.  ;UnpCRC  DS 4 ;UnpFileCRC
  587. ;YCOMM   DB 0;UnpVolume.4times
  588. COMSYM  DB 0
  589.  
  590. ;        align 256
  591. ;       IFN kb
  592. ;SECBUF  DS kb*1024
  593. ;       ELSE
  594. ;SECBUF  DS 256
  595. ;       ENDIF
  596.  
  597.         ds TREES-$ ;DS -$&3
  598.         ds TREES_SZ
  599.  
  600. OUTNAM  DS namln ;DestFileName
  601. pathbuf
  602.         ds MAXPATH_sz
  603.  
  604. ;oldtimer
  605. ;        dw 0
  606.  
  607.         if retree
  608. reld
  609.         ds (298*19/2-7) ;0x0b08
  610.         endif
  611.        
  612. cmd_end
  613.  
  614.         display "Size ",/d,cmd_end-cmd_begin," bytes"
  615.  
  616.         savebin "unrar.com",cmd_begin,cmd_end-cmd_begin
  617.        
  618.         ;LABELSLIST "../us/user.l"
  619.