Subversion Repositories NedoOS

Rev

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

  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
  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.         ld hl,cmdprompt
  191.         call strlen
  192.         ld a,l
  193.         inc a
  194.          cp 64
  195.          ret c
  196.          ld a,64
  197.         ret
  198.  
  199. cmdcalccurxy
  200. ;out: de=yx
  201. ;x=cmdpromptsz+curcmdx-curcmdscroll
  202.         call cmdcalcpromptsz ;a=promptsz
  203.         ld hl,curcmdx ;не на экране, а внутри команды
  204.         add a,(hl)
  205.         ld hl,curcmdscroll ;сдвиг команды относительно экрана
  206.         sub (hl)
  207.         ld e,a
  208.         ;ld d,txtscrhgt-1
  209.         ld d,CMDLINEY
  210.         ret
  211.  
  212. strlen
  213. ;hl=str
  214. ;out: hl=length
  215.         ld bc,0 ;чтобы точно найти терминатор
  216.         xor a
  217.         cpir ;найдём обязательно, если длина=0, то bc=-1 и т.д.
  218.         ld hl,-1
  219.         or a
  220.         sbc hl,bc
  221.         ret
  222.  
  223. fixscroll_prcmd
  224. ;цикл поиска скролла для текущего положения курсора
  225. editcmd_scroll0
  226.         call cmdcalccurxy ;e=scrx
  227.         call cmdcalcpromptsz ;a=promptsz
  228.         ld hl,curcmdscroll
  229.         dec a
  230.         cp e ;scrx
  231.         jr c,editcmd_noscrollleft ;x>=promptsz (x>(promptsz-1))
  232. ;x<promptsz - скролл влево
  233.         dec (hl)
  234.         jr editcmd_scroll0
  235. editcmd_noscrollleft
  236.         ld a,e ;scrx
  237.         cp txtscrwid
  238.         jr c,editcmd_noscrollright
  239. ;x>=txtscrwid - скролл вправо
  240.         inc (hl)
  241.         jr editcmd_scroll0
  242. editcmd_noscrollright
  243. ;prcmd
  244.         ld de,_COLOR
  245.         SETCOLOR_
  246.         ;ld de,+(txtscrhgt-1)*256+0
  247.         ld de,CMDLINEY*256+0
  248.         SETXY_
  249.         call cmdcalcpromptsz
  250.         dec a
  251.         ld e,a ;!=0, т.к. буква дисковода
  252.         ld d,0
  253.         ld hl,cmdprompt
  254.         ld c,0
  255.         ;call prtext
  256.         call cmdprNchars
  257.         push bc
  258.         ld a,'>'
  259.         PRCHAR_
  260.         pop bc
  261.         inc c
  262.         ld hl,(curcmdscroll)
  263.         ld h,0
  264.         ld de,cmdbuf
  265.         add hl,de
  266.         call prtext
  267. ;добьём остаток строки пробелами
  268.         ;ld hl,tspaces
  269.         ;jp prtext
  270.         jp clearrestofline
  271.  
  272. tspaces
  273.         ds txtscrwid-1,' '
  274.         db 0
  275.  
  276. cmdprNchars
  277. ;hl=buffer
  278. ;de=size
  279. ;out: hl=buffer+size
  280.         ex de,hl
  281.         push de
  282.         push hl
  283.         call sendchars
  284.         pop hl
  285.         pop de
  286.         add hl,de
  287.         ret
  288.        
  289. prtext
  290. ;c=x
  291.         push bc
  292.         push hl
  293.         ld a,txtscrwid-1
  294.         sub c
  295.         ld c,a
  296.         push bc
  297.         call strlen ;hl=length
  298.         pop bc
  299.         ld b,0
  300.         call minhl_bc_tobc
  301.         ld h,b
  302.         ld l,c
  303.         pop de
  304.         pop bc ;c=x
  305.         ld a,h
  306.         or l
  307. ;de=buf
  308. ;hl=len
  309.         push bc
  310.         push de
  311.         push hl
  312.         call nz,sendchars
  313.         pop hl
  314.         pop de
  315.         pop bc
  316.         ld a,l
  317.         add a,c
  318.         ld c,a
  319.          add hl,de
  320.          inc hl
  321. ;c=x        
  322. ;hl=after terminator
  323.         ret
  324.  
  325. minhl_bc_tobc
  326.         or a
  327.         sbc hl,bc
  328.         add hl,bc
  329.         ret nc ;bc<=hl
  330.         ld b,h
  331.         ld c,l
  332.         ret
  333.  
  334. strdelch
  335. ;delete char at (hl-1), shift string left
  336. ;keeps ix
  337. editcmd_bs0
  338.         ld a,(hl)
  339.         dec hl
  340.         ld (hl),a
  341.         inc hl
  342.         inc hl
  343.         or a
  344.         jr nz,editcmd_bs0
  345.         ret
  346.  
  347. strinsch
  348. ;insert char E at (hl), shift string right
  349. ;keeps ix
  350. editcmd_ins0
  351.         ld a,(hl)
  352.         ld (hl),e
  353.         ld e,a
  354.         inc hl
  355.         or a
  356.         jr nz,editcmd_ins0
  357.         ld (hl),a
  358.         ret
  359.  
  360. curcmdscroll ;сдвиг команды относительно экрана
  361.         db 0
  362. curcmdx ;не на экране, а внутри команды
  363.         db 0
  364. cmdprompt
  365.         ds MAXPATH_sz;MAXCMDSZ+1
  366. tcmd
  367.         db "cmd "
  368. tcmd_sz=$-tcmd
  369. cmdbuf
  370.         db 0
  371.         ds cmdbuf+MAXCMDSZ+1-$
  372.