|
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: 15360 (0x3c00) Types: TextFile Names: »MINIBIOS.ASM«
└─⟦be0857eee⟧ Bits:30004395 CP/M-86 files - CR8 Dual floppy └─ ⟦this⟧ »MINIBIOS.ASM«
TITLE 'MINI FLOPPY R/O BIOS FOR SYSTEM INSTALLATION DISK - NF/830629' PAGE 43 $*MACRO ;*************************************************************************** ;DEFINE TRUE AND FALSE ASSEMBLY PARAMETERS ; TRUE EQU -1 ;DEFINE TRUE FALSE EQU NOT TRUE ;DEFINE FALSE ;DEFINE MEMORY BASED I/O MODULE ENTRY POINTS ; $-PRINT ; MODBASE EQU 0F800H ;SET JUMP TABLE STARTING ADDRESS ; INITSER EQU MODBASE+00 ;INITIALIZE MP-SQUARE HARDWARE ; ;(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 ; ;(BC)=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 ; MACLIB Z80 MACLIB DISKDEF $+PRINT ;ASCII CHARACTER DEFINITIONS ; BS EQU 008H ;ASCII BACK SPACE CHARACTER LF EQU 00AH ;ASCII LINE FEED CHARACTER CR EQU 00DH ;ASCII CARRIAGE RETURN CHARACTER ESC EQU 01BH ;ASCII ESCAPE CHARACTER RUBOUT EQU 07FH ;ASCII RUBOUT CHARACTER ;SECTOR DEBLOCKING ALGORITHMS ; SMASK MACRO HBLK ;UTILITY MACRO TO COMPUTE SECTOR MASK ; ; COMPUTE LOG2(HBLK), RETURN @X AS RESULT ; (2 ** @X = HBLK ON RETURN) ; @Y SET HBLK @X SET 0 ; ; COUNT RIGHT SHIFTS OF @Y UNTIL = 1 ; REPT 8 IF @Y = 1 EXITM ENDIF ; ; @Y IS NOT 1, SHIFT RIGHT ONE POSITION ; @Y SET @Y SHR 1 @X SET @X + 1 ENDM ENDM ; HOST DISK CONSTANTS ; HSTSIZ EQU 512 ;HOST DISK SECTOR SIZE HSTBLK EQU HSTSIZ/128 ;CP/M SECTS/HOST BUFF SECMSK EQU HSTBLK-1 ;SECTOR MASK SMASK HSTBLK ;COMPUTE SECTOR MASK SECSHF EQU @X ;LOG2(HSTBLK) ;HOST BUFFER DECLARATION ;PLACED IN THE AREA F600H-F7FFH SINCE THIS CANNOT BE LOADED FROM FLOPPY ANYWAY ; HSTBUF EQU 0F600H ;HOST BUFFER PAGE ;*******I/O JUMP VECTOR******************************************************* ;THIS IS WHERE XBDOS CALLS WHEN IT NEEDS TO DO ANY INPUT/OUTPUT OPERATION. ; ORG 0E600H JMP DUMRET ;FROM COLD START LOADER JMP DUMRET ;FROM WARM BOOT JMP CONSTAT ;CHECK CONSOLE KB STATUS JMP CONIN ;READ CONSOLE CHARACTER JMP CONOUT ;WRITE CONSOLE CHARACTER JMP DUMRET ;WRITE LISTING CHAR JMP DUMRET ;WRITE PUNCH CHAR JMP DUMRET ;READ READER CHAR JMP HOME ;MOVE DISK TO TRACK ZERO JMP SELDSK ;SELECT DISK DRIVE JMP SETTRK ;SEEK TO TRACK IN REG A JMP SETSEC ;SET SECTOR NUMBER JMP SETDMA ;SET DISK STARTING ADR JMP READ ;READ SELECTED SECTOR JMP DUMRET ;WRITE SELECTED JMP DUMRET ;RETURN LIST STATUS JMP SECTRAN ;SECTOR TRANSLATE PAGE ;PARAMETER TABLE FOR ONE TANDON 5 1/4 DOUBLE DENSITY ;DOUBLE SIDED 96 TRACKS PER INCH MINI FLOPPY DRIVE ; DISKS 1 ;ONE MINI DRIVE SUPPORTED DISKDEF 0,1,32,,2048,304,128,128,2 ;A: MINI DRIVE ;SELECT UNIT NUMBER ACCORDING TO REGISTER C ; ; WHERE: 00 = MINI DRIVE 0 (DISK A:) ;;; 01 = MINI DRIVE 1 (DISK B:) ; SELDSK: MOV A,C ;GET NEW UNIT NUMBER LXI H,0 ;RETURN 0000 IN H&L REGS., IF ERROR CPI 1 ;IS SELECT MORE THAN MAX TABLE ENTRY RNC ;RETURN WITH ERROR, IF NOT VALID TABLE ENTRY STA SEKDSK ;SET SEKDSK TO CP/M UNIT SELECT CODE MOV L,C MVI H,0 REPT 4 ;SHIFT LEFT 4 (*16) DAD H ENDM LXI D,DPBASE ;D&E REGS. = DISK PARAMETER BASE DAD D ;H&L REGS. = BIAS OFFSET INTO TABLE XRA A ;SET A REG. = 00 DUMRET: RET ;RETURN FROM SELDSK (AND DUMY RETURN) PAGE ;VALID DISK DRIVE SELECT TABLES ; ;TABLE ENTRIES CONTAIN VALUES FOR VARIOUS DISK CONFIGURATIONS ;AND ALLOW QUICK INDEXING TO THE DRIVE SELECT CODE PARAMETERS. ;EACH ENTRY CONSISTS OF: ; FIRST BYTE: LEGAL/ILLEGAL 0=ILLEGAL, 0FFH=LEGAL ; SECOND BYTE: PHYSICAL UNIT SELECT CODE 00 TO 03 ; THIRD BYTE: MINI/HARD FLAG 0=HARD UNIT, 0FFH=MINI FLOPPY ; (NOT USED IN MINI ONLY BIOS) ; FOURTH BYTE: DISK PARAMETER TABLE INDEX (FROM DISKDEF) ; DSTAB: DB 0FFH,000H,000H,000H ;MINI FLOPPY DISK UNIT 0 ;SUBROUTINE TO GET THE PHYSICAL DRIVE NUMBER OUT OF THE DRIVE ;SELECT PARAMETER TABLE INTO (A) ; GETDRNO: LDA HSTDSK ;GET UNIT CP/M THINKS WE HAVE ADD A ADD A ;SETUP INDEX INTO FOUR BYTE TABLE ENTRIES MOV C,A MVI B,0 LXI H,DSTAB+1 ;BASE ADDRESS FOR ENTRIES OF PHYSICAL ;DRIVE ADDRESS TRANSLATION DAD B MOV C,M ;GET PHYSICAL NUMBER INTO (A) RET PAGE ;MOVE DISK TO TRACK ZERO ; HOME: LDA HSTWRT ;CHECK FOR PENDING WRITE ORA A JRNZ HOMEIT STA HSTACT ;CLEAR HOST ACTIVE FLAG HOMEIT: LXI H,0000H ;ITS LIKE WE ARE GOING TO TRACK 0 SHLD SEKTRK LDA SEKDSK ;MUST TRANSFER SELECTED DISK TO "HSTDSK" STA HSTDSK ;FOR THE FLOPPY RESTORE ROUTINE CALL GETDRNO ;GET PHYSICAL DRIVE NUMBER CALL MUNIT CALL MREST ;GO RESTORE THAT MINI FLOPPY ORA A JRNZ HOMEERR HOMEOK: XRA A STA ERFLAG ;RESET ERROR FLAG RET ;RETURN FROM HOME, IF O.K. HOMEERR: CALL EREXIT ;PRINT BIOS ERROR MESSAGE MVI A,01H ;SET ERROR FLAG STA ERFLAG RET ;SET TRACK NUMBER SPECIFIED BY B&C REGS. ; SETTRK: MOV H,B MOV L,C SHLD SEKTRK ;TRACK TO SEEK RET PAGE ;TRANSLATE THE SECTOR GIVEN BY B&C REGS. ; ;NO TRANSLATE DONE AT THIS TIME. WE WILL TRANSLATE THE ;MINI FLOPPY AT THE PHYSICAL SECTOR BASIS IN THE MINI ;FLOPPY READ/WRITE SETUP ROUTINE. ; SECTRAN: MOV H,B MOV L,C RET ;RETURN FROM SECTRAN ;SET DISK SECTOR NUMBER ; SETSEC: MOV A,C ;GET SECTOR NUMBER STA SEKSEC ;SECTOR TO SEEK RET ;RETURN FROM SETSEC ;SET DISK DMA ADDRESS ; SETDMA: MOV H,B ;MOVE B&C TO H&L MOV L,C SHLD DMAADR ;PUT AT DMA ADR ADDRESS RET ;RETURN FROM SETDMA PAGE ;READ THE SELECTED CP/M 2.2 SECTOR ; READ: XRA A ;CLEAR UNALLOCATED COUNT STA UNACNT STA ERFLAG ;NO ERRORS (YET) LDA SEKSEC ;COMPUTE HOST SECTOR REPT SECSHF ORA A ;CARRY = 0 RAR ;SHIFT RIGHT ENDM ;OUR DISK CONTROLLER NUMBERS ITS RECORDS FROM 1 AND NOT ZERO ;SO FIXUP THE "SEKHST" SECTOR NUMBER ; INR A STA SEKHST ;HOST SECTOR TO SEEK ;ACTIVE HOST SECTOR? ; LXI H,HSTACT ;HOST ACTIVE FLAG MOV A,M MVI M,1 ;ALWAYS BECOMES 1 ORA A ;WAS IT ALREADY? JRZ FILHST ;FILL HOST IF NOT ;HOST BUFFER ACTIVE, SAME AS SEEK BUFFER? ; LDA SEKDSK LXI H,HSTDSK ;SAME DISK? CMP M ;SEKDSK = HSTDSK? JRNZ NOMATCH ;SAME DISK, SAME TRACK? ; LXI H,HSTTRK CALL SEKTRKCMP ;SEKTRK = HSTTRK? JRNZ NOMATCH ;SAME DISK, SAME TRACK, SAME BUFFER? ; LDA SEKHST LXI H,HSTSEC ;SEKHST = HSTSEC? CMP M JRZ MATCH ;SKIP IF MATCH ;PROPER DISK, BUT NOT CORRECT SECTOR ; NOMATCH: ;MAY HAVE TO FILL THE HOST BUFFER ; FILHST: LDA SEKDSK STA HSTDSK LHLD SEKTRK SHLD HSTTRK LDA SEKHST STA HSTSEC CALL READHST XRA A ;0 TO A REG. STA HSTWRT ;NO PENDING WRITE LDA ERFLAG ;CHECK ERRORS ON PRE-READ ORA A RNZ ;BACK TO BDOS IF ERROR PAGE ;COPY DATA TO OR FROM BUFFER ; MATCH: LDA SEKSEC ;MASK BUFFER NUMBER ANI SECMSK ;LEAST SIGNIF BITS MOV L,A ;READY TO SHIFT MVI H,0 ;DOUBLE COUNT REPT 7 ;SHIFT LEFT 7 DAD H ENDM ;HL HAS RELATIVE HOST BUFFER ADDRESS ; LXI D,HSTBUF DAD D ;HL = HOST ADDRESS XCHG ;NOW IN DE LHLD DMAADR ;GET/PUT CP/M DATA ;DE IS SOURCE, HL IS DESTINATION ; XCHG ;SWITCH FOR 'LDIR' LXI B,128 ;COUNT - - LDIR ;MOVE DATA LDA ERFLAG RET ;DATA HAS BEEN MOVED FROM HOST BUFFER ;UTILITY SUBROUTINE FOR 16-BIT COMPARE ; SEKTRKCMP: ;HL = .UNATRK OR .HSTTRK, COMPARE WITH SEKTRK XCHG LXI H,SEKTRK LDAX D ;LOW BYTE COMPARE CMP M ;SAME? RNZ ;RETURN IF NOT ;LOW BYTES EQUAL, TEST HIGH FIRST ; INX D INX H LDAX D CMP M ;SETS FLAGS RET ;***************************************************************************** ;PERFORM THE PHYSICAL READ FROM THE HOST DISK ; READHST: ;FALL THROUGH TO 'READSEC' ;HSTDSK = HOST DISK NUMBER, HSTTRK = HOST TRACK NUMBER, ;HSTSEC = HOST SECT NUMBER. READ "HSTSIZ" BYTES ;INTO HSTBUF AND RETURN ERROR FLAG IN ERFLAG. ; READSEC: CALL MIOPB ;SETUP MINI FLOPPY IOPB CALL MREAD ;GO READ THAT SECTOR ORA A JRNZ RDERR ;EXIT FOR READ ERROR RDOK: XRA A STA ERFLAG RET RDERR: CALL EREXIT ;PRINT BIOS ERROR MESSAGE MVI A,01H ;SET ERROR FLAG STA ERFLAG RET PAGE ;READ/WRITE BIOS ERROR PRINT ROUTINE ;WAITS FOR USER RESPONSE ON CONSOLE AFTER PRINTING MESSAGE ;AND THEN RETURNS TO THE CALLER ; EREXIT: STA IOERR ;SAVE ERROR STATUS LXI H,ERRMSF ;USE MINI FLOPPY ERROR MESSAGE CALL PRTMSG LDA IOERR ;PRINT ERROR CODE PUSH PSW RRC RRC RRC RRC CALL HEXOUT POP PSW CALL HEXOUT LXI H,ERRMS2 ;PRINT REST OF MESSAGE CALL PRTMSG LDA HSTDSK ;PRINT CP/M DRIVE DESIGNATOR WITH ERROR ADI 'A' MOV C,A CALL CONOUT LXI H,ERRMS3 ;PRINT MESSAGE CLOSE CALL PRTMSG RET ;BACK TO CP/M PAGE ;ERROR ROUTINE MESSAGES ; ERRMSF: DB CR,LF,CR,LF,' *** MINI FLOPPY DISK I/O ERROR - CODE(',0 ERRMS2: DB ') - DRIVE ',0 ERRMS3: DB ': *** ',CR,LF,0 ;SUBROUTINE TO SEND A HEX CHAR TO THE CONSOLE ; HEXOUT: ANI 0FH ;LOW NIBBLE ONLY CPI 0AH ;GREATER THAN 9? JM HEX1 ADI 07H ;ADD OFFSET FOR A-F HEX1: ADI 030H ;ADD IN ASCII OFFSET MOV C,A ;PRINT RESULT CALL CONOUT RET PAGE ;************************************************************************** ;MINI FLOPPY I/O PARAMETER BLOCK SET UP ROUTINE ; MIOPB: CALL GETDRNO ;GET PHYSICAL DRIVE NUMBER FROM CALL MUNIT ;..FROM DRIVE SELECT TABLE LDA HSTTRK ;GET AND SET TRACK NUMBER 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 LXI B,00H ;SET SIZE CODE TO 256 BYTES CALL MSIZE MVI C,02H ;SET SECTOR COUNT TO 2 CALL MCNT LDA HSTSEC ;CONVERT SECTOR NUMBER TO PROPER SKEW 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 CALL MREC ;SET ACTUAL SECTOR TO START READ UPON LXI B,HSTBUF ;SET FLOPPY BUFFER ADDRESS CALL MBADDR 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 ;************************************************************************* ;PRINT THE MESSAGE AT H&L UNTIL A ZERO ; PRTMSG: MOV A,M ;GET CHARACTER TO PRINT ORA A ;SET FLAGS RZ ;RETURN, IF END OF STRING FLAG MOV C,A ;CHARACTER IN C REG., FOR CONSOLE OUTPUT PUSH H ;SAVE OUT POINTER CALL CONOUT ;PRINT CHARACTER, CONSOLE OUTPUT POP H ;GET BACK MESSAGE POINTER INX H ;BUMP MESSAGE POINTER JR PRTMSG PAGE ;**************************************************************************** ;STORAGE AREA FOR VARIABLES BEGINS HERE... ; ;THE NEXT SEVERAL BYTES ARE INITIALIZED TO ZERO FOLLOWING BOOT LOAD ;SINCE THEY ARE DECLARED WITH 'DB' ; IOERR: DB 0 ;DISK I/O ERROR TYPE ;HOST DISK BLOCKING/DE-BLOCKING DATA AREA ; TEMPDSK: DB 0 ;TEMPORARY STORAGE FOR LOGGED DISK SEKDSK: DB 0 ;SEEK DISK NUMBER SEKTRK: DB 0,0 ;SEEK TRACK NUMBER SEKSEC: DB 0 ;SEEK SECTOR NUMBER HSTDSK: DB 0 ;HOST DISK NUMBER HSTTRK: DB 0,0 ;HOST TRACK NUMBER HSTSEC: DB 0 ;HOST SECTOR NUMBER SEKHST: DB 0 ;SEEK SHR SECSHF HSTACT: DB 0 ;HOST ACTIVE FLAG HSTWRT: DB 0 UNACNT: DB 0 ;UNALLOCATED RECORD COUNT UNADSK: DB 0 ;LAST UNALLOCATED DISK UNATRK: DB 0,0 ;LAST UNALLOCATED TRACK UNASEC: DB 0 ;LAST UNALLOCATED SECTOR ERFLAG: DB 0 ;ERROR REPORTING DMAADR: DB 0,0 ;DISK DMA TRANSFER ADDRESS PAGE ;***************************************************************************** ;SCRATCH RAM AREA FOR BDOS USE (ORIGINALLY LAYED OUT BY 'ENDEF') ; DIRSIZ EQU 128 ALVSIZ EQU 38 CSVSIZ EQU 32 DIRBUF EQU $ ;DIRECTORY ACCESS BUFFER ALV0 EQU DIRBUF+DIRSIZ CSV0 EQU ALV0 +ALVSIZ FORCE DB 0 ;FORCE END FOR HEX FILE END ; ;...+++END OF FILE «eof»