; CP/M ?.HEX file loader for ROM simulator. ; ; Jim Kearney April 5, 1983 ; modified to generate .ROM file also ROMSIZ EQU 32768 ; ROM size in bytes ROMSIM EQU 0E0H ; location of board (IO port start) BDOS EQU 0005H BOOT EQU 0 OPNFIL EQU 15 RDFIL EQU 20 CLSFIL EQU 16 PRINT EQU 9 CONOUT EQU 2 EOFC EQU 26 DMA EQU 080H DFLFCB EQU 005CH ORG 0100H ; TPA START: MVI C,PRINT LXI D,LOGON CALL BDOS LDA DFLFCB+1 CPI ' ' JZ USAGE LDA DFLFCB+9 CPI ' ' JNZ HASEXTN MVI A,'H' STA DFLFCB+9 MVI A,'E' STA DFLFCB+10 MVI A,'X' STA DFLFCB+11 HASEXTN: MVI C,OPNFIL LXI D,DFLFCB CALL BDOS INR A JZ NOTFND LHLD DFLFCB+1 SHLD OF+1 LHLD DFLFCB+3 SHLD OF+3 LHLD DFLFCB+5 SHLD OF+5 LHLD DFLFCB+7 SHLD OF+7 XRA A STA OF STA OF+12 STA OF+14 STA OF+15 STA OF+32 MVI A,'R' STA OF+9 MVI A,'O' STA OF+10 MVI A,'M' STA OF+11 MVI C,19 LXI D,OF CALL BDOS ; delete old version MVI C,22 LXI D,OF CALL BDOS INR A JZ FNOPEN LXI H,ROMI ; clear the rom image LXI D,ROMSIZ CLROM: MVI M,0FFH INX H DCX D MOV A,D ORA E JNZ CLROM LOOP: CALL DOLINE JMP LOOP DONE: OUT ROMSIM+3 CALL FLUSH MVI C,16 ; close output file LXI D,OF CALL BDOS POP B INR A JZ FNOPEN RET ; JMP BOOT DOLINE: CALL GETCH ; always a ':' CPI ':' JNZ BADFIL CALL GETHEX ; get length byte STA LEN ORA A JZ DONE CALL GETHEX ; get high address byte ANI (ROMSIZ-1) SHR 8 ; mask upper address STA ADDR+1 CALL GETHEX ; get low address byte STA ADDR CALL GETHEX ; skip junk byte READIT: CALL GETHEX STA RDATA CALL CHART ; send to output buffer LHLD ADDR ; send to SIM MOV A,L OUT ROMSIM+0 MOV A,H OUT ROMSIM+1 LDA RDATA OUT ROMSIM+2 INX H SHLD ADDR LDA LEN DCR A STA LEN JNZ READIT SKIP: CALL GETCH CPI 13 JNZ SKIP GETCH: LDA PTR ORA A JP NEXT MORE: MVI C,RDFIL LXI D,DFLFCB CALL BDOS CPI 0 JNZ BADFIL NEXT: LXI H,DMA MVI D,0 MOV E,A INR A STA PTR DAD D MOV A,M CPI EOFC JZ BADFIL PUSH PSW MOV E,A MVI C,CONOUT CALL BDOS POP PSW RET GETHEX: CALL GETNIB RLC RLC RLC RLC MOV B,A PUSH B CALL GETNIB POP B ORA B RET GETNIB: CALL GETCH SUI '0' JM BADFIL CPI 10 JM FIRST SUI 7 FIRST: RET FLUSH: LXI D,ROMI MVI B,(ROMSIZ/128) FLLP: PUSH D PUSH B MVI C,26 ; set DMA address CALL BDOS MVI C,2 MVI E,'*' CALL BDOS MVI C,21 LXI D,OF ; write sector CALL BDOS POP B POP H LXI D,128 ; next block DAD D PUSH H POP D DCR B JNZ FLLP RET CHART: LHLD ADDR LXI D,ROMI DAD D LDA RDATA MOV M,A RET FNOPEN: MVI C,PRINT LXI D,NOMSG JMP BDOS NOTFND: MVI C,PRINT LXI D,NFMSG JMP BDOS BADFIL: MVI C,PRINT LXI D,BFMSG CALL BDOS JMP BOOT USAGE MVI C,PRINT LXI D,USEMSG JMP BDOS PTR DB 128 LEN DB 0 ADDR DW 0 RDATA DB 0 OF DS 50 ROMI DS ROMSIZ LOGON DB 13,10,10 DB 'CP/M .HEX file --> ROM simulator loader jdk 4/5/83' DB 13,10,'8K ROM VERSION!!!' DB 13,10,10,'$' NFMSG DB 'File not found',13,10,'$' NOMSG DB 'Error making .ROM file',13,10,'$' BFMSG DB 13,10,'Bad format in file',13,10,'$' USEMSG DB 'Usage: LDR ',13,10 DB ' is an Intel Hex format file.',13,10 DB ' The .HEX suffix is not needed.',13,10 DB '$'