; ; DOS SIMULATOR ; ; MODIFICATIONS TO CP/M TO IMPROVE ITS COMPATIBILITY ; WITH CROMENCO'S DISK OPERATING SYSTEM. ; ; NOTE: CROMENCOS DISK SYSTEM TREATS CP/M ; CALLS AS A SUBSET OF THEIR OWN SYSTEM, IN ; ADDITION, SEVERAL OF THE CP/M CALLS HAVE ; BEEN EMBLISHED. ; ; NOT ALL OF THE SPECIAL CALLS HAVE BEEN COVERED BY ; THESE MODIFICATIONS. ALSO YOU WILL NEED A Z80 PROCESSOR ; TO RUN MOST PROGRAMS WRITEN FOR THE CROMENCO ; DISK SYSTEM. ; ; IMPLEMNTATION NOTES: ; ; (1) CPMB = STARTING ADDRESS OF CP/M BDOS ; (2) THESE INTERNAL LOCATIONS ARE FOR ; CP/M VERSION 1.4. (AND CAN BE EXPECTED TO VARY) ; (A) CPMB+807H, A JUMP IN CP/M WHICH ; IS REPLACED BY A JUMP TO DSIM. ; (B) CPMB+0A07H, A FLAG/CHR BUFFER USED ; BY THE CP/M I/O ROUTINES ; (C) CPMB+869H, 8FAH, AND 9F8H FOR ; THE CONTROL C ADDRESS. ; (3) IN THE GOCPM ROUTINE IN WARM BOOT, ADD: ; LXI H,DSIM ; SHLD CPMB+807H ; THIS PROVIDES THE LINK TO DSIM ; (4) DSIM CAN RESIDE IN THE CBIOS. ; (5) REMEMBER, DON'T LET THE CBIOS GET TO ; LONG, OR THERE WON'T BE SPACE FOR IT ; ON THE DISK. ; (6) DMAADD IS ADDRESS OF LOCATION WHERE CP/M STORES ; THE DMA ADDRESS. ; ; DOS SIMULATOR ; ; FIRST SORT OUT THE CP/M CALLS WE ; NEED TO MODIFY. ; DSIM: MOV A,C ; GET COMMAND CPI 0AH ; READ BUFFER? JZ FLIN ; YES CPI 0FH ; OPEN FILE? JZ FHL ; YES CPI 11H ; SEARCH FOR FILE? JZ FHL ; YES CPI 12H ; SEARCH FOR NEXT? JZ FHL ; YES ORA A ; RETURN TO DOS? JZ WBOOT ; YES JMP CPMB+841H ; IF BIT=7=0 NORMAL CPM ; ; ADDED CALLS ; ANI 0FH ; INPUT W/OUT ECHO JZ CONIN1 ; YES CPI 02H ; CONTROL C? JZ SCC ; YES CPI 06H ; SET UP FCB? JZ SFCB ; YES CPI 09H ; DO DE=DE*HL? JZ CMULT ; YES CPI 0AH ; DO HL=HL/DE? JZ SDIV ; YES ; ; IF WE GET HERE, CALL IS NOT HANDLED ; THIS JUMP IS TO THE BREAKPOINT ROUTINE ; IN MY PROM MONITOR, AND SHOULD BE REPLACED ; ANYWAY YOU SEE FIT ; JMP 0C108H ; ; CHANGE CONTROL C ADDRESS ; SCC: XCHG ; GET ADDRESS SHLD CPMB+869H SHLD CPMB+8FAH SHLD CPMB+9F8H XRA A RET ; ; ADD NULL TO INPUT BUFFER ; FLIN: PUSH D ; SAVE BUFFER ADD CALL CPMB+841H ; GO GET INPUT POP H ; GET ADDRESS MOV A,M ; REQ. NO. INX H MOV C,M ; ACTUAL CMP C RZ ; BUFFER FULL INX H ; FIRST CHAR XRA A MOV B,A DAD B ; GET LAST LOC MOV M,A ; ADD NULL RET ; ; NON ECHO CONSOLE INPUT ; CONIN1: LDA CPMB+0A07H ; CPM CHR READY FLAG ORA A JNZ CONIN2 ; ONE WAITING CALL CONIN CONIN2: PUSH PSW XRA A ; CLEAR FLAG STA CPMB+0A07H POP PSW RET ; ; SIMPLE DIVIDE ; SDIV: MOV A,D ; CHECK FOR ZERO ORA E JNZ SDIV1 MOV L,A ; ANSWER MOV H,A DCR A ; A=FF RET SDIV1: LXI B,1 SDIV2: MOV A,L SUB E MOV L,A MOV A,H SBB D MOV H,A JM SDIV3 INX B JMP SDIV2 ; SDIV3: DAD D DCX B XCHG PUSH B POP H XRA A RET ; ; MULTIPLY ; CMULT: MVI A,10H STA SHFT ; TO DO PUSH H ; SWAP POP B LXI H,0 ; ZERO CMULT1: DAD H ; SHIFT PRODUCT ORA A ; CLR CARRY MOV A,E ; 16 BIT SHIFT RAL MOV E,A MOV A,D RAL MOV D,A JNC CMULT2 ; IF NO CY, SKIP DAD B ; ADD CMULT2: LDA SHFT ; SEE IF DONE DCR A STA SHFT ; JUST IN CASE JNZ CMULT1 ; MORE PUSH H POP D RET ; ; FIX HL ON SEARCH, OPEN COMMANDS ; FHL: CALL CPMB+841H CPI 0FFH ; SKIP? RZ ; YES PUSH PSW RRC RRC RRC ANI 60H LHLD DMAADD MVI D,0 MOV E,A FHL1: DAD D ; BASE ADDRESS MOV A,M ; EMPTY? CPI 0E5H JZ FHLE ; YES, SKIP PUSH H ; SAVE LXI D,0FH ; CHECK EXT DAD D MOV A,M CPI 80H ; FULL? JNZ FHLE1 MVI A,0EFH CMP L JZ FHLE1 POP H LXI D,20H JMP FHL1 ; FHLE1: POP H FHLE: POP PSW RET ; SET UP FILE CONTROL BLOCK ; ; HL=SORCE ; DE=DEST ; FIRST CLEAR FCB ; SFCB: XCHG PUSH H ; SAVE FOR EXIT MVI M,0 INX D ; LOOK FOR COLON LDAX D ; GET CHAR DCX D ; IF NOT A COLON CPI ':' JNZ SFCB7 ; NOPE LDAX D ; GET DRIVE ANI 03H ; STRIP MOV M,A ; SET FCB INX D ; AHEAD TO NAME INX D SFCB7: INX H PUSH H ; FOR FILENAME MVI A,11 SFCB1: MVI M,20H ; SPACE INX H DCR A JNZ SFCB1 MVI A,21 ; CLEAR SFCB2: MVI M,0 INX H DCR A JNZ SFCB2 POP H PUSH H ; ; HL=FCB+1 ; DE=SCORCE ; STACK=FCB+1,FCB ; MVI C,8+1 SFCB3: LDAX D CPI '.' JZ SFCB4 CPI '/' JM SEXIT DCR C JZ SFCB5 MOV M,A INX H INX D JMP SFCB3 ; SFCB4: INX D SFCB5: POP H PUSH H ; FOR EXIT LXI B,8 DAD B MVI C,3+1 SFCB6: LDAX D CPI '/' JM SEXIT DCR C JZ SEXIT MOV M,A INX H INX D JMP SFCB6 ; SEXIT: XCHG POP D POP D RET ; SHFT: DB 0 ; RAM FOR MULT ;