|
|
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 - metrics - 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»