; ; 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 $