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