Files
Digital-Research-Source-Code/MPM OPERATING SYSTEMS/MPM I/MPM I SOURCE/06/format.asm
Sepp J Morris 31738079c4 Upload
Digital Research
2020-11-06 18:50:37 +01:00

1 line
7.1 KiB
NASM
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

;4-15-77
;DISK FORMAT PROGRAM TO WORK WITH THE FDC-3 DISK CONTROLLER
;FORMATS DISKETTES TO WORK WITH VERSION 4.1 OF THE
;CP/M OPERATING SYSTEM. EITHER SINGLE OR DOUBLE DENSITY CAN
;BE FORMATTED. IF DOUBLE DENSITY IS SPECIFIED, TRACK 0 IS
;IN SINGLE DENSITY AND THE REST ARE DOUBLE.
;
;SINCE THE FDC-3 IS USED WITH BOTH S100 AND
;DSC-2 COMPUTER SYSTEMS, THE ASSEMBLY TIME SWITCH DSC2
;MUST BE SET CORRECTLY
TRUE EQU 0FFFFH
FALSE EQU NOT TRUE
;
DSC2 EQU TRUE ;THIS SHOULD BE SET TO FALSE FOR S100 SYSTEMS
;
;DEFINE DISK PORTS
;
IF DSC2
I127 EQU 80H
I126 EQU 81H
I125 EQU 82H
I124 EQU 83H
ENDIF
;
IF NOT DSC2
I127 EQU 7FH
I126 EQU 7EH
I125 EQU 7DH
I124 EQU 7CH
ENDIF
;
;
PORT EQU 4AH
DENSITY EQU 4CH
;
ORG 100H
LXI SP,2000H
MONITOR EQU 0005H
;FIGURE WHERE THE CBIOS JUMP TABLE IS FOR THIS SYSTEM
LHLD 1
MVI L,0
SHLD JUMPTAB
;
;INITIALIZE DISKETTES
;
;SET UP DATA BUFFER OF E5
LXI H,WRITEBUF
MVI B,128D
L0:
MVI M,0E5H
INX H
DCR B
JNZ L0
;CHANGE ERROR LOCATION IN CBIOS TO THIS PROGRAM
LHLD JUMPTAB
LXI D,2EH
DAD D
LXI D,ERR
MOV A,M ;SAVE OLD ERROR LOCATION
STA OLDL
MOV M,E
INX H
MOV A,M
STA OLDH
MOV M,D
;SAVE OLD STATE OF DISK SELECT AND DENSITY
LDA PORT
STA SAVEPORT
LDA DENSITY
STA SAVEDENS
MVI C,9 ;PRINT LOGON MESSAGE
LXI D,MESS0
CALL MONITOR
AGAIN:
;PRINT MESSAGE TO SELECT INITIALIZE ROM
MVI C,9D ;MONITOR CALL TO PRINT BUFFER
LXI D,MESS1
CALL MONITOR
;WAIT FOR ANSWER
MVI C,01
CALL MONITOR
;CHECK FOR NO
CPI 'N'
JZ DONE
CPI 06EH
JZ DONE
;NOW SELECT THE CORRECT DIRVE 8 ARE POSSIBLE
DCR A
ANI 07H
MOV C,A
;PUT INTO MESSAGE
ORI 40H
INR A
STA DRV
CALL SELDISK
OK:
;START WITH TRACK 0
XRA A
STA TRK
MVI C,9D ;PRINT BUFFER CALL
LXI D,MESS3 ;PROMPT TO SELECT DENSITY
CALL MONITOR
;WAIT FOR RESPONSE
MVI C,01
CALL MONITOR
CPI 'S'
JZ FILL0
CPI 'D'
JNZ OK ;DO NOT ASSUME ANYTHING
FILL0:
;SET UP SINGLE DENSITY
STA DENS
;SET UP DENSITY SELECTS IN LOW MEMORY
XRA A
STA DENSITY ;DENSITY
LDA PORT
ANI 0F7H
STA PORT
;SET UP PROPER ADDRESS MARKS FOR INITIALIZING
MVI A,0FEH
STA ID
MVI A,0FCH
STA INDEXAM
MVI A,0C0H
STA FINISH ;TRACK FINISHED
MVI A,0E0H
STA ECODE
;SET UP CORRECT TABLE FOR USE IN WRITING THE E5 DATA PATTERN
LXI H,SINTAB
SHLD E5TABLE
;SET UP CORRECT TABLE FOR WRITING THE ID FIELDS
LXI B,SINTAB
MVI A,26D
CALL FILL
JMP OK8
FILL:
STA SECTORS
;NOW MAKE A IMAGE OF THE TRACK
LXI H,BUFFER
PUSH B
MOV C,A ;NUMBER OF SECTORS
LOOP:
MVI B,6 ;6 BYTES PER SECTOR
LXI D,ID
LOOP1:
LDAX D
MOV M,A
INX H
INX D
DCR B
JNZ LOOP1
DCR C
JNZ LOOP
;NOW BUFFER +3 AND EVERY 6 BYTES ARE SECTOR #
;FILL IN SECTOR NUMBERS
POP B ;ADDRESS OF TABLE OF SECTOR NUMBERS
CALL FILSECT
JMP FINCODE
FILSECT:
LXI H,BUFFER+3
LXI D,6
LOOP3:
LDAX B
CPI 0FFH
RZ
MOV M,A
INX B
DAD D
JMP LOOP3
;NOW PUT FINNISH CODE AT THE LAST WORD
FINCODE:
DCX H
DCX H
DCX H
DCX H
LDA FINISH
MOV M,A
RET
OK8:
;PRINT MESSAGE TO PUT IN CORRECT DISKETTE
LXI D,MESS2
MVI C,9
CALL MONITOR
MVI C,1 ;WAIT FOR REPLY
CALL MONITOR
;ENABLE FORMATTING
LDA PORT
ANI 0BFH
XRI 40H
STA PORT
;HOME THE DISK
LHLD JUMPTAB
LXI D,18H
DAD D
CALL SYST
;NOW GO AHEAD AND INITIALIZE
;
INIT:
;SET UP TRACK EROR COUNTER
XRA A
STA ERRORS
;;
INITIAL:
;DELAY 200 MILLISEC
LXI B,8000H
L6:
DCR C
JNZ L6
DCR B
JNZ L6
;HERE WE GO - TURN MICROCODE ON
;
LXI H,INDEXAM
MOV A,H
;
IF NOT DSC2
CMA
ENDIF
;
OUT I126 ;SET DMA ADDRESS OM FCD
MOV A,L
;
IF NOT DSC2
CMA
ENDIF
;
OUT I125 ;POINTS TO INDEX AM
MVI A,0A0H ;SELECT INITIALIZATION CODE AND WRITE DATA
;
IF NOT DSC2
CMA
ENDIF
;
OUT I127
WW: IN I127
ANI 88H ;WAIT FOR IO FINISH
JZ WW
IN I127 ;CHECK FOR ERROR
ANI 0F0H
JZ FILTRK
LXI D,FORMATERR
JMP ERR1
;
;INCREMENT TRACK, STEP
;
FILTRK:
;NOW WRITE THA DATA PATTERN OF E5 IN EACH SECTOR
LXI B,WRITEBUF
CALL SETDMA
;THIS IS TABLE DRIVEN TO SPEED IT UP
;USE SINTAB FOR SD TRACKS
;USE TABLE4 FOR DD TRACKS
LHLD E5TABLE
F6:
PUSH H
MOV C,M
CALL SETSEC
CALL WRITE
POP H
INX H
MVI A,0FFH
CMP M
JNZ F6 ;MORE SECTORS TO GO
NEXTRK: LDA TRK
INR A
STA TRK
CPI 1
JZ CHECKDENS
CPI 2
JZ NEWSECT
CPI 77
JNZ DOSTP
JMP AGAIN ;DO ANOTHER
CHECKDENS:
LDA DENS
CPI 'D'
JNZ DOSTP
;TIME TO CHANGE DENSTIY
LDA PORT
ANI 0F7H
ORI 08H
STA PORT
MVI A,0FFH
STA DENSITY
MVI A,0EH
STA ID ;ID ADDRESS MARK
MVI A,0CH
STA INDEXAM
XRA A
STA FINISH
INR A
STA ECODE ;SECTOOR FINISH CODE
LXI H,TABLE4
SHLD E5TABLE
LXI B,DOBTAB
MVI A,58D ;NUMBER OF SECTORS
CALL FILL
JMP DOSTP
NEWSECT:
;FOR OPTIMAL CPPM ACCESS, THE CPM TRACKS MUST BE INITIALIZED
;DIFFERENTLY
LDA SECTORS
CPI 26D
JZ DOSTP ;ONLY NECESSARY FOR DD
;FOR DD THE LOGIACAL SECTORS ARE EVERY 13TH PHYSICAL SECTOR
LXI B,TABLE2
CALL FILSECT
DOSTP:
;FIGURE ADDRESS OF SEEK
LHLD JUMPTAB
LXI D,01EH
DAD D
LDA TRK
MOV C,A ;SEND PARAMETER IN C
CALL SYST
;FILL IN NEW TRACK BYTES
LXI H,BUFFER+1
LXI D,006
LDA SECTORS
MOV C,A
LDA TRK
LOOP5:
MOV M,A
DAD D
DCR C
JNZ LOOP5
JMP INIT
DONE:
LXI D,MESS4
MVI C,09
CALL MONITOR
MVI C,01
CALL MONITOR
JMP REBOOT
SELDISK:
LXI D,01BH
LHLD JUMPTAB
DAD D
JMP SYST
SETDMA:
LXI D,24H
LHLD JUMPTAB
DAD D
JMP SYST
SETSEC:
LXI D,21H
LHLD JUMPTAB
DAD D
JMP SYST
WRITE:
LXI D,2AH
LHLD JUMPTAB
DAD D
JMP SYST
ERR:
POP H ;GET RID OF STACK RETURN
LXI D,WRITERR
ERR1:
MVI C,9
CALL MONITOR
LDA ERRORS
INR A
CPI 10
STA ERRORS
JNZ INITIAL
LXI D,GIVEUP
MVI C,9
CALL MONITOR
REBOOT:
;RESTORE CBIOS JUMP TO ERROR RECOVERY
LHLD JUMPTAB
LXI D,2EH
DAD D
LDA OLDL
MOV M,A
INX H
LDA OLDH
MOV M,A
WARMBT:
; FIND OLD PORT INFO AND DISABLE FORMATTING
LDA SAVEPORT
STA PORT
;RESTORE DENSITY
LDA SAVEDENS
STA DENSITY
JMP 0000
SYST:
PCHL ;GO TO CBIOS
OLDL: DB 0
OLDH: DB 0
DENS: DB 0
SAVEPORT: DB 0
SAVEDENS: DB 0
JUMPTAB: DW 0000
E5TABLE: DW 0000
ERRORS: DB 0
SECTORS: DB 0
ID: DB 0
TRK: DB 0
DB 0
SECT: DB 0
DB 0
ECODE: DB 01
FINISH: DB 0
MESS0: DW 0D0AH
IF DSC2
DB 'DISKETTE FORMAT PROGRAM VERSION DSC4.1$'
ENDIF
;
IF NOT DSC2
DB 'DISKETTE FORMAT PROGRAM VERSION 4.1$'
ENDIF
;
MESS1: DW 0D0AH
DB 'WHICH DRIVE DO YOU WANT TO FORMAT? $'
MESS2: DW 0D0AH
DB 'PUT DISKETTE TO BE INITIALIZED IN DRIVE '
DRV: DB 0
DB '$'
MESS3: DW 0D0AH
DB 'SINGLE OR DOUBLE DENSITY $'
MESS4: DW 0D0AH
DB 'REBOOTING $'
FORMATERR:DW 0D0AH
DB 'HAVING TROUBLE FORMATING $'
WRITERR:DW 0D0AH
DB 'HAVING TROUBLE WRITING $'
GIVEUP: DW 0D0AH
DB 'CAN NOT DO IT $'
SINTAB: DB 1,2,3,4
DB 5,6,7,8
DB 9,10,11,12
DB 13,14,15,16
DB 17,18,19,20
DB 21,22,23,24
DB 25,26
DB 0FFH
DOBTAB: DB 1,30,2,31
DB 3,32,4,33
DB 5,34,6,35
DB 7,36,8,37
DB 9,38,10,39
DB 11,40,12,41
DB 13,42,14,43
DB 15,44,16,45
DB 17,46,18,47
DB 19,48,20,49
DB 21,50,22,51
DB 23,52,24,53
DB 25,54,26,55
DB 27,56,28,57
DB 29,58
DB 0FFH
TABLE2: DB 1,10,19,28
DB 37,46,55,6
DB 15,24,33,42
DB 51,2,11,20
DB 29,38,47,56
DB 7,16,25,34
DB 43,52,3,12
DB 21,30,39,48
DB 57,8,17,26
DB 35,44,53,4
DB 13,22,31,40
DB 49,58,9,18
DB 27,36,45,54
DB 5,14,23,32
DB 41,50
DB 0FFH
TABLE4: DB 1,19,37,55
DB 15,33,51,11
DB 29,47,7,25
DB 43,3,21,39
DB 57,17,35,53
DB 13,31,49,9
DB 27,45,5,23
DB 41,10,28,46
DB 6,24,42,2
DB 20,38,56,16
DB 34,52,12,30
DB 48,8,26,44
DB 4,22,40,58
DB 18,36,54,14
DB 32,50
DB 0FFH
WRITEBUF: DS 128D
INDEXAM: DB 0
BUFFER: DS 360D
END