?login_element?

Subversion Repositories NedoOS

Rev

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

  1. strcp
  2. ;hl=s1
  3. ;de=s2
  4. ;out: Z (equal, hl=terminator of s1+1, de=terminator of s2+1), NZ (not equal, hl=erroraddr in s1, de=erroraddr in s2)
  5. strcp0.
  6.         ld a,[de] ;s2
  7.         cp [hl] ;s1
  8.         ret nz
  9.         inc hl
  10.         inc de
  11.         or a
  12.         jp nz,strcp0.
  13.         ret ;z
  14.  
  15. dotname_to_cpmname
  16. ;de -> hl
  17. ;out: de=pointer to termination character
  18.         ;push hl ;buffer
  19.        
  20.         push de ;ASCIIZ string for parsing
  21.         push hl ;Pointer to 11 byte buffer
  22.         ld d,h
  23.         ld e,l
  24.         inc de
  25.         ld [hl],' '
  26.         ld bc,11-1
  27.         ldir ;empty filename
  28.         pop hl ;Pointer to 11 byte buffer
  29.         pop de ;ASCIIZ string for parsing
  30.  
  31. ;change dots to 1, except the last
  32.         ld a,(de)
  33.         cp '.'
  34.         jr z,parse_filename_changedots
  35.         push de
  36.         jr parse_filename_changedots0getgo
  37. parse_filename_changedots0get
  38.          ld a,1
  39.          ld (de),a
  40. parse_filename_changedots0getgo
  41.         ld b,d
  42.         ld c,e
  43. parse_filename_changedots0
  44.         ld a,(de)
  45.         cp '.'
  46.         jr z,parse_filename_changedots0get
  47.         inc de
  48.         or a
  49.         jr nz,parse_filename_changedots0
  50.         ld a,(bc)
  51.         cp 1
  52.         jr nz,$+5
  53.          ld a,'.'
  54.          ld (bc),a
  55.         pop de
  56. parse_filename_changedots
  57.  
  58.         ld b,9
  59.        
  60.         ld a,(de)
  61.         cp '.'
  62.         jr nz,parse_filename0.
  63.         ld (hl),a
  64.         inc de
  65.         ld a,(de)
  66.         cp '.'
  67.         jr nz,parse_filenameq_findterminator.
  68.         inc hl
  69.         ld (hl),a
  70.         jr parse_filenameq_findterminator.
  71. parse_filename0.
  72.         ld a,[de]
  73.         or a
  74.         ret z ;jr z,parse_filenameq. ;no extension in string
  75.         cp '.'
  76.         jr z,parse_filenamedot. ;можем уже быть на терминаторе
  77.          ;cp 0x80
  78.          ;jr nc,$+4
  79.          ;or 0x20
  80.          cp 1
  81.          jr nz,$+5
  82.           ld a,'.'
  83.           ld [de],a
  84.         ld [hl],a
  85.         inc de
  86.         inc hl
  87.         djnz parse_filename0.
  88. ;9 bytes in filename, no dot (9th byte goes to extension)
  89. ;возможно, длинное имя, надо найти, что раньше - точка или терминатор
  90. ;можем уже быть на терминаторе или на точке
  91.         dec hl
  92.         ld [hl],' '
  93. parse_filenamelongname0.
  94.         ld a,[de]
  95.         or a
  96.         ret z ;jr z,parse_filenameq. ;a=0
  97.         inc de
  98.         cp '.'
  99.         jr z,parse_filenameLONGnamedot. ;можем уже быть на терминаторе
  100.         jr parse_filenamelongname0.
  101. parse_filenamedot.
  102.         inc de
  103.         inc hl
  104.         djnz $-1 ;hl points to extension in FCB
  105.         dec hl
  106. parse_filenameLONGnamedot.
  107.         ld a,[de] ;extension in string
  108.         or a
  109.         ret z ;jr z,parse_filenameq. ;a=0
  110.          ;cp 0x80
  111.          ;jr nc,$+4
  112.          ;or 0x20
  113.         ld [hl],a ;extension in FCB
  114.         inc hl
  115.         inc de
  116.         ld a,[de] ;extension in string
  117.         or a
  118.         ret z ;jr z,parse_filenameq. ;a=0
  119.          ;cp 0x80
  120.          ;jr nc,$+4
  121.          ;or 0x20
  122.         ld [hl],a ;extension in FCB
  123.         inc hl
  124.         inc de
  125.         ld a,[de] ;extension in string
  126.         or a
  127.         ret z ;jr z,parse_filenameq. ;a=0
  128.          ;cp 0x80
  129.          ;jr nc,$+4
  130.          ;or 0x20
  131.         ld [hl],a ;extension in FCB
  132. parse_filenameq_findterminator.
  133.         inc de
  134.         ld a,[de]
  135.         or a
  136.         jr nz,parse_filenameq_findterminator.
  137. ;parse_filenameq. ;de на терминаторе
  138.         ;pop hl ;buffer
  139.         ret ;a=0
  140.  
  141. cpmname_to_dotname
  142. ;hl -> de
  143.         push hl
  144.         ld b,8
  145. cpmname_to_dotname0
  146.         ld a,(hl)
  147.         cp ' '
  148.         jr z,cpmname_to_dotname0q
  149.         ld (de),a
  150.         inc hl
  151.         inc de
  152.         djnz cpmname_to_dotname0
  153. cpmname_to_dotname0q
  154.         pop hl
  155.         ld bc,8
  156.         add hl,bc ;hl=pointer to ext
  157.         ld a,(hl)
  158.         cp ' '
  159.         jr z,cpmname_to_dotnameq
  160.         ld a,'.'
  161.         ld (de),a
  162.         inc de
  163.         ld  c,3
  164.         ldir
  165. cpmname_to_dotnameq
  166.         xor a
  167.         ld (de),a
  168.         ret
  169.  
  170. makeprompt
  171. ;keeps ix
  172.         push ix
  173.         ld de,cmdprompt ;de=pointer to 64 byte (MAXPATH_sz!) buf
  174.         OS_GETPATH ;TODO брать из описателя панели
  175.         pop ix
  176.         ret
  177.  
  178. cmdcalctextaddr
  179. ;out: hl=addr, a=curcmdx
  180. ;keeps ix
  181.         ld hl,cmdbuf
  182.         ld a,(curcmdx)
  183. cmdcalctextaddr_hlbase_ax
  184.         ld c,a
  185.         ld b,0
  186.         add hl,bc
  187.         ret
  188.  
  189. cmdcalcpromptsz
  190. ;out: hl=len, a=(len+1)<64 or 64
  191.         ld hl,cmdprompt
  192.         call strlen
  193.         ld a,l
  194.         inc a
  195.          cp 64
  196.          ret c
  197.          ld a,64
  198.         ret
  199.  
  200. cmdcalccurxy
  201. ;out: de=yx
  202. ;x=cmdpromptsz+curcmdx-curcmdscroll
  203.         call cmdcalcpromptsz ;a=promptsz
  204.         ld hl,curcmdx ;не на экране, а внутри команды
  205.         add a,(hl)
  206.         ld hl,curcmdscroll ;сдвиг команды относительно экрана
  207.         sub (hl)
  208.         ld e,a
  209.         ;ld d,txtscrhgt-1
  210.         ld d,CMDLINEY
  211.         ret
  212.  
  213. strlen
  214. ;hl=str
  215. ;out: hl=length
  216.         xor a
  217.         ld b,a
  218.         ld c,a ;чтобы точно найти терминатор
  219.         cpir ;найдём обязательно, если длина=0, то bc=-1 и т.д.
  220.         ld h,a
  221.         ld l,a
  222.         scf
  223.         sbc hl,bc
  224.         ret
  225.  
  226. fixscroll_prcmd
  227. ;цикл поиска скролла для текущего положения курсора
  228. editcmd_scroll0
  229.         call cmdcalccurxy ;e=scrx
  230.         call cmdcalcpromptsz ;a=promptsz
  231.         ld hl,curcmdscroll
  232.         dec a
  233.         cp e ;scrx
  234.         jr c,editcmd_noscrollleft ;x>=promptsz (x>(promptsz-1))
  235. ;x<promptsz - скролл влево
  236.         dec (hl)
  237.         jr editcmd_scroll0
  238. editcmd_noscrollleft
  239.         ld a,e ;scrx
  240.         cp txtscrwid
  241.         jr c,editcmd_noscrollright
  242. ;x>=txtscrwid - скролл вправо
  243.         inc (hl)
  244.         jr editcmd_scroll0
  245. editcmd_noscrollright
  246. ;prcmd
  247.         ld de,_COLOR
  248.        if PRSTDIO
  249.         SETCOLOR_
  250.        else
  251.         call nv_setcolor
  252.        endif
  253.         ;ld de,+(txtscrhgt-1)*256+0
  254.         ld de,CMDLINEY*256+0
  255.         call nv_setxy ;keeps de,hl,ix
  256.         call cmdcalcpromptsz
  257.         dec a
  258.         ld e,a ;!=0, т.к. буква дисковода
  259.         ld d,0
  260.         ld hl,cmdprompt
  261.         ld c,d;0
  262.         ;call prtext
  263.         call cmdprNchars
  264.         push bc
  265.         ld a,'>'
  266.         MYPRCHAR
  267.         pop bc
  268.         inc c
  269.         ld hl,(curcmdscroll)
  270.         ld h,0
  271.         ld de,cmdbuf
  272.         add hl,de
  273.         call prtext
  274. ;добьём остаток строки пробелами
  275.         ;ld hl,tspaces
  276.         ;jp prtext
  277.         jp clearrestofline
  278.  
  279. tspaces
  280.         ds txtscrwid-1,' '
  281.         db 0
  282.  
  283. cmdprNchars
  284. ;hl=buffer
  285. ;de=size
  286. ;out: hl=buffer+size
  287.         ex de,hl
  288.         push de
  289.         push hl
  290.         call sendchars
  291.         pop hl
  292.         pop de
  293.         add hl,de
  294.         ret
  295.        
  296. prtext
  297. ;c=x
  298.         push bc
  299.         push hl
  300.         ld a,txtscrwid-1
  301.         sub c
  302.         ld c,a
  303.         push bc
  304.         call strlen ;hl=length
  305.         pop bc
  306.         ld b,0
  307.         call minhl_bc_tobc
  308.         ld h,b
  309.         ld l,c
  310.         pop de
  311.         pop bc ;c=x
  312.         ld a,h
  313.         or l
  314. ;de=buf
  315. ;hl=len
  316.         push bc
  317.         push de
  318.         push hl
  319.         call nz,sendchars
  320.         pop hl
  321.         pop de
  322.         pop bc
  323.         ld a,l
  324.         add a,c
  325.         ld c,a
  326.          add hl,de
  327.          inc hl
  328. ;c=x        
  329. ;hl=after terminator
  330.         ret
  331.  
  332. minhl_bc_tobc
  333.         or a
  334.         sbc hl,bc
  335.         add hl,bc
  336.         ret nc ;bc<=hl
  337.         ld b,h
  338.         ld c,l
  339.         ret
  340.  
  341. strdelch
  342. ;delete char at (hl-1), shift string left
  343. ;keeps ix
  344. editcmd_bs0
  345.         ld a,(hl)
  346.         dec hl
  347.         ld (hl),a
  348.         inc hl
  349.         inc hl
  350.         or a
  351.         jr nz,editcmd_bs0
  352.         ret
  353.  
  354. strinsch
  355. ;insert char E at (hl), shift string right
  356. ;keeps ix
  357. editcmd_ins0
  358.         ld a,(hl)
  359.         ld (hl),e
  360.         ld e,a
  361.         inc hl
  362.         or a
  363.         jr nz,editcmd_ins0
  364.         ld (hl),a
  365.         ret
  366.  
  367. curcmdscroll ;сдвиг команды относительно экрана
  368.         db 0
  369. curcmdx ;не на экране, а внутри команды
  370.         db 0
  371. cmdprompt
  372.         ds MAXPATH_sz;MAXCMDSZ+1
  373. tcmd
  374.         db "cmd "
  375. tcmd_sz=$-tcmd
  376. cmdbuf
  377.         db 0
  378.         ds cmdbuf+MAXCMDSZ+1-$
  379.