Subversion Repositories NedoOS

Rev

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

  1. functionslist
  2.         dw func_rnd
  3.         db "$rnd",0
  4.        
  5.         dw -1 ;ъюэхЎ ЄрсышЎ√ ЇєэъЎшщ
  6.  
  7. getval_function
  8. ;hl'=text
  9.         call eatword
  10.         ld hl,functionslist ;list of internal commands
  11. getval_function0
  12.         ld c,(hl)
  13.         inc hl
  14.         ld b,(hl) ;рфЁхё яЁюЎхфєЁ√, ёююЄтхЄёЄтє■∙хщ ¤Єющ ъюьрэфх
  15.         inc hl
  16.         ld a,b
  17.         cp -1
  18.         jp z,fail_syntax ;ret z ;jr z,strcpexec_tryrun ;a!=0: no such internal command
  19.         ld de,wordbuf
  20.         push hl
  21.         call strcp
  22.         pop hl
  23.         jr nz,getval_function_fail
  24.         ld h,b
  25.         ld l,c
  26.         jp (hl) ;run internal command
  27. getval_function_fail
  28.         ld b,-1 ;ўЄюс√ Єюўэю эрщЄш ЄхЁьшэрЄюЁ
  29.         xor a
  30.         cpir ;эрщф╕ь юс чрЄхы№эю
  31.         jr getval_function0
  32.  
  33. commandslist
  34.         dw cmd_for
  35.         db "for",0
  36.         dw cmd_next
  37.         db "next",0
  38.        
  39.         dw cmd_clear
  40.         db "clear",0
  41.         dw cmd_new
  42.         db "new",0
  43.         dw cmd_quit
  44.         db "quit",0
  45.         dw cmd_run
  46.         db "run",0
  47.         dw cmd_goto
  48.         db "goto",0
  49.         dw cmd_edit
  50.         db "edit",0
  51.         dw cmd_list
  52.         db "list",0
  53.         dw cmd_save
  54.         db "save",0
  55.         dw cmd_savecode
  56.         db "savecode",0
  57.         dw cmd_load
  58.         db "load",0
  59.         dw cmd_loadcode
  60.         db "loadcode",0
  61.         dw cmd_system
  62.         db "system",0
  63.         dw cmd_pause
  64.         db "pause",0
  65.        
  66.         dw cmd_let
  67.         db "let",0
  68.         dw cmd_dim
  69.         db "dim",0
  70.         dw cmd_print
  71.         db "print",0
  72.         dw cmd_cls
  73.         db "cls",0
  74.         dw cmd_gfx
  75.         db "gfx",0
  76.         dw cmd_plot
  77.         db "plot",0
  78.         dw cmd_line
  79.         db "line",0
  80.        
  81.         dw cmd_if
  82.         db "if",0
  83.         dw cmd_then
  84.         db "then",0
  85.         dw cmd_colon
  86.         db ":",0
  87.         dw cmd_rem
  88.         db "rem",0
  89.        
  90.         dw -1 ;ъюэхЎ ЄрсышЎ√ ъюьрэф
  91.  
  92. docmd
  93. ;hl'=text
  94.         exx
  95.         push hl
  96.         GET_KEY
  97.         pop hl
  98.         exx
  99.         cp csSpace
  100.         jp z,endbreak
  101.         call eatword
  102.         ld hl,commandslist ;list of internal commands
  103. strcpexec0
  104.         ld c,(hl)
  105.         inc hl
  106.         ld b,(hl) ;рфЁхё яЁюЎхфєЁ√, ёююЄтхЄёЄтє■∙хщ ¤Єющ ъюьрэфх
  107.         inc hl
  108.         ld a,b
  109.         cp -1
  110.         jp z,fail_syntax ;ret z ;jr z,strcpexec_tryrun ;a!=0: no such internal command
  111.         ld de,wordbuf
  112.         push hl
  113.         call strcp
  114.         pop hl
  115.         jr nz,strcpexec_fail
  116.         ld h,b
  117.         ld l,c
  118.         jp (hl) ;run internal command
  119. strcpexec_fail
  120.         ld b,-1 ;ўЄюс√ Єюўэю эрщЄш ЄхЁьшэрЄюЁ
  121.         xor a
  122.         cpir ;эрщф╕ь юс чрЄхы№эю
  123.         jr strcpexec0
  124.        
  125. eat
  126. ;hl'=ъєЁёюЁ
  127.         exx
  128.         inc hl
  129.         call skipspaces
  130.         exx
  131.         ret
  132.  
  133. eatword
  134.         exx
  135.         ld de,wordbuf
  136.         call getword
  137.  ;┴хЁхь ёыютю шч (HL)-> wordbuf
  138.         call skipspaces
  139.  ; т (HL) яЁюяєёърхь яЁюсхы√
  140.         exx
  141.         ret
  142.  
  143. eatclosebracket
  144.         exx
  145.         ld a,(hl)
  146.         exx
  147.         cp ')'
  148.         jp nz,fail_syntax
  149.         jp eat
  150.        
  151. eateq
  152.         exx
  153.         ld a,(hl)
  154.         exx
  155.         cp '='
  156.         jp nz,fail_syntax
  157.         jp eat
  158.        
  159. eatcomma
  160.         exx
  161.         ld a,(hl)
  162.         exx
  163.         cp ','
  164.         jp nz,fail_syntax
  165.         jp eat
  166.  
  167. cmd_pause
  168.         exx
  169.         push hl
  170.         YIELDGETKEYLOOP
  171.         pop hl
  172.         exx
  173.         ret
  174.  
  175. cmd_gfx
  176.         call getexpr
  177.         exx
  178.         push hl
  179.         exx
  180.         ld a,e
  181.         and 7
  182.         OS_SETGFX
  183.         pop hl
  184.         exx
  185.         ret
  186.  
  187. getexprcolor
  188. ;out: a=color = %33210210
  189.         call getexpr
  190.         ld a,e
  191.         and 7
  192.         ld d,a
  193.         ld a,e
  194.         and 15
  195.         add a,a
  196.         add a,a
  197.         add a,a
  198.         or d ;%.3210210
  199.         rlca
  200.         rlca ;%210210.3, CY=3
  201.         rra  ;%3210210., CY=3
  202.         rra  ;%33210210
  203.         ret
  204.  
  205. cmd_line
  206. ;hl'=ъєЁёюЁ
  207. ;line x2,y2,color
  208.         call getexpr
  209.         ld (cmd_line_x2),de
  210.         call eatcomma
  211.         call getexpr
  212.         ld (cmd_line_y2),de
  213.         call eatcomma
  214.         call getexprcolor ;a=color = %33210210
  215.  
  216.         push af ;color
  217.         call setpgs_scr
  218.         pop af ;color
  219.         ld bc,(cmd_plot_x)
  220.         ld de,(cmd_plot_y)
  221. cmd_line_x2=$+2
  222.         ld ix,0
  223.         ld (cmd_plot_x),ix
  224. cmd_line_y2=$+1
  225.         ld hl,0
  226.         ld (cmd_plot_y),hl
  227. ;bc=x (т яыюёъюёЄш ¤ъЁрэр, эю ьюцхЄ с√Є№ юЄЁшЎрЄхы№э√ь)
  228. ;de=y (т яыюёъюёЄш ¤ъЁрэр, эю ьюцхЄ с√Є№ юЄЁшЎрЄхы№э√ь)
  229. ;ix=x2
  230. ;hl=y2
  231. ;a=color = %332103210
  232.         exx
  233.         push hl
  234.         exx
  235.         call shapes_line
  236.         ;exx
  237.         pop hl
  238.         exx
  239.         jp restorebasicpages
  240.        
  241. cmd_plot
  242. ;hl'=ъєЁёюЁ
  243. ;plot x,y,color
  244.         call getexpr
  245.         ld (cmd_plot_x),de
  246.         call eatcomma
  247.         call getexpr
  248.         ld (cmd_plot_y),de
  249.         call eatcomma
  250.         call getexprcolor
  251.         ld lx,a ;lx=color = %33210210
  252. cmd_plot_x=$+1
  253.         ld hl,0
  254.         ld bc,320
  255.         or a
  256.         sbc hl,bc
  257.         add hl,bc
  258.         ret nc
  259.         ex de,hl
  260.        
  261. cmd_plot_y=$+1
  262.         ld hl,0
  263.         ld bc,200
  264.         or a
  265.         sbc hl,bc
  266.         add hl,bc
  267.         ret nc
  268. ;l=y
  269.         call setpgs_scr
  270.         ld c,l
  271. ;de=x
  272. ;c=y
  273. ;lx=color = %33210210
  274.         call prpixel
  275.         jp restorebasicpages
  276.  
  277. setpgs_scr
  278. setpgs_scr_low=$+1
  279.         ld a,0;pgscr0_0 ;scr0_0
  280.         SETPG32KLOW
  281. setpgs_scr_high=$+1
  282.         ld a,0;pgscr0_1 ;scr0_1
  283.         SETPG32KHIGH
  284.         ret
  285.  
  286.        
  287. scrbase=0x8000
  288. prpixel
  289. ;de=x (эх яюЁЄшЄё )
  290. ;c=y (bc эх яюЁЄшЄё )
  291. ;lx=color = %33210210
  292.        ld a,b
  293.         ld l,c
  294.         ld h,0
  295.         ld b,scrbase/256/8 ;h
  296.         add hl,hl
  297.         add hl,hl
  298.         add hl,bc
  299.         add hl,hl
  300.         add hl,hl
  301.         add hl,hl ;y*40 + scrbase
  302.        ld b,a
  303. prpixel_cury
  304. ;de=x (эх яюЁЄшЄё )
  305. ;hl=addr(y)
  306. ;lx=color = %33210210
  307.         ld a,d
  308.         rra
  309.         ld a,e
  310.         rra
  311.         jr c,prpixel_r
  312.         rra
  313.         jr nc,$+4
  314.         set 6,h
  315.         rra
  316.         jr nc,$+4
  317.         set 5,h
  318.         and %00111111
  319.         add a,l
  320.         ld l,a
  321.         adc a,h
  322.         sub l
  323.         ld h,a
  324.         ld a,lx
  325.         xor (hl)
  326.         and %01000111 ;keep left pixel
  327.         xor (hl) ;right pixel from screen
  328.         ld (hl),a
  329.         ret
  330. prpixel_r
  331.         rra
  332.         jr nc,$+4
  333.         set 6,h
  334.         rra
  335.         jr nc,$+4
  336.         set 5,h
  337.         and %00111111
  338.         add a,l
  339.         ld l,a
  340.         adc a,h
  341.         sub l
  342.         ld h,a
  343.         ld a,lx
  344.         xor (hl)
  345.         and %10111000 ;keep right pixel
  346.         xor (hl) ;left pixel from screen
  347.         ld (hl),a
  348.         ret
  349.  
  350. shapes_line
  351. ;bc=x (т яыюёъюёЄш ¤ъЁрэр, эю ьюцхЄ с√Є№ юЄЁшЎрЄхы№э√ь)
  352. ;de=y (т яыюёъюёЄш ¤ъЁрэр, эю ьюцхЄ с√Є№ юЄЁшЎрЄхы№э√ь)
  353. ;ix=x2
  354. ;hl=y2
  355. ;a=color = %332103210
  356.         ld (line_pixel_color),a
  357.         or a
  358.         sbc hl,de
  359.         add hl,de
  360.         jp p,shapes_line_noswap
  361.         ex de,hl ;y <-> y2
  362.         push ix
  363.         push bc
  364.         pop ix
  365.         pop bc ;x <-> x2
  366. shapes_line_noswap
  367.         or a
  368.         sbc hl,de ;dy >= 0
  369.         push hl ;dy
  370.         push ix
  371.         pop hl
  372.         sbc hl,bc
  373.         push hl ;dx
  374.         exx
  375.         pop bc ;dx
  376.         ld a,#03 ;inc bc
  377.         jp p,shapes_line_nodec
  378.         xor a
  379.         sub c
  380.         ld c,a
  381.         sbc a,b
  382.         sub c
  383.         ld b,a ;dx >= 0
  384.         ld a,#0b ;dec bc
  385. shapes_line_nodec
  386.         pop de ;dy
  387. ;a=ъюф inc/dec bc
  388. ;bc'=x (т яыюёъюёЄш ¤ъЁрэр, эю ьюцхЄ с√Є№ юЄЁшЎрЄхы№э√ь)
  389. ;de'=y (т яыюёъюёЄш ¤ъЁрэр, эю ьюцхЄ с√Є№ юЄЁшЎрЄхы№э√ь)
  390. ;bc=dx
  391. ;de=dy
  392.         ex de,hl
  393.         or a
  394.         sbc hl,bc
  395.         add hl,bc
  396.         ex de,hl
  397.         jr nc,shapes_linever ;dy>=dx
  398.         ld hy,b
  399.         ld ly,c ;counter=dx
  400.         inc iy ;inc hy ;Ёшёєхь, тъы■ўр  яюёыхфэшщ яшъёхы№ (єўЄхэю т Ўшъых)
  401.         ld h,b
  402.         ld l,c
  403.         sra h
  404.         rr l ;ym=dx div 2 ;TODO р хёыш dx<0?
  405.          ;xor a
  406.          ;sub l
  407.          ;ld l,a
  408.          ;sbc a,h
  409.          ;sub l
  410.          ;ld h,a ;mym=256-(dx div 2)
  411.         exx
  412.         ld (shapes_lineincx),a
  413. ;bc=x
  414. ;de=y
  415. ;hl'=xm
  416. ;bc'=dx
  417. ;de'=dy
  418. shapes_linehor0
  419.         call line_pixel
  420. shapes_lineincx=$
  421.         inc bc ;x+1        
  422.         exx
  423.         ;add hl,de ;mym+dy
  424.         or a
  425.         sbc hl,de ;ym-dy
  426.         exx
  427.         jr nc,shapes_linehor1
  428.         inc de ;y+1
  429.         exx
  430.         ;or a
  431.         ;sbc hl,bc ;mym-dx
  432.         add hl,bc ;ym+dx
  433.         exx
  434. shapes_linehor1
  435.         dec iy
  436.         ld a,hy
  437.         rla
  438.         jp nc,shapes_linehor0
  439.         ret
  440. shapes_linever
  441.         ld hy,d
  442.         ld ly,e ;counter=dy
  443.         ;inc iy ;inc hy ;Ёшёєхь, тъы■ўр  яюёыхфэшщ яшъёхы№ (єўЄхэю т Ўшъых)
  444.         ld h,d
  445.         ld l,e
  446.         sra h
  447.         rr l
  448.          ;xor a
  449.          ;sub l
  450.          ;ld l,a
  451.          ;sbc a,h
  452.          ;sub l
  453.          ;ld h,a ;mxm=256-(dy div 2)
  454.         exx
  455.         ld (shapes_lineincx2),a
  456. ;bc=x
  457. ;de=y
  458. ;hl'=xm
  459. ;bc'=dx
  460. ;de'=dy
  461. shapes_linever0
  462.         call line_pixel
  463.         inc de ;y+1
  464.         exx
  465.         ;add hl,bc ;mxm+dx
  466.         or a
  467.         sbc hl,bc ;xm-dx ;TODO р хёыш dx<0?
  468.         exx
  469.         jr nc,shapes_linever1
  470. shapes_lineincx2=$
  471.         inc bc ;x+1
  472.         exx
  473.         ;or a
  474.         ;sbc hl,de ;mxm-dy
  475.         add hl,de ;xm+dy
  476.         exx
  477. shapes_linever1
  478.         dec iy
  479.         ld a,hy
  480.         rla
  481.         jp nc,shapes_linever0
  482.         ret
  483.  
  484. line_pixel
  485. ;bc=x (ьюцхЄ с√Є№ юЄЁшЎрЄхы№э√ь)
  486. ;de=y (ьюцхЄ с√Є№ юЄЁшЎрЄхы№э√ь)
  487.         ld hl,199
  488.         or a
  489.         sbc hl,de ;y
  490.         ret c ;y>199
  491.         ld hl,319
  492.         or a
  493.         sbc hl,bc ;x
  494.         ret c ;x>319
  495.         push bc
  496.         push de
  497.         push ix
  498.         ld a,e
  499.         ld d,b
  500.         ld e,c ;de=x
  501.         ld c,a ;c=y
  502. line_pixel_color=$+2
  503.         ld lx,0
  504. ;de=x (эх яюЁЄшЄё )
  505. ;c=y (bc эх яюЁЄшЄё )
  506. ;lx=color = %33210210
  507.         call prpixel
  508.         pop ix
  509.         pop de
  510.         pop bc
  511.         ret
  512.        
  513. cmd_system
  514. ;hl'=ъєЁёюЁ
  515. ;system "command params"
  516.         call getexpr
  517.         bit 7,c
  518.         jp z,fail_syntax
  519.         exx
  520.         push hl
  521.         exx
  522. ;hl = wordbuf = string
  523.  
  524.         ld de,curdir ;DE = Pointer to 64 byte (MAXPATH_sz!) buffer
  525.         OS_GETPATH
  526.         OS_SETSYSDRV ;TODO ърЄрыюу cmd
  527.        
  528.         ld de,tcmd
  529.         OS_OPENHANDLE
  530.         or a
  531.         jp nz,fail_fo
  532.         ld a,b
  533.         ld (cmd_system_handle),a
  534.         OS_NEWAPP
  535.         or a
  536.         jp nz,close_restoredir_fail
  537. ;dehl=эюьхЁр ёЄЁрэшЎ т 0000,4000,8000,c000 эютюую яЁшыюцхэш , b=id, a=error
  538.         push bc ;b=id
  539.        
  540.         ld a,d
  541.         SETPG32KHIGH
  542.         push de
  543.         push hl
  544.         ld hl,syscmdbuf
  545.         ld de,#c000+COMMANDLINE
  546.         ld bc,COMMANDLINE_sz
  547.         ldir ;command line
  548.         xor a
  549.         ld (#c000+COMMANDLINE+COMMANDLINE_sz-1),a ;эр ёыєўрщ, хёыш "cmd "+wordbuf сюы№°х 128 срщЄ
  550.         pop hl
  551.         pop de
  552. cmd_system_handle=$+1
  553.         ld b,0
  554.         call readfile_pages_dehl
  555.         call cmd_system_close_restoredir
  556.  
  557.         pop af ;a=id
  558.         ld e,a
  559.         push de
  560.         OS_RUNAPP
  561.         pop de
  562.         WAITPID
  563.         pop hl
  564.         exx
  565.         ret
  566.        
  567. cmd_system_close_restoredir
  568.         ld a,(cmd_system_handle)
  569.         ld b,a
  570.         OS_CLOSEHANDLE
  571.         ld de,curdir
  572.         OS_CHDIR
  573.         jp restorebasicpages
  574.        
  575. close_restoredir_fail
  576.         call cmd_system_close_restoredir
  577.         jp fail_fo
  578.  
  579. popret
  580.         pop af
  581.         ret
  582. readfile_pages_dehl
  583.         ld a,d
  584.         push bc
  585.         SETPG32KHIGH
  586.         pop bc
  587.          ld a,e
  588.          push af
  589.         ld a,+(#c000+PROGSTART)/256
  590.         call cmd_loadpage
  591.         jr nz,popret
  592.          pop af ;e
  593.         call cmd_setpgloadpage
  594.         ret nz
  595.         ld a,h
  596.         call cmd_setpgloadpage
  597.         ret nz
  598.         ld a,l
  599. cmd_setpgloadpage
  600.         push bc
  601.         SETPG32KHIGH
  602.         pop bc
  603.         ld a,#c000/256
  604. cmd_loadpage
  605. ;a=loadaddr/256
  606. ;b=handle
  607. ;out: de=bytes read, NZ=end of file
  608. ;keeps hl,bc
  609.         push bc
  610.         push hl
  611.         ld d,a
  612.         ld e,0
  613.         ld hl,0
  614.         or a
  615.         sbc hl,de
  616. ;B = file handle, DE = Buffer address, HL = Number of bytes to read
  617.         push hl
  618.         OS_READHANDLE
  619. ;HL = Number of bytes actually read, A=error(=0)
  620.         ex de,hl
  621.         pop hl
  622.         or a
  623.         sbc hl,de ;Number of bytes to read - Number of bytes actually read
  624.         pop hl
  625.         pop bc
  626.         ret
  627.  
  628.  
  629. tcmd
  630.         db "cmd.com",0
  631.        
  632.        
  633. cmd_loadcode
  634. ;hl'=ъєЁёюЁ
  635. ;load "name.bas"
  636.         call getexpr
  637.         bit 7,c
  638.         jp z,fail_syntax
  639.         call cmd_load_hl
  640. ;эхы№ч  т√їюфшЄ№ яю ret, яюЄюьє ўЄю ёЄрЁр  яЁюуЁрььр єэшўЄюцхэр
  641.         jp endofprog
  642.        
  643. cmd_load_hl
  644. ;hl = wordbuf = filename
  645.         ;exx
  646.         ;ld a,(hl)
  647.         ;exx
  648.         ;cp '"'
  649.         ;jp nz,fail
  650.         ;call readstr
  651.         ;jp c,fail
  652. ;wordbuf = filename
  653.         ;ld de,wordbuf ;de=drive/path/file
  654.         ex de,hl
  655.         OS_OPENHANDLE
  656. ;b=new file handle
  657.         or a
  658.         jp nz,fail_fo
  659.         ld de,progmem
  660.         ld hl,szprogmem
  661. ;B = file handle, DE = Buffer address, HL = Number of bytes to read
  662.         push bc
  663.         OS_READHANDLE
  664.         pop bc
  665. ;HL = Number of bytes actually read, A=error
  666.         ld de,progmem
  667.         add hl,de
  668.         ld (progend),hl
  669.         OS_CLOSEHANDLE        
  670.         call cmd_clear
  671.         ret
  672.  
  673. cmd_load
  674. ;hl'=ъєЁёюЁ
  675. ;load "name.bas"
  676.         call getexpr
  677.         bit 7,c
  678.         jp z,fail_syntax
  679.         call cmd_load_text
  680. ;эхы№ч  т√їюфшЄ№ яю ret, яюЄюьє ўЄю ёЄрЁр  яЁюуЁрььр єэшўЄюцхэр
  681.         jp endofprog
  682.  
  683. cmd_load_text
  684. ;hl = wordbuf = filename
  685.         ;ld de,wordbuf ;de=drive/path/file
  686.         ex de,hl
  687.         OS_OPENHANDLE
  688. ;b=new file handle
  689.         or a
  690.         jp nz,fail_fo
  691.  
  692. read_next_str
  693.         ld de,cmdbuf
  694.         ld hl,1
  695. read_fsmb
  696. ;B = file handle, DE = Buffer address, HL = Number of bytes to read
  697.         push bc
  698.         push de
  699.         OS_READHANDLE
  700.         pop de
  701.         pop bc
  702.         ld a,l
  703.         or a
  704.         jp z,endfile ;┼ёыш эх яЁюўшЄрыш = ъюэхЎ Їрщыр - т√їюфшь
  705.         ld a,(de)
  706.         cp 0x0A
  707.         jp z,end_read ; ═ютр  ёЄЁюър юяЁхфхы хЄё  яю 0x0A
  708.         ld a,(de)
  709.         cp 0x0D
  710.         jp z,read_fsmb ; ╧ЁюёЄю яЁюуырЄ√трхь ёшьтюы тючтЁрЄр ърЁхЄъш
  711.         inc de
  712.         jp read_fsmb
  713.  
  714. end_read
  715.         xor a
  716.         ld (de),a ;ёЄртшь ЄхЁьшэрЄюЁ т ёЄЁюъє
  717.         ld hl,cmdbuf
  718.  
  719.         ex de,hl
  720.         ;or a
  721.         sbc hl,de ;т√ўшёы хь фышэє ёЄЁюъш
  722.         jp z, read_next_str ; хёыш яєёЄр  ёЄЁюър, ўшЄрхь ёыхфє■∙є■
  723.         ex de,hl ;тючтЁр∙рхь эр ьхёЄю hl=cmdbuf
  724.         push bc ; ═р тё ъшщ ёыєўрщ ёюїЁрэ хь file handle, ьрыю ыш ўхую...
  725.         call add_or_run_line
  726.         pop bc
  727.         jp read_next_str
  728.  
  729. endfile
  730.         OS_CLOSEHANDLE
  731.         ld hl,cmdbuf; шэрўх т ъюьрэфэющ ёЄЁюъх яюёыхфэ   чруЁєцхээр  шч Їрщыр ъюьрэфр
  732.         ld (hl),0
  733.         jp cmd_clear
  734.  
  735. cmd_savecode ; юЁшушэры№эр  яЁюЎхфєЁр с√ёЄЁющ т√уЁєчъш яЁюуЁрьь√ т Їрщы
  736. ;hl'=ъєЁёюЁ
  737. ;save "name.bas"
  738.         call getexpr
  739.         bit 7,c
  740.         jp z,fail_syntax
  741.         ;exx
  742.         ;ld a,(hl)
  743.         ;exx
  744.         ;cp '"'
  745.         ;jp nz,fail
  746.         ;call readstr
  747.         ;jp c,fail
  748. ;wordbuf = filename
  749.         ;ld de,wordbuf ;de=drive/path/file
  750.         ex de,hl
  751.         OS_CREATEHANDLE
  752. ;b=new file handle
  753.         or a
  754.         jp nz,fail_fo
  755.         ld hl,(progend)
  756.         ld de,progmem
  757.         ;or a
  758.         sbc hl,de
  759. ;B = file handle, DE = Buffer address, HL = Number of bytes to write
  760.         push bc
  761.         OS_WRITEHANDLE
  762.         pop bc
  763.         OS_CLOSEHANDLE
  764.         ld hl,cmdbuf ; ъєЁёюЁ эр эрўрыю сєЇхЁр
  765.         ld (hl),0
  766.         exx
  767.         ret
  768.  
  769. cmd_save
  770. ;hl'=ъєЁёюЁ
  771. ;save "name.bas"
  772.         call getexpr
  773.         bit 7,c
  774.         jp z,fail_syntax
  775.         ex de,hl
  776. ;de=drive/path/file
  777.         OS_CREATEHANDLE
  778.         push bc ;filehandle
  779.         display cmd_save, " cmd_save"
  780.         display cmdbuf, " cmdbuf"
  781.        
  782. ;b=new file handle
  783.         or a
  784.         jp nz,fail_fo
  785. ;ЇюЁьрЄ ёЄЁюъ: эюьхЁ ёЄЁюъш(ёЄ,ьы), фышэр ёЄЁюъш(ьы,ёЄ), ёЄЁюър(asciiz)
  786.         ld hl,progmem
  787. save_lines0
  788.         ld de,(progend)
  789.         or a
  790.         sbc hl,de
  791.         add hl,de
  792.         jr z,save_end
  793.        
  794.         push hl ;╧ЁютхЁър эр эрцрЄшх сЁшъ
  795.         GET_KEY
  796.         pop hl
  797.         cp csSpace
  798.         jp z,endbreak
  799.  
  800.         ld d, (hl) ; чруЁєцрхь т DE эюьхЁ ёЄЁюъш
  801.         inc hl
  802.         ld e, (hl)
  803.         inc hl
  804.  
  805.         push hl ; яЁюфюыцхэшх ёЄЁюъш
  806.         push de ; эюьхЁ т hex
  807.         ld hl,cmdbuf ; эрфю чруЁєчшЄ№ т hl' сєЇхЁ ъєфр яюыюцшЄ№ єцх ЄхъёЄют√щ эюьхЁ ёЄЁюъш
  808.         exx ; т hl' ЄхяхЁ№ эюьхЁ
  809.         pop de ; эюьхЁ т hex
  810.         call prlinenum_tomem ; hl' ъєфр, de эюьхЁ т hex
  811.         exx
  812.         ex hl,de ; de эр яЁюфюыцхэшх cmdbuf
  813.         pop hl; яЁюфюыцрэшх ёЄЁюъш
  814.  
  815.         ld a,' ' ; яЁюсхы
  816.         ld (de),a
  817.         inc de
  818.         ld c,(hl) ;фышэр ёЄЁюъш
  819.         inc hl
  820.         ld b,(hl) ;фышэр ёЄЁюъш
  821.         inc hl
  822.         ldir      ;ъюяшЁєхь тё■ ёЄЁюъє т de
  823.         ld a,0x0D
  824.         ld (de),a
  825.         inc de
  826.         ld a,0x0A
  827.         ld (de),a
  828.         inc de
  829.         inc hl; яЁюяєёърхь ЄхЁьшэрЄюЁ
  830.  
  831.         pop bc ; фюёЄрхь filehandle
  832.         push bc ;filehandle эрь х∙╕ яЁшуюфшЄё 
  833.         push hl ;Єрь ёыхфє■∙р  ёЄЁюър
  834.         ld hl,cmdbuf
  835.         ex hl,de
  836.         sbc hl,de ; т hl фышэр яюыєўшт°хщё  ЄхъёЄютющ ёЄЁюъш
  837.         ld de,cmdbuf ; т de рфЁхё ёрьющ ёЄЁюъш
  838.  
  839. ;B = file handle, DE = Buffer address, HL = Number of bytes to write
  840.         OS_WRITEHANDLE
  841.         pop hl ; ёыхфє■∙р  ёЄЁюър
  842.         jr save_lines0
  843. save_end
  844.         pop bc
  845.         OS_CLOSEHANDLE
  846.         ld hl,cmdbuf
  847.         ld (hl),0 ; юўш∙рхь ъюьрэфэє■ ёЄЁюъє
  848.         exx ; hl' ъєЁёюЁ эр эрўрыю сєЇхЁр
  849.         ret
  850.        
  851. cmd_new
  852.         ld hl,progmem
  853.         ld (progend),hl
  854.         call cmd_clear
  855.         jp endofprog
  856.  
  857. cmd_clear
  858.         ld hl,varmem
  859.         ld (varend),hl
  860.         ld hl,varindex_int
  861.         ld de,varindex_int+1
  862.         ld bc,511
  863.         ld (hl),l;0
  864.         ldir
  865.         ret
  866.        
  867. cmd_rem
  868.         jp gotonextline
  869.        
  870. cmd_for
  871. ;hl'=ъєЁёюЁ
  872. ;for i=1 to 10 step 2
  873. ;ярЁрьхЄЁ√ Ўшъыр (4+4(step)+4(to)+4(goto) срщЄр)
  874.         exx
  875.         ld a,(hl)
  876.         exx
  877.         ld c,a ;шь 
  878.         call eat
  879.        
  880.         ld a,c
  881.         call findvar_index
  882.         jr nz,cmd_for_nocreate
  883.         ld hl,(varend)
  884.         push hl
  885.         ld de,4*4
  886.         add hl,de
  887.         ld (varend),hl
  888.         pop de
  889. ;de=addr
  890.         ld h,varindex_int/256
  891.         ld l,c
  892.         ld (hl),e
  893.         inc h
  894.         ld (hl),d
  895. cmd_for_nocreate
  896.  
  897.         call eateq
  898.         push bc
  899.         call getexpr
  900.         pop bc
  901.         ld a,c
  902.         call setvar_int
  903.        
  904.         call eatword ;to
  905.        
  906.         push bc
  907.         call getexpr
  908.         pop bc
  909.         push hl ;HSW
  910.         push de ;LSW
  911.         ld a,c
  912.         call findvar_index
  913.         ld de,4+4
  914.         add hl,de
  915.         pop de ;LSW
  916.         ld (hl),e
  917.         inc hl
  918.         ld (hl),d
  919.         inc hl
  920.         pop de ;HSW
  921.         ld (hl),e
  922.         inc hl
  923.         ld (hl),d
  924.        
  925.         call eatword ;step
  926.        
  927.         push bc
  928.         call getexpr ;hlde=step
  929.         pop bc
  930.        
  931.         ld a,h
  932.         or l
  933.         or d
  934.         or e
  935.         jp z,fail_syntax
  936.                
  937.         push hl ;HSW
  938.         push de ;LSW
  939.         ld a,c
  940.         call findvar_index
  941.         ld de,4
  942.         add hl,de
  943.         pop de ;LSW
  944.         ld (hl),e
  945.         inc hl
  946.         ld (hl),d
  947.         inc hl
  948.         pop de ;HSW
  949.         ld (hl),e
  950.         inc hl
  951.         ld (hl),d
  952.        
  953.         ld a,c
  954.         call findvar_index
  955.         ld de,4+4+4
  956.         add hl,de
  957. ;currunline=$+1
  958.         ;ld de,0
  959.         ;inc de
  960.         exx
  961.         push hl
  962.         exx
  963.         pop de
  964.         ld (hl),e
  965.         inc hl
  966.         ld (hl),d
  967.         inc hl
  968.         ld (hl),0
  969.         inc hl
  970.         ld (hl),0
  971.  
  972.         ret
  973.        
  974. cmd_next
  975. ;hl'=ъєЁёюЁ
  976. ;next i (i = i+step, if i<=to then goto...)
  977.         exx
  978.         ld a,(hl)
  979.         exx
  980.         ld c,a ;шь 
  981.         call eat
  982.        
  983.         ld a,c
  984.         call findvar_index
  985.         jp z,fail_syntax
  986.        
  987.         push hl
  988.         ld e,(hl)
  989.         inc hl
  990.         ld d,(hl)
  991.         inc hl
  992.         ld c,(hl)
  993.         inc hl
  994.         ld b,(hl)
  995.         inc hl ;bcde = i
  996.        
  997.         ld a,(hl)
  998.         add a,e
  999.         ld e,a
  1000.         inc hl
  1001.         ld a,(hl)
  1002.         adc a,d
  1003.         ld d,a
  1004.         inc hl
  1005.         ld a,(hl)
  1006.         adc a,c
  1007.         ld c,a
  1008.         inc hl
  1009.         ld a,(hl)
  1010.         adc a,b
  1011.         ld b,a ;bcde = i = i+step
  1012.        
  1013.         ex (sp),hl
  1014.         ld (hl),e
  1015.         inc hl
  1016.         ld (hl),d
  1017.         inc hl
  1018.         ld (hl),c
  1019.         inc hl
  1020.         ld (hl),b
  1021.         inc hl
  1022.         pop hl
  1023.        
  1024.         bit 7,(hl) ;step>=0?
  1025.         push af
  1026.         inc hl
  1027.        
  1028. ;to>=i?
  1029.         ld a,(hl)
  1030.         sub e
  1031.         ld e,a
  1032.         inc hl
  1033.         ld a,(hl)
  1034.         sbc a,d
  1035.         ld d,a
  1036.         inc hl
  1037.         ld a,(hl)
  1038.         sbc a,c
  1039.         ld c,a
  1040.         inc hl
  1041.         ld a,(hl)
  1042.         sbc a,b
  1043.         ld b,a
  1044.         inc hl
  1045. ;bcde = to-i
  1046. ;TODO чэръютюх яхЁхяюыэхэшх
  1047.         pop af ;NZ = step<0
  1048.         call nz,negbcde
  1049. ;i<=to (to-i >= 0) - continue loop
  1050.         bit 7,b ;Z = to-i>=0
  1051.         ret nz ;end of loop
  1052.         call getint ;de=рфЁхё яюёых for ;с√ыю hlde=эюьхЁ ёЄЁюъш
  1053.         ex de,hl
  1054.         exx
  1055.         ret
  1056.         ;jp cmd_goto_ok
  1057.        
  1058. cmd_dim
  1059. ;hl'=ъєЁёюЁ
  1060. ;dim a(15) - эєьхЁрЎш  ¤ыхьхэЄют ё эєы 
  1061.         exx
  1062.         ld a,(hl)
  1063.         exx
  1064.         ld c,a ;шь 
  1065.         call eat
  1066.        
  1067.         ld a,c
  1068.         call findvar_array
  1069.         jp nz,fail_syntax ;єцх хёЄ№ Єрър  яхЁхьхээр 
  1070.  
  1071.         exx
  1072.         ld a,(hl)
  1073.         exx
  1074.         cp '('
  1075.         jp nz,fail_syntax
  1076.         call eat
  1077.         push bc
  1078.         call getexpr
  1079.         pop bc
  1080.         call eatclosebracket
  1081.        
  1082. ;hlde=de=size
  1083.  
  1084. ;c=name (char)
  1085.         ld hl,(varend)
  1086.         push hl
  1087.         ld (hl),e
  1088.         inc hl
  1089.         ld (hl),d
  1090.         inc hl
  1091.         add hl,de
  1092.         add hl,de
  1093.         add hl,de
  1094.         add hl,de
  1095.         ld (varend),hl
  1096.         pop de
  1097. ;de=addr
  1098.         ld h,varindex_int/256
  1099.         ld l,c
  1100.         ld (hl),e
  1101.         inc h
  1102.         ld (hl),d
  1103.         ret
  1104.        
  1105. cmd_edit
  1106. ;hl'=ъєЁёюЁ
  1107.         call getexpr
  1108.         call findline
  1109.         ld a,(hl)
  1110.         cp d
  1111.         jp nz,fail_syntax
  1112.         inc hl
  1113.         ld a,(hl)
  1114.         cp e
  1115.         jp nz,fail_syntax
  1116.         ;hl=рфЁхё ёЄЁюъш, ъюЄюЁє■ эрфю тч Є№ + 1
  1117.         inc hl
  1118.         inc hl
  1119.         inc hl
  1120.        
  1121.         push hl
  1122.         exx
  1123.         ld hl,cmdbuf
  1124.         exx
  1125.         call prlinenum_tomem
  1126.         exx
  1127.         ld (hl),' '
  1128.         inc hl
  1129.         push hl
  1130.         exx
  1131.         pop de ;cmdbuf+эюьхЁ
  1132.         pop hl ;hl=рфЁхё ёЄЁюъш (ЄхъёЄ)
  1133.        
  1134.         push hl
  1135.         call strlen
  1136.         ld b,h
  1137.         ld c,l
  1138.         inc bc ;фышэр ё ЄхЁьшэрЄюЁюь
  1139.         pop hl
  1140.        
  1141.         ;ld de,cmdbuf
  1142.         ;ld bc,MAXCMDSZ+1
  1143.         ldir
  1144.         jp endofedit
  1145.        
  1146. cmd_then
  1147. cmd_colon
  1148.         ret
  1149.        
  1150. cmd_list
  1151. ;эюьхЁ ёЄЁюъш(ёЄ,ьы), фышэр ёЄЁюъш(ьы,ёЄ), ёЄЁюър(asciiz)
  1152.         ld hl,progmem ; progmem ъюэёЄрэЄр чрфр■∙р  эрўрыю ярь Єш яЁюуЁрьь√
  1153. list_lines0
  1154.         ld de,(progend) ; яю рфЁхёє progend эрїюфшЄё  яхЁхьхээр  єърч√тр■∙р  эр ъюэхЎ ярь Єш яЁюуЁрьь√
  1155.         or a
  1156.         sbc hl,de
  1157.         add hl,de
  1158.         ret z
  1159.        
  1160.         push hl ;╧ЁютхЁър эр эрцрЄшх сЁшъ
  1161.         GET_KEY
  1162.         pop hl
  1163.         cp csSpace
  1164.         jp z,endbreak
  1165.  
  1166.         ld d,(hl)
  1167.         inc hl
  1168.         ld e,(hl) ;эюьхЁ ёЄЁюъш
  1169.         inc hl
  1170.         push hl
  1171.         call prword_de ;эюьхЁ ёЄЁюъш
  1172.         ld a,' '
  1173.         PRCHAR
  1174.         pop hl
  1175.  
  1176.         ;ld e,(hl)
  1177.         inc hl
  1178.         ;ld d,(hl) ;фышэр ёЄЁюъш
  1179.         inc hl
  1180.         call prtext ;hl after terminator
  1181.         call prcrlf
  1182.  
  1183.         jr list_lines0
  1184.        
  1185.        
  1186.         macro STRPUSH
  1187. ;hl=string addr
  1188.         xor a
  1189.         push af
  1190.          ld a,(hl)
  1191.          inc hl
  1192.          or a
  1193.          push af
  1194.         jr nz,$-4
  1195.         pop af
  1196. ;т ёЄхъх ыхцшЄ \0, ЄхъёЄ (схч ЄхЁьшэрЄюЁр)
  1197.         endm
  1198.        
  1199.         macro STRPOP
  1200. ;hl=string addr
  1201.         ld d,h
  1202.         ld e,l
  1203.          pop af
  1204.          ld (hl),a
  1205.          inc hl
  1206.          or a
  1207.         jr nz,$-4
  1208.         ex de,hl
  1209.         call strmirror
  1210.         endm
  1211.        
  1212. strmirror
  1213. ;hl=string addr
  1214.         ld d,h
  1215.         ld e,l
  1216.         call strlen
  1217.         ld b,h
  1218.         ld c,l
  1219. ;de=эрўрыю, bc=hl=фышэр
  1220.         ;ld h,b
  1221.         ;ld l,c
  1222.         add hl,de ;hl=ъюэхЎ+1
  1223.         srl b
  1224.         rr c ;bc=wid/2
  1225. mirrorbytes0
  1226.         dec hl
  1227.         ld a,(de)
  1228.         ldi
  1229.         dec hl
  1230.         ld (hl),a
  1231.         jp pe,mirrorbytes0
  1232.         ret
  1233.        
  1234.  
  1235. cmd_let
  1236. ;hl'=ъєЁёюЁ
  1237.         exx ;ld hl,(execcmd_pars)
  1238.         ld a,(hl)
  1239.         exx
  1240.         ld c,a
  1241.         exx
  1242.         inc hl ;call eat
  1243.         ld a,(hl)
  1244.         exx
  1245.         cp '$'
  1246.         jr z,cmd_let_str
  1247.         cp '('
  1248.         jr z,cmd_let_array
  1249. ;hl'=ъєЁёюЁ
  1250.         call eatspaces
  1251.         call eateq
  1252.         ld a,c
  1253.         call findvar_int
  1254.         jr nz,cmd_let_createq
  1255.         ld a,c
  1256.         call addvar_int
  1257. cmd_let_createq
  1258.         push bc
  1259.         call getexpr ;hlde=value
  1260.         pop bc ;шэрўх т√Ёрцхэшх ьюцхЄ чряюЁюЄ№ c
  1261.         ld a,c
  1262.         call setvar_int ;TODO эх шёърЄ№ яхЁхьхээє■ тЄюЁющ Ёрч
  1263.         ret
  1264.  
  1265. cmd_let_array
  1266.         call eat ;skip '(' and spaces
  1267.         push bc
  1268.         call getexpr
  1269.         pop bc
  1270.         call eatclosebracket
  1271.         ld a,c
  1272.         call findvar_int
  1273.         jp z,fail_syntax
  1274.         call indexarray
  1275.         push hl ;рфЁхё ¤ыхьхэЄр
  1276.         call eateq
  1277.         call getexpr ;hlde
  1278.         ld b,h
  1279.         ld c,l ;bcde
  1280.         pop hl ;рфЁхё ¤ыхьхэЄр
  1281.         ld (hl),e
  1282.         inc hl
  1283.         ld (hl),d
  1284.         inc hl
  1285.         ld (hl),c
  1286.         inc hl
  1287.         ld (hl),b
  1288.         ret
  1289.        
  1290. cmd_let_str
  1291.         call eat ;skip '$' and spaces
  1292.         exx
  1293.         ld a,(hl)
  1294.         exx
  1295.         cp '('
  1296.         jr z,cmd_let_strarray
  1297.         ld a,c
  1298.         call findvar_str
  1299.         jr nz,cmd_let_str_createq
  1300.         ld a,c
  1301.         call addvar_str
  1302. cmd_let_str_createq
  1303. ;hl'=ъєЁёюЁ
  1304.         call eateq
  1305.         exx
  1306.         ld a,(hl)
  1307.         exx
  1308.         cp '"'
  1309.         jp nz,fail_syntax
  1310.        
  1311.         call readstr ;hl=str, hl'=after num and spaces, CY=error
  1312.         jp c,fail_syntax
  1313.        
  1314.         ;ld hl,wordbuf
  1315.         ;STRPUSH
  1316.        
  1317.         ;ld hl,wordbuf
  1318.         ld a,c
  1319.         call setvar_str
  1320.        
  1321.         ;ld hl,wordbuf
  1322.         ;STRPOP
  1323.        
  1324.         ret
  1325.  
  1326. cmd_let_strarray
  1327.         call eat ;skip '(' and spaces
  1328.         push bc
  1329.         call getexpr ;hlde=index
  1330.         pop bc
  1331.         call eatclosebracket
  1332.         call eateq
  1333.         ld a,c
  1334.         call findvar_str
  1335.         jp z,fail_syntax
  1336.         ld a,d
  1337.         or a
  1338.         jp nz,fail_syntax ;range check
  1339.         add hl,de
  1340.         push hl ;addr in str
  1341.         call getexpr ;hlde=char
  1342.         pop hl ;addr in str      
  1343.         ld (hl),e
  1344.         ret
  1345.        
  1346. cmd_cls
  1347.         exx
  1348.         push hl
  1349.         ld e,0;COLOR
  1350.         OS_CLS
  1351.         pop hl
  1352.         exx
  1353.         ret
  1354.  
  1355. cmd_if
  1356. ;hl'=ъєЁёюЁ
  1357.         call getexpr
  1358.         ld a,h
  1359.         or l
  1360.         or d
  1361.         or e
  1362.         ret nz ;true = continue this line
  1363. gotonextline
  1364.         exx
  1365.         xor a
  1366.         ld bc,0
  1367.         cpir
  1368.         dec hl ;эр ЄхЁьшэрЄюЁх 
  1369.         ld a,(runmode)
  1370.         cp RUNMODE_PROG
  1371.         jr nz,gotonextlineq
  1372.         inc hl ;яюёых ёЄЁюъш
  1373.         call startline
  1374. gotonextlineq
  1375.         exx
  1376.         ret
  1377.        
  1378. cmd_goto
  1379. ;hl'=ъєЁёюЁ
  1380.         call getexpr
  1381. cmd_goto_ok
  1382. ;hlde=эюьхЁ ёЄЁюъш
  1383.         call findline
  1384.         call startline
  1385.         exx
  1386.         ld a,RUNMODE_PROG
  1387.         ld (runmode),a
  1388.         ret
  1389.  
  1390.  
  1391. cmd_run
  1392. ;эхы№ч  т√їюфшЄ№ яю ret, яюЄюьє ўЄю run ьюуыш т√чтрЄ№ шч юсЁрсюЄўшър ъюьрэфэющ ёЄЁюъш
  1393.         ld a,RUNMODE_PROG
  1394.         ld (runmode),a
  1395.         ld hl,progmem
  1396.         jr cmd_run_startline
  1397. cmd_run0
  1398. ;hl'=рфЁхё ёЄЁюъш
  1399.         exx
  1400.         ld a,(hl)
  1401.         or a
  1402.         jr nz,cmd_run_nonextline
  1403. runmode=$+1
  1404.         ld a,0
  1405.         cp RUNMODE_INTERACTIVE
  1406.         jp z,endofprog ;ret z ;end of line in interactive mode
  1407.         inc hl
  1408. cmd_run_startline
  1409.         call startline
  1410. cmd_run_nonextline
  1411.         exx
  1412.         call docmd
  1413.         jr cmd_run0
  1414.  
  1415. startline
  1416.         ld bc,(progend)
  1417.         or a
  1418.         sbc hl,bc
  1419.         add hl,bc
  1420.         jp nc,endofprog ;ret nc ;end of program
  1421.         ;ld d,(hl)
  1422.         inc hl
  1423.         ;ld e,(hl)
  1424.         inc hl
  1425.         ;ld (currunline),de
  1426.         ;ld e,(hl)
  1427.         inc hl
  1428.         ;ld d,(hl) ;line size
  1429.         inc hl
  1430.         ret
  1431.        
  1432. eatcolon
  1433. ;out: z=end of command
  1434.         exx
  1435.         ld a,(hl)
  1436.         exx
  1437.         or a
  1438.         ret z
  1439.         cp ':'
  1440.         ret nz
  1441.         call eat
  1442.         xor a ;Z
  1443.         ret
  1444.        
  1445. cmd_print
  1446. ;hl'=ъєЁёюЁ
  1447.         call eatcolon
  1448.         jp z,prcrlf
  1449. cmd_print0
  1450.         exx
  1451.         ld a,(hl)
  1452.         exx
  1453.         cp ';'
  1454.         jp z,cmd_print_semicolon
  1455.         call getexpr
  1456.         call prval
  1457.         jr cmd_print
  1458. cmd_print_semicolon
  1459.         call eat
  1460.         call eatcolon
  1461.         jr nz,cmd_print ;TODO cmd_print0?
  1462.         ret
  1463.        
  1464. getexpr
  1465. ;out: hlde=value, c=type
  1466.         call getaddexpr
  1467. getexpr0
  1468.         exx
  1469.         ld a,(hl)
  1470.         exx
  1471.         ;cp ','
  1472.         ;ret z ;jp z,eat
  1473.         ;cp ')'
  1474.         ;ret z ;jp z,eat
  1475.         ;cp ':' ;call eatcolon
  1476.         ;ret z
  1477.         ;or a
  1478.         ;ret z
  1479.         cp '='
  1480.         jr z,getexpr_eq
  1481.         cp '>'
  1482.         jr z,getexpr_more
  1483.         cp '<'
  1484.         jr z,getexpr_less
  1485.         ret
  1486.        
  1487. getexpr_eq
  1488.         call eat
  1489.         call getexpr_eq_subr
  1490.         jr getexpr0
  1491.        
  1492. getexpr_more
  1493.         call eat
  1494.         exx
  1495.         ld a,(hl)
  1496.         exx
  1497.         cp '='
  1498.         jr z,getexpr_moreeq
  1499.         call getexpr_more_subr
  1500.         jr getexpr0
  1501.  
  1502. getexpr_less
  1503.         call eat
  1504.         exx
  1505.         ld a,(hl)
  1506.         exx
  1507.         cp '='
  1508.         jr z,getexpr_lesseq
  1509.         cp '>'
  1510.         jr z,getexpr_noteq
  1511.         call getexpr_less_subr
  1512.         jr getexpr0
  1513.        
  1514. getexpr_noteq
  1515.         call eat
  1516.         call getexpr_eq_subr
  1517.         call loginv
  1518.         jr getexpr0
  1519.  
  1520. getexpr_moreeq
  1521.         call eat
  1522.         call getexpr_less_subr
  1523.         call loginv
  1524.         jr getexpr0
  1525.  
  1526. getexpr_lesseq
  1527.         call eat
  1528.         call getexpr_more_subr
  1529.         call loginv
  1530.         jr getexpr0
  1531.  
  1532. getexpr_more_subr        
  1533. ;old > new: new-old = CY
  1534.         push bc
  1535.         push hl ;HSW
  1536.         push de ;LSW
  1537.         call getaddexpr
  1538.         pop bc ;LSW
  1539.         ex de,hl
  1540.         or a
  1541.         sbc hl,bc
  1542.         ex de,hl
  1543.         pop bc ;HSW
  1544.         sbc hl,bc
  1545.         pop bc
  1546.         ld hl,0
  1547.         ld de,0
  1548.         ret nc
  1549.         dec hl
  1550.         dec de ;old > new
  1551.         ret
  1552.        
  1553. getexpr_less_subr
  1554. ;old < new: old-new = CY
  1555.         push bc
  1556.         push hl ;old HSW
  1557.         push de ;old LSW
  1558.         call getaddexpr
  1559.         pop bc ;old LSW
  1560.         pop af ;old HSW
  1561.         push hl ;new HSW
  1562.         push de ;new LSW
  1563.         push af ;old HSW
  1564.         push bc ;old LSW
  1565.         pop de ;old LSW
  1566.         pop hl ;old HSW
  1567.        
  1568.         pop bc ;LSW
  1569.         ex de,hl
  1570.         or a
  1571.         sbc hl,bc
  1572.         ex de,hl
  1573.         pop bc ;HSW
  1574.         sbc hl,bc
  1575.         pop bc
  1576.         ld hl,0
  1577.         ld de,0
  1578.         ret nc
  1579.         dec hl
  1580.         dec de ;old < new
  1581.         ret
  1582.  
  1583. getexpr_eq_subr
  1584.         push bc
  1585.         push hl ;HSW
  1586.         push de ;LSW
  1587.         call getaddexpr
  1588.         pop bc ;LSW
  1589.         ex de,hl
  1590.         or a
  1591.         sbc hl,bc
  1592.         ex de,hl
  1593.         pop bc ;HSW
  1594.         sbc hl,bc
  1595.         ld a,d
  1596.         or e
  1597.         or h
  1598.         or l
  1599.         pop bc
  1600.         ld hl,0
  1601.         ld de,0
  1602.         ret nz
  1603.         dec hl
  1604.         dec de ;old = new
  1605.         ret
  1606.        
  1607. getaddexpr
  1608.         call getmulexpr
  1609. getaddexpr0
  1610.         exx
  1611.         ld a,(hl)
  1612.         exx
  1613.         ;or a
  1614.         ;ret z
  1615.         ;cp ')'
  1616.         ;ret z ;jp z,eat
  1617.         ;cp ','
  1618.         ;ret z ;jp z,eat
  1619.         ;cp ':' ;call eatcolon
  1620.         ;ret z
  1621.         cp '+'
  1622.         jr z,getaddexpr_plus
  1623.         cp '-'
  1624.         jr z,getaddexpr_minus
  1625.         ret
  1626.        
  1627. getaddexpr_plus
  1628.         call eat
  1629.         push bc
  1630.         push hl ;HSW
  1631.         push de ;LSW
  1632.         call getmulexpr
  1633.         pop bc ;LSW
  1634.         ex de,hl
  1635.         add hl,bc
  1636.         ex de,hl
  1637.         pop bc ;HSW
  1638.         adc hl,bc
  1639.         pop bc
  1640.         jr getaddexpr0
  1641.        
  1642. getaddexpr_minus
  1643.         call eat
  1644.         push bc
  1645.         push hl ;HSW
  1646.         push de ;LSW
  1647.         call getmulexpr
  1648.         pop bc ;LSW
  1649.         ex de,hl
  1650.         or a
  1651.         sbc hl,bc
  1652.         ex de,hl
  1653.         pop bc ;HSW
  1654.         sbc hl,bc
  1655.         call neghlde
  1656.         pop bc
  1657.         jr getaddexpr0
  1658.  
  1659. getmulexpr
  1660.         call getval_
  1661. getmulexpr0
  1662.         exx
  1663.         ld a,(hl)
  1664.         exx
  1665.         ;or a
  1666.         ;ret z
  1667.         ;cp ')'
  1668.         ;ret z ;jp z,eat
  1669.         ;cp ','
  1670.         ;ret z ;jp z,eat
  1671.         ;cp ':' ;call eatcolon
  1672.         ;ret z
  1673.         cp '*'
  1674.         jr z,getmulexpr_mul
  1675.         cp '/'
  1676.         jr z,getmulexpr_div
  1677.         ret
  1678.        
  1679. getmulexpr_div
  1680.         call eat
  1681.         push bc
  1682.         push hl ;HSW old
  1683.         push de ;LSW old
  1684.         call getval_
  1685.         push hl ;LSW new
  1686.         push de ;HSW new
  1687.         exx
  1688.         pop ix ;LSW new
  1689.         pop bc ;HSW new
  1690.         pop de ;LSW old
  1691.         ex (sp),hl ;pop hl ;HSW old
  1692.         call _DIVLONG.
  1693.         exx
  1694.         pop hl ;ъєЁёюЁ
  1695.         exx
  1696.         pop bc
  1697.         jr getmulexpr0
  1698.  
  1699. getmulexpr_mul
  1700.         call eat
  1701.         push bc
  1702.         push hl ;HSW
  1703.         push de ;LSW
  1704.         call getval_
  1705.         pop ix ;LSW
  1706.         pop bc ;HSW
  1707.         call _MULLONG.
  1708.         pop bc
  1709.         jr getmulexpr0
  1710.        
  1711. ;hl, de / bc, ix
  1712. ;out: hl(high), de(low)
  1713. _DIVLONG.
  1714.         ;EXPORT _DIVLONG.
  1715.         ld a,h
  1716.         xor b
  1717.         push af
  1718.         xor b
  1719.         call m,neghlde
  1720.         ld a,b
  1721.         rla
  1722.         jr nc,divlongnonegbcix
  1723.         xor a
  1724.         sub lx
  1725.         ld lx,a
  1726.         ld a,0
  1727.         sbc a,hx
  1728.         ld hx,a
  1729.         ld a,0
  1730.         sbc a,c
  1731.         ld c,a
  1732.         ld a,0
  1733.         sbc a,b
  1734.         ld b,a
  1735. divlongnonegbcix
  1736. ;unsigned!!!
  1737. ;hl'hl,de'de <= hlde,bcix:
  1738.         push bc
  1739.         exx
  1740.         pop de ;de' = "bc_in"
  1741.         ld hl,0
  1742.         exx
  1743.         ld a,e
  1744.         ex af,af' ;e_in
  1745.         push de ;d_in
  1746.         ld c,l ;l_in
  1747.         ld a,h ;h_in
  1748.         ld hl,0
  1749.         push ix
  1750.         pop de ;de = "ix_in"
  1751.         ;a="h_in"
  1752. ;hl'hla <= 0000h_in
  1753.         call _DIVLONGP. ;"h"
  1754.         ld b,c ;"l_in"
  1755.         ld c,a ;"h"
  1756.         ld a,b ;a="l_in"
  1757. ;hl'hla <= 000hl_in
  1758.         call _DIVLONGP. ;"l"
  1759.         ld b,a ;"l"
  1760.         pop af ;a="d_in"
  1761.         push bc ;b="l"
  1762. ;hl'hla <= 00hld_in
  1763.         call _DIVLONGP. ;"d"
  1764.         ex af,af' ;a="e_in", a'="d"
  1765.         ;a="e_in"
  1766. ;hl'hla <= 0hlde_in
  1767.         call _DIVLONGP. ;"e"
  1768.         ld e,a ;"e"
  1769.         ex af,af' ;"d"
  1770.         ld d,a
  1771.         pop hl ;h="l"
  1772.         ld l,h
  1773.         ld h,c ;"h"
  1774.        
  1775.         pop af
  1776.         ret p
  1777.         jp neghlde
  1778. ;a = hl'hla/de'de
  1779. ;c not used
  1780. _DIVLONGP.
  1781. ;do 8 bits
  1782.         ld b,8
  1783. _DIVLONG0.
  1784. ;shift left hl'hla
  1785.         rla
  1786.         adc hl,hl
  1787.         exx
  1788.         adc hl,hl
  1789.         exx
  1790. ;no carry
  1791. ;try sub
  1792.         sbc hl,de
  1793.         exx
  1794.         sbc hl,de
  1795.         exx
  1796.         jr nc,$+2+1+1+2+1
  1797.         add hl,de
  1798.         exx
  1799.         adc hl,de
  1800.         exx
  1801. ;carry = inverted bit of result
  1802.         djnz _DIVLONG0.
  1803.         rla
  1804.         cpl
  1805.         ret
  1806.        
  1807. ;hl, de * bc, ix
  1808. ;out: hl(high), de(low)
  1809. _MULLONG.
  1810.         ;EXPORT _MULLONG.
  1811. ;signed mul is equal to unsigned mul
  1812. ;hlde*bcix = hlde*b000 + hlde*c00 + hlde*i0 + hlde*x
  1813.         ld a,lx
  1814.         push af ;lx
  1815.         push ix ;hx
  1816.         ld a,c
  1817.         push af ;c
  1818.         ld a,b
  1819. ;bcde <= hlde:
  1820.         ld b,h
  1821.         ld c,l
  1822. ;hlix <= 0
  1823.         ld hl,0
  1824.         ;ld ix,0
  1825.         push hl
  1826.         pop ix
  1827.         call _MULLONGP. ;hlix = (hlix<<8) + "b*hlde"
  1828.         pop af ;c
  1829.         call _MULLONGP. ;hlix = (hlix<<8) + "c*hlde"
  1830.         pop af ;hx
  1831.         call _MULLONGP. ;hlix = (hlix<<8) + "hx*hlde"
  1832.         pop af ;lx
  1833.         call _MULLONGP. ;hlix = (hlix<<8) + "lx*hlde"
  1834.         push ix
  1835.         pop de
  1836.         ret
  1837. ;hlix = (hlix<<8) + a*bcde
  1838. _MULLONGP.
  1839.         exx
  1840.         ld b,8
  1841. _MULLONG0.
  1842.         exx
  1843.         add ix,ix
  1844.         adc hl,hl
  1845.         rla
  1846.         jr nc,$+2+2+2
  1847.         add ix,de
  1848.         adc hl,bc
  1849.         exx
  1850.         djnz _MULLONG0. ;ьюцэю яю a==0 (яхЁт√щ тїюф ё scf:rla, фрыхх add a,a)
  1851.         exx
  1852.         ret
  1853.  
  1854.  
  1855.        
  1856. getval_unaryminus
  1857.         call eat
  1858.         call getval_
  1859.         jp neghlde
  1860. getval_bracket
  1861.         call eat
  1862.         call getexpr
  1863.         jp eatclosebracket
  1864.        
  1865. getval_
  1866. ;hl'=ъєЁёюЁ
  1867. ;out: hlde=value, c=type
  1868.         exx
  1869.         ld a,(hl)
  1870.         exx
  1871.         cp '$'
  1872.         jp z,getval_function
  1873.         cp '-'
  1874.         jr z,getval_unaryminus
  1875.         cp '('
  1876.         jr z,getval_bracket
  1877.         cp '"'
  1878.         jr z,getval_str
  1879.         sub '0'
  1880.         cp 10
  1881.         jr c,getval_num
  1882.         exx
  1883.         ld a,(hl)
  1884.         exx
  1885.         ld c,a ;name
  1886.         exx
  1887.         inc hl ;call eat
  1888.         ld a,(hl)
  1889.         exx
  1890.         cp '$'
  1891.         jr z,getval_varstr
  1892.         cp '('
  1893.         jr z,getval_vararray
  1894.         call eatspaces
  1895.         ld a,c
  1896.         call findvar_int
  1897.         jp z,fail_syntax
  1898.         ;ld a,c
  1899.         ;call getvar_int
  1900.         call getint
  1901.         res 7,c ;ld c,0 ;int
  1902.         ret
  1903. getval_varstr
  1904.         call eat ;skip '$' and spaces
  1905.         exx
  1906.         ld a,(hl)
  1907.         exx
  1908.         cp '('
  1909.         jr z,getval_varchararray        
  1910.         ld a,c
  1911.         call findvar_str
  1912.         jp z,fail_syntax
  1913.         ;ld a,c
  1914.         ;call getvar_str
  1915.         set 7,c ;ld c,128 ;str
  1916.         ret
  1917. getval_varchararray
  1918.         call eat
  1919.         push bc
  1920.         call getexpr
  1921.         pop bc
  1922.         call eatclosebracket
  1923.         ld a,c
  1924.         call findvar_str
  1925.         jp z,fail_syntax
  1926.         ld a,d
  1927.         or a
  1928.         jp nz,fail_syntax ;range check
  1929.         add hl,de
  1930.         ld e,(hl)
  1931.         ld hl,0
  1932.         ld d,h ;hlde=char
  1933.         res 7,c ;ld c,0 ;int
  1934.         ret
  1935. getval_vararray
  1936.         call eat
  1937.         push bc
  1938.         call getexpr
  1939.         pop bc
  1940.         call eatclosebracket
  1941.         ld a,c
  1942.         call findvar_array
  1943.         jp z,fail_syntax
  1944.         call indexarray
  1945.         call getint
  1946.         res 7,c ;ld c,0 ;int
  1947.         ret
  1948. getval_num
  1949.         call readnum ;hlde=num, hl'=after num and spaces, CY=error
  1950.         jp c,fail_syntax
  1951.         res 7,c ;ld c,0 ;int
  1952.         ret
  1953. getval_str
  1954.         call readstr ;hl=str, hl'=after str and spaces, CY=error
  1955.         jp c,fail_syntax
  1956.         set 7,c ;ld c,0 ;str
  1957.         ret
  1958.  
  1959. prval
  1960. ;hlde=value, c=type
  1961.         exx
  1962.         push hl
  1963.         exx
  1964.         bit 7,c
  1965.         jr nz,prval_str
  1966.         call prdword_hlde
  1967.         pop hl
  1968.         exx
  1969.         ret
  1970. prval_str
  1971.         call prstr_withlen
  1972.         pop hl
  1973.         exx
  1974.         ret
  1975.  
  1976.  
  1977. readstr
  1978. ;hl'=ъєЁёюЁ (єърч√трхЄ эр юЄъЁ√тр■∙є■ ърт√ўъє)
  1979. ;out: hl=str, hl'=after num and spaces, CY=error
  1980.         exx
  1981.         inc hl
  1982.         ld de,wordbuf
  1983. ;TODO яЁютхЁър фышэ√
  1984. quote_getword0
  1985.         ld a,(hl)
  1986.         or a
  1987.         ccf
  1988.         ret z ;CY=error
  1989.         ;jp z,fail ;jr z,quote_getwordq
  1990.         sub '"'
  1991.         jr z,quote_getwordq
  1992.         ldi
  1993.         jp quote_getword0
  1994. quote_getwordq
  1995.         xor a
  1996.         ld (de),a
  1997.         exx
  1998.         call eat ;ё·хфрхь ърт√ўъє ш яюёыхфє■∙шх яЁюсхы√
  1999.         ld hl,wordbuf
  2000.         or a ;NC = OK
  2001.         ret ;NC
  2002.  
  2003. indexarray
  2004. ;hl=рфЁхё ьрёёштр
  2005. ;de=шэфхъё
  2006. ;c=шь  ьрёёштр?
  2007. ;out: hl=рфЁхё ¤ыхьхэЄр (fail, хёыш out of bounds)
  2008.         push bc
  2009.         ld c,(hl)
  2010.         inc hl
  2011.         ld b,(hl)
  2012.         inc hl
  2013.         ex de,hl
  2014.         or a
  2015.         sbc hl,bc
  2016.         add hl,bc
  2017.         ex de,hl
  2018.         pop bc
  2019.         jp nc,fail_syntax ;range check
  2020.         add hl,de
  2021.         add hl,de
  2022.         add hl,de
  2023.         add hl,de
  2024.         ret
  2025.  
  2026. func_rnd
  2027. ;Patrik Rak
  2028. rndseed1=$+1
  2029.         ld  hl,0xA280   ; xz -> yw
  2030. rndseed2=$+1
  2031.         ld  de,0xC0DE   ; yw -> zt
  2032.         ld  (rndseed1),de  ; x = y, z = w
  2033.         ld  a,e         ; w = w ^ ( w << 3 )
  2034.         add a,a
  2035.         add a,a
  2036.         add a,a
  2037.         xor e
  2038.         ld  e,a
  2039.         ld  a,h         ; t = x ^ (x << 1)
  2040.         add a,a
  2041.         xor h
  2042.         ld  d,a
  2043.         rra             ; t = t ^ (t >> 1) ^ w
  2044.         xor d
  2045.         xor e
  2046.         ld  h,l         ; y = z
  2047.         ld  l,a         ; w = t
  2048.         ld  (rndseed2),hl
  2049.         ex de,hl
  2050.         ld hl,0
  2051.         res 7,c ;int
  2052.         ret
  2053.