10 ; FLASH EPROM 20 ;PROGRAMMING IN ZX SPECTRUM 30 40 ORG 65000 50 60 70 DATA DEFW 32768 ;Source - RAM 80 DEST DEFW 0 ; Destination - ROM 90 LEN DEFW 16384 ;This is max. len. Min. is 128 bytes 100 ROMSEC DEFB 0 ;Here should be poked ROM section which will be ;programmed if ROM-switch with GAL is used. Value may be 0-3. 110 DEFB 0,0,0 ;Ensure that code start is 65010. 120 130 START DI ;Here is start point, so start with ... USR 65010 . 140 150 160 ;Show ROM section for programm 170 LD A,(ROMSEC) 180 OUT (169),A 190 CALL BOEF ;Delay cca. 3 sec for switch off hardware protection. 200 ;Disable software protection 210 LD A,1 220 OUT (169),A ; Give high to A14 of ROM. 230 LD A,#AA 240 LD (#1555),A ; In fact we write here to address #5555 of ROM! 250 XOR A 260 OUT (169),A ; Low to A14 of ROM. 270 LD A,#55 280 LD (#2AAA),A 290 LD A,1 300 OUT (169),A 310 LD A,#80 320 LD (#1555),A ; Address #5555 ! 330 LD A,#AA 340 LD (#1555),A ; Adr. #5555. 350 XOR A 360 OUT (169),A 370 LD A,#55 380 LD (#2AAA),A 390 LD A,1 400 OUT (169),A 410 LD A,#20 420 LD (#1555),A ; Adr. #5555. 430 440 ;Pause 10msec 444 LD B,10 450 PA10 CALL DEL 460 DJNZ PA10 470 480 ;Switch to required ROM section for Programm 490 LD A,(ROMSEC) 500 OUT (169),A 510 520 LD HL,(DATA) 530 LD DE,(DEST) 540 LD BC,(LEN) 550 560 ;test block len 570 580 LD A,C 590 AND #7F ; Len. must be dividable with 128. 600 JR NZ,WRLEN 610 LD A,B 620 CP #41 ; Max. len. 16384 bytes. 630 JR NC,WRLEN 640 CP #40 650 JR NZ,LOK1 660 LD A,C 670 OR A 680 JR NZ,WRLEN 690 LOK1 700 710 ;calc page (sector) count 720 730 LD A,C 740 RLCA 750 LD A,B 760 RLA 770 LD B,A 780 ;max 128 page 790 800 MLOOP 810 LD A,4 820 OUT (254),A ; Some border colour change during programming. 830 PUSH BC 840 LD B,128 ; 128 bytes in one page (sector). 850 PAGL LD A,(HL) 860 LD (DE),A ; LDIR or LDI will not programm correct ! 870 INC HL 880 INC DE 890 DJNZ PAGL 900 910 LD A,2 920 OUT (254),A ; Border... 930 ;now data polling 940 DEC HL 950 LD A,(HL) 960 AND #80 ; Get D7 970 LD C,A 980 INC HL 990 LD B,90 ; For time out 1000 DEC DE 1010 DATP CALL DEL 1020 LD A,(DE) 1030 AND #80 1040 CP C 1050 JR Z,POK 1060 DJNZ DATP 1070 POP BC ;correct stack 1080 LD BC,1 ; Flag for error during programming. 1090 JR EXIT 1100 POK INC DE 1110 POP BC 1120 DJNZ MLOOP 1130 LD BC,0 ; Flag for successfull programming. 1140 EXIT 1150 1160 ;Enable software protection 1170 1180 CALL DEL 1190 LD A,1 1200 OUT (169),A 1210 LD A,#AA 1220 LD (#1555),A ; Adr. #5555. 1230 XOR A 1240 OUT (169),A 1250 LD A,#55 1260 LD (#2AAA),A 1270 LD A,1 1280 OUT (169),A 1290 LD A,#A0 1300 LD (#1555),A ; Adr. #5555. 1310 CALL BOEF ; Delay cca. 3 sec. 1320 EI 1330 RET 1340 1350 DEL PUSH BC ; Delay of 1 msec. 1360 LD B,200 1370 DELL NOP 1380 DJNZ DELL 1390 POP BC 1400 RET 1410 1420 WRLEN LD BC,2 ; Flag for incorrect block length. 1430 JR EXIT 1440 BOEF 1450 LD A,1 ; Border blue. 1460 OUT (254),A 1470 CALL DEL1 1480 LD A,6 ; Border yellow. 1490 OUT (254),A 1500 CALL DEL1 1510 RET 1520 DEL1 LD DE,1500 ; Delay cca. 1.5 sec. 1530 D1L CALL DEL 1540 DEC DE 1550 LD A,D 1560 OR E 1570 JR NZ,D1L 1580 RET 1590 ZZ