Commodore CP/M v2.2 for the C64
Format Utility
;
; FORMAT UTILITY FOR COMMODORE 64 CP/M
;
; COPYRIGHT (C) 1982
; COMMODORE INTERNATIONAL
;
;
; EQUATES
;
BOOT EQU 0000H ;RESTART VECTOR
BDOS EQU 0005H ;BDOS ENTRY POINT
CMD EQU 0F900H ;COMMAND REGISTER
DATA EQU 0F901H ;STATUS REGISTER
SECTOR EQU 0F902H ;SECTOR REGISTER
TRACK EQU 0F903H ;TRACK REGISTER
DISKNO EQU 0F904H ;DISK NUMBER
BUFFER EQU 0F800H ;SECTOR BUFFER
VICWR EQU 1 ;WRITE COMMAND
VICFMT EQU 6 ;FORMAT COMMAND
OFF EQU 1 ;Z80 TURN-OFF DATA
MODESW EQU 0CE00H ;Z80 TURN-OFF ADDRESS
NIMAGE EQU 0400H ;NORMAL FORMAT DATA IMAGE
SIMAGE EQU 2000H ;SPECIAL FORMAT DATA IMAGE
;
;
ORG 0100H ;START OF TPA
;
LXI SP,STACK ;SET LOCAL STACK
LXI D,NAME
CALL PRINT ;PRINT TITLE MESSAGE
;
MVI A,0
STA DISKNO ;SELECT DRIVE 0
;
;
LOOP: LXI SP,STACK ;READJUST STACK POINTER
LXI D,INSMSG ;INSERT DISK MESSAGE
CALL PRINT
;
CIN: CALL CONIN ;GET NEXT KEYBOARD CHARACTER
CPI 0DH ;IS IT CARRIAGE RETURN?
JZ NORMAL ;NORMAL FORMAT
;
CPI 03H ;IS IT RUN/STOP KEY?
JZ BOOT
;
CPI '*' ;IS IT '*'?
JZ SPCL ;SPECIAL FORMAT
;
JMP CIN ;ELSE TRY AGAIN
;
NORMAL: CALL FORMAT ;DO 1540 FORMAT FIRST
LXI H,NIMAGE ;NORMAL FORMAT DATA STARTS HERE
CALL WRSYS ;WRITE SYSTEM TRACKS
JMP AGAIN
;
SPCL: CALL FORMAT ;DO 1540 FORMAT FIRST
LXI H,SIMAGE ;SPECIAL FORMAT DATA IS PLACED
CALL WRSYS ; HERE BY USER
;
AGAIN: LXI D,DONE ;REMOVE DISK MESSAGE
CALL PRINT
;
AGAIN0: LXI D,CONT ;PRESS SPACE MESSAGE
CALL PRINT
;
AGAIN1: CALL CONIN ;WAIT FOR SPACE BAR
CPI ' '
JNZ AGAIN1
;
JMP LOOP
;
FORMAT: LXI D,FMTMSG
CALL PRINT
;
MVI A,VICFMT ;FORMAT COMMAND
STA CMD
MVI A,OFF ;TURN OFF Z80
STA MODESW
NOP
LDA DATA ;DATA=0 IF OK
ANA A
JNZ ERROR
RET
;
WRSYS: MVI A,0 ;WRITE SYSTEM TRACKS
STA DISKNO
;
PUSH H ;SAVE POINT
MVI A,1
STA TRACK
;
MVI A,0
STA SECTOR
;
CALL WRSEC ;DO FAKE WRITE
POP H ;GET READY FOR REAL THING
;
MVI A,1
STA TRACK
;
MVI A,0
WRSYS1: STA SECTOR
;
CALL WRSEC
;
LDA SECTOR ;TRACK 1, SECTORS 0-4
INR A
CPI 5
JC WRSYS1 ;CY=1 IF A<5
;
MVI A,18
STA TRACK ;DIRECTORY TRACK
MVI A,0
WRSYS2: STA SECTOR
;
CALL WRSEC
;
LDA SECTOR ;TRACK 18, SECTORS 0-1
INR A
CPI 2
JC WRSYS2 ;CY=1 IF A<2
;
LXI H,BUFFER
MVI A,0E5H ;BLANK DIRECTORY DATA
WRDIR0: MOV M,A
INR L
JNZ WRDIR0 ;256 TIMES
;
MVI A,3
STA TRACK
MVI A,0
WRDIR1: STA SECTOR
MVI A,VICWR
STA CMP
MVI A,OFF
STA MODESW
NOP
LDA DATA
ANA A
JNZ ERROR
;
LDA SECTOR
INR A
CPI 8
JC WRDIR1 ;TRACK3,SECTORS 0-7
;
RET ;DONE WITH SYSTEM TRACKS
;
WRSEC: MVI D,BUFFER/256 ;DE POINTS TO SECTOR BUFFER
MVI E,0
;
WR1: MOV A,M ;GET NEXT DATA BYTE
STAX D ;PUT IN BUFFER
INX H ;NEXT DATA
INR E ;NEXT BUFFER
JNZ WR1 ;UNTIL E=0
;
MVI A,VICWR ;SET UP WRITE COMMAND
STA CMD
MVI A,OFF
STA MODESW
NOP
LDA DATA ;DATA=0 IF NO ERROR
ANA A
JNZ ERROR
RET
;
ERROR: LXI D,ERRMSG
CALL PRINT
;
JMP AGAIN0 ;WAIT FOR SPACE AND CONTINUE
;
PRINT:
MVI C,9 ;PRINT FUNCTION #
CALL BDOS
RET
;
CONIN: MVI C,6 ;DIRECT CONSOLE I/O #
MVI E,0FFH ;INPUT MODE
CALL BDOS
RET
;
;
; MESSAGES
;
NAME: DB 0DH,0DH,'Commodore 64 CP/M Format Utility 1.0'
DB 0DH,0DH,'$'
;
INSMSG: DB 'Insert disk to be formatted into ',0DH
DB ' drive A and close door.',0DH,0DH
DB 'Press RETURN key to format (or RUN/STOP',0DH
DB ' key to reboot system)',0DH,0DH,'$'
;
FMTMSG: DB 'FORMATTING DISKETTE. PLEASE WAIT...',0DH,0DH,'$'
;
ERRMSG: DB 'I cannot format this disk!',0DH,0DH,'$'
;
DONE: DB 'FORMAT complete. Please remove disk.',0DH,0DH,'$'
;
CONT: DB 'Press SPACEBAR to continue',0DH,0DH,'$'
DS 64 ;SPACE FOR STACK
STACK EQU $