?login_element?

Subversion Repositories NedoOS

Rev

Rev 672 | Show entire file | Regard whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 672 Rev 1518
Line 185... Line 185...
185
        pop hl
185
        pop hl
186
        exx
186
        exx
187
        ret
187
        ret
188
 
188
 
189
cmd_gfx
189
cmd_gfx
190
        call getexpr
190
        call getexpr_dehl
191
        exx
191
        exx
192
        push hl
192
        push hl
193
        exx
193
        exx
194
        ld a,e
194
        ld a,l
195
        and 7
195
        and 7
196
        ld e,a
196
        ld e,a
197
         ld (curgfx),a
197
         ld (curgfx),a
198
         cp 6
198
         cp 6
199
         jr nz,$+4
199
         jr nz,$+4
Line 203... Line 203...
203
        exx
203
        exx
204
        ret
204
        ret
205
 
205
 
206
getexprcolor
206
getexprcolor
207
;out: a=color = %33210210
207
;out: a=color = %33210210
208
        call getexpr
208
        call getexpr_dehl
209
        ld a,e
209
        ld a,l
210
        and 7
210
        and 7
211
        ld d,a
211
        ld d,a
212
        ld a,e
212
        ld a,l
213
        and 15
213
        and 15
214
        add a,a
214
        add a,a
215
        add a,a
215
        add a,a
216
        add a,a
216
        add a,a
217
        or d ;%.3210210
217
        or d ;%.3210210
Line 222... Line 222...
222
        ret
222
        ret
223
 
223
 
224
cmd_line
224
cmd_line
225
;hl'=курсор
225
;hl'=курсор
226
;line x2,y2,color
226
;line x2,y2,color
227
        call getexpr
227
        call getexpr_dehl
228
        ld (cmd_line_x2),de
228
        ld (cmd_line_x2),hl
229
        call eatcomma
229
        call eatcomma
230
        call getexpr
230
        call getexpr_dehl
231
        ld (cmd_line_y2),de
231
        ld (cmd_line_y2),hl
232
        call eatcomma
232
        call eatcomma
233
        call getexprcolor ;a=color = %33210210
233
        call getexprcolor ;a=color = %33210210
234
 
234
 
235
        push af ;color
235
        push af ;color
236
        call setpgs_scr
236
        call setpgs_scr
Line 258... Line 258...
258
        jp restorebasicpages
258
        jp restorebasicpages
259
       
259
       
260
cmd_plot
260
cmd_plot
261
;hl'=курсор
261
;hl'=курсор
262
;plot x,y,color
262
;plot x,y,color
263
        call getexpr
263
        call getexpr_dehl
264
        ld (cmd_plot_x),de
264
        ld (cmd_plot_x),hl
265
        call eatcomma
265
        call eatcomma
266
        call getexpr
266
        call getexpr_dehl
267
        ld (cmd_plot_y),de
267
        ld (cmd_plot_y),hl
268
        call eatcomma
268
        call eatcomma
269
        call getexprcolor
269
        call getexprcolor
270
        ;ld lx,a ;lx=color = %33210210
270
        ;ld lx,a ;lx=color = %33210210
271
        ld (prpixel_color_l),a
271
        ld (prpixel_color_l),a
272
        ld (prpixel_color_r),a
272
        ld (prpixel_color_r),a
Line 502... Line 502...
502
        jr nc,$+4
502
        jr nc,$+4
503
        set 6,h
503
        set 6,h
504
        rra
504
        rra
505
        jr nc,$+4
505
        jr nc,$+4
506
        set 5,h
506
        set 5,h
507
        and %00111111
507
        and 0b00111111
508
        add a,l
508
        add a,l
509
        ld l,a
509
        ld l,a
510
        adc a,h
510
        adc a,h
511
        sub l
511
        sub l
512
        ld h,a
512
        ld h,a
513
prpixel_color_l=$+1
513
prpixel_color_l=$+1
514
        ld a,0;lx
514
        ld a,0;lx
515
        xor (hl)
515
        xor (hl)
516
        and %01000111 ;keep left pixel 
516
        and 0b01000111 ;keep left pixel 
517
        xor (hl) ;right pixel from screen
517
        xor (hl) ;right pixel from screen
518
        ld (hl),a
518
        ld (hl),a
519
        ret
519
        ret
520
prpixel_r
520
prpixel_r
521
        rra
521
        rra
522
        jr nc,$+4
522
        jr nc,$+4
523
        set 6,h
523
        set 6,h
524
        rra
524
        rra
525
        jr nc,$+4
525
        jr nc,$+4
526
        set 5,h
526
        set 5,h
527
        and %00111111
527
        and 0b00111111
528
        add a,l
528
        add a,l
529
        ld l,a
529
        ld l,a
530
        adc a,h
530
        adc a,h
531
        sub l
531
        sub l
532
        ld h,a
532
        ld h,a
533
prpixel_color_r=$+1
533
prpixel_color_r=$+1
534
        ld a,0;lx
534
        ld a,0;lx
535
        xor (hl)
535
        xor (hl)
536
        and %10111000 ;keep right pixel 
536
        and 0b10111000 ;keep right pixel 
537
        xor (hl) ;left pixel from screen
537
        xor (hl) ;left pixel from screen
538
        ld (hl),a
538
        ld (hl),a
539
        ret
539
        ret
540
 
540
 
541
cmd_system
541
cmd_system
542
;hl'=курсор
542
;hl'=курсор
543
;system "command params"
543
;system "command params"
544
        call getexpr
544
        call getexpr_dehl
545
        bit 7,c
545
        bit 7,c
546
        jp z,fail_syntax
546
        jp z,fail_syntax
547
        exx
547
        exx
548
        push hl
548
        push hl
549
        exx
549
        exx
550
;hl = wordbuf = string
550
;hl = wordbuf = string
551
 
-
 
552
        ld de,curdir ;DE = Pointer to 64 byte (MAXPATH_sz!) buffer
551
        ld de,curdir ;DE = Pointer to 64 byte (MAXPATH_sz!) buffer
553
        OS_GETPATH
552
        OS_GETPATH
554
        OS_SETSYSDRV ;TODO каталог cmd
553
        OS_SETSYSDRV ;TODO каталог cmd
555
       
554
       
556
        ld de,tcmd
555
        ld de,tcmd
Line 564... Line 563...
564
        jp nz,close_restoredir_fail
563
        jp nz,close_restoredir_fail
565
;dehl=номера страниц в 0000,4000,8000,c000 нового приложения, b=id, a=error
564
;dehl=номера страниц в 0000,4000,8000,c000 нового приложения, b=id, a=error
566
        push bc ;b=id
565
        push bc ;b=id
567
       
566
       
568
        ld a,d
567
        ld a,d
569
        SETPG32KHIGH
568
        SETPGC000
570
        push de
569
        push de
571
        push hl
570
        push hl
572
        ld hl,syscmdbuf
571
        ld hl,syscmdbuf
573
        ld de,#c000+COMMANDLINE
572
        ld de,0xc000+COMMANDLINE
574
        ld bc,COMMANDLINE_sz
573
        ld bc,COMMANDLINE_sz
575
        ldir ;command line
574
        ldir ;command line
576
        xor a
575
        xor a
577
        ld (#c000+COMMANDLINE+COMMANDLINE_sz-1),a ;на случай, если "cmd "+wordbuf больше 128 байт
576
        ld (0xc000+COMMANDLINE+COMMANDLINE_sz-1),a ;на случай, если "cmd "+wordbuf больше 128 байт
578
        pop hl
577
        pop hl
579
        pop de
578
        pop de
580
cmd_system_handle=$+1
579
cmd_system_handle=$+1
581
        ld b,0
580
        ld b,0
582
        call readfile_pages_dehl
581
        call readfile_pages_dehl
Line 608... Line 607...
608
        pop af
607
        pop af
609
        ret
608
        ret
610
readfile_pages_dehl
609
readfile_pages_dehl
611
        ld a,d
610
        ld a,d
612
        push bc
611
        push bc
613
        SETPG32KHIGH
612
        SETPGC000
614
        pop bc
613
        pop bc
615
         ld a,e
614
         ld a,e
616
         push af
615
         push af
617
        ld a,+(#c000+PROGSTART)/256
616
        ld a,+(#c000+PROGSTART)/256
618
        call cmd_loadpage
617
        call cmd_loadpage
Line 624... Line 623...
624
        call cmd_setpgloadpage
623
        call cmd_setpgloadpage
625
        ret nz
624
        ret nz
626
        ld a,l
625
        ld a,l
627
cmd_setpgloadpage
626
cmd_setpgloadpage
628
        push bc
627
        push bc
629
        SETPG32KHIGH
628
        SETPGC000
630
        pop bc
629
        pop bc
631
        ld a,#c000/256
630
        ld a,0xc000/256
632
cmd_loadpage
631
cmd_loadpage
633
;a=loadaddr/256
632
;a=loadaddr/256
634
;b=handle
633
;b=handle
635
;out: de=bytes read, NZ=end of file
634
;out: de=bytes read, NZ=end of file
636
;keeps hl,bc
635
;keeps hl,bc
Line 659... Line 658...
659
       
658
       
660
       
659
       
661
cmd_loadcode
660
cmd_loadcode
662
;hl'=курсор
661
;hl'=курсор
663
;load "name.bas"
662
;load "name.bas"
664
        call getexpr
663
        call getexpr_dehl
665
        bit 7,c
664
        bit 7,c
666
        jp z,fail_syntax
665
        jp z,fail_syntax
667
        call cmd_load_hl
666
        call cmd_load_hl
668
;нельзя выходить по ret, потому что старая программа уничтожена
667
;нельзя выходить по ret, потому что старая программа уничтожена
669
        jp endofprog
668
        jp endofprog
Line 699... Line 698...
699
        ret
698
        ret
700
 
699
 
701
cmd_load
700
cmd_load
702
;hl'=курсор
701
;hl'=курсор
703
;load "name.bas"
702
;load "name.bas"
704
        call getexpr
703
        call getexpr_dehl
705
        bit 7,c
704
        bit 7,c
706
        jp z,fail_syntax
705
        jp z,fail_syntax
707
        call cmd_load_text
706
        call cmd_load_text
708
;нельзя выходить по ret, потому что старая программа уничтожена
707
;нельзя выходить по ret, потому что старая программа уничтожена
709
        jp endofprog
708
        jp endofprog
Line 761... Line 760...
761
        jp cmd_clear
760
        jp cmd_clear
762
 
761
 
763
cmd_savecode ; оригинальная процедура быстрой выгрузки программы в файл
762
cmd_savecode ; оригинальная процедура быстрой выгрузки программы в файл
764
;hl'=курсор
763
;hl'=курсор
765
;save "name.bas"
764
;save "name.bas"
766
        call getexpr
765
        call getexpr_dehl
767
        bit 7,c
766
        bit 7,c
768
        jp z,fail_syntax
767
        jp z,fail_syntax
769
        ;exx
768
        ;exx
770
        ;ld a,(hl)
769
        ;ld a,(hl)
771
        ;exx
770
        ;exx
Line 795... Line 794...
795
        ret
794
        ret
796
 
795
 
797
cmd_save
796
cmd_save
798
;hl'=курсор
797
;hl'=курсор
799
;save "name.bas"
798
;save "name.bas"
800
        call getexpr
799
        call getexpr_dehl
801
        bit 7,c
800
        bit 7,c
802
        jp z,fail_syntax
801
        jp z,fail_syntax
803
        ex de,hl
802
        ex de,hl
804
;de=drive/path/file
803
;de=drive/path/file
805
        OS_CREATEHANDLE
804
        OS_CREATEHANDLE
Line 922... Line 921...
922
        ld (hl),d
921
        ld (hl),d
923
cmd_for_nocreate
922
cmd_for_nocreate
924
 
923
 
925
        call eateq
924
        call eateq
926
        push bc
925
        push bc
927
        call getexpr
926
        call getexpr_dehl
928
        pop bc
927
        pop bc
929
        ld a,c
928
        ld a,c
930
        call setvar_int
929
        call setvar_int
931
       
930
       
932
        call eatword ;to
931
        call eatword ;to
933
       
932
       
934
        push bc
933
        push bc
935
        call getexpr
934
        call getexpr_dehl
936
        pop bc
935
        pop bc
937
        push hl ;HSW
936
        push de ;HSW
938
        push de ;LSW
937
        push hl ;LSW
939
        ld a,c
938
        ld a,c
940
        call findvar_index
939
        call findvar_index
941
        ld de,4+4
940
        ld de,4+4
942
        add hl,de
941
        add hl,de
943
        pop de ;LSW
942
        pop de ;LSW
Line 951... Line 950...
951
        ld (hl),d
950
        ld (hl),d
952
       
951
       
953
        call eatword ;step
952
        call eatword ;step
954
       
953
       
955
        push bc
954
        push bc
956
        call getexpr ;hlde=step
955
        call getexpr_dehl ;dehl=step
957
        pop bc
956
        pop bc
958
       
957
       
959
        ld a,h
958
        ld a,h
960
        or l
959
        or l
961
        or d
960
        or d
962
        or e
961
        or e
963
        jp z,fail_syntax
962
        jp z,fail_syntax
964
               
963
               
965
        push hl ;HSW
964
        push de ;HSW
966
        push de ;LSW
965
        push hl ;LSW
967
        ld a,c
966
        ld a,c
968
        call findvar_index
967
        call findvar_index
969
        ld de,4
968
        ld de,4
970
        add hl,de
969
        add hl,de
971
        pop de ;LSW
970
        pop de ;LSW
Line 1011... Line 1010...
1011
        ld a,c
1010
        ld a,c
1012
        call findvar_index
1011
        call findvar_index
1013
        jp z,fail_syntax
1012
        jp z,fail_syntax
1014
       
1013
       
1015
        push hl
1014
        push hl
1016
        ld e,(hl)
-
 
1017
        inc hl
-
 
1018
        ld d,(hl)
-
 
1019
        inc hl
-
 
1020
        ld c,(hl)
1015
        ld c,(hl)
1021
        inc hl
1016
        inc hl
1022
        ld b,(hl)
1017
        ld b,(hl)
-
 
1018
        inc hl
-
 
1019
        ld e,(hl)
-
 
1020
        inc hl
-
 
1021
        ld d,(hl)
1023
        inc hl ;bcde = i
1022
        inc hl ;debc = i
1024
       
1023
       
1025
        ld a,(hl)
1024
        ld a,(hl)
1026
        add a,e
1025
        add a,c
1027
        ld e,a
1026
        ld c,a
1028
        inc hl
1027
        inc hl
1029
        ld a,(hl)
1028
        ld a,(hl)
1030
        adc a,d
1029
        adc a,b
1031
        ld d,a
1030
        ld b,a
1032
        inc hl
1031
        inc hl
1033
        ld a,(hl)
1032
        ld a,(hl)
1034
        adc a,c
1033
        adc a,e
1035
        ld c,a
1034
        ld e,a
1036
        inc hl
1035
        inc hl
1037
        ld a,(hl)
1036
        ld a,(hl)
1038
        adc a,b
1037
        adc a,d
1039
        ld b,a ;bcde = i = i+step
1038
        ld d,a ;debc = i = i+step
1040
       
1039
       
1041
        ex (sp),hl
1040
        ex (sp),hl
1042
        ld (hl),e
-
 
1043
        inc hl
-
 
1044
        ld (hl),d
-
 
1045
        inc hl
-
 
1046
        ld (hl),c
1041
        ld (hl),c
1047
        inc hl
1042
        inc hl
1048
        ld (hl),b
1043
        ld (hl),b
1049
        inc hl
1044
        inc hl
-
 
1045
        ld (hl),e
-
 
1046
        inc hl
-
 
1047
        ld (hl),d
-
 
1048
        inc hl
1050
        pop hl
1049
        pop hl
1051
       
1050
       
1052
        bit 7,(hl) ;step>=0?
1051
        bit 7,(hl) ;step>=0?
1053
        push af
1052
        push af
1054
        inc hl
1053
        inc hl
1055
       
1054
       
1056
;to>=i?
1055
;to>=i?
1057
        ld a,(hl)
1056
        ld a,(hl)
1058
        sub e
1057
        sub c
1059
        ld e,a
1058
        ld c,a
1060
        inc hl
1059
        inc hl
1061
        ld a,(hl)
1060
        ld a,(hl)
1062
        sbc a,d
1061
        sbc a,b
1063
        ld d,a
1062
        ld b,a
1064
        inc hl
1063
        inc hl
1065
        ld a,(hl)
1064
        ld a,(hl)
1066
        sbc a,c
1065
        sbc a,e
1067
        ld c,a
1066
        ld e,a
1068
        inc hl
1067
        inc hl
1069
        ld a,(hl)
1068
        ld a,(hl)
1070
        sbc a,b
1069
        sbc a,d
1071
        ld b,a
1070
        ld d,a
1072
        inc hl
1071
        inc hl
1073
;bcde = to-i
1072
;debc = to-i
1074
;TODO знаковое переполнение
1073
;TODO знаковое переполнение
1075
        pop af ;NZ = step<0
1074
        pop af ;NZ = step<0
1076
        call nz,negbcde
1075
        call nz,negdebc
1077
;i<=to (to-i >= 0) - continue loop
1076
;i<=to (to-i >= 0) - continue loop
1078
        bit 7,b ;Z = to-i>=0
1077
        bit 7,d ;Z = to-i>=0
1079
        ret nz ;end of loop
1078
        ret nz ;end of loop
1080
        call getint ;de=адрес после for ;было hlde=номер строки
1079
        call getint ;hl=адрес после for ;было dehl=номер строки
1081
        ex de,hl
-
 
1082
        exx
1080
        exx
1083
        ret
1081
        ret
1084
        ;jp cmd_goto_ok
1082
        ;jp cmd_goto_ok
1085
       
1083
       
1086
cmd_dim
1084
cmd_dim
Line 1101... Line 1099...
1101
        exx
1099
        exx
1102
        cp '('
1100
        cp '('
1103
        jp nz,fail_syntax
1101
        jp nz,fail_syntax
1104
        call eat
1102
        call eat
1105
        push bc
1103
        push bc
1106
        call getexpr
1104
        call getexpr_dehl
1107
        pop bc
1105
        pop bc
1108
        call eatclosebracket
1106
        call eatclosebracket
1109
       
1107
       
1110
;hlde=de=size
1108
        ex de,hl ;de=size
1111
 
1109
 
1112
;c=name (char)
1110
;c=name (char)
1113
        ld hl,(varend)
1111
        ld hl,(varend)
1114
        push hl
1112
        push hl
1115
        ld (hl),e
1113
        ld (hl),e
Line 1130... Line 1128...
1130
        ld (hl),d
1128
        ld (hl),d
1131
        ret
1129
        ret
1132
       
1130
       
1133
cmd_edit
1131
cmd_edit
1134
;hl'=курсор
1132
;hl'=курсор
1135
        call getexpr
1133
        call getexpr_dehl
-
 
1134
        ex de,hl
1136
        call findline
1135
        call findline ;de номер
1137
        ld a,(hl)
1136
        ld a,(hl)
1138
        cp d
1137
        cp d
1139
        jp nz,fail_syntax
1138
        jp nz,fail_syntax
1140
        inc hl
1139
        inc hl
1141
        ld a,(hl)
1140
        ld a,(hl)
Line 1148... Line 1147...
1148
       
1147
       
1149
        push hl
1148
        push hl
1150
        exx
1149
        exx
1151
        ld hl,cmdbuf
1150
        ld hl,cmdbuf
1152
        exx
1151
        exx
1153
        call prlinenum_tomem
1152
        call prlinenum_tomem ;de номер
1154
        exx
1153
        exx
1155
        ld (hl),' '
1154
        ld (hl),' '
1156
        inc hl
1155
        inc hl
1157
        push hl
1156
        push hl
1158
        exx
1157
        exx
Line 1282... Line 1281...
1282
        jr nz,cmd_let_createq
1281
        jr nz,cmd_let_createq
1283
        ld a,c
1282
        ld a,c
1284
        call addvar_int
1283
        call addvar_int
1285
cmd_let_createq
1284
cmd_let_createq
1286
        push bc
1285
        push bc
1287
        call getexpr ;hlde=value
1286
        call getexpr_dehl ;dehl=value
1288
        pop bc ;иначе выражение может запороть c
1287
        pop bc ;иначе выражение может запороть c
1289
        ld a,c
1288
        ld a,c
1290
        call setvar_int ;TODO не искать переменную второй раз
1289
        call setvar_int ;TODO не искать переменную второй раз
1291
        ret
1290
        ret
1292
 
1291
 
1293
cmd_let_array
1292
cmd_let_array
1294
        call eat ;skip '(' and spaces
1293
        call eat ;skip '(' and spaces
1295
        push bc
1294
        push bc
1296
        call getexpr
1295
        call getexpr_dehl
1297
        pop bc
1296
        pop bc
1298
        call eatclosebracket
1297
        call eatclosebracket
1299
        ld a,c
1298
        ld a,c
1300
        call findvar_int
1299
        call findvar_int
1301
        jp z,fail_syntax
1300
        jp z,fail_syntax
1302
        call indexarray
1301
        call indexarray
1303
        push hl ;адрес элемента
1302
        push hl ;адрес элемента
1304
        call eateq
1303
        call eateq
1305
        call getexpr ;hlde
1304
        call getexpr_dehl
1306
        ld b,h
1305
        ld b,h
1307
        ld c,l ;bcde
1306
        ld c,l ;debc
1308
        pop hl ;адрес элемента
1307
        pop hl ;адрес элемента
1309
        ld (hl),e
-
 
1310
        inc hl
-
 
1311
        ld (hl),d
-
 
1312
        inc hl
-
 
1313
        ld (hl),c
1308
        ld (hl),c
1314
        inc hl
1309
        inc hl
1315
        ld (hl),b
1310
        ld (hl),b
-
 
1311
        inc hl
-
 
1312
        ld (hl),e
-
 
1313
        inc hl
-
 
1314
        ld (hl),d
1316
        ret
1315
        ret
1317
       
1316
       
1318
cmd_let_str
1317
cmd_let_str
1319
        call eat ;skip '$' and spaces
1318
        call eat ;skip '$' and spaces
1320
        exx
1319
        exx
Line 1352... Line 1351...
1352
        ret
1351
        ret
1353
 
1352
 
1354
cmd_let_strarray
1353
cmd_let_strarray
1355
        call eat ;skip '(' and spaces
1354
        call eat ;skip '(' and spaces
1356
        push bc
1355
        push bc
1357
        call getexpr ;hlde=index
1356
        call getexpr_dehl ;dehl=index
1358
        pop bc
1357
        pop bc
1359
        call eatclosebracket
1358
        call eatclosebracket
1360
        call eateq
1359
        call eateq
-
 
1360
       ex de,hl
1361
        ld a,c
1361
        ld a,c
1362
        call findvar_str
1362
        call findvar_str ;hl=str
1363
        jp z,fail_syntax
1363
        jp z,fail_syntax
1364
        ld a,d
1364
        ld a,d ;de=index
1365
        or a
1365
        or a
1366
        jp nz,fail_syntax ;range check
1366
        jp nz,fail_syntax ;range check
1367
        add hl,de
1367
        add hl,de
1368
        push hl ;addr in str
1368
        push hl ;addr in str
1369
        call getexpr ;hlde=char
1369
        call getexpr_dehl ;dehl=char
-
 
1370
        ld a,l
1370
        pop hl ;addr in str       
1371
        pop hl ;addr in str       
1371
        ld (hl),e
1372
        ld (hl),a
1372
        ret
1373
        ret
1373
       
1374
       
1374
cmd_cls
1375
cmd_cls
1375
        exx
1376
        exx
1376
        push hl
1377
        push hl
Line 1380... Line 1381...
1380
        exx
1381
        exx
1381
        ret
1382
        ret
1382
 
1383
 
1383
cmd_if
1384
cmd_if
1384
;hl'=курсор
1385
;hl'=курсор
1385
        call getexpr
1386
        call getexpr_dehl
1386
        ld a,h
1387
        ld a,h
1387
        or l
1388
        or l
1388
        or d
1389
        or d
1389
        or e
1390
        or e
1390
        ret nz ;true = continue this line
1391
        ret nz ;true = continue this line
Line 1403... Line 1404...
1403
        exx
1404
        exx
1404
        ret
1405
        ret
1405
       
1406
       
1406
cmd_goto
1407
cmd_goto
1407
;hl'=курсор
1408
;hl'=курсор
1408
        call getexpr
1409
        call getexpr_dehl
-
 
1410
        ex de,hl
1409
cmd_goto_ok
1411
;cmd_goto_ok
1410
;hlde=номер строки
1412
;de=номер строки
1411
        call findline
1413
        call findline ;de номер
1412
        call startline
1414
        call startline
1413
        exx
1415
        exx
1414
        ld a,RUNMODE_PROG
1416
        ld a,RUNMODE_PROG
1415
        ld (runmode),a
1417
        ld (runmode),a
1416
        ret
1418
        ret
Line 1478... Line 1480...
1478
        exx
1480
        exx
1479
        ld a,(hl)
1481
        ld a,(hl)
1480
        exx
1482
        exx
1481
        cp ';'
1483
        cp ';'
1482
        jp z,cmd_print_semicolon
1484
        jp z,cmd_print_semicolon
1483
        call getexpr
1485
        call getexpr_dehl
1484
        call prval
1486
        call prval_dehl
1485
        jr cmd_print
1487
        jr cmd_print
1486
cmd_print_semicolon
1488
cmd_print_semicolon
1487
        call eat
1489
        call eat
1488
        call eatcolon
1490
        call eatcolon
1489
        jr nz,cmd_print ;TODO cmd_print0?
1491
        jr nz,cmd_print ;TODO cmd_print0?
1490
        ret
1492
        ret
1491
       
1493
       
1492
getexpr
1494
getexpr_dehl
1493
;out: hlde=value, c=type
1495
;out: dehl=value, c=type
1494
        call getaddexpr
1496
        call getaddexpr
1495
getexpr0
1497
getexpr0
1496
        exx
1498
        exx
1497
        ld a,(hl)
1499
        ld a,(hl)
1498
        exx
1500
        exx
Line 1558... Line 1560...
1558
        jr getexpr0
1560
        jr getexpr0
1559
 
1561
 
1560
getexpr_more_subr        
1562
getexpr_more_subr        
1561
;old > new: new-old = CY
1563
;old > new: new-old = CY
1562
        push bc
1564
        push bc
1563
        push hl ;HSW
1565
        push de ;HSW
1564
        push de ;LSW
1566
        push hl ;LSW
1565
        call getaddexpr
1567
        call getaddexpr
1566
        pop bc ;LSW
1568
        pop bc ;LSW
1567
        ex de,hl
-
 
1568
        or a
1569
        or a
1569
        sbc hl,bc
1570
        sbc hl,bc
1570
        ex de,hl
-
 
1571
        pop bc ;HSW
1571
        pop bc ;HSW
-
 
1572
        ex de,hl
1572
        sbc hl,bc
1573
        sbc hl,bc
-
 
1574
        ex de,hl
1573
        pop bc
1575
        pop bc
1574
        ld hl,0
1576
        ld hl,0
1575
        ld de,0
1577
        ld de,0
1576
        ret nc
1578
        ret nc
1577
        dec hl
1579
        dec hl
Line 1579... Line 1581...
1579
        ret
1581
        ret
1580
       
1582
       
1581
getexpr_less_subr
1583
getexpr_less_subr
1582
;old < new: old-new = CY
1584
;old < new: old-new = CY
1583
        push bc
1585
        push bc
1584
        push hl ;old HSW
1586
        push de ;old HSW
1585
        push de ;old LSW
1587
        push hl ;old LSW
1586
        call getaddexpr
1588
        call getaddexpr
1587
        pop bc ;old LSW
1589
        pop bc ;old LSW
1588
        pop af ;old HSW
1590
        pop af ;old HSW
1589
        push hl ;new HSW
1591
        push de ;new HSW
1590
        push de ;new LSW
1592
        push hl ;new LSW
1591
        push af ;old HSW
1593
        push af ;old HSW
1592
        push bc ;old LSW
1594
        push bc ;old LSW
1593
        pop de ;old LSW
1595
        pop hl ;old LSW
1594
        pop hl ;old HSW
1596
        pop de ;old HSW
1595
       
1597
       
1596
        pop bc ;LSW
1598
        pop bc ;LSW
1597
        ex de,hl
-
 
1598
        or a
1599
        or a
1599
        sbc hl,bc
1600
        sbc hl,bc
1600
        ex de,hl
-
 
1601
        pop bc ;HSW
1601
        pop bc ;HSW
-
 
1602
        ex de,hl
1602
        sbc hl,bc
1603
        sbc hl,bc
-
 
1604
        ex de,hl
1603
        pop bc
1605
        pop bc
1604
        ld hl,0
1606
        ld hl,0
1605
        ld de,0
1607
        ld de,0
1606
        ret nc
1608
        ret nc
1607
        dec hl
1609
        dec hl
1608
        dec de ;old < new
1610
        dec de ;old < new
1609
        ret
1611
        ret
1610
 
1612
 
1611
getexpr_eq_subr
1613
getexpr_eq_subr
1612
        push bc
1614
        push bc
1613
        push hl ;HSW
1615
        push de ;HSW
1614
        push de ;LSW
1616
        push hl ;LSW
1615
        call getaddexpr
1617
        call getaddexpr
1616
        pop bc ;LSW
1618
        pop bc ;LSW
1617
        ex de,hl
-
 
1618
        or a
1619
        or a
1619
        sbc hl,bc
1620
        sbc hl,bc
1620
        ex de,hl
-
 
1621
        pop bc ;HSW
1621
        pop bc ;HSW
-
 
1622
        ex de,hl
1622
        sbc hl,bc
1623
        sbc hl,bc
-
 
1624
        ex de,hl
1623
        ld a,d
1625
        ld a,d
1624
        or e
1626
        or e
1625
        or h
1627
        or h
1626
        or l
1628
        or l
1627
        pop bc
1629
        pop bc
Line 1653... Line 1655...
1653
        ret
1655
        ret
1654
       
1656
       
1655
getaddexpr_plus
1657
getaddexpr_plus
1656
        call eat
1658
        call eat
1657
        push bc
1659
        push bc
1658
        push hl ;HSW
1660
        push de ;HSW
1659
        push de ;LSW
1661
        push hl ;LSW
1660
        call getmulexpr
1662
        call getmulexpr
1661
        pop bc ;LSW
1663
        pop bc ;LSW
1662
        ex de,hl
-
 
1663
        add hl,bc
1664
        add hl,bc
1664
        ex de,hl
-
 
1665
        pop bc ;HSW
1665
        pop bc ;HSW
-
 
1666
        ex de,hl
1666
        adc hl,bc
1667
        adc hl,bc
-
 
1668
        ex de,hl
1667
        pop bc
1669
        pop bc
1668
        jr getaddexpr0
1670
        jr getaddexpr0
1669
       
1671
       
1670
getaddexpr_minus
1672
getaddexpr_minus
1671
        call eat
1673
        call eat
1672
        push bc
1674
        push bc
1673
        push hl ;HSW
1675
        push de ;HSW
1674
        push de ;LSW
1676
        push hl ;LSW
1675
        call getmulexpr
1677
        call getmulexpr
1676
        pop bc ;LSW
1678
        pop bc ;LSW
1677
        ex de,hl
-
 
1678
        or a
1679
        or a
1679
        sbc hl,bc
1680
        sbc hl,bc
1680
        ex de,hl
-
 
1681
        pop bc ;HSW
1681
        pop bc ;HSW
-
 
1682
        ex de,hl
1682
        sbc hl,bc
1683
        sbc hl,bc
-
 
1684
        ex de,hl
1683
        call neghlde
1685
        call negdehl
1684
        pop bc
1686
        pop bc
1685
        jr getaddexpr0
1687
        jr getaddexpr0
1686
 
1688
 
1687
getmulexpr
1689
getmulexpr
1688
        call getval_
1690
        call getval_dehl_
1689
getmulexpr0
1691
getmulexpr0
1690
        exx
1692
        exx
1691
        ld a,(hl)
1693
        ld a,(hl)
1692
        exx
1694
        exx
1693
        ;or a
1695
        ;or a
Line 1705... Line 1707...
1705
        ret
1707
        ret
1706
       
1708
       
1707
getmulexpr_div
1709
getmulexpr_div
1708
        call eat
1710
        call eat
1709
        push bc
1711
        push bc
1710
        push hl ;HSW old
1712
        push de ;HSW old
1711
        push de ;LSW old
1713
        push hl ;LSW old
1712
        call getval_
1714
        call getval_dehl_
1713
        push hl ;LSW new
-
 
1714
        push de ;HSW new
1715
        push de ;HSW new
-
 
1716
        push hl ;LSW new
1715
        exx
1717
        exx
1716
        pop ix ;LSW new
1718
        pop ix ;LSW new
1717
        pop bc ;HSW new
1719
        pop bc ;HSW new
1718
        pop de ;LSW old
1720
        pop de ;LSW old
1719
        ex (sp),hl ;pop hl ;HSW old
1721
        ex (sp),hl ;pop hl ;HSW old
-
 
1722
        call _DIVLONG. ;hl, de / bc, ix ;out: hl(high), de(low)
1720
        call _DIVLONG.
1723
       ex de,hl ;dehl
1721
        exx
1724
        exx
1722
        pop hl ;курсор
1725
        pop hl ;курсор
1723
        exx
1726
        exx
1724
        pop bc
1727
        pop bc
1725
        jr getmulexpr0
1728
        jr getmulexpr0
1726
 
1729
 
1727
getmulexpr_mul
1730
getmulexpr_mul
1728
        call eat
1731
        call eat
1729
        push bc
1732
        push bc
1730
        push hl ;HSW
1733
        push de ;HSW
1731
        push de ;LSW
1734
        push hl ;LSW
1732
        call getval_
1735
        call getval_dehl_
1733
        pop ix ;LSW
1736
        pop ix ;LSW
1734
        pop bc ;HSW
1737
        pop bc ;HSW
-
 
1738
       ex de,hl ;hl,de
1735
        call _MULLONG.
1739
        call _MULLONG.
-
 
1740
       ex de,hl ;dehl
1736
        pop bc
1741
        pop bc
1737
        jr getmulexpr0
1742
        jr getmulexpr0
1738
       
1743
       
1739
;hl, de / bc, ix
1744
;hl, de / bc, ix
1740
;out: hl(high), de(low)
1745
;out: hl(high), de(low)
Line 1742... Line 1747...
1742
        ;EXPORT _DIVLONG.
1747
        ;EXPORT _DIVLONG.
1743
        ld a,h
1748
        ld a,h
1744
        xor b
1749
        xor b
1745
        push af
1750
        push af
1746
        xor b
1751
        xor b
1747
        call m,neghlde
1752
        call m,div_neghlde
1748
        ld a,b
1753
        ld a,b
1749
        rla
1754
        rla
1750
        jr nc,divlongnonegbcix
1755
        jr nc,divlongnonegbcix
1751
        xor a
1756
        xor a
1752
        sub lx
1757
        sub lx
Line 1767... Line 1772...
1767
        exx
1772
        exx
1768
        pop de ;de' = "bc_in"
1773
        pop de ;de' = "bc_in"
1769
        ld hl,0
1774
        ld hl,0
1770
        exx
1775
        exx
1771
        ld a,e
1776
        ld a,e
1772
        ex af,af' ;e_in
1777
        ex af,af' ;' ;e_in
1773
        push de ;d_in
1778
        push de ;d_in
1774
        ld c,l ;l_in
1779
        ld c,l ;l_in
1775
        ld a,h ;h_in
1780
        ld a,h ;h_in
1776
        ld hl,0
1781
        ld hl,0
1777
        push ix
1782
        push ix
Line 1792... Line 1797...
1792
        ex af,af' ;a="e_in", a'="d"
1797
        ex af,af' ;a="e_in", a'="d"
1793
        ;a="e_in"
1798
        ;a="e_in"
1794
;hl'hla <= 0hlde_in
1799
;hl'hla <= 0hlde_in
1795
        call _DIVLONGP. ;"e"
1800
        call _DIVLONGP. ;"e"
1796
        ld e,a ;"e"
1801
        ld e,a ;"e"
1797
        ex af,af' ;"d"
1802
        ex af,af' ;' ;"d"
1798
        ld d,a
1803
        ld d,a
1799
        pop hl ;h="l"
1804
        pop hl ;h="l"
1800
        ld l,h
1805
        ld l,h
1801
        ld h,c ;"h"
1806
        ld h,c ;"h"
1802
       
1807
       
1803
        pop af
1808
        pop af
1804
        ret p
1809
        ret p
1805
        jp neghlde
1810
div_neghlde
-
 
1811
        xor a
-
 
1812
        sub e
-
 
1813
        ld e,a
-
 
1814
        ld a,0
-
 
1815
        sbc a,d
-
 
1816
        ld d,a
-
 
1817
        ld a,0
-
 
1818
        sbc a,l
-
 
1819
        ld l,a
-
 
1820
        ld a,0
-
 
1821
        sbc a,h
-
 
1822
        ld h,a
-
 
1823
        ret
-
 
1824
 
1806
;a = hl'hla/de'de
1825
;a = hl'hla/de'de
1807
;c not used
1826
;c not used
1808
_DIVLONGP.
1827
_DIVLONGP.
1809
;do 8 bits
1828
;do 8 bits
1810
        ld b,8
1829
        ld b,8
Line 1881... Line 1900...
1881
 
1900
 
1882
 
1901
 
1883
       
1902
       
1884
getval_unaryminus
1903
getval_unaryminus
1885
        call eat
1904
        call eat
1886
        call getval_
1905
        call getval_dehl_
1887
        jp neghlde
1906
        jp negdehl
1888
getval_bracket
1907
getval_bracket
1889
        call eat
1908
        call eat
1890
        call getexpr
1909
        call getexpr_dehl
1891
        jp eatclosebracket
1910
        jp eatclosebracket
1892
       
1911
       
1893
getval_
1912
getval_dehl_
1894
;hl'=курсор
1913
;hl'=курсор
1895
;out: hlde=value, c=type
1914
;out: dehl=value, c=type
1896
        exx
1915
        exx
1897
        ld a,(hl)
1916
        ld a,(hl)
1898
        exx
1917
        exx
1899
        cp '$'
1918
        cp '$'
1900
        jp z,getval_function
1919
        jp z,getval_function
1901
        cp '-'
1920
        cp '-'
1902
        jr z,getval_unaryminus
1921
        jr z,getval_unaryminus
1903
        cp '('
1922
        cp '('
1904
        jr z,getval_bracket
1923
        jr z,getval_bracket
1905
        cp '"'
1924
        cp '"'
1906
        jr z,getval_str
1925
        jp z,getval_str
1907
        sub '0'
1926
        sub '0'
1908
        cp 10
1927
        cp 10
1909
        jr c,getval_num
1928
        jr c,getval_num_dehl
1910
        exx
1929
        exx
1911
        ld a,(hl)
1930
        ld a,(hl)
1912
        exx
1931
        exx
1913
        ld c,a ;name
1932
        ld c,a ;name
1914
        exx
1933
        exx
Line 1943... Line 1962...
1943
        set 7,c ;ld c,128 ;str
1962
        set 7,c ;ld c,128 ;str
1944
        ret
1963
        ret
1945
getval_varchararray
1964
getval_varchararray
1946
        call eat
1965
        call eat
1947
        push bc
1966
        push bc
1948
        call getexpr
1967
        call getexpr_dehl
1949
        pop bc
1968
        pop bc
1950
        call eatclosebracket
1969
        call eatclosebracket
-
 
1970
       ex de,hl ;de=index
1951
        ld a,c
1971
        ld a,c
1952
        call findvar_str
1972
        call findvar_str
1953
        jp z,fail_syntax
1973
        jp z,fail_syntax
1954
        ld a,d
1974
        ld a,d ;de=index
1955
        or a
1975
        or a
1956
        jp nz,fail_syntax ;range check
1976
        jp nz,fail_syntax ;range check
1957
        add hl,de
1977
        add hl,de
1958
        ld e,(hl)
1978
        ld l,(hl)
1959
        ld hl,0
1979
        ld de,0
1960
        ld d,h ;hlde=char
1980
        ld h,d ;dehl=char
1961
        res 7,c ;ld c,0 ;int
1981
        res 7,c ;ld c,0 ;int
1962
        ret
1982
        ret
1963
getval_vararray
1983
getval_vararray
1964
        call eat
1984
        call eat
1965
        push bc
1985
        push bc
1966
        call getexpr
1986
        call getexpr_dehl
1967
        pop bc
1987
        pop bc
1968
        call eatclosebracket
1988
        call eatclosebracket
-
 
1989
       ex de,hl ;de=index
1969
        ld a,c
1990
        ld a,c
1970
        call findvar_array
1991
        call findvar_array
1971
        jp z,fail_syntax
1992
        jp z,fail_syntax
1972
        call indexarray
1993
        call indexarray
1973
        call getint
1994
        call getint
1974
        res 7,c ;ld c,0 ;int
1995
        res 7,c ;ld c,0 ;int
1975
        ret
1996
        ret
1976
getval_num
1997
getval_num_dehl
1977
        call readnum ;hlde=num, hl'=after num and spaces, CY=error
1998
        call readnum_dehl ;dehl=num, hl'=after num and spaces, CY=error
1978
        jp c,fail_syntax
1999
        jp c,fail_syntax
1979
        res 7,c ;ld c,0 ;int
2000
        res 7,c ;ld c,0 ;int
1980
        ret
2001
        ret
1981
getval_str
2002
getval_str
1982
        call readstr ;hl=str, hl'=after str and spaces, CY=error
2003
        call readstr ;hl=str, hl'=after str and spaces, CY=error
1983
        jp c,fail_syntax
2004
        jp c,fail_syntax
1984
        set 7,c ;ld c,0 ;str
2005
        set 7,c ;ld c,0 ;str
1985
        ret
2006
        ret
1986
 
2007
 
1987
prval
2008
prval_dehl
1988
;hlde=value, c=type
2009
;dehl=value, c=type
1989
        exx
2010
        exx
1990
        push hl
2011
        push hl
1991
        exx
2012
        exx
1992
        bit 7,c
2013
        bit 7,c
1993
        jr nz,prval_str
2014
        jr nz,prval_str
1994
        call prdword_hlde
2015
        call prdword_dehl
1995
        pop hl
2016
        pop hl
1996
        exx
2017
        exx
1997
        ret
2018
        ret
1998
prval_str
2019
prval_str
1999
        call prstr_withlen
2020
        call prstr_withlen