|
DataMuseum.dkPresents historical artifacts from the history of: CP/M |
This is an automatic "excavation" of a thematic subset of
See our Wiki for more about CP/M Excavated with: AutoArchaeologist - Free & Open Source Software. |
top - download
Length: 10368 (0x2880) Types: TextFile Names: »SYSGENF.ASM«
└─⟦1f6b46325⟧ Bits:30004393 CP/M-80 rel. 1 Utilities source disk └─ ⟦this⟧ »SYSGENF.ASM«
TITLE 'CHRISTIAN ROVSING A/S SYSTEM GENERATION UTILITY' PAGE 43 ;****************************************************************************** ; CHRISTIAN ROVSING A/S MINI FLOPPY SYSTEM GENERATION PROGRAM ;****************************************************************************** ; ; THIS SYSGEN PROGRAM IS UTILIZED TO PLACE THE CP/M 2.2 ; OPERATING SYSTEM ONTO THE SYSTEM TRACKS OF A DISKETTE ; OR TO READ THE OPERATING SYSTEM FROM THE SYSTEM TRACKS ; OF A DISKETTE. ; ; FORMAT FOR THE SYSGENF COMMAND CAN TAKE ONE OF TWO FORMS: ; ; 1) A>SYSGENF<CR> ; ; THIS FORMAT ASSUMES THAT THE SOURCE OF ; THE SYSTEM IMAGE WILL BE THE SYSTEM TRACKS ; OF A DISKETTE. THE OPERATOR IS ASKED TO ; SELECT THE SOURCE DISK. IF THE OPERATOR ; ENTERS A CARRIAGE RETURN IN RESPONSE TO ; THE SOURCE DISK QUESTION, THEN THE SYSTEM ; IMAGE IS ASSUMED TO BE ALREADY IN MEMORY ; AT THE "SYSGENF" POSITION (3480H). ; ; 2) A>SYSGENF ÆD:ÅFILENAME.TYP<CR> ; ; THIS FORMAT ASSUMES THAT THE SOURCE OF THE ; SYSTEM IMAGE WILL BE IN THE FILE DESIGNATED ; IN THE COMMAND. THE DRIVE DESIGNATOR IS ; OPTIONAL. THE FILE READ FROM THE DISK IS ; LOADED INTO THE GETPUT POSITION OF MEMORY. ; THE FIRST 3380H BYTES OF THE FILE ARE IGNORED ; DUE TO THEIR CONTAINING GARBAGE. THEY GET THERE ; BECAUSE THE SAVE COMMAND, THAT IS USED TO GENERATE ; SYSTEM IMAGE FILES, SAVES ALL OF MEMORY FROM ; THE BASE OF THE TPA RIGHT UP THROUGH THE END ; OF CP/M. ; PAGE ; ; ONCE THE SYSTEM IMAGE IS LOADED INTO MEMORY IT CAN BE LOADED ; ONTO THE SYSTEM TRACKS OF A DESTINATION DISK OR LEFT IN MEMORY ; FOR A SUBSEQUENT SAVE COMMAND. ; ; ; THE CRAS FORMAT OF CP/M HANDLING UTILITIES PUTS THE SYSGEN VERSION ; OF THE SYSTEM IMAGE INTO MEMORY STARTING AT ADDRESS 03480H SO THAT ; THERE IS STILL ROOM TO EXECUTE DDT BELOW THE SYSTEM IMAGE. ; ;****************************************************************************** PAGE ; VERS EQU 22 ;CP/M VERSION 2.2 ; NDISKS EQU 16 ;NUMBER OF DISK DRIVES SUPPORTED NSSEC EQU 64 ;NUMBER OF SYSTEM 128 BYTE SECTORS NSPT EQU 32 ; FCB EQU 005CH ;DEFAULT FCB LOCATION FCBEXT EQU FCB+12 ;CURRENT EXTENT POINTER LOCATION FCBCR EQU FCB+32 ;CURRENT RECORD LOCATION TPA EQU 0100H ;TRANSIENT PROGRAM AREA LOADP EQU 03480H ;LOAD POINT FOR SYSTEM DURING LOAD/STORE BDOS EQU 5H ;DOS ENTRY POINT BOOT EQU 0 ;JMP TO 'BOOT' TO REBOOT SYSTEM RDCON EQU 1 ;READ CONSOLE INPUT FUNCTION WRCBUF EQU 9 ;WRITE CONSOLE BUFFER OUTPUT FUNCTION SELF EQU 14 ;SELECT DISK OPENF EQU 15 ;DISK OPEN FUNCTION DREADF EQU 20 ;DISK READ FUNCTION DEFBUF EQU 080H ;DEFAULT DISK BUFFER ADDRESS UNALLOC EQU 002H ;BIOS UNALLOCATED WRITE FLAG DIR EQU 001H ;BIOS DIRECTORY WRITE FLAG ; MAXTRY EQU 10 ;MAXIMUM NUMBER OF RETRIES ON EACH READ/WRITE ; STKSIZE EQU 16 ;SIZE OF LOCAL STACK ; WBOOT EQU 1 ;ADDRESS OF WARM BOOT (OTHER PATCH ENTRY ;POINTS ARE COMPUTED RELATIVE TO WBOOT) SELDSK EQU 24 ;WBOOT+24 FOR DISK SELECT SETTRK EQU 27 ;WBOOT+27 FOR SET TRACK FUNCTION SETSEC EQU 30 ;WBOOT+30 FOR SET SECTOR FUNCTION SETDMA EQU 33 ;WBOOT+33 FOR SET DMA ADDRESS READF EQU 36 ;WBOOT+36 FOR READ FUNCTION WRITF EQU 39 ;WBOOT+39 FOR WRITE FUNCTION ; CR EQU 0DH ;ASCII CARRIAGE RETURN LF EQU 0AH ;ASCII LINE FEED ; PAGE ; ORG TPA ;TRANSIENT PROGRAM AREA JMP START ; ; ;UTILITY SUBROUTINES ; GETCHAR: ;READ CONSOLE CHARACTER TO REGISTER A MVI C,RDCON CALL BDOS ; ;CONVERT TO UPPER CASE BEFORE RETURN ; CPI 'A' OR 20H RC ;RETURN IF BELOW LOWER CASE A CPI ('Z' OR 20H) + 1 RNC ;RETURN IF ABOVE LOWER CASE Z ANI 5FH RET ; OUTMSG: ;WRITE CONSOLE BUFFER OUTPUT FUNCTION MVI C,WRCBUF CALL BDOS RET ; SEL: ;SELECT DISK GIVEN BY REGISTER A MOV C,A LHLD WBOOT LXI D,SELDSK DAD D PCHL ; TRK: ;SET UP TRACK LHLD WBOOT ;ADDRESS OF BOOT ENTRY LXI D,SETTRK ;OFFSET FOR SETTRK ENTRY DAD D PCHL ;GONE TO SETTRK ; PAGE ; SEC: ;SET UP SECTOR NUMBER LHLD WBOOT LXI D,SETSEC DAD D PCHL ; DMA: ;SET DMA ADDRESS TO VALUE OF B,C LHLD WBOOT LXI D,SETDMA DAD D PCHL ; READ: ;PERFORM READ OPERATION LHLD WBOOT LXI D,READF DAD D PCHL ; WRITE: ;PERFORM WRITE OPERATON LHLD WBOOT LXI D,WRITF DAD D PCHL ; DREAD: ;DISK READ FUNCTION MVI C,DREADF JMP BDOS ; OPEN: ;FILE OPEN FUNCTION MVI C,OPENF JMP BDOS ; PAGE ; FILEDMA: ;SET FILE DMA ADDRESS FUNCTION PUSH B PUSH D MOV D,B MOV E,C MVI C,26 ;BDOS SET DMA ADDR FUNCTION CALL BDOS POP D POP B RET ; ; ;ROUTINE TO READ OR WRITE THE SYSTEM TRACKS ON THE CP/M SYSTEM ;DISKETTE. THE READ/WRITE FUNCTION IS DETERMINED BY THE SETTING ;OF THE "RW" FLAG AS FOLLOWS: ; 00H=READ ; 01H=WRITE ; GETPUT: LXI H,LOADP ;SET THE START ADDRESS FOR MEMORY SHLD DMADDR MVI A,000H ;SETUP START NUMBER OF SECTORS TO READ/WRITE STA TOTSEC ; MVI C,0 ;SET TRACK ZERO TO START CALL TRK ; PAGE ; ;SECTOR READING/WRITING LOOP ; SECLOOP: LDA TOTSEC ;GET CURRENT SECTOR NUMBER CPI NSSEC ;CHECK IF WE ARE DONE YET RZ ;BALE OUT OF HERE IF ALL IN/OUT ; INR A ;INCREMENT LOGICAL SECTOR NUMBER FOR NEXT STA TOTSEC DCR A ;ADJUST BACK FOR CURRENT LOG SECTOR CPI NSPT ;CHECK IF WE SHOULD SEEK TO TRACK 1 JNZ NOSEEK PUSH PSW MVI C,01H ;SET TO TRACK 1 ON SECTOR COUNT OVERFLOW CALL TRK POP PSW ; NOSEEK: JC STRK0 ;SEE IF WE ARE STILL ON TRACK 0.. SUI NSPT ;IF NOT ADJUST SECTOR COUNT FOR TRACK 1 ; STRK0: MOV C,A ;GET THE SECTOR NUMBER CALL SEC ;TELL DRIVE WHICH ONE WE WANT ; LHLD DMADDR ;GET CURRENT LOAD/UNLOAD ADDRESS PUSH H LXI D,128 ;INCREASE LOAD/UNLOAD ADDRESS FOR ;NEXT PASS DAD D SHLD DMADDR POP B ;NOTE: POP INTO DIFFERENT REGISTER CALL DMA ;SET DMA ADDRESS FOR DISK ROUTINES ; PAGE ; ;READY AT THIS POINT TO TRY READING OR WRITING A SECTOR WITH RETRIES. ; XRA A ;ZERO INITIAL RETRY COUNT STA RETRY GPSEC: LDA RW ;CHECK FUNCTION FLAG ORA A ;IF ZERO THEN READ JZ TRYREAD ; LDA TOTSEC ;GET CURRENT SECTOR NUMBER CPI NSSEC ;CHECK IF WE ARE ON LAST SECTOR MVI C,UNALLOC ;TELL BIOS THIS IS WRITE UNALLOCATED JNZ NOTLAST ;USE FAST UNALLOCTED FLAG IF NOT LAST ; MVI C,DIR ;USE DIR WRITE TO FLUSH BIOS BUFFERS NOTLAST: CALL WRITE ;ITS PUT/WRITE SO LETS DO IT JMP CHKER ;GO TO DO COMMON ERROR CHECK TRYREAD: CALL READ ;READ THE BOOT SECTOR CHKER: ORA A ;CHECK READ/WRITE OPERATION STATUS JZ GPOK ;READ/WRITE OK, EXIT LOOP ; LDA RETRY ;CHECK CURRENT RETRY COUNT INR A ;INCREMENT ON ERROR STA RETRY CPI MAXTRY JNC GPSEC ;TRY READ AGAIN IF NOT AT MAX RETRY ; LXI D,ERRMSG ;PRINT AN ERROR MESSAGE CALL OUTMSG ;..IF WE EXCEEDED MAX RETRIES CALL GETCHAR ;SEE IF TO IGNORE CPI CR ;SKIP? JNZ REBOOT ;EXIT IF FATAL IN OPERATORS OPNION GPOK: JMP SECLOOP ;GO ON TO TRY NEXT SECTOR OF GET/PUT ; PAGE ; ;START OF EXECUTABLE PORTION OF THE SYSGEN PROGRAM. ; START: LXI SP,STACK LXI D,SIGNON CALL OUTMSG LDA FCB+1 CPI ' ' JZ GETSYS ;SKIP TO GET SYSTEM IF MESSAGE BLANK ; ; ;HERE IF WE HAVE TO GET THE SYSTEM FROM THE OPERATOR ;SPECIFIED DISK FILE. ; LXI D,FCB ;OPEN FILE CALL OPEN INR A JNZ RDOK ; ; ;FILE NOT PRESENT, ERROR AND REBOOT ; LXI D,NOFILE CALL OUTMSG JMP REBOOT ; ; ;FILE PRESENT, READ TO LOAD POINT ;FILE HAS 3380H BYTES OF GARBAGE AT ITS FRONT THAT WE HAVE TO SKIP ; RDOK: XRA A STA FCBEXT STA FCBCR LXI B,DEFBUF ;SET DEFAULT DATA BUFFER; CALL FILEDMA ;SET DMA ADDR IN BDOS MVI C,(LOADP-TPA)/128 ;NUMBER OF SECTORS TO SKIP ; PAGE ; ;PRE-READ FILE ; PRERD: PUSH B LXI D,FCB CALL DREAD POP B ORA A JNZ BADRD DCR C JNZ PRERD ; ; ;SECTORS SKIPPED AT BEGINNING OF FILE ; LXI H,LOADP ;SET LOAD ADDRESS AT 03480H RDINP: PUSH H MOV B,H MOV C,L CALL FILEDMA ;SET DMA ADDRESS LXI D,FCB CALL DREAD ;READ FILE SECTOR INTO MEMORY POP H ORA A JNZ PUTSYS ;GOT FILE EOF. GO TO PUT AT DESTINATION ; ; ;MORE TO READ, CONTINUE ; LXI D,128 DAD D JMP RDINP ; PAGE ; BADRD: ;EOF ENCOUNTERED IN INPUT FILE LXI D,BADFILE CALL OUTMSG JMP REBOOT ; ; ;HERE IF WE GET SYSTEM OFF OF THE SYSTEM TRACKS OF A DISKETE ; GETSYS: LXI D,ASKGET CALL OUTMSG CALL GETCHAR CPI CR JZ PUTSYS SUI 'A' CPI NDISKS JC GETC CALL BADDISK JMP GETSYS ; GETC: ;SELECT DISK GIVEN BY REGISTER A ADI 'A' STA GDISK ;TO SET MESSAGE SUI 'A' CALL SEL ;TO SELECT THE DRIVE ; PAGE ; ;GETSYS, SET RW TO READ AND GET THE SYSTEM ; LXI D,GETMSG CALL OUTMSG CALL GETCHAR CPI CR JNZ REBOOT XRA A STA RW CALL GETPUT LXI D,DONE CALL OUTMSG ; ; PUTSYS: ;PUT SYSTEM LXI D,ASKPUT CALL OUTMSG CALL GETCHAR CPI CR JZ REBOOT SUI 'A' CPI NDISKS JC PUTC ; PAGE ; ;INVALID DRIVE NAME ; CALL BADDISK JMP PUTSYS PUTC: ADI 'A' STA PDISK SUI 'A' CALL SEL LXI D,PUTMSG CALL OUTMSG CALL GETCHAR CPI CR JNZ REBOOT LXI H,RW MVI M,1 ;SET WRITE FLAG CALL GETPUT ;GO WRITE THE FILE LXI D,DONE CALL OUTMSG JMP PUTSYS ; ; REBOOT: MVI A,0 ;SET LOGDISK TO A: FOR REBOOT CALL SEL JMP BOOT ; BADDISK: LXI D,QDISK CALL OUTMSG RET ; PAGE ; ;VARIOUS MESSAGES FOR THE SYSGEN PROGRAM ; SIGNON: DB 'CHRISTIAN ROVSING A/S - CR8 SYSTEM GENERATION VERSION ' DB VERS/10+'0','.',VERS MOD 10+'0' DB CR,LF,'FOR TANDON TM-100 5 1/4 INCH 96 TPI DRIVES' DB CR,LF,'$' ; ASKGET: DB CR,LF,'SOURCE DRIVE NAME (OR RETURN TO SKIP) ','$' ; GETMSG: DB CR,LF,'SOURCE ON ' ; GDISK: DS 1 ;FILLED IN AT GET FUNCTION ; DB ', THEN TYPE RETURN','$' ; ASKPUT: DB CR,LF,'DESTINATION DRIVE NAME (OR RETURN TO REBOOT) ','$' ; PUTMSG: DB CR,LF,'DESTINATION ON ' ; PDISK: DS 1 ;FILLED IN AT PUT FUNCTION ; DB ', THEN TYPE RETURN','$' ; ERRMSG: DB CR,LF,'PERMANENT ERROR, TYPE RETURN TO IGNORE','$' ; DONE: DB CR,LF,'FUNCTION COMPLETE','$' ; QDISK: DB CR,LF,'INVALID DRIVE NAME (USE A, B, C, OR D)','$' ; NOFILE: DB CR,LF,'NO SOURCE FILE ON DISK','$' ; BADFILE: DB CR,LF,'SOURCE FILE INCOMPLETE','$' ; CRLFMSG: DB CR,LF,'$' ; TOTSEC: DS 1 ; RW: DS 1 ; DMADDR: DS 2 ; RETRY: DS 1 DS STKSIZE*2 ; STACK EQU $ ; ; END ; ; +++... «eof»