;CMDFIL/ASM - 08/16/82 TITLE '' DOS6 EQU -1 NOTTAPE EQU -1 NOTDISK EQU .NOT.NOTTAPE LDOS EQU -1 EDAS EQU 0 SIMUTEK EQU 0 MOD1 EQU 0 MOD3 EQU .NOT.MOD1 EXPAND DEFL -1 IF EDAS!SIMUTEK!LDOS EXPAND DEFL 0 ENDIF ;*=*=* ; COMMAND FILE UTILITY PROGRAM ; ; Copyright (C) 1979 ; MISOSYS ; 5904 Edgehill Drive ; Alexandria, VA. 22303 ;*=*=* ; ; Change Log ; ; 12-11-79 >ADDED OFFSET DRIVERS ; 12-11-79 >ADDED YESNO ROUTINE ; 12-12-79 >ADDED SUPPRESSION OF KBD DBNC DRVR OFFSET ; 12-15-79 >RECYCLE TAPE OUTPUT TO ITSELF ON ANOTHER ; 12-15-79 >SHIFTED INIT OF LO & HI TO AFTER 'NOPRT' ; 12-20-79 >ADD BYPASS TO OUTPUT LO/HI IF INPUT FROM TAPE ; 12-21-79 >ADDED PRINT & DSPLY ROUTINES FOR NON-DOS USER ; 12-22-79 >ADDED LO/HI DETECTION FOR TAPE INPUT ; 12-25-79 >ADDED PATCH TO 'SYSTEM' DOS HOOK AT 41E2H ; 12-27-79 >CORRECTED TRAADR WHEN OFFSET OR USER CHANGE ; 07-09-80 >Converted messages to lower case ; 07-26-80 >Added test to uery, added default CMD ; >added FSPEC & FEXT, suppresses offset ; >if blkadr < 4200H ; 09-21-80 >added wrret after cas prompt ; 09-26-80 >added offset restriction option ; 09-28-80 -> added routine to read VTOS ISAM file ; 01/19/81 -> added EOF correction in close & modified ; for LDOS directory function ; 02/01/81 -> Corrected offset ORG if keyboard debounce ; 02/07/81 -> corrected EOF & offset e/w kbd dbnc ; 06/15/81 -> Model III conversion ; 06/18/81 -> Modified Query for /EXT option ; 09/16/81 - Added CMDFILEA/FX3 ; 10/16/81 - Updated to latest - couldn't find deck ; & added PATCH1 to correct offsetting if <4200 ; 10/26/81 - Convert tape FILNAM to U/C ; 10-30-81 - Added patch2 for l/c -> U/C tape filename ; 11/04/81 - Adapted to one version, improved disk driver ; & altered YESNO to reprompt ; 12/11/81 - Corrected TAPERD clobbering HL memory ptr ; 01/14/82 - Corrected read of SYS6/SYS7 ; 01/27/82 - Corrected EOF+1 due to BUFPTR handling ; 08/15/82 - Corrected CHKMEM to RET NZ ;***** LF EQU 10 CR EQU 13 CTOFF EQU 01F8H CTON EQU 0212H CSTAR EQU 022CH RDBYT EQU 0235H WRBYT EQU 0264H WRLDR EQU 0287H RDLDR EQU 0296H TAPADR EQU 0314H SETCAS EQU 3042H SELECT EQU 37E1H KDCB$ EQU 4015H DDCB$ EQU 401DH CURSOR$ EQU 4020H PDCB$ EQU 4025H @EXIT EQU 402DH LVLFLG EQU 402FH BASIC1 EQU 6CCH BASIC3 EQU 1A19H HIGH1 EQU 4049H HIGH3 EQU 4411H FEXT1 EQU 4473H FEXT3 EQU 444BH KIADR1 EQU 3E3H KIADR3 EQU 3024H ; CKDRV1 EQU 44B8H CKDRV3 EQU 4209H DODIR1 EQU 4463H ;LDOS Model I DODIR3 EQU 4419H ;Model III only ; PAGE ; IF NOTDISK ORG 41E2H JP 5400H ENDIF ; IF DOS6 *GET SVCMAC ORG 2600H BUFFER$ DS 256 STACK DS 256 START LD SP,$ LD HL,0 LD B,L @@HIGH$ LD (HIGHEST+1),HL LD HL,RST24 LD A,0C3H LD (24),A LD (25),HL ELSE *GET SVCMAC13 ORG 5200H BUFFER$ DS 256 STACK DS 256 START LD SP,$ LD A,(125H) ;Ck Mod I or III CP 'I' ;Is it a III? JR Z,MODEL3 ;Go if Model III LD A,3 LD (CASMSG+24),A ;Strip from prompt LD HL,@KEY LD (PRMPT+1),HL ;Chg SETCAS to get KEY LD HL,HIGH1 ;Reset HIGH$ pointer LD (HIGHEST+1),HL LD HL,FEXT1 ;Reset FEXT call LD (FEXT+1),HL ; IF .NOT.LDOS LD HL,BASIC1 ;Reset BASIX exit vector LD (BASIC+1),HL ENDIF ; LD HL,KIADR1 ;Reset debounce inhibit LD (KIHOOK),HL ; IF LDOS LD HL,DODIR1 LD (DODIR+1),HL LD HL,CKDRV1 LD (NOEXT+1),HL ENDIF ; MODEL3 ENDIF LD HL,HELLO$ CALL DSPLY XOR A LD (PRTFLG),A LD HL,PRTREQ CALL YESNO JR C,NOPRT LD (PRTFLG),A NOPRT LD HL,MEMBUF+3 LD (MEMPTR),HL XOR A LD (HLDFLG),A ;Zero DBNC hold flag LD H,A LD L,A LD (OFFSET),HL LD (HIADR),HL ;Init hi and lo DEC HL LD (LOADR),HL ; BEGIN LD SP,START LD HL,INPMPT CALL GETARG JR Z,OUTPUT LD A,(HL) AND 5FH ;Strip lower case ; IF EXPAND!LDOS CP 'Q' JP Z,QUERY ENDIF ; LD HL,(MEMPTR) DEC HL ;Backup over TRAADR DEC HL DEC HL DEC HL CP 'C' JR Z,START CP 'E' JP Z,DOS IF .NOT.DOS6 CP 'T' ;Tape? JR Z,TAPE ENDIF CP 'D' ;Disk? JR NZ,BEGIN DISK PUSH HL LD HL,FIL1PR CALL PROMPT CALL OPNFIL POP HL CALL RDPROG INPFIN LD (MEMPTR),HL ;Update where we left off JR BEGIN IF .NOT.DOS6 TAPE CALL RDTAPE JR INPFIN ENDIF ;***** ; Routine to process output request ;***** OUTPUT LD HL,MEMBUF+3 ;Ck for file input LD DE,(MEMPTR) RST 24 JR NZ,OUTA LD HL,NOINP CALL DSPLY JP NOPRT OUTA LD HL,LOADR+1 ;Insert load address LD DE,PGML1 ;Into loader message CALL WRBLK LD HL,HIADR+1 LD DE,PGML2 CALL WRBLK LD HL,PGMLOD CALL DSPLY LD HL,MOVREQ ;Offset file? CALL GETARG JP Z,OUT0 ;Don't add loader ;***** ; Routine to add offset loader ;***** EX DE,HL ;Pt to 1st char LD A,(DE) CALL GETVAL JR C,OUTA PUSH HL LD HL,41FFH ;ck for <4200H LD DE,(LOADR) RST 24 JR C,NOPROB ;not below LOCK1 LD HL,LOMSG ;user want to restrict? CALL PATCH1 JR Z,NOPROB ;no, if no entry EX DE,HL LD A,(DE) ;grab 1st byte CALL GETVAL ;grab & convert JR C,LOCK1 ;again if bad char LD (LOADR),HL ;stuff lower limit EX DE,HL NOPROB POP HL ;calc offset XOR A SBC HL,DE LD (OFFSET),HL RL H ;Test offset for +,- JR C,NEGMOV LD A,0B0H ;Init for LDIR LD (LDMOV+1),A RR H EX DE,HL ;Offset -> DE LD HL,(LOADR) LD (LDDE+1),HL ADD HL,DE LD (LDHL+1),HL JR ALLMOV NEGMOV LD A,0B8H ;Init for LDDR LD (LDMOV+1),A RR H EX DE,HL ;Offset -> DE LD HL,(HIADR) LD (LDDE+1),HL ADD HL,DE LD (LDHL+1),HL ALLMOV LD HL,(TRAADR) LD (LDJP+1),HL LD HL,(HIADR) ;Ins new xfer addr INC HL LD (LDADR),HL PUSH HL ;Save for xfer addr upd LD DE,(LOADR) ;Calc move length XOR A SBC HL,DE LD (LDBC+1),HL LD HL,DVRMSG ;User want offset driver? CALL YESNO POP HL ;Pop xfer addr upd JR C,OUT0 ;Jump if not LD DE,(OFFSET) ;Add offset here ADD HL,DE ;This is a traadr LD (TRAADR),HL ;Pt TRAADR to routine LD HL,DIMSG ;Interrupt req? CALL YESNO JR NC,PUTDI XOR A DEFB 1 ;Ignore next 2 bytes PUTDI LD A,0F3H ;Ins DI LD (DINOP),A LD HL,KBCREQ ;Keep debounce? CALL YESNO LD HL,(MEMPTR) ;Reset memory pointer DEC HL DEC HL DEC HL DEC HL JR C,LVDBNC LD DE,BNCOFF ;Move stripper LD B,6 BNCL1 LD A,(DE) PUSH DE CALL CHKMEM POP DE INC DE DJNZ BNCL1 LVDBNC LD DE,LOADER ;Move loader LD B,19 BNCL2 LD A,(DE) PUSH DE CALL CHKMEM POP DE INC DE DJNZ BNCL2 CALL PUTTRA LD (MEMPTR),HL ;Reset pointer JR SAMTRA ;User can't update TRAADR OUT0 LD HL,TRAADR+1 LD DE,NEWT1 CALL WRBLK OUT1 LD HL,NEWTRA CALL GETARG JR Z,SAMTRA EX DE,HL LD A,(DE) CALL GETVAL JR C,OUT1 EX DE,HL ;New TRA -> DE LD HL,(MEMPTR) DEC HL LD (HL),E INC HL LD (HL),D SAMTRA LD HL,OUTDT CALL GETARG JP Z,START LD A,(HL) AND 5FH ;Strip LC CP 'E' JP Z,DOS CP 'C' JP Z,START IF .NOT.DOS6 CP 'T' ;Tape? JP Z,TAPOUT ENDIF CP 'D' ;Disk? JR NZ,SAMTRA ;***** ; Routine to write command files ;***** LD HL,OUTSPC CALL PROMPT LD HL,BUFFER$ LD (BUFPTR),HL LD B,0 @@INIT JP NZ,GOTERR LD HL,MEMBUF-1 WRLP INC HL LD A,(HL) CP 1 JR Z,DSKBLK CP 2 JR Z,DSKTRA CP 3 JR Z,SPCL1 CALL WRDBYT ;Write comment header INC HL LD A,(HL) LD B,A CALL WRDBYT ;Write comment length WRLP1 INC HL LD A,(HL) CALL WRDBYT DJNZ WRLP1 JR WRLP SPCL1 LD A,1 ;Turn off the LD (HLDFLG),A ; block offset DSKBLK CALL WRDBYT ;Write block header INC HL LD A,(HL) LD B,A CALL WRDBYT ;Write block length CALL CHKADR LD A,E PUSH DE CALL WRDBYT POP DE LD A,D CALL WRDBYT DEC B ;Reduce length for addr DEC B WRLP2 INC HL LD A,(HL) CALL WRDBYT DJNZ WRLP2 JR WRLP DSKTRA LD B,4 CALL WRDBYT INC HL LD A,(HL) DJNZ DSKTRA+2 CLSFIL LD A,(BUFPTR) ;P/u eof byte OR A ;Write last buffer? LD (DCB+8),A ;Stuff EOF offset CALL NZ,LASTWR ;Write if BUFPTR <> 0 CALL RWEND LD HL,FINMSG CALL YESNO JP NC,SAMTRA JP NOPRT WRDBYT PUSH HL CALL DISKWR POP HL RET ;***** ; Routine to check load or xfer addr for offset ;***** CHKADR INC HL LD E,(HL) ;Get load address into DE INC HL LD D,(HL) PUSH HL LD HL,HLDFLG ;Test hold flag INC (HL) ; for suppression DEC (HL) ; of offset JR Z,DOOFF DEC (HL) ;Turn off the flag JR NOTMVD DOOFF LD HL,(LOADR) ;Don't offset 3 LD C,A LD B,0 LD A,(HL) CP '/' JR NZ,NOEXT LD (HL),0 ;Clear for next query INC HL ;Bump to EXT LD B,2 NOEXT @@CKDRV ;Drive available? JR NZ,BAD DODIR @@DODIR JP BEGIN ENDIF ; ;***** ; Routine to convert input (hex) to 2-byte value ;***** GETVAL LD HL,0 GETV1 CP 'a' ;Cvrt to U/C if needed JR C,$+4 RES 5,A CALL CVB RET C ADD HL,HL ADD HL,HL ADD HL,HL ADD HL,HL OR L ;Insert the 0-15 into LD L,A ; low order nybble INC DE ;Get next char LD A,(DE) CP 0DH ;Ck for last char JR NZ,GETV1 XOR A ;Valid input RET CVB SUB 30H RET C ADD A,0E9H RET C ADD A,6 JR C,ATOF ADD A,7 RET C ATOF ADD A,10 OR A RET ;***** ; Response yes/no routine ;***** YESNO CALL DSPLY ;Display prompt PUSH HL ;Save messge ptr LD HL,ANSWER LD B,1 @@KEYIN XOR A OR B LD A,(HL) ;P/u the response POP HL ;Rcvr message ptr JR Z,YESNO AND 5FH ;STRIP LC CP 'C' JP Z,START CP 'E' JP Z,DOS CP 'N' ;N? JR Z,NO CP 'Y' JR NZ,YESNO YES RET NO CCF RET ;***** ; Output routines for the non-DOS user ;***** ; IF DOS6 DSPLY @@DSPLY RET PRINT @@PRINT RET DOS LD A,0C9H LD (24),A LD HL,0 @@EXIT RST24 LD A,H CP D RET NZ LD A,L CP E RET ELSE IF LDOS DSPLY EQU @DSPLY PRINT EQU @PRINT DOS EQU @EXIT ENDIF ; IF .NOT.LDOS DSPLY LD DE,DDCB$ D1 PUSH HL D2 LD A,(HL) CP 3 JR Z,D3 PUSH AF CALL @PUT POP AF INC HL CP 0DH JR NZ,D2 D3 POP HL RET PRINT LD DE,PDCB$ JR D1 DOS LD A,(LVLFLG) CP 50H BASIC JP Z,BASIC3 JP @EXIT ENDIF ENDIF ; ;***** ; Reserved space for patch code ;***** PATCH1 PUSH DE CALL GETARG POP DE RET PATCH2 CP 'a' JR C,PATCH2A CP 'z'+1 JR NC,PATCH2A RES 5,A PATCH2A JP WRBYT DS 13 ;***** ; Loader routines ;***** BNCOFF DEFB 3 DEFB 4 DEFW KDCB$+1 KIHOOK DEFW KIADR3 LOADER DEFB 1 ;Start of block DEFB 17 ;Block length LDADR DEFW 0 ;Load address DINOP NOP ;Possible DI LDHL LD HL,0 ;Relocator routine LDDE LD DE,0 LDBC LD BC,0 LDMOV LDIR ;LDIR or LDDR LDJP JP 0 PAGE ;***** ; DATA AREA ;***** HELLO$ DM 28,31,'MISOSYS Command File Utility ' ; IF EXPAND DB '- Version 1.5',LF ENDIF ; IF EDAS DB '- EDAS Version 1.5',LF ENDIF ; IF LDOS DB '- LDOS Version 5.1',LF ENDIF ; IF SIMUTEK DB '- SIMUTEK Version 1.5',LF ENDIF ; DB 'Copyright (C) 1979 by Roy Soltoff, ' DB 'All rights reserved',LF,CR FIL1PR DM 'Enter input file filespec >',3 BLKMSG DM 'Block loads from ' BLKM1 DM 'XXXX to ' BLKM2 DM 'XXXX',CR STAMSG DB 'FILNAM: ',3 TRAMSG DM 'Transfer address (entry point) is ' TRAM1 DM 'XXXX',CR MEMMSG DM 'Out of memory!',CR LODMSG DM 'Requested file is not a Command ' DB 'or System file!',CR PRTREQ DM 'Address load log to printer (Y,N,E)? >',3 NEWTRA DM 'Enter new transfer address or to use ' NEWT1 DM 'XXXX >',3 OUTSPC DM 'Enter filespec to write output >',3 FINMSG DM 'Module write is complete - ' DB 'write another (Y,N,E,C)? >',3 NOINP DM '*** No file input *** ' DB 'No file to output ***',CR CHKSUM DM 'Tape checksum error detected - ' DB 'reread tape!',CR CASMSG DB 'Ready cassette and enter ',3 INPMPT DM 'Input disk or tape (D,T,E,C' ; IF EXPAND!LDOS DB ',Q' ENDIF ; DB ') or to end reads? >',3 FILMSG DM 'Enter tape file name >',3 OUTDT DM 'Output to disk or tape (D,T,E,C) or ' DB ' to restart? >',3 PGMLOD DM 'Program loads from base address ' PGML1 DM 'XXXX to ' PGML2 DM 'XXXX',CR MOVREQ DM 'Enter new base address or >',3 DIMSG DM 'Do you want to disable the interrupts ' DB '(Y,N,E,C)? >',3 KBCREQ DM 'Do you want to disable the keyboard ' DB 'debounce (Y,N,E,C)? >',3 DVRMSG DM 'Do you want to add the offset driver ' DB 'routine (Y,N,E,C)? >',3 LOMSG DM 'Program loads below 4200H',LF DB ' Enter address to restrict ' DM 'offset or >',3 ISAM$ DM 'File has ISAM overlays - enter # >',3 NOISAM$ DM 'Overlay beyond end of file!',CR DFTEXT DM 'CMD' DCB DS 32 IOBUF DS 32 FILNAM DS 6 BUFPTR DS 2 MEMPTR DS 2 BLKADR DS 2 BLKEND DS 2 TRAADR DS 2 HIADR DS 2 LOADR DS 2 OFFSET DS 2 ANSWER DS 2 DIRPTR DS 2 PRTFLG DS 1 NAMLEN DS 1 HLDFLG DS 1 ORG $<-8+1<8 MEMBUF EQU $ END START