DataMuseum.dk

Presents historical artifacts from the history of:

CP/M

This is an automatic "excavation" of a thematic subset of
artifacts from Datamuseum.dk's BitArchive.

See our Wiki for more about CP/M

Excavated with: AutoArchaeologist - Free & Open Source Software.


top - download

⟦ce67dda76⟧ TextFile

    Length: 119552 (0x1d300)
    Types: TextFile
    Names: »DFDBIOS.LST«

Derivation

└─⟦be0857eee⟧ Bits:30004395 CP/M-86 files - CR8 Dual floppy
    └─ ⟦this⟧ »DFDBIOS.LST« 

TextFile

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