; ;**************************************************************** ;* * ;* * ;* DRIVER UTILITY FOR SD SYSTEMS * ;* PROM-100 EPROM PROGRAMMER * ;* 2708 VERSION * ;* * ;* * ;**************************************************************** ; ; ; Modified by : Bill Bolton ; Software Tools ; P.O. Box 80 ; Newport Beach ; NSW, 2106 ; ; Dec 29, 1979 Initial bugs removed ; ; Jan 3, 1980 Comments added and minor improvements ; ; Jan 4, 1980 2716 file created from 2708 file ; ; Jan 16, 1980 First PROM address not programmed debug ; ; Jan 22, 1982 8080 version created and SPEED equate added ; plus other minor internal changes ; ; Jan 25, 1982 8080 2708 version created from 2716 version ; WBOOT EQU 0 BDOS EQU 00005H ;BDOS ENTRY ADDRESS FCB EQU 0005CH ;DEFAULT FILE CONTROL BLOCK OPEN EQU 15 SETDMA EQU 26 ATTRIB EQU 471BH ;ADM VIDEO ATTRIBUTE LEAD-IN DATA EQU 068H ;PROM-100 DATA PORT LADD EQU 069H ;PROM-100 LOW ADDRESS PORT HACTL EQU 06AH ;PROM-100 CONTROL PORT SPEED EQU 6 ;PROCESSOR SPEED IN MHZ ACR EQU 0DH ;ASCII CARRAIGE RETURN ALF EQU 0AH ;ASCII LINE FEED ; TITLE 'PROM16 - 8080 VERSION FOR CP/M' ; MACLIB MACRO3 ;Use Software Tools special macros ; ORG 0100H ; ; LXI SP,SPVAL LXI H,MESG1 ;SIGN ON MESSAGE CALL PTXT ;PRINT IT MVI A,080H ;INIT BUFFER COUNT TO FULL STA BUFCNT ;STORE IT XRA A ;RESET A TO 0 STA OPENFL ;RESET FILE OPEN FLAG INITIAL: LXI SP,SPVAL XRA A OUT HACTL ;INIT PROM-100 BOARD CALL CRLF LXI H,MESG2 ;READY TO LOAD MESSAGE CALL PTXT LXI H,0 ;RESET HL SHLD COUNT ;RESET COUNT CALL YORN ;YES OR NO? JNC READ2 ;NO, GO ASK IF A PROM ;IS TO BE READ ; FILEOPN: CALL CRLF LDA OPENFL ;GET FILE OPEN FLAG ORA A ;IS FILE OPEN? JNZ FILER ;YES, CONTINUE TO READ IT PUSH H PUSH D PUSH B MVI C,OPEN ;OPEN FILE LXI D,FCB ;FCB ADDRESS CALL BDOS POP B POP D POP H CPI 0FFH ;SUCESSFUL OPEN? JNZ FILER ;YES, GO READ IT LXI H,MESG7 ;NO, FILE NOT FOUND CALL PTXT JMP EXIT ;BACK TO CP/M ; FILER: PUSH D PUSH B MVI C,SETDMA ;SET DISK BUFFER LXI D,00080H ;BUFFER ADDRESS CALL BDOS POP B POP D LXI H,MESG3 ;LOAD & BYTES MESSAGE CALL PTXT CALL SCAN$OP ;GET OPERANDS FROM KEYBOARD LDA NXCHAR ;GET FINAL CHARACTER CPI '.' ;IS IT ENTRY ABORT CHAR? JZ FILEOPN ;YES, REPROCESS THE LOOP LXI H,MESG9 ;NO, LOAD START MESSAGE CALL PTXT LHLD OPR1 ;POINT TO FIRST OPERAND CALL PADDR ;PRINT IT IN HEX CALL CRLF CALL HXREC ;GET START OF NEXT HEX RECORD PUSH H LDED OPR1 ;GET MEM START ADDRESS LDA OPCNT ;GET NUMBER OF OPS ENTERED ANA A ;DETERMINE IF ZERO? JZ FILER1 ;YES, LOAD FILE AT OWN ADDRESS DSUB ;FORM LOAD OFFSET INTO MEMORY PUSH H ;COPY OFFSET POP D ; INTO DE FILER1: POP H ;GET FILE START ADDRESS SDED OFFSET ;(OFFSET = 0 IF NO OPERAND) JMP FILER3 ; FILER2: CALL HXREC FILER3: LDED OFFSET ;GET LOAD OFFSET ORA A DSUB ;FORM LOAD ADDRESS LOADLP: CALL HEXBIN ;GET A BYTE MOV M,A ;PUT INTO MEMORY SHLD LDPOINT ;SAVE LOAD ADDRESS POINTER INX H ;BUMP THE LOAD ADDRESS PUSH H LHLD COUNT INX H ;BUMP THE LOAD COUNT SHLD COUNT POP H DCX B ;BC < NUMBER OF BYTES IN HEX RECORD MOV A,B ORA C JNZ LOADLP CALL HEXBIN ;FETCH HEX RECORD CHECKSUM XRA A ;RESET A ADD C ;CHECKSUM ERROR? JZ ENDCHK ;NO, CHECK FOR END PUSH H ;YES, SAVE THE ADDRESS LXI H,MESG10 ;CHECKSUM ERROR MESSAGE CALL PTXT POP H ;RESTORE THE ADDRESS CALL PADDR ;PRINT ERROR ADDRESS ENDCHK: LHLD COUNT ;COUNT OF BYTES LOADED LBCD OPR2 ;NUMBER OF BYTES REQUIRED DCX H DCX B ANA A BSUB ;MORE BYTES TO LOAD? JC FILER2 ;YES, GET THEM ; LDEND: LXI H,MESG11 ;LOAD END ADDR MESSAGE CALL PTXT LHLD LDPOINT ;GET LOAD END ADDRESS CALL PADDR ;PRINT HEX ADDRESS ; PPG10A: CALL CRLF LXI H,MESG4 ;READY TO PROG MESSAGE CALL PTXT CALL YORN ;YES OR NO? JNC EXIT ;NO, EXIT ; PPG11: CALL CRLF LXI H,MESG5 ;YES, MEM START ETC. MESSAGE CALL PTXT CALL SCAN$OP ;GET OPERANDS LDA NXCHAR CPI '.' ;ENTRY ABORT CHARACTER? JZ PPG11 ;YES, REPROCESS LOOP JMP PROG ;NO, GO PROGRAM EPROM ; ; ; LOOKS FOR START OF A HEX RECORD AND RETURNS ; FIRST DATA BYTE IN A, BYTE COUNT IN B & ; RECORD LOAD ADDRESS IN HL ; ; HXREC: CALL BUFFR ;GET AN ASCII BYTE CPI ':' ;IS IT HEX RECORD START? JNZ HXREC ;NO, KEEP LOOKING XRA A ;RESET A MOV C,A ;RESET C CALL HEXBIN ;GET A 'HEX' BYTE ANA A ;IS IT 0? JZ HXREC1 ;YES, MUST BE AT END MOV B,A ;NO, # BYTES IN HEX RECORD CALL HEXBIN MOV H,A ;HI BYTE OF LOAD CALL HEXBIN MOV L,A ;LO BYTE OF LOAD CALL HEXBIN ;GET FIRST DATA BYTE RET ; HXREC1: POP PSW JMP LDEND ; ; ; DETERMINE IF Y, N OR ABORT ANSWER ; ; YORN: CALL ECHO CPI '.' JZ EXIT ORA A CPI 'N' RZ CPI 'Y' JNZ YORN STC RET ; ; ; CONSOLE STATUS, INPUT AND OUTPUT ; ; CONSTAT: PUSH H PUSH D PUSH B MVI C,11 CALL BDOS POP B POP D POP H ORA A RET ; CONIN: PUSH H PUSH D PUSH B MVI C,1 CALL BDOS POP B POP D POP H MOV C,A ;NEED A & C TO RETURN CHAR RET ; CONOUT: PUSH H PUSH D PUSH B MOV E,C MVI C,2 CALL BDOS POP B POP D POP H MOV C,E ;NEED C TO RETURN CHAR ;SENT RET ; ; ; CLOSE FILE AND EXIT BACK TO CP/M ; ; EXIT: XRA A OUT HACTL CALL CRLF LDA OPENFL ORA A JZ WBOOT MVI C,16 LXI D,FCB CALL BDOS JMP WBOOT ; ; ; PRINT VALUE IN ACCUMULATOR AS AN ASCII 'HEX' VALUE ; ; PADDR: MOV A,H ;HI BYTE OF ADDRESS CALL PACC ;PRINT A AS HEX VALUE MOV A,L ;LO BYTE OF ADDRESS JMP PASP ;PRINT