|
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: 119552 (0x1d300) Types: TextFile Names: »DFDBIOS.LST«
└─⟦be0857eee⟧ Bits:30004395 CP/M-86 files - CR8 Dual floppy └─ ⟦this⟧ »DFDBIOS.LST«
\f CP/M ASM86 1.1 SOURCE: DFDBIOS.A86 CR8 - CP/M-86 BIOS VERS. 3.0 PAGE 1 TITLE 'CR8 - CP/M-86 BIOS VERS. 3.0' PAGESIZE 56 PAGEWIDTH 111 ; AUTHOR: LARS WINTHER DATE: 841801 ; MODIFIED FOR DUAL FLOPPY ONLY BY Leif Neland ;****************************************************************************** ; CHRISTIAN ROVSING A/S, CP/M-86 BASIC I/O MODULE FOR MP2 BOARD ; AND MINI FLOPPIES. ;****************************************************************************** ; ; ; THIS CP/M-86 BIOS IS SETUP FOR CP/M-86 ON A MP2 BOARD. ; CONSOLE,PRINTER AND FLOPPY DISK I/O IS HANDLED VIA Z80 BASED ; DRIVERS USING THE ONBOARD FLOPPY AND SERIAL I/O CONTROLLER CHIPS. ; ; ; ACCESS AND CONTROL OF THE MINI FLOPPY WILL BE THROUGH ; THE DISK CONTROLLER CIRCUITRY OF THE MP2 BOARD USING Z80 BASED DRIVERS. ; THIS BIOS CONFIGURATION WILL SUPPORT TWO MINI FLOPPY DRIVES. ; ; MINI FLOPPY FORMAT IS AS FOLLOWS: ; ; 77 TRACKS ; 16 RECORDS PER TRACK ; TWO HEADS/SIDES ; 256 BYTE RECORDS ; ; ; BIOS ACCESS TO THE MINI FLOPPY IS DONE IN REAL PAIRS OF 256 BYTE ; SECTORS TO AND FROM THE 512 BYTE HOST BUFFER. ; REAL ACCESS TO THE SECTOR PAIRS IS AS FOLLOWS: ; ; 1,2; 5,6; 9,10; 13,14; 3,4; 7,8; 11,12; 15,16; ; ; ; \f CP/M ASM86 1.1 SOURCE: DFDBIOS.A86 CR8 - CP/M-86 BIOS VERS. 3.0 PAGE 2 EJECT ; ;DEFINE TRUE AND FALSE ASSEMBLY PARAMETERS ; FFFF TRUE EQU -1 ;DEFINE TRUE 0000 FALSE EQU NOT TRUE ;DEFINE FALSE ; ; ;CP/M-86 SYSTEM PARAMETERS ; 0B06 BDOS EQU 0B06H ;BDOS ENTRY POINT 2500 BIOS EQU 2500H ;START OF BIOS JUMP VECTOR TABLE 00E0 SYSINT EQU 224 ;SYSTEM CALL INTERRUPT ; ; ;VERSION NUMBER AND DATE ; 001E VERSION EQU 30 ;VERSION NUMBER 0001 MONTH EQU 01 ;MONTH 0012 DAY EQU 18 0054 YEAR EQU 84 ;YEAR LAST TWO DIGITS ; ; ;ASCII CHARACTER DEFINITIONS ; 0008 BS EQU 008H ;ASCII BACK SPACE CHARACTER 000A LF EQU 00AH ;ASCII LINE FEED CHARACTER 000D CR EQU 00DH ;ASCII CARRIAGE RETURN CHARACTER 001B ESC EQU 01BH ;ASCII ESCAPE CHARACTER 007F RUBOUT EQU 07FH ;ASCII RUBOUT CHARACTER ; ; ;BDOS CONSTANTS ON ENTRY TO "WRITE" ; 0000 WRALL EQU 0 ;WRITE TO ALLOCATED BLOCK 0001 WRDIR EQU 1 ;WRITE TO DIRECTORY 0002 WRUAL EQU 2 ;WRITE TO UNALLOCATED BLOCK ; \f CP/M ASM86 1.1 SOURCE: DFDBIOS.A86 CR8 - CP/M-86 BIOS VERS. 3.0 PAGE 3 EJECT ;****************************************************************************** ; INTER-CPU COMMUNICATION CONSTANTS ;****************************************************************************** ; ; 8020 IFTOFF EQU 8020H ;INTERFACE TABLE OFFSET IN Z80 RAM 0040 CHANNEL EQU 40H ;NBR OF BYTES PR INTERFACE CHANNEL 0010 QUEUE EQU 10H ;NBR OF BYTES PR QUEUE ; 0000 TXE EQU 0*QUEUE ;OFFSET IN CHANNEL TO TX EMPTY QUEUE 0010 TXF EQU 1*QUEUE ;OFFSET IN CHANNEL TO TX FULL QUEUE 0020 RXF EQU 2*QUEUE ;OFFSET IN CHANNEL TO RX FULL QUEUE 0030 RXE EQU 3*QUEUE ;OFFSET IN CHANNEL TO RX EMPTY QUEUE ; 0001 BC EQU 01 ;OFFSET IN QUEUE TO BUFFER COUNT 0002 FB EQU 02 ;OFFSET IN QUEUE TO "FIRST" POINTER 0004 LB EQU 04 ;OFFSET IN QUEUE TO "LAST" POINTER 0006 SF EQU 06 ;OFFSET IN QUEUE TO SLAVE FLAG 0008 MF EQU 08 ;OFFSET IN QUEUE TO MASTER FLAG ; FFFE RETQ EQU -2 ;OFFSET FROM BUFFER POINTER TO RETURN Q 0000 CHAIN EQU 00 ;OFFSET FROM BUFFER POINTER TO CHAIN 0002 BYTEC EQU 02 ;OFFSET FROM BUFFER POINTER TO BYTECNT 0004 DPTR EQU 04 ;OFFSET FROM BUFFER POINTER TO DATAPTR ; 0080 CONCHA EQU CHANNEL*2 ;CONSOLE CHANNEL OFFSET IN I/F TABLE 00FF CONOPC EQU 0FFH ;CONSOLE DATA OPCODE ; 00C0 LPCHA EQU CHANNEL*3 ;LINE PRINTER CH. OFFSET IN I/F TABLE 00FF LPOPC EQU 0FFH ;LINE PRINTER DATA OPCODE ; 0003 ENTDLDU EQU 03H ;BUFFER TYPE FOR ENTIRE DATA LDU 0007 ENTCLDU EQU 07H ;BUFFER TYPE FOR COMMAND/STATUS LDU ; 0004 OPENOPC EQU 04H ;OPEN OPCODE 0010 OPFORM EQU 10H ;SERIAL OPEN PARAMETER FORMAT CODE ; 0020 CBLENGTH EQU 20H ;MAX BYTECOUNT IN SERIAL BUFFERS 0020 LBLENGTH EQU 20H ;...DEFINED IN SCRIMP/M ; \f CP/M ASM86 1.1 SOURCE: DFDBIOS.A86 CR8 - CP/M-86 BIOS VERS. 3.0 PAGE 4 EJECT ; ;****************************************************************************** ; ;CP/M-86 TO HOST DISK CONSTANTS ; 0800 BLKSIZ EQU 2048 ;CP/M-86 ALLOCATION SIZE 0200 HSTSIZ EQU 512 ;HOST DISK SECTOR SIZE ; ; 0012 HDSPT EQU 18 ;HOST HARD DISK SECTORS/TRACK ; 0008 FDSPT EQU 8 ;HOST MINI FLOPPY DISK 256 BYTE SECTOR ;PAIRS PER TRACK 0004 HSTBLK EQU HSTSIZ/128 ;CP/M-86 SECTS/HOST BUFF ; ;CPMSPT EQU HSTBLK * HSTSPT ;CP/M-86 SECTORS/TRACK ; ;THIS VALUE CHANGES ACCORDING TO ; ;MINI OR HARD DISK. ; ; ;SECTOR SKEW INTERLACE FACTOR ; 0000 SKEW EQU 00 ;SECTOR SKEW FACTOR ; 0003 SECMSK EQU 03 ;SECTOR MASK 0002 SECSHF EQU 02 ;SECTOR SHIFT FACTOR (LOG2(SECMSK)) ; \f CP/M ASM86 1.1 SOURCE: DFDBIOS.A86 CR8 - CP/M-86 BIOS VERS. 3.0 PAGE 5 EJECT ;****************************************************************************** ; CP/M-86 BIOS DISK CONFIGURATION SELECTION OPTIONS ;****************************************************************************** ; 0000 DEFDSK EQU 00H ;DEFAULT BOOTED DISK ; 00=A: ; 01=B: 0002 MAXDISK EQU 2 ; A: AND B: ; 0200 RECSIZE EQU 0200H ;512 BYTE RECORDS ; ; ;FLOPPY DISK INTERFACE DRIVER CONSTANTS ; 0100 FDCHA EQU CHANNEL*4 ;FLOPPY CHANNEL OFFSET IN I/F TABLE 0009 COMOPC EQU 09H ;COMMAND OPCODE 0000 RESTORE EQU 00H ;RESTORE COMMAND CODE 0001 READFD EQU 01H ;READ DISK COMMAND CODE 0002 WRITEFD EQU 02H ;WRITE DISK COMMAND CODE 0003 WRTRACK EQU 03H ;FORMAT TRACK COMMAND CODE ; 00FD CPUSYNC EQU 0FDH ;FLOPPY DRIVER SYNCHRONIZATION ERROR ; ; 0009 PIOB EQU 09H ;CHANNEL B PIO DATA ADDRESS ; 0020 TIMER EQU 20H ;INT.CTLR BASE VECTOR TYPE 0002 TICKI EQU 2 ;INT LEVEL USED FOR TICK INT 0088 RTC EQU (TIMER+TICKI)*4 ;RTC INT. VECTOR OFFSET ; \f CP/M ASM86 1.1 SOURCE: DFDBIOS.A86 CR8 - CP/M-86 BIOS VERS. 3.0 PAGE 6 EJECT ;HOST ADAPTER I/O PORT ADDRESSING PARAMETERS ; 0090 IOBASE EQU 090H ;BASE I/O PORT ADDRESS OF CONTROLLER ; 0090 CSR EQU IOBASE ;CHANNEL STATUS REGISTER PORT 0091 CCSR EQU IOBASE+1 ;COMMAND COMPLETION STATUS REGISTER 0092 DADDRL EQU IOBASE+2 ;DATA BUFFER LOW ADDRESS PORT 0093 DADDRM EQU IOBASE+3 ;DATA BUFFER MID ADDRESS PORT 0094 CADDRL EQU IOBASE+4 ;COMMAND BUFFER LOW ADDRESS PORT 0095 CADDRM EQU IOBASE+5 ;COMMAND BUFFER MID ADDRESS PORT 0096 DADDRH EQU IOBASE+6 ;DATA BUFFER HIGH ADDRESS PORT 0097 CADDRH EQU IOBASE+7 ;COMMAND BUFFER HIGH ADDRESS PORT ; \f CP/M ASM86 1.1 SOURCE: DFDBIOS.A86 CR8 - CP/M-86 BIOS VERS. 3.0 PAGE 7 EJECT ; CSEG ; ORG 0 CCP: ORG BIOS ;START OF BIOS ; ;****************************************************************************** ;I/O JUMP VECTOR. THIS IS WHERE CP/M-86 CALLS WHENEVER IT NEEDS TO DO ;ANY INPUT/OUTPUT OPERATION. USER PROGRAMS MAY USE THESE ENTRY POINTS ;****************************************************************************** ; 2500 E95100 2554 JMP INIT ;FROM COLD START LOADER 2503 E9DA00 25E0 JMP WBOOT ;FROM WARM BOOT 2506 E9E800 25F1 JMP CONST ;CHECK CONSOLE KB STATUS 2509 E90101 260D JMP CONIN ;READ CONSOLE CHARACTER 250C E96A01 2679 JMP CONOUT ;WRITE CONSOLE CHARACTER 250F E9F501 2707 JMP LPTOUT ;WRITE LISTING CHAR 2512 E9D801 26ED JMP PUNCH ;WRITE PUNCH CHAR 2515 E9D801 26F0 JMP READER ;READ READER CHAR 2518 E9AC02 27C7 JMP HOME ;MOVE DISK TO TRACK ZERO 251B E95D02 277B JMP SELDSK ;SELECT DISK DRIVE 251E E9B902 27DA JMP SETTRK ;SEEK TO TRACK IN REG A 2521 E9BE02 27E2 JMP SETSEC ;SET SECTOR NUMBER 2524 E9C002 27E7 JMP SETDMA ;SET DMA OFFSET ADDRESS 2527 E9D402 27FE JMP READ ;READ SELECTED SECTOR 252A E9E602 2813 JMP WRITE ;WRITE SELECTED 252D E9C301 26F3 JMP LPTSTAT ;RETURN LIST STATUS 2530 E9AC02 27DF JMP SECTRAN ;SECTOR TRANSLATE 2533 E9B602 27EC JMP SETDMAB ;SET DMA SEGMENT ADDRESS 2536 E9B802 27F1 JMP GETSEGB ;GET MEM DESCRIB TABLE OFFSET 2539 E9B902 27F5 JMP GETIOB ;GET I/O MAPPING BYTE 253C E9BA02 27F9 JMP SETIOB ;SET I/O MAPPING BYTE ; \f CP/M ASM86 1.1 SOURCE: DFDBIOS.A86 CR8 - CP/M-86 BIOS VERS. 3.0 PAGE 8 EJECT ;****************************************************************************** ; ROUTINE TO CALL SIMPLE I/O FUNCTIONS VIA VECTABLE JUMP VECTORS ;****************************************************************************** ; SIMPLEIO: 253F 1E PUSH DS 2540 0E PUSH CS 2541 1F POP DS 2542 52 PUSH DX 2543 8BD6 MOV DX,SI 2545 03F2 ADD SI,DX 2547 03F2 ADD SI,DX ;MULTIPLY SI BY 3 2549 81C62D2A ADD SI,OFFSET VECTABLE 254D 5A POP DX 254E FFD6 CALL SI ;INDIRECT CALL THRU ADDRESS FIELDS OF 2550 9C PUSHF 2551 5E POP SI ;RETURN FLAGS TO CALLER IN SI REG. 2552 1F POP DS 2553 CF IRET ;...SIMPLE I/O VECTOR TABLE ; \f CP/M ASM86 1.1 SOURCE: DFDBIOS.A86 CR8 - CP/M-86 BIOS VERS. 3.0 PAGE 9 EJECT ;****************************************************************************** ; COLD BOOT INITIALIZATION ROUTINE ;****************************************************************************** ; INIT: 2554 FA CLI ;LOCK OUT INTERRUPTS 2555 8CC8 MOV AX,CS ;GET OS SEGMENT ADDRESS 2557 8ED0 MOV SS,AX ;INITIALIZE STACK SEGMENT 2559 BC3F31 MOV SP,OFFSET STKBASE ;...AND INITIALIZATION STACK 255C B80000 MOV AX,0 255F 8ED8 MOV DS,AX ;PREPARE FOR INT VECTOR INIT 2561 8EC0 MOV ES,AX 2563 C70600002C2A MOV INT0OFF,OFFSET TRAP ;SETUP INT0 TO ADDRESS TRAP ROUTINE 2569 8C0E0200 MOV INT0SEG,CS ;THIS IS 4-BYTE VECTORS 256D BF0400 MOV DI,4 2570 BE0000 MOV SI,0 2573 B9FE01 MOV CX,510 ;SET REPEAT COUNTER 2576 FC CLD ;SET FORWARD DIRECTION 2577 F3A5 REP MOVS AX,AX ;PROPAGATE TRAP VECTOR TO ALL OF TABLE 2579 C7068003060B MOV BDOSOFF,BDOS ;INIT SYSTEM CALL VECTOR 257F C70688004A2C MOV RTCOFF,OFFSET RTCINT ;INIT REAL TIME CLOCK VECTOR 2585 C70678033F25 MOV BIOSOFF,OFFSET SIMPLEIO ; ; *** INTERRUPT VECTORS INITIALIZED, NOW INIT SYSTEM WORKING STORAGE *** ; 258B 8CC8 MOV AX,CS ;GET OS SEGMENT ADDRESS 258D 8ED8 MOV DS,AX ;INITIALIZE DATA SEGMENT 258F 8EC0 MOV ES,AX ;...AND EXTRA SEGMENT 2591 C606A42E00 MOV IOERR,0 ;START OF ZERO FILL AREA 2596 BEA42E MOV SI,OFFSET IOERR 2599 BFA52E MOV DI,OFFSET IOERR+1 259C B92800 MOV CX,WORD PTR (ENDZ-STARTZ)-1 259F FC CLD ;SET FORWARD DIRECTION 25A0 F3A4 REP MOVS AL,AL ;DO THE ZERO FILL ; ; ; *** INITIALIZE MEMMORY REGION TABLE *** ; 25A2 E409 IN AL,PIOB ;GET SWITCH SETTING 25A4 240C AND AL,0CH ;LEAVE ONLY SWITCH 3 AND 4 BITS 25A6 340C XOR AL,0CH ;IF BOTH SWITCHES ARE OPEN \f CP/M ASM86 1.1 SOURCE: DFDBIOS.A86 CR8 - CP/M-86 BIOS VERS. 3.0 PAGE 10 25A8 741A 25C4 JZ NOEXTRAM ;THEN ASSUME NO RAM BOARD INSTALLED 25AA D0E8 SHR AL,1 25AC D0E8 SHR AL,1 25AE 8AC8 MOV CL,AL ;COMPUTED SHIFT COUNT 25B0 B410 MOV AH,10H ;COMPUTE MEMMORY SEGMENT SIZE 25B2 D2E4 SHL AH,CL ;...IN PARAGRAPH UNITS 25B4 B000 MOV AL,0 25B6 A3D82E MOV WORD PTR MTR+7,AX ;SAVE IN TABLE 25B9 C706D62E0040 MOV WORD PTR MTR+5,4000H ;SAVE START OF EXTRA RAM BOARD 25BF C606D12E02 MOV BYTE PTR MTR,02 ;ELSE ASSUME TWO RAM SEGMENTS NOEXTRAM: ; ; *** INITIALIZE INTERRUPT CONTROLER *** ; 25C4 B013 MOV AL,13H 25C6 E6C0 OUT 0C0H,AL ;SEND ICW1 25C8 B020 MOV AL,TIMER 25CA E6C1 OUT 0C1H,AL ;SEND ICW2 25CC B003 MOV AL,03 25CE E6C1 OUT 0C1H,AL ;SEND ICW4 25D0 B0FB MOV AL,0FBH 25D2 E6C1 OUT 0C1H,AL ;ENABLE PIT-0 INTERRUPTS 25D4 FB STI ;LET IN REAL TIME CLOCK ; ; *** PRINT HELLO MESSAGE ON CONSOLE *** ; 25D5 BBF32D MOV BX,OFFSET SMSG ;PRINT OPENING MESSAGE 25D8 E84204 2A1D CALL PRTMSG ;PRINT MESSAGE STRING 25DB B100 MOV CL,DEFDSK ;GIVE CP/M-86 "DISK SELECTED" NUMBER 25DD E920DA 0000 JMP CCP ;JUMP TO CCP WITH MINI SET CODE ; \f CP/M ASM86 1.1 SOURCE: DFDBIOS.A86 CR8 - CP/M-86 BIOS VERS. 3.0 PAGE 11 EJECT ;****************************************************************************** ; WARM BOOT ROUTINE ;****************************************************************************** ; WBOOT: 25E0 B000 MOV AL,0 ;SELECT HEAD ZERO (SELECTED DISK = A:) 25E2 A2A82E MOV SEKMHD,AL ;SET FLAGS TO HARD DISK FOR POSSIBLE ERROR 25E5 A2AD2E MOV HSTMHD,AL ;..ROUTINE SCAN 25E8 A2B32E MOV HSTACT,AL ;SET HOST BUFFER INACTIVE 25EB A2B52E MOV UNACNT,AL ;CLEAR UNALLOCATED COUNT 25EE E915DA 0006 JMP CCP+6 ;GO BACK TO CP/M-86 ; ; ; ;****************************************************************************** ; CONSOLE STATUS ROUTINE ; RETURNS AL=00H IF NO INPUT READY ; RETURNS AL=FFH IF INPUT READY ;****************************************************************************** ; CONST: 25F1 06 PUSH ES 25F2 F706CF2EFFFF TEST PCIB,0FFFFH ;TEST IF CONSOLE INPUT BUFFER PENDING 25F8 750F 2609 JNZ PIB ;...FLAG INPUT READY IF SO ; 25FA B80020 MOV AX,2000H ;INITIALIZE ES TO START 25FD 8EC0 MOV ES,AX ;...OF MP2-Z80 RAM 25FF BBC080 MOV BX,IFTOFF+CONCHA+RXF ;QUEUE OFFSET 2602 E82B04 2A30 CALL LOOKQ ;GET NBR OF BUFFERS IN QUEUE 2605 22C0 AND AL,AL 2607 7402 260B JZ CSEXIT ;EXIT IF QUEUE EMPTY PIB: 2609 B0FF MOV AL,0FFH ;FLAG QUEUE NOT EMPTY CSEXIT: 260B 07 POP ES 260C C3 RET ; \f CP/M ASM86 1.1 SOURCE: DFDBIOS.A86 CR8 - CP/M-86 BIOS VERS. 3.0 PAGE 12 EJECT ;****************************************************************************** ; CONSOLE INPUT ROUTINE ; GETS CHAR TO (AL) REGISTER ;****************************************************************************** ; CONIN: 260D 06 PUSH ES 260E B80020 MOV AX,2000H ;Z80 RAM BASE ADDRESS 2611 8EC0 MOV ES,AX 2613 F706CF2EFFFF TEST PCIB,0FFFFH ;TEST IF BUFFER PENDING 2619 7532 264D JNZ CONIN3 ;GO PICK NEXT CHARACTER THERE ; ; ;NO BUFFER PENDING, TRY TO GET ONE. ; CONIN1: 261B BBC080 MOV BX,IFTOFF+CONCHA+RXF ;QUEUE OFFSET 261E E81204 2A33 CALL DEQ ;GET BUFFER 2621 73F8 261B JNC CONIN1 ;WAIT IF NO BUFFER IN QUEUE 2623 87DA XCHG BX,DX ;GET BUFFER ADDRESS INTO BX 2625 268B5704 MOV DX,ES:ÆBXÅ+DPTR ;GET 1. DATA ADDR. FROM QHEAD 2629 87DA XCHG BX,DX 262B 26803F03 CMP ES:BYTE PTR ÆBXÅ,ENTDLDU;MUST BE ENTIRE DATA LDU 262F 7408 2639 JE CONIN2 ;GO GET DATA IF LDU TYPE OK 2631 BBD080 MOV BX,IFTOFF+CONCHA+RXE ;ELSE 2634 E8FF03 2A36 CALL ENQ ;RELEASE BUFFER AND 2637 EBE2 261B JMPS CONIN1 ;...GO TRY AGAIN ; ; ;INSTALL NEWLY RECEIVED BUFFER AS PENDING. ; CONIN2: 2639 8916CF2E MOV PCIB,DX ;SAVE BUFFER ADDRESS 263D 43 INC BX 263E 43 INC BX ;POINT TO DATABYTE 263F 891ECD2E MOV CIBP,BX ;SAVE POINTER TO NEXT CHARACTER 2643 8BDA MOV BX,DX 2645 26FF4F02 DEC ES:WORD PTR BYTECÆBXÅ ;DECREMENT BYTECOUNT BY TWO 2649 26FF4F02 DEC ES:WORD PTR BYTECÆBXÅ ; \f CP/M ASM86 1.1 SOURCE: DFDBIOS.A86 CR8 - CP/M-86 BIOS VERS. 3.0 PAGE 13 EJECT ; ; ;GET CHARACTER FROM PENDING BUFFER. ; CONIN3: 264D 8B1ECD2E MOV BX,CIBP ;GET DATAPOINTER 2651 268A07 MOV AL,ES:ÆBXÅ ;GET DATA FROM BUFFER 2654 43 INC BX ;UPDATE POINTER 2655 891ECD2E MOV CIBP,BX ;SAVE NEW POINTER 2659 8B1ECF2E MOV BX,PCIB ;GET BUFFER ADDRESS 265D 26FF4F02 DEC ES:WORD PTR BYTECÆBXÅ ;DECREMENT BYTECOUNT IN BUFFER 2661 7512 2675 JNZ NOTMTY ;EXIT IF NOT EMPTY ; ; ;NO MORE JUICE IN THAT ONE, RELEASE IT. ; 2663 8B16CF2E MOV DX,PCIB ;GET BUFFER ADDRESS 2667 BBD080 MOV BX,IFTOFF+CONCHA+RXE ;EMPTY QUEUE OFFSET 266A 50 PUSH AX ;SAVE CHARACTER 266B E8C803 2A36 CALL ENQ ;RETURN BUFFER 266E C706CF2E0000 MOV PCIB,0 ;NO BUFFER PENDING 2674 58 POP AX ; ; ;THAT'S ALL FOLKS, RETURN TO CALLER ; NOTMTY: 2675 07 POP ES 2676 247F AND AL,7FH ;MASK OFF PARITYBIT 2678 C3 RET ; \f CP/M ASM86 1.1 SOURCE: DFDBIOS.A86 CR8 - CP/M-86 BIOS VERS. 3.0 PAGE 14 EJECT ; ; ;CONSOLE OUTPUT ROUTINE ; SENDS CHAR IN (CL) REGISTER ; CONOUT: 2679 B80020 MOV AX,2000H ;Z80 RAM BASE ADDRESS 267C 8826C72E MOV CONSEMAP,AH ;LOCKOUT FORWARD TIMER 2680 06 PUSH ES 2681 8EC0 MOV ES,AX 2683 8B1EC32E MOV BX,CONPTR ;GET CONSOLE BUFFER DATA POINTER 2687 0BDB OR BX,BX ;IF OLD POINTER INVALID 2689 742A 26B5 JZ NEWCBUF ;...GO INITIATE NEW CONSOLE BUFFER ; 268B 26880F MOV ES:ÆBXÅ,CL ;ELSE SAVE CHARACTER IN PENDING BUFFER 268E FF06C32E INC CONPTR ;UPDATE POINTER 2692 8B1EC52E MOV BX,CONBUF ;GET BUFFER ADDRESS 2696 268A4F02 MOV CL,ES:BYTECÆBXÅ ;GET OLD BYTECOUNT FROM BUFFERHEAD 269A FEC1 INC CL 269C 26884F02 MOV ES:BYTECÆBXÅ,CL ;STORE NEW BYTECOUNT 26A0 80F920 CMP CL,CBLENGTH ;TEST IF BUFFER IS FULL 26A3 7241 26E6 JB CONOEXIT ;...EXIT IF NOT ; 26A5 C706C32E0000 MOV CONPTR,0 ;FLAG POINTER AS INVALID 26AB BAB080 MOV DX,IFTOFF+CONCHA+TXF ;QUEUE OFFSET 26AE 87DA XCHG BX,DX 26B0 E88303 2A36 CALL ENQ ;SEND BUFFER TO Z80 26B3 EB31 26E6 JMPS CONOEXIT ;EXIT CONOUT ; \f CP/M ASM86 1.1 SOURCE: DFDBIOS.A86 CR8 - CP/M-86 BIOS VERS. 3.0 PAGE 15 EJECT ; NEWCBUF: 26B5 51 PUSH CX ;SAVE CHARACTER IN CL CONOUT1: 26B6 BBA080 MOV BX,IFTOFF+CONCHA+TXE ;QUEUE OFFSET 26B9 E87703 2A33 CALL DEQ ;GET EMPTY BUFFER 26BC 73F8 26B6 JNC CONOUT1 ;WAIT IF NO BUFFER IN QUEUE ; 26BE 8916C52E MOV CONBUF,DX 26C2 BB0F00 MOV BX,0FH 26C5 03DA ADD BX,DX ;COMPUTE NEXT-DATA POINTER 26C7 891EC32E MOV CONPTR,BX ;SAVE TILL NEXT CONOUT OPERATION 26CB 4B DEC BX 26CC 58 POP AX ;RESTORE CHARACTER INTO AL 26CD 268807 MOV ES:ÆBXÅ,AL ;SAVE CHARACTER IN BUFFER 26D0 4B DEC BX 26D1 26C607FF MOV ES:BYTE PTR ÆBXÅ,CONOPC ;NO LDU NUMBERS 26D5 4B DEC BX 26D6 26C60703 MOV ES:BYTE PTR ÆBXÅ,ENTDLDU;BUFFER IS ENTIRE DATA LDU 26DA 87DA XCHG BX,DX 26DC 26895704 MOV ES:DPTRÆBXÅ,DX ;SAVE POINTER IN QHEAD 26E0 26C747020300 MOV ES:WORD PTR BYTECÆBXÅ,3 ;SET BYTECOUNT CONOEXIT: 26E6 07 POP ES ;RESTORE SEGMENT 26E7 C606C72E00 MOV CONSEMAP,0 ;LET IN FORWARD TIMER 26EC C3 RET ; \f CP/M ASM86 1.1 SOURCE: DFDBIOS.A86 CR8 - CP/M-86 BIOS VERS. 3.0 PAGE 16 EJECT ; ;PUNCH PAPER TAPE, DEFAULT IS SERIAL PRINTER CHANNEL ; PUNCH: 26ED E91700 2707 JMP LPTOUT ;SEND PUNCH TO SERIAL OUTPUT ;RETURN THROUGH LPTOUT ; ; ;READ PAPER TAPE, DEFAULT IS SERIAL PRINTER CHANNEL ; READER: 26F0 E93A03 2A2D JMP LPTINP ;READ FROM SERIAL INPUT ;RETURN THROUGH LPTINP ; ; ; ; ;LINEPRINTER STATUS ROUTINE ; RETURNS AL=00H IF LP NOT READY ; RETURNS AL=FFH IF LP READY LPTSTAT: 26F3 06 PUSH ES 26F4 B80020 MOV AX,2000H ;INITIALIZE ES TO START 26F7 8EC0 MOV ES,AX ;...OF MP2-Z80 RAM 26F9 BBE080 MOV BX,IFTOFF+LPCHA+TXE ;QUEUE OFFSET 26FC E83103 2A30 CALL LOOKQ ;GET NBR OF BUFFERS IN QUEUE 26FF 22C0 AND AL,AL 2701 7402 2705 JZ LPEXIT ;EXIT IF QUEUE EMPTY 2703 B0FF MOV AL,0FFH ;FLAG QUEUE NOT EMPTY LPEXIT: 2705 07 POP ES 2706 C3 RET ; \f CP/M ASM86 1.1 SOURCE: DFDBIOS.A86 CR8 - CP/M-86 BIOS VERS. 3.0 PAGE 17 EJECT ; ;LINEPRINTER OUTPUT ROUTINE ; SEND CHARACTER IN (CL) REGISTER ; LPTOUT: 2707 B80020 MOV AX,2000H ;Z80 RAM BASE ADDRESS 270A 8826CC2E MOV LPTSEMAP,AH ;LOCK OUT FORWARD TIMER 270E 06 PUSH ES 270F 8EC0 MOV ES,AX 2711 8B1EC82E MOV BX,LPTPTR ;GET PRINTER BUFFER DATA POINTER 2715 0BDB OR BX,BX ;IF OLD POINTER INVALID 2717 742A 2743 JZ NEWPBUF ;...GO INITIATE NEW PRINTER BUFFER ; 2719 26880F MOV ES:ÆBXÅ,CL ;ELSE SAVE CHARACTER IN PENDING BUFFER 271C FF06C82E INC LPTPTR ;UPDATE POINTER 2720 8B1ECA2E MOV BX,LPTBUF ;GET BUFFER ADDRESS 2724 268A4F02 MOV CL,ES:BYTECÆBXÅ ;GET OLD BYTECOUNT FROM BUFFERHEAD 2728 FEC1 INC CL 272A 26884F02 MOV ES:BYTECÆBXÅ,CL ;STORE NEW BYTECOUNT 272E 80F920 CMP CL,LBLENGTH ;TEST IF BUFFER IS FULL 2731 7241 2774 JB LPTOEXIT ;...EXIT IF NOT ; 2733 C706C82E0000 MOV LPTPTR,0 ;FLAG POINTER AS INVALID 2739 BAF080 MOV DX,IFTOFF+LPCHA+TXF ;QUEUE OFFSET 273C 87DA XCHG BX,DX 273E E8F502 2A36 CALL ENQ ;SEND BUFFER TO Z80 2741 EB31 2774 JMPS LPTOEXIT ;EXIT LPTOUT ; \f CP/M ASM86 1.1 SOURCE: DFDBIOS.A86 CR8 - CP/M-86 BIOS VERS. 3.0 PAGE 18 EJECT ; NEWPBUF: 2743 51 PUSH CX ;SAVE CHARACTER IN CL LPTOUT1: 2744 BBE080 MOV BX,IFTOFF+LPCHA+TXE ;QUEUE OFFSET 2747 E8E902 2A33 CALL DEQ ;GET EMPTY BUFFER 274A 73F8 2744 JNC LPTOUT1 ;WAIT IF NO BUFFER IN QUEUE ; 274C 8916CA2E MOV LPTBUF,DX 2750 BB0F00 MOV BX,0FH 2753 03DA ADD BX,DX ;COMPUTE NEXT-DATA POINTER 2755 891EC82E MOV LPTPTR,BX ;SAVE TILL NEXT LPTOUT OPERATION 2759 4B DEC BX 275A 58 POP AX ;RESTORE CHARACTER INTO AL 275B 268807 MOV ES:ÆBXÅ,AL ;SAVE CHARACTER IN BUFFER 275E 4B DEC BX 275F 26C607FF MOV ES:BYTE PTR ÆBXÅ,LPOPC ;NO LDU NUMBERS 2763 4B DEC BX 2764 26C60703 MOV ES:BYTE PTR ÆBXÅ,ENTDLDU;BUFFER IS ENTIRE DATA LDU 2768 87DA XCHG BX,DX 276A 26895704 MOV ES:DPTRÆBXÅ,DX ;SAVE POINTER IN QHEAD 276E 26C747020300 MOV ES:WORD PTR BYTECÆBXÅ,3 ;SET BYTECOUNT LPTOEXIT: 2774 07 POP ES ;RESTORE SEGMENT 2775 C606CC2E00 MOV LPTSEMAP,0 ;LET IN FORWARD TIMER 277A C3 RET ; \f CP/M ASM86 1.1 SOURCE: DFDBIOS.A86 CR8 - CP/M-86 BIOS VERS. 3.0 PAGE 19 EJECT ; ;SELECT DISK NUMBER ACCORDING TO (CL) ; ; 0=A:,1=B: ; SELDSK: 277B BB0000 MOV BX,0 ;RETURN 0000 IN BX IF ERROR 277E 80F902 CMP CL,MAXDISK ;IS SELECT MORE THAN MAX TABLE ENTRY 2781 7201 2784 JB SEL1 ;RETURN WITH ERROR, IF NOT VALID TABLE ENTRY 2783 C3 RET SEL1: 2784 53 PUSH BX ;CHECK IF VALID FROM TABLE 2785 8AD9 MOV BL,CL 2787 D0E3 SHL BL,1 ;MAKE UNIT SELECT TABLE INDEX 2789 D0E3 SHL BL,1 278B 81C3DB2D ADD BX,OFFSET DSTAB ;DRIVE SETUP TABLE BASE 278F 8A07 MOV AL,ÆBXÅ ;GET VALIDITY BYTE THIS UNIT 2791 0AC0 OR AL,AL ;ZERO = ILLEGAL 2793 87DA XCHG BX,DX ;SAVE POINTER IF NO EXIT 2795 5B POP BX ;GET BACK BX TO ZERO FOR ERROR EXIT 2796 7501 2799 JNZ SEL2 ;RETURN ON ILLEGAL UNIT 2798 C3 RET SEL2: 2799 880EA92E MOV SEKDSK,CL ; 279D 87DA XCHG BX,DX ;IS A LEGAL SELECT THEN PROCESS ;PARAMETERS 279F 43 INC BX ;POINT TO DRIVE PHYSICAL UNIT NUMBER ;DRIVE PHYSICAL UNIT NUMBER NOT USED ;TILL I/O ROUTINES WHEN THE DRIVE IS USED ; 27A0 43 INC BX ;POINT TO MINI/HARD FLAG 27A1 8A07 MOV AL,ÆBXÅ 27A3 A2A82E MOV SEKMHD,AL ;SET CURRENTLY SELECTED TYPE FLAG ; 27A6 43 INC BX ;POINT TO CP/M-86 DISK PARAMETER TABLE INDEX 27A7 8A1F MOV BL,ÆBXÅ ;MAKE DOUBLE TABLE INDEX*16 27A9 B700 MOV BH,00H 27AB D1E3 SHL BX,1 27AD D1E3 SHL BX,1 27AF D1E3 SHL BX,1 \f CP/M ASM86 1.1 SOURCE: DFDBIOS.A86 CR8 - CP/M-86 BIOS VERS. 3.0 PAGE 20 27B1 D1E3 SHL BX,1 27B3 81C39F2C ADD BX,OFFSET DPBASE ;BX=POINTER TO DRIVE PARAMETER TABLE 27B7 C3 RET ; ; ; ; ;SUBROUTINE TO GET THE PHYSICAL DRIVE NUMBER OUT OF THE DRIVE ;SELECT PARAMETER TABLE INTO (CL) ; GETDRNO: 27B8 8A1EAE2E MOV BL,HSTDSK ;GET UNIT CP/M-86 THINKS WE HAVE 27BC D0E3 SHL BL,1 ;SETUP INDEX INTO FOUR BYTE TABLE 27BE D0E3 SHL BL,1 ;ENTRIES 27C0 B700 MOV BH,0 27C2 8A8FDC2D MOV CL,OFFSET DSTAB+1ÆBXÅ ;GET PHYSICAL NUMBER INTO (CL) 27C6 C3 RET ; \f CP/M ASM86 1.1 SOURCE: DFDBIOS.A86 CR8 - CP/M-86 BIOS VERS. 3.0 PAGE 21 EJECT ;****************************************************************************** ; SELECT TRACK ZERO FOR NEXT DISK ACCESS (HOME DISK) ;****************************************************************************** ; HOME: 27C7 A0B42E MOV AL,HSTWRT ;CHECK FOR PENDING WRITE 27CA 0AC0 OR AL,AL 27CC 7503 27D1 JNZ HOMEIT 27CE A2B32E MOV HSTACT,AL ;CLEAR HOST ACTIVE FLAG HOMEIT: 27D1 C706AA2E0000 MOV SEKTRK,0000H ;ITS LIKE WE ARE GOING TO TRACK 0 27D7 32C0 XOR AL,AL 27D9 C3 RET ;RETURN FROM HOME, O.K. ; ; ;SET TRACK NUMBER SPECIFIED BY CX REG. ; SETTRK: 27DA 890EAA2E MOV SEKTRK,CX ;TRACK TO SEEK 27DE C3 RET ; ; ; ;TRANSLATE THE SECTOR GIVEN BY CX REG. ; ; 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: 27DF 8BD9 MOV BX,CX 27E1 C3 RET ;RETURN FROM SECTRAN ; ; ; ; ;SET DISK SECTOR NUMBER ; SETSEC: 27E2 880EAC2E MOV SEKSEC,CL ;SECTOR TO SEEK 27E6 C3 RET ;RETURN FROM SETSEC \f CP/M ASM86 1.1 SOURCE: DFDBIOS.A86 CR8 - CP/M-86 BIOS VERS. 3.0 PAGE 22 EJECT ; ; ;SET DISK DMA OFFSET ; SETDMA: 27E7 890EBE2E MOV DMAADR,CX ;PUT AT DMA ADR ADDRESS 27EB C3 RET ;RETURN FROM SETDMA ; ; ; ;SET DMA SEGMENT ; SETDMAB: 27EC 890EC02E MOV DEFDMASG,CX 27F0 C3 RET ; ; ; ;GET MEMMORY REGION TABLE OFFSET ; GETSEGB: 27F1 BBD12E MOV BX,OFFSET MTR 27F4 C3 RET ; ; ; ;GET IOBYTE ; GETIOB: 27F5 A0C22E MOV AL,IOBYTE 27F8 C3 RET ; ; ; ;SET IOBYTE ; SETIOB: 27F9 880EC22E MOV IOBYTE,CL 27FD C3 RET ; \f CP/M ASM86 1.1 SOURCE: DFDBIOS.A86 CR8 - CP/M-86 BIOS VERS. 3.0 PAGE 23 EJECT ; ; *** READ THE SELECTED CP/M-86 SECTOR *** ; READ: 27FE 32C0 XOR AL,AL 2800 A2B52E MOV UNACNT,AL ;CLEAR UNALLOCATED COUNT 2803 FEC0 INC AL 2805 A2BC2E MOV READOP,AL ;READ OPERATION 2808 A2BB2E MOV RSFLAG,AL ;MUST READ DATA 280B B002 MOV AL,WRUAL 280D A2BD2E MOV WRTYPE,AL ;TREAT AS UNALLOCCATED 2810 E97B00 288E JMP RWOPER ;TO PERFORM THE READ ; ; ; *** WRITE THE SELECTED CP/M-86 SECTOR *** ; WRITE: 2813 C606BC2E00 MOV READOP,0 ;NOT A READ OPERATION 2818 880EBD2E MOV WRTYPE,CL 281C 80F902 CMP CL,WRUAL ;WRITE UNALLOCATED? 281F 7519 283A JNE CHKUNA ;CHECK FOR UNALLOCATED ; ;WRITE TO UNALLOCATED, SET PARAMETERS ; 2821 C606B52E10 MOV UNACNT,BLKSIZ/128 ;NEXT UNALLOCATED RECORDS 2826 A0A92E MOV AL,SEKDSK ;DISK TO SEEK 2829 A2B62E MOV UNADSK,AL ;UNADSK = SEKDSK 282C 8B1EAA2E MOV BX,SEKTRK 2830 891EB72E MOV UNATRK,BX ;UNATRK = SECTRK 2834 A0AC2E MOV AL,SEKSEC 2837 A2B92E MOV UNASEC,AL ;UNASEC = SEKSEC ; ;CHECK FOR WRITE TO UNALLOCATED SECTOR ; CHKUNA: 283A A0B52E MOV AL,UNACNT ;ANY UNALLOCATED REMAINING? 283D 0AC0 OR AL,AL 283F 7443 2884 JZ ALLOC ;SKIP IF NOT ; \f CP/M ASM86 1.1 SOURCE: DFDBIOS.A86 CR8 - CP/M-86 BIOS VERS. 3.0 PAGE 24 EJECT ; ;MORE UNALLOCATED RECORDS REMAIN ; 2841 FEC8 DEC AL ;UNACNT = UNACNT-1 2843 A2B52E MOV UNACNT,AL 2846 A0A92E MOV AL,SEKDSK ;SAME DISK? 2849 3A06B62E CMP AL,UNADSK ;SEKDSK = UNADSK? 284D 7535 2884 JNE ALLOC ;SKIP IF NOT ; ; ;DISKS ARE THE SAME ; 284F 8B1EB72E MOV BX,UNATRK 2853 3B1EAA2E CMP BX,SEKTRK ;SEKTRK = UNATRK? 2857 752B 2884 JNE ALLOC ;SKIP IF NOT ; ; ;TRACKS ARE THE SAME ; 2859 A0AC2E MOV AL,SEKSEC ;SAME SECTOR? 285C BBB92E MOV BX,OFFSET UNASEC 285F 3A07 CMP AL,ÆBXÅ ;SEKSEC = UNASEC? 2861 7521 2884 JNE ALLOC ;SKIP IF NOT ; \f CP/M ASM86 1.1 SOURCE: DFDBIOS.A86 CR8 - CP/M-86 BIOS VERS. 3.0 PAGE 25 EJECT ; ;MATCH, MOVE TO NEXT SECTOR FOR FUTURE REFERENCE ; 2863 FEC0 INC AL 2865 8807 MOV ÆBXÅ,AL ;UNASEC=UNASEC+1 2867 B412 MOV AH,HDSPT ;USE HARD DISK SECTORS PER TRACK 2869 F606A82EFF TEST SEKMHD,0FFH ;CHECK KIND OF DISK 286E 7402 2872 JZ MTCHCMP ;HARD DISK MATCH 2870 B408 MOV AH,FDSPT ;USE MINI DISK SPT MTCHCMP: 2872 3AC4 CMP AL,AH 2874 7207 287D JB NOOVF ;SKIP IF NO OVERFLOW ; ; ;OVERFLOW TO NEXT TRACK ; 2876 C60700 MOV BYTE PTR ÆBXÅ,0 ;UNASEC = 0 2879 FF06B72E INC WORD PTR UNATRK ;UNATRK = UNATRK+1 ; ; ;MATCH FOUND, MARK AS UNNECESSARY READ ; NOOVF: 287D C606BB2E00 MOV RSFLAG,0 ;RSFLAG = 0 2882 EB0A 288E JMPS RWOPER ;TO PERFORM THE WRITE ; ; ;NOT AN UNALLOCATED RECORD, REQUIRES PRE-READ ; ALLOC: 2884 32C0 XOR AL,AL ;0 TO A REG. 2886 A2B52E MOV UNACNT,AL ;UNACNT = 0 2889 FEC0 INC AL ;1 TO A REG. 288B A2BB2E MOV RSFLAG,AL ;RSFLAG = 1 ; \f CP/M ASM86 1.1 SOURCE: DFDBIOS.A86 CR8 - CP/M-86 BIOS VERS. 3.0 PAGE 26 EJECT ;****************************************************************************** ; COMMON CODE FOR READ AND WRITE OPERATIONS ;****************************************************************************** ; RWOPER: ;ENTER HERE TO PERFORM THE READ/WRITE 288E C606BA2E00 MOV ERFLAG,0 ;NO ERRORS (YET) 2893 A0AC2E MOV AL,SEKSEC ;COMPUTE HOST SECTOR 2896 B102 MOV CL,SECSHF 2898 D2E8 SHR AL,CL ; ; ;OUR DISK CONTROLLER NUMBERS ITS RECORDS FROM 1 AND NOT ZERO ;SO FIXUP THE "SEKHST" SECTOR NUMBER ; 289A FEC0 INC AL 289C A2B22E MOV SEKHST,AL ;HOST SECTOR TO SEEK ; ; ;ACTIVE HOST SECTOR? ; 289F BBB32E MOV BX,OFFSET HSTACT ;HOST ACTIVE FLAG 28A2 8A07 MOV AL,ÆBXÅ 28A4 C60701 MOV BYTE PTR ÆBXÅ,1 ;ALWAYS BECOMES 1 28A7 0AC0 OR AL,AL ;WAS IT ALREADY? 28A9 742B 28D6 JZ FILHST ;FILL HOST IF NOT ; ; ;HOST BUFFER ACTIVE, SAME AS SEEK BUFFER? ; 28AB A0A92E MOV AL,SEKDSK 28AE 3A06AE2E CMP AL,HSTDSK ;SAME DISK? 28B2 7513 28C7 JNE NOMATCH ; ; ;SAME DISK, SAME TRACK? ; 28B4 8B1EAF2E MOV BX,HSTTRK 28B8 3B1EAA2E CMP BX,SEKTRK ;SEKTRK = HSTTRK? 28BC 7509 28C7 JNE NOMATCH ; \f CP/M ASM86 1.1 SOURCE: DFDBIOS.A86 CR8 - CP/M-86 BIOS VERS. 3.0 PAGE 27 EJECT ; ;SAME DISK, SAME TRACK, SAME BUFFER? ; 28BE A0B22E MOV AL,SEKHST 28C1 3A06B12E CMP AL,HSTSEC ;SEKHST = HSTSEC? 28C5 743D 2904 JE MATCH ;SKIP IF MATCH ; ; ;PROPER DISK, BUT NOT CORRECT SECTOR ; NOMATCH: 28C7 F606B42EFF TEST HSTWRT,0FFH ;HOST WRITTEN? 28CC 7408 28D6 JZ FILHST 28CE E89000 2961 CALL WRITEHST ;CLEAR HOST BUFF 28D1 0AC0 OR AL,AL ;CHECK FOR WRITE ERRORS 28D3 7401 28D6 JZ FILHST 28D5 C3 RET ;BALE OUT TO BDOS IF ERROR ; ; ;MAY HAVE TO FILL THE HOST BUFFER ; FILHST: 28D6 A0A82E MOV AL,SEKMHD ;COPY SELECTED TYPE TO OPERATION TYPE 28D9 A2AD2E MOV HSTMHD,AL 28DC A0A92E MOV AL,SEKDSK ;COPY SELECTED DISK TO OPERATION DISK 28DF A2AE2E MOV HSTDSK,AL 28E2 8B1EAA2E MOV BX,SEKTRK ;COPY SELECTED TRACK TO OPERATION TRACK 28E6 891EAF2E MOV HSTTRK,BX 28EA A0B22E MOV AL,SEKHST ;COPY SELECTED PHYS SECTOR TO OPERATION SECTOR 28ED A2B12E MOV HSTSEC,AL 28F0 F606BB2EFF TEST RSFLAG,0FFH ;NEED TO READ? 28F5 740D 2904 JZ MATCH ;SKIP PREREAD ; 28F7 E87E00 2978 CALL READHST ;YES, IF 1 28FA C606B42E00 MOV HSTWRT,0 ;NO PENDING WRITE 28FF 0AC0 OR AL,AL ;CHECK ERROR ON PREREAD? 2901 7401 2904 JZ MATCH 2903 C3 RET ;BACK TO BDOS IF ERROR IN READING ; \f CP/M ASM86 1.1 SOURCE: DFDBIOS.A86 CR8 - CP/M-86 BIOS VERS. 3.0 PAGE 28 EJECT ; ;COPY DATA TO OR FROM BUFFER ; MATCH: 2904 8A1EAC2E MOV BL,SEKSEC ;MASK BUFFER NUMBER 2908 80E303 AND BL,SECMSK ;LEAST SIGNIF BITS 290B B700 MOV BH,0 ; 290D D1E3 SHL BX,1 290F D1E3 SHL BX,1 2911 D1E3 SHL BX,1 2913 D1E3 SHL BX,1 2915 D1E3 SHL BX,1 2917 D1E3 SHL BX,1 2919 D1E3 SHL BX,1 ;SHIFT INTO HOST BUFFER OFFSET ; ; ;BX HAS RELATIVE HOST BUFFER ADDRESS ; 291B BEE62E MOV SI,OFFSET HSTBUF 291E 03F3 ADD SI,BX ;SI = HOST ADDRESS 2920 8B3EBE2E MOV DI,DMAADR ;GET DESTIGNATION OFFSET FOR READ 2924 8E06C02E MOV ES,DEFDMASG ;GET DESTIGNATION SEGMENT FOR READ 2928 B98000 MOV CX,128 ;LENGTH OF MOVE (CP/M-86 SECTOR SIZE) 292B F606BC2EFF TEST READOP,0FFH ;WHICH WAY? 2930 750D 293F JNZ RWMOVE ;SKIP IF READ ; ; ;WRITE OPERATION, MARK AND SWITCH DIRECTION ; 2932 C606B42E01 MOV HSTWRT,1 ;HSTWRT = 1 2937 87F7 XCHG SI,DI ;SOURCE/DESTINATION SWAP 2939 8CC0 MOV AX,ES 293B 1E PUSH DS 293C 07 POP ES 293D 8ED8 MOV DS,AX ;SWAP ALSO INVOLVED SEGMENTS ; \f CP/M ASM86 1.1 SOURCE: DFDBIOS.A86 CR8 - CP/M-86 BIOS VERS. 3.0 PAGE 29 EJECT ; ;CX INITIALLY 128, DX IS SOURCE, BX IS DESTINATION ; RWMOVE: 293F FC CLD ;SET FORWARD DIRECTION 2940 F3A4 REP MOVS AL,AL ;MOVE IT 2942 8CC8 MOV AX,CS 2944 8ED8 MOV DS,AX 2946 8EC0 MOV ES,AX ;RESTORE SEGMENT REGISTERS ; ;DATA HAS BEEN MOVED TO/FROM HOST BUFFER ; 2948 A0BD2E MOV AL,WRTYPE ;WRITE TYPE 294B 3C01 CMP AL,WRDIR ;TO DIRECTORY? 294D A0BA2E MOV AL,ERFLAG ;IN CASE OF ERRORS 2950 7401 2953 JZ CHB 2952 C3 RET ;NO FURTHER PROCESSING ; ; ;CLEAR HOST BUFFER FOR DIRECTORY WRITE ; CHB: 2953 0AC0 OR AL,AL ;ERRORS? 2955 7401 2958 JZ CHB1 2957 C3 RET ;SKIP IF SO CHB1: 2958 C606B42E00 MOV HSTWRT,0 ;BUFFER WRITTEN 295D E80100 2961 CALL WRITEHST 2960 C3 RET ; \f CP/M ASM86 1.1 SOURCE: DFDBIOS.A86 CR8 - CP/M-86 BIOS VERS. 3.0 PAGE 30 EJECT ;PERFORMS THE PHYSICAL WRITE TO THE HOST DISK. ;HSTDSK = HOST DISK NUMBER, HSTTRK = HOST TRACK NUMBER, ;HSTSEC = HOST SECT NUMBER. WRITE "HSTSIZ" BYTES ;FROM HSTBUF AND RETURN ERROR FLAG IN ERFLAG. ;RETURN: AL = ERFLAG = NON-ZERO IF ERROR ; WRITEHST: 2961 E87A00 29DE CALL MIOPB ;SET MINI FLOPPY IOPB 2964 E81A01 2A81 CALL MWRIT ;GO WRITE MINI FLOPPY SECTOR 2967 0AC0 OR AL,AL 2969 7504 296F JNZ WRTERR ;EXIT FOR WRITE ERROR 296B A2BA2E MOV ERFLAG,AL ;RESET ERROR FLAG 296E C3 RET ;RETURN FROM "WRITEHST", IF O.K. WRTERR: 296F E81D00 298F CALL EREXIT ;PRINT BIOS ERROR MESSAGE 2972 B001 MOV AL,01H ;SET ERROR FLAG 2974 A2BA2E MOV ERFLAG,AL 2977 C3 RET ; ; ;HSTDSK = HOST DISK NUMBER, HSTTRK = HOST TRACK NUMBER, ;HSTSEC = HOST SECT NUMBER. READ "HSTSIZ" BYTES ;INTO HSTBUF AND RETURN ERROR FLAG IN ERFLAG AND AL. ; READHST: 2978 E86300 29DE CALL MIOPB ;SETUP MINI FLOPPY IOPB 297B E80601 2A84 CALL MREAD ;GO READ MINI FLOPPY SECTOR 297E 0AC0 OR AL,AL 2980 7504 2986 JNZ RDERR ;EXIT FOR READ ERROR 2982 A2BA2E MOV ERFLAG,AL 2985 C3 RET RDERR: 2986 E80600 298F CALL EREXIT ;PRINT BIOS ERROR MESSAGE 2989 B001 MOV AL,01H ;SET ERROR FLAG 298B A2BA2E MOV ERFLAG,AL 298E C3 RET \f CP/M ASM86 1.1 SOURCE: DFDBIOS.A86 CR8 - CP/M-86 BIOS VERS. 3.0 PAGE 31 EJECT ;READ/WRITE BIOS ERROR PRINT ROUTINE ;WAITS FOR USER RESPONSE ON CONSOLE AFTER PRINTING MESSAGE ;AND THEN RETURNS TO THE CALLER ; EREXIT: 298F A2A42E MOV IOERR,AL ;SAVE ERROR STATUS 2992 BB6B2E MOV BX,OFFSET ERRMSF ;MINI FLOPPY ERROR MESSAGE 2995 E88500 2A1D CALL PRTMSG 2998 A0A42E MOV AL,IOERR ;PRINT ERROR CODE 299B 50 PUSH AX 299C B104 MOV CL,4 299E D2E8 SHR AL,CL 29A0 E82B00 29CE CALL HEXOUT 29A3 58 POP AX 29A4 E82700 29CE CALL HEXOUT 29A7 BB8E2E MOV BX,OFFSET ERRMS2 ;PRINT REST OF MESSAGE 29AA E87000 2A1D CALL PRTMSG 29AD A0AE2E MOV AL,HSTDSK ;PRINT CP/M-86 DRIVE DESIGNATOR WITH ERROR 29B0 0441 ADD AL,'A' 29B2 8AC8 MOV CL,AL 29B4 E8C2FC 2679 CALL CONOUT 29B7 BB992E MOV BX,OFFSET ERRMS3 ;PRINT MESSAGE CLOSE 29BA E86000 2A1D CALL PRTMSG 29BD E84DFC 260D CALL CONIN ;WAIT FOR OPERATOR RESPONSE 29C0 3C03 CMP AL,03 ;IF CTL-C THEN GO DO WARM BOOT 29C2 7503 29C7 JNZ ERR1 29C4 E919FC 25E0 JMP WBOOT ERR1: 29C7 BBA12E MOV BX,OFFSET ERRMS4 29CA E85000 2A1D CALL PRTMSG 29CD C3 RET ;BACK TO CP/M-86 \f CP/M ASM86 1.1 SOURCE: DFDBIOS.A86 CR8 - CP/M-86 BIOS VERS. 3.0 PAGE 32 EJECT ; ;SUBROUTINE TO SEND A HEX CHAR TO THE CONSOLE ; HEXOUT: 29CE 240F AND AL,0FH ;LOW NIBBLE ONLY 29D0 3C0A CMP AL,0AH ;GREATER THAN 9? 29D2 7202 29D6 JB HEX1 29D4 0407 ADD AL,07H ;ADD OFFSET FOR A-F HEX1: 29D6 0430 ADD AL,030H ;ADD IN ASCII OFFSET 29D8 8AC8 MOV CL,AL ;PRINT RESULT 29DA E89CFC 2679 CALL CONOUT 29DD C3 RET ; ;MINI FLOPPY I/O PARAMETER BLOCK SET UP ROUTINE ; MIOPB: 29DE E8D7FD 27B8 CALL GETDRNO ;GET PHYSICAL DRIVE NUMBER FROM 29E1 E87F00 2A63 CALL MUNIT ;..FROM DRIVE SELECT TABLE 29E4 8B0EAF2E MOV CX,HSTTRK ;GET TRACK NUMBER 29E8 80E101 AND CL,01H ;FIND OUT WHAT THE SIDE NUMBER IS 29EB E87800 2A66 CALL MSURF ;SET MINI HEAD NUMBER 29EE 8B0EAF2E MOV CX,HSTTRK ;GET TRACK NUMBER 29F2 D1E9 SHR CX,1 ;DIVIDE TRACK BY 2 29F4 E87200 2A69 CALL MCYL 29F7 B100 MOV CL,00H ;SET SIZE CODE TO 256 BYTES 29F9 E87600 2A72 CALL MSIZE 29FC B102 MOV CL,02H ;SET SECTOR COUNT TO 2 29FE E86E00 2A6F CALL MCNT 2A01 8A1EB12E MOV BL,HSTSEC ;CONVERT SECTOR NUMBER TO PROPER SKEW 2A05 FECB DEC BL ;NOW ZERO BASED FOR INDEXING 2A07 32FF XOR BH,BH ;DOUBLE BYTE INDEX WORD 2A09 8A8FE630 MOV CL,MFSTRANÆBXÅ 2A0D E85C00 2A6C CALL MREC ;SET ACTUAL SECTOR TO START READ UPON 2A10 B9E62E MOV CX,OFFSET HSTBUF ;SET FLOPPY BUFFER ADDRESS 2A13 E85F00 2A75 CALL MBADDR 2A16 B94010 MOV CX,1040H ;GLOBAL SEGMENT TO HOST BUFFER 2A19 E85C00 2A78 CALL MSEG 2A1C C3 RET \f CP/M ASM86 1.1 SOURCE: DFDBIOS.A86 CR8 - CP/M-86 BIOS VERS. 3.0 PAGE 33 EJECT ;****************************************************************************** ; ; ;PRINT THE MESSAGE AT BX UNTIL A ZERO ; ; PRTMSG: 2A1D 8A0F MOV CL,ÆBXÅ ;GET CHARACTER TO PRINT 2A1F 0AC9 OR CL,CL ;SET FLAGS 2A21 7408 2A2B JZ PRTDONE ;RETURN, IF END OF STRING FLAG 2A23 53 PUSH BX ;SAVE MESSAGE POINTER 2A24 E852FC 2679 CALL CONOUT ;PRINT CHARACTER, CONSOLE OUTPUT 2A27 5B POP BX ;GET POINTER BACK 2A28 43 INC BX ;BUMP MESSAGE POINTER 2A29 EBF2 2A1D JMPS PRTMSG PRTDONE: 2A2B C3 RET ; ; ; ; ; ;****************************************************************************** ; ;DUMMY INTERRUPT TRAP ROUTINE ; TRAP: 2A2C CF IRET ; \f CP/M ASM86 1.1 SOURCE: DFDBIOS.A86 CR8 - CP/M-86 BIOS VERS. 3.0 PAGE 34 EJECT ;****************************************************************************** ; ; FIXED ADDRESS I/O ROUTINES TO BE UTILIZED BY CP/M-86 ON MINI FLOPPY, ; HARD DISK, CONSOLE I/O, LINE PRINTER I/O. THESE ROUTINES ARE USED BY ; UTILITIES, SUCH AS DISK FORMATTING AND SYSTEM TRACK ACCESS UTILITIES. ; AN EXTRA ENTRY IN THE BIOS JUMP VECTOR TABLE (CS:253FH) HAS BEEN ; ADDED. THIS ROUTINE WILL RETURN BX = OFFSET VECTABLE ; VECTABLE: ;VECTOR TABLE BASE OFFSET ; 2A2D E95D00 2A8D LPTINP: JMP LPIN ;GET CHARACTER FROM LINEPRINTER 2A30 E9C600 2AF9 LOOKQ: JMP LQ ;GET QUEUE STATUS 2A33 E9ED00 2B23 DEQ: JMP DQ ;GET BUFFER FROM QUEUE 2A36 E92801 2B61 ENQ: JMP NQ ;PUT BUFFER INTO QUEUE 2A39 E94E00 2A8A HUNIT: JMP HDUMMY ;SELECT HARD DISK UNIT NUMBER 2A3C E94B00 2A8A HPLAT: JMP HDUMMY ;SELECT HARD DISK PLATTER NUMBER 2A3F E94800 2A8A HSURF: JMP HDUMMY ;SELECT HARD DISK SURFACE(HEAD) NUMBER 2A42 E94500 2A8A HCYL: JMP HDUMMY ;SELECT HARD DISK CYLINDER NUMBER 2A45 E94200 2A8A HREC: JMP HDUMMY ;SELECT HARD DISK RECORD NUMBER 2A48 E93F00 2A8A HCNT: JMP HDUMMY ;SELECT HARD DISK SECTOR COUNT 2A4B E93C00 2A8A HBADDR: JMP HDUMMY ;SET DATA BUFFER OFFSET 2A4E E93900 2A8A HSEG: JMP HDUMMY ;SET DATA BUFFER SEGMENT 2A51 E93600 2A8A HREST: JMP HDUMMY ;RESTORE SELECTED HARD DISK UNIT 2A54 E93300 2A8A HREAD: JMP HDUMMY ;READ SELECTED SECTOR(S) 2A57 E93000 2A8A HVERF: JMP HDUMMY ;VERIFY SELECTED SECTOR(S) 2A5A E92D00 2A8A HWRIT: JMP HDUMMY ;WRITE SELECTED SECTOR(S); 2A5D E92A00 2A8A HEXEC: JMP HDUMMY ;EXECUTE SPECIAL COMMAND OF DTC 2A60 E92700 2A8A HRESET: JMP HDUMMY ;RESTART HARD DISK CONTROLLER 2A63 E93A01 2BA0 MUNIT: JMP MSETUNIT ;SELECT MINI FLOPPY UNIT NUMBER 2A66 E93C01 2BA5 MSURF: JMP MSETSUR ;SELECT MINI FLOPPY SURFACE(HEAD) NUMBER 2A69 E93E01 2BAA MCYL: JMP MSETCYL ;SELECT MINI FLOPPY CYLINDER (TRACK) NUMBER 2A6C E94001 2BAF MREC: JMP MSETREC ;SELECT MINI FLOPPY RECORD NUMBER 2A6F E94201 2BB4 MCNT: JMP MSETCNT ;SELECT MINI FLOPPY PHYSICAL SECTOR COUNT 2A72 E94401 2BB9 MSIZE: JMP MSETSIZE ;SET MINI FLOPPY SECTOR SIZE (00=256 BYTES) 2A75 E94601 2BBE MBADDR: JMP MSETBUF ;SET FLOPPY DISK DATA BUFFER ADDRESS 2A78 E94801 2BC3 MSEG: JMP MSETSEG ;SET FLOPPY DISK DATA BUFFER SEGMENT 2A7B E94A01 2BC8 MREST: JMP FRESTR ;RESTORE SELECTED MINI FLOPPY UNIT 2A7E E94D01 2BCE MVERF: JMP MVERSEC ;VERIFY (READ) SELECTED SECTOR 2A81 E94D01 2BD1 MWRIT: JMP MPUTSEC ;WRITE SELECTED SECTOR 2A84 E95001 2BD7 MREAD: JMP MGETSEC ;READ SELECTED SECTOR 2A87 E95301 2BDD MWTRK: JMP MWRTTRK ;WRITE SELECTED FLOPPY TRACK \f CP/M ASM86 1.1 SOURCE: DFDBIOS.A86 CR8 - CP/M-86 BIOS VERS. 3.0 PAGE 35 ; 2A8A B001 HDUMMY: MOV AL,01 ;RETURN ERROR FOR CALLS TO 2A8C C3 RET ;HARD DISK ROUTINES. ;(NOT AVAILABLE) ; ;****************************************************************************** ; LINEPRINTER INPUT ROUTINE ; GETS CHAR TO (AL) REGISTER ;****************************************************************************** ; LPIN: 2A8D 06 PUSH ES 2A8E B80020 MOV AX,2000H ;Z80 RAM BASE ADDRESS 2A91 8EC0 MOV ES,AX 2A93 F706F030FFFF TEST PLIB,0FFFFH ;TEST IF BUFFER PENDING 2A99 7532 2ACD JNZ LPIN3 ;GO PICK NEXT CHARACTER THERE ; ;NO BUFFER PENDING, TRY TO GET ONE. ; LPIN1: 2A9B BB0081 MOV BX,IFTOFF+LPCHA+RXF ;QUEUE OFFSET 2A9E E892FF 2A33 CALL DEQ ;GET BUFFER 2AA1 73F8 2A9B JNC LPIN1 ;WAIT IF NO BUFFER IN QUEUE 2AA3 87DA XCHG BX,DX ;GET BUFFER ADDRESS INTO BX 2AA5 268B5704 MOV DX,ES:ÆBXÅ+DPTR ;GET 1. DATA ADDR. FROM QHEAD 2AA9 87DA XCHG BX,DX 2AAB 26803F03 CMP ES:BYTE PTR ÆBXÅ,ENTDLDU;MUST BE ENTIRE DATA LDU 2AAF 7408 2AB9 JE LPIN2 ;GO GET DATA IF LDU TYPE OK 2AB1 BB1081 MOV BX,IFTOFF+LPCHA+RXE ;ELSE 2AB4 E87FFF 2A36 CALL ENQ ;RELEASE BUFFER AND 2AB7 EBE2 2A9B JMPS LPIN1 ;...GO TRY AGAIN ; ;INSTALL NEWLY RECEIVED BUFFER AS PENDING. ; LPIN2: 2AB9 8916F030 MOV PLIB,DX ;SAVE BUFFER ADDRESS 2ABD 43 INC BX 2ABE 43 INC BX ;POINT TO DATABYTE 2ABF 891EEE30 MOV LIBP,BX ;SAVE POINTER TO NEXT CHARACTER 2AC3 8BDA MOV BX,DX 2AC5 26FF4F02 DEC ES:WORD PTR BYTECÆBXÅ ;DECREMENT BYTECOUNT BY TWO 2AC9 26FF4F02 DEC ES:WORD PTR BYTECÆBXÅ \f CP/M ASM86 1.1 SOURCE: DFDBIOS.A86 CR8 - CP/M-86 BIOS VERS. 3.0 PAGE 36 EJECT ; ; ;GET CHARACTER FROM PENDING BUFFER. ; LPIN3: 2ACD 8B1EEE30 MOV BX,LIBP ;GET DATAPOINTER 2AD1 268A07 MOV AL,ES:ÆBXÅ ;GET DATA FROM BUFFER 2AD4 43 INC BX ;UPDATE POINTER 2AD5 891EEE30 MOV LIBP,BX ;SAVE NEW POINTER 2AD9 8B1EF030 MOV BX,PLIB ;GET BUFFER ADDRESS 2ADD 26FF4F02 DEC ES:WORD PTR BYTECÆBXÅ ;DECREMENT BYTECOUNT IN BUFFER 2AE1 7512 2AF5 JNZ LBNMTY ;EXIT IF NOT EMPTY ; ; ;NO MORE JUICE IN THAT ONE, RELEASE IT. ; 2AE3 8B16F030 MOV DX,PLIB ;GET BUFFER ADDRESS 2AE7 BB1081 MOV BX,IFTOFF+LPCHA+RXE ;EMPTY QUEUE OFFSET 2AEA 50 PUSH AX ;SAVE CHARACTER 2AEB E848FF 2A36 CALL ENQ ;RETURN BUFFER 2AEE C706F0300000 MOV PLIB,0 ;NO BUFFER PENDING 2AF4 58 POP AX ; ; ;THAT'S ALL FOLKS, RETURN TO CALLER ; LBNMTY: 2AF5 07 POP ES 2AF6 247F AND AL,7FH ;MASK OFF PARITYBIT 2AF8 C3 RET ; \f CP/M ASM86 1.1 SOURCE: DFDBIOS.A86 CR8 - CP/M-86 BIOS VERS. 3.0 PAGE 37 EJECT ; ;****************************************************************************** ; THIS MODULE CONTAINS THE INTERFACE ROUTINES NESSESARY FOR ; INTER-CPU COMMUNICATION VIA THE CHRISTIAN ROVSING A/S CR80 - ; LTU STANDARD QUEUE INTERFACE. ;****************************************************************************** ; ; ; THE MODULE CONSISTS OF THE FOLLOWING ROUTINES: ; ; LOOKQ: RETURNS AL = NBR. OF BUFFERS IN QUEUE ; ; DEQ: POLL DESIRED QUEUE ; ; ENQ: SEND BUFFER TO DESIRED QUEUE ; ; ALL ROUTINES EXPECTS REG. ES TO CONTAIN THE BASE ADDRESS OF THE ; BOARD IN WHICH THE QUEUE EXISTS. WHEN COMMUNICATING WITH A ; SCI BOARD THIS BASE MUST BE COMPENSATED BECAUSE THE SCI RAM ; HAS DIFFERENT BASE ADDRESS SEEN FROM THE MULTIBUS THAN SEEN ; FROM THE ONBOARD CPU, WHILE THE Z80 RAM ON THE MP2-BOARD HAS ; GOT SAME BASE ADDRESS SEEN FROM BOTH SIDES (LOWER 16 BITS). ; THIS STATES THE FOLLOWING VALUES FOR ES: ; MP2: ES=2000 SCI: ES=BOARD ADR.-200H ; ; ;****************************************************************************** \f CP/M ASM86 1.1 SOURCE: DFDBIOS.A86 CR8 - CP/M-86 BIOS VERS. 3.0 PAGE 38 EJECT ;****************************************************************************** ; ; THIS ROUTINE WILL POLL THE SPECIFIED QUEUE FOR A BUFFER COUNT. ; ; ENTRY: ; ES = BOARD/RAM BASE ADDRESS ; BX = QUEUE OFFSET FROM BASE ; ; EXIT: ; AL = NBR OF BUFFERS IN QUEUE ; LQ: 2AF9 26C6470601 MOV ES:BYTE PTR ÆBXÅ+SF,01 ;SET SLAVE FLAG 2AFE 26F6470801 TEST ES:BYTE PTR ÆBXÅ+MF,01 ;TEST MASTER FLAG 2B03 7411 2B16 JZ LOOKACC ;JUMP IF ACCESS GRANDED 2B05 26C6470600 MOV ES:BYTE PTR ÆBXÅ+SF,00 ;CLEAR SLAVE FLAG LOOKBSY: 2B0A E81300 2B20 CALL QDELAY ;DON'T USE ALL OF HIS BUS TIME 2B0D 26F6470801 TEST ES:BYTE PTR ÆBXÅ+MF,01 ;SEE IF MASTER ACCESS COMPLETED 2B12 75F6 2B0A JNZ LOOKBSY ;WAIT IF NOT 2B14 EBE3 2AF9 JMPS LQ ;GO TRY TO GET GRAND AGAIN LOOKACC: 2B16 268A4701 MOV AL,ES:ÆBXÅ+BC ;GET BUFFERCOUNT FROM QUEUE 2B1A 26C6470600 MOV ES:BYTE PTR ÆBXÅ+SF,00 ;CLEAR SLAVE FLAG 2B1F C3 RET ; ; ; ; QDELAY: 2B20 90 NOP 2B21 90 NOP 2B22 C3 RET ; \f CP/M ASM86 1.1 SOURCE: DFDBIOS.A86 CR8 - CP/M-86 BIOS VERS. 3.0 PAGE 39 EJECT ;****************************************************************************** ; ; THIS ROUTINE WILL POLL THE SPECIFIED QUEUE FOR A BUFFER. ; ; ENTRY: ; ES = BOARD/RAM BASE ADDRESS ; BX = QUEUE OFFSET FROM BASE ; ; EXIT: ; IF CARRY=1, DX=POINTER TO BUFFER ; IF CARRY=0, DX UNDEFINED ; DQ: 2B23 26C6470601 MOV ES:BYTE PTR ÆBXÅ+SF,01 ;SET SLAVE FLAG 2B28 26F6470801 TEST ES:BYTE PTR ÆBXÅ+MF,01 ;TEST MASTER FLAG 2B2D 7411 2B40 JZ DEQACC ;JUMP IF ACCESS GRANDED 2B2F 26C6470600 MOV ES:BYTE PTR ÆBXÅ+SF,00 ;CLEAR SLAVE FLAG DEQBSY: 2B34 E8E9FF 2B20 CALL QDELAY ;DON'T USE ALL OF HIS BUS TIME 2B37 26F6470801 TEST ES:BYTE PTR ÆBXÅ+MF,01 ;SEE IF MASTER ACCESS COMPLETED 2B3C 75F6 2B34 JNZ DEQBSY ;WAIT IF NOT 2B3E EBE3 2B23 JMPS DQ ;GO TRY TO GET GRAND AGAIN DEQACC: 2B40 26F64701FF TEST ES:BYTE PTR ÆBXÅ+BC,0FFH;TEST IF QUEUE IS EMPTY (+CY:=0) 2B45 7414 2B5B JZ DEQMTY ;EXIT IF NO BUFFERS IN QUEUE 2B47 26FE4F01 DEC ES:BYTE PTR ÆBXÅ+BC ;DECREMENT BUFFERCOUNT 2B4B 268B5702 MOV DX,ES:ÆBXÅ+FB ;GET BUFFER ADDRESS FROM QUEUE 2B4F 87DA XCHG BX,DX 2B51 268B07 MOV AX,ES:ÆBXÅ ;GET POINTER TO NEXT BUFFER IN QUEUE 2B54 87DA XCHG BX,DX 2B56 26894702 MOV ES:ÆBXÅ+FB,AX ;INSERT AS FIRST BUFFER IN QUEUE 2B5A F9 STC ;FLAG BUFFER RECEIVED DEQMTY: 2B5B 26C6470600 MOV ES:BYTE PTR ÆBXÅ+SF,00 ;CLEAR SLAVE FLAG 2B60 C3 RET ; \f CP/M ASM86 1.1 SOURCE: DFDBIOS.A86 CR8 - CP/M-86 BIOS VERS. 3.0 PAGE 40 EJECT ;****************************************************************************** ; ; THIS ROUTINE WILL APPEND A BUFFER TO THE SPECIFIED QUEUE. ; ; ENTRY: ; BX = POINTER TO QUEUE ; DX = POINTER TO BUFFER ; ES = BOARD/RAM BASE ADDRESS ; ; EXIT: ; ES UNCHANGED, NO PARAMETERS ; NQ: 2B61 26C6470801 MOV ES:BYTE PTR ÆBXÅ+MF,01 ;SET MASTER FLAG ENQBSY: 2B66 26F6470601 TEST ES:BYTE PTR ÆBXÅ+SF,01 ;SEE IF SLAVE IS IN THERE 2B6B 7405 2B72 JZ ENQACC ;PROCEED IF NOT 2B6D E8B0FF 2B20 CALL QDELAY ;DON'T USE ALL OF HIS BUS TIME 2B70 EBF4 2B66 JMPS ENQBSY ;WAIT UNTIL HE COMES OUT ENQACC: 2B72 268B4704 MOV AX,ES:ÆBXÅ+LB ;GET OLD LAST BUFFER 2B76 26895704 MOV ES:ÆBXÅ+LB,DX ;SAVE NEW LAST BUFFER 2B7A 26F64701FF TEST ES:BYTE PTR ÆBXÅ+BC,0FFH;TEST BUFFERCOUNT IN QUEUE 2B7F 7407 2B88 JZ ENQMTY ;JUMP IF QUEUE WAS EMPTY ; 2B81 93 XCHG BX,AX 2B82 268917 MOV ES:ÆBXÅ,DX ;UPDATE ITS CHAIN ELEMENT 2B85 93 XCHG BX,AX 2B86 EB04 2B8C JMPS ENQXIT ENQMTY: 2B88 26895702 MOV ES:ÆBXÅ+FB,DX ;UPDATE ALSO FIRST BUFFER POINTER ENQXIT: 2B8C 26FE4701 INC ES:BYTE PTR ÆBXÅ+BC ;INCREMENT BUFFER COUNT IN QUEUE 2B90 26C6470800 MOV ES:BYTE PTR ÆBXÅ+MF,00 ;CLEAR MASTER FLAG 2B95 C3 RET ; \f CP/M ASM86 1.1 SOURCE: DFDBIOS.A86 CR8 - CP/M-86 BIOS VERS. 3.0 PAGE 41 EJECT ;****************************************************************************** ; ; SHORT DELAY ROUTINE FOR TIME DELAYS OF (AL) X 1 MSEC ; ; SDLY: 2B96 B9FA00 MOV CX,250 ;ONE MILLISECOND TIME FACTOR SDLOP: 2B99 E2FE 2B99 LOOP SDLOP 2B9B FEC8 DEC AL 2B9D 75F7 2B96 JNZ SDLY 2B9F C3 RET ; \f CP/M ASM86 1.1 SOURCE: DFDBIOS.A86 CR8 - CP/M-86 BIOS VERS. 3.0 PAGE 42 EJECT ;****************************************************************************** ; MINI FLOPPY DISK CONTROLLER I/O ROUTINES ;****************************************************************************** ; ; ; ;SELECT MINI FLOPPY UNIT NUMBER ;(CL)=FLOPPY PHYSICAL UNIT NUMBER ; MSETUNIT: 2BA0 880EF530 MOV FUNIT,CL 2BA4 C3 RET ; ; ; ;SELECT MINI FLOPPY SURFACE(HEAD) NUMBER ;(CL)=FLOPPY SIDE NUMBER ; MSETSUR: 2BA5 880EF630 MOV FSIDE,CL 2BA9 C3 RET ; ; ; ;SELECT MINI FLOPPY CYLINDER (TRACK) NUMBER ;(CL)=FLOPPY TRACK NUMBER ; MSETCYL: 2BAA 880EF730 MOV FTRK,CL 2BAE C3 RET ; ; ; ;SELECT MINI FLOPPY RECORD NUMBER ;(CL)=FLOPPY SECTOR NUMBER ; MSETREC: 2BAF 880EF830 MOV FSEC,CL 2BB3 C3 RET ; \f CP/M ASM86 1.1 SOURCE: DFDBIOS.A86 CR8 - CP/M-86 BIOS VERS. 3.0 PAGE 43 EJECT ; ; ; ;SELECT MINI FLOPPY PHYSICAL SECTOR COUNT ;(CL)=MINI FLOPPY SECTOR COUNT ; MSETCNT: 2BB4 880EF930 MOV FCNT,CL 2BB8 C3 RET ; ; ; ;SET FLOPPY SECTOR SIZE SELECT ;(CL)=SECTOR SIZE IN BYTES UP TO (00)=256 BYTES ; MSETSIZE: 2BB9 880EFE30 MOV FSIZE,CL 2BBD C3 RET ; ; ; ;SET FLOPPY DISK DATA BUFFER OFFSET ;(CX)=FLOPPY BUFFER OFFSET ; MSETBUF: 2BBE 890EFA30 MOV XFRPNT,CX ;STORE FLOPPY DATA BUFFER OFFSET 2BC2 C3 RET ; ; ; ;SET FLOPPY DISK DATA BUFFER SEGMENT ;(CX)=FLOPPY BUFFER SEGMENT ; MSETSEG: 2BC3 890EFC30 MOV XFRSEG,CX ;STORE FLOPPY DATA BUFFER SEGMENT 2BC7 C3 RET ; \f CP/M ASM86 1.1 SOURCE: DFDBIOS.A86 CR8 - CP/M-86 BIOS VERS. 3.0 PAGE 44 EJECT ; ; ; FRESTR: 2BC8 B000 MOV AL,RESTORE 2BCA E81600 2BE3 CALL FDCMD ;GO EXECUTE RESTORE 2BCD C3 RET ; ; ; MVERSEC: 2BCE B0FF MOV AL,0FFH 2BD0 C3 RET ; ; ; MPUTSEC: 2BD1 B002 MOV AL,WRITEFD 2BD3 E80D00 2BE3 CALL FDCMD ;GO EXECUTE FLOPPY WRITE 2BD6 C3 RET ; ; ; MGETSEC: 2BD7 B001 MOV AL,READFD 2BD9 E80700 2BE3 CALL FDCMD ;GO EXECUTE FLOPPY READ 2BDC C3 RET ; ; ; MWRTTRK: 2BDD B003 MOV AL,WRTRACK 2BDF E80100 2BE3 CALL FDCMD ;GO FORMAT TRACK 2BE2 C3 RET ; \f CP/M ASM86 1.1 SOURCE: DFDBIOS.A86 CR8 - CP/M-86 BIOS VERS. 3.0 PAGE 45 EJECT ;****************************************************************************** ; ; THIS ROUTINE WILL EXECUTE THE FLOPPY COMMAND IN (AL), USING THE ; THE PARAMETERS STORED IN THE FLOPPY PARAMETER I/O BLOCK. ; ; ENTRY: AL = FLOPPY COMMAND ; EXIT: IF COMMAND SUCCESSFULL, AL = 0 ; IF COMMAND FAILED, AL = ERROR STATUS ; FDCMD: 2BE3 A2F430 MOV FINST,AL ;SAVE COMMAND TYPE 2BE6 06 PUSH ES 2BE7 B80020 MOV AX,2000H ;Z80 RAM BASE ADDRESS 2BEA 8EC0 MOV ES,AX FDCMD1: 2BEC BB2081 MOV BX,IFTOFF+FDCHA+TXE ;QUEUE OFFSET 2BEF E841FE 2A33 CALL DEQ ;GET EMPTY BUFFER 2BF2 73F8 2BEC JNC FDCMD1 ;WAIT IF NO BUFFER IN QUEUE ; 2BF4 BB0C00 MOV BX,12 2BF7 03DA ADD BX,DX ;COMPUTE 1. DATA POINTER 2BF9 8BFB MOV DI,BX 2BFB BEF230 MOV SI,OFFSET FDIOPB ;GET PARAMETER BLOCK ADDRESS 2BFE B90C00 MOV CX,ENDFDIO-FDIOPB ;GET NBR.OF BYTES TO MOVE 2C01 F3A4 REP MOVS AL,AL ;MOVE PARAMETERS INTO BUFFER 2C03 87DA XCHG BX,DX 2C05 26895704 MOV ES:ÆBXÅ+DPTR,DX ;SAVE POINTER IN QHEAD 2C09 26C747020C00 MOV ES:WORD PTR ÆBXÅ+BYTEC,ENDFDIO-FDIOPB ;SET BYTECOUNT 2C0F 87DA XCHG BX,DX 2C11 BB3081 MOV BX,IFTOFF+FDCHA+TXF ;QUEUE OFFSET 2C14 E81FFE 2A36 CALL ENQ ;SEND BUFFER TO Z80 ; \f CP/M ASM86 1.1 SOURCE: DFDBIOS.A86 CR8 - CP/M-86 BIOS VERS. 3.0 PAGE 46 EJECT ; ;COMMAND SEND, NOW WAIT FOR RESPONCE ; FDWAIT: 2C17 BB4081 MOV BX,IFTOFF+FDCHA+RXF ;QUEUE OFFSET 2C1A E816FE 2A33 CALL DEQ ;GET BUFFER 2C1D 73F8 2C17 JNC FDWAIT ;WAIT IF NO BUFFER IN QUEUE 2C1F 87DA XCHG BX,DX ;GET BUFFER ADDRESS INTO BX 2C21 268B5704 MOV DX,ES:ÆBXÅ+DPTR ;GET 1. DATA ADDR. FROM QHEAD 2C25 87DA XCHG BX,DX 2C27 26803F07 CMP ES:BYTE PTR ÆBXÅ,ENTCLDU;MUST BE ENTIRE COMMAND LDU 2C2B 7404 2C31 JE FDW1 ;GO GET STATUS TYPE IF LDU TYPE OK FDERR: 2C2D B0FD MOV AL,CPUSYNC ;FLAG ERROR 2C2F EB0F 2C40 JMPS FDEXIT FDW1: 2C31 43 INC BX 2C32 43 INC BX ;POINT TO STATUS TYPE 2C33 268A07 MOV AL,ES:ÆBXÅ ;GET STATUS TYPE FROM BUFFER 2C36 3A06F430 CMP AL,FINST ;MUST MATCH COMMAND TYPE 2C3A 75F1 2C2D JNE FDERR ;ERROR EXIT IF NOT ; 2C3C 43 INC BX ;POINT TO STATUS BYTE 2C3D 268A07 MOV AL,ES:ÆBXÅ ;GET DATA FROM BUFFER FDEXIT: 2C40 BB5081 MOV BX,IFTOFF+FDCHA+RXE ;EMPTY QUEUE OFFSET 2C43 50 PUSH AX ;SAVE CHARACTER 2C44 E8EFFD 2A36 CALL ENQ ;RETURN BUFFER 2C47 58 POP AX 2C48 07 POP ES ;RESTORE SEGMENT 2C49 C3 RET ; \f CP/M ASM86 1.1 SOURCE: DFDBIOS.A86 CR8 - CP/M-86 BIOS VERS. 3.0 PAGE 47 EJECT ;****************************************************************************** ; REAL TIME CLOCK INTERRUPT SERVICE ROUTINE ;****************************************************************************** ; RTCINT: 2C4A 1E PUSH DS ;SAVE DATA SEGMENT 2C4B 06 PUSH ES 2C4C 50 PUSH AX 2C4D 53 PUSH BX 2C4E 52 PUSH DX 2C4F 0E PUSH CS 2C50 1F POP DS 2C51 F606C72EFF TEST CONSEMAP,0FFH ;IF SEMAPHORE SET 2C56 751D 2C75 JNZ TESTLPT ;...GO LOOK AT PRINTER 2C58 F706C32EFFFF TEST CONPTR,0FFFFH ;TEST IF BUFFER PENDING 2C5E 7415 2C75 JZ TESTLPT ;DON'T FORGET THE PRINTER 2C60 C706C32E0000 MOV CONPTR,0 ;REMOVE PENDING BUFFER 2C66 B80020 MOV AX,2000H 2C69 8EC0 MOV ES,AX ;GET Z80-RAM BASE ADDRESS 2C6B BBB080 MOV BX,IFTOFF+CONCHA+TXF ;GET QUEUE OFFSET 2C6E 8B16C52E MOV DX,CONBUF ;GET BUFFER ADDRESS 2C72 E8C1FD 2A36 CALL ENQ ;FORWARD BUFFER TESTLPT: 2C75 F606CC2EFF TEST LPTSEMAP,0FFH ;IF SEMAPHORE SET 2C7A 751D 2C99 JNZ RTCEXIT ;...EXIT INTERRUPT 2C7C F706C82EFFFF TEST LPTPTR,0FFFFH ;TEST IF BUFFER PENDING 2C82 7415 2C99 JZ RTCEXIT ;...EXIT IF NOT 2C84 C706C82E0000 MOV LPTPTR,0 ;REMOVE PENDING BUFFER 2C8A B80020 MOV AX,2000H 2C8D 8EC0 MOV ES,AX ;GET Z80-RAM BASE ADDRESS 2C8F BBF080 MOV BX,IFTOFF+LPCHA+TXF ;GET QUEUE OFFSET 2C92 8B16CA2E MOV DX,LPTBUF ;GET BUFFER ADDRESS 2C96 E89DFD 2A36 CALL ENQ ;FORWARD BUFFER RTCEXIT: 2C99 5A POP DX 2C9A 5B POP BX 2C9B 58 POP AX 2C9C 07 POP ES 2C9D 1F POP DS ;RESTORE DATA SEGMENT 2C9E CF IRET ; \f CP/M ASM86 1.1 SOURCE: DFDBIOS.A86 CR8 - CP/M-86 BIOS VERS. 3.0 PAGE 48 EJECT ; 2C9F DATAOFF EQU OFFSET $ DSEG ORG DATAOFF ; = INCLUDE FDDISK.LIB = ; DISKS 2 = 2C9F dpbase equ $ ;Base of Disk Parameter Blocks =2C9F 00000000 dpe0 dw xlt0,0000h ;Translate Table =2CA3 00000000 dw 0000h,0000h ;Scratch Area =2CA7 CE2CBF2C dw dirbuf,dpb0 ;Dir Buff, Parm Block =2CAB 742D4E2D dw csv0,alv0 ;Check, Alloc Vectors =2CAF 00000000 dpe1 dw xlt1,0000h ;Translate Table =2CB3 00000000 dw 0000h,0000h ;Scratch Area =2CB7 CE2CBF2C dw dirbuf,dpb1 ;Dir Buff, Parm Block =2CBB BA2D942D dw csv1,alv1 ;Check, Alloc Vectors = ; DISKDEF 0,1,32,,2048,304,128,128,2 ;E: MINI DRIVE = 2CBF dpb0 equ offset $ ;Disk Parameter Block =2CBF 2000 dw 32 ;Sectors Per Track =2CC1 04 db 4 ;Block Shift =2CC2 0F db 15 ;Block Mask =2CC3 00 db 0 ;Extnt Mask =2CC4 2F01 dw 303 ;Disk Size - 1 =2CC6 7F00 dw 127 ;Directory Max =2CC8 C0 db 192 ;Alloc0 =2CC9 00 db 0 ;Alloc1 =2CCA 2000 dw 32 ;Check Size =2CCC 0200 dw 2 ;Offset = 0000 xlt0 equ 0 ;No Translate Table = 0026 als0 equ 38 ;Allocation Vector Size = 0020 css0 equ 32 ;Check Vector Size = ; DISKDEF 1,0 = 2CBF dpb1 equ dpb0 ;Equivalent Parameters = 0026 als1 equ als0 ;Same Allocation Vector Size = 0020 css1 equ css0 ;Same Checksum Vector Size = 0000 xlt1 equ xlt0 ;Same Translate Table = ; ENDEF = ; = ; Uninitialized Scratch Memory Follows: = ; = 2CCE begdat equ offset $ ;Start of Scratch Area \f CP/M ASM86 1.1 SOURCE: DFDBIOS.A86 CR8 - CP/M-86 BIOS VERS. 3.0 PAGE 49 =2CCE dirbuf rs 128 ;Directory Buffer =2D4E alv0 rs als0 ;Alloc Vector =2D74 csv0 rs css0 ;Check Vector =2D94 alv1 rs als1 ;Alloc Vector =2DBA csv1 rs css1 ;Check Vector = 2DDA enddat equ offset $ ;End of Scratch Area = 010C datsiz equ offset $-begdat ;Size of Scratch Area =2DDA 00 db 0 ;Marks End of Module ; ;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 ; FOURTH BYTE: DISK PARAMETER TABLE INDEX (FROM DISKDEF) ; DSTAB: 2DDB FF00FF00 DB 0FFH,000H,0FFH,000H ;FLOPPY DISK DRIVE 0 2DDF FF01FF01 DB 0FFH,001H,0FFH,001H ;FLOPPY DISK DRIVE 1 2DE3 00000000 DB 000H,000H,000H,000H 2DE7 00000000 DB 000H,000H,000H,000H 2DEB 00000000 DB 000H,000H,000H,000H 2DEF 00000000 DB 000H,000H,000H,000H ; \f CP/M ASM86 1.1 SOURCE: DFDBIOS.A86 CR8 - CP/M-86 BIOS VERS. 3.0 PAGE 50 EJECT ; ;HDBIOS SIGNON MESSAGE ; 2DF3 0D0A1B5B376D SMSG DB CR,LF,ESC,'Æ7m' 2DF9 434852495354 DB 'CHRISTIAN ROVSING A/S CR8 - CP/M-86 Vers. 1.1 ' 49414E20524F 5653494E4720 412F53202043 5238202D2043 502F4D2D3836 20566572732E 20312E312020 2E29 3834 DB YEAR/10+'0',YEAR MOD 10+'0' 2E2B 3031 DB MONTH/10+'0',MONTH MOD 10+'0' 2E2D 3138 DB DAY/10+'0',DAY MOD 10+'0' 2E2F 0D0A1B5B6D DB CR,LF,ESC,'Æm' 2E34 4455414C2035 DB 'DUAL 5 1/4 INCH MINI FLOPPY BIOS Version ' 20312F342049 4E4348204D49 4E4920464C4F 505059204249 4F5320205665 7273696F6E20 20 2E5F 332E302020 DB VERSION/10+'0','.',VERSION MOD 10+'0',' ' 2E64 3834 DB YEAR/10+'0',YEAR MOD 10+'0' 2E66 3031 DB MONTH/10+'0',MONTH MOD 10+'0' 2E68 3138 DB DAY/10+'0',DAY MOD 10+'0' 2E6A 00 DB 0 ; \f CP/M ASM86 1.1 SOURCE: DFDBIOS.A86 CR8 - CP/M-86 BIOS VERS. 3.0 PAGE 51 EJECT ; ;ERROR ROUTINE MESSAGES ; ; 2E6B 0D0A0D0A202A ERRMSF DB CR,LF,CR,LF,' *** MINI FLOPPY DISK ERROR (#',0 2A2A204D494E 4920464C4F50 505920444953 4B204552524F 5220282300 2E8E 29202D204452 ERRMS2 DB ') - DRIVE ',0 4956452000 2E99 3A202A2A2A20 ERRMS3 DB ': *** ',0 2000 2EA1 0D0A00 ERRMS4 DB CR,LF,0 ; \f CP/M ASM86 1.1 SOURCE: DFDBIOS.A86 CR8 - CP/M-86 BIOS VERS. 3.0 PAGE 52 EJECT ;**************************************************************************** ; ; STORAGE AREA FOR VARIABLES BEGINS HERE... ; ; THE NEXT SEVERAL BYTES, BETWEEN STARTZ AND ; ENDZ, ARE SET TO ZERO AT COLD BOOT TIME ; 2EA4 STARTZ EQU OFFSET $ ;START OF ZEROED AREA ; ; ;NOTE: THIS LOCATION STORES THE DISK CONTROLLER ;I/O ERROR CODE FOR DEBUGGING PURPOSES. ; 2EA4 IOERR RB 1 ;DISK I/O ERROR TYPE ; ; ; ; ;HOST DISK BLOCKING/DE-BLOCKING DATA AREA ; ; ;(FOLLOWING TWO VARIABLES MUST BE KEPT TOGETHER HERE TO PERMIT WORD ; REFERENCE TO THEM DURING THE DISK HOME ROUTINE) ; 2EA5 TEMPMHD RB 1 ;TEMP STORAGE FOR CURRENT TYPE OF DRIVE; 2EA6 TEMPDSK RB 1 ;TEMPORARY STORAGE FOR LOGGED DISK ; 2EA7 MINIHARD RB 1 ;FLAG FOR MINI OR HARD DISK SELECTED ; 2EA8 SEKMHD RB 1 ;FLAG FOR SELECTED DRIVE TYPE FLAG 2EA9 SEKDSK RB 1 ;SEEK DISK NUMBER 2EAA SEKTRK RW 1 ;SEEK TRACK NUMBER 2EAC SEKSEC RB 1 ;SEEK SECTOR NUMBER ; \f CP/M ASM86 1.1 SOURCE: DFDBIOS.A86 CR8 - CP/M-86 BIOS VERS. 3.0 PAGE 53 EJECT ;(FOLLOWING TWO VARIABLES MUST BE KEPT TOGETHER HERE TO PERMIT WORD ; REFERENCE TO THEM DURING THE DISK HOME ROUTINE) ; 2EAD HSTMHD RB 1 ;HOST DISK TYPE FLAG 2EAE HSTDSK RB 1 ;HOST DISK NUMBER 2EAF HSTTRK RW 1 ;HOST TRACK NUMBER 2EB1 HSTSEC RB 1 ;HOST SECTOR NUMBER ; 2EB2 SEKHST RB 1 ;SEEK SHR SECSHF 2EB3 HSTACT RB 1 ;HOST ACTIVE FLAG 2EB4 HSTWRT RB 1 ;HOST WRITTEN FLAG ; 2EB5 UNACNT RB 1 ;UNALLOCATED RECORD COUNT 2EB6 UNADSK RB 1 ;LAST UNALLOCATED DISK 2EB7 UNATRK RW 1 ;LAST UNALLOCATED TRACK 2EB9 UNASEC RB 1 ;LAST UNALLOCATED SECTOR ; 2EBA ERFLAG RB 1 ;ERROR REPORTING 2EBB RSFLAG RB 1 ;READ SECTOR FLAG 2EBC READOP RB 1 ;1 IF READ OPERATION 2EBD WRTYPE RB 1 ;WRITE OPERATION TYPE 2EBE DMAADR RW 1 ;DISK DMA TRANSFER ADDRESS ; 2EC0 DEFDMASG RW 1 ;STORAGE FOR DMA SEGMENT VALUE 2EC2 IOBYTE RB 1 ;STORAGE FOR IOBYTE ; 2EC3 CONPTR RW 1 ;CONSOLE BUFFER FILLING POINTER 2EC5 CONBUF RW 1 ;CONSOLE BUFFER ADDRESS STORAGE 2EC7 CONSEMAP RB 1 ;CONSOLE BUFFER ACCESS SEMAPHORE ; 2EC8 LPTPTR RW 1 ;PRINTER BUFFER FILLING POINTER 2ECA LPTBUF RW 1 ;PRINTER BUFFER ADDRESS STORAGE 2ECC LPTSEMAP RB 1 ;PRINTER BUFFER ACCESS SEMAPHORE ; 2ECD ENDZ EQU OFFSET $ ;END OF ZEROED AREA ; 2ECD 0000 CIBP DW 0 ;PENDING BUFFER DATA POINTER 2ECF 0000 PCIB DW 0 ;PENDING BUFFER VALID, BUFFER ADDRESS ; \f CP/M ASM86 1.1 SOURCE: DFDBIOS.A86 CR8 - CP/M-86 BIOS VERS. 3.0 PAGE 54 EJECT ;****************************************************************************** ; MEMORY REGION TABLE (MAX 5 MEMORY BLOCKS) ;****************************************************************************** ; 2ED1 01 MTR DB 01 ;NBR OF MEMMORY REGIONS 2ED2 5403 DW STARTTPA ;START OF FIXED SEGMENT 2ED4 AC0C DW 1000H-STARTTPA ;LENGTH OF FIXED SEGMENT 2ED6 RW 4*2 ;MAX 4 EXTRA SEGMENTS MAY BE SPECIFIED ; ; ; ;HOST DATA BUFFER MEMORY AREA MUST BE ACCESSABLE VIA ;DMA AND BY THE HARD DISK CONTROLLER BOARD. ; ; 2EE6 HSTBUF RB HSTSIZ ;HOST BUFFER ; ; ; ;SCRATCH RAM AREA FOR BDOS USE ; ; ENDEF ;LET DISKDEF FIXUP BDOS BUFFERS ; ; ; ; ; ; ;MINI FLOPPY PHYSICAL SECTOR TRANSLATE TABLE ; 30E6 0105090D0307 MFSTRAN DB 1,5,9,13,3,7,11,15 0B0F ; 30EE 0000 LIBP DW 0 ;PENDING BUFFER DATA POINTER 30F0 0000 PLIB DW 0 ;PENDING BUFFER VALID, BUFFER ADDRESS ; \f CP/M ASM86 1.1 SOURCE: DFDBIOS.A86 CR8 - CP/M-86 BIOS VERS. 3.0 PAGE 55 EJECT ;****************************************************************************** ; MINI FLOPPY DRIVE ACCESS PARAMETER BLOCK ;****************************************************************************** ; 30F2 FDIOPB EQU OFFSET $ ; 30F2 07 DB ENTCLDU ;ENTIRE COMMAND LDU 30F3 09 DB COMOPC ;COMMAND BUFFER FLAG 30F4 00 FINST DB 0 ;DISK ACCESS INSTRUCTION BYTE 30F5 00 FUNIT DB 0 ;SELECTED UNIT NUMBER 30F6 00 FSIDE DB 0 ;SELECTED SIDE NUMBER 30F7 00 FTRK DB 0 ;SELECTED TRACK NUMBER 30F8 01 FSEC DB 1 ;SELECTED SECTOR NUMBER 30F9 02 FCNT DB 2 ;SELECTED 256 BYTE SECTOR COUNT 30FA E62E XFRPNT DW OFFSET HSTBUF ;READ/WRITE BUFFER OFFSET 30FC 4010 XFRSEG DW 1040H ;READ/WRITE BUFFER SEGMENT BASE ; 30FE ENDFDIO EQU OFFSET $ ; 30FE 00 FSIZE DB 00 ;SECTOR SIZE DEFAULT TO 256 BYTES ; ; ; 30FF RW 32 ;INITIALIZATION STACK 313F 00 STKBASE DB 0 ; ***** END OF OS ***** ; ; ; ;DEFINE TPA SEGMENT START ADDRESS ; 0354 STARTTPA EQU ((OFFSET STKBASE)+15+400H)/16 \f CP/M ASM86 1.1 SOURCE: DFDBIOS.A86 CR8 - CP/M-86 BIOS VERS. 3.0 PAGE 56 EJECT ; ; DEFINE INTERRUPT VECTORS ; 0000 DSEG 0 ORG 0 ; 0000 INT0OFF RW 1 0002 INT0SEG RW 1 0004 STEPOFF RW 1 0006 STEPSEG RW 1 0008 NMIOFF RW 1 000A NMISEG RW 1 000C TYP3OFF RW 1 000E TYP3SEG RW 1 0010 OVRFOFF RW 1 0012 OWRFSEG RW 1 ; ORG RTC 0088 RTCOFF RW 1 ; ORG 378H 0378 BIOSOFF RW 1 ; ORG 380H 0380 BDOSOFF RW 1 0382 BDOSSEG RW 1 ; END END OF ASSEMBLY. NUMBER OF ERRORS: 0. USE FACTOR: 26% «eof»