?login_element?

Subversion Repositories NedoOS

Rev

Rev 512 | Rev 1410 | 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_up
  537.         ;jr z,editcmd_up
  538.         cp 0x20
  539.         jr c,editcmdok ;прочие системные кнопки не нужны
  540. ;type in
  541.         ld e,a
  542.         ld hl,cmdbuf
  543.         call strlen ;hl=length
  544.         ld bc,MAXCMDSZ
  545.         or a
  546.         sbc hl,bc
  547.         jr nc,editcmdok ;некуда вводить
  548.         call cmdcalctextaddr ;hl=addr, a=curcmdx
  549.         inc a
  550.         ld (curcmdx),a
  551.         call strinsch ;e=ch
  552. editcmdok
  553.         jp editcmd0
  554.        
  555. editcmd_backspace
  556.         call cmdcalctextaddr ;hl=addr, a=curcmdx
  557.         or a
  558.         jr z,editcmdok ;нечего удалять
  559.         dec a
  560.         ld (curcmdx),a
  561.         call strdelch ;удаляет предыдущий символ
  562.         jr editcmdok
  563.      
  564. editcmd_left
  565.         ld a,(curcmdx)
  566.         or a
  567.         jr z,editcmdok ;некуда влево
  568.         dec a
  569.         ld (curcmdx),a
  570.         jr editcmdok
  571.      
  572. editcmd_right
  573.         call cmdcalctextaddr ;hl=addr, a=curcmdx
  574.         inc (hl)
  575.         dec (hl)
  576.         jr z,editcmdok ;некуда право, стоим на терминаторе
  577.         inc a
  578.         ld (curcmdx),a
  579.         jr editcmdok
  580.  
  581. ;editcmd_up
  582. ;        ld de,cmdbuf
  583. ;        ld hl,oldcmd
  584. ;        ld bc,MAXCMDSZ+1
  585. ;        ldir
  586. ;        jp editcmd
  587.  
  588. strinsch
  589. ;insert char E at (hl), shift string right
  590. ;keeps ix
  591. editcmd_ins0
  592.         ld a,(hl)
  593.         ld (hl),e
  594.         ld e,a
  595.         inc hl
  596.         or a
  597.         jr nz,editcmd_ins0
  598.         ld (hl),a
  599.         ret
  600.  
  601. strdelch
  602. ;delete char at (hl-1), shift string left
  603. ;keeps ix
  604. editcmd_bs0
  605.         ld a,(hl)
  606.         dec hl
  607.         ld (hl),a
  608.         inc hl
  609.         inc hl
  610.         or a
  611.         jr nz,editcmd_bs0
  612.         ret
  613.  
  614. strlen
  615. ;hl=str
  616. ;out: hl=length
  617.         ld bc,0 ;чтобы точно найти терминатор
  618.         xor a
  619.         cpir ;найдём обязательно, если длина=0, то bc=-1 и т.д.
  620.         ld hl,-1
  621.         or a
  622.         sbc hl,bc
  623.         ret
  624.  
  625. cmdcalcpromptsz
  626.         ld a,1
  627.         ret
  628.  
  629. cmdcalctextaddr
  630. ;out: hl=addr, a=curcmdx
  631. ;keeps ix
  632.         ld a,(curcmdx)
  633.         ld c,a
  634.         ld b,0
  635.         ld hl,cmdbuf
  636.         add hl,bc
  637.         ret
  638.  
  639. cmdcalccurxy
  640. ;out: de=yx
  641. ;x=cmdpromptsz+curcmdx-curcmdscroll
  642.         call cmdcalcpromptsz ;a=promptsz
  643.         ld hl,curcmdx ;не на экране, а внутри команды
  644.         add a,(hl)
  645.         ld hl,curcmdscroll ;сдвиг команды относительно экрана
  646.         sub (hl)
  647.         ld e,a
  648.         ld d,txtscrhgt-1
  649.         ret
  650.  
  651. fixscroll_prcmd
  652. ;цикл поиска скролла для текущего положения курсора
  653. editcmd_scroll0
  654.         call cmdcalccurxy ;e=scrx
  655.         call cmdcalcpromptsz ;a=promptsz
  656.         ld hl,curcmdscroll
  657.         dec a
  658.         cp e ;scrx
  659.         jr c,editcmd_noscrollleft ;x>=promptsz (x>(promptsz-1))
  660. ;x<promptsz - скролл влево
  661.         dec (hl)
  662.         jr editcmd_scroll0
  663. editcmd_noscrollleft
  664.         ld a,e ;scrx
  665.         cp txtscrwid
  666.         jr c,editcmd_noscrollright
  667. ;x>=txtscrwid - скролл вправо
  668.         inc (hl)
  669.         jr editcmd_scroll0
  670. editcmd_noscrollright
  671. ;prcmd
  672.         ld de,_COLOR
  673.         SETCOLOR_
  674.         ld de,+(txtscrhgt-1)*256+0
  675.         SETXY_
  676.         ;ld a,0x0d
  677.         ;PRCHAR_
  678.         ;ld hl,cmdprompt
  679.         ld c,0
  680.         ;call cmdprtext
  681.         push bc
  682.         ld a,'>'
  683.         PRCHAR_
  684.         pop bc
  685.         inc c
  686.         ld hl,(curcmdscroll)
  687.         ld h,0
  688.         ld de,cmdbuf
  689.         add hl,de
  690.         call cmdprtext
  691. ;добьём остаток строки пробелами
  692. prcmdspc0
  693.         ld a,c
  694.         cp txtscrwid-1 ;оставлям место справа для курсора
  695.         ret z
  696.         push bc
  697.         ld a,' '
  698.         PRCHAR_
  699.         pop bc
  700.         inc c
  701.         jp prcmdspc0
  702.  
  703. cmdprtext
  704. cmdprtext0
  705.         ld a,(hl)
  706.         or a
  707.         ret z
  708.         push bc
  709.         push hl
  710.         PRCHAR_
  711.         pop hl
  712.         pop bc
  713.         inc c
  714.         inc hl
  715.         ld a,c
  716.         cp txtscrwid-1 ;оставлям место справа для курсора
  717.         jp nz,cmdprtext0
  718.         ret
  719.  
  720. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  721.  
  722. loginv
  723.         ld a,e
  724.         cpl
  725.         ld e,a
  726.         ld a,d
  727.         cpl
  728.         ld d,a
  729.         ld a,l
  730.         cpl
  731.         ld l,a
  732.         ld a,h
  733.         cpl
  734.         ld h,a
  735.         ret
  736.        
  737.  
  738. neghlde
  739.         xor a
  740.         sub e
  741.         ld e,a
  742.         ld a,0
  743.         sbc a,d
  744.         ld d,a
  745.         ld a,0
  746.         sbc a,l
  747.         ld l,a
  748.         ld a,0
  749.         sbc a,h
  750.         ld h,a
  751.         ret
  752.  
  753. negbcde
  754.         xor a
  755.         sub e
  756.         ld e,a
  757.         ld a,0
  758.         sbc a,d
  759.         ld d,a
  760.         ld a,0
  761.         sbc a,c
  762.         ld c,a
  763.         ld a,0
  764.         sbc a,b
  765.         ld b,a
  766.         ret
  767.  
  768. prlinenum_tomem
  769.         ld bc,prdword_digit_tomem
  770.         ld (prdword_digit_prchar_jp),bc
  771.         ld hl,0
  772.         jr prdword_subr
  773.        
  774. prword_de
  775. ;de=num
  776.         ld hl,0
  777. prdword_hlde
  778. ;hlde=num
  779.         ld bc,prdword_digit_toscr
  780.         ld (prdword_digit_prchar_jp),bc
  781.         bit 7,h
  782.         jr z,prdword_hlde_positive
  783.         ld a,'-'
  784.         call prdword_digit_prchar
  785.         call neghlde
  786. prdword_hlde_positive
  787. prdword_subr
  788.         ld a,' '
  789.         ld (prnumdwordcmd_zero),a
  790.         ld lx,0
  791.         ld bc,1000000000/65536
  792.         ld a,1000000000/256&#ff
  793.         call prdword_digit
  794.         ld bc,100000000/65536
  795.         ld a,100000000/256&#ff
  796.         call prdword_digit
  797.         ld a,h
  798.         ld lx,a
  799.         ld h,l
  800.         ld l,d
  801.         ld d,e
  802.         ld bc,10000000/256
  803.         ld a,10000000&#ff ;0x989680
  804.         call prdword_digit
  805.         ld bc,1000000/256
  806.         ld a,1000000&#ff
  807.         call prdword_digit
  808.         ld bc,100000/256
  809.         ld a,100000&#ff
  810.         call prdword_digit
  811.         ld bc,10000/256
  812.         ld a,10000&#ff
  813.         call prdword_digit
  814.         ld bc,1000/256
  815.         ld a,1000&#ff
  816.         call prdword_digit
  817.         ld bc,100/256
  818.         ld a,100&#ff
  819.         call prdword_digit
  820.         ld bc,10/256
  821.         ld a,10&#ff
  822.         call prdword_digit
  823.         ld a,d
  824.         add a,'0'
  825. prdword_digit_prchar
  826. prdword_digit_prchar_jp=$+1
  827.         jp prdword_digit_tomem
  828. prdword_digit_toscr
  829.         push de
  830.         push hl
  831.         push ix
  832.         PRCHAR_
  833.         pop ix
  834.         pop hl
  835.         pop de
  836.         ret
  837. prdword_digit_tomem
  838.         exx
  839.         ld (hl),a
  840.         inc hl
  841.         exx
  842.         ret
  843. prdword_digit
  844. ;hlde=num
  845. ;bca0=divisor
  846.         push de
  847.         ld e,a
  848.         ld a,d
  849.         ld d,'0'-1
  850. ;hla0=num
  851. ;bce0=divisor
  852. ;d=digit
  853. prdword_digit0
  854.         inc d
  855.         sub e
  856.         sbc hl,bc
  857.         jr nc,prdword_digit0
  858.         dec lx
  859.         jp p,prdword_digit0
  860.         add a,e
  861.         adc hl,bc
  862.         jr nc,$+4
  863.         inc lx
  864.          ld c,d ;digit
  865.         pop de
  866.         ld d,a ;hlde=num
  867.          ld a,c ;digit
  868.         cp '0'
  869.         jr nz,prnumdwordcmd_nozero
  870. prnumdwordcmd_zero=$+1
  871.         ld a,' '
  872.         cp ' '
  873.         ret z
  874.         jp prdword_digit_prchar
  875. prnumdwordcmd_nozero
  876.         call prdword_digit_prchar
  877.         ld a,'0'
  878.         ld (prnumdwordcmd_zero),a
  879.         ret
  880.  
  881. prstr_withlen=prtext
  882. ;hl=straddr
  883.         if 0
  884. ;hl=straddr (first byte = len (0..255))
  885.         ld a,(hl)
  886.         inc hl
  887.         or a
  888.         ret z
  889.         ld b,a
  890. prstr_withlen0
  891.         push bc
  892.         push hl
  893.         ld a,(hl)
  894.         PRCHAR_
  895.         pop hl
  896.         inc hl
  897.         pop bc
  898.         djnz prstr_withlen0
  899.         ret
  900.         endif
  901.        
  902. ;getvar_int
  903. ;a=name (char)
  904. ;out: hlde
  905.         ;call findvar_int ;hl=addr
  906. getint
  907.         ld e,(hl)
  908.         inc hl
  909.         ld d,(hl)
  910.         inc hl
  911.         ld a,(hl)
  912.         inc hl
  913.         ld h,(hl)
  914.         ld l,a
  915.         ret
  916.  
  917. ;getvar_str
  918. ;a=name (char)
  919. ;out: hl=straddr (first byte = len (0..255))
  920.         ;call findvar_str ;hl=addr
  921.         ;ret
  922.  
  923. setvar_int
  924. ;a=name (char), hlde=value
  925.         push hl
  926.         call findvar_int ;hl=addr
  927.         ld (hl),e
  928.         inc hl
  929.         ld (hl),d
  930.         inc hl
  931.         pop de
  932.         ld (hl),e
  933.         inc hl
  934.         ld (hl),d
  935.         ret
  936.  
  937. setvar_str
  938. ;a=name (char), hl=straddr
  939.         push hl
  940.         call findvar_str ;hl=addr
  941.         ex de,hl
  942.         pop hl
  943. strcopy
  944. ;hl -> de (first byte = len (0..255))
  945.         ld bc,256
  946.         ldir
  947.         ret
  948.  
  949. addvar_int
  950. ;a=name (char)
  951.         push de
  952.         ld hl,(varend)
  953.         ld d,h
  954.         ld e,l
  955.         inc hl
  956.         inc hl
  957.         inc hl
  958.         inc hl
  959.         ld (varend),hl
  960. ;de=addr
  961.         ld h,varindex_int/256
  962.         ld l,a
  963.         ld (hl),e
  964.         inc h
  965.         ld (hl),d
  966.         pop de
  967.         ret
  968.  
  969. addvar_str
  970. ;a=name (char)
  971.         push de
  972.         ld hl,(varend)
  973.         ld d,h
  974.         ld e,l
  975.         inc h
  976.         ld (varend),hl
  977. ;de=addr
  978.         ld h,varindex_int/256
  979.         add a,128
  980.         ld l,a
  981.         ld (hl),e
  982.         inc h
  983.         ld (hl),d
  984.         pop de
  985.         ret
  986.  
  987. findvar_index
  988. ;TODO проверка типа переменной (int не разрешается)
  989. findvar_array
  990. ;TODO проверка типа переменной
  991. findvar_int
  992. ;TODO проверка типа переменной (index разрешается, array не разрешается)
  993. ;a=name (char)
  994. ;out: hl=addr, z=error
  995.         ld h,varindex_int/256
  996.         ld l,a
  997.         ld a,(hl)
  998.         inc h
  999.         ld h,(hl)
  1000.         ld l,a
  1001.         or h
  1002.         ret
  1003.  
  1004. findvar_str
  1005. ;a=name (char)
  1006. ;out: hl=addr, z=error
  1007.         ld h,varindex_int/256
  1008.         add a,128
  1009.         ld l,a
  1010.         ld a,(hl)
  1011.         inc h
  1012.         ld h,(hl)
  1013.         ld l,a
  1014.         or h
  1015.         ret
  1016.  
  1017.  
  1018.  
  1019. cmd_line_parse
  1020. ;hl= cmd line after basic.com and spaces
  1021. cmd_line_parse_loop
  1022.         ld a,(hl)
  1023.         cp "-"
  1024.         ret nz; не ключ, значит возврат
  1025.         inc hl
  1026.         ld a,(hl)
  1027.         cp "c"
  1028.         call z, case_key_c
  1029.         cp "n"
  1030.         call z, case_key_n
  1031.         cp "h"
  1032.         call z, case_key_h
  1033.         cp "V"
  1034.         call z, case_key_v
  1035.         inc hl
  1036.         call skipspaces
  1037.         jp cmd_line_parse_loop
  1038.  
  1039. case_key_c
  1040.         ld a,1
  1041.         ld (cmd_line_c),a
  1042.         ret
  1043. case_key_n
  1044.         ld a,1
  1045.         ld (cmd_line_n),a
  1046.         ret
  1047. case_key_h
  1048.         ld a,1
  1049.         ld (cmd_line_h),a
  1050.         ret
  1051. case_key_v
  1052.         ld a,1
  1053.         ld (cmd_line_v),a
  1054.         ret
  1055.  
  1056. cmd_line_c db 0
  1057. cmd_line_n db 0
  1058. cmd_line_h db 0
  1059. cmd_line_v db 0
  1060.  
  1061.         ;include "../_sdk/prdword.asm"
  1062.        
  1063. text
  1064.         db "Hello world!",0x0d,0x0a,0
  1065.        
  1066. cmdbuf
  1067.         ds MAXCMDSZ+1
  1068.        
  1069. syscmdbuf
  1070.         db "cmd "
  1071. wordbuf
  1072.         ds MAXCMDSZ+1
  1073.  
  1074. curdir
  1075.         ds MAXPATH_sz;MAXCMDSZ+1
  1076.        
  1077. ;oldtimer
  1078. ;        dw 0
  1079.  
  1080. execcmd_pars
  1081.         dw 0
  1082.  
  1083. curcmdscroll ;сдвиг команды относительно экрана
  1084.         db 0
  1085. curcmdx ;не на экране, а внутри команды
  1086.         db 0
  1087.  
  1088. progend
  1089.         dw progmem
  1090. varend
  1091.         dw varmem
  1092.        
  1093.        
  1094.         align 256
  1095. varindex_int ;varindex_str лежат по адресу+128
  1096.         ds 512
  1097.  
  1098. ;varmem
  1099.        
  1100. cmd_end
  1101.  
  1102.         ;display "Size ",/d,cmd_end-cmd_begin," bytes"
  1103.  
  1104.         savebin "basic.com",cmd_begin,cmd_end-cmd_begin
  1105.        
  1106.         LABELSLIST "../../us/user.l"
  1107.