mirror of
https://github.com/SEPPDROID/Digital-Research-Source-Code.git
synced 2025-10-26 09:54:20 +00:00
Upload
Digital Research
This commit is contained in:
367
CPM OPERATING SYSTEMS/CPM 86/CPM 86 1.1 SOURCE/CBIOS.A86
Normal file
367
CPM OPERATING SYSTEMS/CPM 86/CPM 86 1.1 SOURCE/CBIOS.A86
Normal file
@@ -0,0 +1,367 @@
|
||||
title 'Customized Basic I/O System'
|
||||
|
||||
;*********************************************
|
||||
;* *
|
||||
;* This Customized BIOS adapts CP/M-86 to *
|
||||
;* the following hardware configuration *
|
||||
;* Processor: *
|
||||
;* Brand: *
|
||||
;* Controller: *
|
||||
;* *
|
||||
;* *
|
||||
;* Programmer: *
|
||||
;* Revisions : *
|
||||
;* *
|
||||
;*********************************************
|
||||
|
||||
true equ -1
|
||||
false equ not true
|
||||
cr equ 0dh ;carriage return
|
||||
lf equ 0ah ;line feed
|
||||
|
||||
;*********************************************
|
||||
;* *
|
||||
;* Loader_bios is true if assembling the *
|
||||
;* LOADER BIOS, otherwise BIOS is for the *
|
||||
;* CPM.SYS file. *
|
||||
;* *
|
||||
;*********************************************
|
||||
|
||||
loader_bios equ false
|
||||
bdos_int equ 224 ;reserved BDOS interrupt
|
||||
|
||||
IF not loader_bios
|
||||
;---------------------------------------------
|
||||
;| |
|
||||
bios_code equ 2500h
|
||||
ccp_offset equ 0000h
|
||||
bdos_ofst equ 0B06h ;BDOS entry point
|
||||
;| |
|
||||
;---------------------------------------------
|
||||
ENDIF ;not loader_bios
|
||||
|
||||
IF loader_bios
|
||||
;---------------------------------------------
|
||||
;| |
|
||||
bios_code equ 1200h ;start of LDBIOS
|
||||
ccp_offset equ 0003h ;base of CPMLOADER
|
||||
bdos_ofst equ 0406h ;stripped BDOS entry
|
||||
;| |
|
||||
;---------------------------------------------
|
||||
ENDIF ;loader_bios
|
||||
|
||||
cseg
|
||||
org ccpoffset
|
||||
ccp:
|
||||
org bios_code
|
||||
|
||||
;*********************************************
|
||||
;* *
|
||||
;* BIOS Jump Vector for Individual Routines *
|
||||
;* *
|
||||
;*********************************************
|
||||
|
||||
jmp INIT ;Enter from BOOT ROM or LOADER
|
||||
jmp WBOOT ;Arrive here from BDOS call 0
|
||||
jmp CONST ;return console keyboard status
|
||||
jmp CONIN ;return console keyboard char
|
||||
jmp CONOUT ;write char to console device
|
||||
jmp LISTOUT ;write character to list device
|
||||
jmp PUNCH ;write character to punch device
|
||||
jmp READER ;return char from reader device
|
||||
jmp HOME ;move to trk 00 on cur sel drive
|
||||
jmp SELDSK ;select disk for next rd/write
|
||||
jmp SETTRK ;set track for next rd/write
|
||||
jmp SETSEC ;set sector for next rd/write
|
||||
jmp SETDMA ;set offset for user buff (DMA)
|
||||
jmp READ ;read a 128 byte sector
|
||||
jmp WRITE ;write a 128 byte sector
|
||||
jmp LISTST ;return list status
|
||||
jmp SECTRAN ;xlate logical->physical sector
|
||||
jmp SETDMAB ;set seg base for buff (DMA)
|
||||
jmp GETSEGT ;return offset of Mem Desc Table
|
||||
jmp GETIOBF ;return I/O map byte (IOBYTE)
|
||||
jmp SETIOBF ;set I/O map byte (IOBYTE)
|
||||
|
||||
;*********************************************
|
||||
;* *
|
||||
;* INIT Entry Point, Differs for LDBIOS and *
|
||||
;* BIOS, according to "Loader_Bios" value *
|
||||
;* *
|
||||
;*********************************************
|
||||
|
||||
INIT: ;print signon message and initialize hardware
|
||||
mov ax,cs ;we entered with a JMPF so use
|
||||
mov ss,ax ;CS: as the initial value of SS:,
|
||||
mov ds,ax ;DS:,
|
||||
mov es,ax ;and ES:
|
||||
;use local stack during initialization
|
||||
mov sp,offset stkbase
|
||||
cld ;set forward direction
|
||||
|
||||
IF not loader_bios
|
||||
;---------------------------------------------
|
||||
;| |
|
||||
; This is a BIOS for the CPM.SYS file.
|
||||
; Setup all interrupt vectors in low
|
||||
; memory to address trap
|
||||
|
||||
push ds ;save the DS register
|
||||
mov IOBYTE,0 ;clear IOBYTE
|
||||
mov ax,0
|
||||
mov ds,ax
|
||||
mov es,ax ;set ES and DS to zero
|
||||
;setup interrupt 0 to address trap routine
|
||||
mov int0_offset,offset int_trap
|
||||
mov int0_segment,CS
|
||||
mov di,4
|
||||
mov si,0 ;then propagate
|
||||
mov cx,510 ;trap vector to
|
||||
rep movs ax,ax ;all 256 interrupts
|
||||
;BDOS offset to proper interrupt
|
||||
mov bdos_offset,bdos_ofst
|
||||
pop ds ;restore the DS register
|
||||
|
||||
; (additional CP/M-86 initialization)
|
||||
;| |
|
||||
;---------------------------------------------
|
||||
ENDIF ;not loader_bios
|
||||
|
||||
IF loader_bios
|
||||
;---------------------------------------------
|
||||
;| |
|
||||
;This is a BIOS for the LOADER
|
||||
push ds ;save data segment
|
||||
mov ax,0
|
||||
mov ds,ax ;point to segment zero
|
||||
;BDOS interrupt offset
|
||||
mov bdos_offset,bdos_ofst
|
||||
mov bdos_segment,CS ;bdos interrupt segment
|
||||
; (additional LOADER initialization)
|
||||
pop ds ;restore data segment
|
||||
;| |
|
||||
;---------------------------------------------
|
||||
ENDIF ;loader_bios
|
||||
|
||||
mov bx,offset signon
|
||||
call pmsg ;print signon message
|
||||
mov cl,0 ;default to dr A: on coldstart
|
||||
jmp ccp ;jump to cold start entry of CCP
|
||||
|
||||
WBOOT: jmp ccp+6 ;direct entry to CCP at command level
|
||||
|
||||
IF not loader_bios
|
||||
;---------------------------------------------
|
||||
;| |
|
||||
int_trap:
|
||||
cli ;block interrupts
|
||||
mov ax,cs
|
||||
mov ds,ax ;get our data segment
|
||||
mov bx,offset int_trp
|
||||
call pmsg
|
||||
hlt ;hardstop
|
||||
;| |
|
||||
;---------------------------------------------
|
||||
ENDIF ;not loader_bios
|
||||
|
||||
;*********************************************
|
||||
;* *
|
||||
;* CP/M Character I/O Interface Routines *
|
||||
;* *
|
||||
;*********************************************
|
||||
|
||||
CONST: ;console status
|
||||
rs 10 ;(fill-in)
|
||||
ret
|
||||
|
||||
CONIN: ;console input
|
||||
call CONST
|
||||
jz CONIN ;wait for RDA
|
||||
rs 10 ;(fill-in)
|
||||
ret
|
||||
|
||||
CONOUT: ;console output
|
||||
rs 10 ;(fill-in)
|
||||
ret ;then return data
|
||||
|
||||
LISTOUT: ;list device output
|
||||
rs 10 ;(fill-in)
|
||||
ret
|
||||
|
||||
LISTST: ;poll list status
|
||||
rs 10 ;(fill-in)
|
||||
ret
|
||||
|
||||
PUNCH: ;write punch device
|
||||
rs 10 ;(fill-in)
|
||||
ret
|
||||
|
||||
READER:
|
||||
rs 10 ;(fill-in)
|
||||
ret
|
||||
|
||||
GETIOBF:
|
||||
mov al,IOBYTE
|
||||
ret
|
||||
|
||||
SETIOBF:
|
||||
mov IOBYTE,cl ;set iobyte
|
||||
ret ;iobyte not implemented
|
||||
|
||||
pmsg:
|
||||
mov al,[BX] ;get next char from message
|
||||
test al,al
|
||||
jz return ;if zero return
|
||||
mov CL,AL
|
||||
call CONOUT ;print it
|
||||
inc BX
|
||||
jmps pmsg ;next character and loop
|
||||
|
||||
;*********************************************
|
||||
;* *
|
||||
;* Disk Input/Output Routines *
|
||||
;* *
|
||||
;*********************************************
|
||||
|
||||
SELDSK: ;select disk given by register CL
|
||||
ndisks equ 2 ;number of disks (up to 16)
|
||||
mov disk,cl ;save disk number
|
||||
mov bx,0000h ;ready for error return
|
||||
cmp cl,ndisks ;n beyond max disks?
|
||||
jnb return ;return if so
|
||||
mov ch,0 ;double(n)
|
||||
mov bx,cx ;bx = n
|
||||
mov cl,4 ;ready for *16
|
||||
shl bx,cl ;n = n * 16
|
||||
mov cx,offset dpbase
|
||||
add bx,cx ;dpbase + n * 16
|
||||
return: ret ;bx = .dph
|
||||
|
||||
HOME: ;move selected disk to home position (Track 0)
|
||||
mov trk,0 ;set disk i/o to track zero
|
||||
rs 10 ;(fill-in)
|
||||
ret
|
||||
|
||||
SETTRK: ;set track address given by CX
|
||||
mov trk,CX
|
||||
ret
|
||||
|
||||
SETSEC: ;set sector number given by cx
|
||||
mov sect,CX
|
||||
ret
|
||||
|
||||
SECTRAN: ;translate sector CX using table at [DX]
|
||||
mov bx,cx
|
||||
add bx,dx ;add sector to tran table address
|
||||
mov bl,[bx] ;get logical sector
|
||||
ret
|
||||
|
||||
SETDMA: ;set DMA offset given by CX
|
||||
mov dma_adr,CX
|
||||
ret
|
||||
|
||||
SETDMAB: ;set DMA segment given by CX
|
||||
mov dma_seg,CX
|
||||
ret
|
||||
;
|
||||
GETSEGT: ;return address of physical memory table
|
||||
mov bx,offset seg_table
|
||||
ret
|
||||
|
||||
;*********************************************
|
||||
;* *
|
||||
;* All disk I/O parameters are setup: *
|
||||
;* DISK is disk number (SELDSK) *
|
||||
;* TRK is track number (SETTRK) *
|
||||
;* SECT is sector number (SETSEC) *
|
||||
;* DMA_ADR is the DMA offset (SETDMA) *
|
||||
;* DMA_SEG is the DMA segment (SETDMAB)*
|
||||
;* READ reads the selected sector to the DMA*
|
||||
;* address, and WRITE writes the data from *
|
||||
;* the DMA address to the selected sector *
|
||||
;* (return 00 if successful, 01 if perm err)*
|
||||
;* *
|
||||
;*********************************************
|
||||
|
||||
READ:
|
||||
rs 50 ;fill-in
|
||||
ret
|
||||
|
||||
WRITE:
|
||||
rs 50 ;(fill-in)
|
||||
ret
|
||||
|
||||
|
||||
;*********************************************
|
||||
;* *
|
||||
;* Data Areas *
|
||||
;* *
|
||||
;*********************************************
|
||||
data_offset equ offset $
|
||||
|
||||
dseg
|
||||
org data_offset ;contiguous with code segment
|
||||
IOBYTE db 0
|
||||
disk db 0 ;disk number
|
||||
trk dw 0 ;track number
|
||||
sect dw 0 ;sector number
|
||||
dma_adr dw 0 ;DMA offset from DS
|
||||
dma_seg dw 0 ;DMA Base Segment
|
||||
|
||||
IF loader_bios
|
||||
;---------------------------------------------
|
||||
;| |
|
||||
signon db cr,lf,cr,lf
|
||||
db 'CP/M-86 Version 1.0',cr,lf,0
|
||||
;| |
|
||||
;---------------------------------------------
|
||||
ENDIF ;loader_bios
|
||||
|
||||
IF not loader_bios
|
||||
;---------------------------------------------
|
||||
;| |
|
||||
signon db cr,lf,cr,lf
|
||||
db 'System Generated 00/00/00'
|
||||
db cr,lf,0
|
||||
;| |
|
||||
;---------------------------------------------
|
||||
ENDIF ;not loader_bios
|
||||
|
||||
int_trp db cr,lf
|
||||
db 'Interrupt Trap Halt'
|
||||
db cr,lf
|
||||
|
||||
; System Memory Segment Table
|
||||
|
||||
segtable db 2 ;2 segments
|
||||
dw tpa_seg ;1st seg starts after BIOS
|
||||
dw tpa_len ;and extends to 08000
|
||||
dw 2000h ;second is 20000 -
|
||||
dw 2000h ;3FFFF (128k)
|
||||
|
||||
include singles.lib ;read in disk definitions
|
||||
|
||||
loc_stk rw 32 ;local stack for initialization
|
||||
stkbase equ offset $
|
||||
|
||||
lastoff equ offset $
|
||||
tpa_seg equ (lastoff+0400h+15) / 16
|
||||
tpa_len equ 0800h - tpa_seg
|
||||
db 0 ;fill last address for GENCMD
|
||||
|
||||
;*********************************************
|
||||
;* *
|
||||
;* Dummy Data Section *
|
||||
;* *
|
||||
;*********************************************
|
||||
dseg 0 ;absolute low memory
|
||||
org 0 ;(interrupt vectors)
|
||||
int0_offset rw 1
|
||||
int0_segment rw 1
|
||||
; pad to system call vector
|
||||
rw 2*(bdos_int-1)
|
||||
|
||||
bdos_offset rw 1
|
||||
bdos_segment rw 1
|
||||
END
|
||||
|
||||
Reference in New Issue
Block a user