Subversion Repositories NedoOS

Rev

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