Subversion Repositories NedoOS

Rev

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