|
|
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 - metrics - download
Length: 11008 (0x2b00)
Types: TextFile
Names: »SYSGENH.ASM«
└─⟦1f6b46325⟧ Bits:30004393 CP/M-80 rel. 1 Utilities source disk
└─⟦this⟧ »SYSGENH.ASM«
TITLE 'CRAS HARD DISK SYSTEM GENERATION UTILITY'
PAGE 43
;******************************************************************************
; CHRISTIAN ROVSING A/S HARD DISK SYSTEM GENERATION PROGRAM
;******************************************************************************
;
; THIS SYSGEN PROGRAM IS UTILIZED TO PLACE THE CP/M 2.2
; OPERATING SYSTEM ONTO THE SYSTEM TRACKS OF A HARD DISK
; OR TO READ THE OPERATING SYSTEM FROM THE SYSTEM TRACKS
; OF A HARD DISK.
;
; FORMAT FOR THE SYSGENH COMMAND CAN TAKE ONE OF TWO FORMS:
;
; 1) A>SYSGENH<CR>
;
; THIS FORMAT ASSUMES THAT THE SOURCE OF
; THE SYSTEM IMAGE WILL BE THE SYSTEM TRACKS
; OF A HARD DISK. 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 "SYSGENH" POSITION (3480H).
;
; 2) A>SYSGENH Æ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.
;
;******************************************************************************
;
;
TRUE EQU 0FFH ;SET TRUE AND FALSE VALUES
FALSE EQU 000H
;
;
;SET HARD DISK CONTROLLER FIRMWARE FORMAT SELECTION
;
EMUL206 EQU FALSE ;FIRMWARE FOR HARD DISK EMULATES 206 CONTROLLER
DIR506 EQU TRUE ;FIRMWARE MAPS DIRECT TO ST506 DRIVE
;
;
VERS EQU 22 ;CP/M VERSION 2.2
;
NDISKS EQU 16 ;NUMBER OF DISK DRIVES SUPPORTED
NSSEC EQU 75 ;NUMBER OF SYSTEM 128 BYTE SECTORS
;
IF EMUL206
NSPT EQU 48 ;EMULATED 206 LOGICAL SECTORS PER TRACK
ENDIF
;
IF DIR506
NSPT EQU 68 ;DIRECT MAPPING LOGICAL SECTORS PER TRACK
ENDIF
;
PAGE
;
FCB EQU 005CH ;DEFAULT FCB LOCATION
FCBEXT EQU FCB+12 ;DEFAULT EXTENT 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 02H ;BIOS WRITE UNALLOCATED CODE
DIR EQU 01H ;BIOS PREREAD/POST DISK WRITE (DIRECTORY)
;
MAXTRY EQU 10 ;MAXIMUM NUMBER OF RETRIES ON EACH READ/WRITE
;
STKSIZE EQU 60 ;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
ESC EQU 1BH ;ASCII ESCAPE
;
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,00H ;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 BUFFER
CALL FILEDMA
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
;
;
BADRD: ;EOF ENCOUNTERED IN INPUT FILE
LXI D,BADFILE
CALL OUTMSG
JMP REBOOT
;
PAGE
;
;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 ESC,'Æ7;2m',CR,LF
DB 'CHRISTIAN ROVSING A/S WINCHESTER SYSGEN VERSION '
DB VERS/10+'0','.',VERS MOD 10+'0'
;
IF EMUL206
DB CR,LF,'FOR MSC 9205 CONTROLLER WITH 206 EMULATION FIRMWARE.'
ENDIF
;
IF DIR506
DB CR,LF,'FOR MSC 9205 CONTROLLER WITH ST-506 DRIVE 820707'
ENDIF
;
DB CR,LF,ESC,'Æm','$'
;
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»