-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathboot.a80
1989 lines (1856 loc) · 33.9 KB
/
boot.a80
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
MODULE boot
DEVICE ZXSPECTRUM48
OUTPUT boot.cde
;███████████████ V A R I A B L E S ██████████████████████████████████████
DMA equ #0B
ULA equ #FE
ZXi_port0 equ #703B
ZXi_port1 equ #713B
ZXi_port2 equ #723B
ZXi_port3 equ #733B
ZXi_port4 equ #743B
ZXi_port5 equ #753B
ZXi_port6 equ #763B
ZXi_port7 equ #773B
g_ZXi_port0 equ #7C3B
g_ZXi_port1 equ #7D3B
u_ZXi_port0 equ #FC3B
u_ZXi_port1 equ #FD3B
;███████████████ M A I N C O D E ███████████████████████████████████████
org 49152
maincode
DISP 0
boot di
ld sp,0
im 1
; ld a, #C3 ; Z80DMA command: WR6: Reset
; out (DMA), a
xor a
ld i, a
out (ULA),a
/* ld hl, 5AFFh
ld de, 5AFEh
ld bc, 1AFFh
ld (hl), a
lddr ; Clear videoram (black screen)
in a, (254)
cpl
and 1Fh
jr nz,endramtest ;skip Busy effect
*/
jr boot2
db "LMN128"
//WARNING max #38 bytes!!!!
endboot BLOCK #38-endboot,0
; DISP #38
im1 ei
ret
boot2
// INCLUDE "effect.a80" ; Busy nonbootdisk effect
endramtest ld hl,ramcodeinrom
ld de,ramcode
ld bc,endramcode-ramcode
ldir
jp ramcode
ramcodeinrom
ent ; restore address to compile to right place
ramcode
di ; for sna test
ld sp,0 ; for sna test
//test Enter key to start full firmware
ld a,%10111111 //A14 - row with enter key
in a,(#FE)
and 1
jr z,enterpress
ld bc,ZXi_port0
ld a,#22 //StartUp order
out (c),a
inc b
in a,(c)
enterpress ld (suorder+1),a //save startup order
suorder ld a,0
or a
call z,effect.begin
call cls.CLS
ld a,7
ld HL,22528
ld DE,22529
ld BC,767
ld (HL),a
ldir
ld a,(suorder+1)
or a
jp nz,skipanim
// Setup keyboard first part
/* ld bc,ZXi_port0 ;MB03+
ld a,#11 ;Mouse/Keyboard
out (c),a
inc b
ld a,#03 ;set keyboard
out (c),a
ld bc,u_ZXi_port0 ;Uno
ld a,4 ;SCANCODE reg_number
out (c),a
inc b
ld a,#FF ;reset keyboard
out (c),a */
/*
; temporary switch to MB02+ machine for testing and NMI enable
xor a
ld bc,ZXi_port0 //ZXi portselect
out (c),a
ld bc,ZXi_port1
ld a,1 //HW - 1 - MB02+
out (c),a
*/
call iinkey.IINKEY ; waiting for key
jp nz,skipanim
ld a,0
ld (txy32.orflag),a
ld a,66
ld (txy32.T32_ATT),a
ld bc,#0000
call fall1
call iinkey.IINKEY ; waiting for key
jp nz,skipanim
ld a,70
ld (txy32.T32_ATT),a
ld bc,#0010
call fall1
call iinkey.IINKEY ; waiting for key
jp nz,skipanim
ld a,68
ld (txy32.T32_ATT),a
ld bc,#002E
call fall1
call iinkey.IINKEY ; waiting for key
jp nz,skipanim
ld a,69
ld (txy32.T32_ATT),a
ld bc,#0059
call fall1
call iinkey.IINKEY ; waiting for key
jp nz,skipanim
ld a,1
ld (txy32.orflag),a
ld a,66
ld (txy32.T32_ATT),a
ld bc,#0000
call fall2
call iinkey.IINKEY ; waiting for key
jp nz,skipanim
ld a,70
ld (txy32.T32_ATT),a
ld bc,#0010
call fall2
call iinkey.IINKEY ; waiting for key
jp nz,skipanim
ld a,68
ld (txy32.T32_ATT),a
ld bc,#0028
call fall3
call iinkey.IINKEY ; waiting for key
jp nz,skipanim
ld a,69
ld (txy32.T32_ATT),a
ld bc,#0058
call fall4
call iinkey.IINKEY ; waiting for key
jp nz,skipanim
ld a,0
ld (txy32.orflag),a
ld a,69
ld (txy32.T32_ATT),a
ld bc,#2A57
ld de,#2A60
ld a,#4B
call wide1
call iinkey.IINKEY ; waiting for key
jp nz,skipanim
// ld b,1
// call wait.wait
ld a,68
ld (txy32.T32_ATT),a
ld bc,#2A2A
ld de,#2A35
ld a,#1F
call wide1
call iinkey.IINKEY ; waiting for key
jp nz,skipanim
; call iinkey.ANYKEY
jp follow1
wide1 push af
push de
push bc
ld (txy32.cursor),bc
ld a,132
call txy32.xy
pop bc
push bc
ld a,8
add a,b
ld b,a
ld a,134
ld (txy32.cursor),bc
call txy32.xy
pop bc
pop de
push bc
push de
ld (txy32.cursor),de
ld a,129
call txy32.xy
pop de
push de
ld a,8
add a,d
ld d,a
ld (txy32.cursor),de
ld a,131
call txy32.xy
// ld b,4
// call wait.wait
pop de
pop bc
pop af
inc e
dec c
cp c
jr nz,wide1
ret
fall1 push bc
call singledot
// ld b,1
//
// call wait.wait
pop bc
inc b
ld a,#2B
cp b
jr nz,fall1
ret
fall2 push bc
call halfdot
// ld b,1
// ld hl,1
// call wait.wait
pop bc
inc b
ld a,#2B
cp b
jr nz,fall2
ret
fall3 push bc
call halfdot3
// ld b,1
// ld hl,1
// call wait.wait
pop bc
inc b
ld a,#2B
cp b
jr nz,fall3
ret
fall4 push bc
call halfdot4
// ld b,1
// ld hl,1
// call wait.wait
pop bc
inc b
ld a,#2B
cp b
jr nz,fall4
ret
halfdot ld (txy32.cursor),bc
ld a,132
call txy32.xy
ld a,133
jp txy32.xy
halfdot3 ld (txy32.cursor),bc
ld a,136
call txy32.xy
ld a,137
jp txy32.xy
halfdot4 ld (txy32.cursor),bc
ld a,138
call txy32.xy
ld a,139
jp txy32.xy
singledot ld (txy32.cursor),bc
ld a,132
push bc
call txy32.xy
ld a,133
call txy32.xy
pop bc
ld a,8
add a,b
ld b,a
ld (txy32.cursor),bc
ld a,134
call txy32.xy
ld a,135
call txy32.xy
ret
follow1 ld de,#050F
ld hl,ultimatelogo
ld a,13 // number of sprites in animations
1 push af
push de
push hl
call sprite2.OK
ld b,1
ld hl,#0E00
call wait.wait
pop hl
ld de,20 // lenght of sprite2
add hl,de
pop de
inc e
pop af
dec a
jr nz,1B
skipanim
//SetUp section
di
xor a
ld bc,g_ZXi_port0
out (c),a
inc b
out (c),a //select 0 - external device - MB03+
in a, (#53)
ex af,af'
ld a, #E0
out (#53),a
/* ld b,16
ld hl,#2000
xor a
2 or (hl)
jr nz,3F
inc hl
djnz 2B
jr 8F //setup is empty use FPGA default*/
3 ld b,1 // number of register to set
ld hl, setup_tab
4 ld a,(hl)
push bc
ld bc,ZXi_port0
out (c),a
inc b
inc hl
ld e, (hl)
inc hl
ld d, (hl)
inc hl
ld a,(de)
out (c),a
pop bc
djnz 4B
jr 8F
setup_tab db 4
dw #2004
/*setup_tab db 1
dw #2001
db 4
dw #2004
db 5
dw #2005
db 6
dw #2006
db 7
dw #2007
db 9
dw #2009
db #A
dw #200A
db #B
dw #200B
db #C
dw #200C
db #D
dw #200D
db #F
dw #200F
db #10
dw #2010
db #11
dw #2011
db #12
dw #2012
db #18
dw #2018
db #19
dw #2019
db #20
dw #2020
db #2C
dw #202C
db #2D
dw #202D
db #3F
dw #203F
db #40
dw #2040*/
8 ex af,af'
out (#53),a
//End Setup section
// set wifi module to gently power consumption
wfon
ld bc,ZXi_port0
ld a,5
out (c),a
inc b
in a,(c)
rrca
jr nc,2F //not enable
rrca
jr nc,2F //not low rfpower
ld b,1 ; wftimeout
wfloop1 ld de,0
wftimeout dec de
ld a,d
or e
jr nz, wftimeout
djnz wfloop1
ld b,#13 ; wifi ZXi TX port
ld hl,wifistring
1 ld a,(hl)
out (c),a
ex af,af'
wfbusy
in a,(c)
bit 1,a
jr nz,wfbusy
ex af,af'
inc hl
cp 10 //test end of string
jr nz,1B
jr 2F
wifistring db "AT+RFPOWER=0",13,10
2
//AY test - is available internal AY?
xor a
ld bc,ZXi_port0 //ZXi portselect
out (c),a
inc b
dec a //HW - FF firmware
out (c),a
ei
halt //waiting for border to get relevant data
di
ld bc,65533 //real AY active?
ld a,2
out (c),a
ld b,#BF
out (c),a
ld b,#FF
in a, (c)
cp 2
jr z,realayinstalled //if real ay present skip it
ld bc,ZXi_port0
ld a,#01
out (c),a
inc b
in a,(c)
bit 1,a
jr z,realayinstalled //if 3xAY disabled skip it
inc b
in a,(c)
set 1,a //enable reading of MB03+ AYs
out (c),a
realayinstalled
// profi interface setup - dedicated to Hood
xor a
ld bc,#01EF
out (c),a
inc a
inc b
out (c),a
//show fw main screen
ld de,#0000
ld hl,MB03pluslogo
call sprite2.OK
ld hl, STRIPS
ld bc,#4800
ld (txy32.cursor),bc
push hl
call txy32.txy
pop hl
ld bc,#A000
ld (txy32.cursor),bc
call txy32.txy
;carymary
ld bc,#4800
ld de,#48ff
call draw_jugo.DRAW
//StartUp order #2
ld a,(suorder+1)
cp 2
jp z,fastbs
cp 3
jp z,fastsd
ld bc,#3D7A
ld (txy51.cursor),bc
ld hl,TEXT0
call txy51.txy
ld bc,#A800
ld (txy51.cursor),bc
ld hl,TEXT4
call txy51.txy
ld bc,#B800
ld (txy51.cursor),bc
ld hl,TEXT3
call txy51.txy
ld bc,#B000
ld (txy51.cursor),bc
ld hl,TEXT2
call txy51.txy
ld bc,#B087
ld (txy51.cursor),bc
ld hl,TEXT5
call txy51.txy
ld bc,#9EB3
ld (txy51.cursor),bc
ld hl,FW1
call txy51.txy
ld bc,#9EBF
ld (txy51.cursor),bc
ld hl,FW2
call txy51.txy
ld bc,#9ED8
ld (txy51.cursor),bc
ld hl,DATE
call txy51.txy
//Core Time Stamp
ld bc,#9E70
ld (txy51.cursor),bc
ld hl,COREFW1
call txy51.txy
ld bc,#9E87
ld (txy51.cursor),bc
ld hl,COREFW2
call txy51.txy
ld bc,#9E91
ld (txy51.cursor),bc
ld bc,ZXi_port0
ld a,#FF
out (c),a
ld b,high ZXi_port7
1 dec b
ld h,0
in l,(c)
push bc
call NUMBER1
pop bc
ld a,b
cp high ZXi_port4
jr nz, 1B
ld bc,#5000
ld (txy51.cursor),bc
ld hl,HW1
call txy51.txy
ld bc,#5803
ld (txy51.cursor),bc
ld hl,HW2
call txy51.txy
ld bc,#6003
ld (txy51.cursor),bc
ld hl,HW3
call txy51.txy
ld bc,#6803
ld (txy51.cursor),bc
ld hl,HW4
call txy51.txy
ld bc,#7003
ld (txy51.cursor),bc
ld hl,HW5
call txy51.txy
ld bc,#7803
ld (txy51.cursor),bc
ld hl,HW6
call txy51.txy
ld bc,#8000
ld (txy51.cursor),bc
ld hl,CONF1
call txy51.txy
ld bc,#8803
ld (txy51.cursor),bc
ld hl,CONF2
call txy51.txy
ld bc,#9003
ld (txy51.cursor),bc
ld hl,CONF3
call txy51.txy
//carymary2
ld bc,#A600
ld de,#A6ff
call draw_jugo.DRAW
//reading CF info
/* call cf.IDENT
ld bc,#707B
ld (txy51.cursor),bc
jr nz,cferr
;model
ld hl,cf.BUFFER+54
ld b,40
call cf.PROHOD
set 7,(ix+79)
cferr call txy51.txy*/
; configuration tests
// Setup keyboard second part
/* xor a
ld bc,ZXi_port0 //ZXi portselect
out (c),a
inc b
dec a //HW - FF firmware
out (c),a
ei
ld bc,u_ZXi_port0 ;Uno
ld a,#4 ;SCANCODE reg_number
out (c),a
inc b
ld e,2 ;wait time - sum with statup max 1s
1 in a,(c)
cp #AA
jr z,2F ;BAT keyboard initial test OK
halt
in a, (254)
cpl
and 1Fh
jr nz,3F ;if press any key skip
dec e
jr nz,1B
// jr 3F ; send it always to set in case keyboard is connected to eLeMeNt ZX
2 ld a,#F6 ;Keyboard - set default parameters
out (c),a
halt
halt
ld a,#ED ;Keyboard - set LED
out (c),a
halt
ld a,#02 ;Keyboard - set LED - Num lock on
out (c),a
3*/
loopkey
1
xor a
ld bc,ZXi_port0 //ZXi portselect
out (c),a
inc b
dec a //HW - FF firmware
out (c),a
ei
halt
di
xor a
ld bc,ZXi_port0 //ZXi portselect
out (c),a
ld bc,ZXi_port1
ld a,1 //HW - 1 MB02+
out (c),a
call clock
call iinkey.IINKEY //waiting for key
jr z,1B
1 cp "L"
jr nz,1F
ld a,#A
ld bc,ZXi_port0 //DVI on
out (c),a
ld bc,ZXi_port1
in a,(c)
or 1
out (c),a
jr loopkey
1 cp "K"
jr nz,1F
ld a,#A
ld bc,ZXi_port0 //HDMI off
out (c),a
ld bc,ZXi_port1
in a,(c)
and %11111110
out (c),a
jr loopkey
1 cp "S" //SetUp
jr nz,1F
xor a
ld bc,ZXi_port0 //ZXi portselect
out (c),a
ld bc,ZXi_port1
dec a //HW - FF - Firmware
out (c),a
xor a
ld bc,g_ZXi_port0
out (c),a
inc b
out (c),a //select 0 - external device - MB03+
out (#27),a
out (#67),a
ld a,22
out (#07),a
inc a
out (#47),a
ld a,#60 //flash enable, read only
out (#53),a
rst 0
1 cp "A" //UserApps-0
jr nz,1F
xor a
ld bc,ZXi_port0 //ZXi portselect
out (c),a
ld bc,ZXi_port1
dec a //HW - FF - Firmware
out (c),a
xor a
ld bc,g_ZXi_port0
out (c),a
inc b
out (c),a //select 0 - external device - MB03+
out (#27),a
out (#67),a
ld a,64
out (#07),a
inc a
out (#47),a
ld a,#60 //flash enable, read only
out (#53),a
rst 0
1 cp "B" //UserApps-1
jr nz,1F
xor a
ld bc,ZXi_port0 //ZXi portselect
out (c),a
ld bc,ZXi_port1
dec a //HW - FF - Firmware
out (c),a
xor a
ld bc,g_ZXi_port0
out (c),a
inc b
out (c),a //select 0 - external device - MB03+
out (#27),a
out (#67),a
ld a,66
out (#07),a
inc a
out (#47),a
ld a,#60 //flash enable, read only
out (#53),a
rst 0
1 cp "C" //UserApps-2
jr nz,1F
xor a
ld bc,ZXi_port0 //ZXi portselect
out (c),a
ld bc,ZXi_port1
dec a //HW - FF - Firmware
out (c),a
xor a
ld bc,g_ZXi_port0
out (c),a
inc b
out (c),a //select 0 - external device - MB03+
out (#27),a
out (#67),a
ld a,68
out (#07),a
inc a
out (#47),a
ld a,#60 //flash enable, read only
out (#53),a
rst 0
1 cp "D" //UserApps-3
jr nz,1F
xor a
ld bc,ZXi_port0 //ZXi portselect
out (c),a
ld bc,ZXi_port1
dec a //HW - FF - Firmware
out (c),a
xor a
ld bc,g_ZXi_port0
out (c),a
inc b
out (c),a //select 0 - external device - MB03+
out (#27),a
out (#67),a
ld a,70
out (#07),a
inc a
out (#47),a
ld a,#60 //flash enable, read only
out (#53),a
rst 0
1 cp "W" //Wifi
jr nz,1F
xor a
ld bc,ZXi_port0 //ZXi portselect
out (c),a
ld bc,ZXi_port1
dec a //HW - FF - Firmware
out (c),a
xor a
ld bc,g_ZXi_port0
out (c),a
inc b
out (c),a //select 0 - external device - MB03+
out (#27),a
out (#67),a
ld a,30
out (#07),a
inc a
out (#47),a
ld a,#60 //flash enable, read only
out (#53),a
ld sp,0
rst 0
1 cp "3"
jp nz,next1
call clean
ld bc,#B800
ld (txy32.cursor),bc
LD HL, STRIPS
call txy32.txy
ld bc,#BF00
ld de,#BFFF
call draw_jugo.DRAW
/* ld de,#0E00
ld hl,EsxLogo
call sprite2.OK*/
ld bc,#5808
ld (txy51.cursor),bc
ld hl,ULT1
call txy51.txy
ld bc,#6008
ld (txy51.cursor),bc
ld hl,ULT2
call txy51.txy
ld bc,#6808
ld (txy51.cursor),bc
ld hl,ULT3
call txy51.txy
ld bc,#7808
ld (txy51.cursor),bc
ld hl,ULT4
call txy51.txy
ld bc,#8008
ld (txy51.cursor),bc
ld hl,ULT5
call txy51.txy
ld bc,#8808
ld (txy51.cursor),bc
ld hl,ULT6
call txy51.txy
ld bc,#A008
ld (txy51.cursor),bc
ld hl,ULT7
call txy51.txy
ld bc,#A808
ld (txy51.cursor),bc
ld hl,ULT8
call txy51.txy
holdkey5 call iinkey.IINKEY
jr z,holdkey5
xor a
ld bc,ZXi_port0 //ZXi portselect
out (c),a
inc b
dec a //HW - FF - Firmware
out (c),a
jp ramcode
next1 cp 11h ; break
jr nz,2F ; no break
xor a
ld bc,ZXi_port0 //ZXi portselect
out (c),a
ld bc,ZXi_port1
//HW - 0
out (c),a
ld bc,8189 ;ZX128+2A rom
out (c),a
ld bc,32765 ;ZX128 rom0
out (c),a
ld i,a
im 0
dec a // A should have #FF
ld sp,#ffff //Real reset simulation. Sp is set to #ffff,
jp 0 ; jp to 0, rst 0 is not good becaus it is call
2
cp '1' //key 1
jp nz,3F
call clean
fastbs ld bc,#B800
ld (txy32.cursor),bc
LD HL, STRIPS
call txy32.txy
ld bc,#BF00
ld de,#BFFF
call draw_jugo.DRAW
ld de,#0D03
ld hl,BSDOSLogo
call sprite2.OK
ld bc,#9856
ld (txy51.cursor),bc
ld hl,BSD1
call txy51.txy
holdkey3 call iinkey.IINKEY
jr nz,holdkey3
ld b,6 //number of pages to transfer
22 push bc
xor a
ld bc,ZXi_port0 //ZXi portselect
out (c),a
ld bc,ZXi_port1
ld a,255 //HW - FF - Firmware
out (c),a
xor a
out (#27),a
out (#67),a
pop bc
push bc
ld a,8 ;first Flash block
dec b
add a,b
add a,b ;multiplication by 2
out (#07),a
inc a
out (#47),a
ld hl,0
ld de,32768
ld bc,16384
ldir
ld bc,ZXi_port1
ld a,1 //HW - 1 - MB02+
out (c),a
pop bc
push bc
ld a,96 ;first MB02+ RAM
dec b
add a,b