; SBIOS.ASM - 3/9/86 - Xerox 820 BIOS ; Skeleton BIOS for the Xerox. ; Loaded from the boot tracks so that the real BIOS can load itself. .z80 maclib TNC.LIB asciictl true equ 0ffffh false equ not true maclib BIOSXRX.INC ; Xerox prom addresses maclib BIOSCPM.INC ; CP/M addresses maclib BIOSDSKE.INC ; Disk equates ; Parallel keyboard port: ; If bit 7=1 means ctl then 7fh, if bit 7=0 means ctl then ffh. keyxor equ 0ffh ; 7fh for Sperry, 0ffh for Honeywell kbd ; Addresses in the PROM code. romkeyb equ 0f3bbh steptim equ 0ff67h aseg org 100h .phase bios maclib BIOSJMP.INC ; BIOS jump table ; Console status const equ xconst conin equ xconin conout: ld a,c jp xconot list equ conout listst equ xconst punch equ conout reader equ xconin ; Disk handler. maclib BIOSDPB.INC ; Disk param blocks ; Sector translate sectrn: ex de,hl add hl,bc ld l,(hl) ld h,0 ret ; Select drive seldsk: ld hl,0 ; Assume bad staus ld a,c cp mxdrv ret nc ; No such drive ld (drive),a ld l,c add hl,hl add hl,hl add hl,hl add hl,hl ld de,dpe0 add hl,de ret ; Home the drive home: call selif xor a ld (track),a jp xhome ; Set track. settrk: ld a,c ld (track),a ret ; Set sector. setsec: ld a,c ld (sect),a ret ; Set dma address. setdma: ld (dmaadr),bc ret ; Read a sector. read: call setup jp xread ; Write a sector. write: call setup jp xwrite selif: ld hl,ldrive ld a,(drive) cp (hl) ret z ld (hl),a ld c,a jp xseldsk setup: call selif ld a,(track) ld c,a call xsettrk ld a,(sect) ld c,a ld hl,(dmaadr) ret ; Reload CCP + BDOS. ; Set up stuff in low memory for CP/M. loadit: ld a,0c3h ld (0),a ld hl,bios+3 ld (1),hl ld c,0 call seldsk call home bc3 equ (44 shl 8) + cpmsec xor a ld (track),a ld bc,bc3 ld hl,ccp ld de,secsiz load: push bc push de push hl call xread pop hl pop de pop bc dec b ret z add hl,de inc c ld a,c sub spt+1 jr nz,load ld a,(track) inc a ld (track),a push bc ld c,a call xsettrk pop bc ld c,1 jr load ; Fix for control chars from keyboard keys: xor keyxor ret p and 1fh ret ; Do a warm boot. bootw: ld sp,80h call loadit ld bc,80h call setdma ld a,(4) ld c,a jp ccp+3 ; Finish the cold boot. bootc: ld hl,low ld de,0 ld bc,llow ldir ld bc,80h call setdma ld a,stept ld (steptim),a ; Fast step rate xor a ld (3),a ld (4),a ld a,0c3h ld (0),a ld (5),a ld hl,bios+3 ld (1),hl ld hl,bdos+6 ld (6),hl ; Vector the keyboard input here ld a,0cdh ; A CALL instruction code ld (romkeyb),a ld hl,keys ld (romkeyb+1),hl ld hl,ldmsg ld de,ccp+7 ld bc,lldmsg ldir ld c,0 ei jp ccp ; Load the real BIOS. ldmsg: db lldmsg-2,'CBIOS',0 lldmsg equ $-ldmsg ; Low memory. low: jp bios+3 db 0 ; iobyte db 0 ; default drive/user jp bdos+6 llow equ $-low ldrive: db 0ffh dmaadr equ ldrive+1 drive equ dmaadr+2 track equ drive+1 sect equ track+1 dirbuf equ sect+1 alv0 equ dirbuf+128 csv0 equ alv0+31 if mxdrv gt 1 alv1 equ csv0+16 csv1 equ alv1+31 endif if mxdrv gt 2 alv2 equ csv1+16 csv2 equ alv2+31 endif if mxdrv gt 3 alv3 equ csv2+16 csv3 equ alv3+31 endif enddat equ $-1 end