|
DataMuseum.dkPresents historical artifacts from the history of: CP/M |
This is an automatic "excavation" of a thematic subset of
See our Wiki for more about CP/M Excavated with: AutoArchaeologist - Free & Open Source Software. |
top - download
Length: 19968 (0x4e00) Types: TextFile Names: »GETPUTF.ASM«
└─⟦1f6b46325⟧ Bits:30004393 CP/M-80 rel. 1 Utilities source disk └─ ⟦this⟧ »GETPUTF.ASM«
TITLE 'MINI FLOPPY DISK SYSTEM GETPUT UTILITY' PAGE 43 ;****************************************************************************** ; CHRISTIAN ROVSING A/S FLOPPY SYSTEM GENERATION PROGRAM ;****************************************************************************** ; ; ; MINI FLOPPY DISK CP/M SYSTEM FETCHING AND PLACEMENT PROGRAM FOR ; USE WITH CP/M 2.2 ON A TANDON 96 TPI 5 1/4 INCH MINIFLOPPY DISK ; DRIVE. THE CP/M DISK DRIVE CONFIGURATION MAPS LOGICAL DRIVES A: AND B: ; TO PHYSICAL UNITS 0 AND 1. THIS MAPPING MAKES 604K BYTES OF DATA ; STORAGE AVAILABLE TO EACH LOGICAL DRIVE. THIS SYSTEM UTILITY PROGRAM ; PERMITS READING THE CP/M SYSTEM TRACKS INTO MEMORY OR WRITING THE ; SYSTEM TRACKS FROM MEMORY TO DISK. BOTH MINI DISK DRIVES CAN BE ; ACCESSEED IN A SIMILAR FASHION TO PERMIT SYSTEM TRACK BACKUP FROM ; DISKETTE TO DISKETTE.TRACKS 0 AND 1 ARE RESERVED FOR THIS PURPOSE. ; ; THE GETPUT PROGRAM PLACES THE SYSTEM IMAGE INTO MEMORY STARTING ; AT ADDRESS 03480H. THIS ADDRESS IS CHOSEN FOR THE FOLLOWING ; REASONS. ; ; 1) PLACING IMAGE THIS HIGH ALLOWS THERE TO BE PLENTY ; OF ROOM BELOW THE IMAGE TO LOAD DDT WITHOUT ; CAUSING OVELAY OF THE SYSTEM IMAGE. ; PAGE ; ; COMMAND OPTIONS OF THE MINI FLOPPY DISK GET/PUT PROGRAM INCLUDE THE ; FOLLOWING OPTIONS: ; ; A) GET A SYSTEM IMAGE FROM A SPECIFIC MINI DISK ; LOGICAL DRIVE A: OR B:. ; ; B) PUT A SYSTEM IMAGE TO A SPECIFIC MINI DISK ; LOGICAL DRIVE A: OR B:. ; ; C) MODIFY MEMORY LOCATIONS FOR SPECIAL PURPOSE ; PATCHING OPERATIONS UPON THE SYSTEM IMAGE. THIS ; FEATURE ALLOWS FIELD MODIFICATION OF CERTAIN ; MINI FLOPPY DISK CP/M PARAMETERS AS MAY BE MADE ; AVAILABLE FROM TIME TO TIME. ; ; PAGE ;****************************************************************************** ; ; ;GENERAL EQUATES ; CR EQU 0DH ;CARRIAGE RETURN CODE LF EQU 0AH ;LINE FEED CODE BS EQU 08H ;BACK SPACE CODE BEL EQU 07H ;BELL RING CODE ESC EQU 01BH ;ESCAPE CODE TRUE EQU 0FFFFH ;TRUE CODE FALSE EQU NOT TRUE ;FALSE CODE ; ; FRPT EQU 08H ;NUMBER OF 512 BYTE FLOPPY RECORDS PER ;TRACK. (NOTE THAT REALLY 256 BYTE SECTOR ;PAIRS). ISIZE EQU FRPT*2 ;GETPUT READS ENTIRE TWO SYSTEM TRACKS IBUF EQU 03480H ;MEMORY ADDRESS FOR BASE OF GET/PUT ;SYSTEM IMAGE BUFFER SECSIZ EQU 512 ;SIMULATED HOST PHYSICAL SECTOR SIZE MAXMINI EQU 01H ;PHYSICAL ADDRESS OF MAX MINI DRIVE ; ; ; COMPEN EQU 080H ;WRITE COMPENSATION ENABLE MINIEN EQU 040H ;MINI DRIVE ENABLE DENSEL EQU 020H ;BIT MASK FOR DENSITY SELECT ; PAGE ; ;DEFINE MEMORY BASED I/O MODULE ENTRY POINTS ; MODBASE EQU 0F800H ;SET JUMP TABLE EQUIVALENT ADDRESSES ; INITSER EQU MODBASE+00 ;HARDWARE INITIALIZE ; ;(NO PARAMETERS) SETCBAUD EQU MODBASE+03 ;SET CONSOLE I/O BAUD RATE FACTOR ; ;(HL) = COUNTER TIMER PARAMETER VALUE SETLBAUD EQU MODBASE+06 ;SET LINE PRINTER I/O BAUD RATE FACTOR ; ;(HL) = COUNTER TIMER VALUE SETLRMSK EQU MODBASE+09 ;SET LINE PRINTER SIO RECEIVER MASK VALUE ; ;(A) = LINE PRINTER SIO MASK BYTE SETLRVAL EQU MODBASE+012 ;SET LINE PRINTER SIO RECEIVER POLL VALUE ; ;(A) = LINE PRINTER POLL VALUE SETLTMSK EQU MODBASE+015 ;SET LINE PRINTER SIO TRANSMITTER MASK VALUE ; ;(A) = LINE PRINTER SIO MASK BYTE SETLTVAL EQU MODBASE+018 ;SET LINE PRINTER SIO TRANSMITTER POLL VALUE ; ;(A) = LINE PRINTER SIO POLL VALUE BYTE CONSTAT EQU MODBASE+021 ;GET CONSOLE STATUS ; ;RETURN (A)=00 FOR NOT READY INPUT ; ; (A)=FF FOR READY INPUT CONIN EQU MODBASE+024 ;GO GET CONSOLE INPUT CHARACTER ; ;(A)=INPUT CONSOLE CHARACTER CONOUT EQU MODBASE+027 ;PUT OUT CONSOLE CHAR ; ;(C)=CHARACTER TO OUTPUT LPTSTAT EQU MODBASE+030 ;GET LINE PRINTER STATUS ; ;RETURN (A)=00 FOR NOT NEXT OUTPUT ; ; (A)=FF FOR READY OUTPUT LPTIN EQU MODBASE+033 ;GO GET LINE PRINTER INPUT CHARACTER ; ;(A)=INPUT LPT SERIAL PORT CHARACTER LPTOUT EQU MODBASE+036 ;PUT OUT LINE PRINTER CHARACTER ; ;(C)=LPT SERIAL OUTPUT CHARACTER HUNIT EQU MODBASE+039 ;SELECT HARD DISK UNIT NUMBER ; ;(C)=UNIT NUMBER ON MSC 9205 CONTROLLER HPLAT EQU MODBASE+042 ;SELECT HARD DISK PLATTER (HEAD) NUMBER ; ;(C)=HEAD SELECT NUMBER HSURF EQU MODBASE+045 ;SELECT HARD DISK SURFACE(HEAD 2^2) NUMBER ; ;(C)=MSB OF HEAD NUMBER HCYL EQU MODBASE+048 ;SELECT HARD DISK CYLINDER NUMBER ; ;(BC)=CYLINDER NUMBER HREC EQU MODBASE+051 ;SELECT HARD DISK RECORD NUMBER ; ;(C)=RECORD NUMBER HCNT EQU MODBASE+054 ;SELECT HARD DISK SECTOR COUNT ; ;(C)=RECORD COUNT HBADDR EQU MODBASE+057 ;SET 9205 CONTROLLER DMA ADDRESS ; ;(BC)=16 BIT DATA BUFFER ADDRESS HREST EQU MODBASE+060 ;RESTORE SELECTED HARD DISK UNIT ; ;(A) RETURNS ERROR CODE HREAD EQU MODBASE+063 ;READ SELECTED SECTOR(S) ; ;(A) RETURNS ERROR CODE HVERF EQU MODBASE+066 ;VERIFY SELECTED SECTOR(S) ; ;(A) RETURNS ERROR CODE HWRIT EQU MODBASE+069 ;WRITE SELECTED SECTOR(S); ; ;(A) RETURNS ERROR CODE HEXEC EQU MODBASE+072 ;EXECUTE SPECIAL COMMAND OF MSC 9205 ; ;(C) ENTRY WITH MSC 9205 COMMAND ; ;(A) RETURNS ERROR CODE HRESET EQU MODBASE+075 ;RESET HARD DISK CONTROLLER MSC 9205 ; ;NO PARAMETERS MUNIT EQU MODBASE+078 ;SELECT MINI FLOPPY UNIT NUMBER ; ;(C)=FLOPPY PHYSICAL UNIT NUMBER MSURF EQU MODBASE+081 ;SELECT MINI FLOPPY SURFACE(HEAD) NUMBER ; ;(C)=FLOPPY SIDE NUMBER MCYL EQU MODBASE+084 ;SELECT MINI FLOPPY CYLINDER(TRACK) NUMBER ; ;(C)=FLOPPY TRACK NUMBER MREC EQU MODBASE+087 ;SELECT MINI FLOPPY RECORD NUMBER ; ;(C)=FLOPPY SECTOR NUMBER MCNT EQU MODBASE+090 ;SELECT MINI FLOPPY PHYSICAL SECTOR COUNT ; ;(C)=MINI FLOPPY SECTOR COUNT MSIZE EQU MODBASE+093 ;SELECT FLOPPY SECTOR SIZE (00)=256 BYTES ; ;(C)=MINI FLOPPY TRACK NUMBER MBADDR EQU MODBASE+096 ;SET FLOPPY DISK DATA BUFFER ADDRESS ; ;(BC)=FLOPPY BUFFER ADDRESS MREST EQU MODBASE+099 ;RESTORE SELECTED MINI FLOPPY UNIT ; ;(A)=RETURNS ERROR STATUS MVERF EQU MODBASE+102 ;VERIFY (READ) SELECTED SECTOR ; ;(A)=RETURNS STATUS MWRIT EQU MODBASE+105 ;WRITE SELECTED SECTOR ; ;(A)=RETURNED STATUS MREAD EQU MODBASE+108 ;READ SELECTED SECTOR ; ;(A)=RETURNED STATUS MWTRK EQU MODBASE+111 ;WRITE SELECTED FLOPPY TRACK ; ;(A)=RETURNED STATUS MMODE EQU MODBASE+114 ;SET FLOPPY OPERATION MODE ; ;(C)=STANDARD MODE DEFINITION MINST EQU MODBASE+117 ;FETCH CURRENT INSTRUCTION CODE ; ;(A)=RETURNED INSTRUCTION PATTERN MMOFF EQU MODBASE+120 ;CHECK MINI FLOPPY MOTOR ON COUNT ; ;OUT TIMER ; PAGE ;****************************************************************************** ; ;SET START OF PROGRAM CP/M TRANSIENT PROGRAM AREA ; ORG 0100H ; DI ;DON'T ALLOW INTERRUPTS HERE JMP START ; ; ;CP/M CONSOLE I/O INTERFACE ENTRY ROUTINES ; ; DIRECT CALLS TO THE BIOS ARE DONE ; VECTAB EQU 0001H ;LOCATION IN MEMORY CONTAINING ;WARM BOOT VECTOR CSTOFF EQU 0003H ;CONSOLE STAT OFFSET FROM WBOOT CINOFF EQU 0006H ;CONSOLE INPUT OFFSET FROM WBOOT COTOFF EQU 0009H ;CONSOLE OUTPUT OFFSET FROM WBOOT ; PAGE ; ;CONSOLE INPUT ROUTINE (RETURNS CHARACTER IN A REGISTER) ; CI: PUSH H ;SAVE REGISTERS PUSH D PUSH B LHLD VECTAB ;GET POINTER BASE LXI D,CINOFF ;GET OFFSET VALUE DAD D LXI D,CI1 ;PUT A RETURN BACK ONTO STACK PUSH D PCHL ;GO TO BIOS ROUTINE CI1: POP B POP D ;RESTORE CALLERS REGS POP H RET ; ; ;CONSOLE OUTPUT ROUTINE (OUTPUT CHARACTER FROM C REG) ; CO: PUSH H ;SAVE REGISTERS PUSH D PUSH B LHLD VECTAB ;GET POINTER BASE LXI D,COTOFF ;GET OFFSET VALUE DAD D LXI D,CO1 ;PUT A RETURN BACK ONTO STACK PUSH D PCHL ;GO TO BIOS ROUTINE CO1: POP B POP D ;RESTORE CALLERS REGS POP H RET ; PAGE ; ;CONSOLE TERMINAL STATUS ROUTINE ; RETURNS A=00 IF NO CHARACTER PRESENT ; RETURNS A=FF IF CHARACTER PRESENT ; CSTS: PUSH H ;SAVE REGISTERS PUSH D PUSH B LHLD VECTAB ;GET POINTER BASE LXI D,CSTOFF ;GET OFFSET VALUE DAD D LXI D,CSTS1 ;PUT A RETURN BACK ONTO STACK PUSH D PCHL ;GO TO BIOS ROUTINE CSTS1: POP B POP D ;RESTORE CALLERS REGS POP H RET ; ; ;COMPARE DOUBLE REGISTER PAIRS (DE) TO (HL) AND RETURN ;FLAGS SIMILAR TO STANDARD CMP B INSTRUCTION. IE (A) CORRESPONDS ;TO (DE) AND (B) CORRESPONDS TO (HL). ; CDEHL: MOV A,D ;CHECK HIGH BYTES FIRST CMP H RNZ ;RETURN IF HIGH BYTES SET FLAGS MOV A,E CMP L ;CHECK LOW BYTES RET ; PAGE ;****************************************************************************** ; ; BEGIN EXECUTION OF GET/PUT PROGRAM HERE ; START: LXI SP,STCKK ;MAKE OURSELVES A STACK ; SIGNON: ;SEND HELLO TO CRT CALL CRLF CALL CRLF LXI D,STRMSG CALL CRTMS JMP MONITOR ;GO TO MONITOR ROUTINE ; ; ;SIGNON MESSAGE FOR GET/PUT PROGRAM ; STRMSG: ; DB ESC,'Æ7m' ;REVERSE FAINT RENDITION ; DB 'CHRISTIAN ROVSING A/S - MINI FLOPPY SYSTEM GENERATION',CR,LF DB 'UTILITY FOR TANDON TM-100 5 1/4 INCH MINIFLOPPY DRIVE',CR,LF ; DB ESC,'Æm' ;BACK TO NORMAL RENDITION DB CR,LF,CR,LF,'#' ; PAGE ;****************************************************************************** ; ; MONITOR: LXI D,PRMSG ;PRINT OUT THE COMMAND PROMPT ;MESSAGE SO THEY KNOW WHAT TO DO CALL CRTMS PROMPT: LXI SP,STCKK ;RE INIT STACK IF BACK FROM ERROR LXI D,PRMSG1 ;PRINT OUT PROMPT CALL CRTMS ; CALL CECHO ;GET OPERATOR ENTRY COMMAND CPI ' ' JZ MONITOR ;REDO COMMAND LINE PROMPT IF SPACE ; ANI 05FH ;CONVERT TO UPPER CASE CPI 'G' JZ GET ;TO ROUTINE TO GET SYSTEM IMAGE CPI 'P' JZ PUT ;TO ROUTINE TO PUT SYSTEM IMAGE CPI 'M' JZ MEM ;TO ROUTINE FOR MEMORY DISPLAY/ALTER CPI 'C'-040H JZ GPXIT ;TO GET/PUT EXIT POINT ; MVI C,'?' ;UNKNOWN COMMAND CALL CO CALL CRLF JMP PROMPT ;BACK TO PROMPT IF BAD COMMAND ; ; PRMSG: DB 'SELECT COMMAND',CR,LF DB ' G) GET SYSTEM IMAGE P) PUT SYSTEM IMAGE',CR,LF DB ' M) MEMORY PATCH CTL-C) WARM BOOT CP/M',CR,LF,'#' PRMSG1: DB CR,LF,'---->','#' ; PAGE ; ;OPERATOR SELECTED THE EXIT ROUTINE VIA CTL-C ; GPXIT: CALL CRLF JMP 0000H ;OFF TO THE WARM BOOT ; ; ; ;****************************************************************************** ; ; GENERAL PURPOSE I/O SUBROUTINES ; ; CRLF: ;ROUTINE TO DO CONSOL CR AND LF MVI C,CR CALL CO MVI C,LF CALL CO RET ; ; ; CECHO: ;ROUTINE TO GET AND ECHO A CHARACTER CALL CI MOV C,A PUSH PSW CALL CO POP PSW ANI 07FH ;GET RID OF PARITY RET ; PAGE ; NBL: ;ROUTINE TO CONVERT A BYTE TO A HEX NIBBLE SUI '0' RC ADI 0E9H RC ADI 06H JP NIO ADI 07H RC NIO: ADI 10 ORA A RET ; ; BYTEC: ;ROUTINE TO GET A HEX BYTE IN A CALL CECHO ;GET CHARACTER BYTC1: CALL NBL ;CONVERT TO HEX JC ERRR ;TO ERROR ROUTINE RLC RLC RLC RLC PUSH PSW ;SAVE 1ST ENTRY CALL CECHO ;GET 2ND CHARACTER CALL NBL ;CONVERT IT TO HEX JC ERRR POP B ;RECOVER 1ST RESULT ORA B ;COMBINE WITH 2ND RET ; ; CONI: ;ROUTINE TO GET A 1 BYTE PARAMETER PUSH B CALL BYTEC POP B RET ; PAGE ; PARAM: ;ROUTINE TO INPUT 4 HEX CHARACTERS LXI H,0 PARM1: CALL CECHO ;GET INPUT CPI 0DH ;LOOK FOR RETURN RZ DAD H DAD H DAD H DAD H JC ERRR CALL NBL ;CONVERT ENTRY TO HEX JC ERRR ORA L MOV L,A JMP PARM1 ;GO FOR NEXT CHARACTER ; ; HLCO: ;PRINT CRLF AND CONTENTS OF (HL) CALL CRLF HLCO1: ;ROUTINE TO PRINT CONTENTS OF (HL) MOV A,H CALL BYTEO MOV A,L CALL BYTEO RET ; ; DSPYM: ;DISPLAYS MEMORY BYTE POINTED TO BY (HL) CALL HLCO ;PRINT ADDRESS MVI C,'=' CALL CO MOV A,M CALL BYTEO ;PRINT ADDRESS CONTENTS MVI C,' ' CALL CO ;PRINT OUT SPACE RET ; PAGE ; BYTEO: ;ROUTINE TO OUTPUT A HEX BYTE TO THE CONSOLE PUSH PSW CALL BYTO1 MOV C,A CALL CO POP PSW CALL BYTO2 MOV C,A CALL CO RET ; BYTO1: RRC RRC RRC RRC BYTO2: ANI 0FH CPI 0AH JM BYTO3 ADI 07H BYTO3: ADI 030H RET ; ; ; ERRR: ;ERROR ON ENTRY OF OPERATOR PARAMETERS MVI C,'?' ;OUTPUT UNKNOWN PARAMETER CALL CO CALL CRLF JMP PROMPT ;GO TO PROMPT IF ERROR ; PAGE ;****************************************************************************** ; ;MEMORY DISPLAY ALTER ROUTINE TO ALLOW PATCHING OF MEMORY UNDER ;THE CONTROL OF THE GET/PUT PROGRAM. OPERATION AS FOLLOWS: ; ; SELECT A HEX MEMORY ADDRESS FOLLOWED BY CARRIAGE ; RETURN. MEMORY CURRENT CONTENTS AT THAT ADDRESS ; WILL BE PRINTED. CONTENTS CAN BE CHANGED BY ENTERING ; A VALID HEX BYTE VALUE. AS VALUE IS ACCEPTED, THE DISPLAY ; ADVANCES TO THE NEXT MEMORY ADDRESS. IF THE MEMORY LOCATION ; IS BAD AND CANNOT ACCEPT THE ENTERED VALUE AN "E" IS PRINTED ; TO THE RIGHT OF THE ENTERED VALUE TO INDICATE THE ERROR. ; ENTERING SPACE BAR WILL ADVANCE TO THE NEXT MEMORY LOCATION ; WITHOUT MODIFYING THE PRESENT MEMORY LOCATION. ENTRY OF THE ; UP ARROW "^" WILL BACKUP DISPLAY TO THE PREVIOUS MEMORY ; ADDRESS. CARRIAGE RETURN SENDS CONTROL BACK TO THE GET/PUT ; MONITOR PROMPT. ; MEM: LXI D,MEMMSG ;DISPLAY ALTER MESSAGE CALL CRTMS CALL PARAM ;GET ADDESS IN H & L MEM1: CALL DSPYM ;DISPLAY MEMORY BYTE CALL CECHO ;GET INPUT CHARACTER CPI '^' ;NEED TO BACK UP? JZ MEM10 CPI CR ;CHECK FOR CR EXIT JZ MEMEND CPI ' ' ;CHECK FOR NEXT CHARACTER JZ MEM9 CALL BYTC1 ;CONVERT THIS BYTE AND NEXT TO HEX MOV M,A ;STUFF IT IN MEMORY CMP M ;DID IT GO IN OK? JZ MEM9 MVI C,' ' ;NOPE SHOW'EM AN E FOR ERROR CALL CO MVI C,'E' CALL CO MEM9: INX H ;INCREMENT MEMORY ADDRESS JMP MEM1 MEM10: DCX H ;DECREMENT MEMORY ADDRESS JMP MEM1 MEMEND: JMP PROMPT ;RETURN TO MONITOR ; ; MEMMSG: DB 'EMORY ADDRESS (0000-FFFF) =','#' ; ; ;****************************************************************************** ; ; ;CRTMS - ROUTINE TO DISPLAY A MESSAGE ON THE CRT. REGISTERS D AND E ; CONTAIN THE MESSAGE POINTER. END OF MESSAGE IS INDICATED BY ; A "#" CHARACTER. ; ; CRTMS: ;ROUTINE PRINTS MESSAGE ON CRT LDAX D CPI '#' ;END MESSAGE MARKER RZ ;YES - RETURN MOV C,A CALL CO INX D JMP CRTMS ; PAGE ;****************************************************************************** ; ; GET SYSTEM IMAGE FROM OPERATOR SELECTED DRIVE INTO MEMORY ; AT ADDRESS OF THE IMAGE POSITION "IBUF" SET BY EQUATE AT ; THE BEGINNING OF THIS PROGRAM. ALL OF TRACKS 0 AND 1 ARE ; READ FOR MAXIMUM FLEXIBILITY. NOTE THAT THIS REQUIRES THAT ; 8K OF MEMORY MUST BE AVAILABLE ABOVE THE "IBUF" POSITION ; ; GET: CALL CRLF LXI D,GETMS ;PRINT GET UNIT SELECT MESSAGE CALL CRTMS CALL CECHO ;GET OPERATOR ENTRY ANI 05FH ;UPPERCASE SUI 'A' ;ZERO BASE SELECT CPI MAXMINI+1 ;CHECK IF TOO BIG JNC ERRR MOV C,A ;SELECT MINI UNIT CALL MUNIT MVI C,02H ;SET PAIRED SECTOR ACCESS CALL MCNT MVI C,00H ;SET SECTOR SIZE TO 256 BYTES CALL MSIZE ; CALL CRLF ;CLEAN UP DISPLAY ; CALL MREST ;RESTORE SELECTED UNIT ; MVI D,01H ;START WITH RECORD 1 LXI B,000H ;START WITH CYLINDER 0 LXI H,IBUF ;START OF BUFFER AREA MVI E,ISIZE ;NUMBER OF RECORDS DO GETLP: PUSH B ;SAVE CYL PUSH D ;SAVE RECORD NUMBER/REC COUNT PUSH H ;SAVE LOAD ADDRESS CALL MTRKTRAN ;TRANSLATE TRACK TO PHYS SIDE/TRACK POP B PUSH B ;GET LOAD ADRESS TO (BC) CALL MBADDR ;SET FLOPPY IOPB MOV C,D CALL MSECTRAN ;TRANSLATE SECTOR NUMBER CALL MREC ;SEND TO FLOPPY IOPB CALL MREAD ;GO TRY TO READ ; GSERR: POP H ;GET BACK LOAD ADDRESS POP D ;GET BACK REC / REC CNT POP B ;GET BACK CYL ; ORA A ;CHECK COMMAND COMPLETION STATUS JNZ REPERR ;GO TO REPORT ERROR ; PUSH B LXI B,SECSIZ ;GET ADDRESS INDEX DAD B ;(HL) HAS NEW LOAD ADDRESS POP B INR D ;SET FOR NEXT RECORD MOV A,D ;CHECK IF PAST END OF CYLINDER CPI FRPT+1 JNZ SAMTRK ;STILL ON SAME TRACK ; INX B ;INCREMENT CYLINDER NUMBER MVI D,01H ;RESET RECORD BACK FOR BEGINNING SAMTRK: DCR E ;SEE IF ALL SECTORS IN YET JNZ GETLP ;GO DO MORE IF NOT DONE YET ; LXI D,GETMS1 ;PRINT COMPLETE MESSAGE CALL CRTMS JMP PROMPT ;BACK TO PROMPT ; ; ; GETMS: DB 'SOURCE MINI FLOPPY DISK A: OR B: (A/B) ','#' GETMS1: DB 'SOURCE READ COMPLETE',CR,LF,'#' ; PAGE ; ;SHORT ROUTINE TO REPORT ERROR CODE ON OPERATION TO THE CONSOLE ;FOR A SIMPLE DEGREE OF FAULT ISOLATION. "STCHK" ERROR CODE IS REPORTED ; REPERR: PUSH PSW ;SAVE THE ERROR CODE LXI D,ERRMSG ;PRINT ERROR MESSAGE CALL CRTMS POP PSW CALL BYTEO ;OUTPUT ERROR CODE LXI D,ERRMS1 ;PRINT REST OF MESSAGE CALL CRTMS JMP PROMPT ; ; ERRMSG: DB CR,LF,LF,BEL,BEL,' *** MINI FLOPPY DISK I/O ERROR - CODE(','#' ; ERRMS1: DB ') ***',CR,LF,'#' ; ; PAGE ;****************************************************************************** ; ; PUT SYSTEM IMAGE TO OPERATOR SELECTED DRIVE FROM MEMORY ; AT ADDRESS OF THE IMAGE POSITION "IBUF" SET BY EQUATE AT ; THE BEGINNING OF THIS PROGRAM. ALL OF TRACKS 0 AND 1 ARE ; WRITTEN FOR MAXIMUM FLEXIBILITY. NOTE THAT THIS REQUIRES THAT ; 8K OF MEMORY BE AVAILABLE ABOVE THE "IBUF" POSITION ; ; PUT: CALL CRLF LXI D,PUTMS ;PRINT PUT UNIT SELECT MESSAGE CALL CRTMS CALL CECHO ;GET OPERATOR ENTRY ANI 05FH ;UPPERCASE SUI 'A' ;ZERO BASE SELECT CPI MAXMINI+1 ;CHECK IF TOO BIG JNC ERRR MOV C,A ;SELECT MINI UNIT CALL MUNIT MVI C,02H ;SET PAIRED SECTOR ACCESS CALL MCNT MVI C,00H ;SET SECTOR SIZE TO 256 BYTES CALL MSIZE ; CALL CRLF ;CLEAN UP DISPLAY ; CALL MREST ;RESTORE SELECTED UNIT ; MVI D,01H ;START WITH RECORD 1 LXI B,000H ;START WITH CYLINDER 0 LXI H,IBUF ;START OF BUFFER AREA MVI E,ISIZE ;NUMBER OF RECORDS DO PUTLP: PUSH B ;SAVE CYL PUSH D ;SAVE RECORD NUMBER/REC COUNT PUSH H ;SAVE LOAD ADDRESS CALL MTRKTRAN ;TRANSLATE TRACK TO PHYS SIDE/TRACK POP B PUSH B ;GET LOAD ADRESS TO (BC) CALL MBADDR ;SET FLOPPY IOPB MOV C,D CALL MSECTRAN ;TRANSLATE SECTOR NUMBER CALL MREC ;SEND TO FLOPPY IOPB CALL MWRIT ;GO TRY TO WRITE ; PSERR: POP H ;GET BACK WRITE ADDRESS POP D ;GET BACK REC / REC CNT POP B ;GET BACK CYL ; ORA A ;CHECK COMMAND COMPLETION STATUS JNZ REPERR ;GO TO REPORT ERROR ; PUSH B LXI B,SECSIZ ;GET ADDRESS INDEX DAD B ;(HL) HAS NEW LOAD ADDRESS POP B INR D ;SET FOR NEXT RECORD MOV A,D ;CHECK IF PAST END OF CYLINDER CPI FRPT+1 JNZ WSAMTK ;STILL ON SAME TRACK ; INX B ;INCREMENT CYLINDER NUMBER MVI D,01H ;SET RECORD BACK TO TRK START WSAMTK: DCR E ;SEE IF ALL SECTORS IN YET JNZ PUTLP ;GO DO MORE IF NOT DONE YET ; LXI D,PUTMS1 ;PRINT COMPLETE MESSAGE CALL CRTMS JMP PROMPT ;BACK TO PROMPT ; ; PUTMS: DB 'DESTINATION MINI FLOPPY DISK A: OR B: (A/B) ','#' PUTMS1: DB 'DESTINATION WRITE COMPLETE',CR,LF,'#' ; PAGE ;****************************************************************************** ; ; ;ROUTINE TO TRANSLATE LOGICAL MINI FLOPPY TRACK NUMBERS TO SIDE ;AND REAL TRACK NUMBER. ;(C)=LOGICAL TRACK NUMBER ON ENTRY ; MTRKTRAN: MOV A,C PUSH PSW ANI 01H ;FIND OUT WHAT THE SIDE NUMBER IS MOV C,A CALL MSURF ;SET MINI HEAD NUMBER POP PSW ORA A RAR ;DIVIDE TRACK BY 2 MOV C,A ;SEND PHYSICAL TRACK TO IOPB CALL MCYL RET ; ; ;ROUTINE TO PERFORM PAIRED LOGICAL TO PHYSICAL SECTOR ;TRANSLATION FOR MINI FLOPPY ;ENTRY SECTOR NUMBER IN (C) ;RETURN SECTOR IN (C) ; MSECTRAN: MOV A,C ORA A ;CONVERT TO PAIRED ODD BASED RAL DCR A DCR A ;NOW ZERO BASED FOR INDEXING MVI B,00H MOV C,A ;DOUBLE BYTE INDEX WORD LXI H,MFSTRAN ;TRANSLATE TABLE BASE ADDRESS DAD B MOV C,M RET ; PAGE ; ;MINI FLOPPY PHYSICAL SECTOR TRANSLATE TABLE ; MFSTRAN: DB 1,2,5,6,9,10,13,14,3,4,7,8,11,12,15,16 ;NOTE THAT ONLY ODD SECTORS ALLOWED ; ; ;****************************************************************************** ; ; MINI FLOPPY GETPUT STACK STORAGE ; ; DS 80 ;SETUP STORAGE FOR 40 LEVEL STACK STCKK EQU $ ; END ; ;+++...END OF FILE «eof»