;FEBRUARY 23, 1986 MONITOR ROUTINE BDOS EQU 05 .Z80 ustart:; ld sp,monstk LD DE,USTART PUSH DE CALL UCRLF LD C,':' CALL ucout1 USTAR0: CALL UTI ;ECHO THE CONSOLE OR A JR Z,USTAR0 CP 'z'+1 JP NC,UERROR LD C,002H CP 'D' JR Z,udisp cp 'd' jr nz,ufill ; ; DISPLAY MEMORY XXXX TO XXXX ; ; UDISP: CALL UEXLF ;POP DE AND HL AND PRINT A CR AND AN LF UDI0: push hl CALL UCRLF ;PRINT A CR AND AN LF CALL ULADR ;CONVERT HL REGISTER TO ASCII DIGITS AND PRINT ; LD B,010H ;DO A LINE OF (16d) BYTES UDI1: CALL UBLK ;PRINT A SPACE CHARACTER ld a,l ;low byte of memory pointer and 7 ;low nybble of memory pointer call z,ublk ;insert extra space if 8 bytes printed cp 4 ;insert space if 4 or 12 bytes printed call z,ublk LD A,(HL) CALL ULBYTE ;CONVERT THE A REGISTER TO ASCII AND PRINT inc hl ld a,l and 0fh jr nz,udi1 ; DJNZ UDI1 ;*this routine to print ascii characters taken from du.com (thanks ward.) ;* DE=END .8080 POP H ;GET START ADDR call sep2 ;seperate the ascii printing from the hex digits DUMPAS: mvi c,'*' ;CALL ASTER call ucout1 DCHR: mov a,l ;low byte of memory pointer ani 0fh jz dchr1 ani 7 ;low nybble of memory pointer cz ublk ;insert extra space if 8 bytes printed cpi 4 ;insert space if 4 or 12 bytes printed cz ublk dchr1: MOV A,M CPI ' ' JC DPER ;IF LESS THAN A SPACE (I.E. NONPRINTING CHARACTER) CPI 7FH mov c,a JC DOK ;IF A PRINTING CHARACTER DPER: MVI c,'.' DOK: CALL ucout1 ;TYPE ; MOV A,E ; CMP L ; JZ DEND INX H MOV A,L ANI 0FH JNZ DCHR ;if not done dcx h DEND: mvi c,'*' ;CALL ASTER call ucout1 ;** end of stolen routine ** .Z80 CALL UHILOX ;SEE IF FINISHED JR UDI0 ; ; ; ; FILL MEMORY XXXX TO XXXX WITH XX ; ; ; UFILL: CP 'F' JR z,ufill0 cp 'f' jr nz,ugoto ufill0: CALL UEXPR3 UFI0: LD (HL),C CALL UHILO JR NC,UFI0 POP DE JP USTART ; ; ; GOTO (EXECUTE) XXXX ; ; UGOTO: CP 'G' JR Z,ugoto0 cp 'g' jr nz,umtest ugoto0: CALL UEXPR1 CALL UCRLF POP HL JP (HL) ; ; ; TEST MEMORY XXXX TO XXXX ; ; UMTEST: CP 'T' JR Z,ut10 cp 't' jr nz,umove ut10: CALL UEXLF UT1: LD A,(HL) LD B,A CPL LD (HL),A XOR (HL) JR Z,UT2 PUSH DE LD E,A CALL UHLSP CALL UQI1 CALL UCRLF POP DE UT2: LD (HL),B CALL UHILOX JR UT1 ; ; ; MOVE DATA FROM XXXX TO XXXX ; ; UMOVE: CP 'M' JR Z,umvo0 cp 'm' jr nz,usubs umvo0: CALL UEXPR3 UMV0: LD A,(HL) LD (BC),A INC BC CALL UHILOX JR UMV0 USTORE: LD (IX+00H),A INC IX DEC E RET ; ; ; EXAMINE AND/OR REPLACE MEMORY DATA ; ; USUBS: CP 'S' JP Z,usuo0 cp 's' jp nz,uhexn usuo0: CALL UEXPR1 CALL UQCHK JP C,UERROR POP HL USU0: LD A,(HL) CALL ULBYTE LD C,02DH CALL UCOPCK RET C JR Z,USU1 PUSH HL LD HL,0 LD C,001H CALL UEX1 POP DE POP HL LD (HL),E LD A,B CP 00DH RET Z USU1: INC HL CALL UCRLF PUSH HL CALL ULADR CALL UBLK POP HL JR USU0 ; ; UEXLF: CALL UEXPR POP DE POP HL ; CR/LF OUTPUT ; ; UCRLF: PUSH HL PUSH BC LD C,0DH CALL ucout1 LD C,0AH CALL ucout1 POP BC POP HL CALL UCSTS OR A RET Z ; ; CHECK FOR CONTROL CHARACTER ; ; UCCHK: CALL ucon1 AND 07FH CP 013H ;CONTROL-S JR Z,UCCHK CP 003H ;CONTROL-C RET NZ UERROR: CALL UMEMSIZ LD DE,UERROR PUSH DE LD C,'?' CALL ucout1 JP USTART UHLSP: CALL ULADR ; ; PRINT SPACE CHARACTER ; sep2: call ublk ;entry point to print 2 spaces UBLK: LD C,020H ;print one space ;******************************************************** ;* * ;* Console I/O routines for the Wunderbus I/O. These * ;* routines assume that the uart divisor latch has * ;* previously set (either on power up or in routine * ;* executed before a trap to this routine occurred. * ;* The character to output should be in the 'C' reg- * ;* ister, the character received is returned in the * ;* 'A' register. UCSTS returns with zero flag set * ;* when no character is waiting in the UART buffer, * ;* or with A = FFh if a character is waiting. * ;* * ;******************************************************** ucout1: ;call uconinit ucout2: ;in a,(lsr) ;get uart status ; and thre ; jr z,ucout2 ;loop until tbe ; ld a,c ; out (thr),a ;output the data to uart PUSH BC ;PRESERVE THE CHARACTER IN C PUSH AF PUSH DE PUSH HL LD E,C ;CHARACTER TO BE OUTPUT GOES IN E LD C,06 ;BDOS DIRECT CONSOLE I/O CALL BDOS POP HL POP DE POP AF POP BC ret ucon1: ;call uconinit ucon2: ;in a,(lsr) ;get uart status ; and dr ; jr z,ucon2 ;wait until receive data available ; in a,(rbr) ;read the uart data register ; and 07fh ;strip parity PUSH BC PUSH DE PUSH HL UCONLP: LD E,0FFh ;TELL BDOS THIS IS CHARACTER INPUT LD C,06 ;BDOS DIRECT CONSOLE I/O CALL BDOS CP 0 ;IĆ BDOS RETURNS 0, NO CHARACTER READY JP Z,UCONLP ;LOOP UNTIL CHARACTER IS RETURNED POP HL POP DE POP BC ret ucsts: ;call uconinit ; in a,(lsr) ;read uart status ; and dr PUSH BC PUSH DE PUSH HL LD C,0Bh ;BDOS GET CONSOLE STATUS CALL BDOS POP HL POP DE POP BC CP 0 ret z ;return zero set if no character ld a,0ffh ret ;return a = ffh if character waiting ;uconinit: ; ld a,group1 ; out (grpctl),a ;set up for UART 1 ; ld a,wls0+wls1+stb ; out (lcr),a ;8 bit word, 2 bit stop bits ; ret ; CONVERT HEX TO ASCII UCONV: AND 00fh ADD A,090H DAA ADC A,040H DAA LD C,A RET ; ; GET PARAMETERS 1,2,OR 3 ; UEXPR3: INC C CALL UEXPR CALL UCRLF POP BC POP DE POP HL RET UEXPR1: LD C,001H UEXPR: LD HL,0 UEX0: CALL UTI UEX1: LD B,A CALL UNIBBLE JR C,UEX2 ADD HL,HL ADD HL,HL ADD HL,HL ADD HL,HL OR L LD L,A JR UEX0 UEX2: EX (SP),HL PUSH HL LD A,B CALL UQCHK JR NC,UEX3 DEC C RET Z UEX3: JP NZ,UERROR DEC C JR NZ,UEXPR RET ;************************************************************************* ;* * ;* ??? SEE IF SECOND PARAMETER EXCEEDS THE COUNT ??? * ;* * ;************************************************************************* UHILOX: CALL UHILO RET NC POP DE ;GET ADDR TO RETURN TO(E.G. WHEN DUMP FINISHED) RET UHILO: INC HL LD A,H OR L SCF RET Z LD A,E SUB L LD A,D SBC A,H RET ; ; HEXADECIMAL ARITHMETIC ; UHEXN: CP 'H' JR Z,uhexd cp 'h' jr nz,uport uhexd: CALL UEXLF PUSH HL ADD HL,DE CALL UHLSP POP HL OR A SBC HL,DE ; ; CONVERT HL REGISTER TO ASCII ; ULADR: LD A,H CALL ULBYTE LD A,L ; ; CONVERT A REGISTER TO ASCII ; ULBYTE: PUSH AF RRCA RRCA RRCA RRCA CALL UDBLC POP AF UDBLC: CALL UCONV JP ucout1 ;checked UMEMSIZ: RET UNIBBLE: cp 'a' ;is it less than lower case 'a'? jr c,unibok ;take jump if so cp 'z'+1 ;less than a lower case 'z'? ccf ;set carry and return if > 'z' ret c sub ' ' ;convert to upper case unibok: SUB 030H RET C cp 017h ccf RET C CP 00AH CCF RET NC SUB 007H CP 00AH RET UCOPCK: CALL ucout1 UPCHK: CALL UTI ; ; CHARACTER CHECK ; UQCHK: CP 020H RET Z CP 02CH RET Z CP 00DH SCF RET Z CCF RET ; ; ECHO CONSOLE ; UTI: CALL ucon1 INC A RET Z DEC A AND 07FH RET Z CP 000H RET Z CP 04EH RET Z CP 06EH RET Z PUSH BC LD C,A CALL ucout1 LD A,C POP BC RET ; ; READ/WRITE TO I/O PORT ; UPORT: CP 'O' JR Z,UQOUT CP 'o' jr z,uqout CP 'I' JR Z,uin cp 'i' jr z,uin JR UVERIFY UIN: CALL UEXPR1 LD C,0AH CALL ucout1 POP BC UQ0: IN E,(C) UQI1: LD B,008H CALL UBLK UQI2: SLA E LD A,018H ADC A,A LD C,A CALL ucout1 DJNZ UQI2 RET UQOUT: CALL UEXPR POP DE POP BC OUT (C),E RET ; ; ; ; ; VERIFY MEMORY XXXX TO XXXX WITH XXXX ; UVERIFY: CP 'V' JR Z,uver0 cp 'v' jP nz,UERROR ;uretrn<<<<<<<<<<<<<<<<<<<<<<<<<<< uver0: call uexpr3 UVERIO: LD A,(BC) CP (HL) JR Z,U..B PUSH BC CALL UCERR POP BC U..B: INC BC CALL UHILOX JR UVERIO ; MEMORY MISMATCH PRINTOUT ; UCERR: LD B,A CALL UHLSP LD A,(HL) CALL ULBYTE CALL UBLK LD A,B CALL ULBYTE JP UCRLF END