; PCPICTC1.AZM ; ; Rev 1.0 - Created 30 April 1987 by Gordon J. Marwood ; ICBBS Ottawa, Canada, (613) 952-2889 ; ; A Real Time Clock routine, utilizing the Z80CTC chip ; on the PCPI Applicard. ; ; Two functions are provided by this code:- ; - A running time prompt will be displayed with the CP/M ; prompt, i.e. [HH:MM:SS] A0>. The time is updated each ; second. ; - A new BIOS CALL is provided which returns the address of the ; time string to the calling program. ; ; This code requires a minor change to be made in the CCP. This can ; be most easily accomplished if the source code of the CCP is ; available. This particular implementation was done for ZCPR2. ; ; BS EQU 8 CR EQU 0DH LF EQU 0AH ; CNSLIN EQU 1 ; Read Console Buffer BIOS call CSLOUT EQU 2 DIRCON EQU 6 WRTCB EQU 9 ; Write Console Buffer BIOS call CNSTAT EQU 0Bh ; DRVUSR EQU 0004 BDOS EQU 0005 ; CONSTAT EQU 0006H CONOUT EQU 000CH ; ; ; CTC Vector Jump Table ; CTC0 EQU 0FF80H CTC1 EQU 0FF82H CTC2 EQU 0FF84H CTC3 EQU 0FF86H ; CCPFLG EQU 0FF90H ; HISPCE EQU 181h CTCODE EQU 0A5h ; CTC Control Code ; 1 0 1 0 0 1 0 1 ; ^ ^ ^ ^ ^ ^ ^ ^ ; Enable channel interrupt __ / / / / \ \ \ \__ This is a control code ; Timer mode __/ / / \ \ \__ RESET, channel running ; Decrement every 256th pulse __/ / \ \__ Load time constant next ; Negative edge trigger __/ \__ Trigger on CLK/TRG pin ; CTCTIM EQU 0FCh ; CTC time constant SFTIME EQU 5Ch ; Software time constant ; in interrupt service routine ; ORG 100H ; START: DI ; Disable interupts LD (FRSTSP),SP ; Save stack pointer and set up LD SP,FSTSTK ; local stack. ; PUSH HL ; PUSH DE ; Save registers PUSH BC ; for RETurn PUSH AF ; ; ; CALL WELCOM ; Display welcome message ; LD HL,FINISH-BIOSJP+HISPCE ; Space needed by RTC code and EX DE,HL ; and Applicard high memory code AND A ; Clear carry LD HL,0FFFFh SBC HL,DE ; Find maximum CP/M Top of Memory ; value needed to accommodate ; RTC patch ; LD A,L ; Round it down to nearest 1/2 CP 80h ; or full page JR NC,HLFPGE LD L,0 JR STRBOT ; HLFPGE: LD L,80 ; Set lo byte to 1/2 page STRBOT: LD (BOTPAT),HL ; ; ; Find PCPICPM Top of Memory address ; LD HL,(0001h) ; BIOS page LD L,3Eh ; Top of Memory address in ; PCPICPM is at Cold Boot ; entry address plus 3Eh LD E,(HL) INC HL LD D,(HL) LD (TOPMEM),DE ; Compare PCPICPM Top of Memory LD HL,(BOTPAT) ; address with maximum top of AND A ; memory to allow space for SBC HL,DE ; RTC patch JP NC,CKSTAT ; ; ; There is no room above PCPICPM for RTC patch. Output to console ; PCPICPM Top of Memory to be used for a new INSTALL ; LD HL,(BOTPAT) ; Lo address to be used by patch CALL CONVHL ; Convert two byte hex address into ; 4 ASCII characters ; LD DE,MSGEXT ; Print failure message LD C,WRTCB CALL BDOS ; LD DE,HNIBHI ; including Top of Memory value LD C,WRTCB ; to be used in Applicard INSTALL. CALL BDOS ; ; ; Message to provide address of CCPFLAG ; LD HL,CCPFLG CALL CONVHL ; LD DE,HNIBHI LD C,WRTCB CALL BDOS ; JP RESTOR ; Exit after restoring stack ; ; ; Subroutine to translate a 16 bit address into 4 ASCII characters ; CONVHL: LD A,0F0h AND H ; Mask out lower nibble SRL A ; Shift upper SRL A ; nibble SRL A ; to SRL A ; lower nibble CP 0Ah JR C,H1NUMB ADD A,7 H1NUMB: ADD A,30H LD (HNIBHI),A ; Put ASCII character in message ; LD A,0Fh AND H ; Mask out upper nibble ; Put ASCII character in message CP 0Ah JR C,H2NUMB ADD A,7 H2NUMB: ADD A,30H LD (HNIBLO),A ; LD A,0F0h AND L ; Mask out lower nibble SRL A ; Shift upper SRL A ; nibble SRL A ; to SRL A ; lower nibble CP 0Ah JR C,L1NUMB ADD A,7 L1NUMB: ADD A,30H LD (LNIBHI),A ; Put ASCII character in message ; LD A,0Fh AND L ; Mask out upper nibble ; Put ASCII character in message CP 0Ah JR C,L2NUMB ADD A,7 L2NUMB: ADD A,30H LD (LNIBLO),A ; RET ; ; MSGEXT: DEFB CR,LF,'No room above CP/M System for Real Time Clock Routines' DEFB CR,LF,'Install new System with CP/M Top of Memory = 0$' ; MSGCCP: DEFB 'To display the time in the CP/M prompt, the CCP must ' DEFB 'be patched.',CR,LF,CR,LF DEFB 'Immediately before the CCP CALL READ CONSOLE BUFFER ' DEFB '(BDOS CALL 0Ah), ',CR,LF DEFB 'which reads the CP/M command line, CCPFLG must be set ',CR,LF DEFB 'to 0FFh. On return from this CALL, CCPFLG must be set ',CR,LF DEFB 'to zero (see PCPI-RTC.DOC)',CR,LF DEFB CR,LF,CR,LF,'The address of CCPFLG in this code = 0$' ; HNIBHI: DEFS 1 HNIBLO: DEFS 1 LNIBHI: DEFS 1 LNIBLO: DEFS 1 DEFB 'h',CR,LF,CR,LF,CR,LF,'$' ; ; TOPMEM: DEFS 2 ; Address of CP/M Top of Memory BOTPAT: DEFS 2 ; Address needed for bottom of patch ; ; ; Welcome message subroutine ; WELCOM: LD DE,CLRSCR ; Clear screen LD C,WRTCB CALL BDOS ; LD DE,TITLE ; Display title LD C,WRTCB CALL BDOS ; LD DE,CONFIG ; Checking for space above LD C,WRTCB ; PCPICPM message CALL BDOS ; RET ; ; CLRSCR: DEFB 1Bh,2Ah,'$' TITLE: DEFB CR,LF,CR,LF DEFB ' /\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\' DEFB CR,LF DEFB ' < >' DEFB CR,LF DEFB ' < P C P I - R T C >' DEFB CR,LF DEFB ' < >' DEFB CR,LF DEFB ' < >' DEFB CR,LF DEFB ' < R E A L T I M E C L O C K >' DEFB CR,LF DEFB ' < >' DEFB CR,LF DEFB ' < f o r t h e >' DEFB CR,LF DEFB ' < >' DEFB CR,LF DEFB ' < P C P I A P P L I C A R D (c) >' DEFB CR,LF DEFB ' < >' DEFB CR,LF DEFB ' \/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/' DEFB CR,LF,CR,LF,CR,LF,'$' CONFIG: DEFB ' Checking for sufficient space above CP/M ' DEFB 'for RTC patch' DEFB CR,LF,CR,LF,'$' SPACOK: DEFB ' ' DEFB '** OK **',CR,LF,'$' ; ; ; Check to see if RTC already initialized once ; CKSTAT: LD DE,SPACOK LD C,WRTCB CALL BDOS ; LD HL,(0001H) LD L,0AH ; CONIN JumP offset in BIOS jump table LD E,(HL) INC HL LD D,(HL) EX DE,HL LD A,(HL) CP 0C3H ; Check to see if CONIN routine in ; BIOS has been patched. JR Z,CLKCAL ; ; ; RTC has not been initialized, so go and do it. ; LD HL,(BOTPAT) INC HL ; Start of interrupt service routine ; CALL ADDOF1 ; Add offset to code for relocation ; ; CALL PATINP ; Patch BIOS CONIN function ; ; CALL PATVEC ; Patch interrupt vector in BIOS and ; ; in FF80h-FF87h area. ; CALL PATCLK ; Patch clock BIOS jump into BIOS ; jump table ; CALL SETCTC ; Set up CTC for 10mSec interrupts ; ; ; Relocate interrupt code etc. above CP/M ; LD HL,BIOSJP ; Start of interrupt routine LD DE,(BOTPAT) ; in this file INC DE ; Patch start address LD BC,FINISH-BIOSJP+1 ; Length of code to be relocated LDIR ; Relocate patch code ; ; ; Routine to set RTC to desired time ; CLKCAL: LD HL,(BOTPAT) INC HL ; Start of interrupt service routine CALL ADDOF2 ; CALL SETCLK ; Set time ; ; RESTOR: POP AF ; POP BC ; Restore registers POP DE ; POP HL ; ; LD SP,(FRSTSP) ; Restore stack pointer ; EI ; Enable interrupts ; RET ; Initialization complete ; RETurn to CCP ; ; ; Subroutine to relocate addresses for time-setting routine. Needed ; whether time has been previously set or not. ; ; HL contains start address of RTC patch in high memory ; ADDOF2: LD DE,BIOSJP AND A SBC HL,DE EX DE,HL ; Offset in DE ; LD HL,(RLOC70+1) ;TENHR ADD HL,DE LD (RLOC70+1),HL LD (RLOC76+1),HL ; LD HL,(RLOC71+1) ;ONEHR ADD HL,DE LD (RLOC71+1),HL ; LD HL,(RLOC72+1) ;TENMIN ADD HL,DE LD (RLOC72+1),HL ; LD HL,(RLOC73+1) ;ONEMIN ADD HL,DE LD (RLOC73+1),HL ; LD HL,(RLOC74+1) ;TENSEC ADD HL,DE LD (RLOC74+1),HL ; LD HL,(RLOC75+1) ;ONESEC ADD HL,DE LD (RLOC75+1),HL ; RET ; ; ; Subroutine for inputting time from console ; SETCLK: LD DE,SETIME LD C,WRTCB CALL BDOS ; SET10H: LD E,0FFH LD C,DIRCON CALL BDOS OR A JR Z,SET10H ; CP 30h JP M,SET10H CP 33h JP P,SET10H RLOC70: LD (TENHR),A ; LD E,A LD C,CSLOUT CALL BDOS ; ; SET1H: LD E,0FFH LD C,DIRCON CALL BDOS OR A JR Z,SET1H ; CP BS JR Z,BAKSP1 CP 30h JP M,SET1H CP 3Ah JP P,SET1H LD B,A RLOC76: LD A,(TENHR) CP 32h JP M,LESS20 LD A,B CP 34h JP P,SET1H ; LESS20: LD A,B ; Hours less that 20 RLOC71: LD (ONEHR),A LD E,A LD C,CSLOUT CALL BDOS ; LD DE,COLON LD C,WRTCB CALL BDOS ; JR SET10M ; BAKSP1: LD E,BS LD C,CSLOUT CALL BDOS ; JR SET10H ; ; SET10M: LD E,0FFH LD C,DIRCON CALL BDOS OR A JR Z,SET10M ; CP BS JR Z,BAKSP2 CP 30h JP M,SET10M CP 36h JP P,SET10M ; RLOC72: LD (TENMIN),A LD E,A LD C,CSLOUT CALL BDOS ; JR SET1M ; BAKSP2: LD E,BS LD C,CSLOUT CALL BDOS ; LD E,BS LD C,CSLOUT CALL BDOS ; JP SET1H ; ; SET1M: LD E,0FFH LD C,DIRCON CALL BDOS OR A JR Z,SET1M ; CP BS JR Z,BAKSP3 CP 30h JP M,SET1M CP 3Ah JP P,SET1M ; RLOC73: LD (ONEMIN),A LD E,A LD C,CSLOUT CALL BDOS ; JR SETSCS ; BAKSP3: LD E,BS LD C,CSLOUT CALL BDOS ; JR SET10M ; ; SETSCS: LD A,30h ; Seconds always start at zero RLOC74: LD (TENSEC),A RLOC75: LD (ONESEC),A ; LD DE,TIMEOK LD C,WRTCB CALL BDOS ; ; ; Check whether desired time has been set ; CHKTIM: LD E,0FFH LD C,DIRCON CALL BDOS OR A JR Z,CHKTIM ; CP CR JR Z,TIMSET CP 'Y' JR Z,TIMSET CP 'y' JR Z,TIMSET CP 'N' JR Z,SETAGN CP 'n' JR Z,SETAGN JR CHKTIM ; ; ; Prepare to re-set time ; SETAGN: LD DE,BS31 LD C,WRTCB CALL BDOS JP SET10H ; TIMSET: LD DE,CLRSCR LD C,WRTCB CALL BDOS ; RET ; ; SETIME: DEFB CR,LF,LF,' ' DEFB 'Enter hours and minutes to start RTC',CR,LF DEFB LF DEFB ' ' DEFB '[HH:MM:00]',08h,08h,08h,08h,08h,08h,08h,08h,08h,'$' COLON: DEFB ':$' TIMEOK: DEFB ':00] Correct time set ? (Y/N)',08h,08h,08h,08h,'$' BS31: DEFB 08h,08h,08h,08h,08h,08h,08h,08h,08h,08h DEFB 08h,08h,08h,08h,08h,08h,08h,08h,08h,08h ; DEFB 20h,20h,20h,20h,20h,20h,20h,20h,20h,20h DEFB 20h,20h,20h,20h,20h,20h,20h,20h,20h,20h,20h,20h,20h,20h ; DEFB 08h,08h,08h,08h,08h,08h,08h,08h,08h,08h DEFB 08h,08h,08h,08h,08h,08h,08h,08h,08h,08h,08h,08h,08h,08h DEFB 08h,08h,08h,08h,08h,08h,08h,08h,08h,08h,08h,'$' ; CRLF: DEFB 0DH,0AH,'$' ; ; ; Subroutine to relocate patch code above CP/M ; ADDOF1: LD DE,BIOSJP AND A SBC HL,DE EX DE,HL ; Offset in DE ; ; LD HL,(BIOSCL+1) ;TIME1 ADD HL,DE LD (BIOSCL+1),HL ; LD HL,(RLOC52+1) ;TIME ADD HL,DE LD (RLOC52+1),HL ; LD HL,(RLOC01+2) ;CALLSP ADD HL,DE LD (RLOC01+2),HL LD (RLOC08+2),HL ; ; LD HL,(RLOC02+1) ;INTSTK ADD HL,DE LD (RLOC02+1),HL ; LD HL,(RLOC03+1) ;COUNT ADD HL,DE LD (RLOC03+1),HL LD (RLOC06+1),HL LD (NTZRO+1),HL ; ; LD HL,(UPDATE+1) ;ONESEC ADD HL,DE LD (UPDATE+1),HL LD (RLOC10+1),HL LD (RLOC12+1),HL ; LD HL,(RLOC13+1) ;TENSEC ADD HL,DE LD (RLOC13+1),HL LD (RLOC15+1),HL LD (RLOC17+1),HL ; LD HL,(RLOC18+1) ;ONEMIN ADD HL,DE LD (RLOC18+1),HL LD (RLOC20+1),HL LD (RLOC22+1),HL ; LD HL,(RLOC23+1) ;TENMIN ADD HL,DE LD (RLOC23+1),HL LD (RLOC25+1),HL LD (RLOC27+1),HL ; LD HL,(RLOC28+1) ;ONEHR ADD HL,DE LD (RLOC28+1),HL LD (RLOC31+1),HL LD (RLOC33+1),HL LD (RLOC39+1),HL ; LD HL,(RLOC34+1) ;TENHR ADD HL,DE LD (RLOC34+1),HL LD (RLOC35+1),HL LD (RLOC37+1),HL LD (RLOC40+1),HL ; LD HL,(RLOC42+1) ;TIMFLG ADD HL,DE LD (RLOC42+1),HL LD (RLOC45+1),HL LD (RLOC51+1),HL ; LD HL,(RLOC43+1) ;NXTMIN ADD HL,DE LD (RLOC43+1),HL ; LD HL,(RLOC48+1) ;DRVPRM ADD HL,DE LD (RLOC48+1),HL ; LD HL,(RLOC50+1) ;USRPRM ADD HL,DE LD (RLOC50+1),HL ; LD HL,(RLOC53+1) ;CMDLIN ADD HL,DE LD (RLOC53+1),HL ; ; LD HL,(RLOC97+1) ;BIOSCL ADD HL,DE LD (RLOC97+1),HL ; LD HL,(RLOC98+1) ;SRVCE ADD HL,DE LD (RLOC98+1),HL ; LD HL,(RLOC99+1) ;PATCH1 ADD HL,DE LD (RLOC99+1),HL ; ; LD A,(0002h) ; BIOS page patches LD (MVSTAT+2),A LD (MVOUT1+2),A LD (MVOUT2+2),A ; RET ; Code re-addressing completed ; ; ; PATINP: LD HL,(0001H) ; BIOS WMBOOT jump instruction LD L,0AH ; Offset of CONIN from WMBOOT LD E,(HL) ; lo address of CONIN routine INC HL ; hi address LD D,(HL) ; of CONIN routine EX DE,HL ; CONIN routine address in HL LD (HL),0C3H ; change start of CONIN to a JP INC HL ; get address to jump to RLOC99: LD BC,PATCH1 ; from CONIN to PATCH1 LD A,(HL) LD (PATCH2+1),A LD (HL),C ; patch in lo byte INC HL LD A,(HL) LD (PATCH2+2),A LD (HL),B ; patch in hi byte INC HL ; point to 2nd instruction in CONIN LD (RETJMP+1),HL ; patch in return jump from PATCH1 ; routine to 2nd instruction in ; CONIN routine ; RET ; ; ; Modify Interrupt Vector Table in BIOS ; PATVEC: LD HL,(0001H) ; BIOS Warm Boot jump (xx03h) LD DE,011CH ; Channel 2 IM2 interrupt vector is ; stored in BIOS at warm boot JP ; address + 011Ch ADD HL,DE RLOC98: LD DE,SRVCE LD (HL),E ; Patch address of interrupt service INC HL ; routine into interrupt vector, so LD (HL),D ; that RTC will survive a warm boot ; LD (CTC2),DE ; Modify interrupt vector table in RET ; high memory ; ; ; Subroutine to put address of new BIOS jump to read address of ; time string at the end of the BIOS jump table, in unecessary ; JP location used by Cold Boot. ; PATCLK: LD HL,(0001h) LD L,34h ; Offset of unused jump in BIOS LD E,(HL) LD D,H LD L,1 LD (HL),E INC HL LD (HL),D LD L,34h RLOC97: LD DE,BIOSCL ; Address of BIOS time CALL LD (HL),E INC HL LD (HL),D ; RET ; ; ; Subroutine to set up CTC Channel 2 to cause an interrupt every 10mSec ; SETCTC: LD HL,CTC2 ; Interrupt channel 2 LD A,H LD I,A IM 2 LD A,L OUT 80H,A ; LD A,CTCODE ; CTC Control Code OUT 82H,A ; Output to Channel 2 ; LD A,CTCTIM ; CTC Time constant OUT 82H,A ; Output to Channel 2 ; RET ; ; FRSTSP: DEFS 2 ; Local stack pointer DEFS 30H ; Space for local stack FSTSTK: ; ; ; ; The following code is relocated between CP/M and the high memory ; locations used by the Applicard. It contains the time string, the ; interrupt service routine, the additional BIOS call used to obtain ; the time string address, and patches for the BIOS CONIN routine. ; BIOSJP: JR SRVCE ; BIOSCL: LD HL,TIME1 ; A CALL to the BIOS time function RET ; returns address of time string in HL ; TIME: DEFB CR ; Time string TIME1: DEFB '[' ; TENHR: DEFB '0' ; ONEHR: DEFB '0' ; DEFB ':' ; TENMIN: DEFB '0' ; ONEMIN: DEFB '0' ; DEFB ':' ; TENSEC: DEFB '0' ; ONESEC DEFB '0' ; DEFB ']' ; Time string DEFB 20H DRVPRM: DEFB 20H ; Space for drive letter USRPRM: DEFB 20H ; Space for user number DEFB '>' DEFB 0 ; ; ; Interrupt sevice routine ; SRVCE: DI ; RLOC01: LD (CALLSP),SP ; save prior to interrupt stack pointer RLOC02: LD SP,INTSTK ; set local stack pointer ; PUSH AF ; Save registers PUSH BC ; for return PUSH DE ; from interrupt PUSH HL ; service ; RLOC03: LD HL,(COUNT) INC HL LD A,H CP 0 JR NZ,NTZRO LD A,L CP SFTIME ; Count to reach next second ; ; Note - for 6 MHz Applicard, clock period is 0.16667 microseconds ; CTC scale factor is 256, CTC time constant (CTCTIM) is 253 (0FCh) ; and this software counter triggers at 92 (5Ch). Total period is, ; therefore 0.16667 x 256 x 252 x 92 = (approx) 1 second. ; JR NZ,NTZRO LD HL,00 ; Reset software counter RLOC06: LD (COUNT),HL JR UPDATE ; Update clock each second NTZRO: LD (COUNT),HL ; NXTMIN: POP HL ; Restore registers POP DE ; before returning POP BC ; to code prior to POP AF ; interrupt RLOC08: LD SP,(CALLSP) ; Restore pre-interrupt stack pointer EI RETI ; ; ; Update time string entry each second ; UPDATE: LD A,(ONESEC) INC A CP 3AH JR Z,RST1S RLOC10: LD (ONESEC),A JR SETFLG ; RST1S: LD A,30H RLOC12: LD (ONESEC),A RLOC13: LD A,(TENSEC) INC A CP 36H JR Z,RST10S RLOC15: LD (TENSEC),A JR SETFLG ; RST10S: LD A,30H RLOC17: LD (TENSEC),A RLOC18: LD A,(ONEMIN) INC A CP 3AH JR Z,RST1M RLOC20: LD (ONEMIN),A JR SETFLG ; RST1M: LD A,30H RLOC22: LD (ONEMIN),A RLOC23: LD A,(TENMIN) INC A CP 36H JR Z,RST10M RLOC25: LD (TENMIN),A JR SETFLG ; RST10M LD A,30H RLOC27: LD (TENMIN),A RLOC28: LD A,(ONEHR) INC A LD B,A CP 3AH JR Z,RST1H CP 34H JR Z,MDNCHK ; NOTMDN: LD A,B RLOC31: LD (ONEHR),A JR SETFLG ; RST1H: LD A,30H RLOC33: LD (ONEHR),A RLOC34: LD A,(TENHR) INC A RLOC35: LD (TENHR),A JR SETFLG ; MDNCHK: RLOC37: LD A,(TENHR) CP 32H JR NZ,NOTMDN LD A,30H RLOC39: LD (ONEHR),A RLOC40 LD (TENHR),A JR SETFLG ; SETFLG: LD A,1 RLOC42: LD (TIMFLG),A ; Time flag notes clock updated RLOC43: JP NXTMIN ; ; ; Jump to this patch from the first instruction of the CONIN ; routine in the PCPICPM BIOS ; PATCH1: LD A,(CCPFLG) ; Do not relocate this address OR A JR Z,PATCH2 RLOC45: LD A,(TIMFLG) OR A JR NZ,PRNTIM MVSTAT: CALL 0006 ; CONSTAT, check for keyboard entry OR A JR Z,PATCH1 ; PATCH2: CALL 0000H ; Do the first instruction in CONIN RETJMP: JP 0000H ; JP to second instruction in CONIN ; ; ; Get current drive letter ; PRNTIM: LD A,(DRVUSR) ; DRVUSR not to be reloacated AND 0FH ADD A,'A' RLOC48: LD (DRVPRM),A ; ; ; Get current user number ; RLOC49: LD A,(DRVUSR) ; DRVUSR not to be relocated SRL A SRL A SRL A SRL A ADD A,'0' RLOC50: LD (USRPRM),A ; XOR A RLOC51: LD (TIMFLG),A ; Reset time flag ; RLOC52: LD HL,TIME ; Address of time string ; ; ; Loop to print time string and prompt on console ; PRLOOP: LD A,(HL) OR A RLOC53: JP Z,CMDLIN ; Do until 0 reached LD C,A PUSH HL MVOUT1: CALL 000Ch ; CONOUT, print time string on screen POP HL INC HL JR PRLOOP ; CMDLIN: POP HL POP DE POP BC ; Count of current number of PUSH BC ; characters three deep on ; BDOS stack in hi byte PUSH DE PUSH HL ; ; ; Locate address of CCP Command Line Buffer ; RLOC55: LD HL,(BDOS+1) LD DE,0800H AND A SBC HL,DE LD L,08H ; address of CCP command ; line in HL ; ; ; Loop to print CCP Command Line Buffer on console ; CMLOOP: LD A,B ; Count of # command line ; characters OR A ; Check for zero JR Z,MVSTAT LD A,(HL) ; Get command line character LD C,A PUSH HL PUSH BC MVOUT2: CALL 000Ch ; CONOUT, print character POP BC POP HL INC HL ; Next character address DEC B ; Character count JR CMLOOP ; COUNT: DEFB 0,0 TIMFLG: DEFB 0 CALLSP: DEFS 2 DEFS 30H INTSTK: FINISH: ; ; END