CR EQU 13 LF EQU 10 TAB EQU 9 ; CDOS EQU 5 ; L103 DW 100H L105 DW 100H DB 'Copyright (c) 1977, 1980 Cromemco, Inc. ' ; START LD SP,STACK LD DE,SIGNON LD C,9 ; PRINT BUFFER CALL CDOS LD A,(5DH) SUB A,' ' JR Z,NOFLP LD A,1 NOFLP LD (FLGS),A LD HL,81H LD BC,7FH CALL CHKINL LD A,(FLGS) BIT 0,A JR Z,NIBUFF LD DE,SBUFF LDIR NIBUFF BIT 1,A JR Z,MOVCOD LD DE,RELFILE CALL OPEN LD HL,ASPCE NXTREL CALL GET JR C,NOCODE LD (HL),A INC HL JR NXTREL ; MOVCOD LD BC,0CEH LD HL,100H AND A,A SBC HL,BC PUSH HL LD DE,ASPCE LD HL,MCODE LDIR POP BC LD A,0 CALL ZAP EX DE,HL NOCODE EX DE,HL LD BC,ASPCE LD HL,(L103) LD L,0 LD (L103),HL ADD HL,BC AND A,A SBC HL,DE JP C,OPERR JR Z,A1READ LD C,L LD B,H LD A,0 CALL ZAP A1READ LD DE,A1FILE CALL OPEN LD HL,ASPCE LD DE,(L103) ADD HL,DE GETNXT CALL GET JR C,A2READ LD (HL),A INC HL JR GETNXT ; A2READ LD DE,A2FILE CALL OPEN LD HL,100H LD BC,(L105) LD C,0 LD (L105),BC ADD HL,BC LD C,L LD B,H CALL SKPNBYT LD HL,ASPCE LD DE,(L103) ADD HL,DE LD E,(HL) INC HL LD D,(HL) EX DE,HL AND A,A SBC HL,BC EX DE,HL LD (HL),D DEC HL LD (HL),E PUSH DE LD HL,(L103) LD DE,(L105) LD BC,ASPCE ADD HL,DE LD A,H INC A LD (SBITS),A ADD HL,BC EX DE,HL POP HL LD C,L LD B,H ADD HL,DE EX DE,HL DEC DE NEXTDE INC DE LD A,8 NEXTA PUSH AF LD A,B OR A,C JR Z,DOLAST DEC BC CALL GET JR C,DOLAST CP A,(HL) JR Z,NOBIT PUSH BC LD B,A LD A,(SBITS) LD C,A LD A,B SUB A,C POP BC LD (HL),A SCF NOBIT LD A,(DE) RLA LD (DE),A INC HL POP AF DEC A JR Z,NEXTDE JR NEXTA ; DOLAST POP AF CP A,8 JR Z,NOLAST LD B,A LD A,(DE) NXTBIT AND A,A RLA DJNZ NXTBIT LD (DE),A INC DE NOLAST PUSH DE LD DE,OPFILE CALL OPENO POP DE LD HL,ASPCE PUTNXT LD A,(HL) CALL PUT INC HL CALL CPHLDE JR C,PUTNXT CALL CLOSE LD DE,EOJMSG JR EXIT ; ; Main prog exits here ; OPERR LD DE,OPERRM EXIT LD C,9 ; PRINT BUFFER CALL CDOS ; Exit to O/S JP 0 ; ; Open File ; OPEN LD A,80H LD (IPCNT),A LD A,(DE) INC DE LD L,A LD A,(DE) INC DE LD H,A PUSH HL CALL GETFN CALL CHK.COM LD DE,FCBDK LD C,0FH ; OPEN DISK FILE CALL CDOS CP A,0FFH POP DE RET NZ LD C,9 ; PRINT BUFFER CALL CDOS LD DE,FNFMSG JR EXIT ; ; Open Output File ; OPENO CALL GETFN CALL CHK.COM LD DE,FCBDK LD C,13H ; DELETE FILE CALL CDOS LD DE,FCBDK LD C,16H ; CREATE FILE CALL CDOS CP A,0FFH JR Z,CRERR LD DE,FCBDK LD C,0FH ; OPEN DISK FILE CALL CDOS RET ; CRERR LD DE,CRERRM JR EXIT ; ;************************* ; ; Get next char in A' ; GET EXX LD A,(IPCNT) CP A,80H JR NZ,GET1 LD DE,FCBDK LD C,14H ; READ NEXT RECORD CALL CDOS DEC A SCF JR Z,GET2 SUB A,A GET1 INC A LD (IPCNT),A LD HL,7FH CALL ADDHL LD A,(HL) SCF CCF GET2 EXX RET ; SKPNBYT LD DE,IPERRM SKY1 CALL GET JP C,EXIT DEC HL LD A,H OR A,L JR NZ,SKY1 RET ; ;************************** ; ; Put the A reg in buffer and write to file if full ; PUT EXX PUSH AF LD A,(OPCNT) LD HL,80H CALL ADDHL POP AF LD (HL),A LD A,(OPCNT) INC A LD (OPCNT),A SUB A,80H JR NZ,PUTOK LD (OPCNT),A LD DE,FCBDK LD C,15H ; WRITE NEXT RECORD CALL CDOS AND A,A JR NZ,PUTDR PUTOK EXX RET ; PUTDR INC A JR NZ,PUTDS LD DE,DRERRM JR PUTEX ; PUTDS SUB A,3 JR NZ,PUTWR LD DE,DSERRM JR PUTEX ; PUTWR LD DE,WRERRM PUTEX JP EXIT ; ;************************* ; GETFN LD HL,($SBUFF) LD A,(FLGS) BIT 0,A JR NZ,GFN1 LD C,9 ; PRINT BUFFER CALL CDOS LD DE,FNBFLM LD C,0AH ; INPUT BUFFERED LINE CALL CDOS LD HL,FNBUFF GFN1 CALL SKPB LD DE,FCBDK LD C,86H ; FORMAT NAME TO FCB CALL CDOS LD ($SBUFF),HL RET ; CHK.COM LD HL,FCBFT LD A,(HL) CP A,' ' RET NZ LD (HL),'C' INC HL LD (HL),'O' INC HL LD (HL),'M' INC HL RET ; ; Pad buffer with zeroes and close file ; CLOSE LD A,(OPCNT) AND A,A JR Z,DOCLOSE LD A,0 CALL PUT JR CLOSE ; DOCLOSE LD DE,FCBDK LD C,10H ; CLOSE FILE CALL CDOS INC A RET NZ LD DE,CLERRM JP EXIT ; ;************************* ; CHKINL PUSH BC PUSH HL IPOK CALL SKPB AND A,A JR Z,OKRET INC HL DEC BC CP A,'/' JR NZ,IPOK SLASH CALL CKASKPB AND A,A JR Z,OKRET CP A,'R' JR NZ,NOAR LD A,(FLGS) SET 1,A LD (FLGS),A NOAR INC HL DEC BC CALL CKASKPB CP A,'0' JR C,IPOK JR SLASH ; OKRET POP HL POP BC RET ; CKASKPB LD A,(HL) CP A,' ' JR Z,CKBFND CP A,TAB RET NZ CKBFND INC HL DEC BC POP AF ;Ret addr POP AF ;HL POP AF ;BC ; SKPB LD A,(HL) CP A,' ' JR Z,BFND CP A,TAB RET NZ BFND INC HL DEC BC JR SKPB ; ;************************* ; ADDHL ADD A,L LD L,A RET NC INC H RET ; CPHLDE PUSH HL AND A,A SBC HL,DE POP HL RET ; ; Zap (DE) For BC bytes with (A) ; ZAP LD H,D LD L,E LD (HL),A INC DE DEC BC LDIR RET ; ; CODE DUMPED IN .COM FILE ; $MEMRY EQU 200H USIGNON EQU 202H UPROG EQU 300H CORG EQU $-100H ; MCODE JP CSTART-CORG ;03D0 ; DB 'Copyright (c) 1978, 1979 Cromemco, Inc. All rights reserved. 00.03 ' ; CSTART LD SP,CSTART-CORG LD C,9 LD DE,USIGNON CALL CDOS LD HL,(6) PUSH HL LD BC,($MEMRY) AND A,A SBC HL,BC LD L,0 LD (6),HL PUSH HL PUSH BC LD HL,UPROG LD E,L LD D,H ADD HL,BC EX DE,HL DEC DE PUSH DE LOOP8 INC DE LD A,8 PUSH AF LD A,(DE) LOOP RLA JR NC,NOREL EX AF,AF' LD A,(7) ADD A,(HL) LD (HL),A EX AF,AF' NOREL EX AF,AF' INC HL DEC BC LD A,B OR A,C JR Z,MOVEC POP AF DEC A JR Z,LOOP8 PUSH AF EX AF,AF' JR LOOP ; MOVEC POP AF EXX POP DE POP BC POP HL PUSH HL ADD HL,BC DEC HL EX DE,HL LDDR POP DE POP HL PUSH DE LD BC,9 LDIR EX DE,HL EXX INC DE POP HL AND A,A SBC HL,DE JR NC,BIG2 LD DE,(6) BIG2 LD HL,1CAH EX DE,HL LD BC,4 AND A,A SBC HL,BC PUSH HL EX DE,HL LDIR POP HL PUSH HL LD DE,101H AND A,A SBC HL,DE LD C,L LD B,H LD HL,100H SUB A,A LD (HL),A RET ; LDIR EXX JP (HL) ; SIGNON DB 'Build Self-Relocating Program with Bitmap' DB ' version 01.00',CR,LF,'$' ; RELFILE DW RELFER DB CR,LF,'Relocating loader name? $' A1FILE DW A1FER DB CR,LF,'Absolute 100H input file name? $' A2FILE DW A2FER DB CR,LF,'Absolute 200H input file name? $' OPFILE DB CR,LF,'Output file name? $' ; EOJMSG DB CR,LF,'*** End of job ***',CR,LF,'$' ; RELFER DB CR,LF,'Relocating loader$' A1FER DB CR,LF,'Absolute 100H$' A2FER DB CR,LF,'Absolute 200H$' FNFMSG DB ' file not found',CR,LF,'$' ; OPERRM DB CR,LF,'Relocating loader file too large',CR,LF,'$' IPERRM DB CR,LF,'Absolute 200H input file incorrect',CR,LF,'$' CRERRM DB CR,LF,'Cannot create output file',CR,LF,'$' DRERRM DB CR,LF,'No directory space',CR,LF,'$' DSERRM DB CR,LF,'Out of disk space',CR,LF,'$' WRERRM DB CR,LF,'Output file write error',CR,LF,'$' CLERRM DB CR,LF,'Cannot close output file',CR,LF,'$' ; $SBUFF DW SBUFF OPCNT DB 0 ;OUTPUT BUFFER CHAR COUNT ; FNBFLM DB 14 ;Filename buffer DB 0 FNBUFF DS 15 ; FLGS DS 1 SBITS DS 1 IPCNT DS 1 ;Input char count SBUFF DS 80H ; FCBDK DS 1 ;DRIVE 0716 FCBFN DS 8 ;FILENAME 0717 FCBFT DB ' ' ;Ext 071F FCBEX DB 0 DS 2 FCBRC DS 1 FCBMP DS 16 FCBNR DS 1 ; STACKB DS 80H ; STACK RESIDES HERE STACK EQU $ ; 07B7 ASPCE EQU $ ;USED FOR THE PROGRAM AND MAP ; END START ;