Subversion Repositories NedoOS

Rev

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

  1. ;TODO т срЄэшъх %0 (ярЁрьхЄЁ√ чряєёър), %1 ...
  2. ;TODO %~dp0 (фЁрщт ш яєЄ№ чряєёър)
  3. ;TODO %~t1 (фрЄр-тЁхь  1-ую ярЁрьхЄЁр)
  4. ;TODO goto ш ьхЄъш :label
  5. ;TODO if ???==??? goto
  6. ;TODO for
  7. ;TODO PATH (уфх їЁрэшЄ№? фюыцэр яюфуЁєцрЄ№ё  яЁш ёЄрЁЄх эютющ ъюяшш cmd)
  8.  
  9.         DEVICE ZXSPECTRUM128
  10.         include "../_sdk/sys_h.asm"
  11. MAXCMDSZ=COMMANDLINE_sz-1;127 ;эх ёўшЄр  ЄхЁьшэрЄюЁр
  12. txtscrhgt=25
  13. txtscrwid=80
  14. CMDLINEY=24
  15.  
  16. COLOR=7
  17. CURSORCOLOR=#38
  18.  
  19.         org PROGSTART
  20. cmd_begin
  21.         ld sp,#4000 ;эх фюыцхэ юяєёърЄ№ё  эшцх #3b00! шэрўх тючьюцэр яюЁўр OS
  22.         ld e,6 ;textmode
  23.         OS_SETGFX
  24.         ;ld e,COLOR
  25.         ;OS_CLS
  26.        
  27.         OS_GETMAINPAGES
  28. ;dehl=эюьхЁр ёЄЁрэшЎ т 0000,4000,8000,c000
  29.         push hl
  30.         OS_DELPAGE
  31.         pop hl
  32.         push hl
  33.         ld e,h
  34.         OS_DELPAGE
  35.         pop hl
  36.         ld e,l
  37.         OS_DELPAGE
  38.        
  39.         ld hl,COMMANDLINE ;command line
  40.         ld de,wordbuf
  41.         call getword
  42.         call skipspaces
  43.          ;jr cmd_interactive
  44.         ld a,(hl)
  45.         or a
  46.         jr z,cmd_interactive
  47. ;command line = "cmd <command to run>"
  48.         ld de,cmdbuf
  49.         call strcopy
  50.        
  51.         ;ld hl,cmdbuf
  52.         ;call prtext
  53.         ;call prcrlf
  54.         call makeprompt ;шэрўх чряєёЄшЄё  шч эхяЁртшы№эющ фшЁхъЄюЁшш
  55.          ;jr cmd_interactive
  56.        
  57.         call execcmd ;can show errors ;a!=0: no such internal command
  58.         or a
  59.         call nz,strcpexec_tryrun ;чряєёърхЄ яю Їюэє
  60.         YIELD ;ўЄюс√ чряє∙хээр  чрфрўр єёяхыр чрїтрЄшЄ№ Їюъєё ;???
  61. ;хёыш ъюьрэфэр  ёЄЁюър с√ыр ёю ёыютюь autoexec.bat тьхёЄю ёыютр cmd, Єю ¤Єю эрўры№э√щ чряєёъ autoexec.bat, шч эхую эрфю тїюфшЄ№ т шэЄхЁръЄштэ√щ Ёхцшь
  62.         ld a,(COMMANDLINE)
  63.         cp 'a'
  64.         jr z,cmd_interactive
  65.         ;jr $
  66.         QUIT
  67.        
  68. cmd_interactive
  69.        
  70.         ;OS_GETMAINPAGES
  71. ;dehl=эюьхЁр ёЄЁрэшЎ т 0000,4000,8000,c000
  72.         ;ld a,e
  73.         ;ld (curpgshapes),a
  74.         ;ld a,h
  75.         ;ld (curpgpal),a
  76.         ;ld a,l
  77.         ;ld (curpgtemp),a
  78. ;TODO free pages
  79.        
  80.         ;ld a,4;TR-DOS ;0=SD card (Z-controller)
  81.         ;call cmdsetdrive
  82.        
  83. cmdmainloop
  84.         call makeprompt
  85.         call editcmd
  86.         call prcrlf
  87.        
  88.         ld hl,cmdbuf
  89.         ld de,oldcmd
  90.         ld bc,MAXCMDSZ+1
  91.         ldir
  92.        
  93.         call execcmd ;a!=0: no such internal command
  94.         or a
  95.         call nz,strcpexec_tryrun
  96.         ld hl,cmdbuf
  97.         ld (hl),0
  98.         jp cmdmainloop
  99.  
  100. ;;;;;;;;;;;;;;;;;;
  101. prNNcmd
  102. ;a=NN
  103.         ld c,10
  104.         call prNcmd
  105.         add a,'0'
  106.         PRCHAR
  107.         ret
  108. prNcmd
  109. ;a=NN
  110. ;c=divisor
  111.         ld b,'0'-1
  112.         sub c
  113.         inc b
  114.         jr nc,$-2
  115.         add a,c
  116.         push af
  117.         ld a,b
  118.         PRCHAR
  119.         pop af
  120.         ret
  121.        
  122. editcmd_up
  123.         ld de,cmdbuf
  124.         ld hl,oldcmd
  125.         ld bc,MAXCMDSZ+1
  126.         ldir
  127.         ;jp editcmd
  128.  
  129. editcmd
  130.         ld hl,cmdbuf
  131.         call strlen
  132.         ld a,l
  133.         ld (curcmdx),a
  134. editcmd0
  135.         call fixscroll_prcmd
  136.         call cmdcalccurxy
  137.         OS_SETXY
  138.         ld e,CURSORCOLOR;#38
  139.         OS_PRATTR ;эрЁшёютрЄ№ ъєЁёюЁ
  140.         YIELDGETKEYLOOP
  141.          ;ld a,c ;keynolang
  142.         push af
  143.         call cmdcalccurxy
  144.         OS_SETXY
  145.         ld e,COLOR;7
  146.         OS_PRATTR ;ёЄхЁхЄ№ ъєЁёюЁ
  147.         pop af
  148.         cp key_enter
  149.         ret z
  150.         cp key_up
  151.         jr z,editcmd_up
  152.          ld hl,editcmd0
  153.          push hl
  154.         ;ld hl,cmdbuf
  155.         cp key_backspace
  156.         jr z,editcmd_backspace
  157.         cp key_left
  158.         jr z,editcmd_left
  159.         cp key_right
  160.         jr z,editcmd_right
  161.         cp 0x20
  162.         ret c ;jr c,editcmdok ;яЁюўшх ёшёЄхьэ√х ъэюяъш эх эєцэ√
  163. ;type in
  164. editcmdtypein
  165.         ld e,a
  166.         ld hl,cmdbuf
  167.         call strlen ;hl=length
  168.         ld bc,MAXCMDSZ
  169.         or a
  170.         sbc hl,bc
  171.         ret nc ;jr nc,editcmdok ;эхъєфр ттюфшЄ№
  172.         call cmdcalctextaddr ;hl=addr, a=curcmdx
  173.         inc a
  174.         ld (curcmdx),a
  175.         jp strinsch ;e=ch
  176. ;editcmdok
  177.         ;ret ;jp editcmd0
  178.        
  179. editcmd_backspace
  180.         call cmdcalctextaddr ;hl=addr, a=curcmdx
  181.         or a
  182.         ret z ;jr z,editcmdok ;эхўхую єфры Є№
  183.         dec a
  184.         ld (curcmdx),a
  185.         jp strdelch ;єфры хЄ яЁхф√фє∙шщ ёшьтюы
  186.         ;jr editcmdok
  187.      
  188. editcmd_left
  189.         ld a,(curcmdx)
  190.         or a
  191.         ret z ;jr z,editcmdok ;эхъєфр тыхтю
  192.         dec a
  193.         ld (curcmdx),a
  194.         ret ;jr editcmdok
  195.      
  196. editcmd_right
  197.         call cmdcalctextaddr ;hl=addr, a=curcmdx
  198.         inc (hl)
  199.         dec (hl)
  200.         ret z ;jr z,editcmdok ;эхъєфр яЁртю, ёЄюшь эр ЄхЁьшэрЄюЁх
  201.         inc a
  202.         ld (curcmdx),a
  203.         ret ;jr editcmdok
  204.  
  205. prtext
  206. prtext0
  207.         ld a,(hl)
  208.         or a
  209.         ret z
  210.         push hl
  211.         PRCHAR ;testing (351/352t) (was 986/987t)
  212.         pop hl
  213.         inc hl
  214.         jp prtext0
  215.  
  216. cmdprNchars
  217.         push bc
  218.         ld a,(hl)
  219.         inc hl
  220.         push hl
  221.         PRCHAR
  222.         pop hl
  223.         pop bc
  224.         djnz cmdprNchars
  225.         ret
  226.        
  227. getword
  228. ;hl=string
  229. ;de=wordbuf
  230. ;out: hl=terminator/space addr
  231. getword0
  232.         ld a,(hl)
  233.         or a
  234.         jr z,getwordq
  235.         sub ' '
  236.         jr z,getwordq
  237.         ldi
  238.         jp getword0
  239. getwordq
  240.         ;xor a
  241.         ld (de),a
  242.         ret
  243.  
  244. execcmd
  245. ;a=0: command executed
  246. ;a!=0: no such internal command
  247.         ld hl,cmdbuf
  248.         ld a,(hl)
  249.         or a
  250.         ret z
  251.                 display $
  252.         ld de,wordbuf
  253.         call getword ;hl=terminator/space addr
  254.         call skipspaces
  255.         ld (execcmd_pars),hl
  256.                 inc hl
  257.                 ld a,(wordbuf+1)
  258.                 cp ':'
  259.                 jp z,cmd_t0
  260.         ld hl,commandslist ;list of internal commands
  261. strcpexec0
  262.         ld c,(hl)
  263.         inc hl
  264.         ld b,(hl)
  265.         inc hl
  266.         ld a,b
  267.         cp -1
  268.         ret z ;jr z,strcpexec_tryrun ;a!=0: no such internal command
  269.         ld de,wordbuf
  270.         push hl
  271.         call strcp
  272.         pop hl
  273.         jr nz,strcpexec_fail
  274.         ld h,b
  275.         ld l,c
  276.         call jphl ;execute command
  277.         xor a
  278.         ret ;a=0: command executed
  279. jphl
  280.         jp (hl) ;run internal command
  281. strcpexec_fail
  282.         ld b,-1 ;ўЄюс√ Єюўэю эрщЄш ЄхЁьшэрЄюЁ
  283.         xor a
  284.         cpir ;эрщф╕ь юс чрЄхы№эю
  285.         jr strcpexec0
  286.  
  287. cmd_start
  288.         ld hl,cmdbuf
  289.         ld a,(hl)
  290.         or a
  291.         ret z
  292.         ld de,wordbuf
  293.         call getword ;hl=terminator/space addr
  294.         call skipspaces
  295.         ld de,cmdbuf
  296.         ld bc,MAXCMDSZ+1
  297.         ldir
  298. strcpexec_tryrun
  299. ;т√яюыэшЄ№ Їрщы ё шьхэхь cmdbuf ш ярЁрьхЄЁрьш Єрь
  300.         call loadapp ;чруЁєчшЄ№ Їрщы ё шьхэхь cmdbuf, e=id, cy=end of .bat
  301.         jr nz,execcmd_tryrunerror
  302. execcmd_tryrunok
  303.         ret c ;cy=end of .bat
  304.         OS_RUNAPP
  305.         ret
  306.  
  307. execcmd_tryrunerror
  308. ;т√яюыэшЄ№ Їрщы ё шьхэхь SYSDIR/cmdbuf ш ярЁрьхЄЁрьш Єрь
  309.         ;call loadapp_keeppath
  310.         OS_SETSYSDRV
  311.         ld de,sysdir
  312.         push de
  313.         OS_GETPATH
  314.         ;call loadapp_setoldpath ;TODO шч prompt
  315.         ;ld de,cmdprompt
  316.         ;OS_CHDIR
  317.         ;call makeprompt
  318.         ;ld de,cmdprompt
  319.         ;jr $
  320.         ;OS_CHDIR
  321.         pop hl
  322.         push hl
  323. ;хёыш т ъюэЎх эхЄ ёых°р, Єю фюсртшь:
  324.         ;ld bc,0 ;ўЄюс√ Єюўэю эрщЄш ЄхЁьшэрЄюЁ
  325.         xor a
  326.         ld b,a
  327.         ld c,a;0
  328.         cpir ;эрщф╕ь юс чрЄхы№эю, хёыш фышэр=0, Єю bc=-1 ш Є.ф.
  329.         dec hl ;эр ЄхЁьшэрЄюЁх
  330.         dec hl ;яхЁхф ЄхЁьшэрЄюЁюь
  331.         ld a,'/'
  332.         cp (hl)
  333.         jr z,$+2+5
  334.          inc hl
  335.          ld (hl),a
  336.          inc hl
  337.          ld (hl),0
  338.         pop hl ;sysdir
  339.         call strlen
  340.         ld b,h
  341.         ld c,l ;bc=SYSDIR_size
  342.          push bc ;SYSDIR_size
  343.         ld hl,MAXCMDSZ+1
  344.         or a
  345.         sbc hl,bc
  346.         push hl ;MAXCMDSZ+1-SYSDIR_size
  347. ;bc=SYSDIR_size
  348.         ld hl,cmdbuf+MAXCMDSZ;+1
  349.         or a
  350.         sbc hl,bc
  351.         ld de,cmdbuf+MAXCMDSZ;+1
  352.         pop bc ;MAXCMDSZ+1-SYSDIR_size
  353.         lddr
  354.         ld hl,sysdir
  355.         ld de,cmdbuf
  356.          pop bc ;SYSDIR_size
  357.         ldir ;эхы№ч  strcopy, Є.ъ. эх эєцхэ ЄхЁьшэрЄюЁ
  358.         call loadapp ;чруЁєчшЄ№ Їрщы ё шьхэхь cmdbuf, e=id, cy=end of .bat
  359.         jr z,execcmd_tryrunok
  360. execcmd_error
  361.         ld hl,tunknowncommand
  362.         jp cmderror
  363.        
  364. callcmd
  365. ;call command (cmdbuf) with waiting
  366.         call execcmd ;a!=0: no such internal command
  367.         or a
  368.         ret z ;command executed
  369.         call loadapp ;чруЁєчшЄ№ Їрщы ё шьхэхь cmdbuf, e=id
  370.         jr nz,execcmd_error
  371.         push de
  372.         OS_RUNAPP
  373.         pop de
  374.         WAITPID
  375.         ret
  376.  
  377. loadapp_keeppath
  378.         ld hl,cmdprompt
  379.         ld de,oldpath
  380.         ld bc,MAXPATH_sz;MAXCMDSZ+1
  381.         ldir ;TODO ЁхъєЁёштэю (фы  .bat)
  382.         ret
  383.  
  384. loadapp_setoldpath
  385.         push de
  386.         ld de,oldpath ;TODO ЁхъєЁёштэю (фы  .bat)
  387.         OS_CHDIR
  388.         pop de
  389.         xor a
  390.         ret ;Z
  391.        
  392. loadapp
  393. ;out: nz=error, cy=end of .bat, or else e=id
  394.         ld hl,cmdbuf
  395.         ld de,wordbuf
  396.         call getword
  397. ;єўхёЄ№ яєЄ№ т шьхэш (TODO шёяюы№чютрЄ№ OS_OPENHANDLE)
  398.         ld hl,wordbuf
  399.         push hl
  400.         call findlastslash. ;de=after last slash or beginning of path
  401.         pop hl
  402.         push de ;de=after last slash or beginning of path
  403.         dec de
  404.         ld a,(de)
  405.         cp '/'
  406.         jr nz,$+4
  407.          xor a
  408.          ld (de),a ;юЄЁхчрЄ№ шь  Їрщыр
  409.         inc de
  410.         ex de,hl;ld de,wordbuf ;ASCIIZ string for parsing (т #c000...)
  411.         pop hl ;hl=after last slash
  412.         jr nz,loadapp_nopath
  413.  
  414.         ;ld bc,loadapp_setoldpath
  415.         ;push bc
  416.  
  417.         push hl ;hl=after last slash
  418.         OS_CHDIR
  419.         call loadapp_keeppath
  420.         pop hl ;hl=after last slash
  421. loadapp_nopath
  422.         ex de,hl ;de=after last slash
  423.         ;ld de,wordbuf ;ASCIIZ string for parsing (т #c000...)
  424.         ld hl,fcb_filename ;Pointer to 11 byte buffer
  425.         OS_PARSEFNAME
  426.        
  427.         ld hl,fcb_filename+8
  428.         ld a,(hl)
  429.         or 0x20
  430.         cp 'b'
  431.         jr z,strcpexec_tryrun_bat
  432.         cp ' '
  433.         jr nz,strcpexec_tryrun_noemptyext
  434.         ld (hl),'c'
  435.         inc hl
  436.         ld (hl),'o'
  437.         inc hl
  438.         ld (hl),'m'
  439. strcpexec_tryrun_noemptyext
  440.         ld de,fcb
  441.         OS_FOPEN
  442.          push af
  443.          call loadapp_setoldpath
  444.          pop af
  445.         or a
  446.         ret nz ;jr nz,execcmd_error
  447.         OS_NEWAPP ;эр ьюьхэЄ ёючфрэш  фюыцэр с√Є№ тъы■ўхэр Єхъє∙р  фшЁхъЄюЁш !!!
  448.         or a
  449.         ret nz ;error
  450. ;dehl=эюьхЁр ёЄЁрэшЎ т 0000,4000,8000,c000 эютюую яЁшыюцхэш , b=id, a=error
  451.         push bc ;b=id
  452.         ld a,d
  453.         SETPG32KHIGH
  454.         push de
  455.         push hl
  456.         ld hl,cmdbuf
  457.         ld de,#c000+COMMANDLINE
  458.         ld bc,COMMANDLINE_sz
  459.         ldir ;command line
  460.         pop hl
  461.         pop de
  462.         call readfile_pages_dehl
  463.  
  464.         ld de,fcb
  465.         OS_FCLOSE
  466.         pop de
  467.         ld e,d ;e=id
  468.         xor a
  469.         ret ;Z
  470.        
  471. strcpexec_tryrun_bat
  472. ;filename in fcb
  473. ;out: nz=error, cy=end of .bat
  474. ;open .bat
  475.         ld hl,fcb_filename
  476.         ld de,fcb_bat_filename
  477.         ld bc,11
  478.         ldir
  479.  
  480.         ld de,fcb_bat
  481.         OS_FOPEN
  482.         or a
  483.         ret nz ;jp nz,execcmd_error
  484.        
  485.          ld a,0x3c ;"inc a"
  486.          ld (readbyte_readbuf_last),a
  487.         ld iy,file_buf_end
  488. strcpexec_tryrun_bat0
  489. ;load line to cmdbuf
  490.         ld hl,cmdbuf
  491.         call readstr ;nz=EOF
  492.         jr nz,strcpexec_tryrun_batq ;TODO яюёыхфэ■■ ёЄЁюъє тё╕-Єръш т√яюыэшЄ№
  493.  
  494.         push iy
  495.         ld hl,cmdbuf
  496.         call prtext
  497.         call prcrlf
  498.         pop iy
  499.        
  500. ;call command in cmdbuf
  501.         push iy
  502.         call callcmd
  503.         pop iy
  504.         jr strcpexec_tryrun_bat0
  505. strcpexec_tryrun_batq
  506. ;close .bat
  507.         ld de,fcb_bat
  508.         OS_FCLOSE
  509.         xor a
  510.          scf ;ўЄюс√ эр т√їюфх эх фхырЄ№ RUNAPP
  511.         ret ;Z
  512.  
  513.         macro READBYTE_A
  514. ;out: z=EOF
  515.         inc ly
  516.         call m,readbyte_readbuf
  517.         ld a,(iy)
  518.         endm
  519.  
  520. readstr
  521. ;out: nz=EOF
  522. ;skips empty lines!
  523.         READBYTE_A ;z=EOF
  524.         jr z,readstrEOF
  525.         cp 0x0d
  526.         jr z,readstr ;empty string - retry
  527.         cp 0x0a
  528.         jr z,readstr ;empty string - retry
  529.         ld b,MAXCMDSZ
  530.         jr readstr0go
  531. readstr0
  532.         READBYTE_A ;z=EOF
  533.         jr z,readstrEOF
  534.         cp 0x0d
  535.         jr z,readstrq
  536.         cp 0x0a
  537.         jr z,readstrq
  538. readstr0go
  539.         ld (hl),a
  540.         inc hl
  541.         djnz readstr0
  542. readstrq
  543.         xor a ;Z
  544.         ld (hl),a
  545.         inc hl
  546.         ret ;Z
  547. readstrEOF
  548.         xor a
  549.         ld (hl),a
  550.         inc hl
  551.         dec a
  552.         ret ;NZ
  553.  
  554. readbyte_readbuf
  555. ;out: z=EOF
  556.         push bc
  557.         push de
  558.         push hl
  559.         push ix
  560.  
  561.         xor a
  562. readbyte_readbuf_last=$ ;TODO keep if recursive!
  563.         inc a ;/nop(z)=last, inc a(nz)=not last
  564.         jr z,readbyte_readbufq
  565.        
  566.         ld de,file_buf
  567.         push de
  568.         OS_SETDTA ;set disk transfer address = de
  569.         ld de,fcb_bat
  570.         OS_FREAD
  571.         pop iy
  572.         xor 128 ;a = bytes read
  573.         jr z,readbyte_readbufq
  574.         jp m,readbyte_readbufq ;full block = not last block
  575. ;last block: shift data to the end of buf, mark last
  576.         ld c,a ;1..128
  577.         ld b,0 ;nz!
  578.         ld a,b
  579.         ld (readbyte_readbuf_last),a
  580.         ld hl,file_buf
  581.         add hl,bc
  582.         dec hl ;end of data
  583.         ld de,file_buf+127
  584.         lddr
  585.         inc de
  586.         push de
  587.         pop iy
  588.         ;nz!
  589. readbyte_readbufq
  590. ;iy=addr
  591. ;z=EOF
  592.         pop ix
  593.         pop hl
  594.         pop de
  595.         pop bc
  596.         ret
  597.  
  598. readfile_pages_dehl
  599.         ld a,d
  600.         SETPG32KHIGH
  601.         ld a,+(#c000+PROGSTART)/256
  602.         call cmd_loadpage
  603.         or a
  604.         ret nz
  605.        
  606.         ld a,e
  607.         SETPG32KHIGH
  608.         ld a,#c000/256
  609.         call cmd_loadpage
  610.         or a
  611.         ret nz
  612.        
  613.         ld a,h
  614.         SETPG32KHIGH
  615.         ld a,#c000/256
  616.         call cmd_loadpage
  617.         or a
  618.         ret nz
  619.        
  620.         ld a,l
  621.         SETPG32KHIGH
  622.         ld a,#c000/256
  623.         jp cmd_loadpage
  624.  
  625. cmd_dir
  626.         ld de,fcb
  627.         OS_SETDTA ;set disk transfer address = de
  628.         ;call makeemptymask
  629.         ld de,fcbmask
  630.         OS_FSEARCHFIRST
  631.         or a
  632.         ld bc,0 ;nfiles
  633.         jp nz,loaddir_error
  634. loaddir0
  635.         ld hl,fcb+FCB_FNAME
  636.         ;ld a,(hl)
  637.         ;cp ' '
  638.         ;jp z,loaddirq
  639.         push bc
  640.         ld b,8
  641.         call cmdprNchars
  642.         ld a,(fcb+FCB_FATTRIB)
  643.         and FATTRIB_DIR
  644.         xor '.'
  645.         push hl
  646.         PRCHAR
  647.         pop hl
  648.         ld b,3
  649.         call cmdprNchars
  650.         ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  651.         exx
  652.         ld hl,(fcb+FCB_FSIZE+2)
  653.         exx
  654.         ld hl,(fcb+FCB_FSIZE)
  655.         call prdword
  656.         ld a,' '
  657.         PRCHAR
  658.         ld hl,(fcb+FCB_FDATE)
  659.         call prdate
  660.         ld a,' '
  661.         PRCHAR
  662.         ld hl,(fcb+FCB_FTIME)
  663.         call prtime
  664.         ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  665.         call prcrlf
  666.         ld de,fcb
  667.         OS_SETDTA ;set disk transfer address = de
  668.          ;call makeemptymask ;т CP/M эх эєцэю, эю юЄёєЄёЄтшх тЁхфшЄ ьэюуючрфрўэюёЄш
  669.          ld de,fcbmask ;т CP/M эх эєцэю, эю юЄёєЄёЄтшх тЁхфшЄ ьэюуючрфрўэюёЄш
  670.         OS_FSEARCHNEXT
  671.         pop bc ;nfiles
  672.         inc bc ;nfiles
  673.         or a
  674.         jp z,loaddir0
  675. loaddir_error
  676. loaddirq
  677. ;bc=nfiles
  678.         ld h,b
  679.         ld l,c
  680.         call prword
  681.         ld hl,t_files_crlf
  682.         jp prtext
  683.  
  684. prdate
  685.         push hl
  686.         ld a,h
  687.         srl a
  688.         sub 20
  689.         jr nc,$+4
  690.         add a,100 ;XX century
  691.         call prNNcmd ;year
  692.         ld a,'-'
  693.         PRCHAR
  694.         pop hl
  695.         ld a,l
  696.         push af
  697.         add hl,hl
  698.         add hl,hl
  699.         add hl,hl
  700.         ld a,h
  701.         and 0x0f
  702.         call prNNcmd ;month
  703.         ld a,'-'
  704.         PRCHAR
  705.         pop af
  706.         and 0x1f
  707.         jp prNNcmd ;day
  708.  
  709. prtime
  710.         push hl
  711.         ld a,h
  712.         rra
  713.         rra
  714.         rra
  715.         and 0x1f
  716.         call prNNcmd ;hour
  717.         ld a,':'
  718.         PRCHAR
  719.         pop hl
  720.         ld a,l
  721.         push af
  722.         add hl,hl
  723.         add hl,hl
  724.         add hl,hl
  725.         ld a,h
  726.         and 0x3f
  727.         call prNNcmd ;minute
  728.         ld a,':'
  729.         PRCHAR
  730.         pop af
  731.         add a,a
  732.         and 0x3f
  733.         jp prNNcmd ;second
  734.  
  735. ;makeemptymask
  736.         ;ld hl,fcbmask_filename
  737.         ;ld d,h
  738.         ;ld e,l
  739.         ;inc de
  740.         ;ld bc,11-1
  741.         ;ld (hl),'?'
  742.         ;ldir
  743.         ;ret
  744.        
  745. skipspaces
  746. ;hl=string
  747. ;out: hl=after last space
  748.         ld a,(hl)
  749.         cp ' '
  750.         ret nz
  751.         inc hl
  752.         jr skipspaces
  753.  
  754. strcopy
  755. ;hl->de
  756. strcopy0
  757.         ld a,(hl)
  758.         ldi
  759.         or a
  760.         jr nz,strcopy0
  761.         ret
  762.  
  763. cmd_cd
  764. execcmd_pars=$+1
  765.         ld hl,0
  766.         ld a,(hl)
  767.         or a
  768.         jr z,cmd_error_nopars
  769.         ex de,hl ;de=path
  770.         OS_CHDIR
  771.         or a
  772.         ret z
  773.         ld hl,twrongpath
  774.         jp cmderror
  775.        
  776. cmd_error_nopars
  777.         ld hl,tnopars
  778.         jp cmderror
  779. cmd_error_notenoughpars
  780.         ld hl,tnotenoughpars
  781.         jp cmderror
  782.  
  783. cmd_md
  784.         ld hl,(execcmd_pars)
  785.         ld a,(hl)
  786.         or a
  787.         jr z,cmd_error_nopars
  788.         ex de,hl ;de=dirname
  789.         OS_MKDIR
  790.         or a
  791.         ret z
  792. cmd_error_cantmakedir
  793.         ld hl,tcantmakedir
  794.         jp cmderror
  795.        
  796. cmd_del
  797.         ld hl,(execcmd_pars)
  798.         ld a,(hl)
  799.         or a
  800.         jr z,cmd_error_nopars
  801.         if 1==1
  802.         ex de,hl
  803.         OS_DELETE
  804.         else ;CP/M-like
  805.         ex de,hl
  806.         ld hl,fcb_filename
  807.         OS_PARSEFNAME
  808.         ld de,fcb
  809.         OS_FDEL
  810.         endif
  811.         or a
  812.         ret z
  813. cmd_error_wrongfile
  814.         ld hl,twrongfile
  815.         jp cmderror
  816.        
  817. cmd_ren
  818.         ld hl,(execcmd_pars)
  819.         ld a,(hl)
  820.         or a
  821.         jr z,cmd_error_nopars
  822.         ld de,wordbuf
  823.         call getword ;hl=terminator/space addr
  824.         call skipspaces
  825.         ld a,(hl)
  826.         or a
  827.         jr z,cmd_error_notenoughpars
  828.         ld de,wordbuf2
  829.         call getword ;hl=terminator/space addr
  830.         ld de,wordbuf
  831.         ld hl,wordbuf2
  832.         OS_RENAME
  833.         or a
  834.         ret z
  835.         ld hl,tcantrename
  836.         jp cmderror
  837.        
  838. cmd_copy
  839.         ld hl,(execcmd_pars)
  840.         ld a,(hl)
  841.         or a
  842.         jr z,cmd_error_nopars
  843.         ld de,filenamebuf;wordbuf
  844.         call getword ;hl=terminator/space addr
  845.         call skipspaces
  846.         ld a,(hl)
  847.         or a
  848.         jr z,cmd_error_notenoughpars
  849.         ld de,filenamebuf2;wordbuf2
  850.         call getword ;hl=terminator/space addr
  851.  
  852.         if 1==1
  853.        
  854.         ld de,filenamebuf;wordbuf ;de=drive/path/file
  855.         OS_OPENHANDLE
  856.         or a
  857.         jp nz,cmd_error_wrongfile
  858.         ld a,b
  859.         ld (close_file1_handle),a
  860.         ld hl,close_file1
  861.         push hl
  862.        
  863.         ld de,filenamebuf2;wordbuf2 ;de=drive/path/file
  864.         OS_CREATEHANDLE
  865.         or a
  866.         jp nz,cmd_error_cant_copy
  867.         ld a,b
  868.         ld (cmd_copy_close_file2_handle),a
  869.         ld hl,cmd_copy_close_file2
  870.         push hl
  871. cmd_copy0
  872.         ld hl,copybuf_sz
  873.         ld de,copybuf
  874.         ld a,(close_file1_handle)
  875.         ld b,a
  876. ;B = file handle, DE = Buffer address, HL = Number of bytes to read
  877.         push de
  878.         OS_READHANDLE
  879. ;HL = Number of bytes actually read, A=error
  880.         pop de
  881.         ld a,h
  882.         or l
  883.         ret z ;0 bytes remain
  884.         ld a,(cmd_copy_close_file2_handle)
  885.         ld b,a
  886. ;B = file handle, DE = Buffer address, HL = Number of bytes to write
  887.         OS_WRITEHANDLE
  888.         jr cmd_copy0
  889.        
  890. close_file1
  891. close_file1_handle=$+1
  892.         ld b,0
  893.         OS_CLOSEHANDLE
  894.         ret
  895.        
  896. cmd_copy_close_file2
  897. cmd_copy_close_file2_handle=$+1
  898.         ld b,0
  899.         OS_CLOSEHANDLE
  900.         ld de,filenamebuf;wordbuf;filenametext
  901.         OS_GETFILETIME ;ix=date, hl=time
  902.         ld de,filenamebuf2;wordbuf2
  903.         OS_SETFILETIME
  904.         ret
  905.        
  906.         else ;CP/M-like functions
  907.        
  908.         ld de,filenamebuf;wordbuf
  909.         ld hl,fcb_filename
  910.         OS_PARSEFNAME
  911.        
  912.         ld de,fcb
  913.         OS_FOPEN
  914.         or a
  915.         jp nz,cmd_error_wrongfile
  916.         ld hl,cmd_copy_close_fcb
  917.         push hl
  918.        
  919.         ld de,filenamebuf2;wordbuf2
  920.         ld hl,fcb2_filename
  921.         OS_PARSEFNAME
  922.        
  923.         ld de,fcb2
  924.         OS_FCREATE
  925.         or a
  926.         jp nz,cmd_error_cant_copy
  927.         ld hl,cmd_copy_close_fcb2
  928.         push hl
  929.        
  930. cmd_copy0
  931.         ld de,copybuf
  932.         OS_SETDTA
  933.         ld de,fcb
  934.         OS_FREAD
  935.         cp 128
  936.         ret z ;яЁюўшЄрыш 0 срщЄ
  937.         xor 128
  938.         ld l,a
  939.         ld h,0
  940.         push hl
  941.         ld de,copybuf
  942.         OS_SETDTA
  943.         pop hl
  944.         ld de,fcb2
  945.         OS_FWRITE_NBYTES
  946.         or a
  947.         jr z,cmd_copy0
  948.         ld hl,tcantwrite
  949.         jp cmderror
  950.        
  951. cmd_copy_close_fcb2
  952.         ld de,fcb2
  953.         OS_FCLOSE
  954.         ret
  955.  
  956. cmd_copy_close_fcb
  957.         ld de,fcb
  958.         OS_FCLOSE
  959.         ret
  960.  
  961.         endif
  962.        
  963. cmd_error_cant_copy
  964.         ld hl,tcantcopy
  965.         jp cmderror
  966.        
  967. cmd_exit
  968.         QUIT
  969.        
  970. cmd_rem
  971.         ret
  972.        
  973. cmd_mem
  974.         ld hl,tfree
  975.         call prtext
  976.         ld b,0
  977. cmd_mem0
  978.         push bc
  979.         OS_NEWPAGE
  980.         pop bc
  981.         or a
  982.         jr nz,cmd_mem_del
  983.         inc b
  984.         push de
  985.         jr cmd_mem0
  986. cmd_mem_del
  987.         ld c,b
  988.         inc b
  989.         dec b
  990.         jr z,cmd_mem_q
  991. cmd_mem_del0
  992.         pop de
  993.         push bc
  994.         OS_DELPAGE
  995.         pop bc
  996.         djnz cmd_mem_del0
  997. cmd_mem_q
  998. ;c=free pages
  999.         ld l,c
  1000.         ld h,0
  1001.         call prword
  1002.         jp prcrlf
  1003.  
  1004. cmd_drop
  1005.         ld hl,(execcmd_pars)
  1006.         ld a,(hl)
  1007.         or a
  1008.         jp z,cmd_error_nopars
  1009.         xor a
  1010.         ld d,a
  1011. cmd_drop_par0
  1012.         add a,d
  1013.         ld e,a ;id
  1014.         add a,a
  1015.         add a,a
  1016.         add a,e
  1017.         add a,a
  1018.         ld d,a ;d=e*10
  1019.         ld a,(hl)
  1020.         inc hl
  1021.         sub '0'
  1022.         cp 10
  1023.         jr c,cmd_drop_par0
  1024.         ;e=id
  1025.         OS_DROPAPP
  1026.         or a
  1027.         ret z
  1028.         ld hl,twrongid
  1029.         jp cmderror
  1030.        
  1031. cmd_proc
  1032.         ld e,1 ;no id 0
  1033. cmd_proc0
  1034.         push de
  1035.         OS_GETAPPMAINPAGES ;d,e,h,l=pages in 0000,4000,8000,c000, c=flags
  1036.         or a
  1037.         jr nz,cmd_proc_skip
  1038.         ld a,d
  1039.         pop de
  1040.         push de
  1041.          push bc
  1042.         push af
  1043.         ex de,hl
  1044.         ld h,0
  1045.         call prword
  1046.         ld a,' '
  1047.         PRCHAR
  1048.         pop af ;main page
  1049.         SETPG32KHIGH
  1050.          pop bc ;c=flags
  1051.          push bc
  1052.          bit factive,c
  1053.          ld a,'-'
  1054.          jr z,$+4
  1055.          ld a,'+'
  1056.          PRCHAR
  1057.          pop bc
  1058.          push bc
  1059.          bit fgfx,c
  1060.          ld a,' '
  1061.          jr z,$+4
  1062.          ld a,'g'
  1063.          PRCHAR
  1064.          pop bc
  1065.           bit fwaiting,c
  1066.           ld a,' '
  1067.           jr z,$+4
  1068.           ld a,'w'
  1069.           PRCHAR
  1070.          ld a,' '
  1071.          PRCHAR
  1072.         ld hl,0xc000+COMMANDLINE
  1073.         call prtext
  1074.         call prcrlf
  1075. cmd_proc_skip
  1076.         pop de
  1077.         inc e
  1078.         ld a,e
  1079.         inc a ;no id #ff
  1080.         jr nz,cmd_proc0
  1081.         ret
  1082.  
  1083. cmd_date
  1084.         OS_GETTIME ;ix=date, hl=time
  1085.         push hl
  1086.         push ix
  1087.         pop hl ;date
  1088.         call prdate
  1089.         ld a,' '
  1090.         PRCHAR
  1091.         pop hl ;time
  1092.         call prtime
  1093.         jp prcrlf
  1094.        
  1095. cmd_t0
  1096.         ld a,(wordbuf)
  1097.                 and 0xdf
  1098.         sub 'A'
  1099.         call cmdsetdrive
  1100.         or a
  1101.         ret z
  1102.         ld hl,tdrivenotfound
  1103.         jp cmderror
  1104.        
  1105. cmderror
  1106.         push hl
  1107.         ld e,#42
  1108.         OS_SETCOLOR
  1109.         pop hl
  1110.         call prtext
  1111.         ld e,COLOR
  1112.         OS_SETCOLOR
  1113. prcrlf
  1114.         ld a,#0d
  1115.         PRCHAR
  1116.         ld a,#0a
  1117.         PRCHAR
  1118.         ret
  1119.        
  1120. cmdsetdrive
  1121.         ;ld (curdrive),a
  1122.         ld e,a
  1123.         OS_SETDRV
  1124.         ret
  1125.  
  1126. cmd_type
  1127.         ld hl,(execcmd_pars)
  1128.         ld a,(hl)
  1129.         or a
  1130.         jp z,cmd_error_nopars
  1131.         ld de,wordbuf
  1132.         call getword ;hl=terminator/space addr
  1133.  
  1134.         ld de,wordbuf ;de=drive/path/file
  1135.         OS_OPENHANDLE
  1136.         or a
  1137.         jp nz,cmd_error_wrongfile
  1138.         ld a,b
  1139.         ld (close_file1_handle),a
  1140.         ld hl,close_file1
  1141.         push hl
  1142.        
  1143. cmd_type0
  1144. ;B = file handle, DE = Buffer address, HL = Number of bytes to read
  1145.         push bc
  1146.         ld de,cmd_type_buf
  1147.         ld hl,1
  1148.         OS_READHANDLE
  1149. ;HL = Number of bytes actually read, A=error
  1150.         pop bc
  1151.         ld a,h
  1152.         or l
  1153.         ret z ;0 bytes remain
  1154.         push bc
  1155. cmd_type_buf=$+1
  1156.         ld a,0
  1157.         PRCHAR
  1158.         pop bc
  1159.         jr cmd_type0
  1160.        
  1161. cmd_echo
  1162.         ld hl,(execcmd_pars)
  1163.         call prtext
  1164.         jp prcrlf
  1165.        
  1166. cmd_pause
  1167.         YIELDGETKEYLOOP
  1168.          cp key_redraw
  1169.          jr z,cmd_pause
  1170.         ret
  1171.  
  1172. cmd_copydir
  1173.         ld hl,(execcmd_pars)
  1174.         ld a,(hl)
  1175.         or a
  1176.         jp z,cmd_error_nopars
  1177.         ld de,wordbuf
  1178.         call getword ;hl=terminator/space addr
  1179.         call skipspaces
  1180.         ld a,(hl)
  1181.         or a
  1182.         jp z,cmd_error_notenoughpars
  1183.         ld de,wordbuf2
  1184.         call getword ;hl=terminator/space addr
  1185.  
  1186. cmd_copydir_go
  1187.         ld hl,wordbuf
  1188.         call prtext
  1189.         ld a,'>'
  1190.         PRCHAR
  1191.         ld hl,wordbuf2
  1192.         call prtext
  1193.         call prcrlf
  1194.        
  1195.         ld de,wordbuf2
  1196.         OS_MKDIR
  1197.  
  1198.         ld bc,0 ;эюьхЁ Їрщыр т фшЁхъЄюЁшш
  1199. cmd_copydir0
  1200.         push bc
  1201.         ld de,cmdprompt
  1202.         OS_CHDIR
  1203.         ld de,wordbuf
  1204.         OS_CHDIR
  1205.         pop bc
  1206.         push bc
  1207.         call getdirfcb_bc
  1208.         pop bc
  1209.         ret nz ;jr nz,cmd_copydirq
  1210.  
  1211.         ld a,(fcb_filename)
  1212.         cp '.'
  1213.         jr z,cmd_copydir0_skip
  1214.         ld a,(fcb+FCB_FATTRIB)
  1215.         and FATTRIB_DIR
  1216.         jr nz,cmd_copydir0_recursive
  1217.        
  1218.         push bc
  1219.         ld hl,fcb_filename
  1220.         ld de,filenamebuf
  1221.         call cpmname_to_dotname
  1222.         call open_setdir2_create_copy
  1223.         pop bc
  1224. cmd_copydir0_skip
  1225.         inc bc
  1226.         jr cmd_copydir0
  1227. ;cmd_copydirq
  1228.         ;ret
  1229.  
  1230.         macro STRPUSH
  1231. ;hl=string addr
  1232.         xor a
  1233.         push af
  1234.          ld a,(hl)
  1235.          inc hl
  1236.          or a
  1237.          push af
  1238.         jr nz,$-4
  1239.         pop af
  1240. ;т ёЄхъх ыхцшЄ \0, ЄхъёЄ (схч ЄхЁьшэрЄюЁр)
  1241.         endm
  1242.        
  1243.         macro STRPOP
  1244. ;hl=string addr
  1245.         ld d,h
  1246.         ld e,l
  1247.          pop af
  1248.          ld (hl),a
  1249.          inc hl
  1250.          or a
  1251.         jr nz,$-4
  1252.         ex de,hl
  1253.         call strmirror
  1254.         endm
  1255.        
  1256. strmirror
  1257. ;hl=string addr
  1258.         ld d,h
  1259.         ld e,l
  1260.         call strlen
  1261.         ld b,h
  1262.         ld c,l
  1263. ;de=эрўрыю, bc=hl=фышэр
  1264.         ;ld h,b
  1265.         ;ld l,c
  1266.         add hl,de ;hl=ъюэхЎ+1
  1267.         srl b
  1268.         rr c ;bc=wid/2
  1269. mirrorbytes0
  1270.         dec hl
  1271.         ld a,(de)
  1272.         ldi
  1273.         dec hl
  1274.         ld (hl),a
  1275.         jp pe,mirrorbytes0
  1276.         ret
  1277.        
  1278. cmd_copydir0_recursive
  1279. ;recursive copydir <wordbuf>/<filename> <wordbuf2>/<filename>
  1280.         push bc
  1281.         ld hl,wordbuf
  1282.         STRPUSH
  1283.         ld hl,wordbuf2
  1284.         STRPUSH
  1285.         ;ld hl,cmdprompt
  1286.         ;STRPUSH
  1287.  
  1288.         ld hl,wordbuf
  1289.         ld bc,0
  1290.         xor a
  1291.         cpir
  1292.         dec hl ;hl=terminator addr
  1293.         ld (hl),'/'
  1294.         inc hl
  1295.         ex de,hl
  1296.         ld hl,fcb_filename
  1297.         ;ld de,filenamebuf
  1298.         call cpmname_to_dotname
  1299.        
  1300.         ld hl,wordbuf2
  1301.         ld bc,0
  1302.         xor a
  1303.         cpir
  1304.         dec hl ;hl=terminator addr
  1305.         ld (hl),'/'
  1306.         inc hl
  1307.         ex de,hl
  1308.         ld hl,fcb_filename
  1309.         ;ld de,filenamebuf
  1310.         call cpmname_to_dotname
  1311.        
  1312.         call cmd_copydir_go
  1313.  
  1314. ;restore dirnames, file #
  1315.         ;ld hl,cmdprompt
  1316.         ;STRPOP
  1317.         ld hl,wordbuf2
  1318.         STRPOP
  1319.         ld hl,wordbuf
  1320.         STRPOP
  1321.         pop bc
  1322.         jr cmd_copydir0_skip
  1323.        
  1324. open_setdir2_create_copy
  1325.         ;open....
  1326.         ld de,filenamebuf;wordbuf ;de=drive/path/file
  1327.         OS_OPENHANDLE
  1328.         or a
  1329.         jp nz,cmd_error_wrongfile
  1330.         ld a,b
  1331.         ld (close_file1_handle),a
  1332.         ld hl,close_file1
  1333.         push hl
  1334.  
  1335.         ;set dir2...
  1336.         ld de,cmdprompt
  1337.         OS_CHDIR
  1338.         ld de,wordbuf2
  1339.         OS_CHDIR
  1340.  
  1341.         ;create....
  1342.         ld de,filenamebuf;2;wordbuf2 ;de=drive/path/file
  1343.         OS_CREATEHANDLE
  1344.         or a
  1345.         jp nz,cmd_error_cant_copy
  1346.         ld a,b
  1347.         ld (cmd_copy_close_file2_handle),a
  1348.         ld hl,cmd_copy_close_file2
  1349.         push hl
  1350.  
  1351.         ;copy....
  1352.         jp cmd_copy0
  1353.        
  1354.        
  1355. getdirfcb_bc
  1356. ;bc=file number in current dir to read to fcb
  1357. ;nz=error
  1358.         push bc
  1359.         ld de,fcb
  1360.         OS_SETDTA
  1361.         ld de,fcbmask
  1362.         OS_FSEARCHFIRST ;de = pointer to unopened FCB (filename with ????????), read matching FCB to DTA
  1363.         pop bc
  1364.         or a
  1365.         ret nz
  1366.        
  1367. getdirfcb_bc0
  1368.         ld a,b
  1369.         or c
  1370.         ret z
  1371.         dec bc
  1372.         push bc
  1373.         ld de,fcb
  1374.         OS_SETDTA
  1375.         ld de,fcbmask
  1376.         OS_FSEARCHNEXT ;(NOT CP/M!!!)de = pointer to unopened FCB (filename with ????????), read matching FCB to DTA
  1377.         pop bc
  1378.         or a
  1379.         jr z,getdirfcb_bc0
  1380.         ret
  1381.        
  1382.        
  1383. ;hl = poi to filename in string
  1384. findlastslash.
  1385. nfopenfnslash.
  1386.         ld d,h
  1387.         ld e,l ;de = after last slash
  1388. ;find last slash
  1389. nfopenfnslash0.
  1390.         ld a,[hl]
  1391.         inc hl
  1392.         or a
  1393.         jr z,nfopenfnslashq.
  1394.         cp '/'
  1395.         jr nz,nfopenfnslash0.
  1396.         jr nfopenfnslash.
  1397. nfopenfnslashq.
  1398. ;de = after last slash
  1399.         ret
  1400.  
  1401. commandslist
  1402.         dw cmd_dir
  1403.         db "dir",0
  1404.         dw cmd_del
  1405.         db "del",0
  1406.         dw cmd_exit
  1407.         db "exit",0
  1408.         dw cmd_cd
  1409.         db "cd",0
  1410.         dw cmd_copy
  1411.         db "copy",0
  1412.         dw cmd_rem
  1413.         db "rem",0
  1414.         dw cmd_md
  1415.         db "md",0
  1416.         dw cmd_ren
  1417.         db "ren",0
  1418.         dw cmd_mem
  1419.         db "mem",0
  1420.         dw cmd_proc
  1421.         db "proc",0
  1422.         dw cmd_drop
  1423.         db "drop",0
  1424.         dw cmd_date
  1425.         db "date",0
  1426.         dw cmd_start
  1427.         db "start",0
  1428.         dw cmd_copydir
  1429.         db "copydir",0
  1430.         dw cmd_type
  1431.         db "type",0
  1432.         dw cmd_echo
  1433.         db "echo",0
  1434.         dw cmd_pause
  1435.         db "pause",0
  1436.        
  1437.         dw -1 ;ъюэхЎ ЄрсышЎ√ ъюьрэф
  1438.  
  1439. tunknowncommand
  1440.         db "Unknown command",0
  1441. tdrivenotfound
  1442.         db "Drive not found",0
  1443. tnopars
  1444.         db "No parameters",0
  1445. tnotenoughpars
  1446.         db "Not enough parameters",0
  1447. tcantcopy
  1448.         db "Can't copy",0
  1449. tcantwrite
  1450.         db "Can't write",0
  1451. twrongpath
  1452.         db "Wrong path",0
  1453. twrongfile
  1454.         db "Wrong file",0
  1455. tcantmakedir
  1456.         db "Can't make the directory",0
  1457. tcantrename
  1458.         db "Can't rename",0
  1459. t_files_crlf
  1460.         db " files",#0d,#0a,0
  1461. tfree
  1462.         db "free pages=",0
  1463. twrongid
  1464.         db "Wrong ID",0
  1465.        
  1466. oldtimer
  1467.         dw 0
  1468.        
  1469. wordbuf
  1470.         ds MAXCMDSZ+1
  1471. wordbuf2
  1472.         ds MAXCMDSZ+1
  1473. filenamebuf
  1474.         ds MAXCMDSZ+1
  1475. filenamebuf2
  1476.         ds MAXCMDSZ+1
  1477.  
  1478. fcb
  1479.         ds FCB_sz
  1480. fcb_filename=fcb+FCB_FNAME        
  1481.  
  1482. fcbmask
  1483.         db 0
  1484.         db "???????????"
  1485.         ds FCB_sz-11-1
  1486. fcbmask_filename=fcbmask+FCB_FNAME
  1487.  
  1488. fcb2
  1489.         ds FCB_sz
  1490. fcb2_filename=fcb2+FCB_FNAME        
  1491.  
  1492. fcb_bat
  1493.         ds FCB_sz
  1494. fcb_bat_filename=fcb_bat+FCB_FNAME        
  1495.  
  1496. oldpath ;TODO єсЁрЄ№ (ъюуфр сєфхЄ loadapp ўхЁхч OPENHANDLE)
  1497.         ds MAXPATH_sz;MAXCMDSZ+1
  1498.  
  1499. sysdir
  1500.         ds MAXPATH_sz
  1501.        
  1502. oldcmd
  1503.         ds MAXCMDSZ+1
  1504.        
  1505. copybuf
  1506.         ds 128
  1507. copybuf_sz=$-copybuf
  1508.  
  1509.         align 256
  1510. file_buf
  1511.         ds 128
  1512. file_buf_end=$-1
  1513.  
  1514.         include "../_sdk/prdword.asm"
  1515.         include "../_sdk/loadpage.asm"
  1516.         include "../_sdk/cmdpr.asm"
  1517.  
  1518. cmd_end
  1519.  
  1520.         display "cmd size ",/d,cmd_end-cmd_begin," bytes"
  1521.  
  1522.         savebin "cmd.com",cmd_begin,cmd_end-cmd_begin
  1523.        
  1524.         ;LABELSLIST "..\us\user.l"
  1525.