;PATCH CPM.BIN WITH DDT USING OFFSET 3980 ; ************************************************************** ; * * ; * KAYPRO II CBIOS source FOR USE WITH ZCPR Version 3 * ; * Copyright (c) 1985 Mike Liddle * ; * * ; ************************************************************** ; ######################################################### ; # EQUATES GO HERE OR may be put in a .HDR file # ; ######################################################### ; SYSTEM EQUATES FOR CP/M 2.2 ; 5 kilobytes set aside for ZCPR3 above the BIOS -> TPA = 55K MSIZE EQU 64 ; 64 kilobyte system memory size BIAS EQU (MSIZE-25)*1024 ; 5K for ZCPR3 segmentes etc CCP EQU 03400H + BIAS ; Base of CCP in CP/M or ZCPR3 BDOS EQU CCP + 806H ; Base of BDOS entry BIOS EQU CCP + 1600H ; Base of BIOS BIOSTK EQU 0FC00H ; Top of temporary stack used by BIOS DNUMB EQU 'D'-'A' ; Ramdrive is D: ; ZCPR3 EQUATES. Identical to those in Z3BASE.LIB RCP EQU 0E900H ; Resident Command Package RCPS EQU 16 IOP EQU 0F100H ; Redirectable I/O package IOPS EQU 8 ; 1K FOR I/O less 128 byte D: sector buffer FCP EQU IOP+IOPS*128 ; Flow command package FCPS EQU 4 ; 4 * 128-byte blocks Z3ENV EQU FCP+FCPS*128 ; Environment descriptors Z3ENVS EQU 2 ; 2 * 128-byte blocks SHSTK EQU Z3ENV+Z3ENVS*128; 2 * 128-byte blocks SHSIZE EQU 32 ; Size of a shell stack entry SHSTKS EQU 4 ; 4 * shsize-byte blocks Z3MSG EQU SHSTK+SHSIZE*SHSTKS ; stack size = shzize * shstks EXTFCB EQU Z3MSG+80 ; 80 bytes for message area Z3NDIR EQU EXTFCB+48 ; External FCB is 48 bytes long Z3NDIRS EQU 14 ; 14 named directory elements Z3CLCHK EQU Z3NDIR+14*Z3NDIRS+1 ; Check this is lower than Z3CL !! Z3CL EQU 0FA00H ; ZCPR Multiple Command Line buffer Z3CLS EQU 200 ; Length of Buffer EXTSTK EQU Z3CL+Z3CLS+48 ; External stack needs 48 bytes ; REDIRECTABLE IO PACKAGE EQUATES RioBase Equ Iop+9 Tinit Equ RioBase const Equ RioBase+3 conin Equ RioBase+6 conout Equ RioBase+9 list Equ RioBase+12 punch Equ RioBase+15 reader Equ RioBase+18 listst Equ RioBase+21 newio Equ RioBase+24 ; PAGE ZERO EQUATES. IObyte EQU 00003H ; CP/M control of I/O vectors UDflag EQU 00004H ; User number in upper 4 bits ; Disk number in lower 4 bits (A=0) INDMA EQU 0FC14H ; Used to pass DMA address to ROM ; ************************************************************ ; * Kaypro II ROM Routines * ; ************************************************************ RCBOOT EQU 00H ;Cold boot - not used by Cbios RDINIT EQU 03H ;Initialise - Discs RVINIT EQU 06H ;Initialise - Video RSINIT EQU 09H ;Initialise - serial ports RHOME EQU 0CH ;Home disc heads RSELD EQU 0FH ;Select Disc RSETRK EQU 12H ;Set track RSETSEC EQU 15H ;Set sector RSETDMA EQU 18H ;Set DMA address RREAD EQU 1BH ;Read sector RWRITE EQU 1EH ;Write sector RSTRAN EQU 21H ;Sector skew table translate RMON EQU 24H ;Drive motors on RMOFF EQU 27H ;Drive motors off RKCONST EQU 2AH ;Console status - keyboard RKCONIN EQU 2DH ;Console input - keyboard RKOUT EQU 30H ;Console output - keyboard RSCONST EQU 33H ;Console status - Serial port RSCONIN EQU 36H ;Reader - Serial port RSCOUT EQU 39H ;Punch - Serial port RPLSTST EQU 3CH ;List status - Parrallel port RPLIST EQU 3FH ;List - Parrallel port RSLSTST EQU 42H ;List status - Serial port RVCOUT EQU 45H ;Console output - Video RDELAY EQU 48H ;Delay (length in BC) ; EQUATES FOR SELECTING RAM BANK. PIOData EQU 01EH ; SYSPIO port B data PIOCtrl EQU 01FH ; SYSPIO port B control Mode3 EQU 0CFH ; Mode3 = Control IOMask EQU 0F8H ; Bits 0,1,2 as output. Rest as input. ; ############################ ; # NOW THE CBIOS CODE # ; ############################ ORG BIOS JP BOOT ; Cold start WBOOTE JP WBOOT ; Warm start JP CONST ; Console status JP CONIN ; Console character in JP CONOUT ; Console character out JP LIST ; List character out JP PUNCH ; Punch character out JP READER ; Reader character out DiskIO JP HOME ; Move head to home position JP SELDSK ; Select disk JP SETTRK ; Set track number JP SETSEC ; Set sector number JP SETDMA ; Set DMA address JP READ ; Read disk JP WRITE ; Write disk JP LISTST ; Return list status JP SECTRAN ; Sector translate ; ************************************************************ ; * CONFIGURATION Parameters - Default CP/M I/O Byte * ; * Write safe flag * ; * (As per Kaypro II Bios) Cursor Key definitions * ; * Blue numeric Key definitions * ; * Default RS232 Baud rate * ; * (Followed by ZCPR3) Wheel Byte * ; * Default PATH for .COM search * ; ************************************************************ IOdflt DB 081H ; I/O Byte default Wsafe DB 000H ; Write safe flag #00 = No #FF = Yes ; Cursor keys - Keydefs DB 00BH ; Up ctrl-K DB 00AH ; Down ctrl-J DB 008H ; Left ctrl-H DB 00CH ; Right ctrl-L ; Blue numeric keys - DB 030H ; 0 DB 031H ; 1 DB 032H ; 2 DB 033H ; 3 DB 034H ; 4 DB 035H ; 5 DB 036H ; 6 DB 037H ; 7 DB 038H ; 8 DB 039H ; 9 DB 02DH ; - DB 02CH ; , DB 00DH ; DB 02EH ; . Dbaud DB 05H ;Default Baud rate for Serial port ; ************************************************************ ; * Wheel byte is set on at cold boot * ; ************************************************************ Z3Whl DB 0FFH ; ************************************************************ ; * Default path for .COM file search * ; ************************************************************ ExPath DB 'D'-'@', 0 DB 'A'-'@', 0 DB 'A'-'@', 15 DB 'B'-'@', 0 DB 0, 0 DB 0 Expaths EQU ($-Expath-1)/2 ; Number of elements ; **************************** ; * Safest place to put this * ; **************************** Savesp DW 00000H ; Save SP during BIOS execution ; ************************************************************ ; * COLD and WARM BOOT routines * ; ************************************************************ ; Cold Boot routine. When this is run the ROM has already read ; the BIOS into memory and done some disk initialisation. The ; various SIO/0 and PIO's have been initialised as has the screen. ; Most of this routine involves setting up CP/M and defaults ; for user modifiable functions. ; ; Note that the first line is a call to a ROM disk initialisation ; routine. It is possible to ignore the ROM and do all our own disk ; initialisation and hardware routines in RAM. ; Initialisation of ZCPR3 areas takes place here. Boot: JP MemInit ; Do that once only initialisation ; code in a part of RAM latter ; used for buffers - economy!!! Cont LDIR ; Overwrite cold boot etc. JP setresv ; Setup page 0 & get us out of boot ; ******************************************************************* ; * Warm Boot routine. Initialises all disk work areas and then * ; * reads in both CCP and BDOS. * ; ******************************************************************* wboot CALL string ; Tell user that we are warm booting DB 0DH,0AH, 'Warm Boot', 0DH,0AH,00H CALL init LD A,Mode3 ; Set up bank select OUT PIOCtrl,A ; Mode 3 LD A,IOMask OUT PIOCtrl,A ; Bits 0,1,2 are output LD A,00H ; select bank to save CCP/BDOS in OUT PIOData,A LD BC,Bios-CCP LD HL,0 LD DE,CCP LDIR ;get back CCP/BDOS ; Initialise base page ; Also acts as exit for cold boot routine setresv LD A,07H ; Bank 7 selected for TPA OUT PIOData,A LD A,0C3H ; Initialise Jump to LD HL,WBOOTE ; warm boot vector LD (0),A ; Jump goes LD (1),HL ; into address 0-2 LD HL,BDOS ; BDOS entry point LD (5),A ; Addresses 4-6 contains LD (6),HL ; Jump to BDOS LD A,(4) ; Get default drive LD C,A ; Set up default drive ; Transfer control to ZCPR3 console command processor JP CCP ; Control to CCP ; STRING displays a string on the screen. string EX (SP),HL ; Get start of string LD A,(HL) ; get a character INC HL EX (SP),HL ; put address onto stack OR A ; zero indicates end of string RET Z ; and (SP) contains return address LD C,A ; communicate in reg C CALL Conout ; send it to conout screen JR string ; process next byte ; ********************************************************************** ; * DISK I/O routines follow. They all have the same basic form. * ; * Load HL with an address in the ROM jump table, then transfer * ; * to the RomIo routine. * ; ********************************************************************** Init LD L,Rdinit ; Disk Initialise JP Romio ; ; HOME - move to track 00 ; HOME LD A,(Drive) ;CHECK Drive NUMBER. CP DNUMB ;IS IT THE RAMDRIVE? JP NZ,home1 ;IF NOT, LET BIOS HANDLE IT. LD A,0 ;SET "TRACK" TO 0 LD (DTrack),A RET home1 LD L,Rhome ;romio 0000C JP romio ; ; SELDSK - select disk given by reg c ; SELDSK LD A,C ;CHECK REQUESTED DISK, LD (Drive),A CP DNUMB JP NZ,Seldsk1 LD HL,DDPH ;RETURN DISK PAR. HEADER. RET seldsk1 LD L,00FH ;romio 0000F JP romio ; ; SETTRK - set track address for subsequent r/w ; SETTRK LD A,(Drive) CP DNUMB JP NZ,Settrk1 LD A,C ;TRACK NO. LD (DTrack),A RET settrk1 LD L,RSetrk ;romio 00012 JP romio ; ; SETSEC - set sector address ; SETSEC LD A,(Drive) CP DNUMB JP NZ,SetSec1 LD (DSector),BC RET setsec1 LD L,RSetSec ;romio 0000F JP romio ; ; SETDMA - set subsequent dma address (initially 80H) ; SETDMA LD (DDMA),BC ;SAVE DMA ADDR. BOTH HERE LD L,RSetDma ;and in BIOS romio 00018 JP romio ; ; READ - read track/sector to present dma address ; READ LD A,(Drive) CP DNUMB JP NZ,read1 LD (SAVESP),SP LD SP,BIOSTK CALL Point ; Point HL to sector in RAM Disk LD BC,128 LD DE,DSecBuf ; Move sector from RAM Disk LDIR ; to BIOS buffer DEBUG LD A,07 OUT PioData,A ; TPA Bank back LD BC,128 LD DE,(DDMA) LD HL,DSecBuf ; Now move data from BIOS buffer LDIR ; To users buffer LD SP,(SAVESP) ; restore stack XOR A ; No Error ever! RET Read1 LD L,Rread ; Read JP Romio ; ; WRITE - write track/sector from present dma address ; WRITE LD A,(Drive) CP DNUMB JP NZ,Write1 LD BC,128 ; Get sector to be written LD HL,(DDMA) ; into BIOS buffer LD DE,DSecBuf LDIR LD (SAVESP),SP LD SP,BIOSTK CALL Point ; Point HL to sector in RAM Disk LD BC,128 EX DE,HL ; Move data from BIOS buffer LD HL,DSecBuf LDIR ; to RAM Disk LD A,07 OUT PioData,A ; TPA Bank back LD SP,(SAVESP) ; restore stack XOR A ; No Error ever! RET Write1 LD L,Rwrite ; Write LD A,(WSAFE) ; Write safe flag OR A JP Z,Romio LD C,1 JP Romio ; ; SECTRAN - translate sector BC using table at DE ; SECTRAN LD A,(Drive) CP DNUMB JP NZ,Sectr1 LD H,B LD L,C RET sectr1 LD L,Rstran ;romio 00021 JR romio Point LD A,(DTrack) ; There are 256 x 128 byte AND 07H ; sectors in a 32K bank RRCA ; Bits 5,6,7 of DTrack RRCA ; indicate which 4K chunk RRCA LD C,A ; Move them to 0,1 positions LD A,(DSector) ; Bits 3 -> 7 of Dsector AND 1FH ; contain the rest of the OR C ; sector address in the bank. RRA ; address in A. We move this to HL LD H,A ; and shift it seven bits to the left LD A,00H ; to produce a pointer to the sector RRA LD L,A LD A,Mode3 ; Set up ready for bank select OUT PIOCtrl,A ; Mode 3 LD A,IOMask OUT PIOCtrl,A ; Bits 0,1,2 are output LD A,(DTrack) ; find which 32K bank from RRA ; bits 3,4,5 of Dtrack and RRA ; load them into A RRA AND 07H INC A ; add 1 as using banks 1-5 not 0->4 OUT PioData,A ; Get the bank RET ; ****************************************************** ; * Here is how control is transfered to and from ROM * ; * Use alternate registers to save rather than stack. * ; ****************************************************** Romio EXX IN A,(1CH) SET 7,A OUT (1CH),A LD (SAVESP),SP LD SP,BIOSTK LD DE,RomRet PUSH DE EXX LD H,0 JP (HL) RomRet EX AF,AF' LD SP,(SAVESP) IN A,(1CH) RES 7,A OUT (1CH),A EX AF,AF' RET ; ******************************************* ; * Data Portion of BIOS * ; ******************************************* Drive DB 00H ; Drive A: at log on DTrack DW 00H ; 'Track' of Ram disk DSector DW 00H ; 'Sector' of Ram disk DDMA DW 80H ; Disk parameter header for D: DDPH DW 0000H ;xlt DW 0000H DW 0000H DW 0000H DW DirBuf ; FF78 DW DPB DW CSV DW ALV DirBuf EQU 0FF78H DPB DW 32 ; Sectors/track - 40 tracks each with 4K data DB 3 ; BSH DB 7 ; BLM DB 0 ; EXM DW 159 ; DSM 160-1 DW 31 ; DRM DW 0080H ; AL0,AL1 DW 0000H ; CKS DW 0000H ; OFF ; ################################################################# ; # ABOVE THIS LINE CODE MUST NOT BE CORRUPTED # ; ################################################################# CSV DS 010H ALV DS 020H DSecBuf EQU $ ;0F400H ; Address of 128 byte sector buffer ; Must be =< 0E870H ; ************************************************************ ; * Initialise ZCPR3 Buffers * ; ************************************************************ MemInit LD Hl,0000H LD (Boot+1),HL ; Prevent future cold boot -> CRASH! LD HL,IOP ; Zero fill the area XOR A ; used by ZCPR3 excep LD (HL),A ; for RCP as this area LD DE,IOP+1 ; is used for CBIOS and LD BC,0FAFFH-IOP-1 ; ZCPR3 defaults that may LDIR ; later be overwritten LD HL,CMDSET ; Load startup command into LD DE,Z3CL ; MCL buffer LD BC,CMDEND-CMDSET+1 ; length of command LDIR LD HL,DfltIO ; Simple non disk I/O pakage LD DE,Iop LD BC,IOLen LDIR LD HL,Dfltenv ; Enviroment descriptor LD DE,Z3env LD BC,EnvLen1 LDIR LD HL,Envorg2 ; Z3TCAP for ADM-3A LD DE,Z3env+80H LD BC,EnvLen2 LDIR CALL Init ; Set up disk ? what else LD A,(IOdflt) ; Initialise IO Byte LD (IOByte),A XOR A ; Select A as default drive LD (UDflag),A LD A,(DBAUD) ; Initialise Default RS232 port baud rate OUT (0),A CALL String ; System start message DB 01AH DB 'KAYPRO 8+ CP/M 2.2 + ZCPR3',0DH,0AH DB 'MIKE LIDDLE Cbios Vers 1.4g',0DH,0AH DB 'Tel Sheffield (0742) 460431',0DH,0AH DB 00H LD A,8 ; Quiet OUT (5),A ; Keyboard LD A,Mode3 ; Set up bank select OUT PIOCtrl,A ; Mode 3 LD A,IOMask OUT PIOCtrl,A ; Bits 0,1,2 are output LD A,00H ; select bank to save CCP/BDOS in OUT PIOData,A LD BC,Bios-CCP LD HL,CCP LD DE,0 LDIR ; save CCP/BDOS for future warm boots LD HL,RCP ; The RCP buffer may now XOR A ; be zero filled. LD (HL),A LD DE,RCP+1 LD BC,IOP-RCP-1 JP Cont ; ************************************************************ ; * IO Package * ; ************************************************************ IOffset EQU IOP-$ ; Simulate PHASE PseudoOp DfltIO JP IOError+IOffset ; No status routine JP IOError+IOffset ; No Select routine JP IOError+IOffset ; No namer routine JP IOError+IOffset JP KConSt+IOffset JP KConIn+IOffset JP KConOut+IOffset JP KList+IOffset JP KPunch+IOffset JP KReader+IOffset JP KListSt+IOffset JP NewIo+IOffset JP IOError+IOffset ; copen - Open CON: Disk File JP IOError+IOffset ; cclose - Close CON: Disk File JP IOError+IOffset ; lopen - Open LST: Disk File JP IOError+IOffset ; lclose - Close LST: Disk File DB 'Z3IOP' ;Read by Z3LOADER IOError XOR A RET KConst Call PrChar+IOffset LD A,(3) ; Get IOByte AND 3 LD L,Rsconst ; RS232 JP Z,Romio LD L,Rkconst ; Keyboard JP Romio KConin IN A,(1CH) ; Find out if motor is on BIT 6,A ; and if it is turn it off LD L,Rmoff ; Motor Off CALL Z,Romio Con1 Call KConst+IOffset AND A JR Z,Con1 LD A,(3) AND 3 LD L,Rsconin JP Z,Romio LD L,Rkconin CALL Romio OR A RET P AND 1FH LD HL,KEYDEFS LD C,A LD B,0 ADD HL,BC LD A,(HL) RET KConout LD A,(3) AND 3 LD L,Rscout ; Punch RS232 JP Z,Romio LD L,Rvcout ; Video JP Romio KReader LD L,Rsconin ; Reader RS232 JP Romio KPunch LD A,(3) AND '0' ; 30H LD L,Rscout ; Punch RS232 JP Z,Romio LD L,Rslstst ; Listst RS232 JP Romio ; ; Hardware list output ; HardLst LD A,(3) AND 0C0H LD L,Rscout ; Punch RS232 JP Z,Romio LD L,Rplist ; List Centronics CP 80H JP Z,Romio LD L,Rvcout ; Video CP 40H JP Z,Romio LD L,Rslstst ; ListSt RS232 JP Romio ; ; Hardware List device status. ; HardSt LD L,Rplstst ; ListSt Centronics CALL Romio ; IO Byte NOT implemented here! RET NZ XOR A RET ;====================================================================== ; ROUTINES TO HANDLE printer BUFFER ; Buffer is from BufBase to BufTop ; ; Note that :- ; NxtChar=NxtFree indicates an empty buffer ; NxtChar=NxtFree+1 indicates a full buffer ; ;---------------------------------------------------------------------- ; LISTST routine ; Is space for a character available. ; If Nxtfree+1=nxtchar buffer is full. KlistSt CALL PrChar+IOffset ; Send a character to printer if free LD HL,(NxtFree) CALL INCNXT+IOffset ; NxtFree+1 LD DE,(NxtChar) ; NxtChar CALL Equal+IOffset ; Equal is buffer full -> Z flag set JR Z,BufFull ; LD A,0FFH ; 0FFH -> buffer has space RET BufFull XOR A ; 00H -> printer buffer is full RET ;---------------------------------------------------------------------- ; LIST routine ; Put character in buffer :- ; Puts character in cyclical buffer. If buffer full ; then trys to empty buffer by calling ListSt until returns ; not busy. Remember my ListSt tests for full buffer ; rather than checking printer status - it also trys to ; send a character to the printer. KList LD A,Mode3 OUT PIOCtrl,A ; Mode 3 LD A,IOMask OUT PIOCtrl,A ; Bits 0,1,2 are output LD A,00 OUT PIOData,A LD HL,(NxtFree) ; Put character in buffer LD (HL),C LD A,07 OUT PIOData,A Wait CALL KListSt+IOffset ; Check buffer has space AND A JR Z,Wait ; Loop until room in buffer LD HL,(NxtFree) ; Now move pointer CALL INCNXT+IOffset ; to next space LD (NxtFree),HL ; and store it. RET ;---------------------------------------------------------------------- ; Get character from buffer and send to printer if not busy. ; If printer busy return having done nothing. ; If buffer empty or printer busy then return without doing anything. ; Destroys the contents of AF,D and HL. PrChar LD HL,(NxtChar) ; See if buffer PrAgain LD DE,(NxtFree) ; contains character(s) and CALL Equal+IOffset ; if not then RET Z ; return. If it does then check CALL HardSt+IOffset ; hardware list device status RET Z ; return if printer busy LD A,Mode3 OUT PIOCtrl,A ; Mode 3 LD A,IOMask OUT PIOCtrl,A ; Bits 0,1,2 are output LD A,00 OUT PIOData,A LD HL,(NxtChar) ; Get character and send to printer LD C,(HL) LD A,07 OUT PIOData,A CALL HardLst+IOffset ; using Kaypro hardware List routine LD HL,(NxtChar) ; Now increment HL CALL IncNxt+IOffset ; Move pointer to next character LD (NxtChar),HL ; Save pointer JR PrAgain ; Keep looping until printer busy/ ; buffer empty. ;---------------------------------------------------------------------- ; ; Equal tests two 16 bit numbers for equality. ; Numbers passed in DE and HL. ; Sets Z falg if numbers identical. ; Alters AF registers only. ; Equal LD A,D XOR H RET NZ ; Check if D=H LD A,E XOR L ; Check if E=L RET ;---------------------------------------------------------------------- ; ; INCNXT moves pointer to next byte in buffer. Pointer is passed in ; HL register pair. If it is equal to the top of the buffer then ; HL is set to the base of the buffer. Otherwise HL is increased ; by 1. Destroys contents of AF and DE. ; INCNXT LD DE,BufTop CALL Equal+IOffset ; If pointer points to top of buffer JR Z,cycle INC HL ; add 1 to pointer RET Cycle LD HL,BufBase ; otherwise set pointer to bottom of buffer RET ;----------------------------------------------------------------------------- NxtFree EQU $+IOffset ; Next free byte in buffer DW BufBase NxtChar EQU $+IOffset ; Next character to send to printer DW BufBase BufBase EQU 01600H ; Bottom of buffer BufTop EQU 07FFFH ; Top of buffer IOLen EQU $-DfltIO ;----------------------------------------------------------------------------- ; ************************************************************ ; * ZCPR3 default enviroment description. * ; ************************************************************ Dfltenv JP 0 envorg1 db 'Z3ENV' ; Environment ID db 1 ; class 1 environment (external) dw expath ; external path address db expaths ; number of 2-byte elements in path dw rcp ; RCP address db rcps ; number of 128-byte blocks in RCP dw iop ; IOP address db iops ; number of 128-byte blocks in IOP dw fcp ; FCP address db fcps ; number of 128-byte blocks in FCP dw z3ndir ; NDR address db z3ndirs ; number of 18-byte entries in NDR dw z3cl ; ZCPR3 Command Line db z3cls ; number of bytes in Command Line dw z3env ; ZCPR3 Environment Descriptor db z3envs ; number of 128-byte blocks in Descriptor dw shstk ; Shell Stack address db shstks ; number of shsize-byte entires in Shell Stack db shsize ; size of a Shell Stack entry dw z3msg ; ZCPR3 Message buffer dw extfcb ; ZCPR3 External FCB dw extstk ; ZCPR3 External Stack db 0 ; quiet flag (1=quiet, 0=not quiet) dw z3whl ; address of Wheel Byte db 5 ; Processor Speed in MHz db 'D'-'@' ; maximum disk db 15 ; maximum user db 1 ; 1=OK to accept DU, 0=not OK db 0 ; CRT selection (0=CRT 0, 1=CRT 1) db 0 ; Printer selection (n=Printer n) db 80 ; width of CRT 0 db 24 ; number of lines on CRT 0 db 22 ; number of lines of text on CRT 0 db 0 ; width of CRT 1 db 0 ; number of lines on CRT 1 db 0 ; number of lines of text on CRT 1 db 80 ; width of Printer 0 db 66 ; number of lines on Printer 0 db 58 ; number of lines of text on Printer 0 db 1 ; form feed flag (0=can't formfeed, 1=can) db 0 ; width of Printer 1 db 0 ; number of lines on Printer 1 db 0 ; number of lines of text on Printer 1 db 0 ; form feed flag (0=can't formfeed, 1=can) db 0 ; width of Printer 2 db 0 ; number of lines on Printer 2 db 0 ; number of lines of text on Printer 2 db 0 ; form feed flag (0=can't formfeed, 1=can) db 0 ; width of Printer 3 db 0 ; number of lines on Printer 3 db 0 ; number of lines of text on Printer 3 db 0 ; form feed flag (0=can't formfeed, 1=can) db 'SH ' ; shell variable filename db 'VAR' ; shell variable filetype db ' ' ; filename 1 db ' ' ; filetype 1 db ' ' ; filename 2 db ' ' ; filetype 2 db ' ' ; filename 3 db ' ' ; filetype 3 db ' ' ; filename 4 db ' ' ; filetype 4 EnvLen1 EQU $-Dfltenv ; ************************************************************ ; * Z3 Terminal Capabilities Data ADM-3A * ; ************************************************************ envorg2 DB 'KAYPRO 8+ ' ;Name of Terminal DB 'K'-'@' ;Cursor UP DB 'J'-'@' ;Cursor DOWN DB 'L'-'@' ;Cursor RIGHT DB 'H'-'@' ;Cursor LEFT DB 00 ;CL Delay DB 00 ;CM Delay DB 00 ;CE Delay DB 1ah,0 ;CL String DB 1bh,'=%+ %+ ',0 ;CM String DB 18h,0 ;CE String DB 0 ;SO String DB 0 ;SE String DB 0 ;TI String DB 0 ;TE String EnvLen2 EQU $-EnvOrg2 ; ************************************************************ ; * Initial Multiple command line buffer contents * ; ************************************************************ Cmdset DW Z3CL+4 ; Point to first character DB Z3CLS ; Length of buffer DB 0 DB 'STARTUP' ; load cold boot command line Cmdend DB 0 Biostop EQU $