Subversion Repositories NedoOS

Rev

Rev 147 | 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. COLOR=7
  5.        
  6.         org PROGSTART
  7. cmd_begin
  8.         ld sp,#4000 ;эх фюыцхэ юяєёърЄ№ё  эшцх #3b00! шэрўх тючьюцэр яюЁўр OS
  9.         ld e,6 ;textmode
  10.         OS_SETGFX
  11.        
  12.         ;ld e,COLOR
  13.         ;OS_CLS
  14.  
  15.         ld hl,COMMANDLINE ;command line
  16.         call skipword
  17.         call skipspaces
  18.         ld a,(hl)
  19.         or a
  20.         jp z,noautoload
  21.         ;ld (filenameaddr),hl
  22. ;command line = "texted <file to load>"
  23.         ;ld (texted_filenameaddr),hl
  24.         ex de,hl ;de=drive/path/file
  25.         call openstream_file
  26.         or a
  27.         jp nz,openerror
  28.  
  29. readtar0
  30.         ld de,header
  31.          xor a
  32.          ld (de),a
  33.         ld hl,0x200
  34.         call readstream_file
  35.         ld hl,header
  36.         ld a,(hl)
  37.         or a
  38.         jp z,tarend
  39.         ld de,filename
  40.         call copyname83
  41.        
  42.         ld a,(header+0x09c) ;type (0=file, 5=dir)
  43.         cp '5'
  44.         jr nz,readtar_nodir
  45. ;єсшЁрхь ёых° т ъюэЎх
  46.         ld hl,filename
  47.         push hl
  48.         xor a
  49.         ld b,-1
  50.         cpir
  51.         ld a,'/'
  52.         dec hl ;эр ЄхЁьшэрЄюЁх
  53.         dec hl ;яхЁхф ЄхЁьшэрЄюЁюь
  54.         sub (hl)
  55.         jr nz,$+3
  56.         ld (hl),a ;0
  57.         pop de ;ld de,filename
  58.         OS_MKDIR
  59.         jr readtar0
  60. readtar_nodir
  61.  
  62.         ld hl,0
  63.         ld d,h
  64.         ld e,l
  65.         ld bc,header+0x07c ;size in octal (TODO size in bytes - эрщЄш яЁшьхЁ)
  66. readtar_getsize0
  67.         ld a,(bc)
  68.         inc bc
  69.         sub '0'
  70.         jr c,readtar_getsizeq
  71.         dup 3
  72.         add hl,hl
  73.         rl e
  74.         rl d
  75.         edup
  76.         adc a,l
  77.         ld l,a
  78.         ld a,h
  79.         adc a,0
  80.         ld h,a
  81.         jr nc,$+3
  82.         inc de
  83.         jr readtar_getsize0
  84. readtar_getsizeq
  85.        
  86. ;dehl=size
  87.         push de
  88.         push hl
  89.         call SAVECREATE
  90.         pop hl
  91.         pop de
  92. readfile0
  93.         ld a,d
  94.         or e
  95.         ld bc,0x4000
  96.         call z,minhl_bc_tobc
  97. ;bc=save size
  98.         ld a,b
  99.         or c
  100.         jr z,readfileq
  101.         push de
  102.         push hl
  103.         push bc
  104.          push bc ;save size
  105. ;0x200 -> 0x200
  106. ;0x201 -> 0x400
  107.         dec bc
  108.         ld a,b
  109.         add a,2
  110.         and 0xfe
  111.         ld h,a ;0..1->2, 2..3->4
  112.         ld de,0xc000
  113.         ld l,e;0
  114. ;DE = Buffer address, HL = Number of bytes to read
  115.         push de
  116.         call readstream_file
  117. ;hl=actual size
  118.         pop de
  119.          pop hl ;save size
  120.         call SAVE
  121.         pop bc
  122.         pop hl
  123.         pop de
  124.         or a
  125.         sbc hl,bc
  126.         jr nc,$+3
  127.         dec de
  128.         jr readfile0
  129. readfileq
  130.         call SAVECLOSE
  131.         jp readtar0
  132. tarend
  133.         call closestream_file
  134. noautoload
  135. openerror
  136.         QUIT
  137.  
  138. minhl_bc_tobc
  139.         or a
  140.         sbc hl,bc
  141.         add hl,bc
  142.         ret nc ;bc<=hl
  143.         ld b,h
  144.         ld c,l
  145.         ret
  146.        
  147. skipword
  148. ;hl=string
  149. ;out: hl=terminator/space addr
  150. getword0
  151.         ld a,(hl)
  152.         or a
  153.         ret z
  154.         cp ' '
  155.         ret z
  156.         inc hl
  157.         jr getword0
  158.  
  159. skipspaces
  160. ;hl=string
  161. ;out: hl=after last space
  162.         ld a,(hl)
  163.         cp ' '
  164.         ret nz
  165.         inc hl
  166.         jr skipspaces
  167.  
  168. prtext
  169. ;out: hl=after terminator
  170. prtext0
  171.         ld a,(hl)
  172.         inc hl
  173.         or a
  174.         ret z
  175.         push hl
  176.         PRCHAR
  177.         pop hl
  178.         jp prtext0
  179.  
  180. ;hl = size to write
  181. ;de = addr
  182. SAVE
  183.         ld a,(savefilehandle)
  184.         ld b,a
  185.         push iy
  186.         OS_WRITEHANDLE
  187.         pop iy
  188.         ret
  189.  
  190. SAVECREATE
  191.         push iy
  192.         ld de,filename
  193.         OS_CREATEHANDLE
  194. ;b=new file handle
  195.         ld a,b
  196.         ld (savefilehandle),a
  197.         pop iy
  198.         ret
  199.  
  200. SAVECLOSE
  201.         push iy
  202. savefilehandle=$+1
  203.         ld b,0
  204.         OS_CLOSEHANDLE
  205.         pop iy
  206.         ret
  207.  
  208.        
  209. copyname83
  210. ;hl->de
  211. copyname83_element
  212.         ld b,8
  213. copyname83_0
  214.         ld a,(hl)
  215.         inc hl
  216.         or a
  217.         jr z,copyname83_q
  218.         cp '/'
  219.         jr z,copyname83_endelement
  220.         cp '.'
  221.         jr z,copyname83_ext
  222.         ld (de),a
  223.         inc de
  224.         djnz copyname83_0
  225. ;8 chars of name copied, wait for dot or slash or terminator
  226. copyname83_skipname0
  227.         ld a,(hl)
  228.         inc hl
  229.         or a
  230.         jr z,copyname83_q
  231.         cp '/'
  232.         jr z,copyname83_endelement
  233.         cp '.'
  234.         jr nz,copyname83_skipname0
  235. copyname83_ext
  236.         ld (de),a ;'.'
  237.         inc de
  238.         ld b,3
  239. copyname83_ext0
  240.         ld a,(hl)
  241.         inc hl
  242.         or a
  243.         jr z,copyname83_q
  244.         cp '/'
  245.         jr z,copyname83_endelement
  246.         cp '.'
  247.         jr z,copyname83_skipext0
  248.         ld (de),a
  249.         inc de
  250.         djnz copyname83_ext0
  251. copyname83_skipext0
  252.         ld a,(hl)
  253.         inc hl
  254.         or a
  255.         jr z,copyname83_q
  256.         cp '/'
  257.         jr nz,copyname83_skipext0
  258. copyname83_endelement
  259.         ld (de),a ;'/'
  260.         inc de
  261.         jr copyname83_element
  262. copyname83_q
  263.         ld (de),a ;0
  264.         ret
  265.        
  266. oldtimer
  267.         dw 0
  268.        
  269. filename
  270.         db "depkfile.fil"
  271.         ds filename+256-$ ;фы  фышээ√ї шь╕э
  272.        
  273.         include "../_sdk/file.asm"
  274.        
  275. cmd_end
  276. header
  277.         ;ds 512
  278.  
  279.         display "Size ",/d,cmd_end-cmd_begin," bytes"
  280.  
  281.         savebin "tar.com",cmd_begin,cmd_end-cmd_begin
  282.        
  283.         ;LABELSLIST "../us/user.l"
  284.