Title MD-11 Hard disk boot routine Rev. 1.0 2_Feb_84 aseg .z80 rev equ 10h system equ 5 bdos_bios equ 50 display equ 9 get_vers equ 12 extnd_func equ 0 biorev equ 9 seldsk equ 9 settrk equ 10 setsec equ 11 setdma equ 12 setbnk equ 28 read equ 13 get_mtab equ 3 get_char_tab equ 6 vnumb equ 8 hard_disk equ 1 mtab_buffer equ 300h boot_buffer equ 400h boot_address equ 0fe00h boot_length equ 100h ramdaty equ 0fc00h ramy_length equ 76h apif_pntr equ 1bh bank_stb equ 41h org 100h main: ld c,get_vers ;get cpm version call system ld a,l and 0f0h cp 30h ld de,wrong_vers jp nz,error ld a,get_char_tab ;get character table ld (biospb_a),a ld hl,mtab_buffer ld (biospb_de),hl ld a,extnd_func ;bios extend function code ld (biospb_func),a call bios ld a,(mtab_buffer + biorev) and 0f0h cp rev ld de,wrong_vers jp nz,error ld a,get_mtab ;get system mtab ld (biospb_a),a ld hl,mtab_buffer ld (biospb_de),hl ld a,extnd_func ;bios extend function code ld (biospb_func),a call bios ld a,(vnumb) ;get number of drives ld b,a ;put in b for loop ld a,0 ;init. drive ld hl,mtab_buffer ;start of mtab's search_loop: bit hard_disk,(hl) ;look for first hard disk jr nz,found ;jump if hard disk ld de,16 ;move pointer to next mtab add hl,de inc a ;increment drive djnz search_loop ;keep looking ld de,no_hard_disk ;display no hard disk message error: ld c,display call system jp 0 ;warm boot found: ld (biospb_bc),a ;drive for seldsk ld a,0 ;set E for init. select ld (biospb_de),a ld a,seldsk ;seldsk code ld (biospb_func),a call bios ;do seldsk ld a,l ;see if select o.k. or h ld de,disk_error jr z,error ld hl,0 ;track for settrk ld (biospb_bc),hl ld a,settrk ;settrk code ld (biospb_func),a call bios ;do settrk ld hl,1 ;sector for setsec ld (biospb_bc),hl ld a,setsec ;settrk code ld (biospb_func),a call bios ;do setsec ld hl,boot_buffer ;pointer to buffer for boot code ld (biospb_bc),hl ;address for setdma ld a,setdma ;setdma code ld (biospb_func),a call bios ;do setdma ld a,1 ;bank for setbnk ld (biospb_a),a ld a,setbnk ;code for setbnk ld (biospb_func),a call bios ;do setbnk ld a,read ;code for read ld (biospb_func),a call bios ;do read or a ;check for error ld de,disk_error jp nz,error ;jump if error ld hl,boot_buffer ;pointer to boot code buffer ld de,boot_address ;pointer to boot code location ld bc,boot_length ;boot code length di ;stop ints. ldir ;move boot code ld hl,high_code ;pointer to code ld de,ramdaty+100h ;place to move code ld bc,high_len ;length of code ldir ;move code jp ramdaty+100h ;jump to code bios: ld c,bdos_bios ;direct bios call code ld de,biospb ;pointer to bios system pointer block jp system high_code: ;this code is moved to ramdaty+100h ld sp,boot_address ld a,0 ;switch banks and turn rom on out (bank_stb),a ld hl,(apif_pntr) ;get pointer to rom apif ld de,-36 ;offset to start of romdaty add hl,de ;calc. start of romdaty ld de,ramdaty ;ramdaty location during boot ld bc,ramy_length ;length of ramdaty ldir ;move romdaty to ramdaty ld iy,ramdaty jp boot_address ;boot system high_len equ $ - high_code no_hard_disk: db 0dh,0ah,'No hard disks on system.',0dh,0ah,'$' disk_error: db 0dh,0ah,'Unable to boot hard disk.',0dh,0ah,'$' wrong_vers: db 0dh,0ah,'Wrong version of CP/M.',0dh,0ah db 'This copy of HDBOOT requires CP/M Plus version 1.x',0dh,0ah,'$' biospb: biospb_func: db 0 biospb_a: db 0 biospb_bc: dw 0 biospb_de: dw 0 biospb_hl: dw 0 end