;***************************************************************; ; ; ; EPROM.ASM ; ; ; ; LAST MODIFIED 01/24/82 ; ; ; ; EPROM PROGRAMMER SOFTWARE FOR RUNNING AN SSM - PB1 ; ; 2708/2716/2732 PROGRAMMER WITH CP/M UNDER DDT ; ; ; ; TO RUN THIS PROGRAM, TYPE: ; ; ; ;DDT EPROM.COM(CR) ; ; ; ; THE CONSOLE WILL RESPOND WITH: ; ; ; ;DDT VERS #.# ; ;NEXT PC ; ;#### 0100 ; ;- ; ; ; ; INSERT A HEX FILE TO BE PLACED IN EPROM BY ENTERING: ; ; ; ;IFILENAME.HEX(CR) ; ;R[BIAS](CR) ; ; ; ; (NOTE THAT BIAS WILL ALLOW THE ENTERED PROGRAM TO RESIDE ; ; WITHIN 100H TO 'START' AS REQUIRED EVEN THOUGH THE PROGRAM ; ; WAS ASSEMBLED FOR EXECUTION OUTSIDE THIS RANGE) ; ; ; ; TO START THE PROGRAM FROM DDT, ENTER EITHER 'G(START:)' ; ; OR 'G1100'. THE PROGRAM WILL ASK FOR EPROM TYPE SO AS ; ; TO SET THE PROPER SIZE (1K FOR 2708, 2K FOR 2716/2516, ; ; AND 4K FOR 2732) AND PROGRAMMING ROUTINE. ; ; ; ; SUPPORTED FUNCTIONS ARE COPY, PROGRAM AND VERIFY WHICH ARE ; ; SELF EXPLANATORY. THE AUTOMATIC SEQUENCE FOR PROGRAMMING ; ; AN EPROM IS TO FIRST CHECK FOR FULL ERASURE, THEN THE ; ; PROGRAM CYCLE, FOLLOWED BY THE VERIFY ROUTINE. ; ; (ANY FAILURE RESULTS IN AN ERROR MESSAGE AND A BELL ; ; SO AS TO NOT GO UNNOTICED.) ; ; ; ; AS CONTROL IS PASSED TO DDT AND YOU WISH TO ; ; RETURN TO THE PROGRAMMER, JUST ENTER 'G1100' AGAIN. ; ; ; ; EXIT FROM THE PROGRAM BY ENTERING A CONTROL C ; ; ; ;***************************************************************; ; <<<>>> D000 = PROM EQU 0D000H ;SELECTED LOCATION OF SOCKETS 00F0 = CPORT EQU 0F0H ; " " " CONTROL PORT 000D = CR EQU 0DH ;CARRIGE RETURN 000A = LF EQU 0AH ;LINE FEED 0007 = BELL EQU 7 ;***** DING 0024 = TERM EQU '$' 0038 = RST7 EQU 38H 0100 ORG 100H 0100 C30011 JMP START 1100 ORG 1100H ;4K WORKSPACE 1100 CD2911 START: CALL HELLO 1103 0D0A43502F DB CR,LF,'CP/M EPROM PROGRAMMER - VER 2.0',CR,LF,CR,LF,TERM 1129 D1 HELLO: POP D 112A CD7B14 CALL PRNMSG 112D CD5E11 TYPE: CALL TYPE1 1130 0D0A454E54 DB CR,LF,'ENTER EPROM TYPE (2732,2516,2716 OR 2708) ',TERM 115E D1 TYPE1: POP D 115F CD7B14 CALL PRNMSG 1162 CD0A14 CALL GETVAL 1165 E1 POP H 1166 110827 LXI D,2708H 1169 CD0414 CALL CPHL 116C CA8D11 JZ X2708 116F 111625 LXI D,2516H 1172 CD0414 CALL CPHL 1175 CA9F11 JZ X2716 1178 111627 LXI D,2716H 117B CD0414 CALL CPHL 117E CA9F11 JZ X2716 1181 113227 LXI D,2732H 1184 CD0414 CALL CPHL 1187 CAB111 JZ X2732 118A C32D11 JMP TYPE ;WRONG TYPE 118D 3E03 X2708: MVI A,3 ;PAGE COUNT - 1 118F 328014 STA SIZE 1192 3E01 MVI A,1 ;HARDWARE CODE 1194 328114 STA CODE 1197 3EFA MVI A,250 ;# OF PROGRAMMING CYCLES 1199 328214 STA NCYC 119C C30512 JMP DIRECT 119F 3E07 X2716: MVI A,7 ;PAGE COUNT - 1 11A1 328014 STA SIZE 11A4 3E02 MVI A,2 ;HARDWARE CODE 11A6 328114 STA CODE 11A9 3E01 MVI A,1 ;# OF PROGRAMMING CYCLES 11AB 328214 STA NCYC 11AE C30512 JMP DIRECT 11B1 3E0F X2732: MVI A,15 ;PAGE COUNT - 1 11B3 328014 STA SIZE 11B6 3E06 MVI A,6 ;HARDWARE CODE 11B8 328114 STA CODE 11BB 3E01 MVI A,1 ;# OF PROGRAMMING CYCLES 11BD 328214 STA NCYC 11C0 CD0112 CALL WARN 11C3 0D0A574152 DB CR,LF,'WARNING.."A" VERSION REQUIRES' 11E2 2041204C4F DB ' A LOWER PROGRAMMING VOLTAGE',CR,LF,TERM 1201 D1 WARN: POP D 1202 CD7B14 CALL PRNMSG 1205 CD3C12 DIRECT: CALL DIR1 1208 0D0A444F20 DB CR,LF,'DO YOU WISH (D)DT, (C)OPY, ' 1225 285029524F DB '(P)ROGRAM, (V)ERIFY ? ',TERM 123C D1 DIR1: POP D 123D CD7B14 CALL PRNMSG 1240 CD6A14 CALL CI 1243 FE43 CPI 'C' 1245 21BB12 LXI H,COPY 1248 CA6712 JZ DIR2 124B FE50 CPI 'P' 124D 21C112 LXI H,PROG 1250 CA6712 JZ DIR2 1253 FE56 CPI 'V' 1255 21B512 LXI H,VERIFY 1258 CA6712 JZ DIR2 125B FE44 CPI 'D' 125D C20512 JNZ DIRECT 1260 210512 LXI H,DIRECT 1263 E5 PUSH H ;SET RETURN ADDRESS 1264 C33800 JMP RST7 ;DDT BREAKPOINT ENTRY 1267 228314 DIR2: SHLD OPTION 126A 210001 ADDR: LXI H,100H 126D 228514 SHLD RAM 1270 3A00D0 GO: LDA PROM ;CLEAR PROGRAMMER 1273 CDAA12 CALL GO1 1276 0D0A504C41 DB CR,LF,'PLACE EPROM IN PROPER SOCKET ' 1295 414E442053 DB 'AND STRIKE ANY KEY',CR,LF,TERM 12AA D1 GO1: POP D 12AB CD7B14 CALL PRNMSG 12AE CD6A14 CALL CI 12B1 2A8314 LHLD OPTION 12B4 E9 PCHL 12B5 CD5913 VERIFY: CALL VERIF 12B8 C30512 JMP DIRECT 12BB CDD213 COPY: CALL CPY 12BE C30512 JMP DIRECT 12C1 CDD012 PROG: CALL ERACHK ;SEE IF EPROM IS ERASED 12C4 C20512 JNZ DIRECT ;ABORT IF NOT- 12C7 CD0513 CALL PRG ;NOW PROGRAM 12CA CD5913 CALL VERIF ;AND VERIFY 12CD C30512 JMP DIRECT ;THEN CHECK WHAT'S NEXT ;*********************** ; MAIN SUBROUTINES ;*********************** ; ERACHK ;ROUTINE TO TEST FOR COMPLETE ;ERASURE OF EPROM BEFORE PROG. 12D0 218014 ERACHK: LXI H,SIZE 12D3 4E MOV C,M 12D4 1100D0 LXI D,PROM 12D7 1A ERACH1: LDAX D ;GET BYTE FROM EPROM 12D8 13 INX D 12D9 FEFF CPI 0FFH ;TEST FOR ERASE PATTERN 12DB C2E512 JNZ NERASE 12DE 7A MOV A,D 12DF A1 ANA C 12E0 B3 ORA E ;CHECK FOR END 12E1 C2D712 JNZ ERACH1 12E4 C9 RET 12E5 F5 NERASE: PUSH PSW ;SAVE FLAGS 12E6 CDFF12 CALL NER1 12E9 0D0A455052 DB CR,LF,'EPROM NOT ERASED',CR,LF,BELL,TERM 12FF D1 NER1: POP D 1300 CD7B14 CALL PRNMSG 1303 F1 POP PSW 1304 C9 RET ; PRG ;ROUTINE TO PROGRAM ;AN EPROM 1305 CD1D13 PRG: CALL PGM 1308 0D0A303132 DB CR,LF,'0123456789ABCDEF',CR,LF,TERM 131D D1 PGM: POP D 131E CD7B14 CALL PRNMSG 1321 3A8114 LDA CODE ;SET HARDWARE FOR TYPE 1324 D3F0 OUT CPORT 1326 218214 LXI H,NCYC ;# OF PROG. CYCLES 1329 46 MOV B,M 132A 218014 LXI H,SIZE 132D 4E MOV C,M ;# OF PAGES -1 132E 1100D0 PRG1: LXI D,PROM 1331 2A8514 LHLD RAM ;PROGRAM THE EPROM 1334 7E PRG2: MOV A,M 1335 12 STAX D ;THIS STEP DOES IT 1336 13 INX D 1337 23 INX H 1338 7D MOV A,L ;CHECK FOR END OF PAGE 1339 FE00 CPI 0 133B CC4B13 CZ STAT 133E 7A MOV A,D 133F A1 ANA C 1340 B3 ORA E 1341 C23413 JNZ PRG2 ;GET NEXT ADDRESS 1344 05 DCR B 1345 C22E13 JNZ PRG1 ;LOOP FOR N CYCLES 1348 1B DCX D 1349 1A LDAX D ;RESET THE HARDWARE 134A C9 RET 134B E5 STAT: PUSH H 134C D5 PUSH D 134D C5 PUSH B 134E 1E2A MVI E,'*' 1350 0E02 MVI C,WRCON 1352 CD0500 CALL BDOS 1355 C1 POP B 1356 D1 POP D 1357 E1 POP H 1358 C9 RET ; VERIF ;ROUTINE TO VERIFY CONTENTS ;OF AN EPROM WITH MEMORY 1359 218014 VERIF: LXI H,SIZE 135C 4E MOV C,M 135D 1100D0 LXI D,PROM ;ADDRESS OF EPROM 1360 2A8514 LHLD RAM ;RAM TO BE COMPARED 1363 46 VERF1: MOV B,M ;GET ORIGINAL 1364 1A LDAX D ;THEN ROM 1365 13 INX D 1366 23 INX H 1367 B8 CMP B ;BETTER BE THE SAME. 1368 C2AD13 JNZ DIFF 136B 7A MOV A,D 136C A1 ANA C 136D B3 ORA E 136E C26313 JNZ VERF1 ;OK SO FAR, GET NEXT 1371 F5 PUSH PSW 1372 CDA713 CALL VERF2 1375 0D0A0D0A0D DB CR,LF,CR,LF,CR,LF,'<<<<<<<<<< EPROM ' 138C 5645524946 DB 'VERIFIED GOOD >>>>>>>>>>',CR,LF,TERM 13A7 D1 VERF2: POP D 13A8 CD7B14 CALL PRNMSG 13AB F1 POP PSW 13AC C9 RET 13AD F5 DIFF: PUSH PSW ;SAVE FLAGS 13AE CDCC13 CALL DIFF1 13B1 0D0A455052 DB CR,LF,'EPROM DOES NOT VERIFY',CR,LF,BELL,TERM 13CC D1 DIFF1: POP D 13CD CD7B14 CALL PRNMSG 13D0 F1 POP PSW 13D1 C9 RET ; CPY ;ROUTINE TO COPY AN EPROM ;FROM THE SOCKET TO RAM 13D2 218014 CPY: LXI H,SIZE 13D5 4E MOV C,M 13D6 1100D0 LXI D,PROM ;SOCKET ADDRESS OF MASTER 13D9 2A8514 LHLD RAM ;POINT TO TARGET RAM 13DC 1A CPY1: LDAX D ;GET ROM DATA 13DD 77 MOV M,A ;LOAD TO RAM 13DE 13 INX D 13DF 23 INX H 13E0 7A MOV A,D 13E1 A1 ANA C 13E2 B3 ORA E 13E3 C2DC13 JNZ CPY1 ;GO BACK FOR NEXT BYTE 13E6 CDFF13 CALL CPY2 13E9 0D0A0D0A43 DB CR,LF,CR,LF,'COPY COMPLETE',CR,LF,CR,LF,TERM 13FF D1 CPY2: POP D 1400 CD7B14 CALL PRNMSG 1403 C9 RET ;**************************** ; MISCELLANEOUS SUBROUTINES ;**************************** ; CPHL ;ROUTINE TO COMPARE HL VS DE 1404 7C CPHL: MOV A,H 1405 BA CMP D 1406 C0 RNZ 1407 7D MOV A,L 1408 BB CMP E 1409 C9 RET ; GETVAL ;ROUTINE TO LOAD A 16 BIT ;VALUE FROM A HEX INPUT 140A CD6A14 GETVAL: CALL CI ;GET KEYBOARD BYTE 140D 210000 LXI H,0 ;INITIALIZE HL 1410 47 GET1: MOV B,A ;SAVE KEYBOARD 1411 CD2D14 CALL NIBBLE ;CONVERT ASCII TO HEX 1414 DA2314 JC GET2 ;NOT LEGAL 1417 29 DAD H ;HL*16 1418 29 DAD H 1419 29 DAD H 141A 29 DAD H 141B B5 ORA L ;ADD IN NIBBLE 141C 6F MOV L,A 141D CD6A14 CALL CI ;GET NEXT KEYBOARD BYTE 1420 C31014 JMP GET1 1423 E3 GET2: XTHL ;STICK PRAMETER ON STACK 1424 E5 PUSH H ;REPLACE RETURN 1425 78 MOV A,B ;TEST CHARACTER 1426 CD3D14 CALL ECHK ;FOR JUNK 1429 C24914 JNZ ERROR ;JUNK OR ILLEGAL 142C C9 RET 142D D630 NIBBLE: SUI '0' 142F D8 RC 1430 FE17 CPI 'G'-'0' 1432 3F CMC 1433 D8 RC 1434 FE0A CPI 10 1436 3F CMC 1437 D0 RNC 1438 D607 SUI 'A'-'9'-1 143A FE0A CPI 10 143C C9 RET 143D FE20 ECHK: CPI ' ' 143F C8 RZ 1440 FE2C CPI ',' 1442 C8 RZ 1443 FE0D CPI CR 1445 37 STC 1446 C8 RZ 1447 3F CMC 1448 C9 RET 1449 E1 ERROR: POP H ;DUMP DATA 144A D1 POP D 144B E5 PUSH H 144C CD6314 CALL ER1 144F 0D0A454E54 DB CR,LF,'ENTER VALUE(CR)',CR,LF,TERM 1463 D1 ER1: POP D 1464 CD7B14 CALL PRNMSG 1467 C30A14 JMP GETVAL ; CONSOLE IN ;ROUTINE TO GET A CHARACTER ;THROUGH CP/M FROM THE CONSOLE 146A C5D5E5 CI: PUSH B! PUSH D! PUSH H 146D 0E01 MVI C,RDCON 146F CD0500 CALL BDOS 1472 E1D1C1 POP H! POP D! POP B 1475 FE03 CPI 3 ;CHECK FOR ^C 1477 CA0000 JZ BOOT ;ABORT 147A C9 RET ; PRNMSG ;ROUTINE TO PRINT A ;MESSAGE TO THE CONSOLE ;THROUGH CP/M 147B 0E09 PRNMSG: MVI C,PRINT 147D C30500 JMP BDOS ; VARIABLE STORAGE 1480 SIZE: DS 1 1481 CODE: DS 1 1482 NCYC: DS 1 1483 OPTION: DS 2 1485 RAM: DS 2 ; * * * * * * * * * * * * * * * * * * * * * * * * ; * ;BDOS/CBIOS EQUATES (VERSION 7) * ; * 0001 = RDCON EQU 1 ; * 0002 = WRCON EQU 2 ; * 0009 = PRINT EQU 9 ; * 000F = OPEN EQU 15 ;0FFH=NOT FOUND * 0010 = CLOSE EQU 16 ; " " * 0011 = SRCHF EQU 17 ; " " * 0012 = SRCHN EQU 18 ; " " * 0013 = ERASE EQU 19 ;NO RET CODE * 0013 = DELT EQU ERASE ; * 0014 = READ EQU 20 ;0=OK, 1=EOF * 0015 = WRITE EQU 21 ;0=OK, 1=ERR, 2=?, * ; 0FFH=NO DIR SPC * 0016 = MAKE EQU 22 ;0FFH=BAD * 0017 = REN EQU 23 ;0FFH=BAD * 001A = STDMA EQU 26 ; * ; * ; * 0000 = BOOT EQU 0 ;WARM BOOT * 0005 = BDOS EQU 5 ; * 005C = FCB EQU 5CH ; * 0030 = SYSSIZ EQU 48 ;SYSTEM SIZE * BE00 = CBIOS EQU SYSSIZ*1024-512 ; * BE1B = SELDSK EQU CBIOS+1BH ; * BE1E = SETTRK EQU SELDSK+3 ; * BE21 = SETSEC EQU SETTRK+3 ; * BE24 = SETDMA EQU SETSEC+3 ; * BE27 = RDSEC EQU SETDMA+3 ; * BE2A = WRSEC EQU RDSEC+3 ; * ; * * * * * * * * * * * * * * * * * * * * * * * * 1487 END