;********* biosif.8kn for cpm.sys + cpmldr.sys ******* ;* Copyright 1984, Digital Research Inc. ;* ;* Assembly language interface for CP/M-8000(tm) BIOS ;* ----- System-Independent ----- ;* ;* 821013 S. Savitzky (Zilog) -- split into modules ;* 820913 S. Savitzky (Zilog) -- created. ;* 840811 R. Weiser (DRI) -- conditional assembly ;* __text: .sect ;**************************************************** ;* ;* NOTE ;* The C portion of the BIOS is non-segmented. ;* ;* This assembly-language module is assembled ;* non-segmented, and serves as the interface. ;* ;* Segmented operations are well-isolated, and ;* are either the same as their non-segmented ;* counterparts, or constructed using macros. ;* The resulting code looks a little odd. ;* ;**************************************************** ;**************************************************** ;* ;* Externals ;* ;**************************************************** .global _biosinit ;C portion init .if LOADER ; If LOADER is True then .global _ldcpm ; Load the system into memory .else ; else its the normal bios .global _flush ;Flush buffers .global ccp ;Command Processor .endif ; end conditional .global _trapinit ;trap startup .global _psap, _sysseg, _sysstk ;**************************************************** ;* ;* Global declarations ;* ;**************************************************** .global bios ; initialization .if LOADER ; If Loader stub out _wboot .else .global _wboot ; warm boot .endif .global _input ; input a byte .global _output ; output a byte ;**************************************************** ;* ;* Bios Initialization and Entry Point ;* ;* This is where control comes after boot. ;* If (the label LOADER is true 1) ;* Control is transferred to -ldcpm ;* else ;* Control is transferred to the ccp. ;* ;* We get here from bootstrap with: ;* segmented mode ;* valid stack pointer ;* valid PSA in RAM ;* ;**************************************************** bios: ; enter in segmented mode. ; Get system (PC) segment into r4 DI VI,NVI calr kludge ; get PC segment on stack kludge: popl rr4, @r14 ; get PSAP into rr2. ldctl r2, PSAPSEG ldctl r3, PSAPOFF ; go non-segmented. save PSAP, system segment, ; system stack pointer (in system segment, please) NONSEG ldl _psap, rr2 ld _sysseg, r4 ld r14,_sysseg ldl _sysstk, rr14 .if LOADER .else ; set up system stack so that a return will warm boot push @r15,#_wboot .endif ; set up traps, then enable interrupts call _trapinit EI VI,NVI ; set up C part of Bios call _biosinit ; Turn control over to command processor .if LOADER jp _ldcpm ; do Program load .else jp ccp ;***************************************************** ;* ;* Warm Boot ;* ;* flush buffers and initialize Bios ;* then transfer to CCP ;* ;***************************************************** _wboot: call _flush call _biosinit ldl rr14,_sysstk jp ccp .endif ;**************************************************** ;* ;* I/O port operations ;* ;* int = input(port: int) ;* output (port, data: int) ;* ;**************************************************** _input: ld r2,ARG1(r15) subl rr6,rr6 inb rl7,@r2 ldb rl6,rl7 ret _output: ld r2,ARG1(r15) ld r3,ARG2(r15) outb @r2,rl3 ret ;***************************************************** ;***************************************************** ******