?login_element?

Subversion Repositories NedoOS

Rev

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

  1.         DEVICE ZXSPECTRUM128
  2.         include "../_sdk/sys_h.asm"
  3.  
  4. NEDOOS=1
  5. PRSTDIO=1
  6.  
  7. ;1992, IskraSOFT corp. СПб, Россия
  8. ;LL0000=0;$-#a7
  9. ;LL5db2=$-#f5
  10. ;LL5da8=$-#ff
  11. ;LL0010=0x10;$-#97
  12. ;LL5fc1=$-#e6
  13. ;LL5dc9=$-#de
  14. ;LL5ddf=$-#c8
  15. ;LL6091=$-#16
  16. LL0005=5;$-#a2
  17. ;LL609c=$-#0b
  18. LL000f=0x0f;$-#98
  19. ;LL6169=$-#3e
  20. ;LL0300=0x300;$-#a7
  21.         if PRSTDIO
  22. SCRHGT=25
  23.         else
  24. SCRHGT=24
  25.         endif
  26.  
  27. MAXCMDSZ=COMMANDLINE_sz-1-4-4 ;not counting terminator (-4 for "cmd ")
  28.  
  29.  
  30.         org PROGSTART
  31. begin
  32. ;0x5da4=23972
  33.        if NEDOOS
  34.         ld sp,0xc000
  35.        if PRSTDIO
  36.         call initstdio
  37.         ld a,(stdiohgt)
  38.         ;ld (scrhgt),a
  39.        else
  40.         ld e,3
  41.         OS_SETGFX ;e=0:EGA, e=2:MC, e=3:6912, e=6:text ;+SET FOCUS ;e=-1: disable gfx (out: e=old gfxmode)
  42.         ld a,(user_scr0_high) ;ok
  43.         SETPG4000
  44.        endif
  45.  
  46.         call keepdir
  47.  
  48.         ld hl,COMMANDLINE
  49.         call skipword
  50.         call skipspaces
  51.         ld (par1addr),hl
  52.         call skipword
  53.        push hl
  54.         call skipspaces
  55.         ld (par2addr),hl
  56.        pop hl
  57.         ld (hl),0
  58.        endif
  59.         call domenu;LL5dbd
  60.        if NEDOOS
  61.         jr c,failquit ;CY=error
  62.        else
  63.         ret c ;CY=error
  64.        endif
  65. okquit;LL5da8
  66.        if NEDOOS
  67.         ld hl,0
  68.         QUIT
  69. failquit
  70.         ld hl,-1
  71.         QUIT
  72.        else
  73.         xor a
  74.         ld a,#f4
  75.         ret
  76.        endif
  77.  
  78. LL5dac
  79. ;hl=адрес комстроки
  80.         call LL5db2 ;run (p_com+exebat)
  81.        if NEDOOS
  82.         jr c,failquit ;CY=error
  83.        else
  84.         ret c ;CY=error
  85.        endif
  86.         jr okquit;LL5da8
  87.  
  88. LL5db2
  89. ;run (p_com+exebat)
  90. ;hl=адрес комстроки
  91.        if NEDOOS
  92. ;cmd <hl>
  93.        push hl
  94.         call findCR
  95.         dec hl
  96.         ld (hl),0
  97. ;run "cmd <command to run>"
  98.         OS_SETSYSDRV
  99.        pop hl ;ld hl,cmdbuf
  100.         call loadandrun ;nz=error, e=id
  101.         jp nz,failquit
  102.         WAITPID
  103.         jp okquit
  104.        else
  105.         xor a
  106.         ld b,#01 ;???
  107.         ld c,#48 ;72(48):run    - = p_com(#49) + exebat(#44). (Выход см. exebat). Передаются регистры IX,B.
  108. ;73(49):p_com  - Заполнить  внутренний  буфер командной строки. HL = адрес строки, оканчивающейся кодом 13. При длине строки более 128 символов возвращает ошибку (флаг C)
  109. ;68(44):exebat - Запуск  файла по пути и имени файла, находящегося во внутреннем буфере командной строки. Вход: A=0:  стандартрая  обработка  типа файла, т.е. обращение к файлу S:extent.txt, A>0: DE = адрес буфера  с  путем  и  именем  текстового файла. Выход: CARRY SET - серьезная ошибка, иначе: Z - O.K.,  NZ  -  какая-нибудь досадная мелочь
  110.         rst #10
  111.         ret c ;CY=error
  112.         ld c,#41 ;65(41):fmrst  - Восстанавливает первоначальное состояние среды. (устройство, каталог и файл, запоминаемые процедурами работающими с командной строкой). Выход: с обр. ошибок, иначе сохраняет AF.
  113.         rst #10
  114.        endif
  115.         ret
  116.  
  117. domenu;LL5dbd
  118.         ld a,#01
  119.         ld (LL5fc1),a ;1=надо вызвать exe, 0=надо вызвать bat или большую программу?
  120.        if NEDOOS
  121. ;открываем либо файл-параметр (если он .mnu), либо SYSPATH/файл-параметр (если он .mnu), либо SYSPATH/mainmenu
  122.        ld hl,(par1addr)
  123.        xor a
  124.        ld c,0xff
  125.        cpir
  126.        ld de,tdotmnuz+5
  127.        ld b,5
  128. checkdotmnu0
  129.        dec hl
  130.        dec de
  131.        ld a,(de)
  132.        cp (hl)
  133.        jr nz,checkdotmnu_nomnu
  134.        djnz checkdotmnu0
  135.         ld de,(par1addr)
  136.         OS_OPENHANDLE
  137.         or a
  138.         jr z,_LL5ddf
  139.         OS_SETSYSDRV
  140.         ld de,(par1addr)
  141.         OS_OPENHANDLE
  142.         or a
  143.         jr z,_LL5ddf
  144. checkdotmnu_nomnu
  145.         OS_SETSYSDRV
  146.         ld de,mainmenufilename;LL6091
  147.         OS_OPENHANDLE
  148.         or a
  149.         scf
  150.         ret nz ;error (CY)
  151.        ld hl,(par1addr)
  152.        ld (par2addr),hl
  153. _LL5ddf
  154.         ld a,b
  155.         ld (curhandle),a
  156.        else
  157. ;открываем либо файл-параметр, либо mainmenu, либо mainmenupath/mainmenu
  158.         ld c,#40;64(40):oparm  - Открывает  файл-параметр.  Путь  к файлу  (полный или от текущего каталога) лежит в буфере командной  строки  вместе с именем файла или его маской.
  159.         rst #10
  160.         jr c,_LL5dc9 ;error
  161.         jr z,_LL5ddf ;file opened
  162. _LL5dc9 ld hl,mainmenufilename;LL6091
  163.         ld c,#25;37(25):fopen  - Поиск и открытие файла или каталога по имени и типу. HL - адрес описателя (имя, тип). (подкаталог открывается, т.е. его  описатель (19 байт) считываются в сис. область описателя каталога. Выход: если ошибок  нет:   и если  BIT5=0, то файл открыт, в A - регистр состояния файла (FSTAT), в HL' - адрес 32-байтового описателя файла (FNAME) если BIT5=1, то функция FOPEN открыла внутренний подкаталог
  164.         rst #10
  165.         jr nc,_LL5ddf ;file opened
  166.         ld hl,mainmenupath;LL6088
  167.         ld c,#42;66(42):comstr - Разбирается с указанным путем и открывает данное устройство и каталог (файл не открывает!) или снимает  ключ.  Вход: HL = адрес командной строки. Выход: флаг C: ошибка ввода/вывода (восстанавливается прежняя среда); NC,Z:  A=0: HL'= 11-байтовый описатель/шаблон файла (если имя/маска файла не указано после пути, то шаблон из #FF); A>0: HL'= адрес символа "/" (обнаружен ключ), A=первый символ после ключа. NC,NZ:  или  пути  нет,  или  ключа нет (пустая строка), или синтаксическая ошибка в командной строке.
  168.         rst #10
  169.         ret c ;error
  170.         ld hl,mainmenufilename;LL6091
  171.         ld c,#25;37(25):fopen  - Поиск и открытие файла или каталога по имени и типу. HL - адрес описателя (имя, тип). (подкаталог открывается, т.е. его  описатель (19 байт) считываются в сис. область описателя каталога. Выход: если ошибок  нет:   и если  BIT5=0, то файл открыт, в A - регистр состояния файла (FSTAT), в HL' - адрес 32-байтового описателя файла (FNAME) если BIT5=1, то функция FOPEN открыла внутренний подкаталог
  172.         rst #10
  173.         ret c ;error
  174. _LL5ddf
  175.        endif
  176. ;file opened
  177.        if NEDOOS
  178.         ld a,(curhandle)
  179.         ld b,a
  180.         OS_GETFILESIZE ;b=handle, out: dehl=file size
  181.         ld a,d
  182.         or e
  183.         scf
  184.         ret nz ;error (CY)
  185.         ex de,hl
  186.        else
  187.         ld c,#35;53(35):bkfcb  - Возврат адреса описателя файла в HL'(=FNAME)
  188.         rst #10
  189.         exx
  190.         push hl
  191.         pop ix
  192.         ld e,(ix+#0e)
  193.         ld d,(ix+#0f)
  194.        endif
  195. ;de=filesz
  196.        if NEDOOS
  197.        ld hl,menutext+128;LL623a
  198.        add hl,de
  199.        ret c ;error (no free mem)
  200.        ex de,hl
  201.        ld de,menutext;LL623a
  202. ;de=menutext, hl=filesz
  203.        push de
  204.        push hl
  205.         ld a,(curhandle)
  206.         ld b,a
  207.        push bc
  208.         OS_READHANDLE
  209.        pop bc
  210.         OS_CLOSEHANDLE
  211.        pop hl
  212.        pop de
  213.         or a
  214.         scf
  215.         ret nz ;error (CY)
  216.        else
  217.         ld ix,menutext;LL623a
  218.         push ix
  219.         pop hl
  220.         add hl,de ;hl=menutext+filesz?
  221.         inc hl
  222.         ld c,#10;16(10):g_cnfg - Возврат вектора конфигурации ядра. HL'- адрес вектора конфигурации ядра, А - номeр канала системного устройства
  223.         rst #10
  224.         push hl
  225.         exx
  226.         ld bc,LL0005
  227.         add hl,bc ;hl=адрес вектора конфигурации ядра+5
  228.         ld e,(hl)
  229.         inc hl
  230.         ld d,(hl) ;free mem???
  231.         exd   ;hl=free mem???
  232.         pop de
  233.         xor a
  234.         sbc hl,de
  235.         ld a,#82
  236.         ret c ;no free mem???
  237.         exx
  238. ;ix=menutext, de=filesz
  239.         xor a
  240.         ld h,a
  241.         ld l,a
  242.         ld c,#29 ;41(29):rpart  - Чтение части файла. A,HL - указатель, IX - адрес в памяти, DE - длина в байтах.
  243.         rst #10
  244.         ret c ;error
  245.         push ix
  246.         pop hl
  247.        endif
  248. ;hl=menutext
  249. ;de=filesz
  250.         add hl,de ;hl=menutext+filesz
  251.         ld (hl),#0d
  252.         inc hl
  253.         ld (hl),#03 ;конец текста
  254.        if !NEDOOS
  255.         ld c,#41 ;65(41):fmrst  - Восстанавливает первоначальное состояние среды. (устройство, каталог и файл, запоминаемые процедурами работающими с командной строкой). Выход: с обр. ошибок, иначе сохраняет AF
  256.         rst #10
  257.         ret c ;error
  258.        endif
  259. ;file loaded
  260.         ld e,'H';#48 ;H - строки подсказки
  261.         call LL609c ;поиск первой строки типа e в menutext?
  262.         jr z,_LL5e2a ;z=не найдено
  263.         ld a,#01
  264.         ld (hintspresent),a;(LL6226),a
  265. _LL5e2a ld e,'K';#4b ;K - строка ключей (одна в тексте) ;например: K/A1/K40/J5/C160/O21
  266.         call LL609c ;поиск первой строки типа e в menutext?
  267.         call nz,interpret_keys_hl;LL5fc9 ;интерпретируем ключи
  268. ;ищем самую широкую строку типа 'A' (menuwid) и высоту окна (menuhgt):
  269.         ld e,'A';#41
  270.         ld d,#01
  271. _LL5e36 call LL609e ;поиск строки типа e номер d в тексте menutext? ;out: z="(hl)==#03" (конец текста?) или error?
  272.         jr z,_LL5e49 ;z=не найдено
  273.         inc d
  274.         ld c,a
  275.         ld a,(menuwid);(LL6232)
  276.         cp c
  277.         jr nc,_LL5e44
  278.         ld a,c
  279. _LL5e44 ld (menuwid),a;(LL6232),a
  280.         jr _LL5e36
  281. _LL5e49 inc d
  282.         ld a,d
  283.         cp #02
  284.         ret z ;в меню нет ни одной строки
  285.         cp SCRHGT-3;21;#15
  286.         jr c,_LL5e54
  287.         ld a,SCRHGT-4;20;#14
  288. _LL5e54 ld (menuhgt),a;(LL622d),a
  289. ;ещё раз ищем высоту окна???
  290.         ld e,'A';#41
  291.         ld d,#01
  292. _LL5e5b call LL609e ;поиск строки типа e номер d в тексте menutext? ;out: z="(hl)==#03" (конец текста?) или error?
  293.         ret z ;не найдено
  294.         inc d
  295.         dec hl
  296.         ld a,e
  297.         cp (hl)
  298.         jr nz,_LL5e5b
  299.         ld a,d
  300.         cp SCRHGT-5;19;#13
  301.         ret nc
  302. ;ищем menuwid_chrs, menux
  303.         ld a,(menuwid);(LL6232)
  304.        if PRSTDIO
  305.         ld c,80-1
  306.        else
  307.         ld c,#21
  308.        endif
  309.         dec a
  310.         cp c
  311.         jr c,_LL5e73
  312.         ld a,c
  313. _LL5e73 ld (menuwid),a;(LL6232),a
  314.        if PRSTDIO
  315.         add a,2
  316.        else
  317.         ld b,a
  318.         add a,a
  319.         add a,b ;*3
  320.         srl a
  321.         srl a ;*3/4
  322.         inc a
  323.         inc a
  324.         inc a ;*3/4 +3
  325.         srl a
  326.         add a,a ;чётное
  327.        endif
  328.         ld (menuwid_chrs),a;(LL622e),a
  329.         ld b,a
  330.         ld a,(menux);(LL622b)
  331.         cp #ff
  332.         jr nz,_LL5e96
  333.        if PRSTDIO
  334.         ld a,80
  335.        else
  336.         ld a,#20
  337.        endif
  338.         sub b
  339.         srl a
  340.         ld (menux),a;(LL622b),a
  341. _LL5e96
  342.        if PRSTDIO
  343.         inc a
  344.        else
  345.         sla a
  346.         sla a
  347.         ld b,#01
  348.         ld c,#03
  349.         inc a
  350. _LL5e9f cp c
  351.         jr c,_LL5ea6
  352.         sub c
  353.         inc b
  354.         jr _LL5e9f
  355. _LL5ea6 ld a,b ;???
  356.         ld a,(menuwid);(LL6232)
  357.         and #07
  358.         cp #04
  359.         jr z,LL5eb8
  360.         cp #05
  361.         jr z,LL5eb8
  362.         cp #07
  363.         jr nz,LL5eb9
  364. LL5eb8  inc b
  365. LL5eb9  ld a,b
  366.        endif
  367.         ld (menux_chrs),a
  368.  
  369.         ld a,(hintx);(LL621d)
  370.        if PRSTDIO
  371.         inc a;add a,2
  372.        else
  373.         sla a
  374.         sla a
  375.         ld b,#00
  376.         ld c,#03
  377.         inc a
  378. _LL5ec9 cp c
  379.         jr c,_LL5ed0
  380.         sub c
  381.         inc b
  382.         jr _LL5ec9
  383. _LL5ed0 ld a,b
  384.         inc a
  385.         inc a
  386.        endif
  387.         ld (LL6223),a ;??? NU hinthgt_chrs?
  388. ;
  389.         ld a,(menuy);(LL622c)
  390.         cp #ff
  391.         jr nz,_LL5ee9
  392.         ld a,(menuhgt);(LL622d)
  393.         ld b,a
  394.         ld a,SCRHGT;#18
  395.         sub b
  396.         srl a
  397.         ld (menuy),a;(LL622c),a
  398. _LL5ee9
  399.  
  400.         ld a,(hintwid);(LL6224)
  401.        if PRSTDIO
  402.         add a,2
  403.        else
  404.         srl a
  405.         srl a
  406.         ld b,a
  407.         set 7,b
  408.         ld c,#03
  409.         xor a
  410. LL5ef6  add a,c
  411.         dec b
  412.         bit 7,b
  413.         jr nz,LL5ef6
  414.         inc a
  415.         inc a
  416.        endif
  417.         ld (LL6220),a ;hintwid_chrs?
  418. ;
  419.         ld a,(action);(LL6087)
  420.         ld b,a
  421.         bit 0,a ;1 = окно меню с тенью
  422.         jr z,_LL5f11
  423.         ld a,(shadowcolor);(LL6230)
  424.         res 7,a
  425.         ld (shadowcolor),a;(LL6230),a
  426. _LL5f11 xor a ;окно с одинарной рамкой
  427.         bit 2,b ;4 = окно меню с 2-ой рамкой
  428.         jr z,_LL5f18
  429.         ld a,#02 ;окно с двойной рамкой
  430. _LL5f18
  431.         ld ix,MENU;LL622b
  432.        if NEDOOS
  433.        if PRSTDIO
  434.         call prwin
  435.        else
  436.         call sR_WT ;Вывод окна (без текста). Подфункция в рег. A: A=0 окно с одинарной рамкой, А=1 без рамки, А=2 с двойной рамкой, A=3..127 без рамки, A=128..255 только подкраска. IX= вектор окна
  437.        endif
  438.        else
  439.         ld c,#61 ;97(61):wt    - Вывод окна. Подфункция в рег. A: A=0 окно с одинарной рамкой, А=1 без рамки, А=2 с двойной рамкой, A=3..127 без рамки, A=128..255 только подкраска. IX= вектор окна
  440.         rst #10
  441.        endif
  442.         ld a,(action);(LL6087)
  443.         and #0a
  444.         ld (action),a;(LL6087),a
  445.         ld a,(flags);(LL6235)
  446.         and #14
  447.         ld (flags),a;(LL6235),a
  448.         ld a,(action);(LL6087)
  449.         bit 3,a ;8 = не выполнять строку Р
  450.         jr nz,_LL5f43
  451.         ld e,'P';#50 ;P - строка для вызова внутренних команд (одна в тексте)
  452.         call LL609c ;поиск первой строки типа e в menutext?
  453.         ld ix,MENU;LL622b
  454.         call nz,LL5db2 ;run (p_com+exebat)
  455.         ret c ;error
  456. _LL5f43 ld a,(flags);(LL6235)
  457.         and #1f
  458.         ld (flags),a;(LL6235),a
  459.         ld ix,MENU;LL622b
  460.         call cycleinmenu;LL60ca
  461.         jr c,LL5fc2 ;выполнить строку 'T'
  462.         call LL5fb4 ;поиск строки типа 'A' номер cursory в тексте menutext? ;out: z="(hl)==#03" (конец текста?) или error?
  463.         ld e,'Z';#5a ;Z - строка для вызова внутренних команд
  464.         call LL60a1 ;поиск строки типа e номер d в тексте hl? ;out: z="(hl)==#03" (конец текста?) или error?
  465.         call nz,LL5db2 ;run (p_com+exebat)
  466.         ret c
  467.         ld a,(flags);(LL6235)
  468.         res 5,a
  469.         ld (flags),a;(LL6235),a
  470.         ld a,(action);(LL6087)
  471.         bit 1,a ;2 = выполнить соответстующую командную строку Z и вернуться снова в меню
  472.         jr nz,_LL5f43 ;???
  473.         call LL5fb4 ;поиск строки типа 'A' номер cursory в тексте menutext? ;out: z="(hl)==#03" (конец текста?) или error?
  474.         ld e,'C';#43 ;C или c - строки для вызова командных строк (C - стандартный вызов, с - вызов строки через SHELL ( для больших программ ( например редактора, т.е. для программ у которых адрес загрузки меньше 25000) и пакетов)
  475.         call LL60a1 ;поиск строки типа e номер d в тексте hl? ;out: z="(hl)==#03" (конец текста?) или error?
  476.         ret z ;z=не найдено
  477.         push af
  478.         dec hl
  479.         ld a,'c';#63
  480.         inc hl
  481.         cp (hl)
  482.         jr nz,_LL5f84
  483.         xor a
  484.         ld (LL5fc1),a ;0=надо вызвать bat или большую программу?
  485. _LL5f84 pop af
  486. LL5f85  ret z
  487.         ld a,'*';#2a ;подставлять имя файла в конце комстроки (не документировано!!!)
  488.         cp (hl)
  489.         jr nz,LL5fa5
  490. ;берём файл под курсором
  491.        if NEDOOS
  492. ;брать из второго параметра комстроки: menu.com menu.mnu filename.ext
  493.         ld de,(par2addr)
  494.        else
  495.         ld c,#8a ;138(8A):g_curs - Возвращает параметры панельного курсора. Выход: A=E'= номер файла, D'= позиция Y в окне (=H для wtpos), B' - номер текущей панели (0 - левая, 1 - правая), HL' - адрес вектора окна панели
  496.         rst #10
  497.         ld e,a
  498.         ld c,#27 ;39(27):gname  - Возвращает описатель  файла, не  открывая его  на входе в рег.Е - номер файла. Выход: если O.K., то HL' - адрес описателя файла в электронном диске
  499.         rst #10
  500.         ret c
  501.        endif
  502.         push hl ;адрес '*'?
  503.         call findCR;LL61a1
  504.         dec hl
  505.         ld (hl),#20 ;вместо CR
  506.         inc hl
  507.        if NEDOOS
  508.         ex de,hl
  509.         call strcopy
  510.        else
  511.         exx
  512.         push hl ;адрес описателя файла в электронном диске
  513.         exx
  514.         pop de ;адрес описателя файла в электронном диске
  515.         exd  ;hl=адрес описателя файла в электронном диске
  516.         ld c,#4f ;79(4F):convr  - Преобразует  11-байтовый описатель  имени и расширения файла (в HL), в 13-байтовое имя файла с расширением через точку и с "13" в конце (в DE). На выходе DE' - адрес #0D
  517.         rst #10
  518.        endif
  519.         pop hl ;адрес '*'?
  520.         inc hl ;hl=адрес комстроки типа "command bla-bla filename.ext"
  521. LL5fa5  pop bc
  522.        if NEDOOS
  523.        jp LL5dac ;run (p_com+exebat),okquit
  524.        else
  525.         ld a,(LL5fc1)
  526.         or a
  527.         jp nz,LL5dac ;run (p_com+exebat),okquit
  528. ;вызвать bat или большую программу?
  529.         ld c,#49 ;73(49):p_com  - Заполнить  внутренний  буфер командной строки. HL = адрес строки, оканчивающейся кодом 13. При длине строки более 128 символов возвращает ошибку (флаг C).
  530.         rst #10
  531.         xor a
  532.         ld c,#93 ;147(93):shexe  - Выход в оболочку с запуском RST exebat(#44) с A=0
  533.         rst #10
  534.        endif
  535.  
  536. LL5fb4 ;поиск строки типа 'A' номер cursory в тексте menutext? ;out: z="(hl)==#03" (конец текста?) или error?
  537.         ld a,(cursory);(LL6234)
  538.         ld d,a
  539.         ld e,'A';#41
  540.         call LL609e ;поиск строки типа e номер d в тексте menutext? ;out: z="(hl)==#03" (конец текста?) или error?
  541.         dec hl
  542.         ld d,#01
  543.         ret ;z=не найдено
  544.  
  545. LL5fc1  nop   ;0=надо вызвать bat или большую программу, 1=надо вызвать exe?
  546.  
  547. LL5fc2  ld e,'T';#54 ;C/c,T - строки для вызова командных строк (T - должна стоять командная строка, вызываемая при отказе (SS + A)
  548.         call LL609c ;поиск первой строки типа e в menutext?
  549.         jr LL5f85 ;там ret z и проверка на '*'...
  550.  
  551. interpret_keys_hl;LL5fc9
  552. ;hl=строка ключей типа /A1/K40/J5/C160/O21
  553.         ld a,'/';#2f
  554.         cp (hl)
  555.         ret nz
  556.         inc hl
  557.         ld b,(hl)
  558.         push bc ;b=тип ключа
  559.         inc hl
  560.         push hl ;hl=начало числа в ключе
  561.         xor a
  562.         ld b,a
  563. LL5fd4  ld a,#20
  564.         cp (hl)
  565.         jr z,_LL5fe7
  566.         ld a,'/';#2f
  567.         cp (hl)
  568.         jr z,_LL5fe7
  569.         ld a,#0d
  570.         cp (hl)
  571.         jr z,_LL5fe7
  572.         inc hl
  573.         inc b
  574.         jr LL5fd4
  575. _LL5fe7 pop de ;de=начало числа в ключе
  576.         push hl ;hl=строка ключей типа /A1/K40/J5/C160/O21 - после числа
  577.         exd   ;hl=начало числа в ключе
  578.         ld a,b ;длина буфера
  579.         ld b,#00
  580.        if NEDOOS
  581.         call sa_d
  582.        else
  583.         ld c,#7d ;125(7D):a_d   - преобразование строки ASCII-символов в 4-байтовое число. Ведущие пробелы игнорируются. HL - адрес  ASCII - буфера, А - длина буфера ( если А=0, то до кода 13 ), В - основание системы счисления по умолчанию (не более 16, B=0 понимается как 10). Система счисления может также определяться по первому символу буфера: #,h,H - 16; .,d - 10; o,O - 8; %,b,B - 2. Выход: 32-разрядное число в DE'HL'. BC' - продолжение ASCII-буфера. Возможные ошибки (флаг C): нецифровой символ (A=0), переполнение (A=1)
  584.         rst #10
  585.        endif
  586.         exx
  587.         ld b,l ;result
  588.         pop de ;de=строка ключей типа /A1/K40/J5/C160/O21
  589.         ld hl,LL5ffd
  590.         pop af ;a=тип ключа
  591.        if NEDOOS
  592.         call sanaly
  593.        else
  594.         ld c,#7e ;126(7E):analys - Передача управления подпрограмме по адресу из таблицы. HL - aдрес таблицы, А - код команды. Таблица состоит из  записей по 3 байта: 0(1) код команды, 1(2) адрес процедуры. В последней записи должен лежать байт #FF и адрес отработки ситуации "код не найден"
  595.         rst #10 ;(в de'hl' мы передали числовой параметр для этого ключа)
  596.        endif
  597.         exd
  598. ;hl=строка ключей типа /A1/K40/J5/C160/O21
  599.         jr interpret_keys_hl;LL5fc9 ;продолжаем разбор ключей
  600.  
  601. ;    Cписок ключей:
  602. ; А - значения : 0 - по умолчаеию;
  603. ;          1 - окно меню с тенью;
  604. ;          2 - выполнить соответстующую
  605. ;            командную строку Z и
  606. ;            вернуться снова в меню;
  607. ;          4 - окно меню с 2-ой рамкой;
  608. ;          8 - не выполнять строку Р;
  609. ;         xx - суммарное действие,
  610. ;             например : 1+4=5 xx=5 .
  611. ; B - значения :16 - по умолчанию;
  612. ;               4 - короткий курсор;
  613. ;               16- подсказка без рамки;
  614. ;               xx - суммарное действие.
  615. ; E - координата x меню
  616. ;     (по умолчанию центровка по X);
  617. ; D - координата Y меню
  618. ;     (по умолчанию центровка по Y);
  619. ; F - положение курсора в меню
  620. ;    (по умолчанию в первой строке меню);
  621. ; J - цвет курсора меню
  622. ;      (по умолчанию %00111001 );
  623. ; T - цвет тени (по умолчанию 0 );
  624. ; K - цвет меню (по умолчанию %00001111);
  625. ; O - цвет курсора при выходе из меню
  626. ;          (по умолчанию %00100000 );
  627. ; G - Y подсказки (по умолчанию 0  );
  628. ; I - цвет подсказки
  629. ;     (по умолчанию  %00001111 );
  630. ; H - X подсказки (по умолчанию 0 );
  631. ; N - высота подсказки (по умолчанию 1 );
  632. ; C - длина подсказки (по умолчанию 32 ).
  633.  
  634. LL5ffd  DB 'A';#41
  635.         dw setkey_action;LL6041
  636.         db 'B';#42
  637.         dw setkey_flags;LL6046
  638.         db 'C';#43
  639.         dw setkey_hintwid;LL604b
  640.         DB 'D';#44
  641.         dw setkey_menuy;LL6050
  642.         db 'E';#45
  643.         dw setkey_menux;LL6055
  644.         db 'F';#46
  645.         dw setkey_cursory;LL605a
  646.         db 'G';#47
  647.         dw setkey_hinty;LL605f
  648.         db 'H';#48
  649.         dw setkey_hintx;LL6064
  650.         DB 'I';#49
  651.         dw setkey_hintcolor;LL6069
  652.         db 'J';#4a
  653.         dw setkey_cursorcolor;LL606e
  654.         db 'K';#4b
  655.         dw setkey_menucolor;LL6073
  656.          db 'L';#4c
  657.          dw LL6078
  658.          db 'M';#4d
  659.          dw LL607d
  660.         db 'N';#4e
  661.         dw setkey_hinthgt;LL6082
  662.         db 'O';#4f
  663.         dw setkey_exitcursorcolor;LL603c
  664.         db 'T';#54
  665.         dw setkey_shadowcolor;LL6030
  666.         DB #ff
  667.         dw reter;LL6045
  668.  
  669. setkey_shadowcolor;LL6030
  670.         ld a,b
  671.         and #07
  672.         ld b,a
  673.         add a,a
  674.         add a,a
  675.         add a,a
  676.         or b
  677.         ld (shadowcolor),a;(LL6230),a
  678.         ret
  679. setkey_exitcursorcolor;LL603c
  680.         ld a,b
  681.         ld (exitcursorcolor),a;(LL6239),a
  682.         ret
  683. setkey_action;LL6041
  684.         ld a,b
  685.         ld (action),a;(LL6087),a
  686. reter;LL6045
  687.         ret
  688. setkey_flags;LL6046
  689.         ld a,b
  690.         ld (flags),a;(LL6235),a
  691.         ret
  692. setkey_hintwid;LL604b
  693.         ld a,b
  694.         ld (hintwid),a;(LL6224),a
  695.         ret
  696. setkey_menuy;LL6050
  697.         ld a,b
  698.         ld (menuy),a;(LL622c),a
  699.         ret
  700. setkey_menux;LL6055
  701.         ld a,b
  702.         ld (menux),a;(LL622b),a
  703.         ret
  704. setkey_cursory;LL605a
  705.         ld a,b
  706.         ld (cursory),a;(LL6234),a
  707.         ret
  708. setkey_hinty;LL605f
  709.         ld a,b
  710.         ld (hinty),a;(LL621e),a
  711.         ret
  712. setkey_hintx;LL6064
  713.         ld a,b
  714.         ld (hintx),a;(LL621d),a
  715.         ret
  716. setkey_hintcolor;LL6069
  717.         ld a,b
  718.         ld (hintcolor),a;(LL6221),a
  719.         ret
  720. setkey_cursorcolor;LL606e
  721.         ld a,b
  722.         ld (cursorcolor),a;(LL6233),a
  723.         ret
  724. setkey_menucolor;LL6073
  725.         ld a,b
  726.         ld (menucolor),a;(LL622f),a
  727.         ret
  728. LL6078
  729.         ld a,b
  730.         ld (LL6236),a
  731.         ret
  732. LL607d
  733.         ld a,b
  734.         ld (LL6225),a
  735.         ret
  736. setkey_hinthgt;LL6082
  737.         ld a,b
  738.         ld (hinthgt),a;(LL621f),a
  739.         ret
  740.  
  741. action;LL6087
  742.         DB #00
  743.  
  744.        if NEDOOS
  745. ;mainmenupath;LL6088
  746.         ;db "menu",0
  747.        else
  748. mainmenupath;LL6088
  749.         ;db #53,#3a,#53,#48,#45,#4c,#4c
  750.         ;DB #5c,#0d,#6d,#65,#6e,#75,#20,#20
  751.         ;DB #20,#20,#74,#78,#74
  752.         db "S:SHELL",'\\',13
  753.        endif
  754. mainmenufilename;LL6091
  755.        if NEDOOS
  756.         db "menu/menu.mnu",0
  757.         ;db "menu/resident.mnu",0
  758.        else
  759.         db "menu    txt"
  760.        endif
  761.  
  762. LL609c
  763. ;e=тип строки
  764.         ld d,#01 ;db 0x16,0x01
  765. LL609e  ld hl,menutext;LL623a ;поиск строки типа e номер d в тексте menutext? ;out: z="(hl)==#03" (конец текста?) или error?
  766. LL60a1  jp LL6179 ;поиск строки типа e номер d в тексте hl?
  767. ;z="(hl)==#03" (конец текста?) или error?
  768.  
  769. LL60a4 ;перепечатка окна?
  770.         ld a,(ix+MENU_flags);#0a)
  771.         bit 5,a
  772.         ret nz
  773.         set 5,a
  774.         ld (ix+MENU_flags),a;(ix+#0a),a
  775.         ld a,(ix+MENU_flags);#0a)
  776.         call LL6153 ;goto next menu
  777.         ld b,a
  778.         ld a,(hintspresent);LL6226)
  779.         or a
  780.         jr z,LL60c7 ;no hints ;goto next menu
  781.         ld a,(flags);(LL6235)
  782.         bit 4,a ;16 = подсказка без рамки
  783.         jr nz,_LL60c4
  784.         xor a
  785. _LL60c4
  786.        if NEDOOS
  787.        if PRSTDIO
  788.         call prwin
  789.        else
  790.         call sR_WT ;Вывод окна (без текста). Подфункция в рег. A: A=0 окно с одинарной рамкой, А=1 без рамки, А=2 с двойной рамкой, A=3..127 без рамки, A=128..255 только подкраска. IX= вектор окна
  791.        endif
  792.        else
  793.         ld c,#61 ;97(61):wt    - Вывод окна. Подфункция в рег. A: A=0 окно с одинарной рамкой, А=1 без рамки, А=2 с двойной рамкой, A=3..127 без рамки, A=128..255 только подкраска. IX= вектор окна
  794.         rst #10
  795.        endif
  796. LL60c7  jp LL6153 ;goto next menu
  797.  
  798. cycleinmenu;LL60ca
  799.         call LL6165 ;печать текста в окне
  800.         call LL6115
  801.         call LL60a4 ;вывод окна подсказки
  802.         call LL613d
  803.        if NEDOOS
  804.        push ix
  805.        if PRSTDIO
  806.         call yieldgetkeyloop;getkey
  807.        else
  808.         YIELDGETKEYLOOP;OS_GETKEY
  809.        endif
  810.        pop ix
  811.        else
  812.         ld c,#07 ;7(07):ttyin  - Ввод символа. Выход: A - код нажатой клавиши
  813.         rst #10
  814.        endif
  815.         push af
  816.         ld b,(ix+MENU_menucolor);#04)
  817.         call printcursor;LL612d
  818.         pop af
  819.         ld hl,tkeyhandlers;LL60eb
  820.        if NEDOOS
  821.         call sanaly
  822.        else
  823.          ld c,#7e ;126(7E):analys - Передача управления подпрограмме по адресу из таблицы. HL - aдрес таблицы, А - код команды. Таблица состоит из  записей по 3 байта: 0(1) код команды, 1(2) адрес процедуры. В последней записи должен лежать байт #FF и адрес отработки ситуации "код не найден"
  824.          rst #10
  825.        endif
  826.          ret nz
  827.          ret c
  828.         jr cycleinmenu;LL60ca
  829.  
  830. tkeyhandlers;LL60eb
  831.         DB #0d
  832.         dw handle_enter;LL61a8
  833.         db key_left;#09
  834.         dw handle_left;LL61bb
  835.         db key_up;#0b
  836.         dw handle_up;LL61d3
  837.         db key_down;#0a
  838.         dw handle_down;LL61fc
  839.         db key_right;#08
  840.         dw handle_right;LL61c9
  841.         db 'q';#71
  842.         dw handle_up;LL61d3
  843.         db 'a';#61
  844.         dw handle_down;LL61fc
  845.         db 'p';#70
  846.         dw handle_right;LL61c9
  847.         DB 'o';#6f
  848.         dw handle_left;LL61bb
  849.         db key_end;'A';#41
  850.         dw handle_end;LL61d9
  851.         db key_home;'Q';#51
  852.         dw handle_home;LL6205
  853.         DB key_esc;#10
  854.         dw xorascf;LL6112
  855.         db #ff
  856.         dw xora;LL61f6 ;xor a:ret
  857.  
  858. xorascf;LL6112
  859.         xor a
  860.         scf
  861.         ret
  862.  
  863. LL6115
  864.         ld d,(ix+MENU_cursory);#09)
  865.         ld e,'A';#41
  866.         call LL615d ;hl=ix+15
  867.         call LL6179 ;поиск строки типа 'A' номер d в тексте hl?
  868.         jp z,LL61f8 ;(hl)=#03 (конец текста?) или error? ;handle_down+jp LL6115
  869.         dec hl
  870.         ld a,(hl)
  871.         cp 'a';#61
  872.         jp z,LL61f8 ;handle_down+jp LL6115 ;'a' = строки меню, по которым не ходит курсор
  873.         ld b,(ix+MENU_cursorcolor);#08)
  874. ;b=color
  875. printcursor;LL612d
  876.         ld a,(flags);(LL6235)
  877.         bit 2,a ;4 = короткий курсор
  878.         ld a,(ix+MENU_cursory);#09)
  879.        if NEDOOS
  880.       if PRSTDIO
  881.        push af
  882.         ld a,b
  883.         call setcolor_a ;keep ix
  884.        pop af
  885.         ld e,(ix+MENU_menux)
  886.         ld b,(ix+MENU_menuwid_chrs)
  887.         jr z,$+5
  888.          inc e ;короткий курсор
  889.          dec b
  890.          dec b
  891.         push ix
  892.         push bc ;b=cursorwid
  893.         add a,(ix+MENU_menuy)
  894.         ld d,a
  895.         call setxy
  896.         call setcolor_invisible
  897.         ld a,' '
  898. ;printcursor_wid=$+1
  899.         pop bc ;ld b,0
  900. ;a=symbol
  901. ;b=count
  902.         call prNsymbol
  903.         call setcolor_visible
  904.         pop ix
  905.       else
  906.         jr z,_LL6138
  907.         call sAWTC ;100(64):awtc  - Подкрашивает строку внутри окна, не затрагивая рамку, IX=вектор окна, A=номер строки, B=цвет
  908.         jr _LL6138q
  909. _LL6138
  910.         call sAWT ;99(63):awt   - Подкрашивает строку внутри окна, c рамкой. Вход: IX = адрес вектора окна, A = номер строки, которую необходимо подсветить (нумерация от 1), B = цвет
  911. _LL6138q
  912.       endif
  913.        else
  914.         ld c,#63 ;99(63):awt   - Подкрашивает строку внутри окна, c рамкой. Вход: IX = адрес вектора окна, A = номер строки, которую необходимо подсветить (нумерация от 1), B = цвет
  915.         jr z,_LL6138
  916.         ld c,#64 ;100(64):awtc  - Подкрашивает строку внутри окна, не затрагивая рамку, IX=вектор окна, A=номер строки, B=цвет
  917. _LL6138 ;ld a,(ix+MENU_cursory);#09)
  918.         rst #10
  919.        endif
  920.         ret
  921.  
  922. LL613d  call LL5fb4 ;поиск строки типа 'A' номер cursory в тексте menutext? ;out: z="(hl)==#03" (конец текста?) или error?
  923.         ld e,'H';#48 ;H - должен стоять текст ,который появляется в cтроке подсказке
  924.         call LL60a1 ;поиск строки типа e номер d в тексте hl? ;out: z="(hl)==#03" (конец текста?) или error?
  925.         ret z ;z=не найдено
  926.         call LL6153 ;goto next menu
  927.         ld b,#01
  928.         ld a,(ix+MENU_menuhgt);#02)
  929.         srl a ;???
  930.        if NEDOOS
  931.         push af
  932.         push bc
  933.         push hl
  934.         call setmenucolor
  935.         pop hl
  936.         pop bc
  937.         pop af
  938.         call sLWT
  939.        else
  940.         ld c,#65 ;101(65):lwt   - Распечатка заданного количества строк в окне; A - номер строки (начала), IX - вектор окна, HL - адрес строк текста для печати, B - количество строк, которое необходимо распечатать
  941.         rst #10
  942.        endif
  943. ;goto next menu
  944. LL6153
  945.         ld e,(ix+MENU_nextmenuaddr);#0c)
  946.         ld d,(ix+MENU_nextmenuaddr+1);#0d)
  947.         push de
  948.         pop ix
  949.         ret
  950.  
  951. LL615d ;hl=ix+15
  952.         push ix
  953.         pop hl
  954.         ld bc,LL000f
  955.         add hl,bc
  956.         ret
  957.  
  958. ;печать текста в окне
  959. LL6165
  960.         ld d,#01
  961.         ld e,'A';#41
  962. LL6169  call LL615d ;hl=ix+15
  963.         call LL6179 ;поиск строки типа 'A' номер d в тексте hl?
  964.         ret z ;(hl)=#03 (конец текста?) или error?
  965.         ld a,d
  966.         ld b,#01
  967.        if NEDOOS
  968.        push de
  969.         push af
  970.         push bc
  971.         push hl
  972.         call setmenucolor
  973.         pop hl
  974.         pop bc
  975.         pop af
  976.         call sLWT ;101(65):lwt   - Распечатка заданного количества строк в окне; A - номер строки (начала), IX - вектор окна, HL - адрес строк текста для печати, B - количество строк, которое необходимо распечатать
  977.        pop de
  978.        else
  979.         ld c,#65 ;101(65):lwt   - Распечатка заданного количества строк в окне; A - номер строки (начала), IX - вектор окна, HL - адрес строк текста для печати, B - количество строк, которое необходимо распечатать
  980.         rst #10
  981.        endif
  982.         inc d
  983.         jr LL6169
  984.  
  985. LL6179
  986. ;поиск строки типа 'A' номер d в тексте hl?
  987. ;hl=text
  988. ;d=y?
  989. ;e='A'?
  990. ;out: hl, z=error?
  991.         push af
  992.         ld b,#00
  993. LL617c  pop af
  994.         call LL6191
  995.         ret z ;(hl)=#03 (конец текста?) или error?
  996.         inc b
  997.         push hl
  998.         call findCR;LL61a1
  999.         ld a,b
  1000.         cp d
  1001.         jr nz,LL617c
  1002.         pop hl
  1003.         inc hl
  1004.         ld a,#fe
  1005.         sub c
  1006.         or a ;z="в предыдущей строке CR найден в первой же позиции (предыдущая строка пустая)"???
  1007.         ret
  1008.  
  1009. ;e=?
  1010. LL6191  ld a,(hl)
  1011.         cp #03
  1012.         ret z ;конец текста?
  1013.         res 5,a
  1014.         cp e
  1015.         jr z,LL619f ;строка нужного типа
  1016.         call findCR;LL61a1
  1017.         jr LL6191
  1018. LL619f  or a
  1019.         ret
  1020.  
  1021. findCR;LL61a1
  1022.         ld c,#ff
  1023.         ld a,#0d
  1024.         cpir
  1025.         ret
  1026.  
  1027. handle_enter;LL61a8
  1028.         ld a,#01
  1029.         or a
  1030. LL61ab  push af
  1031.         ld a,(ix+MENU_flags);#0a)
  1032.         bit 0,a
  1033.         jr nz,_LL61b9
  1034.         ld b,(ix+MENU_exitcursorcolor);#0e)
  1035.         call printcursor;LL612d
  1036. _LL61b9 pop af
  1037.         ret
  1038.  
  1039. handle_left;LL61bb
  1040.         ld a,(ix+MENU_flags);#0a)
  1041.         bit 3,a
  1042.         ret z
  1043.         set 6,a
  1044. LL61c3  ld (ix+MENU_flags),a;(ix+#0a),a
  1045.         scf
  1046.         jr LL61ab
  1047.  
  1048. handle_right;LL61c9
  1049.         ld a,(ix+MENU_flags);#0a)
  1050.         bit 3,a
  1051.         ret z
  1052.         set 7,a
  1053.         jr LL61c3
  1054.  
  1055. handle_up;LL61d3
  1056.         ld a,(ix+MENU_cursory);#09)
  1057.         dec a
  1058.         jr nz,LL61de
  1059. handle_end;LL61d9
  1060.         ld a,(ix+MENU_menuhgt);#02)
  1061.         dec a
  1062.         dec a
  1063. LL61de  ld (ix+MENU_cursory),a;(ix+#09),a
  1064.         ld d,a
  1065.         ld e,'A';#41
  1066.         call LL615d ;hl=ix+15
  1067.         call LL6179 ;поиск строки типа 'A' номер d в тексте hl?
  1068.         jr z,handle_up;LL61d3 ;(hl)=#03 (конец текста?)
  1069.         dec hl
  1070.         ld a,(hl)
  1071.         cp 'a';#61
  1072.         jr z,handle_up;LL61d3 ;'a' = строки меню, по которым не ходит курсор
  1073.         ld a,d
  1074. LL61f3  ld (ix+MENU_cursory),a;(ix+#09),a
  1075. xora;LL61f6
  1076.         xor a
  1077.         ret
  1078.  
  1079. LL61f8  ld hl,LL6115
  1080.         push hl
  1081. handle_down;LL61fc
  1082.         ld a,(ix+MENU_cursory);#09)
  1083. _LL61ff inc a
  1084.         cp (ix+MENU_menuhgt);#02)
  1085.         jr nz,LL61f3
  1086. handle_home;LL6205
  1087.         xor a
  1088.         jr _LL61ff
  1089.  
  1090.         include "twind.asm" ;sR_WT
  1091.         include "wtro.asm"
  1092.        if !PRSTDIO
  1093.         include "ttyp42.asm"
  1094. sATB42
  1095.         incbin "Font42_f.cod"
  1096.        endif
  1097.  
  1098. ;исходник не найден, пишем по догадке
  1099. ;126(7E):analys - Передача управления подпрограмме по адресу из таблицы. HL - aдрес таблицы, А - код команды. Таблица состоит из  записей по 3 байта: 0(1) код команды, 1(2) адрес процедуры. В последней записи должен лежать байт #FF и адрес отработки ситуации "код не найден" (возвращает NZ?)
  1100. sanaly
  1101.         inc (hl)
  1102.         jr z,sanaly_err
  1103.         dec (hl)
  1104.         cp (hl)
  1105.         jr z,sanaly_ok
  1106.         inc hl
  1107.         inc hl
  1108.         inc hl
  1109.         jr sanaly
  1110. sanaly_err
  1111.         dec (hl) ;NZ
  1112. sanaly_ok
  1113.         inc hl
  1114.         ld a,(hl)
  1115.         inc hl
  1116.         ld h,(hl)
  1117.         ld l,a
  1118.         jp (hl)
  1119.  
  1120. sPRCHR
  1121. ;a=chr
  1122. ;in,out: de'=print addr
  1123.        if PRSTDIO
  1124.         push bc
  1125.         push de
  1126.         push hl
  1127.          push ix
  1128.         call sendchar
  1129.          pop ix
  1130.         pop hl
  1131.         pop de
  1132.         pop bc
  1133.         ret
  1134.        else
  1135.         jp sTYP42
  1136.        endif
  1137. sPRAD
  1138. ;b=y
  1139. ;out: de'=print addr, does exx
  1140.        if PRSTDIO
  1141.         exx
  1142.         push bc
  1143.         push de
  1144.         push hl
  1145.          push ix
  1146.         exx
  1147.         ld d,b
  1148.         ld e,c
  1149.         call setxy
  1150.          pop ix
  1151.         pop hl
  1152.         pop de
  1153.         pop bc
  1154.         ret
  1155.        else
  1156.         jp sADR42
  1157.        endif
  1158.  
  1159. ;исходник не найден, пишем по догадке
  1160. ;125(7D):a_d   - преобразование строки ASCII-символов в 4-байтовое число. Ведущие пробелы игнорируются. HL - адрес  ASCII - буфера, А - длина буфера ( если А=0, то до кода 13 ), В - основание системы счисления по умолчанию (не более 16, B=0 понимается как 10). Система счисления может также определяться по первому символу буфера: #,h,H - 16; .,d - 10; o,O - 8; %,b,B - 2. Выход: 32-разрядное число в DE'HL'. BC' - продолжение ASCII-буфера. Возможные ошибки (флаг C): нецифровой символ (A=0), переполнение (A=1)
  1161. sa_d
  1162. ;dec only
  1163. ;no overflow
  1164. ;no leading spaces
  1165.         exx
  1166.         ld hl,0
  1167.         ld d,h
  1168.         ld e,l
  1169.         exx
  1170.         ld b,a ;длина буфера
  1171. sa_d_loop
  1172.         ld a,(hl)
  1173.         inc hl
  1174.         sub '0'
  1175.         cp 10
  1176.         ccf
  1177.         jr c,sa_d_loopq
  1178.         exx
  1179.         call sa_d_mul10
  1180.         add a,l
  1181.         ld l,a
  1182.         ld a,h
  1183.         adc a,0
  1184.         ld h,a
  1185.         jr nc,$+3
  1186.         inc de
  1187.         exx
  1188.         djnz sa_d_loop
  1189.        or a ;ok
  1190. sa_d_loopq
  1191.        push hl
  1192.        exx
  1193.        pop bc
  1194.        exx
  1195.         ret
  1196.  
  1197. ;de'hl'
  1198. sa_d_mul10
  1199.         ld b,h
  1200.         ld c,l
  1201.        push de
  1202.         add hl,hl
  1203.         rl e
  1204.         rl d ;*2
  1205.         add hl,hl
  1206.         rl e
  1207.         rl d ;*4
  1208.         add hl,bc
  1209.        ex de,hl
  1210.        pop bc
  1211.        adc hl,bc
  1212.        ex de,hl ;*5
  1213.         add hl,hl
  1214.         rl e
  1215.         rl d ;*10
  1216.         ret
  1217.  
  1218. skipword
  1219. ;hl=string
  1220. ;out: hl=terminator/space addr
  1221. getword0
  1222.         ld a,(hl)
  1223.         or a
  1224.         ret z
  1225.         cp ' '
  1226.         ret z
  1227.         inc hl
  1228.         jr getword0
  1229.  
  1230. skipspaces
  1231. ;hl=string
  1232. ;out: hl=after last space
  1233.         ld a,(hl)
  1234.         cp ' '
  1235.         ret nz
  1236.         inc hl
  1237.         jr skipspaces
  1238.  
  1239. strcopy
  1240. ;hl->de
  1241. ;out: hl,de after terminator
  1242.         xor a
  1243. strcopy0
  1244.         cp (hl)
  1245.         ldi
  1246.         jr nz,strcopy0
  1247.         ret
  1248.  
  1249. keepdir
  1250.         ld de,curdir
  1251.         OS_GETPATH
  1252.         ret
  1253. setolddir
  1254.         ld de,curdir
  1255.         OS_CHDIR
  1256.         ret
  1257.  
  1258. loadandrun
  1259. ;hl=rest of command line
  1260. ;out: nz=error, e=id
  1261. ;load file in fcb from system current dir with parameters in tcmd, then set curpaneldir and run
  1262.         ld (loadandrun_restcmd),hl
  1263.         ld de,cmd_filename
  1264.         OS_OPENHANDLE
  1265.         or a
  1266.         ret nz ;error
  1267.         ld a,b
  1268.         ld (curhandle),a
  1269.         ld hl,nv_closehandle
  1270.         push hl
  1271.         ;set current drive and dir (will be copied into new app)
  1272.         call setolddir
  1273.  
  1274.         OS_NEWAPP
  1275.         or a
  1276.         ret nz ;error
  1277. ;dehl=номера страниц в 0000,4000,8000,c000 нового приложения, b=id, a=error
  1278.         push bc ;b=id
  1279.         ld a,d
  1280.         SETPGC000
  1281.         push de
  1282.         push hl
  1283.         ld hl,filenametext
  1284.         ld de,0xc000+COMMANDLINE
  1285.         ld bc,4
  1286.         ldir
  1287. loadandrun_restcmd=$+1
  1288.         ld hl,0
  1289.         call strcopy
  1290.         xor a
  1291.         ld (0xc000+COMMANDLINE+COMMANDLINE_sz-1),a
  1292.         pop hl
  1293.         pop de
  1294.  
  1295.         call readfile_pages_dehl
  1296.  
  1297.         pop de
  1298.         ld e,d ;e=id
  1299. ;run "cmd <commandline>"
  1300.         push de
  1301.         OS_RUNAPP
  1302.         pop de
  1303.         xor a
  1304.         ret ;z
  1305.  
  1306. readfile_pages_dehl
  1307.         ld a,d
  1308.         SETPGC000
  1309.         ld a,0xc100/256
  1310.         call cmd_loadpage
  1311.         ret nz
  1312.         ld a,e
  1313.         call cmd_loadfullpage
  1314.         ret nz
  1315.         ld a,h
  1316.         call cmd_loadfullpage
  1317.         ret nz
  1318.         ld a,l
  1319. cmd_loadfullpage
  1320.         SETPGC000
  1321.         ld a,0xc000/256
  1322. cmd_loadpage
  1323. ;out: a=error, bc=bytes read
  1324. ;keeps hl,de
  1325.         push de
  1326.         push hl
  1327.         ld d,a
  1328.         xor a
  1329.         ld l,a
  1330.         ld e,a
  1331.         sub d
  1332.         ld h,a ;de=buffer, hl=size
  1333.         call readcurhandle
  1334.         ld b,h
  1335.         ld c,l
  1336.         pop hl
  1337.         pop de
  1338.         or a
  1339.         ret
  1340.  
  1341. readcurhandle
  1342. curhandle=$+1
  1343.         ld b,0
  1344.         OS_READHANDLE
  1345.         ret
  1346.  
  1347. nv_closehandle
  1348. ;keep de and flags!!!
  1349.         push af
  1350.         push de
  1351.         ld a,(curhandle)
  1352.         ld b,a
  1353.         OS_CLOSEHANDLE
  1354.         pop de
  1355.         pop af
  1356.         ret
  1357.  
  1358.        if PRSTDIO
  1359.         include "../_sdk/stdio.asm"
  1360.  
  1361. setmenucolor
  1362.         ld a,(ix+4) ;menucolor
  1363. setcolor_a
  1364.         ld e,a
  1365.         rra
  1366.         rra
  1367.         rra
  1368.         and 15
  1369.         ld d,a ;paper
  1370.         ld a,e
  1371.         and 7
  1372.         ld e,a ;ink
  1373.        push ix
  1374.         call setcolor ;in: D=paper0..7, E=ink0..15
  1375.        pop ix
  1376.         ret
  1377.  
  1378. prwin
  1379.         call setmenucolor
  1380.  
  1381.         ld e,(ix+MENU_menux) ;x
  1382.         ld d,(ix+MENU_menuy) ;y
  1383.         ld b,(ix+MENU_menuhgt) ;hgt
  1384.         ld c,(ix+MENU_menuwid_chrs) ;wid
  1385. ;de=yx
  1386. ;bc=hgt,wid
  1387. ;de=yx
  1388. ;bc=hgt,wid
  1389.         ld a,c
  1390.         sub 2
  1391.         ld (winbeginstroka_wid),a
  1392.         ld (winmidstroka_wid),a
  1393.         ld (winendstroka_wid),a
  1394.        ld a,b
  1395.        cp 2
  1396.        jr c,prwin_notopline
  1397.         ld hl,winbeginstroka
  1398.         call prtableline
  1399.         dec b
  1400. prwin_notopline
  1401.        ld a,b
  1402.        cp 2
  1403.        jr c,prwin_nobottomline
  1404.         push bc
  1405.         push de
  1406.         ld a,d
  1407.         add a,b
  1408.         ld d,a ;bottom y
  1409.         ld hl,winendstroka
  1410.         call prtableline
  1411.         pop de
  1412.         pop bc
  1413.         dec b
  1414.         inc d
  1415. prwin_nobottomline
  1416. winlineN_0
  1417.         ld hl,winmidstroka
  1418.         call prtableline
  1419.         inc d
  1420.         djnz winlineN_0
  1421.         ret
  1422. prtableline
  1423. ;hl=tableline data
  1424. ;de=yx
  1425. ;b=hgt
  1426. ;keeps bc,de,ix
  1427.         push bc
  1428.         call nv_setxy ;keeps de,hl
  1429. prtableline0
  1430.         ld a,(hl)
  1431.         or a
  1432.         jr z,prtablelineq
  1433.         inc hl
  1434.         ld b,(hl)
  1435.         inc hl
  1436.         call prNsymbol
  1437.         jr prtableline0
  1438. prtablelineq
  1439.         pop bc
  1440.         ret
  1441.  
  1442. prNsymbol
  1443. ;a=symbol
  1444. ;b=count
  1445.         push de
  1446.         push hl
  1447.         push ix
  1448.         ld c,a
  1449. prNsymbol0
  1450.         push bc
  1451.         ld a,c
  1452.         call sendchar
  1453.         pop bc
  1454.         djnz prNsymbol0
  1455.         pop ix
  1456.         pop hl
  1457.         pop de
  1458.         ret
  1459.  
  1460. nv_setxy
  1461. ;de=yx (kept)
  1462. ;keeps de,hl,ix
  1463.         push de
  1464.         push hl
  1465.         push ix
  1466.         call setxy
  1467.         pop ix
  1468.         pop hl
  1469.         pop de
  1470.         ret
  1471.  
  1472. winbeginstroka
  1473.         db 0xc9;'Ј'
  1474.         db 1
  1475.         db 0xcd;'='
  1476. winbeginstroka_wid=$
  1477.         db 12;wdtcolumn1
  1478.         db 0xbb;'ї'
  1479.         db 1
  1480.         db 0
  1481.  
  1482. winmidstroka
  1483.         db 0xba;'і'
  1484.         db 1
  1485.         db ' '
  1486. winmidstroka_wid=$
  1487.         db 12;wdtcolumn1
  1488.         db 0xba;'і'
  1489.         db 1
  1490.         db 0
  1491.  
  1492. winendstroka
  1493.         db 0xc8;'L'
  1494.         db 1
  1495.         db 0xcd;'='
  1496. winendstroka_wid=$
  1497.         db 12;wdtcolumn1
  1498.         db 0xbc;'-'
  1499.         db 1
  1500.         db 0
  1501.  
  1502.        if 0
  1503. prwindow_text
  1504.         ;ld a,1
  1505. ;prwindow_text0
  1506. ;hl = window text
  1507. ;out: ;de=YX of last line
  1508.         push hl ;text
  1509.  
  1510.         inc d
  1511.         inc e
  1512.         inc e
  1513.         call nv_setxy ;keeps de,hl,ix
  1514.        
  1515.         pop hl ;text
  1516. prwindow_waitkey_text0
  1517.         ld a,(hl)
  1518.         or a
  1519.         ret z
  1520.         ;dec a;cp 1
  1521.         ;jr z,prwindow_waitkey_textnfiles
  1522.         ;dec a;cp 2
  1523.         ;jr z,prwindow_waitkey_textoutertext
  1524.         ;dec a;cp 3
  1525.         ;jr z,prwindow_waitkey_textnextline
  1526.         push de
  1527.          ;ld c,0
  1528.         call prtext
  1529.         pop de
  1530.         jr prwindow_waitkey_text0
  1531.        if 0
  1532. prwindow_waitkey_textnfiles
  1533.         inc hl
  1534.         push de
  1535.         push hl
  1536.         call getmarkedfiles;countmarkedfiles
  1537.         call prdword
  1538.         pop hl
  1539.         pop de
  1540.         jr prwindow_waitkey_text0
  1541. prwindow_waitkey_textoutertext
  1542.         inc hl
  1543.         push de
  1544.         ld e,(hl)
  1545.         inc hl
  1546.         ld d,(hl)
  1547.         inc hl
  1548.         push hl
  1549.         ex de,hl
  1550.          ;ld c,0
  1551.         call prtext
  1552.         pop hl
  1553.         pop de
  1554.         jr prwindow_waitkey_text0
  1555. prwindow_waitkey_textnextline
  1556.         inc hl
  1557.         inc d
  1558.         call nv_setxy ;keeps de,hl,ix
  1559.         jr prwindow_waitkey_text0
  1560.        endif
  1561.        
  1562. prtext
  1563.         push hl
  1564.         call strlen ;hl=length
  1565.         pop de
  1566.         ld a,h
  1567.         or l
  1568. ;de=buf
  1569. ;hl=len
  1570.         push de
  1571.         push hl
  1572.         call nz,sendchars
  1573.         pop hl
  1574.         pop de
  1575.          add hl,de
  1576.          inc hl
  1577. ;hl=after terminator
  1578.         ret
  1579.  
  1580. strlen
  1581. ;hl=str
  1582. ;out: hl=length
  1583.         xor a
  1584.         ld b,a
  1585.         ld c,a ;чтобы точно найти терминатор
  1586.         cpir ;найдём обязательно, если длина=0, то bc=-1 и т.д.
  1587.         ld h,a
  1588.         ld l,a
  1589.         scf
  1590.         sbc hl,bc
  1591.         ret
  1592.        endif
  1593.         endif
  1594.  
  1595. cmd_filename
  1596.         db "cmd.com",0
  1597. filenametext
  1598.         db "cmd "
  1599.  
  1600. tdotmnuz
  1601.         db ".mnu",0
  1602.  
  1603. curdir
  1604.         ds MAXPATH_sz
  1605.  
  1606. par1addr
  1607.         dw 0
  1608. par2addr
  1609.         dw 0
  1610.  
  1611. ;???
  1612.         DB #55;'U'
  1613.         db "ABCDEFGHIJ";#41,#42,#43,#44,#45,#46,#47,#48,#49,#4a
  1614.         db "0123456789";#30,#31,#32,#33,#34,#35,#36,#37,#38,#39
  1615. HINTMENU
  1616. hintx;LL621d
  1617.         db #00
  1618. hinty;LL621e
  1619.         db #00
  1620. hinthgt;LL621f
  1621.         db #01
  1622. LL6220 ;hintwid_chrs?
  1623.         DB #20
  1624. hintcolor;LL6221
  1625.         db #0f,#ff
  1626. LL6223 ;hinthgt_chrs? из (ix+5) читается вроде атрибут shadowcolor
  1627.         db #01
  1628. hintwid;LL6224
  1629.         db #1e
  1630. LL6225
  1631.         db #00
  1632. hintspresent;LL6226
  1633.         db #00
  1634.         db #00
  1635.         DB #00
  1636.         dw MENU;#622b
  1637.  
  1638. MENU
  1639. MENU_menux=$-MENU
  1640. menux;LL622b
  1641.         db #ff
  1642. MENU_menuy=$-MENU
  1643. menuy;LL622c
  1644.         db #ff
  1645. MENU_menuhgt=$-MENU;2
  1646. menuhgt;LL622d
  1647.         db #00
  1648. MENU_menuwid_chrs=$-MENU
  1649. menuwid_chrs;LL622e
  1650.         db #00
  1651. MENU_menucolor=$-MENU;4
  1652. menucolor;LL622f
  1653.         db #0f
  1654. shadowcolor;LL6230
  1655.         DB #80
  1656. menux_chrs;LL6231
  1657.         db #00
  1658. ;MENU_menuwid=$-MENU;7
  1659. menuwid;LL6232
  1660.         db #00
  1661. MENU_cursorcolor=$-MENU;8
  1662. cursorcolor;LL6233
  1663.         db #39
  1664. MENU_cursory=$-MENU;9
  1665. cursory;LL6234
  1666.         db #01
  1667. MENU_flags=$-MENU;10
  1668. flags;LL6235
  1669. ;bit 0: не печатать курсор цветом exitcursorcolor по left, right, enter
  1670. ;bit 3: enable left, right
  1671. ;bit 5: LL60a4 already called (окно напечатано?)
  1672. ;bit 6: left pressed
  1673. ;bit 7: right pressed
  1674.         db #10
  1675. LL6236
  1676.         db #00 ;???
  1677. MENU_nextmenuaddr=$-MENU;12
  1678.         dw HINTMENU;#621d
  1679. MENU_exitcursorcolor=$-MENU;14
  1680. exitcursorcolor;LL6239
  1681.         db #20
  1682. ;menu size = 15?
  1683.  
  1684. menutext;LL623a
  1685. end
  1686.         savebin "menu.com",begin,end-begin
  1687.         LABELSLIST "../../us/user.l"
  1688.