Percom Service#
General Information
Author: Carsten Strotmann
Language: ACTION!
Compiler/Interpreter: ACTION!
Published: 1991-2008
Tool to configure Percom Block Drives. This Tool can be used to test Disk integrity and to format all kind of different Disk Formats available for Atari Disk Drives.
![]() |
Download: PERCOM Service/PERCOM.ATR
Needs ACTION! Runtime package to compile a standalone Version. Disk with Source and compiled Version attached.
I wrote this Tool to configure the HDI 3 1/2" Disk drive designed by Erhard Pütz (aka FloppyDoc)
Changelog#
2008-01-13 disabled break key, custom error procedure, updated copyright
How to use#
Key | Description | |
---|---|---|
1 - 4 | Read Percom Block from D1: - D4: and update display | |
T | change number of Tracks per Disc | |
S | change number of Sectors per Track | |
A | change modulation (FM or MFM) | |
R | change stepping rate | |
D | toggle doublesided <-> singlesides | |
B | change Bytes per Sectors (normally 128 or 256) | |
V | change Drive active Flag / HD flag | |
CTRL+F | Format selected Disk in configured Format (CAUTION!!!) | |
CTRL+T | Read and Test all Sectors in configured Format, printing Status for each Sector | |
CTRL+S | configure Drive for Atari Single Density, single sided (SS/SD) | |
CTRL+M | configure Drive for Atari Medium Density, single sided (SS/MD), 1050 Format | |
CTRL+D | configure Drive for Atari Double Density, single sided (SS/DD) | |
CTRL+H | configure Drive for Atari High Density, single sided (SS/HD) | |
CTRL+Z | configure Drive for Atari Single Density, double sided (DS/SD) | |
CTRL+Y | configure Drive for Atari Medium Density, double sided (DS/MD), 1050 Format | |
CTRL+X | configure Drive for Atari Double Density, double sided (DS/DD) | |
CTRL+V | configure Drive for Atari High Density, double sided (DS/HD) |
Source#
Main Program#
;******************************** ;** ** ;** Phoenix SoftCrew ACTION! ** ;** ** ;** Carsten Strotmann ** ;** carsten@strotmann.de ** ;** ** ;** http://www.strotmann.de ** ;** ** ;******************************** ; Programname:Percom Haendler ; Programmer:CAS ; Filename:PERCOM.ACT ; first Version:18.08.91 ; last Change:13.01.08 ; Usage:Manage Floppy Percom Block ; ; INCLUDE "D:>WORK>SYSTEM.ACT" MODULE BYTE drivenum,err,p_read CARD maxsec,bytes BYTE ARRAY percom($C),buff($1000),txt(40), sdss(12)=[40 2 0 18 0 0 0 $80 0 0 0 0], sdds(12)=[40 2 0 18 1 0 0 $80 0 0 0 0], mdss(12)=[40 2 0 26 0 4 0 $80 0 0 0 0], mdds(12)=[40 2 0 26 1 4 0 $80 0 0 0 0], ddss(12)=[40 2 0 18 0 4 1 0 0 0 0 0], ddds(12)=[40 2 0 18 1 4 1 0 0 0 0 0], hdss(12)=[80 2 0 36 0 4 1 0 0 0 0 0], hdds(12)=[80 2 0 36 1 4 1 0 0 0 0 0] INCLUDE "D:>WORK>PERCOM1.INC" PROC PercError(BYTE err) ErrMess (err) RETURN PROC Read_Percom () err=Sio (drivenum,$52,$40,7,buff,128,1) err=Sio (drivenum,$4E,$40,7,percom,12,0) ErrMess (err) maxsec=percom(0)*(percom(2)*$100+percom(3)) maxsec==*(percom(4)+1) bytes =percom(6)*$100+percom(7) p_read=err RETURN PROC Write_Percom () err=Sio (drivenum,$4F,$80,7,percom,12,0) ErrMess (err) RETURN PROC Format () Write (20,10," Formatting ") err=Sio (drivenum,$21,$40,$40,buff,bytes,1) ErrMess (err) Write (20,10," ") RETURN PROC Test() BYTE ARRAY t(8) BYTE ch=$2FC,consol=$D01F CARD u,b,s Write (18,11,"Test Sector :") u=0 SCopy (t,"000000") DO u==+1 IF u<4 THEN b=$80 ELSE b=bytes FI err=Sio (drivenum,$52,$40,$7,buff,b,u) t(6) == +1 FOR s = 2 TO 6 DO IF t(s) > '9 THEN t(s) = '0 t(s-1) == +1 FI OD Write (32,11,t) IF err # 1 THEN ErrMess (err) FI UNTIL u=maxsec OR ch=28 or consol=6 OD Pause (200) ch=$FF Write (18,11," ") RETURN PROC Mask () BYTE lmarg=82 CARD savmsc=$58 lmarg=0 SetBlock (savmsc+120,240,0) Position (0,0) Print (" PhoeniX SoftCrew Percom Service 1.1 ") Position (1,2) Print ("Drive # ") Position (1,3) Print ("Sectors :") Position (20,3) Print ("KBytes :") Position (1,5) Print ("Tracks :") Position (18,5) Print ("Steprate :") Position (1,6) Print ("Sectors :") Position (18,6) Print ("Doubleside :") Position (1,7) Print ("Modulat.:") Position (18,7) Print ("Bytes p. Sector :") Position (1,8) Print ("Drive active :") Position (1,10) Print ("^Format ") Position (1,11) Print ("^Test Disc ") Position (1,13) Print ("^Single Density 1S") Position (23,13) Print ("^Z Sgl. Dens. 2S") Position (1,14) Print ("^Medium Density 1S") Position (23,14) Print ("^Y Med. Dens. 2S") Position (1,15) Print ("^Double Density 1S") Position (23,15) Print ("^X Dbl. Dens. 2S") Position (1,16) Print ("^High Density 1S") Position (23,16) Print ("^V Hgh. Dens. 2S") Write (0,23," (c) 1991-06 PhoeniX SoftCrew ") RETURN PROC Fill_Mask () CARD c Mask () Position (13,2) PrintB (drivenum) Position (13,3) PrintC (maxsec) Position (30,3) c=$400/bytes PrintC (maxsec/c) Position (11,5) PrintB (percom(0)) Position (35,5) PrintB (percom(1)) Position (11,6) c=percom(2)*$100+percom(3) PrintC (c) Position (35,6) IF percom(4)=1 THEN Print ("Yes ") ELSE Print ("No ") FI Position (11,7) IF percom(5)=0 THEN Print ("FM ") FI IF percom(5)=4 THEN Print ("MFM") FI Position (35,7) c=percom(6)*$100+percom(7) PrintC (c) Position (18,8) IF percom(8)=$FF THEN Print ("Normal") FI IF percom(8)=$40 THEN Print ("HD ") FI RETURN PROC Refresh () Write_Percom () Read_Percom () Fill_Mask () RETURN PROC Test_Form () BYTE skstat=$D20F IF (skstat & 8) = 0 THEN Format () FI RETURN PROC Percom_Service () BYTE key BYTE ARRAY value (3) CARD temperr BreakOff() temperr = Error Error = PercError drivenum = 1 p_read=$FF MoveBlock (percom,sdss,12) Put (125) C_Off () Mask () DO key=Inkey () IF key<'5 AND key>'0 THEN drivenum=key-48 Read_Percom () Refresh () FI IF key='T OR key='t THEN StrB (percom(0),value) Position (11,5) GetIn (value,2) percom(0)=ValB(value) Refresh () FI IF key='R OR key='r THEN StrB (percom(1),value) Position (35,5) GetIn (value,2) percom(1)=ValB(value) Refresh () FI IF key='S OR key='s THEN StrC (percom(2)*$100+percom(3),value) Position (11,6) GetIn (value,5) percom(2)=ValC(value)/$100 percom(3)=ValB(value) Refresh () FI IF key='D or key='d THEN percom(4)==XOR 1 Refresh () FI IF key='A or key='a THEN percom(5)==XOR 4 Refresh () FI IF key='B OR key='b THEN StrC (percom(6)*$100+percom(7),value) Position (35,7) GetIn (value,4) percom(6)=ValC(value)/$100 percom(7)=ValB(value) Refresh () FI IF key='V or Key='v THEN IF percom(8)=$FF THEN percom(8)=$40 ELSE percom(8)=$FF FI Refresh () FI IF key>='! AND key<='$ THEN drivenum=key-32 Refresh () FI IF key=' THEN Read_Percom () Fill_Mask () Test () FI IF key=' THEN MoveBlock (percom,sdss,12) Refresh () Test_Form () FI IF key=' THEN MoveBlock (percom,sdds,12) Refresh () Test_Form () FI IF key=' THEN MoveBlock (percom,mdss,12) Refresh () Test_Form () FI IF key=' THEN MoveBlock (percom,mdds,12) Refresh () Test_Form () FI IF key=' THEN MoveBlock (percom,ddss,12) Refresh () Test_Form () FI IF key=' THEN MoveBlock (percom,ddds,12) Refresh () Test_Form () FI IF key=' THEN MoveBlock (percom,hdss,12) Refresh () Test_Form () FI IF key=' THEN MoveBlock (percom,hdds,12) Refresh () Test_Form () FI IF key=' THEN Format () FI UNTIL key='q OR key='Q or key=27 OD C_On () Error = temperr BreakOn() RETURN
Percom Tool Include Library#
; Includedatei fuer PERCOM.ACT ;--- PROC siov=$E459 () BYTE FUNC Sio (BYTE num,comnd,stats,tim,CARD buf,byt,sec) BYTE ddevic=$300, dunit=$301, dcomnd=$302, dstats=$303, dtimlo=$306 CARD dbuf=$304, dbyt=$308, daux=$30A ddevic=$31 dunit=num dcomnd=comnd dstats=stats dtimlo=tim dbuf=buf dbyt=byt daux=sec siov () ; ansprung der sioroutine RETURN (dstats) ;--- PROC C_On () BYTE crsin=752 crsin=0 RETURN PROC C_Off () BYTE crsin=752 crsin=1 RETURN BYTE FUNC Inkey () BYTE atascii Close (2) Open (2,"K:",4,0) atascii=GetD(2) Close(2) RETURN (atascii) PROC Pause (CARD times) BYTE wsync=$14,q CARD u FOR u=1 TO times DO FOR q=1 TO 200 DO wsync=q OD OD RETURN PROC Beep (BYTE times) BYTE u FOR u= 1 TO times DO PutD (0,253) Pause (10) OD RETURN PROC Getin (BYTE ARRAY text,BYTE len) BYTE ascii,pos,u,inv,ch=764 C_On () ch=$FF pos=text(0)+1 inv=0 IF text(0)#0 THEN Print (text) FI DO ascii=Inkey () IF ascii=129 THEN inv==!$80 FI IF ascii=$1E AND pos>1 THEN pos==-1 PutD (0,$1E) FI IF ascii=$7E AND pos>1 THEN pos==-1 PutD (0,$7E) FI IF ascii=$1F AND pos#len+1 THEN pos==+1 PutD (0,$1F) FI IF ascii>26 AND ascii<32 THEN ascii=128 FI IF pos#len+1 AND ascii<$7E THEN ascii==+inv PutD (0,ascii) text(pos)=ascii pos==+1 FI text(0)=pos-1 UNTIL ascii=$9B OD C_Off () Put (31) RETURN PROC Write (BYTE x,y,BYTE ARRAY string) BYTE u,chr CARD savmsc=$58 BYTE POINTER adr adr=savmsc+y*40+x FOR u=1 TO string(0) DO chr=string(u) IF chr>=0 AND chr<32 THEN chr==+64 ELSEIF chr>31 AND chr<95 THEN chr==-32 ELSEIF chr>127 AND chr<160 THEN chr==+64 ELSEiF chr>159 AND chr<224 THEN chr==-32 FI adr^=chr adr==+1 OD RETURN ;----------------------------------- PROC ErrMess (BYTE err) Write (10,20,"Status - ") StrB(err,txt) Write (20,20," ") Write (20,20,txt) IF err>$7F THEN Write (25,20," ERROR ") ELSE Write (25,20,"OK ") FI RETURN PROC BreakOff() BYTE POKMSK = $10 BYTE IRQEN = $D20E POKMSK ==& $7F IRQEN ==& $7F RETURN PROC BreakOn() BYTE POKMSK = $10 BYTE IRQEN = $D20E POKMSK ==% $80 IRQEN ==% $80 RETURN