/*+T*/ /*+M*/ /* RTOS DISK EDITOR FUER ATARI ST R.H. 12.05.1988 */ MODULE DISKEDIT; SYSTEM; TERMINAL:A1; PROBLEM; SPC TERMINAL DATION INOUT ALPHIC CONTROL(ALL); SPC ASSIGN ENTRY (DATION INOUT ALPHIC CONTROL(ALL) IDENT,CHAR(24)) GLOBAL; /* EXTRA ROUTINES, NOT USED AT THE MOMENT. JUST FOR YOUR CONVENIENCE */ SPC DOSVEC ENTRY GLOBAL; /* DO SET VECTOR OPERATION WITH V79 */ SPC SETDMA ENTRY (FIXED(31)) GLOBAL; /* SET DMA CONTROLLER */ SPC SUSPUT ENTRY(CHAR(6)) GLOBAL; /* SUSPEND USER TASK */ SPC CONTUT ENTRY(CHAR(6)) GLOBAL; /* CONTINUE USER TASK */ SPC SRCHMD ENTRY(CHAR(6)) RETURNS(FIXED(31)) GLOBAL;/* SEARCH MODUL */ SPC SRCHUT ENTRY(CHAR(6)) RETURNS(FIXED(31)) GLOBAL;/* SEARCH TASK */ SPC GETTSH ENTRY(CHAR(6)) RETURNS(FIXED(31)) GLOBAL;/* GET TASK HEADER*/ SPC GETVEC ENTRY(FIXED(15)) RETURNS(FIXED(31)) GLOBAL; SPC DESDRV ENTRY GLOBAL; /* DESELECT DRIVE + SIDE */ SPC IRESET ENTRY RETURNS(FIXED(15)) GLOBAL; /* RESET FDC WITH IRQ */ /**************************/ /* NECESSARY ASM-ROUTINES */ /**************************/ SPC RESET ENTRY GLOBAL; /* RESET FDC WITHOUT IRQ */ SPC FSTAT ENTRY RETURNS(FIXED(15)) GLOBAL; /* RETURNS FDC+DMA STATUS */ SPC SELDRV ENTRY(FIXED(15),FIXED(15)) GLOBAL; /* SELECT DRIVE+SIDE */ SPC SETVEC ENTRY(FIXED(15),FIXED(31)) RETURNS(FIXED(31)) GLOBAL; SPC SUSPST ENTRY(CHAR(6)) GLOBAL; /* SUSPEND SYSTEM TASK */ SPC CONTST ENTRY(CHAR(6)) GLOBAL; /* CONTINUE SYSTEM TASK */ /* DIESE ROUTINEN BEZIEHEN SICH AUF DEN DISK BUFFER ">BUFFER" (ANSPRECHBAR VON PEARL AUS UEBER ">PUFFER" */ SPC GETBUF ENTRY RETURNS(FIXED(31)) GLOBAL; /* GET BUFFER ADDRESS */ SPC CLRBUF ENTRY GLOBAL; /* CLEAR FLOPPY BUFFER */ SPC PUFFER() CHAR(1) GLOBAL; /* GLOBAL BUFFER FOR DISK OPERATION */ SPC DMAADR FIXED(31) GLOBAL; /* DMA ADR OF LAST OPERATION */ /* GET ADR OF NEW FLOPPY IRQ HANDLER: */ SPC GETIHD ENTRY RETURNS(FIXED(31)) GLOBAL; SPC SEEKT0 ENTRY RETURNS(FIXED(15)) GLOBAL; /* SEEK TRACK 0,RESTORE */ SPC SEEKTR ENTRY(FIXED(15)) RETURNS(FIXED(15)) GLOBAL;/* SEEK TRACK */ SPC SETTR ENTRY(FIXED(15)) GLOBAL; /* SET TRACK REGISTER */ SPC FDSTEP ENTRY RETURNS(FIXED(15)) GLOBAL; /* STEP FDC */ SPC FDSTIN ENTRY RETURNS(FIXED(15)) GLOBAL; /* STEP IN FDC */ SPC FDSTOU ENTRY RETURNS(FIXED(15)) GLOBAL; /* STEP OUT FDC */ SPC GETTR ENTRY RETURNS(FIXED(15)) GLOBAL; /* GET TRACK REGISTER */ SPC GETCT ENTRY RETURNS(FIXED(15)) GLOBAL; /* GET CURRENT TRACK */ SPC GETSEC ENTRY RETURNS(FIXED(15)) GLOBAL; /* GET SECTOR REGISTER */ SPC RSTRCK ENTRY(FIXED(31)) RETURNS(FIXED(15)) GLOBAL; /* READ TRACK */ /* READ SECTOR: */ SPC READSC ENTRY (FIXED(31),FIXED(15)) RETURNS(FIXED(15)) GLOBAL; /* READ MULTIPLE SECTORS: */ SPC READMS ENTRY (FIXED(31),FIXED(15)) RETURNS(FIXED(15)) GLOBAL; SPC WSTRCK ENTRY(FIXED(31)) RETURNS(FIXED(15)) GLOBAL; /* WRITE TRACK */ /* WRITE SECTOR: */ SPC WRITSC ENTRY (FIXED(31),FIXED(15),FIXED(15)) RETURNS(FIXED(15)) GLOBAL; /* WRITE MULTIPLE SECTORS: */ SPC WRITMS ENTRY (FIXED(31),FIXED(15),FIXED(15)) RETURNS(FIXED(15)) GLOBAL; /* READ ADDRESS FIELDS: */ SPC RDADR ENTRY(FIXED(31)) RETURNS(FIXED(15)) GLOBAL; /* VARIABLEN FUER DISK INTERRUPT ROUTINEN */ DCL (ERROR,TRACK,SECTOR,DATAMARK) FIXED(15) INIT(0,0,1,0); DCL (FDRIVE,FSIDE) FIXED(15) INIT(0,0); DCL (VECALT,VECNEU) FIXED(31); DCL VECNO FIXED(15) INIT(71); /* -> FLOPPY & DMA */ DCL BUFADR FIXED(31) INIT(0(31)); /* VERSIONSNUMMER, AKTUELL ALS CHAR(initlaenge) EINZUTRAGEN UND ZU INITIALISIEREN */ DCL VERSION CHAR(20) INIT('(C)1988 V1.0 '); /**************/ /* PROZEDUREN */ /**************/ SHOWADR: PROC; DCL W FIXED(15); PUT '*** ADDRESS FIELDS ' TO TERMINAL BY LIST,SKIP; PUT 'TRACK SIDE SECTR SIZE CRC1 CRC2 ',' -- ', 'TRACK SIDE SECTR SIZE CRC1 CRC2 ' TO TERMINAL BY LIST,LIST,LIST,SKIP; /* 32 ID FELDER GELESEN, BEI 128 BYTE/SEC SIND MAXIMAL 29 MOEGLICH */ FOR I FROM 1 TO 16 REPEAT FOR K FROM 1 TO 2 REPEAT FOR J FROM 1 TO 6 REPEAT W:= (I-1)*12 + (K-1)*6 + J; PUT '$',TOBIT(TOFIXED(PUFFER(W)) ),' ' TO TERMINAL BY LIST,B4(2),LIST; END; /* FOR J */ IF (K EQ 1) THEN PUT ' -- ' TO TERMINAL; FIN; END; /* FOR K */ PUT TO TERMINAL BY SKIP; END; /* FOR I */ END; /* PROC */ SHOWOPT: PROC; PUT '*** OPTIONS: ' TO TERMINAL BY LIST,SKIP; PUT ' (0) EXIT ' TO TERMINAL BY LIST,SKIP; PUT ' (1) SHOW PARAMETERS ' TO TERMINAL BY LIST,SKIP; PUT ' (2) SELECT FLOPPY DRIVE ',FDRIVE TO TERMINAL BY LIST,LIST,SKIP; PUT ' (3) SELECT FLOPPY SIDE ',FSIDE TO TERMINAL BY LIST,LIST,SKIP; PUT ' (4) SELECT TRACK ',TRACK TO TERMINAL BY LIST,LIST,SKIP; PUT ' (5) SELECT SECTOR ',SECTOR TO TERMINAL BY LIST,LIST,SKIP; PUT ' (6) SELECT DATAMARK(0=NORM,1=DEL)',DATAMARK TO TERMINAL BY LIST,LIST,SKIP; PUT ' (7) SHOW ADDR FIELDS FROM BUFFER ' TO TERMINAL BY LIST,SKIP; PUT ' (-) DMA ADDRESS ',TOBIT(DMAADR) TO TERMINAL BY LIST,B4,SKIP; PUT ' (-) BUFFER ADDRESS ',TOBIT(BUFADR) TO TERMINAL BY LIST,B4,SKIP; PUT ' (-) FDC TRACK $',TOBIT(GETTR), ' FDC SECTOR $',TOBIT(GETSEC) TO TERMINAL BY LIST,B4(2),LIST,B4(2),SKIP; PUT ' (-) DMA/FDC STATUS ',TOBIT(FSTAT) TO TERMINAL BY LIST,B4; END; /* PROC */ /* ERSTER TEIL DER MEISTEN FLOPPYROUTINEN */ FIRST: PROC(FBESCHR CHAR(40)); CALL ASSIGN(TERMINAL,'TY'); PUT FBESCHR TO TERMINAL BY LIST,SKIP; CALL SUSPST('#UHFaC'); VECNO = 71; /* DMA/FLOPPY */ VECNEU = GETIHD; /* GET ADDRESS OF NEW FLOPPY HANDLER */ VECALT:= SETVEC(VECNO,VECNEU); /* SET VEC TO NEW FLOPPY HANDLER */ CALL SELDRV(FDRIVE,FSIDE); CALL RESET; AFTER 1 SEC RESUME; END; /* PROC */ SETREADY: PROC; ERROR := SEEKT0; ERROR = SEEKTR(TRACK); BUFADR = GETBUF; PUT 'BUFADR = ', TOBIT(BUFADR) TO TERMINAL BY LIST,B4,SKIP; END; /* PROC */ SECOND:PROC; PUT 'RETURN STATUS: ',TOBIT(ERROR) TO TERMINAL BY LIST,B4,SKIP; VECNEU:= SETVEC(VECNO,VECALT); /* SET VEC TO UHFAC */ CALL CONTST('#UHFaC'); PUT '*** COMMAND FINISHED' TO TERMINAL BY LIST,SKIP; END; /* PROC */ /*********/ /* TASKS */ /*********/ /* ANZEIGE + MODIFIKATION DER DISKEDITOR PARAMETER */ DISKEDIT: TASK; DCL SELECT FIXED(15) INIT(1); CALL ASSIGN(TERMINAL,'TY'); PUT '*** RTOS DISK EDITOR PARAMETER CONFIGURATION ', VERSION TO TERMINAL BY LIST,LIST,SKIP; CALL SHOWOPT; WHILE (SELECT NE 0) REPEAT PUT '*** YOUR CHOICE : ' TO TERMINAL BY SKIP,LIST; GET SELECT FROM TERMINAL BY SKIP,LIST; PUT TO TERMINAL BY SKIP; CASE (SELECT+1) ALT /* 0 */ PUT '*** EXIT' TO TERMINAL BY LIST; ALT /* 1 */ CALL SHOWOPT; ALT /* 2 */ PUT ' SELECT FLOPPY DRIVE(0,1): ' TO TERMINAL BY LIST; GET FDRIVE FROM TERMINAL BY SKIP,LIST; ALT /* 3 */ PUT ' SELECT FLOPPY SIDE (0,1): ' TO TERMINAL BY LIST; GET FSIDE FROM TERMINAL BY SKIP,LIST; ALT /* 4 */ PUT ' SELECT TRACK (0..79) : ' TO TERMINAL BY LIST; GET TRACK FROM TERMINAL BY SKIP,LIST; ALT /* 5 */ PUT ' SELECT SECTOR (0..29) : ' TO TERMINAL BY LIST; GET SECTOR FROM TERMINAL BY SKIP,LIST; ALT /* 6 */ PUT ' SELECT DATAMARK(0=NORM,1=DEL) : ' TO TERMINAL BY LIST; GET DATAMARK FROM TERMINAL BY SKIP,LIST; ALT /* 7 */ CALL SHOWADR; OUT PUT ' NO VALID SELECTION' TO TERMINAL BY LIST; FIN; END; /* REPEAT */ PUT TO TERMINAL BY SKIP; END; /* TASK */ CLEARBUFFER: TASK; CALL ASSIGN (TERMINAL,'TY'); PUT '*** CLEAR BUFFER WITH $00' TO TERMINAL BY LIST,SKIP; CALL CLRBUF; PUT '*** COMMAND FINISHED' TO TERMINAL BY LIST,SKIP; END; /* TASK */ READADDRESS: TASK; CALL FIRST('*** READ ADDRESS FIELDS INTO BUFFER '); CALL SETREADY; ERROR = RDADR(BUFADR); CALL SECOND; END; /* TASK */ READTRACK: TASK; CALL FIRST('*** READ TRACK INTO BUFFER '); CALL SETREADY; CALL ASSIGN (TERMINAL,'TY'); ERROR = RSTRCK(BUFADR); CALL SECOND; END; /* TASK */ READSECTOR: TASK; CALL FIRST('*** READ SECTOR INTO BUFFER '); CALL SETREADY; ERROR = READSC(BUFADR,SECTOR); CALL SECOND; END; /* TASK */ READMSECTORS: TASK; CALL FIRST('*** READ MULTIPLE SECTORS INTO BUFFER '); CALL SETREADY; ERROR = READMS(BUFADR,SECTOR); CALL SECOND; END; /* TASK */ WRITETRACK: TASK; CALL FIRST('*** WRITE TRACK FROM BUFFER '); CALL SETREADY; ERROR = WSTRCK(BUFADR); CALL SECOND; END; /* TASK */ WRITESECTOR: TASK; CALL FIRST('*** WRITE SECTOR FROM BUFFER '); CALL SETREADY; ERROR = WRITSC(BUFADR,SECTOR,DATAMARK); CALL SECOND; END; /* TASK */ WRITEMSECTORS: TASK; CALL FIRST('*** WRITE MULTIPLE SECTORS FROM BUFFER '); CALL SETREADY; ERROR = WRITMS(BUFADR,SECTOR,DATAMARK); CALL SECOND; END; /* TASK */ GETCTRACK: TASK; CALL FIRST('*** GET CURRENT TRACK IN SECTOR-REGISTER'); /* NO TRACK SETTING, CURRENT TRACK IS WANTED */ ERROR = GETCT; CALL SECOND; END; /* TASK */ FSTEP: TASK; CALL FIRST('*** STEP FDC '); PUT 'TRACK BEFORE STEP: ',GETTR TO TERMINAL BY LIST,LIST,SKIP; ERROR:= FDSTEP; PUT 'TRACK AFTER STEP: ',GETTR TO TERMINAL BY LIST,LIST,SKIP; CALL SECOND; END; /* TASK */ FSTEPIN: TASK; CALL FIRST('*** STEP FDC IN '); PUT 'TRACK BEFORE STEP: ',GETTR TO TERMINAL BY LIST,LIST,SKIP; ERROR:= FDSTIN; PUT 'TRACK AFTER STEPIN: ',GETTR TO TERMINAL BY LIST,LIST,SKIP; CALL SECOND; END; /* TASK */ FSTEPOUT: TASK; CALL FIRST('*** STEP FDC IN '); PUT 'TRACK BEFORE STEPOUT: ',GETTR TO TERMINAL BY LIST,LIST,SKIP; ERROR:= FDSTOU; PUT 'TRACK AFTER STEPOUT: ',GETTR TO TERMINAL BY LIST,LIST,SKIP; CALL SECOND; END; /* TASK */ MODEND;