; ; PROGRAM: FINDERR ; AUTHOR: TED H. EMIGH ; VERSION: 1.1 ; DATE: 17 SEPT 84 ; PREVIOUS VERSIONS: 1.0 (11 Sep 84), 0.1, 7 SEPT 84 ; VERSION EQU 11 EXTENV EQU 1 ; 1 for External Environ, 0 for Internal Environ ; ; FINDERR is a program to set the ZCPR3 message registers if various ; memory locations are nonzero ; ; ZCPR3 Header ; MACLIB Z3BASE.LIB ; ; These are part of the built-in Help message. They indicate what ; registers are affected by this version of FINDERR ; regmsg macro db 0dh,0ah,' 0 - M80 Ver 3.44' db 0dh,0ah,' 1 - F80' endm ; ; These Locations Assume the use of M80/F80, Version 3.44 ; m80f equ 03cedh ;location of number of fatal errors (M80) m80fb equ 2 ;--16 bits (2 bytes) m80w equ 03cefh ;location of number of warning errors (M80) m80wb equ 2 ;--16 bits (2 bytes) f80f equ 01c1h ;location of number of fatal errors (F80) f80fb equ 2 ;--16 bits (2 bytes) f80w equ 02adh ;location of number of warning errors (F80) f80wb equ 2 ;--16 bits (2 bytes) ; ; System Equates ; Add the location of the error indicator, and the number of byte ; for the indicator for each indicator desired. If the number of ; bytes is zero, that particular memory location is ignored. ; fatal0 equ m80f ;location of number of fatal errors bytesf0 equ m80fb ;number of bytes warn0 equ m80w ;location of number of warning errors bytesw0 equ m80wb ;number of bytes fnderr0 equ bytesf0 or bytesw0 ;register 0 used for these errors fatal1 equ f80f ;location of number of fatal errors bytesf1 equ f80fb ;number of bytes warn1 equ f80w ;location of number of warning errors bytesw1 equ f80wb ;number of bytes fnderr1 equ bytesf1 or bytesw1 ;register 1 used for these errors ; ; The rest of the registers are not used at this time ; (if bytes = 0, then the memory address is not checked) ; fatal2 equ 0 ;location of number of fatal errors bytesf2 equ 0 ;number of bytes warn2 equ 0 ;location of number of warning errors bytesw2 equ 0 ;number of bytes fnderr2 equ bytesf2 or bytesw2 ;register 2 used for these errors ; fatal3 equ 0 ;location of number of fatal errors bytesf3 equ 0 ;number of bytes warn3 equ 0 ;location of number of warning errors bytesw3 equ 0 ;number of bytes fnderr3 equ bytesf3 or bytesw3 ;register 3 used for these errors ; fatal4 equ 0 ;location of number of fatal errors bytesf4 equ 0 ;number of bytes warn4 equ 0 ;location of number of warning errors bytesw4 equ 0 ;number of bytes fnderr4 equ bytesf4 or bytesw4 ;register 4 used for these errors ; fatal5 equ 0 ;location of number of fatal errors bytesf5 equ 0 ;number of bytes warn5 equ 0 ;location of number of warning errors bytesw5 equ 0 ;number of bytes fnderr5 equ bytesf5 or bytesw5 ;register 5 used for these errors ; fatal6 equ 0 ;location of number of fatal errors bytesf6 equ 0 ;number of bytes warn6 equ 0 ;location of number of warning errors bytesw6 equ 0 ;number of bytes fnderr6 equ bytesf6 or bytesw6 ;register 6 used for these errors ; fatal7 equ 0 ;location of number of fatal errors bytesf7 equ 0 ;number of bytes warn7 equ 0 ;location of number of warning errors bytesw7 equ 0 ;number of bytes fnderr7 equ bytesf7 or bytesw7 ;register 7 used for these errors ; fatal8 equ 0 ;location of number of fatal errors bytesf8 equ 0 ;number of bytes warn8 equ 0 ;location of number of warning errors bytesw8 equ 0 ;number of bytes fnderr8 equ bytesf8 or bytesw8 ;register 8 used for these errors ; fatal9 equ 0 ;location of number of fatal errors bytesf9 equ 0 ;number of bytes warn9 equ 0 ;location of number of warning errors bytesw9 equ 0 ;number of bytes fnderr9 equ bytesf9 or bytesw9 ;register 9 used for these errors ; ; System Buffers and Entries ; fcb equ 5ch bdos equ 5 ; ; ; MACROS TO PROVIDE Z80 EXTENSIONS ; MACROS INCLUDE: ; ; jrnz - Jump Relative if No Zero ; djnz - Decrement B and Jump Relative if No Zero ; ; @gendd Macro used for Checking and Generating ; 8-Bit Jump Relative Displacements ; @gendd macro ?dd ;;Used for checking range of 8-bit displacements if2 ;;M80 if (?dd gt 7FH) and (?dd lt 0FF80H) db 100H,?dd ;Displacement Range Error else db ?dd endif ;;Range Error else ;;M80 db ?dd ;;M80 endif ;;M80 endm ; ; ; Z80 MACRO EXTENSIONS ; jrnz macro ?n ;;Jump Relative on No Zero if i8080 ;;8080/8085 jnz ?n else ;;Z80 db 20H @gendd ?n-$-1 endif ;;I8080 endm ; djnz macro ?n ;;Decrement B and Jump Relative on No Zero if i8080 ;;8080/8085 dcr B jnz ?n else ;;Z80 db 10H @gendd ?n-$-1 endif ;;I8080 endm ; ; Macros to do most of the work ; ; SETBYT will set B register to 'value' if the any of the bytes ; at location 'loc' to 'loc'+'bytes'-1 are nonzero ; ('bytes' is the number of bytes to check) ; If no error, then B=0. errno is the error number ; setbyt macro loc,bytes,errno,value local nxtbyt if bytes ne 0 ;; if bytes eq 1 lda loc ;;get byte ora a ;;see if zero endif ;;bytes eq 1 if bytes eq 2 lxi h,loc mov a,m ;;get lower byte inx h ;;point to higher byte ora m ;;see if 16 bit number is zero endif ;;bytes eq 2 if bytes gt 2 lxi h,loc mov a,m ;;get first byte mvi b,bytes-1 ;;number of bytes nxtbyt: inx h ;;point to next byte ora m ;;see if number is zero djnz nxtbyt ;;more bytes? if i8080 ora a ;;set flags for a again endif ;;I8080 endif ;;bytes gt 2 mvi b,value jrnz err&errno ;; endif ;;bytes ne 0 endm ; ; SETBYT will set register number errno to the value in ; B if entered at err&errno, else it will reset the value ; at register number errno. This routine MUST follow the ; last setbyt for that error number. ; finish macro errno mvi b,0 ;;set for zero err&errno: lxi h,30h+errno ;;point to register number dad d mov m,b ;;save the error code ; endm ; ; Environments ; origin: ; if extenv ; if external environment ... ; ; External Environment Definition ; jmp finderr db 'Z3ENV' ; this is an environment db 1 ; class 1 environment (external) envloc: dw z3env ; ptr to environment finderr: lhld envloc ; HL pts to environment else ; if internal environment ... ; ; Internal Environment Definition ; envloc: jmp finderr db 'Z3ENV' ; this is an environment MACLIB SYSENV.LIB SYSENV ; define environment finderr: lxi h,envloc ; HL pts to environment endif ; ; Beginning of FINDERR ; lda fcb+1 ;check for help request cpi '/' jz help lxi d,34 ;message address offset in environment dad d ;point to location of message address mov a,m ;get message address inx h mov h,m mov l,a ;HL now points to the message buffer ora h ;see if message buffers supported rz ;messages not supported, abort xchg ;save pointer to message buffer irp errno,<0,1,2,3,4,5,6,7,8,9> if fnderr&errno setbyt fatal&errno,bytesf&errno,errno,1 setbyt warn&errno,bytesw&errno,errno,2 finish errno endif endm ; ret ; ; Help Message ; help: lxi d,helpmsg mvi c,9 ;use BDOS print jmp bdos helpmsg: db 'FINDERR ' db (version/10)+'0','.',(version mod 10)+'0' db 0dh,0ah,'Regs --' regmsg db '$' end