diff --git a/.gitattributes b/.gitattributes index dfe0770..656edeb 100644 --- a/.gitattributes +++ b/.gitattributes @@ -1,2 +1,8 @@ # Auto detect text files and perform LF normalization * text=auto + +# 86-DOS text files must use CRLF and have 0x1A EOF markers, we simply mark them as binary +*.asm binary +*.doc binary +*.hex binary +*.prn binary diff --git a/COMMAND.ASM b/COMMAND.ASM new file mode 100644 index 0000000..98d690d --- /dev/null +++ b/COMMAND.ASM @@ -0,0 +1,488 @@ +FCB EQU 5CH +DSKRESET EQU 13 +SETBASE EQU 38 +SRCHFRST EQU 17 +SRCHNXT EQU 18 +RENAM EQU 23 +INCHAR EQU 1 +GETFAT EQU 27 +OPEN EQU 15 +CLOSE EQU 16 +MAKE EQU 22 +DELETE EQU 19 +RDBLK EQU 39 +WRBLK EQU 40 +SETDMA EQU 26 +SELDRV EQU 14 +GETDRV EQU 25 +PRINTBUF EQU 9 +OUTCH EQU 2 +INBUF EQU 10 +RR EQU 33 + + ORG 100H + + MOV SP,STACK + CLD + MOV DL,0 ;Start with A: +SETDRV: + MOV CL,SELDRV + CALL 5 +COMMAND: + MOV SP,STACK + CLD + MOV AX,CS + MOV SS,AX + MOV ES,AX + MOV DS,AX + MOV CX,[6] + SUB CX,TPA + AND CL,80H ;Round down + ROL CX + XCHG CH,CL + MOV [NUMREC],CX ;Number of records each time + MOV DX,CRLF + MOV CL,PRINTBUF + CALL 5 + MOV DX,COMMAND + MOV AX,2522H ;Set vector 34 (terminate) + INT 33 + MOV AX,2523H ;Set vector 35 (CTRL-C) + INT 33 +GETCOM: + MOV CL,GETDRV + CALL 5 + ADD AL,"A" + MOV CL,OUTCH + MOV DL,AL + CALL 5 ;Print drive letter + MOV DL,":" + MOV CL,OUTCH + CALL 5 ;Print : + MOV DX,LINEBUF + MOV CL,INBUF + CALL 5 + MOV DL,10 + MOV CL,OUTCH + CALL 5 ;New line + MOV CH,0 + MOV SI,FILLINFO ;8 spaces + MOV DI,ID + CALL FILLBUF + MOV DI,FCB + CALL FILLBUF + MOV SI,LINEBUF+2 + MOV DI,ID + CALL FILEDRV ;Get COM drive + MOV [SPECDRV],AL + MOV CX,8 + CALL COPYNAM ;Copy file name + MOV AL,9 + SUB AL,CL + MOV [IDLEN],AL + MOV DI,81H + MOV CX,0 + PUSH SI +COMTAIL: + LODB + STOB ;Move command tail to 80H + CMP AL,13 + LOOPNZ COMTAIL + NOT CL + MOV [80H],CL + POP SI + MOV DI,FCB + CALL PARSENAM + MOV DI,FCB+10H + CALL PARSENAM + MOV AL,[IDLEN] + MOV DL,[SPECDRV] + OR DL,DL ;Check if drive was specified + JNZ DRVCHK + DEC AL ;Check for null command + JZ GETCOM + MOV SI,COMTAB +FINDCOM: + MOV DI,IDLEN + MOV CL,[SI] + JCXZ EXTERNAL + REPE + CMPB + LAHF + ADD SI,CX ;Bump to next position without affecting flags + SAHF + LODW ;Get address of command + JNZ FINDCOM + CALL AX ;Call command + JMP COMMAND +SETDRV1: + JMP SETDRV +DRVCHK: + DEC DL ;Adjust for correct drive number + DEC AL ;Check if anything else is on line + JZ SETDRV1 +EXTERNAL: + MOV AL,[SPECDRV] + MOV [IDLEN],AL + PUSH DS + MOV DX,TPA + ADD DX,0FH ;Round to next paragraph + SHR DX + SHR DX + SHR DX + SHR DX ;Divide 16 + MOV CX,CS + ADD DX,CX ;New segment + MOV DS,DX + MOV AH,SETBASE + INT 33 + MOV DX,100H + MOV CL,SETDMA + CALL 5 + MOV BX,DS ;New segment into BX + POP DS + MOV DX,IDLEN + MOV AH,OPEN + INT 33 + OR AL,AL + JNZ BADCOM + MOV W,[IDLEN+RR],0 + MOV CX,512 ;512 records + MOV AH,RDBLK + INT 33 + MOV DS,BX + MOV ES,BX + MOV SS,BX + MOV SP,40H + MOV AX,0 + PUSH AX + MOV AX,100H + PUSH BX + PUSH AX + MOV CL,SETDMA + MOV DX,80H + CALL 5 + RET L +BADCOM: + MOV DX,BADNAM + MOV CL,PRINTBUF + CALL 5 + JMP COMMAND + +NEXTCHR: +;Convert lower case input to upper case + LODB + CMP AL,"a"-1 + JB DELIM + CMP AL,"z" + JA DELIM + SUB AL,20H ;Lower-case changed to upper-case +DELIM: + CMP AL," " + JZ RET + CMP AL,"=" + JZ RET + CMP AL,"," + JZ RET + CMP AL,";" + JZ RET + CMP AL,9 ;Check for TAB character + RET + +FILEDRV: + CALL NEXTCHR + JZ FILEDRV ;Skip delim + CMP AL,13 + JZ NOMATCH + CMP B,[SI],":" + JNZ NOMATCH + SUB AL,40H ;A => 1, B => 2 + INC SI + RET + +PARSENAM: + CALL NEXTCHR + JZ ISDELIM + CMP AL,13 + JNZ PARSENAM + DEC SI +ISDELIM: + CALL FILEDRV + STOB + MOV CX,11 + CALL COPYNAM + ADD DI,CX + CMP CX,3 + JB RET + SUB DI,3 + CMP AL,"." + JNZ NOMATCH + MOV CX,3 +COPYNAM: + CALL NEXTCHR + JZ NOMATCH + CMP AL,13 + JZ NOMATCH + CMP AL,"." + JZ RET + STOB + LOOP COPYNAM +NOMATCH: + XOR AL,AL + DEC SI + RET + +FILLBUF: + LODB + MOV CL,AL + JCXZ RET + LODB + REP + STOB + JP FILLBUF + +DIR: + CMP B,[FCB+1]," " + JNZ HASNAME + MOV SI,FCBFIL + MOV DI,FCB+1 + CALL FILLBUF ;Fill 11 bytes with "?" +HASNAME: + MOV DX,LINEBUF+2+1 + MOV CL,SETDMA + CALL 5 + MOV CL,SRCHFRST + MOV DX,FCB +EACHFILE: + CALL 5 + INC AL ;FF = file not found + JZ RET + MOV SI,LINEBUF+2+1 + MOV CX,8 + CALL OUTCNT ;Print 8 chars (name) + MOV CL,OUTCH + MOV DL," " + CALL 5 ;Print space + MOV SI,LINEBUF+2+9 + MOV CX,3 + CALL OUTCNT ;Print 3 chars (ext) + MOV DX,CRLF + MOV CL,PRINTBUF + CALL 5 ;Print new line + MOV CL,SRCHNXT + JP EACHFILE +OUTCNT: + LODB + PUSH CX + PUSH SI + MOV DL,AL + MOV CL,OUTCH + CALL 5 + POP SI + POP CX + LOOP OUTCNT + RET + +RENAME: + MOV CL,RENAM + MOV DX,FCB + JMP 5 + +ERASE: + MOV CL,DELETE + MOV DX,FCB + JMP 5 + +CREATE: + MOV CL,MAKE + MOV DX,FCB + JMP 5 + +TYPE: + MOV DX,TPA + MOV CL,SETDMA + CALL 5 + MOV DX,FCB + MOV AH,OPEN + INT 33 + OR AL,AL + JNZ RET ; Not found + MOV W,[FCB+RR],0 + MOV CX,512 + MOV AH,RDBLK + INT 33 + MOV SI,TPA +OUTLP: + LODB + CMP AL,1AH ;Is EOF? + JZ RET + MOV CL,OUTCH + MOV DL,AL + CALL 5 + JP OUTLP + RET + +CLEAR: + MOV DX,ERAMES + MOV CL,PRINTBUF + CALL 5 ;Confirm erase + MOV CL,INCHAR + CALL 5 + CMP AL,"Y" + JZ DOCLEAR + CMP AL,"y" + JZ DOCLEAR + RET +DOCLEAR: + MOV DL,[FCB] + OR DL,DL + JZ CLRDSK + DEC DL + MOV CL,SELDRV + CALL 5 +CLRDSK: + MOV CL,GETFAT + CALL 5 + MOV CX,DX + INC DX + SHR DX + ADD CX,DX + MOV AX,DS + MOV ES,AX + MOV DI,BX + MOV AX,0FFFFH + STOW + STOB ;Fill first 3 bytes with FF + INC AX ;AX = 0 + SHR CX + JNC DOFILL + STOB ;Odd byte +DOFILL: + REP + STOW + MOV AX,CS + MOV DS,AX + MOV ES,AX + MOV SI,FCBFIL + MOV DI,FCB+1 + CALL FILLBUF + MOV DX,FCB + MOV CL,DELETE + CALL 5 ;Delete all files + MOV CL,DSKRESET + JMP 5 + +COPY: + MOV SI,FCB+10H + MOV DI,DSTFCB + MOVB + CMP B,[SI]," " ;Has file name? + JNZ HASDSTNAM + MOV SI,FCB+1 +HASDSTNAM: + MOVB + MOV CX,7 + REP + MOVW + MOV DX,FCB + MOV AH,OPEN + INT 33 + OR AL,AL + JNZ NOSRC + MOV DX,DSTFCB + MOV AH,DELETE + INT 33 + MOV AH,MAKE + INT 33 + MOV DX,TPA + MOV AH,SETDMA + INT 33 + MOV W,[FCB+RR],0 + MOV W,[DSTFCB+RR],0 +CPYBLK: + MOV DX,FCB + MOV CX,[NUMREC] + MOV AH,RDBLK + INT 33 + JCXZ CPYDONE + MOV DX,DSTFCB + MOV AH,WRBLK + INT 33 + OR AL,AL + JZ CPYBLK + MOV DX,NOSPACE + MOV AH,PRINTBUF + INT 33 +CPYDONE: + MOV DX,DSTFCB + MOV AH,CLOSE + INT 33 + RET +NOSRC: + MOV DX,NOTFND + MOV AH,PRINTBUF + INT 33 + RET + + DS 40 +STACK: + +BADNAM: + DB "Bad command or file name" +CRLF: + DB 13,10,"$" +ERAMES: + DB "Erase all files (Y/N)? $" +NOTFND: + DB "Source file not found$" +NOSPACE: + DB "Insufficient disk space$" + +FCBFIL: + DB 11,"?" + DB 0 + +SPECDRV: + DS 1 +NUMREC: + DS 2 + +IDLEN: + DS 1 +ID: + DS 8 +COM: + DB "COM" +DSTFCB: + DS 36 + +LINEBUF: + DB 80H,1,13 + DS 80H + +FILLINFO: + DB 8," " + DB 0 + DB 12," ",4,0 + DB 12," ",8,0 + DB 0 + +COMTAB: + DB 4,"DIR" + DW DIR + DB 7,"RENAME" + DW RENAME + DB 6,"ERASE" + DW ERASE + DB 7,"CREATE" + DW CREATE + DB 5,"TYPE" + DW TYPE + DB 6,"CLEAR" + DW CLEAR + DB 5,"COPY" + DW COPY + DB 0 + +TPA: + \ No newline at end of file diff --git a/HEX2BIN.ASM b/HEX2BIN.ASM new file mode 100644 index 0000000..0a324e6 --- /dev/null +++ b/HEX2BIN.ASM @@ -0,0 +1,155 @@ +; HEX2BIN +; Converts Intel hex format files to straight binary + +FCB: EQU 5CH +READ: EQU 20 +SETDMA: EQU 26 +OPEN: EQU 15 +CLOSE: EQU 16 +CREATE: EQU 22 +DELETE: EQU 19 +BLKWRT: EQU 40 +BUFFER: EQU 80H +BUFSIZ: EQU 128 + + ORG 100H + PUT 100H + +HEX2BIN: + MOV DI,FCB+9 + CMP B,[DI]," " + JNZ HAVEXT + MOV SI,HEX + MOVB + MOVW +HAVEXT: +;Get load offset (default is -100H) + MOV AH,OPEN + MOV DX,FCB + INT 21H + OR AL,AL + JNZ NOFIL + MOV B,[FCB+32],0 + MOV AH,READ + MOV BP,START + MOV SI,BUFFER+BUFSIZ ;Flag input buffer as empty +READHEX: + CALL GETCH + CMP AL,":" ;Search for : to start line + JNZ READHEX + CALL GETBYT ;Get byte count + MOV CL,AL + MOV CH,0 + JCXZ DONE + CALL GETBYT ;Get high byte of load address + MOV BH,AL + CALL GETBYT ;Get low byte of load address + MOV BL,AL + ADD BX,START-100H ;Add in offset + MOV DI,BX + CALL GETBYT ;Throw away type byte +READLN: + CMP DI,[6] + JAE ADERR + CMP DI,START + JB ADERR + CALL GETBYT ;Get data byte + STOB + LOOP READLN + CMP DI,BP ;Check if this is the largest address so far + JBE READHEX + MOV BP,DI ;Save new largest + JP READHEX + +NOFIL: + MOV DX,NOFILE +QUIT: + MOV AH,9 + INT 21H + INT 20H + +ADERR: + MOV DX,ADDR + JMP ERROR + +GETCH: + CMP SI,BUFFER+BUFSIZ + JNZ NOREAD + INT 21H + OR AL,AL + JNZ ERROR + MOV SI,BUFFER +NOREAD: + LODB + CMP AL,1AH + JZ DONE + RET + +GETBYT: + CALL HEXDIG + MOV BL,AL + CALL HEXDIG + SHL BL + SHL BL + SHL BL + SHL BL + OR AL,BL + RET + +HEXDIG: + CALL GETCH + SUB AL,"0" + JC ERROR + CMP AL,9 + JBE RET + SUB AL,"A"-"0"-10 + JC ERROR + CMP AL,15 + JBE RET +ERROR: + MOV DX,ERRMES + MOV AH,9 + INT 21H +DONE: + MOV DI,FCB+9 + MOV SI,COM + MOVB + MOVW + MOV DX,FCB + MOV AH,DELETE + INT 21H + MOV AH,CREATE + INT 21H + OR AL,AL + JNZ NOROOM + MOV W,[FCB+33],0 + MOV DX,START + MOV AH,SETDMA + INT 21H + MOV CX,BP + SUB CX,1F2H + AND CL,80H + JCXZ EXIT + ROL CX + XCHG CL,CH + MOV AH,BLKWRT + MOV DX,FCB + INT 21H + MOV AH,CLOSE + INT 21H +EXIT: + INT 20H + +NOROOM: + MOV DX,DIRFUL + JMP QUIT + +HEX: DB "HEX" +COM: DB "COM" +ERRMES: DB "Error in HEX file--conversion aborted$" +NOFILE: DB "File not found$" +ADDR: DB "Address out of range--conversion aborted$" +DIRFUL: DB "Disk directory full$" + +START: + \ No newline at end of file diff --git a/SYS.ASM b/SYS.ASM new file mode 100644 index 0000000..65e9483 --- /dev/null +++ b/SYS.ASM @@ -0,0 +1,58 @@ +FCB EQU 5CH + + ORG 100H + JMP START +SECS: + DW 52 ;Patch for different configs + +START: + MOV AL,[FCB] + OR AL,AL + JZ BADDRV + DEC AL + JZ BADDRV + MOV [FCB],AL + MOV CX,[SECS] + MOV DX,0 + MOV BX,END + MOV AL,0 + INT 37 + JC RDERR + POPF + MOV CX,[SECS] + MOV DX,0 + MOV BX,END + MOV AL,[FCB] + MOV AH,1 + INT 38 + JC WRERR + MOV DX,TRANSOK + JP QUIT + +RDERR: + MOV DX,RDERMSG + +QUIT: + MOV AH,9 + INT 33 + INT 32 + +WRERR: + MOV DX,WRERMSG + JP QUIT + +BADDRV: + MOV DX,BADDRVMSG + JP QUIT + +TRANSOK: + DB "System transfered$" +RDERMSG: + DB "Disk read error$" +WRERMSG: + DB "Disk write error$" +BADDRVMSG: + DB "Bad drive specification" + +END: + \ No newline at end of file