Subversion Repositories NedoOS

Rev

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

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