Files
Sepp J Morris 31738079c4 Upload
Digital Research
2020-11-06 18:50:37 +01:00

1 line
7.1 KiB
NASM
Raw Permalink 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