?login_element?

Subversion Repositories NedoOS

Rev

Rev 1509 | Blame | Compare with Previous | Last modification | View Log | Download | RSS feed

  1.         DEVICE ZXSPECTRUM128
  2.         include "../_sdk/sys_h.asm"
  3. MAXCMDSZ=255
  4. txtscrhgt=25
  5. txtscrwid=80
  6.  
  7. STACK=0x8000 ;нельзя 0x0000, иначе не получится грузить через верхнее окно и переключать страницы программы и переменных
  8.  
  9. _COLOR=0x0007;7
  10. _ERRORCOLOR=0x0009;0x0007;0x42
  11. ;_CURSORCOLOR=0x0700;0x38
  12.  
  13. varmem=0x4000 ;строки (256 байт asciiz), числа (4 байта), параметры цикла (4+4(step)+4(to)+4(goto) байта), массивы (2 байта число элементов, элементы по 4 байта)
  14. progmem=0x8000 ;номер строки(ст,мл), длина строки(мл,ст без терминатора), строка(asciiz)
  15. szprogmem=0x8000
  16.  
  17. RUNMODE_PROG=1
  18. RUNMODE_INTERACTIVE=0
  19.  
  20.         org PROGSTART
  21.  
  22. cmd_begin
  23.         ld sp,STACK
  24.         call initstdio
  25.         OS_GETMAINPAGES
  26. ;dehl=номера страниц в 0000,4000,8000,c000
  27.         ld a,h
  28.         ld (pg32klow),a
  29.         ld a,l
  30.         ld (pg32khigh),a
  31.         ;OS_GETSCREENPAGES
  32. ;de=страницы 0-го экрана (d=старшая), hl=страницы 1-го экрана (h=старшая)
  33.         ;ld a,e
  34.         ;ld (setpgs_scr_low),a
  35.         ;ld a,d
  36.         ;ld (setpgs_scr_high),a
  37.  
  38.         ;ld e,6 ;textmode
  39.         ;OS_SETGFX
  40.        
  41.         ld hl,COMMANDLINE ;command line
  42.         call skipword
  43.         call skipspaces
  44.         ld a,(hl)
  45.         or a
  46.         jr z,noautoload ;Нет ключей и имени файла
  47. ;command line = "basic [-c] [-n] [-h] [-V] [file to load]" c - fast load as code file, n - no autorun, h - help, v - version
  48.         call cmd_line_parse
  49.         ld a,(cmd_line_h)
  50.         or a
  51.         jr nz,show_usage_info
  52.         ld a,(cmd_line_v)
  53.         or a
  54.         jr nz,show_version
  55.         ld a,(cmd_line_c)
  56.         or a
  57.         call z,cmd_load_text
  58.         ld a,(cmd_line_c)
  59.         cp 1
  60.         call z,cmd_load_hl
  61.         ld a,(cmd_line_n)
  62.         or a
  63.         jp z,cmd_run
  64. noautoload
  65.        
  66. mainloop
  67.         ld sp,STACK
  68.         ld a,6 ;textmode
  69. curgfx=$+1
  70.         cp 6
  71.         jr z,mainloop_noresetgfx
  72.         ld (curgfx),a
  73.         ;ld e,6 ;textmode
  74.         ld e,-1 ;disable gfx (out: e=old gfxmode)
  75.         OS_SETGFX
  76. mainloop_noresetgfx
  77.         ;call restorebasicpages
  78.  
  79.         ;ld (fail_sp),sp
  80.         call editcmd
  81.         call prcrlf
  82.  
  83.         ld a,RUNMODE_INTERACTIVE
  84.         ld (runmode),a
  85.         call add_or_run_line
  86.        
  87.         ld hl,cmdbuf
  88.         ld (hl),0
  89.         jp mainloop
  90.  
  91.  
  92. show_usage_info
  93.         ld hl,usage_info
  94.         call prtext
  95.         call prcrlf
  96.         jr cmd_quit
  97.  
  98. show_version
  99.         ld hl,VERSION
  100.         call prtext
  101.         jr cmd_quit
  102.  
  103. restorebasicpages
  104. pg32khigh=$+1
  105.         ld a,0
  106.         SETPG32KHIGH
  107. pg32klow=$+1
  108.         ld a,0
  109.         SETPG32KLOW
  110.         ret
  111.  
  112. skipword
  113. ;hl=string
  114. ;out: hl=terminator/space addr
  115. skipword0
  116.         ld a,(hl)
  117.         or a
  118.         ret z
  119.         cp ' '
  120.         ret z
  121.         inc hl
  122.         jr skipword0
  123.  
  124.        
  125. cmd_quit
  126.         QUIT
  127.  
  128. endofedit
  129.         ld hl,tendofprog
  130.         jr fail_or_ok
  131.        
  132. endofprog
  133.         ld hl,cmdbuf
  134.         ld (hl),0
  135.         ld hl,tendofprog
  136.         jr fail_or_ok
  137.        
  138. endbreak
  139.         ld hl,tendbreak
  140.         jr fail_or_ok
  141.  
  142. fail
  143.         ld hl,terror
  144. fail_or_ok
  145. ;fail_sp=$+1
  146.         ;ld sp,0
  147.         call prtext
  148.         call prcrlf
  149.         jr mainloop
  150.  
  151. fail_syntax
  152.         ld de,_ERRORCOLOR
  153.         SETCOLOR_
  154.     ld hl,fsyntax
  155.     call prtext
  156.     ld hl,wordbuf
  157.     call prtext
  158.     call prcrlf
  159.     jp mainloop
  160.  
  161. fail_fo
  162.         ld de,_ERRORCOLOR
  163.         SETCOLOR_
  164.     ld hl,fopenerror
  165.     call prtext
  166.     call prcrlf
  167.     jp mainloop
  168.  
  169.  
  170.  
  171.  
  172. VERSION db "Basic interpreter v0.11",0x0d,0x0a,"Nedopc group 2019",0x0d,0x0a,0
  173.  
  174. usage_info
  175.         db "Use basic.com [-c] [-h] [-n] [-V] [inputfile]",0x0d,0x0a
  176.         db "              -c : Input file in code format",0x0d,0x0a
  177.         db "              -h : Show this help",0x0d,0x0a
  178.         db "              -n : Do not autostart inputfile",0x0d,0x0a
  179.         db "              -V : Show version info and quit",0x0d,0x0a,0
  180.        
  181.  
  182. terror
  183.         db "Unknown error",0
  184.        
  185. fopenerror
  186.         db "File input/output error",0
  187. fsyntax
  188.         db "Syntax error near ",0
  189. tendofprog
  190.         db "O.K.",0
  191.        
  192. tendbreak
  193.         db "Break",0
  194.        
  195. findline
  196. ;ищет адрес строки с заданным номером или не меньше
  197. ;de=linenum
  198. ;out: hl=адрес строки или (progend)
  199.         ld hl,progmem
  200. findline_lines0
  201.         ld bc,(progend)
  202.         or a
  203.         sbc hl,bc
  204.         add hl,bc
  205.         ret z
  206.         ld a,(hl)
  207.         cp d
  208.         inc hl
  209.         jr z,findline_lines_HSBequal
  210.         jr c,findline_lines_less
  211. findline_OK
  212.         dec hl
  213.         ret
  214. findline_lines_HSBequal
  215.         ld a,(hl)
  216.         cp e
  217.         jr nc,findline_OK
  218. findline_lines_less
  219.         inc hl
  220.         ld c,(hl)
  221.         inc hl
  222.         ld b,(hl) ;длина строки без терминатора
  223.         inc hl
  224.         add hl,bc
  225.         inc hl ;пропускаем терминатор
  226.         jr findline_lines0
  227.        
  228. readnum_dehl_
  229. ;out: dehl=num, hl'=text, CY=error
  230.         exx
  231.         ld a,(hl)
  232.         exx
  233.         sub '0'
  234.         cp 10 ;NC = не число
  235.         ccf ;CY = не число
  236.         ret c ;error
  237. readnum_dehl
  238. ;out: dehl=num, hl'=text, CY=error
  239.         ld hl,0
  240.         ld de,0 ;накопитель
  241. readnum0
  242.         exx
  243.         ld a,(hl)
  244.         exx
  245.         sub '0'
  246.         cp 10 ;NC = конец числа
  247.         jr nc,readnumq
  248.         exx
  249.         inc hl
  250.         exx
  251.          push de ;HSW
  252.          push hl ;LSW
  253.         add hl,hl
  254.         rl e
  255.         rl d ;*2
  256.         add hl,hl
  257.         rl e
  258.         rl d ;*4
  259.          pop bc ;LSW
  260.          add hl,bc
  261.          pop bc ;HSW
  262.          ex de,hl
  263.          adc hl,bc ;*5
  264.          ex de,hl
  265.         add hl,hl
  266.         rl e
  267.         rl d ;*10
  268.         add a,l
  269.         ld l,a
  270.         ld a,h
  271.         adc a,0
  272.         ld h,a
  273.         jr nc,$+3
  274.         inc de
  275.         jr readnum0
  276. readnumq
  277.         call eatspaces
  278.         or a ;NC=OK
  279.         ret
  280.  
  281. skipspaces
  282. ;hl=string
  283. ;out: hl=after last space
  284.         ld a,(hl)
  285.         cp ' '
  286.         ret nz
  287.         inc hl
  288.         jr skipspaces
  289.  
  290. eatspaces
  291.         exx
  292.         call skipspaces
  293.         exx
  294.         ret
  295.        
  296. add_or_run_line
  297. ;добавляет в программу строку в cmdbuf
  298.         ld hl,cmdbuf
  299.         exx
  300.         call eatspaces
  301.         call readnum_dehl_ ;dehl=linenum, hl'=text, CY=error
  302.         ex de,hl ;de номер
  303.         jp c,cmd_run0;runline
  304.         exx
  305.         ld a,(hl)
  306.         exx
  307.         or a
  308.         jr z,delline
  309.         exx
  310.         push hl
  311.         call strlen
  312.         ld (addline_linelen),hl
  313.         pop hl
  314.         exx
  315.         push de ;linenum
  316.         call findline ;hl=адрес строки или (progend)
  317. ;мы должны вставить строку перед этим местом (или заменить строку там)
  318.         ld bc,(progend)
  319.         or a
  320.         sbc hl,bc
  321.         add hl,bc
  322.         jr z,addline_nodel
  323.         ld a,(hl)
  324.         cp d
  325.         jr nz,addline_nodel
  326.         inc hl
  327.         ld a,(hl)
  328.         dec hl
  329.         cp e
  330.         jr nz,addline_nodel
  331.         push hl
  332.         call delline_hl
  333.         pop hl
  334. addline_nodel
  335.  
  336.         push hl ;hl=адрес вставки
  337.  
  338.         ex de,hl ;de=адрес вставки
  339.         ld hl,(progend)
  340.         or a
  341.         sbc hl,de ;progend-адрес вставки
  342.         ld b,h
  343.         ld c,l ;bc=длина смещаемой памяти (до конца программы)
  344.         ld hl,(progend)
  345.         push hl
  346.         ld de,(addline_linelen)
  347.         add hl,de
  348.         ld de,4+1 ;номер,длина,терминатор
  349.         add hl,de
  350.         ld (progend),hl
  351.         ex de,hl ;new progend
  352.         pop hl ;old progend
  353.         dec hl
  354.         dec de
  355.         call safelddr
  356.  
  357.         pop hl ;hl=адрес вставки
  358.         pop de ;de=linenum
  359.        
  360.         ld (hl),d
  361.         inc hl
  362.         ld (hl),e ;номер строки
  363.         inc hl
  364.        
  365. addline_linelen=$+1
  366.         ld de,0
  367.         ld (hl),e
  368.         inc hl
  369.         ld (hl),d ;длина строки
  370.         inc hl
  371.         push hl ;адрес вставки
  372.         push de ;длина строки
  373.         exx
  374.         pop bc ;длина строки
  375.         inc bc ;длина включая терминатор
  376.         pop de ;адрес вставки
  377.         call safeldir ;hl -> de (bc bytes)
  378.        
  379.         ret
  380.        
  381. delline
  382. ;de=linenum
  383.         call findline ;de номер ;hl=адрес строки или (progend)
  384.         ld bc,(progend)
  385.         or a
  386.         sbc hl,bc
  387.         add hl,bc
  388.         ret z
  389.         ld a,(hl)
  390.         cp d
  391.         ret nz
  392.         inc hl
  393.         ld a,(hl)
  394.         dec hl
  395.         cp e
  396.         ret nz
  397. delline_hl
  398. ;hl=адрес строки, которую надо удалить
  399.         push hl ;адрес строки, которую надо удалить
  400.        
  401.         inc hl
  402.         inc hl
  403.         ld c,(hl)
  404.         inc hl
  405.         ld b,(hl) ;длина строки без терминатора
  406.         inc hl
  407.         add hl,bc
  408.         inc hl ;пропускаем терминатор
  409.         push hl ;hl=адрес следующей строки
  410.  
  411.         ex de,hl ;de=адрес вставки
  412.         ld hl,(progend)
  413.         or a
  414.         sbc hl,de ;progend-адрес вставки
  415.         ld b,h
  416.         ld c,l ;bc=длина смещаемой памяти (до конца программы)
  417.         pop hl ;hl=адрес следующей строки
  418.         pop de ;de=адрес строки, которую надо удалить
  419.  
  420.         call safeldir
  421.         ld (progend),de
  422.         ret
  423.  
  424. getword
  425. ;hl=string
  426. ;de=wordbuf
  427. ;out: hl=terminator/space addr
  428.         push bc
  429.         ld a,(hl)
  430.         cp ':'
  431.         jr z,getword_colon
  432. getword0
  433.         ld a,(hl)
  434.         or a
  435.         jr z,getwordq
  436.         ;TODO обрывать слово по нецифробукве
  437.         sub ' '
  438.         jr z,getwordq0
  439.         ldi
  440.         jp getword0
  441. getword_colon
  442.         ldi
  443. getwordq
  444.         xor a
  445. getwordq0
  446.         ;xor a
  447.         ld (de),a
  448.         pop bc
  449.         ret
  450.  
  451. strcp
  452. ;hl=s1
  453. ;de=s2
  454. ;out: Z (equal, hl=terminator of s1+1, de=terminator of s2+1), NZ (not equal, hl=erroraddr in s1, de=erroraddr in s2)
  455. strcp0.
  456.         ld a,[de] ;s2
  457.         cp [hl] ;s1
  458.         ret nz
  459.         inc hl
  460.         inc de
  461.         or a
  462.         jp nz,strcp0.
  463.         ret ;z
  464.  
  465.         include "bascmds.asm"
  466.         include "../_sdk/stdio.asm"
  467.        
  468. tunknowncommand
  469.         db "Unknown command",0
  470.        
  471.        
  472. safeldir
  473. ;hl -> de (bc bytes)
  474.         ld a,b
  475.         or c
  476.         ret z
  477.         ldir
  478.         ret
  479.        
  480. safelddr
  481. ;hl -> de (bc bytes)
  482.         ld a,b
  483.         or c
  484.         ret z
  485.         lddr
  486.         ret
  487.        
  488.        
  489. prcrlf        
  490.         push hl
  491.         ld a,0x0d
  492.         PRCHAR_
  493.         ld a,0x0a
  494.         PRCHAR_
  495.         pop hl
  496.         ret
  497.        
  498. prtext
  499. ;hl=text (asciiz)
  500. ;out: hl after terminator
  501.         ld a,(hl)
  502.         inc hl
  503.         or a
  504.         ret z
  505.         push hl
  506.         PRCHAR_
  507.         pop hl
  508.         jr prtext
  509.  
  510. editcmd
  511.         ld hl,cmdbuf
  512.         call strlen
  513.         ld a,l
  514.         ld (curcmdx),a
  515. editcmd0
  516.         call fixscroll_prcmd
  517.         call cmdcalccurxy
  518.         SETX_;SETXY_
  519.         ;ld e,CURSORCOLOR;#38
  520.         ;OS_PRATTR ;нарисовать курсор
  521.         call yieldgetkeyloop ;YIELDGETKEYLOOP
  522.         ;push af
  523.         ;call cmdcalccurxy
  524.         ;OS_SETXY
  525.         ;ld e,COLOR;7
  526.         ;OS_PRATTR ;стереть курсор
  527.         ;pop af
  528.         ld hl,cmdbuf
  529.         cp key_enter
  530.         ret z
  531.         cp key_backspace
  532.         jr z,editcmd_backspace
  533.         cp key_left
  534.         jr z,editcmd_left
  535.         cp key_right
  536.         jr z,editcmd_right
  537.         cp key_home
  538.         jr z,editcmd_home
  539.         cp key_end
  540.         jr z,editcmd_end
  541.         cp key_del
  542.         jr z,editcmd_del
  543.         ;cp key_up
  544.         ;jr z,editcmd_up
  545.         cp 0x20
  546.         jr c,editcmdok ;прочие системные кнопки не нужны
  547. ;type in
  548.         ld e,a
  549.         ld hl,cmdbuf
  550.         call strlen ;hl=length
  551.         ld bc,MAXCMDSZ
  552.         or a
  553.         sbc hl,bc
  554.         jr nc,editcmdok ;некуда вводить
  555.         call cmdcalctextaddr ;hl=addr, a=curcmdx
  556.         inc a
  557.         ld (curcmdx),a
  558.         call strinsch ;e=ch
  559. editcmdok
  560.         jp editcmd0
  561.        
  562. editcmd_backspace
  563.         call cmdcalctextaddr ;hl=addr, a=curcmdx
  564.         or a
  565.         jr z,editcmdok ;нечего удалять
  566.         dec a
  567.         ld (curcmdx),a
  568.         call strdelch ;удаляет предыдущий символ
  569.         jr editcmdok
  570.      
  571. editcmd_del
  572.         call cmdcalctextaddr ;hl=addr, a=curcmdx
  573.         inc hl
  574.         call strdelch ;удаляет предыдущий символ
  575.         jr editcmdok
  576.  
  577. editcmd_left
  578.         ld a,(curcmdx)
  579.         or a
  580.         jr z,editcmdok ;некуда влево
  581.         dec a
  582.         ld (curcmdx),a
  583.         jr editcmdok
  584.  
  585. editcmd_right
  586.         call cmdcalctextaddr ;hl=addr, a=curcmdx
  587.         inc (hl)
  588.         dec (hl)
  589.         jr z,editcmdok ;некуда право, стоим на терминаторе
  590.         inc a
  591. editcmd_leftq
  592.         ld (curcmdx),a
  593.         jr editcmdok
  594.  
  595. editcmd_home
  596.         xor a
  597.         jr editcmd_leftq
  598. editcmd_end
  599.         ld hl,cmdbuf
  600.         call strlen ;hl=length
  601.         ld a,l
  602.         jr editcmd_leftq
  603.  
  604. ;editcmd_up
  605. ;        ld de,cmdbuf
  606. ;        ld hl,oldcmd
  607. ;        ld bc,MAXCMDSZ+1
  608. ;        ldir
  609. ;        jp editcmd
  610.  
  611. strinsch
  612. ;insert char E at (hl), shift string right
  613. ;keeps ix
  614. editcmd_ins0
  615.         ld a,(hl)
  616.         ld (hl),e
  617.         ld e,a
  618.         inc hl
  619.         or a
  620.         jr nz,editcmd_ins0
  621.         ld (hl),a
  622.         ret
  623.  
  624. strdelch
  625. ;delete char at (hl-1), shift string left
  626. ;keeps ix
  627. editcmd_bs0
  628.         ld a,(hl)
  629.         dec hl
  630.         ld (hl),a
  631.         inc hl
  632.         inc hl
  633.         or a
  634.         jr nz,editcmd_bs0
  635.         ret
  636.  
  637. strlen
  638. ;hl=str
  639. ;out: hl=length
  640.         ld bc,0 ;чтобы точно найти терминатор
  641.         xor a
  642.         cpir ;найдём обязательно, если длина=0, то bc=-1 и т.д.
  643.         ld hl,-1
  644.         or a
  645.         sbc hl,bc
  646.         ret
  647.  
  648. cmdcalcpromptsz
  649.         ld a,1
  650.         ret
  651.  
  652. cmdcalctextaddr
  653. ;out: hl=addr, a=curcmdx
  654. ;keeps ix
  655.         ld a,(curcmdx)
  656.         ld c,a
  657.         ld b,0
  658.         ld hl,cmdbuf
  659.         add hl,bc
  660.         ret
  661.  
  662. cmdcalccurxy
  663. ;out: de=yx
  664. ;x=cmdpromptsz+curcmdx-curcmdscroll
  665.         call cmdcalcpromptsz ;a=promptsz
  666.         ld hl,curcmdx ;не на экране, а внутри команды
  667.         add a,(hl)
  668.         ld hl,curcmdscroll ;сдвиг команды относительно экрана
  669.         sub (hl)
  670.         ld e,a
  671.         ld d,txtscrhgt-1
  672.         ret
  673.  
  674. fixscroll_prcmd
  675. ;цикл поиска скролла для текущего положения курсора
  676. editcmd_scroll0
  677.         call cmdcalccurxy ;e=scrx
  678.         call cmdcalcpromptsz ;a=promptsz
  679.         ld hl,curcmdscroll
  680.         dec a
  681.         cp e ;scrx
  682.         jr c,editcmd_noscrollleft ;x>=promptsz (x>(promptsz-1))
  683. ;x<promptsz - скролл влево
  684.         dec (hl)
  685.         jr editcmd_scroll0
  686. editcmd_noscrollleft
  687.         ld a,e ;scrx
  688.         cp txtscrwid
  689.         jr c,editcmd_noscrollright
  690. ;x>=txtscrwid - скролл вправо
  691.         inc (hl)
  692.         jr editcmd_scroll0
  693. editcmd_noscrollright
  694. ;prcmd
  695.         ld de,_COLOR
  696.         SETCOLOR_
  697.         ld de,+(txtscrhgt-1)*256+0
  698.         SETX_;SETXY_
  699.         ;ld a,0x0d
  700.         ;PRCHAR_
  701.         ;ld hl,cmdprompt
  702.         ld c,0
  703.         ;call cmdprtext
  704.         push bc
  705.         ld a,'>'
  706.         PRCHAR_
  707.         pop bc
  708.         inc c
  709.         ld hl,(curcmdscroll)
  710.         ld h,0
  711.         ld de,cmdbuf
  712.         add hl,de
  713.         call cmdprtext
  714. ;добьём остаток строки пробелами
  715. prcmdspc0
  716.         ld a,c
  717.         cp txtscrwid-1 ;оставлям место справа для курсора
  718.         ret z
  719.         push bc
  720.         ld a,' '
  721.         PRCHAR_
  722.         pop bc
  723.         inc c
  724.         jp prcmdspc0
  725.  
  726. cmdprtext
  727. cmdprtext0
  728.         ld a,(hl)
  729.         or a
  730.         ret z
  731.         push bc
  732.         push hl
  733.         PRCHAR_
  734.         pop hl
  735.         pop bc
  736.         inc c
  737.         inc hl
  738.         ld a,c
  739.         cp txtscrwid-1 ;оставлям место справа для курсора
  740.         jp nz,cmdprtext0
  741.         ret
  742.  
  743. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  744.  
  745. loginv
  746.         ld a,e
  747.         cpl
  748.         ld e,a
  749.         ld a,d
  750.         cpl
  751.         ld d,a
  752.         ld a,l
  753.         cpl
  754.         ld l,a
  755.         ld a,h
  756.         cpl
  757.         ld h,a
  758.         ret
  759.        
  760. negdebc
  761.         xor a
  762.         sub c
  763.         ld c,a
  764.         ld a,0
  765.         sbc a,b
  766.         ld b,a
  767.         ld a,0
  768.         sbc a,e
  769.         ld e,a
  770.         ld a,0
  771.         sbc a,d
  772.         ld d,a
  773.         ret
  774. negdehl
  775.         xor a
  776.         sub l
  777.         ld l,a
  778.         ld a,0
  779.         sbc a,h
  780.         ld h,a
  781.         ld a,0
  782.         sbc a,e
  783.         ld e,a
  784.         ld a,0
  785.         sbc a,d
  786.         ld d,a
  787.         ret
  788.  
  789. prlinenum_tomem
  790. ;de=num
  791.         ld bc,prdword_digit_tomem
  792.         ld (prdword_digit_prchar_jp),bc
  793.         ld hl,0
  794.         ex de,hl
  795.         jr _prdword_subr ;dehl=num
  796.        
  797. prword_de
  798. ;de=num
  799.         ld hl,0
  800.         ex de,hl
  801. prdword_dehl
  802. ;dehl=num
  803.         ld bc,prdword_digit_toscr
  804.         ld (prdword_digit_prchar_jp),bc
  805.         bit 7,d
  806.         jr z,prdword_positive
  807.         ld a,'-'
  808.         call prdword_digit_prchar
  809.         call negdehl
  810. prdword_positive
  811. _prdword_subr
  812.         ld a,' '
  813.         ld (prnumdwordcmd_zero),a
  814.         ld lx,0
  815.         ld bc,1000000000/65536
  816.         ld a,1000000000/256&#ff
  817.         call prdword_digit
  818.         ld bc,100000000/65536
  819.         ld a,100000000/256&#ff
  820.         call prdword_digit
  821.         ld lx,d
  822.         ld d,e
  823.         ld e,h
  824.         ld h,l
  825.         ld bc,10000000/256
  826.         ld a,10000000&#ff ;0x989680
  827.         call prdword_digit
  828.         ld bc,1000000/256
  829.         ld a,1000000&#ff
  830.         call prdword_digit
  831.         ld bc,100000/256
  832.         ld a,100000&#ff
  833.         call prdword_digit
  834.         ld bc,10000/256
  835.         ld a,10000&#ff
  836.         call prdword_digit
  837.         ld bc,1000/256
  838.         ld a,1000&#ff
  839.         call prdword_digit
  840.         ld bc,100/256
  841.         ld a,100&#ff
  842.         call prdword_digit
  843.         ld bc,10/256
  844.         ld a,10&#ff
  845.         call prdword_digit
  846.         ld a,h
  847.         add a,'0'
  848. prdword_digit_prchar
  849. prdword_digit_prchar_jp=$+1
  850.         jp prdword_digit_tomem
  851. prdword_digit_toscr
  852.         push de
  853.         push hl
  854.         push ix
  855.         PRCHAR_
  856.         pop ix
  857.         pop hl
  858.         pop de
  859.         ret
  860. prdword_digit_tomem
  861.         exx
  862.         ld (hl),a
  863.         inc hl
  864.         exx
  865.         ret
  866. prdword_digit
  867. ;deh[l]=num
  868. ;bca0=divisor
  869.         push hl
  870.         ex de,hl
  871.         ld e,a
  872.         ld a,d
  873.         ld d,'0'-1
  874. ;hla0=num
  875. ;bce0=divisor
  876. ;d=digit
  877. prdword_digit0
  878.         inc d
  879.         sub e
  880.         sbc hl,bc
  881.         jr nc,prdword_digit0
  882.         dec lx
  883.         jp p,prdword_digit0
  884.         add a,e
  885.         adc hl,bc
  886.         jr nc,$+4
  887.         inc lx
  888.          ld c,d ;digit
  889.         ex de,hl
  890.         pop hl
  891.         ld h,a ;dehl=num
  892.          ld a,c ;digit
  893.         cp '0'
  894.         jr nz,prnumdwordcmd_nozero
  895. prnumdwordcmd_zero=$+1
  896.         ld a,' '
  897.         cp ' '
  898.         ret z
  899.         jp prdword_digit_prchar
  900. prnumdwordcmd_nozero
  901.         call prdword_digit_prchar
  902.         ld a,'0'
  903.         ld (prnumdwordcmd_zero),a
  904.         ret
  905.  
  906. prstr_withlen=prtext
  907. ;hl=straddr
  908.         if 0
  909. ;hl=straddr (first byte = len (0..255))
  910.         ld a,(hl)
  911.         inc hl
  912.         or a
  913.         ret z
  914.         ld b,a
  915. prstr_withlen0
  916.         push bc
  917.         push hl
  918.         ld a,(hl)
  919.         PRCHAR_
  920.         pop hl
  921.         inc hl
  922.         pop bc
  923.         djnz prstr_withlen0
  924.         ret
  925.         endif
  926.        
  927. ;getvar_int
  928. ;a=name (char)
  929. ;out: dehl
  930.         ;call findvar_int ;hl=addr
  931. getint
  932.         ld e,(hl)
  933.         inc hl
  934.         ld d,(hl)
  935.         inc hl
  936.         ld a,(hl)
  937.         inc hl
  938.         ld h,(hl)
  939.         ld l,a
  940.         ex de,hl
  941.         ret
  942.  
  943. ;getvar_str
  944. ;a=name (char)
  945. ;out: hl=straddr (first byte = len (0..255))
  946.         ;call findvar_str ;hl=addr
  947.         ;ret
  948.  
  949. setvar_int
  950. ;a=name (char), dehl=value
  951.         ex de,hl
  952.         push hl
  953.         call findvar_int ;hl=addr
  954.         ld (hl),e
  955.         inc hl
  956.         ld (hl),d
  957.         inc hl
  958.         pop de
  959.         ld (hl),e
  960.         inc hl
  961.         ld (hl),d
  962.         ret
  963.  
  964. setvar_str
  965. ;a=name (char), hl=straddr
  966.         push hl
  967.         call findvar_str ;hl=addr
  968.         ex de,hl
  969.         pop hl
  970. strcopy
  971. ;hl -> de (first byte = len (0..255))
  972.         ld bc,256
  973.         ldir
  974.         ret
  975.  
  976. addvar_int
  977. ;a=name (char)
  978.         push de
  979.         ld hl,(varend)
  980.         ld d,h
  981.         ld e,l
  982.         inc hl
  983.         inc hl
  984.         inc hl
  985.         inc hl
  986.         ld (varend),hl
  987. ;de=addr
  988.         ld h,varindex_int/256
  989.         ld l,a
  990.         ld (hl),e
  991.         inc h
  992.         ld (hl),d
  993.         pop de
  994.         ret
  995.  
  996. addvar_str
  997. ;a=name (char)
  998.         push de
  999.         ld hl,(varend)
  1000.         ld d,h
  1001.         ld e,l
  1002.         inc h
  1003.         ld (varend),hl
  1004. ;de=addr
  1005.         ld h,varindex_int/256
  1006.         add a,128
  1007.         ld l,a
  1008.         ld (hl),e
  1009.         inc h
  1010.         ld (hl),d
  1011.         pop de
  1012.         ret
  1013.  
  1014. findvar_index
  1015. ;TODO проверка типа переменной (int не разрешается)
  1016. findvar_array
  1017. ;TODO проверка типа переменной
  1018. findvar_int
  1019. ;TODO проверка типа переменной (index разрешается, array не разрешается)
  1020. ;a=name (char)
  1021. ;out: hl=addr, z=error
  1022.         ld h,varindex_int/256
  1023.         ld l,a
  1024.         ld a,(hl)
  1025.         inc h
  1026.         ld h,(hl)
  1027.         ld l,a
  1028.         or h
  1029.         ret
  1030.  
  1031. findvar_str
  1032. ;a=name (char)
  1033. ;out: hl=addr, z=error
  1034.         ld h,varindex_int/256
  1035.         add a,128
  1036.         ld l,a
  1037.         ld a,(hl)
  1038.         inc h
  1039.         ld h,(hl)
  1040.         ld l,a
  1041.         or h
  1042.         ret
  1043.  
  1044.  
  1045.  
  1046. cmd_line_parse
  1047. ;hl= cmd line after basic.com and spaces
  1048. cmd_line_parse_loop
  1049.         ld a,(hl)
  1050.         cp "-"
  1051.         ret nz; не ключ, значит возврат
  1052.         inc hl
  1053.         ld a,(hl)
  1054.         cp "c"
  1055.         call z, case_key_c
  1056.         cp "n"
  1057.         call z, case_key_n
  1058.         cp "h"
  1059.         call z, case_key_h
  1060.         cp "V"
  1061.         call z, case_key_v
  1062.         inc hl
  1063.         call skipspaces
  1064.         jp cmd_line_parse_loop
  1065.  
  1066. case_key_c
  1067.         ld a,1
  1068.         ld (cmd_line_c),a
  1069.         ret
  1070. case_key_n
  1071.         ld a,1
  1072.         ld (cmd_line_n),a
  1073.         ret
  1074. case_key_h
  1075.         ld a,1
  1076.         ld (cmd_line_h),a
  1077.         ret
  1078. case_key_v
  1079.         ld a,1
  1080.         ld (cmd_line_v),a
  1081.         ret
  1082.  
  1083. cmd_line_c db 0
  1084. cmd_line_n db 0
  1085. cmd_line_h db 0
  1086. cmd_line_v db 0
  1087.  
  1088.         ;include "../_sdk/prdword.asm"
  1089.        
  1090. text
  1091.         db "Hello world!",0x0d,0x0a,0
  1092.        
  1093. cmdbuf
  1094.         ds MAXCMDSZ+1
  1095.        
  1096. syscmdbuf
  1097.         db "cmd "
  1098. wordbuf
  1099.         ds MAXCMDSZ+1
  1100.  
  1101. curdir
  1102.         ds MAXPATH_sz;MAXCMDSZ+1
  1103.        
  1104. ;oldtimer
  1105. ;        dw 0
  1106.  
  1107. execcmd_pars
  1108.         dw 0
  1109.  
  1110. curcmdscroll ;сдвиг команды относительно экрана
  1111.         db 0
  1112. curcmdx ;не на экране, а внутри команды
  1113.         db 0
  1114.  
  1115. progend
  1116.         dw progmem
  1117. varend
  1118.         dw varmem
  1119.        
  1120.        
  1121.         align 256
  1122. varindex_int ;varindex_str лежат по адресу+128
  1123.         ds 512
  1124.  
  1125. ;varmem
  1126.        
  1127. cmd_end
  1128.  
  1129.         ;display "Size ",/d,cmd_end-cmd_begin," bytes"
  1130.  
  1131.         savebin "basic.com",cmd_begin,cmd_end-cmd_begin
  1132.        
  1133.         LABELSLIST "../../us/user.l",1
  1134.