Subversion Repositories NedoOS

Rev

Rev 344 | Details | Compare with Previous | Last modification | View Log

Rev Author Line No. Line
68 Alone 1
        DEVICE ZXSPECTRUM128
2
        include "../_sdk/sys_h.asm"
3
 
4
COLOR=7
5
 
177 demige 6
        macro STRPUSH
7
;hl=string addr
8
        xor a
9
        push af
10
         ld a,(hl)
11
         inc hl
12
         or a
13
         push af
14
        jr nz,$-4
15
        pop af
344 alone 16
;� �⥪� ����� \0, ⥪�� (��� �ନ����)
177 demige 17
        endm
18
 
19
        macro STRPOP
20
;hl=string addr
21
        ld d,h
22
        ld e,l
23
         pop af
24
         ld (hl),a
25
         inc hl
26
         or a
27
        jr nz,$-4
344 alone 28
        ex de,hl ;hl=string addr, de �� �����
177 demige 29
        call strmirror
30
        endm
31
 
68 Alone 32
        org PROGSTART
33
cmd_begin
344 alone 34
        ld sp,0xc000;0x4000 ;�� ������ ���᪠���� ���� 0x3b00! ���� �������� ���� OS
68 Alone 35
        ld e,6 ;textmode
36
        OS_SETGFX
37
 
38
        ;ld e,COLOR
39
        ;OS_CLS
40
 
41
        ld hl,COMMANDLINE ;command line
42
        call skipword
43
        call skipspaces
44
        ld a,(hl)
45
        or a
46
        jp z,noautoload
344 alone 47
;�஢��塞, �� *.tar ��� 䠩�/��४���? �᫨ 䠩�/��४���, � �� ���� ��������
146 alone 48
        push hl
49
        call findlastdot ;out: de = after last dot or start
50
        pop hl
51
        or a
52
        sbc hl,de
53
        add hl,de
54
        jr z,notar
55
        ld a,(de)
56
        or 0x20
57
        cp 't'
58
        jr nz,notar
59
        inc de
60
        ld a,(de)
61
        or 0x20
62
        cp 'a'
63
        jr nz,notar
64
        inc de
65
        ld a,(de)
66
        or 0x20
67
        cp 'r'
68
        jr nz,notar
69
        jp untar
70
notar
344 alone 71
;�� �� *.tar
146 alone 72
        ld de,filename
73
        call strcopy
344 alone 74
;�ନ�㥬 ��� ��娢� (��१��� ���७��, �᫨ ����, � �ਯ��뢠�� �ࠢ� .tar)
75
;���� ����� ⮫쪮 ��᫥ ᫥� (�⮡� ��娢 �� � ⥪�饩 ��४�ਨ):
146 alone 76
        ld hl,filename
177 demige 77
        call findlastslash. ;de=after last slash or start
78
        ex de,hl
146 alone 79
        ld de,tarname
80
        call strcopy
81
        dec de
82
       push de ;de=at terminator        
83
        ld hl,tarname
84
        push hl
85
        call findlastdot
86
        pop hl
87
        or a
88
        sbc hl,de
89
        add hl,de
90
        jr z,tarname_nolastdot
344 alone 91
;�஢��塞, �� �� �窠 �⭮���� � ���७��, �.�. ��᫥ ��� ��� ��襩
146 alone 92
        ld h,d
93
        ld l,e ;de=after last dot
94
tarname_checkext0
95
        ld a,(hl)
96
        inc hl
97
        cp '/'
98
        jr z,tarname_nolastdot
99
        or a
100
        jr nz,tarname_checkext0
101
        dec de ;de=at last dot
102
       pop af
103
       push de
104
tarname_nolastdot
105
       pop de ;de=at terminator or last dot        
106
        ld hl,ttar
107
        call strcopy
108
 
344 alone 109
;ᮧ��� ��娢
146 alone 110
        ld de,tarname
111
        call SAVECREATE
112
        or a
113
        jp nz,openerror
177 demige 114
 
344 alone 115
;filename=��� 䠩�� � ����
116
;����� �� ��室���� � ⮩ �� ��४�ਨ, �� ���㥬� 䠩� (� ������ ��砥 ���㥬�� ��४���), � filename 㦥 ��� ���:
177 demige 117
        ld hl,filename
118
        call findlastslash. ;out: de = after last slash or start
119
        ld hl,filename
120
        or a
121
        sbc hl,de
122
        jr z,nopathinfilename
123
        push de
124
        dec de
125
        xor a
126
        ld (de),a ;instead of slash
127
        ld hl,filename
128
        ld de,cmdprompt
129
        call strcopy
130
        ld de,cmdprompt
131
        OS_CHDIR
132
        pop hl
146 alone 133
        ld de,filename
177 demige 134
        call strcopy
135
nopathinfilename
136
        xor a
137
        ld (cmdprompt),a
344 alone 138
;filename=��� 䠩�� ��� ���, ��࠭� ��४��� 䠩��, cmdprompt ���⮩
177 demige 139
        ld hl,filename
140
        ld de,filenametoopen
141
        call strcopy
142
        call taraddfile
143
       ld hl,tallok
144
       call prtext
145
        jr tarclosearchive
146
openfileerror
147
       ld hl,terroropeningfile
148
       call prtext
149
tarclosearchive
150
        call SAVECLOSE
146 alone 151
 
177 demige 152
        jp quit
153
 
154
tallok
155
        db "All OK",0x0d,0x0a,0
156
terroropeningfile
157
        db "Error opening file",0x0d,0x0a,0
158
 
159
taraddfile  
160
        ld hl,filename
161
        call prtext
162
        call prcrlf
344 alone 163
;filenametoopen=��� 䠩��, ����� ���� ������ � ⥪�饩 ��४�ਨ
164
;filename=��� 䠩��, ���஥ ���� �������� � ��娢
165
;������ ��������� 䠩��
146 alone 166
        ld hl,tarfileheader
167
        ld bc,100*256
168
        ld (hl),c
169
        inc hl
170
        djnz $-2
171
        ld hl,filename
172
        ld de,tarfileheader
173
        ld b,100
174
tarmkfilename0
175
        ld a,(hl)
176
        or a
177
        jr z,tarmkfilenameq
178
        ld (de),a
179
        inc hl
180
        inc de
181
        djnz tarmkfilename0
182
tarmkfilenameq
177 demige 183
 
344 alone 184
;���뢠�� 䠩�
185
;�६� ����� ������ � �� ��४�ਨ, � ������ �� ��� 䠩� �����
177 demige 186
        ld de,filenametoopen
146 alone 187
        OS_GETFILETIME ;out: ix=date, hl=time
177 demige 188
        or a
189
        jp nz,openfileerror
146 alone 190
 
191
        call dos2unixtime ;out: dehl=UNIX time
192
        ld bc,tarfiletimeoctal_end
193
        ld a,11
194
        call wroctaldehl_adigits
177 demige 195
 
196
        ld de,filenametoopen
197
        call openstream_file
198
        or a
199
        ld a,(filehandle)
200
        ld b,a
201
       push bc
344 alone 202
        jp nz,tardir;openfileerror ;4=no file, 5=no path, 13=no drive, 20=it's a directory (�뫮 ⮦� 4)
146 alone 203
 
177 demige 204
        OS_GETFILESIZE ;dehl=filesize
146 alone 205
 
177 demige 206
;dehl=filesize
207
        ld a,'0'
208
        ld (tarfileordir),a
209
        call tarwrsizeheader
210
;tarwritefile
344 alone 211
;���㥬 䠩�
146 alone 212
;dehl=size
213
writefile0
214
        ld a,d
215
        or e
216
        ld bc,0x4000
217
        call z,minhl_bc_tobc
218
;bc=save size
219
        ld a,b
220
        or c
221
        jr z,writefileq
222
        push de
223
        push hl
224
        push bc
225
         ;push bc ;save size
226
;0x200 -> 0x200
227
;0x201 -> 0x400
228
        dec bc
229
        ld a,b
230
        add a,2
231
        and 0xfe
232
        ld h,a ;0..1->2, 2..3->4
233
        ld de,0xc000
234
        ld l,e;0
235
;DE = Buffer address, HL = Number of bytes to read
236
         push hl
237
        push de
238
        call readstream_file
239
;hl=actual size
240
        pop de
241
         pop hl ;save size
242
        call SAVE
243
        pop bc
244
        pop hl
245
        pop de
246
        or a
247
        sbc hl,bc
248
        jr nc,$+3
249
        dec de
250
        jr writefile0
251
writefileq
177 demige 252
        ;jr $
253
       pop bc ;b=file handle
254
        OS_CLOSEHANDLE
255
        ret
146 alone 256
 
177 demige 257
 
258
tardir
259
        ld a,'5'
260
        ld (tarfileordir),a
261
        ld hl,0
262
        ld d,h
263
        ld e,l ;size=0
264
;dehl=filesize
344 alone 265
        call tarwrsizeheader ;����ᠫ� ��४��� � ��娢
266
;�����⨬, �� �� ��室���� � ⮩ �� ��४�ਨ, �� ���㥬� 䠩� (� ������ ��砥 ���㥬�� ��४���), � filename 㦥 ��� ���, cmdprompt ���⮩
267
;४��ᨢ�� ���㥬 ᮤ�ন��� ��४�ਨ:
177 demige 268
;- strpush cmdprompt
269
        ;jr $
270
        ld hl,cmdprompt
271
        STRPUSH
272
;- cmdprompt = cmdprompt+filenametoopen
273
        ;ld de,cmdprompt ;de=pointer to 64 byte (MAXPATH_sz!) buf
274
        ;OS_GETPATH
275
        ld hl,cmdprompt
344 alone 276
;�᫨ �����⮩ � � ���� ��� ᫥�, � �������:
277
        ;ld bc,0 ;�⮡� �筮 ���� �ନ����
177 demige 278
        xor a
279
       cp (hl)
280
       jr z,tardirnoaddslash
281
        ld b,a
282
        ld c,a;0
344 alone 283
        cpir ;����� ��易⥫쭮, �᫨ �����=0, � bc=-1 � �.�.
284
        dec hl ;�� �ନ����
285
        dec hl ;��। �ନ���஬
177 demige 286
        ld a,'/'
287
        cp (hl)
288
        jr z,$+2+5
289
         inc hl
290
         ld (hl),a
291
         inc hl
292
         ld (hl),0
293
tardirnoaddslash
294
        ex de,hl
295
        ld hl,filenametoopen
344 alone 296
        call strcopy ;TODO �஢����� ��९������� ���� cmdprompt
177 demige 297
;- chdir filenametoopen
298
        ld de,filenametoopen
299
        OS_CHDIR
344 alone 300
;- �⠥� � 横�� cpmname, �� ���� �ନ�㥬 filenametoopen (dotname(cpmname)), filename (cmdprompt+dotname(cpmname)) - ���� �⭮�⥫쭮 ���� ��४�ਨ!) � ��뢠�� taraddfile
177 demige 301
;        ld de,fcb
302
;        OS_SETDTA ;set disk transfer address = de
303
;        ;call makeemptymask
304
;        ld de,fcbmask
305
;        OS_FSEARCHFIRST
306
;        or a
307
;        jr nz,tardir0q
344 alone 308
       ld bc,0 ;����� 䠩�� � ��४�ਨ
177 demige 309
tardir0
310
        ;jr $
311
        push bc
312
        call getdirfcb_bc
313
        pop bc
314
        jr nz,tardir0q
344 alone 315
       push bc ;����� 䠩�� � ��४�ਨ
177 demige 316
        ld hl,fcb_filename
317
       ld a,(hl)
318
       cp '.'
319
       jr z,tardir0skip
320
        ld de,filenametoopen
321
        call cpmname_to_dotname
322
        ld hl,cmdprompt
323
        ld de,filename
324
        call strcopy
325
        ex de,hl
326
        dec hl ;hl=terminator addr
344 alone 327
;�᫨ � ���� ��� ᫥�, � �������:
177 demige 328
        dec hl
329
        ld a,'/'
330
        cp (hl)
331
        inc hl
332
        jr z,$+4
333
         ld (hl),a;'/'
334
         inc hl
335
        ex de,hl
336
        ld hl,filenametoopen
344 alone 337
        call strcopy ;TODO �஢����� ��९������� ���� filename
177 demige 338
        call taraddfile ;filenametoopen (dotname(cpmname)), filename (cmdprompt+dotname(cpmname))
339
tardir0skip
340
       ; ld de,fcb
341
       ; OS_SETDTA ;set disk transfer address = de
344 alone 342
       ;  ;call makeemptymask ;� CP/M �� �㦭�, �� ������⢨� �।�� ���������筮��
343
       ;  ld de,fcbmask ;� CP/M �� �㦭�, �� ������⢨� �।�� ���������筮��
177 demige 344
       ; OS_FSEARCHNEXT
345
       pop bc
346
       inc bc
347
       ; or a
348
       ; jr z,tardir0
349
        jr tardir0
350
tardir0q
351
;- strpop cmdprompt
352
        ld hl,cmdprompt
353
        STRPOP
354
;- chdir ..;cmdprompt
355
        ld de,tdotdot;cmdprompt
356
        OS_CHDIR
357
       ld hl,tdirclosed
358
       call prtext
359
        jp writefileq
360
 
361
tdirclosed
362
        db "Directory closed",0x0d,0x0a,0
146 alone 363
 
177 demige 364
tdotdot
365
        db "..",0
366
 
367
getdirfcb_bc
368
;bc=file number in current dir to read to fcb
369
;nz=error
370
        push bc
371
        ld de,fcb
372
        OS_SETDTA
373
        ld de,fcbmask
374
        OS_FSEARCHFIRST ;de = pointer to unopened FCB (filename with ????????), read matching FCB to DTA
375
        pop bc
376
        or a
377
        ret nz
378
 
379
getdirfcb_bc0
380
        ld a,b
381
        or c
382
        ret z
383
        dec bc
384
        push bc
385
        ld de,fcb
386
        OS_SETDTA
387
        ld de,fcbmask
388
        OS_FSEARCHNEXT ;(NOT CP/M!!!)de = pointer to unopened FCB (filename with ????????), read matching FCB to DTA
389
        pop bc
390
        or a
391
        jr z,getdirfcb_bc0
392
        ret
393
 
394
tarwrsizeheader
395
        push de
396
        push hl
397
 
398
        ld bc,tarfilesizeoctal_end
399
        ld a,11
400
        call wroctaldehl_adigits
146 alone 401
 
177 demige 402
        call wrheaderchecksum
403
        ld de,tarfileheader
404
        ld hl,0x200
405
        call SAVE
146 alone 406
 
177 demige 407
        pop hl
408
        pop de
409
        ret
410
 
146 alone 411
MULWORD
412
;out: HLBC=DE*BC
413
        LD HL,0
414
        LD A,17
415
MULWOR0 RR B
416
        RR C
417
        DEC A
418
        RET Z
419
        JR NC,$+3
420
        ADD HL,DE
421
        RR H
422
        RR L
423
        JR MULWOR0
424
 
425
countdays_month
426
;d=year since 1970 (0 for 1970)
427
;e=month (1..12)
428
;out: a=days
429
        ld a,e
430
        cp 2
431
        jr z,countdays_feb
147 alone 432
        push de
146 alone 433
        push hl
147 alone 434
        ld d,0
146 alone 435
        ld hl,tdays_month-1
436
        add hl,de
437
        ld a,(hl)
438
        pop hl
147 alone 439
        pop de
146 alone 440
        ret
441
countdays_feb
442
        ld a,d
443
        sub 2
444
        and 3
445
        ld a,28
446
        ret nz
447
        inc a
448
        ret
449
 
450
tdays_month        
451
        db 31
452
        db 28
453
        db 31
454
        db 30
455
        db 31
456
        db 30
457
        db 31
458
        db 31
459
        db 30
460
        db 31
461
        db 30
462
        db 31
463
 
464
dos2unixtime
465
;ix=date, hl=time
466
;out: dehl=UNIX time
467
;DOS date, time to UNIX time (seconds since beginning of 1970)
147 alone 468
        ;jr $
146 alone 469
        push hl ;time
470
        ld a,lx
471
        push af
344 alone 472
        ld hl,0 ;�᫮ ����
146 alone 473
        ld a,hx
474
        srl a
475
        add a,10
476
        ld d,a ;d=year since 1970 (0 for 1970)
344 alone 477
;� 横�� �� ����� �ਡ������ �᫮ ����, ᮮ⢥�����饥 �����
146 alone 478
        ;jr z,dos2unixtime_noyear
479
        push de
480
        ld b,d
481
        ld d,0 ;year 1970
482
dos2unixtime_years0
483
        ld a,d
484
        sub 2
485
        and 3
486
        ld a,365&0xff
487
        jr nz,$+3
488
        inc a
489
        add a,l
490
        ld l,a
491
        adc a,h
492
        sub l
493
        ld h,a
494
        inc h
495
        inc d ;year 1971 etc... don't add current year
496
        djnz dos2unixtime_years0
497
        pop de
498
;dos2unixtime_noyear
344 alone 499
;� 横�� �� ����栬 �ਡ������ �᫮ ����, ᮮ⢥�����饥 ����栬
146 alone 500
        add ix,ix
501
        add ix,ix
502
        add ix,ix
503
        ld a,hx
504
        and 0x0f
505
        ld b,a ;e=month (1..12)
506
        dec b
507
        jr z,dos2unixtime_nomonth
508
        ld e,1
509
dos2unixtime_months0
510
;e=month (1..12)
511
        call countdays_month ;out: a=days
512
        add a,l
513
        ld l,a
514
        adc a,h
515
        sub l
516
        ld h,a
517
        inc e
518
        djnz dos2unixtime_months0
519
dos2unixtime_nomonth
520
        pop af
521
        and 0x1f ;day (1..31)
522
        dec a
344 alone 523
;��⮬ �ਡ����� (day-1) (�.�. ��� � ��� � �������)
146 alone 524
        add a,l
525
        ld l,a
526
        adc a,h
527
        sub l
344 alone 528
        ld h,a ;hl=�᫮ ���� � ��砫� 1970
529
;��⮬ 㬭����� �� 86400 (0x15180) / 2
146 alone 530
        ex de,hl
531
        ld bc,86400/2
532
        call MULWORD ;out: HLBC=DE*BC
533
        ld d,b
534
        ld e,c
535
        ex de,hl ;dehl = days*86400/2
536
        pop bc ;time
344 alone 537
;��⮬ �ਡ����� (3600/2*hour) + (60/2*minute) + (second/2) = 30*(60*hour + minute) + (second/2)
146 alone 538
        push de
539
        push hl ;dehl = days*86400/2
540
 
541
        ld a,b
542
        rra
543
        rra
544
        rra
545
        and 0x1f ;hour
546
        ld l,a
547
        ld h,0
548
        add hl,hl
549
        add hl,hl
550
        ld d,h
551
        ld e,l ;hour*4
552
        add hl,hl
553
        add hl,hl
554
        add hl,hl
555
        add hl,hl ;hour*64
556
        sbc hl,de ;hl = hour*60
557
 
558
        ld a,c
559
        rla
560
        rl b
561
        rla
562
        rl b
563
        rla
564
        rl b
565
        ld a,b
566
        and 0x3f ;minute
567
        add a,l
568
        ld l,a
569
        adc a,h
570
        sub l
571
        ld h,a ;hl = (60*hour + minute)
572
 
573
        add hl,hl
574
        ld d,h
575
        ld e,l ;*2
576
        add hl,hl
577
        add hl,hl
578
        add hl,hl
579
        add hl,hl ;*32
580
        sbc hl,de ;*30
581
;hl = 30*(60*hour + minute)
582
 
583
        ld a,c
584
        and 0x1f ;second/2
585
        ld c,a
586
        ld b,0
587
        add hl,bc
588
 
147 alone 589
        pop bc
590
        pop de ;debc = days*86400/2
591
 
592
        add hl,bc
593
        jr nc,$+3
594
        inc de
595
 
344 alone 596
;��⮬ 㬭����� �� 2
147 alone 597
        add hl,hl
598
        rl e
599
        rl d ;dehl=UNIX time
600
        ret
601
 
602
unix2dostime
603
;dehl=UNIX time
604
;out: ix=date, hl=time
605
;UNIX time (seconds since beginning of 1970) to DOS date, time
606
        ;jr $
344 alone 607
;�������� �� 2 (�.�. � DOS ⮫쪮 ������ ᥪ㭤�)
147 alone 608
        srl d
609
        rr e
610
        rr h
611
        rr l
344 alone 612
;�������� �� 86400/2 - � ���⪥ �६�
147 alone 613
        push de
614
        ld de,86400/2
615
        exx
146 alone 616
        pop hl
147 alone 617
        ld de,0
618
        exx
619
        call ldiv ; hl'hl = hl'hl / de'de ; de'de = hl'hl % de'de
344 alone 620
;hl=���
621
        push de ;de=������ ᥪ㭤�
146 alone 622
 
344 alone 623
;� 横�� �� ����� ������ �᫮ ����, ᮮ⢥�����饥 �����
177 demige 624
        ld d,-1 ;year 1970-1
147 alone 625
unix2dostime_years0
177 demige 626
        inc d ;d=0 = year 1970 etc
147 alone 627
        ld a,d
628
        sub 2
629
        and 3
177 demige 630
        ld bc,365
147 alone 631
        jr nz,$+3
177 demige 632
        inc bc
633
        or a
634
        sbc hl,bc
635
        jr nc,unix2dostime_years0
636
        add hl,bc
637
;d=year
638
;hl=days
639
 
344 alone 640
;� 横�� �� ����栬 ������ �᫮ ����, ᮮ⢥�����饥 ����栬
177 demige 641
        ld e,0
147 alone 642
unix2dostime_months0
177 demige 643
        inc e ;e=month (1..12)
147 alone 644
        call countdays_month ;out: a=days
177 demige 645
        ld c,a
646
        ld b,0
647
        or a
648
        sbc hl,bc
649
        jr nc,unix2dostime_months0
650
        add hl,bc
651
;d=year since 1970
652
;e=month=1..12
653
;hl=days
654
        ld a,d
655
        sub 10
656
        jr nc,$+3
657
        xor a ;year < 1980
658
        ld d,a
659
        inc l ;day (1..31)
660
        ld a,e ;month
661
        add a,a
662
        add a,a
663
        add a,a
664
        add a,a
665
        add a,a
666
        rl d
667
        ld hx,d
668
        or l
669
        ld lx,a
670
;ix = DOS date: %YYYYYYYM MMMDDDDD
671
 
344 alone 672
        pop hl ;hl=������ ᥪ㭤�
147 alone 673
 
344 alone 674
;� 横�� �� �ᠬ ������ �᫮ 3600/2
177 demige 675
        ld bc,3600/2
676
        xor a ;NC
677
unix2dostime_hours0
678
        inc a
679
        sbc hl,bc
680
        jr nc,unix2dostime_hours0
681
        add hl,bc
682
        dec a ;a=hours = 0..23
683
        add a,a
684
        add a,a
685
        add a,a
686
        ld d,a ;d=hours<<3
687
 
344 alone 688
;� 横�� �� ����⠬ ������ �᫮ 60/2
177 demige 689
        ld bc,60/2
690
        xor a ;NC
691
unix2dostime_minutes0
692
        inc a
693
        sbc hl,bc
694
        jr nc,unix2dostime_minutes0
695
        add hl,bc ;l=seconds/2
696
        dec a ;a=minutes = 0..59
697
        ld e,a
698
        xor a
699
        rr e
147 alone 700
        rra
177 demige 701
        rr e
147 alone 702
        rra
177 demige 703
        rr e
147 alone 704
        rra
177 demige 705
        or l
147 alone 706
        ld l,a
177 demige 707
        ld a,d ;d=hours<<3
708
        or e
709
        ld h,a
710
;hl = DOS time: %hhhhhmmm mmmsssss
711
        ret
712
 
344 alone 713
; ����� �� 2006-12-18T15:11:28+0300
714
; ����������� 32-ࠧ�來�� �������
715
; �㭪�� ��⮨� �� ���� ��⥩:
716
; 1. 32-ࠧ�來�� ������� � 16-ࠧ�來�
717
;    ����⥫�.
718
; 2. 32-ࠧ�來�� ������� � 32-ࠧ�來�
719
;    ����⥫�.
177 demige 720
; hl'hl = hl'hl / de'de
721
; de'de = hl'hl % de'de
722
ldiv
723
        push hl
724
        xor a
725
        ld l, a
726
        ld h, a
727
        sub e
728
        ld e, a
729
 ld a, h
730
        sbc a, d
731
        ld d, a
732
        exx
733
        pop bc
734
        ld a, 0
735
        sbc a, e
736
        ld e, a
737
        sbc a, d  ; de'de=0-divisor
738
        sub e
739
        ld d, a
740
        and e
741
        inc a     ; Z=short divisor
742
        push hl
743
        ld hl, 0  ; hl'hl=reminder
744
        exx
745
        pop bc
746
        ld a, b   ; a,c,bc'=divident
747
 
748
        jr nz, ldiv_long
749
 
750
 
751
    ; divisor = -00de
752
        ld b, 8
753
        rla
754
ldivs0
755
        rl l
756
        add hl, de
757
        jr c, ldivs1
758
        sbc hl, de
759
ldivs1  rla
760
        djnz ldivs0
761
 
762
           ld b, c
763
           ld c, a
764
           ld a, b
765
           ld b, 8
147 alone 766
        rla
177 demige 767
ldivs2
768
        adc hl, hl
769
        add hl, de
770
        jr c, ldivs3
771
        sbc hl, de
772
ldivs3  rla
773
        djnz ldivs2
774
        jr ldiv_long1
147 alone 775
 
776
 
177 demige 777
   ; divisor=-de'de
778
ldiv_long
779
        call ldiv_8
780
           ld b, c
781
           ld c, a
782
           ld a, b
783
        call ldiv_8
784
ldiv_long1
785
           exx
786
           exa
787
           ld a, b
788
           exa
789
           ld b, a
790
           exa
791
           exx
792
        call ldiv_8
793
           exx
794
           exa
795
           ld a, c
796
           exa
797
           ld c, a
798
           exa
799
           exx
800
        call ldiv_8
147 alone 801
 
177 demige 802
  ; result=c,bc',a -> hl'hl 
803
  ; reminder=hl'hl -> de'de 
146 alone 804
 
177 demige 805
        ex de, hl
806
        ld l, a
807
        ld a, c
808
        exx
809
        ex de, hl
810
        ld h, a
811
        ld l, b
812
        ld a, c
813
        exx
814
        ld h, a
815
        ret
816
 
817
 
818
; hl'hl=reminder
819
; de'de=divisor
820
; a=divident
821
ldiv_8
822
        ld b, 8
823
        rla
824
ldiv_8_0
825
        adc hl, hl
826
        exx
827
        adc hl, hl
828
        exx
829
        add hl, de
830
        exx
831
        adc hl, de
832
        exx
833
        jr c, ldiv_8_1
834
        sbc hl, de
835
        exx
836
        sbc hl, de
837
        exx
838
ldiv_8_1
839
        rla
840
        djnz ldiv_8_0
841
        ret
147 alone 842
 
843
 
146 alone 844
untar
68 Alone 845
        ;ld (filenameaddr),hl
846
;command line = "texted <file to load>"
847
        ;ld (texted_filenameaddr),hl
848
        ex de,hl ;de=drive/path/file
849
        call openstream_file
850
        or a
851
        jp nz,openerror
852
 
853
readtar0
854
        ld de,header
855
         xor a
856
         ld (de),a
857
        ld hl,0x200
858
        call readstream_file
859
        ld hl,header
860
        ld a,(hl)
861
        or a
177 demige 862
        jp z,untarend
146 alone 863
         xor a
344 alone 864
         ld (header+100),a ;�� ��直� ��砩, �᫨ ����� ����� = 100
68 Alone 865
        ld de,filename
2119 kulich 866
        call copyname328
68 Alone 867
 
868
        ld a,(header+0x09c) ;type (0=file, 5=dir)
869
        cp '5'
870
        jr nz,readtar_nodir
344 alone 871
;㡨ࠥ� ᫥� � ����
68 Alone 872
        ld hl,filename
873
        push hl
874
        xor a
875
        ld b,-1
876
        cpir
877
        ld a,'/'
344 alone 878
        dec hl ;�� �ନ����
879
        dec hl ;��। �ନ���஬
68 Alone 880
        sub (hl)
881
        jr nz,$+3
882
        ld (hl),a ;0
883
        pop de ;ld de,filename
884
        OS_MKDIR
885
        jr readtar0
886
readtar_nodir
887
 
344 alone 888
        ld bc,header+0x07c ;size in octal (TODO size in bytes - ���� �ਬ��)
177 demige 889
        call readoctal_dehl
68 Alone 890
 
891
;dehl=size
892
        push de
893
        push hl
146 alone 894
        ld de,filename
68 Alone 895
        call SAVECREATE
896
        pop hl
897
        pop de
898
readfile0
899
        ld a,d
900
        or e
901
        ld bc,0x4000
902
        call z,minhl_bc_tobc
903
;bc=save size
904
        ld a,b
905
        or c
906
        jr z,readfileq
907
        push de
908
        push hl
909
        push bc
910
         push bc ;save size
911
;0x200 -> 0x200
912
;0x201 -> 0x400
913
        dec bc
914
        ld a,b
915
        add a,2
916
        and 0xfe
917
        ld h,a ;0..1->2, 2..3->4
918
        ld de,0xc000
919
        ld l,e;0
920
;DE = Buffer address, HL = Number of bytes to read
921
        push de
922
        call readstream_file
923
;hl=actual size
924
        pop de
925
         pop hl ;save size
926
        call SAVE
927
        pop bc
928
        pop hl
929
        pop de
930
        or a
931
        sbc hl,bc
932
        jr nc,$+3
933
        dec de
934
        jr readfile0
935
readfileq
936
        call SAVECLOSE
177 demige 937
 
938
        ld bc,header+0x088 ;time in octal
939
        call readoctal_dehl
940
        call unix2dostime
941
        ld de,filename
942
        OS_SETFILETIME
943
 
68 Alone 944
        jp readtar0
177 demige 945
untarend
68 Alone 946
        call closestream_file
947
noautoload
948
openerror
146 alone 949
quit
68 Alone 950
        QUIT
951
 
177 demige 952
readoctal_dehl
953
        ld hl,0
954
        ld d,h
955
        ld e,l
956
readtar_getsize0
957
        ld a,(bc)
958
        inc bc
959
        sub '0'
960
        ret c ;jr c,readtar_getsizeq
961
        add hl,hl
962
        rl e
963
        rl d
964
        add hl,hl
965
        rl e
966
        rl d
967
        add hl,hl
968
        rl e
969
        rl d
970
        adc a,l
971
        ld l,a
972
        ld a,h
973
        adc a,0
974
        ld h,a
975
        jr nc,$+3
976
        inc de
977
        jr readtar_getsize0
978
;readtar_getsizeq
979
        ret
980
 
68 Alone 981
minhl_bc_tobc
982
        or a
983
        sbc hl,bc
984
        add hl,bc
985
        ret nc ;bc<=hl
986
        ld b,h
987
        ld c,l
988
        ret
989
 
990
skipword
991
;hl=string
992
;out: hl=terminator/space addr
993
getword0
994
        ld a,(hl)
995
        or a
996
        ret z
997
        cp ' '
998
        ret z
999
        inc hl
1000
        jr getword0
1001
 
1002
skipspaces
1003
;hl=string
1004
;out: hl=after last space
1005
        ld a,(hl)
1006
        cp ' '
1007
        ret nz
1008
        inc hl
1009
        jr skipspaces
1010
 
1011
prtext
1012
;out: hl=after terminator
1013
prtext0
1014
        ld a,(hl)
1015
        inc hl
1016
        or a
1017
        ret z
1018
        push hl
1019
        PRCHAR
1020
        pop hl
1021
        jp prtext0
1022
 
177 demige 1023
prcrlf
1024
        ld a,0x0d
1025
        PRCHAR
1026
        ld a,0x0a
1027
        PRCHAR
1028
        ret
1029
 
68 Alone 1030
;hl = size to write
1031
;de = addr
146 alone 1032
SAVE
68 Alone 1033
        ld a,(savefilehandle)
1034
        ld b,a
1035
        push iy
1036
        OS_WRITEHANDLE
1037
        pop iy
1038
        ret
1039
 
1040
SAVECREATE
1041
        push iy
1042
        OS_CREATEHANDLE
1043
;b=new file handle
177 demige 1044
        push af
68 Alone 1045
        ld a,b
1046
        ld (savefilehandle),a
177 demige 1047
        pop af
68 Alone 1048
        pop iy
1049
        ret
1050
 
1051
SAVECLOSE
1052
        push iy
1053
savefilehandle=$+1
1054
        ld b,0
1055
        OS_CLOSEHANDLE
1056
        pop iy
1057
        ret
1058
 
146 alone 1059
;hl = poi to filename in string
1060
;out: de = after last dot or start
1061
findlastdot
1062
        ld d,h
1063
        ld e,l ;de = after last dot
1064
findlastdot0
1065
        ld a,[hl]
1066
        inc hl
1067
        or a
1068
        ret z
1069
        cp '.'
1070
        jr nz,findlastdot0
1071
        jr findlastdot
1072
 
177 demige 1073
;hl = poi to filename in string
1074
;out: de = after last slash or start
1075
findlastslash.
1076
nfopenfnslash.
1077
        ld d,h
1078
        ld e,l ;de = after last slash or start
1079
nfopenfnslash0.
1080
        ld a,[hl]
1081
        inc hl
1082
        or a
1083
        ret z
1084
        cp '/'
1085
        jr nz,nfopenfnslash0.
1086
        jr nfopenfnslash.
1087
 
2119 kulich 1088
copyname328
68 Alone 1089
;hl->de
2119 kulich 1090
copyname328_element
1091
        ld b,32
1092
copyname328_0
68 Alone 1093
        ld a,(hl)
1094
        inc hl
1095
        or a
2119 kulich 1096
        jr z,copyname328_q
68 Alone 1097
        cp '/'
2119 kulich 1098
        jr z,copyname328_endelement
68 Alone 1099
        cp '.'
2119 kulich 1100
        jr z,copyname328_ext
68 Alone 1101
        ld (de),a
1102
        inc de
2119 kulich 1103
        djnz copyname328_0
68 Alone 1104
;8 chars of name copied, wait for dot or slash or terminator
2119 kulich 1105
copyname328_skipname0
68 Alone 1106
        ld a,(hl)
1107
        inc hl
1108
        or a
2119 kulich 1109
        jr z,copyname328_q
68 Alone 1110
        cp '/'
2119 kulich 1111
        jr z,copyname328_endelement
68 Alone 1112
        cp '.'
2119 kulich 1113
        jr nz,copyname328_skipname0
1114
copyname328_ext
68 Alone 1115
        ld (de),a ;'.'
1116
        inc de
2119 kulich 1117
        ld b,8
1118
copyname328_ext0
68 Alone 1119
        ld a,(hl)
1120
        inc hl
1121
        or a
2119 kulich 1122
        jr z,copyname328_q
68 Alone 1123
        cp '/'
2119 kulich 1124
        jr z,copyname328_endelement
68 Alone 1125
        cp '.'
2119 kulich 1126
        jr z,copyname328_skipext0
68 Alone 1127
        ld (de),a
1128
        inc de
2119 kulich 1129
        djnz copyname328_ext0
1130
copyname328_skipext0
68 Alone 1131
        ld a,(hl)
1132
        inc hl
1133
        or a
2119 kulich 1134
        jr z,copyname328_q
68 Alone 1135
        cp '/'
2119 kulich 1136
        jr nz,copyname328_skipext0
1137
copyname328_endelement
68 Alone 1138
        ld (de),a ;'/'
1139
        inc de
2119 kulich 1140
        jr copyname328_element
1141
copyname328_q
68 Alone 1142
        ld (de),a ;0
1143
        ret
1144
 
146 alone 1145
strcopy
1146
;hl->de
1147
;out: hl,de after terminator
1148
strcopy0
1149
        ld a,(hl)
1150
        ldi
1151
        or a
1152
        jr nz,strcopy0
1153
        ret
1154
 
260 alone 1155
;oldtimer
1156
;        dw 0
146 alone 1157
 
1158
ttar
1159
        db ".tar",0
1160
 
1161
wrheaderchecksum
1162
        ld hl,tarfileheaderchecksumoctal
1163
        ld bc,0x820
1164
        ld (hl),c
1165
        inc hl
1166
        djnz $-2 ;fill with spaces
1167
        ld hl,tarfileheader
1168
        ld de,0
1169
        ld bc,0x200
1170
countheaderchecksum0
1171
        ld a,(hl)
1172
        add a,e
1173
        ld e,a
1174
        adc a,d
1175
        sub e
1176
        ld d,a
1177
        cpi
1178
        jp pe,countheaderchecksum0
1179
;de=checksum
1180
        ex de,hl
1181
        ld de,0 ;dehl=checksum
1182
        ld bc,tarfileheaderchecksumoctal_end
1183
        xor a
1184
        ld (bc),a
1185
        dec bc
1186
        ld a,' '
1187
        ld (bc),a
1188
        ld a,6
1189
        jp wroctaldehl_adigits
68 Alone 1190
 
146 alone 1191
wroctaldehl_adigits
1192
;bc=text end (after last digit)
1193
;a=number of digits
1194
wroctaldehl_adigits0
1195
        push af
1196
        call wroctaldehl_dig
1197
        pop af
1198
        dec a
1199
        jr nz,wroctaldehl_adigits0
1200
        ret
1201
 
1202
wroctaldehl_dig
1203
;bc=text end (after last digit)
1204
        srl d
1205
        rr e
1206
        rr h
1207
        rr l
1208
        rra
177 demige 1209
        srl d
1210
        rr e
1211
        rr h
1212
        rr l
1213
        rra
1214
        srl d
1215
        rr e
1216
        rr h
1217
        rr l
1218
        rra
146 alone 1219
        rlca
1220
        rlca
1221
        rlca
1222
        and 7
1223
        add a,'0'
1224
        dec bc
1225
        ld (bc),a
1226
        ret
1227
 
177 demige 1228
strmirror
1229
;hl=string addr
1230
        ld d,h
1231
        ld e,l
1232
        call strlen
1233
        ld b,h
1234
        ld c,l
1235
         ld a,b
1236
         or c
1237
         ret z
344 alone 1238
;de=��砫�, bc=hl=�����
177 demige 1239
        ;ld h,b
1240
        ;ld l,c
344 alone 1241
        add hl,de ;hl=�����+1
177 demige 1242
        srl b
1243
        rr c ;bc=wid/2
1244
mirrorbytes0
1245
        dec hl
1246
        ld a,(de)
1247
        ldi
1248
        dec hl
1249
        ld (hl),a
1250
        jp pe,mirrorbytes0
1251
        ret
146 alone 1252
 
177 demige 1253
cpmname_to_dotname
1254
;hl -> de
1255
        push hl
1256
        ld b,8
1257
cpmname_to_dotname0
1258
        ld a,(hl)
1259
        cp ' '
1260
        jr z,cpmname_to_dotname0q
1261
        ld (de),a
1262
        inc hl
1263
        inc de
1264
        djnz cpmname_to_dotname0
1265
cpmname_to_dotname0q
1266
        pop hl
1267
        ld bc,8
1268
        add hl,bc ;hl=pointer to ext
1269
        ld a,(hl)
1270
        cp ' '
1271
        jr z,cpmname_to_dotnameq
1272
        ld a,'.'
1273
        ld (de),a
1274
        inc de
1275
        ld  c,3
1276
        ldir
1277
cpmname_to_dotnameq
1278
        xor a
1279
        ld (de),a
1280
        ret
1281
 
1282
strlen
1283
;hl=str
1284
;out: hl=length
344 alone 1285
        ld bc,0 ;�⮡� �筮 ���� �ନ����
177 demige 1286
        xor a
344 alone 1287
        cpir ;����� ��易⥫쭮, �᫨ �����=0, � bc=-1 � �.�.
177 demige 1288
        ld hl,-1
1289
        or a
1290
        sbc hl,bc
1291
        ret
1292
 
146 alone 1293
tarfileheader
1294
        ds 100 ;filename
1295
        db "0000777",0
1296
        db "0000000",0
1297
        db "0000000",0
1298
;tarfilesizeoctal=$
344 alone 1299
        db "00000000000",0 ;11 ��� = 33 ���
146 alone 1300
tarfilesizeoctal_end=$-1
1301
;tarfiletimeoctal=$
344 alone 1302
        db "00000000000",0 ;11 ��� = 33 ���
146 alone 1303
tarfiletimeoctal_end=$-1
1304
tarfileheaderchecksumoctal=$
1305
        db "007147 ",0
1306
tarfileheaderchecksumoctal_end=$-1
1307
tarfileordir=$
1308
        db "0" ;0=file, 5=dir
1309
        ds tarfileheader+0x101-$
1310
        db "ustar"
1311
        ds tarfileheader+0x200-$
177 demige 1312
 
344 alone 1313
        db 0 ;��� ���࠭��, �᫨ ��� ���
68 Alone 1314
filename
1315
        db "depkfile.fil"
344 alone 1316
        ds filename+256-$ ;��� ������� ���
177 demige 1317
 
1318
filenametoopen
1319
        ds 256
68 Alone 1320
 
177 demige 1321
fcb
1322
        ds FCB_sz
1323
fcb_filename=fcb+FCB_FNAME        
1324
 
1325
fcbmask
1326
        db 0
1327
        db "???????????"
1328
        ds FCB_sz-11-1
1329
fcbmask_filename=fcbmask+FCB_FNAME
1330
 
1331
cmdprompt
1332
        ds 256
1333
 
146 alone 1334
tarname
1335
        ds 256
1336
 
68 Alone 1337
        include "../_sdk/file.asm"
1338
 
1339
cmd_end
1340
header
1341
        ;ds 512
1342
 
1343
        display "Size ",/d,cmd_end-cmd_begin," bytes"
1344
 
1345
        savebin "tar.com",cmd_begin,cmd_end-cmd_begin
1346
 
1347
        ;LABELSLIST "../us/user.l"