> BIOS/src  Source for ZNOS BIOS : (A%=0:X%=1:os%=(&FFF4 &FF00)256:os%=6 >&8000:"Running Z80...":ș "OS_GetEnv" A$:"TextToBas "+A$,A$," ",1+A$," ")))+" -crunch *Z80": 2: <load%=&F200: mcode% &400 F: P P=0 1 ZP%=load%:O%=mcode% d[OPT P*3+4 n; ZNOS BIOS Source Code x; =====================  ); Commentary Copyright (C) J.Harston $; See mdfs.net/Software/CPM/ZNOS ; .BIOS_CBOOT :JP ColdBoot .BIOS_WBOOT :JP WarmBoot $.BIOS_CONST :JP ConsoleStatus .BIOS_CONIN :JP ConsoleIn !.BIOS_CONOUT :JP ConsoleOut .BIOS_LIST :JP List .BIOS_PUNCH :JP PunchOut .BIOS_READER :JP ReaderIn .BIOS_HOME :JP DiskNull .BIOS_SELDSK :JP DiskNull .BIOS_SETTRK :JP DiskNull .BIOS_SETSEC :JP DiskNull ".BIOS_SETDMA :JP DiskNull ,.BIOS_READ :JP DiskNull 6.BIOS_WRITE :JP DiskNull @!.BIOS_LISTST :JP ListStatus J.BIOS_SECTRAN:JP DiskNull T: ^.PatchArea hNOP rLD BC,&2424 | INC H JR NZ,LF25A JR NZ,LF25C JR NZ,LF291  LD D,L  LD B,D NOP NOP NOP NOP  DEC DE LD A,(&7E34)  DEC A JP NZ,&2BAB LD HL,&3BEC LD A,(HL)  A &JP NZ,&2B34 0LD HL,&3B4A :LD A,(HL) DJP &0000 N X .LF25B bEQUB 'DEC HL' l .LF25C v)B &21 ; Pending input buffer  .LF25D :B &58 ; 0=no input pending, <>0=input pending  ).LF25E ; Reset input stream >LD A,&83 ; Specify CON=UC1 RDR=TTY PUN=TTY LST=LPT #LD (&0003),A ; Reset IOBYTE  XOR A #LD (LF25D),A ; Clear a flag LD L,&40 LD A,&03 . OSBYTE ; Output stream=prn disabled LD L,&02 LD A,&02 7JP OSBYTE ; Input stream=kbd, serial enabled  : .ConsoleStatus   LF2D5:B &81 *'W LF373:W LF330:W LF2C9:W LF2F7 4: >.ConsoleIn H LF2D5:B &01 R&W LF381:W LF33D:W LF2BD: LF31D \: f.ConsoleOut p LF2D5:B &81 z'W LF385:W LF355:W LF299:W LF32C :  .List  LF2D5:B &03 'W LF385:W LF355:W LF38F:W LF38F : .ListStatus  LF2D5:B &03 'W LF38A:W LF37C:W LF3A6:W LF3A6 :  .PunchOut  LF2D5:B &05 'W LF385:W LF355:W LF2F6:W LF2F6 :  .ReaderIn  LF2D5:B &07 'W LF381:W LF33D:W LF2F4:W LF2F4 $: . .LF2C9 8 LF2D5:B &07 B'W LF373:W LF330:W LF37E:W LF37E L: V; I/O dispatch `; ------------ j .LF2D5 t.POP HL:LD A,(HL) ; Get IOBYTE flag byte ~0INC HL ; Point to address block BIT 7,A:LD B,A /RES 7,B ; B=IOBYTE shift amount 0JR NZ,LF2E3 ; b7=1, don't clear flag &XOR A:LD (LF25B),A ; Clear a flag  .LF2E3 $LD A,(&0003) ; Get IOBYTE  .LF2E6 1RLCA:DJNZ LF2E6 ; Rotate IOBYTE by factor / &06 ; Keep resultant two bits LD D,&00:LD E,A 2ADD HL,DE ; Index into address block LD E,(HL):INC HL -LD D,(HL) ; DE=selected address  )EX DE,HL:JP (HL) ; Jump to routine  ; ReaderIn 2,3 (; ------------ 2 .LF2F4 <"LD A,&1A:RET ; Return F P; ConStatus 3 Z; ----------- d .LF2F7 n1LD A,(LF25D) ; Is pending buffer full? x3 A:RET NZ ; Return NZ if input pending ,LD HL,LF25B ; Point to something  XOR A  (HL) 3JR Z,LF306 ; If zero, check host input #DEC (HL) ; Decrement 4XOR A:RET ; Return Z - nothing pending  .LF306 LD (HL),&0C LD HL,&0000 LD A,&81 8 OSBYTE ; (0), fetch any pending input  LD A,H  INC A :RET Z ; Return Z if no input pending  &FFC8 H PUSH AF R LD A,C \ OSWRCH f POP AF p &FFC8 z POP HL LD H,&00 LD A,&03 JP OSBYTE   .LF373 LD L,&01 LD A,&98  OSBYTE JR NC,LF37E  XOR A RET   .LF37E  XOR A  DEC A RET $ . .LF381 8LD L,&01 BJR LF33F L .LF385 VLD HL,&00F7 `JR LF358 j .LF38A tLD HL,&FFFD ~JR LF3A9 .LF38F LD A,&75 OSBYTE BIT 0,L JR NZ,LF39D LD A,&02 OSWRCH .LF39D LD A,&01 OSWRCH LD A,C JP OSWRCH LD HL,&FFFC .LF3A9 LD A,&80  OSBYTE ( LD A,L 2 A < RET Z F XOR A P DEC A ZRET d n;; COLD BOOT x;; ========= ;; ..ColdBoot ; Entered on startup >LD SP,&0080 ; Put initial stack in CPM workspace EI 4XOR A:LD (&0004),A ; Clear Current Drive+User ?LD HL,&F730 ; Point to "1.20" in v1.20 client MOS 2LD DE,LF3E4 ; Point to "1.20" string 1LD B,&04 ; Match four characters .LF3C4 +LD A,(DE):CP (HL) ; Compare strings INC HL:INC DE 8JR C,LF3D1 ; Version string doesn't match 4DJNZ LF3C4 ; Loop for four characters 2LD HL,&FCA3 ; v1.20 MOS command flag JR LF3D4 4.LF3D1 ; Not version 1.20 Z80 MOS "2LD HL,&FF8A ; v2.00 MOS command flag , .LF3D4 64LD (HL),&FF ; Set to 'no MOS commands' @E LF401 ; Initialise things, error handler, esc state, J+ ; zero page jumps T< LF25E ; Initialise input and output streams ^" &E00C ; Call BDOS hJLD C,&00:JP &D800 ; Enter CCP ColdBoot entry with C=drive 0/user 0 r | .LF3E4 1M "1.20" ; Version string to match   ;; WARM BOOT ;; ========= ;; .WarmBoot >LD SP,&0080 ; Put initial stack in CPM workspace EI *LD A,&03: OSWRCH ; End any print job " &E00F ; Call BDOS 4 LF3FC ; Fetch CCP and reset vectors JLD C,&00:JP &D803 ; Enter CCP WarmBoot entry with C=drive 0/user 0  &; Fetch CCP and initialise vectors &; -------------------------------- & .LF3FC 0 LD A,&3F ; Fetch CCP : OSBYTE D N; Initialise vectors X; ------------------ b .LF401 l4 &FFBF ; Ensure RSTERR at &0038 is set up v0LD HL,(&FF84) ; Get default error handler .LD (&FFFA),HL ; Set error handler to it LD A,&E5 *LD HL,&0001 ; ESC key returns II OSBYTE LD A,&C3 )LD (&0000),A ; Put JP opcode into %LD (&0005),A ; RESET and BDOS .LF41A .LD HL,BIOS_WBOOT ; Put RESET destination )LD (&0001),HL ; in address field -LD HL,&E006 ; Put BDOS destination )LD (&0006),HL ; in address field .DiskNull RET    * .LF427 4EX (SP),HL > PUSH DE H PUSH BC R PUSH AF \ .LF42B fLD A,(HL) p INC HL z A JR Z,LF437 PUSH HL LF43C POP HL JR LF42B .LF437 POP AF POP BC POP DE EX (SP),HL RET  .LF43C  CP &0D JR NZ,LF445  LF445 $LD A,&0A . .LF445 8 LD C,A BJP ConsoleOut L VA; left-over code, a copy of the startup code and bits of BDOS ` .LF449 jRLCA tDJNZ LF444 ~LD HL,&FCA3 JR LF454   .LF451 LD HL,&FF8A  .LF454 LD (HL),&FF  LF401  LF25E  &E00C LD C,&00 JP &D800 LD SP,&322E JR NC,LF49A  ADD A,B NOP EI (LD A,&03 2 OSWRCH < &E00F F LF3FC PLD C,&00 ZJP &D803 dLD A,&3F n &28F4 x .LF481 JR LF481  INC BC JR NZ,LF48D LD A,&8D  OSBYTE JR LF49A  .LF48D LD L,&03  CP &02 JR Z,LF495 LD L,&00  .LF495 LD A,&8C  OSBYTE  .LF49A  POP HL "RET ,LD (&1364),SP 6 PUSH HL @LD HL,(&FFFA) JLD (&1362),HL TLD HL,&06DB ^LD (&FFFA),HL h POP HL rRET |LD SP,(&1364)  POP HL LD HL,(&FF82)  PUSH HL  INC HL  SUB A,A LD BC,&FFFF CPIR  DEC HL LD (HL),&0D  POP HL LD A,(HL)  INC HL  A JR LF4C9  XOR A  .LF4C9 & PUSH HL 0LD HL,(&1362) :LD (&FFFA),HL D POP HL NRET X PUSH DE b XOR A l LD E,A v OSARGS  POP DE RET LD A,&03 RET .LF4DD:B &4A .LF4DE:B &03 $.LF4DF:M "SJ Econet ver 3.4Az$" .LF4F3:B &FE:B &1E .LF4F5:B &CA:B &B9:B &0D .LF4F8:B &FE:B &21 .LF4FA:B &38:B &02 .LF4FC:B &D6:B &09 .LF4FE:B &D6:B &0F ]  >"Save ZNOS_BI "+~mcode%+" "+~O%+" "+~load%+" "+~load%  *Quit