Digital Research
This commit is contained in:
2020-11-06 18:50:37 +01:00
parent 621ed8ccaf
commit 31738079c4
8481 changed files with 1888323 additions and 0 deletions

View File

@@ -0,0 +1,456 @@
title 'Xios Header and Entry'
;********************************************************
;********************************************************
; *
; CONCURRENT CP/M 3.1 *
; *
; SAMPLE XIOS FOR THE *
; *
; COMPUPRO 86/87. *
; *
; 2/17/84 *
; *
; *
; Copyright (c) 1984 *
; Digital Research, Inc. *
; Box 579, Pacific Grove *
; California, 93950 *
; *
; *
; BY : *
; JEFF NEWMAN *
; FRAN BORDA *
; GREG PACHNER *
; *
; This XIOS (Extended I/O System) was *
; written as a sample . Whenever a choice *
; had to be made between clarity and *
; efficiency, clarity was chosen. Many of *
; the modules could be made more efficient. *
; *
; *
; To assemble and link the relocatable modules, *
; refer to the CPROXIOS.SUB file. The format of *
; XIOS.INP is as follows : *
; *
; *
; xios = headentr[data[o[0]],m], *
; intvec, pic, np_8087, ctc, tick, *
; conout, serout, vscreen, conin, serin, *
; ssint, i3int, servar, pcmode, *
; statlin, list, switch, vccb, serdata, *
; dentry, reskew, mdisk, dpbs, fd, hdisk *
; *
; *
; *
;********************************************************
include system.lib
include sysdat.lib
eject
cgroup group code, data ; this group definition forces an 8080
; model when used with a link command
; of xios = mod[data[o[0]]],mod2,mod3,...
dseg
public sysdat, dispatch
public dph_tbl
public doorop
public supervisor
public debugflag
public stoppoll
public mem_alloc
extrn vccb0:byte, lcb0:byte
extrn dph1:byte, dph2:byte, dph3:byte
extrn dph4:byte, dph5:byte, dpe5:byte
;---------------------------------------------------------------------
; CONDITIONAL ASSEMBLY SWITCHES
;---------------------------------------------------------------------
NP_8087 equ 1 ; does xios handle 8087
; 1 = yes, 0 = no
DEBUG equ 3 ; debug switch
;----------------------------------------------------------------------
; END CONDITIONAL SWITCHES
;----------------------------------------------------------------------
cseg
public supif
public intdisp
extrn io_const:near ; public in char
extrn io_conin:near ; public in char
extrn io_conout:near ; public in char
extrn io_listst:near ; public in char
extrn io_list:near ; public in char
;extrn io_auxin:near ; public in char
;extrn io_auxout:near ; public in char
extrn io_switch:near ; public in char
extrn io_statline:near ; public in char
extrn io_seldsk:near ; public in dskrn
extrn io_read:near ; public in dskrn
extrn io_write:near ; public in dskrn
extrn io_flushbuf:near ; public in dskrn
;*******
; PC_MODE SUPPORT
;
extrn io_screen:near ; public in pcmode
extrn io_video:near ; public in pcmode
extrn io_keybd:near ; public in pcmode
extrn io_shft:near ; public in pcmode
extrn io_eqck:near ; public in pcmode
extrn io_int13_read:near ; public in pcmode
extrn io_int13_write:near ; public in pcmode
;*******
; INIT SUPPORT
;
extrn int_init:near ; in intvec
extrn pic_init:near ; in pic
extrn hard_int_vec:near ; in pic
extrn int_enable:near ; in pic
extrn ctc_init:near ; in ctc
extrn char_init:near ; in chrinit
extrn vs_init:near ; in vscreen
extrn fdc_init:near ; in fd
extrn h_init:near ; in hdisk
extrn np_8087_test:near ; in np_8087
extrn pmsg:near ; in conout
;----------------------------------------------------------------------
; XIOS ORIGIN AT C00
;----------------------------------------------------------------------
org 0c00h ; This org forces the XIOS to start at
; offset 0C00H in the system data area.
jmp init ; Hardware and I/O system initialization
jmp entry ; xios entry point
sysdat dw 0 ; Sysdat Segment
supervisor rw 2
eject
;------------------------------------------------------------------------
; BEGIN XIOS HEADER
;------------------------------------------------------------------------
; Location specific data structures defined by DRI
org 0c0ch
tick db false ; tick enable flag
ticks_sec db 60 ; # of ticks per second
doorop db 0 ; global door open interrupt flag
db 0 ; reserved
npcns db NPCONS ; number of physical consoles
nvcns db NVCONS ; number of virtual consoles
nccb db 8 ; total number of ccbs
nlcb db 2 ; number of list devices
ccb dw offset vccb0 ; offset of the first ccb
lcb dw offset lcb0 ; offset of first lcb
; disk parameter header offset table. Location defined by DRI.
dph_tbl dw offset dph3 ;A: hard #0
dw offset dph4 ;B: 1
dw offset dph5 ;C: 2
dw offset dph1 ;D: floppy #0
dw offset dph2 ;E: 1
dw 0,0,0 ;F:,G:,H:
dw 0,0,0 ;I:,J:,K:
dw 0 ;L:
dw offset dpe5 ;M:
dw 0,0,0 ;N:,O:,P:
mem_alloc dw 0800H ; buffer space for 8 virtual consoles
;----------------------------------------------------------------------
; END XIOS HEADER
;----------------------------------------------------------------------
;----------------------------------------------------------------------
; BEGIN MISC DEFINITIONS
;----------------------------------------------------------------------
dispatch rw 2 ; used by the I/O system as the entry
; into the dispatcher.Intialized by
; the XIOS init code.
debugflag db DEBUG ; 001h = clock tick not enabled
; 002h = interrupt 3 not set to
; the interrupt trap code.
;----------------------------------------------------------------------
; END MISC DEFINITIONS
;----------------------------------------------------------------------
eject
;------------------------------------------------------------------------
; BEGIN XIOS ENTRY POINT
;------------------------------------------------------------------------
entry:
; All calls to the XIOS routines enter through here
; with a CALLF. Must return with a RETF
;
; ENTRY: AL = function number
; CX = parameter
; DX = 2nd parameter
; DS = system data
; ES = user data area
;
; EXIT: AX = BX = return
;
cld
xor ah,ah
cmp al,37
jb ok
illegal:
mov ax,0ffffh
jmp exit
ok:
shl ax,1 ;call routine
mov bx,ax
call functab[bx]
exit:
mov bx, rlr
mov es, P_UDA[bx]
mov bx,ax ;BX=AX
retf ;All Done
reserved:
mov ax,0ffffh
ret
;----------------------------------------------------------------------
; END XIOS ENTRY POINT
;----------------------------------------------------------------------
eject
;----------------------------------------------------------------------
; XIOS FUNCTION TABLE
;----------------------------------------------------------------------
dseg
functab dw io_const ; 0 - console status
dw io_conin ; 1 - console input
dw io_conout ; 2 - console output
dw io_listst ; 3 - list status
dw io_list ; 4 - list output
dw reserved ; 5 -
dw reserved ; 6 -
dw io_switch ; 7 - switch screen
dw io_statline ; 8 - display status line
dw io_seldsk ; 9 - select disk
dw io_read ;10 - read
dw io_write ;11 - write
dw io_flushbuf ;12 - flush buffer
dw io_polldev ;13 - poll device
dw reserved ;14 - not presently used
dw reserved ;15 - not presently used
dw reserved ;16 - not presently used
dw reserved ;17 - not presently used
dw reserved ;18 - not presently used
dw reserved ;19 - not presently used
dw reserved ;20 - not presently used
dw reserved ;21 - not presently used
dw reserved ;22 - not presently used
dw reserved ;23 - not presently used
dw reserved ;24 - not presently used
dw reserved ;25 - not presently used
dw reserved ;26 - not presently used
dw reserved ;27 - not presently used
dw reserved ;28 - not presently used
dw reserved ;29 - not presently used
dw io_screen ;30 - get/set screen mode
dw io_video ;31 - video i/o
dw io_keybd ;32 - keyboard info
dw io_shft ;33 - shift status
dw io_eqck ;34 - equipment check
dw io_int13_read ;35 - read DOS disk
dw io_int13_write ;36 - write DOS disk
stoppoll db 0
;--------------------------------------------------------------------------
; BEGIN SUPERVISOR INTERFACE
;--------------------------------------------------------------------------
cseg
supif: ; Supervisor Interface
;
; ENTRY: CX = function #
; DX = parameter
; DS = parameter segment if address
; ES = user data area
; EXIT: BX = AX = return
; CX = error code for RTM functions
; ES = return segment if address
push es
mov bx,rlr
mov es,p_uda[bx]
xor ch,ch
callf cs:dword ptr supervisor
pop es
ret
;---------------------------------------------------------------------------
; END SUPERVISOR INTERFACE
;---------------------------------------------------------------------------
;---------------------------------------------------------------------------
; BEGIN XIOS INITIALIZATION
;---------------------------------------------------------------------------
cseg
;====
init: ; CCP/M's XIOS initialization entry point
;====
;
cli ;disable interrupts
mov sysdat,ds ; save sysdat for sysdat access
mov ax,supmod ; place copy of SUPMOD in data segment
mov supervisor,ax ; into Code Segment (supervisor)
mov ax,supmod+2
mov supervisor+2,ax
mov ax,dispatcher ; Make copy of Interrupt Routines' access
mov dispatch,ax ; point to dispatcher
mov ax,dispatcher+2
mov dispatch+2,ax
mov int_ssreg,ss ; establish the stack
mov int_spreg,sp
cld ; set forward direction
mov ax, ds ; ES = SS = DS
mov es, ax
mov ss, ax ; establish a stack for init
mov sp,offset int_tos
call int_init ; paint all the interrupt vectors
; and poke the NMI and BREAK vectors
; ( int 2 and int 3 )
call hard_int_vec ; initialize the hardware interrupt vectors
call char_init ; initialize the char I/O system
call pic_init ; initialize the interrupt system hardware
call ctc_init ; initialize the counter timer
call vs_init ; initialize the virtual screens
call int_enable ; turn on the interrupt system masks in the PIC's
sti ; turn on the CPU's interrupt system
call fdc_init ; initialize the floppy disk system
call h_init ; initialize the hard disk system
if NP_8087
call np_8087_test ; checks if 8087 is present
endif
call signon
mov ss,int_ssreg ; restore stack for the far return
mov sp,int_spreg
mov bx, rlr ; restore ES
mov es, P_UDA[bx]
retf ; back to CCP/M's init process
dseg
rw 48 ; initialzation stack
int_tos rw 0
int_ssreg rw 1
int_spreg rw 1
;-----------------------------------------------------------------------
; END XIOS INITIALIZATION
;-----------------------------------------------------------------------
;-----------------------------------------------------------------------
; BEGIN MISC ROUTINES
;-----------------------------------------------------------------------
cseg
;-------
intdisp:
;-------
jmpf cs:dword ptr dispatch
;==========
io_polldev: ; Function 13: Poll Device
;==========
;
; ENTRY: DL = device number
;
; EXIT: AL = 000h if not ready
; = 0ffh if ready
ret
ptch:
;-----
nop ! nop ! nop ! nop ! nop ! nop
nop ! nop ! nop ! nop ! nop ! nop
nop ! nop ! nop ! nop ! nop ! nop
nop ! nop ! nop ! nop ! nop ! nop
nop ! nop ! nop ! nop ! nop ! nop
signon:
mov bx, offset signon_m
call pmsg
ret
dseg
signon_m db 0ah,0dh
db 'CompuPro XIOS of 2/14/84',0ah,0dh,0ffh
;-----------------------------------------------------------------------
; END MISC ROUTINES
;-----------------------------------------------------------------------
end