?login_element?

Subversion Repositories NedoOS

Rev

Rev 576 | Rev 1509 | 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. 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_
  229. ;out: hlde=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
  238. ;out: hlde=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 hl ;HSW
  252.          push de ;LSW
  253.         sla e
  254.         rl d
  255.         adc hl,hl ;*2
  256.         sla e
  257.         rl d
  258.         adc hl,hl ;*4
  259.          pop bc ;LSW
  260.          ex de,hl
  261.          add hl,bc
  262.          ex de,hl
  263.          pop bc ;HSW
  264.          adc hl,bc ;*5
  265.         sla e
  266.         rl d
  267.         adc hl,hl ;*10
  268.         add a,e
  269.         ld e,a
  270.         ld a,d
  271.         adc a,0
  272.         ld d,a
  273.         jr nc,$+3
  274.         inc hl
  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_ ;hlde=linenum, hl'=text, CY=error
  302.         jp c,cmd_run0;runline
  303.         exx
  304.         ld a,(hl)
  305.         exx
  306.         or a
  307.         jr z,delline
  308.         exx
  309.         push hl
  310.         call strlen
  311.         ld (addline_linelen),hl
  312.         pop hl
  313.         exx
  314.         push de ;linenum
  315.         call findline ;hl=адрес строки или (progend)
  316. ;мы должны вставить строку перед этим местом (или заменить строку там)
  317.         ld bc,(progend)
  318.         or a
  319.         sbc hl,bc
  320.         add hl,bc
  321.         jr z,addline_nodel
  322.         ld a,(hl)
  323.         cp d
  324.         jr nz,addline_nodel
  325.         inc hl
  326.         ld a,(hl)
  327.         dec hl
  328.         cp e
  329.         jr nz,addline_nodel
  330.         push hl
  331.         call delline_hl
  332.         pop hl
  333. addline_nodel
  334.  
  335.         push hl ;hl=адрес вставки
  336.  
  337.         ex de,hl ;de=адрес вставки
  338.         ld hl,(progend)
  339.         or a
  340.         sbc hl,de ;progend-адрес вставки
  341.         ld b,h
  342.         ld c,l ;bc=длина смещаемой памяти (до конца программы)
  343.         ld hl,(progend)
  344.         push hl
  345.         ld de,(addline_linelen)
  346.         add hl,de
  347.         ld de,4+1 ;номер,длина,терминатор
  348.         add hl,de
  349.         ld (progend),hl
  350.         ex de,hl ;new progend
  351.         pop hl ;old progend
  352.         dec hl
  353.         dec de
  354.         call safelddr
  355.  
  356.         pop hl ;hl=адрес вставки
  357.         pop de ;de=linenum
  358.        
  359.         ld (hl),d
  360.         inc hl
  361.         ld (hl),e ;номер строки
  362.         inc hl
  363.        
  364. addline_linelen=$+1
  365.         ld de,0
  366.         ld (hl),e
  367.         inc hl
  368.         ld (hl),d ;длина строки
  369.         inc hl
  370.         push hl ;адрес вставки
  371.         push de ;длина строки
  372.         exx
  373.         pop bc ;длина строки
  374.         inc bc ;длина включая терминатор
  375.         pop de ;адрес вставки
  376.         call safeldir ;hl -> de (bc bytes)
  377.        
  378.         ret
  379.        
  380. delline
  381. ;de=linenum
  382.         call findline ;hl=адрес строки или (progend)
  383.         ld bc,(progend)
  384.         or a
  385.         sbc hl,bc
  386.         add hl,bc
  387.         ret z
  388.         ld a,(hl)
  389.         cp d
  390.         ret nz
  391.         inc hl
  392.         ld a,(hl)
  393.         dec hl
  394.         cp e
  395.         ret nz
  396. delline_hl
  397. ;hl=адрес строки, которую надо удалить
  398.         push hl ;адрес строки, которую надо удалить
  399.        
  400.         inc hl
  401.         inc hl
  402.         ld c,(hl)
  403.         inc hl
  404.         ld b,(hl) ;длина строки без терминатора
  405.         inc hl
  406.         add hl,bc
  407.         inc hl ;пропускаем терминатор
  408.         push hl ;hl=адрес следующей строки
  409.  
  410.         ex de,hl ;de=адрес вставки
  411.         ld hl,(progend)
  412.         or a
  413.         sbc hl,de ;progend-адрес вставки
  414.         ld b,h
  415.         ld c,l ;bc=длина смещаемой памяти (до конца программы)
  416.         pop hl ;hl=адрес следующей строки
  417.         pop de ;de=адрес строки, которую надо удалить
  418.  
  419.         call safeldir
  420.         ld (progend),de
  421.         ret
  422.  
  423. getword
  424. ;hl=string
  425. ;de=wordbuf
  426. ;out: hl=terminator/space addr
  427.         push bc
  428.         ld a,(hl)
  429.         cp ':'
  430.         jr z,getword_colon
  431. getword0
  432.         ld a,(hl)
  433.         or a
  434.         jr z,getwordq
  435.         ;TODO обрывать слово по нецифробукве
  436.         sub ' '
  437.         jr z,getwordq0
  438.         ldi
  439.         jp getword0
  440. getword_colon
  441.         ldi
  442. getwordq
  443.         xor a
  444. getwordq0
  445.         ;xor a
  446.         ld (de),a
  447.         pop bc
  448.         ret
  449.  
  450. strcp
  451. ;hl=s1
  452. ;de=s2
  453. ;out: Z (equal, hl=terminator of s1+1, de=terminator of s2+1), NZ (not equal, hl=erroraddr in s1, de=erroraddr in s2)
  454. strcp0.
  455.         ld a,[de] ;s2
  456.         cp [hl] ;s1
  457.         ret nz
  458.         inc hl
  459.         inc de
  460.         or a
  461.         jp nz,strcp0.
  462.         ret ;z
  463.  
  464.         include "bascmds.asm"
  465.         include "../_sdk/stdio.asm"
  466.        
  467. tunknowncommand
  468.         db "Unknown command",0
  469.        
  470.        
  471. safeldir
  472. ;hl -> de (bc bytes)
  473.         ld a,b
  474.         or c
  475.         ret z
  476.         ldir
  477.         ret
  478.        
  479. safelddr
  480. ;hl -> de (bc bytes)
  481.         ld a,b
  482.         or c
  483.         ret z
  484.         lddr
  485.         ret
  486.        
  487.        
  488. prcrlf        
  489.         push hl
  490.         ld a,0x0d
  491.         PRCHAR_
  492.         ld a,0x0a
  493.         PRCHAR_
  494.         pop hl
  495.         ret
  496.        
  497. prtext
  498. ;hl=text (asciiz)
  499. ;out: hl after terminator
  500.         ld a,(hl)
  501.         inc hl
  502.         or a
  503.         ret z
  504.         push hl
  505.         PRCHAR_
  506.         pop hl
  507.         jr prtext
  508.  
  509. editcmd
  510.         ld hl,cmdbuf
  511.         call strlen
  512.         ld a,l
  513.         ld (curcmdx),a
  514. editcmd0
  515.         call fixscroll_prcmd
  516.         call cmdcalccurxy
  517.         SETXY_
  518.         ;ld e,CURSORCOLOR;#38
  519.         ;OS_PRATTR ;нарисовать курсор
  520.         call yieldgetkeyloop ;YIELDGETKEYLOOP
  521.         ;push af
  522.         ;call cmdcalccurxy
  523.         ;OS_SETXY
  524.         ;ld e,COLOR;7
  525.         ;OS_PRATTR ;стереть курсор
  526.         ;pop af
  527.         ld hl,cmdbuf
  528.         cp key_enter
  529.         ret z
  530.         cp key_backspace
  531.         jr z,editcmd_backspace
  532.         cp key_left
  533.         jr z,editcmd_left
  534.         cp key_right
  535.         jr z,editcmd_right
  536.         cp key_home
  537.         jr z,editcmd_home
  538.         cp key_end
  539.         jr z,editcmd_end
  540.         cp key_del
  541.         jr z,editcmd_del
  542.         ;cp key_up
  543.         ;jr z,editcmd_up
  544.         cp 0x20
  545.         jr c,editcmdok ;прочие системные кнопки не нужны
  546. ;type in
  547.         ld e,a
  548.         ld hl,cmdbuf
  549.         call strlen ;hl=length
  550.         ld bc,MAXCMDSZ
  551.         or a
  552.         sbc hl,bc
  553.         jr nc,editcmdok ;некуда вводить
  554.         call cmdcalctextaddr ;hl=addr, a=curcmdx
  555.         inc a
  556.         ld (curcmdx),a
  557.         call strinsch ;e=ch
  558. editcmdok
  559.         jp editcmd0
  560.        
  561. editcmd_backspace
  562.         call cmdcalctextaddr ;hl=addr, a=curcmdx
  563.         or a
  564.         jr z,editcmdok ;нечего удалять
  565.         dec a
  566.         ld (curcmdx),a
  567.         call strdelch ;удаляет предыдущий символ
  568.         jr editcmdok
  569.      
  570. editcmd_del
  571.         call cmdcalctextaddr ;hl=addr, a=curcmdx
  572.         inc hl
  573.         call strdelch ;удаляет предыдущий символ
  574.         jr editcmdok
  575.  
  576. editcmd_left
  577.         ld a,(curcmdx)
  578.         or a
  579.         jr z,editcmdok ;некуда влево
  580.         dec a
  581.         ld (curcmdx),a
  582.         jr editcmdok
  583.  
  584. editcmd_right
  585.         call cmdcalctextaddr ;hl=addr, a=curcmdx
  586.         inc (hl)
  587.         dec (hl)
  588.         jr z,editcmdok ;некуда право, стоим на терминаторе
  589.         inc a
  590. editcmd_leftq
  591.         ld (curcmdx),a
  592.         jr editcmdok
  593.  
  594. editcmd_home
  595.         xor a
  596.         jr editcmd_leftq
  597. editcmd_end
  598.         ld hl,cmdbuf
  599.         call strlen ;hl=length
  600.         ld a,l
  601.         jr editcmd_leftq
  602.  
  603. ;editcmd_up
  604. ;        ld de,cmdbuf
  605. ;        ld hl,oldcmd
  606. ;        ld bc,MAXCMDSZ+1
  607. ;        ldir
  608. ;        jp editcmd
  609.  
  610. strinsch
  611. ;insert char E at (hl), shift string right
  612. ;keeps ix
  613. editcmd_ins0
  614.         ld a,(hl)
  615.         ld (hl),e
  616.         ld e,a
  617.         inc hl
  618.         or a
  619.         jr nz,editcmd_ins0
  620.         ld (hl),a
  621.         ret
  622.  
  623. strdelch
  624. ;delete char at (hl-1), shift string left
  625. ;keeps ix
  626. editcmd_bs0
  627.         ld a,(hl)
  628.         dec hl
  629.         ld (hl),a
  630.         inc hl
  631.         inc hl
  632.         or a
  633.         jr nz,editcmd_bs0
  634.         ret
  635.  
  636. strlen
  637. ;hl=str
  638. ;out: hl=length
  639.         ld bc,0 ;чтобы точно найти терминатор
  640.         xor a
  641.         cpir ;найдём обязательно, если длина=0, то bc=-1 и т.д.
  642.         ld hl,-1
  643.         or a
  644.         sbc hl,bc
  645.         ret
  646.  
  647. cmdcalcpromptsz
  648.         ld a,1
  649.         ret
  650.  
  651. cmdcalctextaddr
  652. ;out: hl=addr, a=curcmdx
  653. ;keeps ix
  654.         ld a,(curcmdx)
  655.         ld c,a
  656.         ld b,0
  657.         ld hl,cmdbuf
  658.         add hl,bc
  659.         ret
  660.  
  661. cmdcalccurxy
  662. ;out: de=yx
  663. ;x=cmdpromptsz+curcmdx-curcmdscroll
  664.         call cmdcalcpromptsz ;a=promptsz
  665.         ld hl,curcmdx ;не на экране, а внутри команды
  666.         add a,(hl)
  667.         ld hl,curcmdscroll ;сдвиг команды относительно экрана
  668.         sub (hl)
  669.         ld e,a
  670.         ld d,txtscrhgt-1
  671.         ret
  672.  
  673. fixscroll_prcmd
  674. ;цикл поиска скролла для текущего положения курсора
  675. editcmd_scroll0
  676.         call cmdcalccurxy ;e=scrx
  677.         call cmdcalcpromptsz ;a=promptsz
  678.         ld hl,curcmdscroll
  679.         dec a
  680.         cp e ;scrx
  681.         jr c,editcmd_noscrollleft ;x>=promptsz (x>(promptsz-1))
  682. ;x<promptsz - скролл влево
  683.         dec (hl)
  684.         jr editcmd_scroll0
  685. editcmd_noscrollleft
  686.         ld a,e ;scrx
  687.         cp txtscrwid
  688.         jr c,editcmd_noscrollright
  689. ;x>=txtscrwid - скролл вправо
  690.         inc (hl)
  691.         jr editcmd_scroll0
  692. editcmd_noscrollright
  693. ;prcmd
  694.         ld de,_COLOR
  695.         SETCOLOR_
  696.         ld de,+(txtscrhgt-1)*256+0
  697.         SETXY_
  698.         ;ld a,0x0d
  699.         ;PRCHAR_
  700.         ;ld hl,cmdprompt
  701.         ld c,0
  702.         ;call cmdprtext
  703.         push bc
  704.         ld a,'>'
  705.         PRCHAR_
  706.         pop bc
  707.         inc c
  708.         ld hl,(curcmdscroll)
  709.         ld h,0
  710.         ld de,cmdbuf
  711.         add hl,de
  712.         call cmdprtext
  713. ;добьём остаток строки пробелами
  714. prcmdspc0
  715.         ld a,c
  716.         cp txtscrwid-1 ;оставлям место справа для курсора
  717.         ret z
  718.         push bc
  719.         ld a,' '
  720.         PRCHAR_
  721.         pop bc
  722.         inc c
  723.         jp prcmdspc0
  724.  
  725. cmdprtext
  726. cmdprtext0
  727.         ld a,(hl)
  728.         or a
  729.         ret z
  730.         push bc
  731.         push hl
  732.         PRCHAR_
  733.         pop hl
  734.         pop bc
  735.         inc c
  736.         inc hl
  737.         ld a,c
  738.         cp txtscrwid-1 ;оставлям место справа для курсора
  739.         jp nz,cmdprtext0
  740.         ret
  741.  
  742. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  743.  
  744. loginv
  745.         ld a,e
  746.         cpl
  747.         ld e,a
  748.         ld a,d
  749.         cpl
  750.         ld d,a
  751.         ld a,l
  752.         cpl
  753.         ld l,a
  754.         ld a,h
  755.         cpl
  756.         ld h,a
  757.         ret
  758.        
  759.  
  760. neghlde
  761.         xor a
  762.         sub e
  763.         ld e,a
  764.         ld a,0
  765.         sbc a,d
  766.         ld d,a
  767.         ld a,0
  768.         sbc a,l
  769.         ld l,a
  770.         ld a,0
  771.         sbc a,h
  772.         ld h,a
  773.         ret
  774.  
  775. negbcde
  776.         xor a
  777.         sub e
  778.         ld e,a
  779.         ld a,0
  780.         sbc a,d
  781.         ld d,a
  782.         ld a,0
  783.         sbc a,c
  784.         ld c,a
  785.         ld a,0
  786.         sbc a,b
  787.         ld b,a
  788.         ret
  789.  
  790. prlinenum_tomem
  791.         ld bc,prdword_digit_tomem
  792.         ld (prdword_digit_prchar_jp),bc
  793.         ld hl,0
  794.         jr prdword_subr
  795.        
  796. prword_de
  797. ;de=num
  798.         ld hl,0
  799. prdword_hlde
  800. ;hlde=num
  801.         ld bc,prdword_digit_toscr
  802.         ld (prdword_digit_prchar_jp),bc
  803.         bit 7,h
  804.         jr z,prdword_hlde_positive
  805.         ld a,'-'
  806.         call prdword_digit_prchar
  807.         call neghlde
  808. prdword_hlde_positive
  809. prdword_subr
  810.         ld a,' '
  811.         ld (prnumdwordcmd_zero),a
  812.         ld lx,0
  813.         ld bc,1000000000/65536
  814.         ld a,1000000000/256&#ff
  815.         call prdword_digit
  816.         ld bc,100000000/65536
  817.         ld a,100000000/256&#ff
  818.         call prdword_digit
  819.         ld a,h
  820.         ld lx,a
  821.         ld h,l
  822.         ld l,d
  823.         ld d,e
  824.         ld bc,10000000/256
  825.         ld a,10000000&#ff ;0x989680
  826.         call prdword_digit
  827.         ld bc,1000000/256
  828.         ld a,1000000&#ff
  829.         call prdword_digit
  830.         ld bc,100000/256
  831.         ld a,100000&#ff
  832.         call prdword_digit
  833.         ld bc,10000/256
  834.         ld a,10000&#ff
  835.         call prdword_digit
  836.         ld bc,1000/256
  837.         ld a,1000&#ff
  838.         call prdword_digit
  839.         ld bc,100/256
  840.         ld a,100&#ff
  841.         call prdword_digit
  842.         ld bc,10/256
  843.         ld a,10&#ff
  844.         call prdword_digit
  845.         ld a,d
  846.         add a,'0'
  847. prdword_digit_prchar
  848. prdword_digit_prchar_jp=$+1
  849.         jp prdword_digit_tomem
  850. prdword_digit_toscr
  851.         push de
  852.         push hl
  853.         push ix
  854.         PRCHAR_
  855.         pop ix
  856.         pop hl
  857.         pop de
  858.         ret
  859. prdword_digit_tomem
  860.         exx
  861.         ld (hl),a
  862.         inc hl
  863.         exx
  864.         ret
  865. prdword_digit
  866. ;hlde=num
  867. ;bca0=divisor
  868.         push de
  869.         ld e,a
  870.         ld a,d
  871.         ld d,'0'-1
  872. ;hla0=num
  873. ;bce0=divisor
  874. ;d=digit
  875. prdword_digit0
  876.         inc d
  877.         sub e
  878.         sbc hl,bc
  879.         jr nc,prdword_digit0
  880.         dec lx
  881.         jp p,prdword_digit0
  882.         add a,e
  883.         adc hl,bc
  884.         jr nc,$+4
  885.         inc lx
  886.          ld c,d ;digit
  887.         pop de
  888.         ld d,a ;hlde=num
  889.          ld a,c ;digit
  890.         cp '0'
  891.         jr nz,prnumdwordcmd_nozero
  892. prnumdwordcmd_zero=$+1
  893.         ld a,' '
  894.         cp ' '
  895.         ret z
  896.         jp prdword_digit_prchar
  897. prnumdwordcmd_nozero
  898.         call prdword_digit_prchar
  899.         ld a,'0'
  900.         ld (prnumdwordcmd_zero),a
  901.         ret
  902.  
  903. prstr_withlen=prtext
  904. ;hl=straddr
  905.         if 0
  906. ;hl=straddr (first byte = len (0..255))
  907.         ld a,(hl)
  908.         inc hl
  909.         or a
  910.         ret z
  911.         ld b,a
  912. prstr_withlen0
  913.         push bc
  914.         push hl
  915.         ld a,(hl)
  916.         PRCHAR_
  917.         pop hl
  918.         inc hl
  919.         pop bc
  920.         djnz prstr_withlen0
  921.         ret
  922.         endif
  923.        
  924. ;getvar_int
  925. ;a=name (char)
  926. ;out: hlde
  927.         ;call findvar_int ;hl=addr
  928. getint
  929.         ld e,(hl)
  930.         inc hl
  931.         ld d,(hl)
  932.         inc hl
  933.         ld a,(hl)
  934.         inc hl
  935.         ld h,(hl)
  936.         ld l,a
  937.         ret
  938.  
  939. ;getvar_str
  940. ;a=name (char)
  941. ;out: hl=straddr (first byte = len (0..255))
  942.         ;call findvar_str ;hl=addr
  943.         ;ret
  944.  
  945. setvar_int
  946. ;a=name (char), hlde=value
  947.         push hl
  948.         call findvar_int ;hl=addr
  949.         ld (hl),e
  950.         inc hl
  951.         ld (hl),d
  952.         inc hl
  953.         pop de
  954.         ld (hl),e
  955.         inc hl
  956.         ld (hl),d
  957.         ret
  958.  
  959. setvar_str
  960. ;a=name (char), hl=straddr
  961.         push hl
  962.         call findvar_str ;hl=addr
  963.         ex de,hl
  964.         pop hl
  965. strcopy
  966. ;hl -> de (first byte = len (0..255))
  967.         ld bc,256
  968.         ldir
  969.         ret
  970.  
  971. addvar_int
  972. ;a=name (char)
  973.         push de
  974.         ld hl,(varend)
  975.         ld d,h
  976.         ld e,l
  977.         inc hl
  978.         inc hl
  979.         inc hl
  980.         inc hl
  981.         ld (varend),hl
  982. ;de=addr
  983.         ld h,varindex_int/256
  984.         ld l,a
  985.         ld (hl),e
  986.         inc h
  987.         ld (hl),d
  988.         pop de
  989.         ret
  990.  
  991. addvar_str
  992. ;a=name (char)
  993.         push de
  994.         ld hl,(varend)
  995.         ld d,h
  996.         ld e,l
  997.         inc h
  998.         ld (varend),hl
  999. ;de=addr
  1000.         ld h,varindex_int/256
  1001.         add a,128
  1002.         ld l,a
  1003.         ld (hl),e
  1004.         inc h
  1005.         ld (hl),d
  1006.         pop de
  1007.         ret
  1008.  
  1009. findvar_index
  1010. ;TODO проверка типа переменной (int не разрешается)
  1011. findvar_array
  1012. ;TODO проверка типа переменной
  1013. findvar_int
  1014. ;TODO проверка типа переменной (index разрешается, array не разрешается)
  1015. ;a=name (char)
  1016. ;out: hl=addr, z=error
  1017.         ld h,varindex_int/256
  1018.         ld l,a
  1019.         ld a,(hl)
  1020.         inc h
  1021.         ld h,(hl)
  1022.         ld l,a
  1023.         or h
  1024.         ret
  1025.  
  1026. findvar_str
  1027. ;a=name (char)
  1028. ;out: hl=addr, z=error
  1029.         ld h,varindex_int/256
  1030.         add a,128
  1031.         ld l,a
  1032.         ld a,(hl)
  1033.         inc h
  1034.         ld h,(hl)
  1035.         ld l,a
  1036.         or h
  1037.         ret
  1038.  
  1039.  
  1040.  
  1041. cmd_line_parse
  1042. ;hl= cmd line after basic.com and spaces
  1043. cmd_line_parse_loop
  1044.         ld a,(hl)
  1045.         cp "-"
  1046.         ret nz; не ключ, значит возврат
  1047.         inc hl
  1048.         ld a,(hl)
  1049.         cp "c"
  1050.         call z, case_key_c
  1051.         cp "n"
  1052.         call z, case_key_n
  1053.         cp "h"
  1054.         call z, case_key_h
  1055.         cp "V"
  1056.         call z, case_key_v
  1057.         inc hl
  1058.         call skipspaces
  1059.         jp cmd_line_parse_loop
  1060.  
  1061. case_key_c
  1062.         ld a,1
  1063.         ld (cmd_line_c),a
  1064.         ret
  1065. case_key_n
  1066.         ld a,1
  1067.         ld (cmd_line_n),a
  1068.         ret
  1069. case_key_h
  1070.         ld a,1
  1071.         ld (cmd_line_h),a
  1072.         ret
  1073. case_key_v
  1074.         ld a,1
  1075.         ld (cmd_line_v),a
  1076.         ret
  1077.  
  1078. cmd_line_c db 0
  1079. cmd_line_n db 0
  1080. cmd_line_h db 0
  1081. cmd_line_v db 0
  1082.  
  1083.         ;include "../_sdk/prdword.asm"
  1084.        
  1085. text
  1086.         db "Hello world!",0x0d,0x0a,0
  1087.        
  1088. cmdbuf
  1089.         ds MAXCMDSZ+1
  1090.        
  1091. syscmdbuf
  1092.         db "cmd "
  1093. wordbuf
  1094.         ds MAXCMDSZ+1
  1095.  
  1096. curdir
  1097.         ds MAXPATH_sz;MAXCMDSZ+1
  1098.        
  1099. ;oldtimer
  1100. ;        dw 0
  1101.  
  1102. execcmd_pars
  1103.         dw 0
  1104.  
  1105. curcmdscroll ;сдвиг команды относительно экрана
  1106.         db 0
  1107. curcmdx ;не на экране, а внутри команды
  1108.         db 0
  1109.  
  1110. progend
  1111.         dw progmem
  1112. varend
  1113.         dw varmem
  1114.        
  1115.        
  1116.         align 256
  1117. varindex_int ;varindex_str лежат по адресу+128
  1118.         ds 512
  1119.  
  1120. ;varmem
  1121.        
  1122. cmd_end
  1123.  
  1124.         ;display "Size ",/d,cmd_end-cmd_begin," bytes"
  1125.  
  1126.         savebin "basic.com",cmd_begin,cmd_end-cmd_begin
  1127.        
  1128.         LABELSLIST "../../us/user.l"
  1129.