mirror of
https://github.com/SEPPDROID/Digital-Research-Source-Code.git
synced 2025-10-25 01:14:21 +00:00
1 line
7.1 KiB
NASM
1 line
7.1 KiB
NASM
;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
|
||
|