?login_element?

Subversion Repositories NedoOS

Rev

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

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