X-Git-Url: http://cloudbase.mooo.com/gitweb/z180-stamp-cpm3.git/blobdiff_plain/5f701f3a6f02b30509464fd6ec1e9b1f07bccb58..a894545eb628dd3899b970132a29bd87a30e760f:/cbios/bioskrnl.180 diff --git a/cbios/bioskrnl.180 b/cbios/bioskrnl.180 index 6ae7073..39927be 100644 --- a/cbios/bioskrnl.180 +++ b/cbios/bioskrnl.180 @@ -20,16 +20,13 @@ ; can be combined to support a particular system ; configuration. -cr equ 13 -lf equ 10 -bell equ 7 ctlQ equ 'Q'-'@' ctlS equ 'S'-'@' -ccp equ 0100h ; Console Command Processor gets loaded - ; into the TPA +ccp equ 0100h ; Console Command Processor gets loaded + ; into the TPA - cseg ; GENCPM puts CSEG stuff in common memory + cseg ; GENCPM puts CSEG stuff in common memory ; variables in system data page @@ -40,7 +37,7 @@ ccp equ 0100h ; Console Command Processor gets loaded ; initialization - extrn hwinit,?init ; general initialization and signon + extrn hwinit,?init ; general initialization and signon extrn ?ldccp,?rlccp ; load & reload CCP for BOOT & WBOOT ; user defined character I/O routines @@ -65,19 +62,12 @@ ccp equ 0100h ; Console Command Processor gets loaded extrn ?time ; signal time operation - ; general utility routines - - public ?pmsg,?pdec ; print message, print number from 0 to 65535 - public ?pderr ; print BIOS disk error message header - public pmsg.in ; print message inline - public phex4,phex2 ; print 4 digit hex (HL), or 2 digit hex (A) - include modebaud.inc ; define mode bits ; External names for BIOS entry points - public ?boot,?wboot,?const,?conin,?cono,?list,?auxo,?auxi + public ?boot,?wboot,boot,?const,?conin,?cono,?list,?auxo,?auxi public ?home,?sldsk,?sttrk,?stsec,?stdma,?read,?write public ?lists,?sctrn public ?conos,?auxis,?auxos,?dvtbl,?devin,?drtbl @@ -88,45 +78,45 @@ ccp equ 0100h ; Console Command Processor gets loaded ; BIOS Jump vector. - ; All BIOS routines are invoked by calling these - ; entry points. - -?boot: jp boot ; initial entry on cold start -?wboot: jp wboot ; reentry on program exit, warm start - -?const: jp const ; return console input status -?conin: jp conin ; return console input character -?cono: jp conout ; send console output character -?list: jp list ; send list output character -?auxo: jp auxout ; send auxiliary output character -?auxi: jp auxin ; return auxiliary input character - -?home: jp home ; set disks to logical home -?sldsk: jp seldsk ; select disk drive, return disk parameter info -?sttrk: jp settrk ; set disk track -?stsec: jp setsec ; set disk sector -?stdma: jp setdma ; set disk I/O memory address -?read: jp read ; read physical block(s) -?write: jp write ; write physical block(s) - -?lists: jp listst ; return list device status -?sctrn: jp sectrn ; translate logical to physical sector - -?conos: jp conost ; return console output status -?auxis: jp auxist ; return aux input status -?auxos: jp auxost ; return aux output status -?dvtbl: jp devtbl ; return address of device def table -?devin: jp ?cinit ; change baud rate of device - -?drtbl: jp getdrv ; return address of disk drive table -?mltio: jp multio ; set multiple record count for disk I/O -?flush: jp flush ; flush BIOS maintained disk caching - -?mov: jp ?move ; block move memory to memory -?tim: jp ?time ; Signal Time and Date operation -?bnksl: jp bnksel ; select bank for code execution and default DMA -?stbnk: jp setbnk ; select different bank for disk I/O DMA operations -?xmov: jp ?xmove ; set source and destination banks for one operation + ; All BIOS routines are invoked by calling these + ; entry points. + +?boot: jp boot ; initial entry on cold start +?wboot: jp wboot ; reentry on program exit, warm start + +?const: jp const ; return console input status +?conin: jp conin ; return console input character +?cono: jp conout ; send console output character +?list: jp list ; send list output character +?auxo: jp auxout ; send auxiliary output character +?auxi: jp auxin ; return auxiliary input character + +?home: jp home ; set disks to logical home +?sldsk: jp seldsk ; select disk drive, return disk parameter info +?sttrk: jp settrk ; set disk track +?stsec: jp setsec ; set disk sector +?stdma: jp setdma ; set disk I/O memory address +?read: jp read ; read physical block(s) +?write: jp write ; write physical block(s) + +?lists: jp listst ; return list device status +?sctrn: jp sectrn ; translate logical to physical sector + +?conos: jp conost ; return console output status +?auxis: jp auxist ; return aux input status +?auxos: jp auxost ; return aux output status +?dvtbl: jp devtbl ; return address of device def table +?devin: jp ?cinit ; change baud rate of device + +?drtbl: jp getdrv ; return address of disk drive table +?mltio: jp multio ; set multiple record count for disk I/O +?flush: jp flush ; flush BIOS maintained disk caching + +?mov: jp ?move ; block move memory to memory +?tim: jp ?time ; Signal Time and Date operation +?bnksl: jp bnksel ; select bank for code execution and default DMA +?stbnk: jp setbnk ; select different bank for disk I/O DMA operations +?xmov: jp ?xmove ; set source and destination banks for one operation jp 0 ; reserved for future expansion jp 0 ; reserved for future expansion @@ -136,69 +126,59 @@ ccp equ 0100h ; Console Command Processor gets loaded ; BOOT ; Initial entry point for system startup. - dseg ; this part can be banked + dseg ; this part can be banked boot: + ld a,SYS$CBR + out0 (cbr),a + ld a,USR$CBAR + out0 (cbar),a ld sp,bs$stack - call hwinit ; first time hardware initialisation + call hwinit ; first time hardware initialisation - ld c,15 ; initialize all 16 character devices + ld bc,16*256 + 0 ; initialize all 16 character devices c$init$loop: push bc call ?cinit pop bc - dec c - jp p,c$init$loop + inc c + djnz c$init$loop - call ?init ; perform any additional system initialization - ; and print signon message + call ?init ; perform any additional system initialization + ; and print signon message ld bc,16*256+0 - ld hl,@dtbl ; init all 16 logical disk drives + ld hl,@dtbl ; init all 16 logical disk drives d$init$loop: - push bc ; save remaining count and abs drive + push bc ; save remaining count and abs drive ld e,(hl) inc hl ld d,(hl) - inc hl ; grab @drv entry + inc hl ; grab @drv entry ld a,e or d - jr z,d$init$next ; if null, no drive - push hl ; save @drv pointer - if 0 - ex de,hl ; XDPH address in - dec hl - dec hl - ld b,(hl) ; get relative drive code - ld (@ADRV),bc ; save absolute and relative drive code - dec hl ; point to init pointer - ld d,(hl) - dec hl - ld e,(hl) ; get init pointer - ex de,hl - call ipchl ; call init routine - else + jr z,d$init$next ; if null, no drive + push hl ; save @drv pointer push de - pop ix + pop ix ; XDPH address in ld b,(ix-2) - ld (@ADRV),bc ; save absolute and relative drive code + ld (@ADRV),bc ; save absolute and relative drive code ld l,(ix-4) - ld h,(ix-3) ; get init pointer - call ipchl ; call init routine - endif - pop hl ; recover @drv pointer + ld h,(ix-3) ; get init pointer + call ipchl ; call init routine + pop hl ; recover @drv pointer d$init$next: - pop bc ; recover counter and drive # + pop bc ; recover counter and drive # inc c - djnz d$init$loop ; and loop for each drive + djnz d$init$loop ; and loop for each drive jp boot$1 cseg ; following in resident memory boot$1: call set$jumps - call ?ldccp ; fetch CCP for first time + call ?ldccp ; fetch CCP for first time jp ccp @@ -207,9 +187,9 @@ boot$1: wboot: ld sp,bs$stack - call set$jumps ; initialize page zero - call ?rlccp ; reload CCP - jp ccp ; then reset jmp vectors and exit to ccp + call set$jumps ; initialize page zero + call ?rlccp ; reload CCP + jp ccp ; then reset jmp vectors and exit to ccp set$jumps: @@ -229,7 +209,7 @@ set$jumps: ret - ds 64 + ds bs$stack$size bs$stack equ $ @@ -250,13 +230,12 @@ getdrv: - ; CONOUT - ; Console Output. Send character in - ; to all selected devices - -conout: + ; LIST + ; List Output. Send character in + ; to all selected devices. - ld hl,(@covec) ; fetch console output bit vector +list: + ld hl,(@lovec) ; fetch list output bit vector jr out$scan @@ -269,12 +248,13 @@ auxout: jr out$scan - ; LIST - ; List Output. Send character in - ; to all selected devices. + ; CONOUT + ; Console Output. Send character in + ; to all selected devices -list: - ld hl,(@lovec) ; fetch list output bit vector +conout: + + ld hl,(@covec) ; fetch console output bit vector out$scan: ld b,0 ; start with device 0 @@ -282,31 +262,31 @@ co$next: add hl,hl ; shift out next bit jr nc,not$out$device push hl ; save the vector - push bc ; save the count and character -not$out$ready: - call coster - or a - jp z,not$out$ready - pop bc - push bc ; restore and resave the character and device - call ?co ; if device selected, print it +; push bc ; save the count and character +;not$out$ready: +; call coster +; or a +; jr z,not$out$ready +; pop bc + push bc ; restore and resave the character and device + call ?co ; if device selected, print it pop bc ; recover count and character pop hl ; recover the rest of the vector not$out$device: inc b ; next device number ld a,h - or l ; see if any devices left + or l ; see if any devices left jr nz,co$next ; and go find them... ret - ; CONOST - ; Console Output Status. Return true if - ; all selected console output devices + ; LISTST + ; List Output Status. Return true if + ; all selected list output devices ; are ready. -conost: - ld hl,(@covec) ; get console output bit vector +listst: + ld hl,(@lovec) ; get list output bit vector jr ost$scan @@ -320,13 +300,13 @@ auxost: jr ost$scan - ; LISTST - ; List Output Status. Return true if - ; all selected list output devices + ; CONOST + ; Console Output Status. Return true if + ; all selected console output devices ; are ready. -listst: - ld hl,(@lovec) ; get list output bit vector +conost: + ld hl,(@covec) ; get console output bit vector ost$scan: ld b,0 ; start with device 0 @@ -334,7 +314,7 @@ cos$next: add hl,hl ; check next bit push hl ; save the vector push bc ; save the count - ld a,0FFh ; assume device ready + ld a,0FFh ; assume device ready call c,coster ; check status for this device pop bc ; recover count pop hl ; recover bit vector @@ -342,30 +322,31 @@ cos$next: ret z ; if any not ready, return false inc b ; drop device number ld a,h - or l ; see if any more selected devices + or l ; see if any more selected devices jr nz,cos$next - or 0FFh ; all selected were ready, return true + or 0FFh ; all selected were ready, return true ret -coster: ; check for output device ready, including optional - ; xon/xoff support + ; check for output device ready, including optional + ; xon/xoff support +coster: ld l,b - ld h,0 ; make device code 16 bits - push hl ; save it in stack + ld h,0 ; make device code 16 bits + push hl ; save it in stack add hl,hl add hl,hl - add hl,hl ; create offset into device characteristics tbl + add hl,hl ; create offset into device characteristics tbl ld de,@ctbl+6 - add hl,de ; make address of mode byte + add hl,de ; make address of mode byte ld a,(hl) and mb$xon$xoff - pop hl ; recover console number in + pop hl ; recover console number in jp z,?cost ; not a xon device, go get output status direct ld de,xofflist - add hl,de ; make pointer to proper xon/xoff flag + add hl,de ; make pointer to proper xon/xoff flag call cist1 ; see if this keyboard has character ld a,(hl) - call nz,ci1 ; get flag or read key if any + call nz,ci1 ; get flag or read key if any cp ctlq jr nz,not$q ; if its a ctl-Q, ld a,0FFh ; set the flag ready @@ -374,12 +355,12 @@ not$q: jr nz,not$s ; if its a ctl-S, ld a,00h ; clear the flag not$s: - ld (hl),a ; save the flag + ld (hl),a ; save the flag call cost1 ; get the actual output status, - and (hl) ; and mask with ctl-Q/ctl-S flag + and (hl) ; and mask with ctl-Q/ctl-S flag ret ; return this as the status -cist1: ; get input status with and saved +cist1: ; get input status with and saved push bc push hl call ?cist @@ -388,7 +369,7 @@ cist1: ; get input status with and saved or a ret -cost1: ; get output status, saving & +cost1: ; get output status, saving & push bc push hl call ?cost @@ -397,7 +378,7 @@ cost1: ; get output status, saving & or a ret -ci1: ; get input, saving & +ci1: ; get input, saving & push bc push hl call ?ci @@ -406,16 +387,6 @@ ci1: ; get input, saving & ret - ; CONST - ; Console Input Status. Return true if - ; any selected console input device - ; has an available character. - -const: - ld hl,(@civec) ; get console input bit vector - jr ist$scan - - ; AUXIST ; Auxiliary Input Status. Return true if ; any selected auxiliary input device @@ -423,6 +394,16 @@ const: auxist: ld hl,(@aivec) ; get aux input bit vector + jr ist$scan + + + ; CONST + ; Console Input Status. Return true if + ; any selected console input device + ; has an available character. + +const: + ld hl,(@civec) ; get console input bit vector ist$scan: ld b,0 ; start with device 0 @@ -434,27 +415,27 @@ cis$next: ret nz ; if any ready, return true inc b ; next device number ld a,h - or l ; see if any more selected devices + or l ; see if any more selected devices jr nz,cis$next xor a ; all selected were not ready, return false ret - ; CONIN - ; Console Input. Return character from first - ; ready console input device. - -conin: - ld hl,(@civec) - jr in$scan - - ; AUXIN ; Auxiliary Input. Return character from first ; ready auxiliary input device. auxin: ld hl,(@aivec) + jr in$scan + + + ; CONIN + ; Console Input. Return character from first + ; ready console input device. + +conin: + ld hl,(@civec) in$scan: push hl ; save bit vector @@ -485,158 +466,22 @@ ipchl: ; vectored CALL point jp (hl) -;------------------------------------------------------------------------------- -; print message @ up to a null -; saves & - -?pmsg: - push bc - push de -pmsg$loop: - ld a,(hl) - or a - jr z,pmsg$exit - ld c,a - push hl - call ?cono - pop hl - inc hl - jr pmsg$loop -pmsg$exit: - pop de - pop bc - ret - -;------------------------------------------------------------------------------- -; print message inline up to a null -; saves all registers - -pmsg.in: - ex (sp),hl - push af - call ?pmsg - pop af - ex (sp),hl - ret - -;------------------------------------------------------------------------------- -; print hl as a 4 digit hexadecimal number -; saves all registers - -phex4: - ld a,h - call phex2 - ld a,l - ; fall thru - -;------------------------------------------------------------------------------- -; print a as a 2 digit hexadecimal number -; saves all registers - -phex2: - push af - rra - rra - rra - rra - call print.digit - pop af - -print.digit: - push hl - push de - push bc - push af - and 00fh - cp 10 - jr c,prd_1 - add a,007h -prd_1: - add a,'0' - - ld c,a - call ?cono - pop af - pop bc - pop de - pop hl - ret - -;------------------------------------------------------------------------------- - -?pdec: ; print binary number 0-65535 from - ld bc,table10 - ld de,-10000 -next: - ld a,'0'-1 -pdecl: - push hl - inc a - add hl,de - jp nc,stoploop - inc sp - inc sp - jp pdecl -stoploop: - push de - push bc - ld c,a - call ?cono - pop bc - pop de -nextdigit: - pop hl - ld a,(bc) - ld e,a - inc bc - ld a,(bc) - ld d,a - inc bc - ld a,e - or d - jp nz,next - ret - -table10: - dw -1000,-100,-10,-1,0 - -?pderr: - ld hl,drive$msg - call ?pmsg ; error header - ld a,(@adrv) - add a,'A' - ld c,a - call ?cono ; drive code - ld hl,track$msg - call ?pmsg ; track header - ld hl,(@trk) - call ?pdec ; track number - ld hl,sector$msg - call ?pmsg ; sector header - ld hl,(@sect) - call ?pdec ; sector number - ret - ; BNKSEL ; Bank Select. Select CPU bank for further execution. bnksel: - ld (@cbnk),a ; remember current bank - jp ?bank ; and go exit through users - ; physical bank select routine + ld (@cbnk),a ; remember current bank + jp ?bank ; and go exit through users + ; physical bank select routine xofflist: db -1,-1,-1,-1,-1,-1,-1,-1 ; ctl-s clears to zero db -1,-1,-1,-1,-1,-1,-1,-1 - - dseg ; following resides in banked memory - - ; Disk I/O interface routines @@ -648,34 +493,34 @@ xofflist: ; in seldsk: - ld a,c ; save drive select code + ld a,c ; save drive select code ld (@adrv),a - ld b,0 ; create index from drive code + ld b,0 ; create index from drive code ld hl,@dtbl - add hl,bc ; get pointer to dispatch table + add hl,bc ; get pointer to dispatch table add hl,bc ld a,(hl) inc hl ld h,(hl) - ld l,a ; point at disk descriptor - ld (@xdph),hl ; save descriptor pointer + ld l,a ; point at disk descriptor + ld (@xdph),hl ; save descriptor pointer or h - ret z ; if no entry in table, no disk + ret z ; if no entry in table, no disk - ld a,e ; examine login bit + ld a,e ; examine login bit and 1 ret nz push ix ld ix,(@xdph) ld a,(ix-2) - ld (@RDRV),a ; get relative drive - ld l,(ix-6) ; get address of LOGIN routine + ld (@RDRV),a ; get relative drive + ld l,(ix-6) ; get address of LOGIN routine ld h,(ix-5) ex (sp),ix pop de - call ipchl ; call LOGIN - ld hl,(@xdph) ; recover DPH pointer + call ipchl ; call LOGIN + ld hl,(@xdph) ; recover DPH pointer ret @@ -751,8 +596,8 @@ sectrn: ; extended disk parameter header (XDPH). read: - ld ix,(@xdph) ; get drive descriptor pointer - ld l,(ix-8) ; get read routine entry + ld ix,(@xdph) ; get drive descriptor pointer + ld l,(ix-8) ; get read routine entry ld h,(ix-7) jp (hl) @@ -763,8 +608,8 @@ read: ; extended disk parameter header (XDPH). write: - ld ix,(@xdph) ; get drive descriptor pointer - ld l,(ix-10) ; get write routine entry + ld ix,(@xdph) ; get drive descriptor pointer + ld l,(ix-10) ; get write routine entry ld h,(ix- 9) jp (hl) @@ -784,14 +629,7 @@ multio: flush: xor a - ret ; return with no error - - - - ; error message components -drive$msg: db cr,lf,bell,'BIOS Error on ',0 -track$msg: db ': T-',0 -sector$msg: db ', S-',0 + ret ; return with no error ; disk communication data items @@ -800,11 +638,11 @@ sector$msg: db ', S-',0 @xdph: ds 2 ; pointer to currently selected drives dph @adrv: ds 1 ; currently selected disk drive @rdrv: ds 1 ; controller relative disk drive -@cnt: db 0 ; record count for multisector transfer @trk: ds 2 ; current track number @sect: ds 2 ; current sector number @dma: ds 2 ; current DMA address @dbnk: db 0 ; bank for DMA operations +@cnt: db 0 ; record count for multisector transfer cseg ; common memory