home *** CD-ROM | disk | FTP | other *** search
- TITLE 'MEMORY TEST PROGRAM - BYTE, DECEMBER 1982, pp 414-444'
- ;
- CR EQU 0DH ;CARRIAGE RETURN
- ESC EQU 1BH ;ESCAPE
- HCHAR EQU 0FH ;MASK FOR REMOVING UPPER NIBBLE
- LF EQU 0AH ;LINE FEED
- ;LNPAT EQU 9 ;PATTERN LENGTH - FOR NK*4 MEMORY COMPONENTS
- LNPAT EQU 17 ;PATTERN LENGTH - FOR NK*1 MEMORY COMPONENTS
- NZERO EQU 0FH ;NONZERO VALUE
- PRTYO EQU 7FH ;MASK TO CLEAR PARITY FROM CONSOLE INPUT
- CI EQU 0E003H ;CONSOLE INPUT ROUTINE
- CO EQU ANG ;OUTPUT ROUTINE
- CBOOT EQU 0E000H ;COLD BOOT ROUTINE
- ;
- .z80
- ld de,0f000h
- ld hl,begina
- ld bc,enda-begina
- ldir
- jp begin
- .8080
- begina:
-
- .PHASE 0F000H
- BEGIN:
- DI
- LXI SP,SPLOC
- XRA A
- STA ERFLG
- ;
- ; SET BANK
- ;
- .Z80
- LD A,0
- CALL BANK
- .8080
- LXI H,MESG0
- MVI B,MESL0
- CALL MSGL
- .Z80
- CALL CI
- SUB '0'
- JP C,CBOOT
- LD (BNK),A
- CALL CROUT
- .8080
- ;
- ; GET START ADDRESS
- ;
- MAIN1: LXI H,MESG1
- MVI B,MESL1
- CALL MSGL
- CALL GETHX
- JNC MAIN1
- MOV H,B
- MOV L,C
- SHLD MEMST
- ;
- ; GET END ADDRESS
- ;
- MAIN2: LXI H,MESG2
- MVI B,MESL2
- CALL MSGL
- CALL GETHX
- JNC MAIN2
- MOV H,B
- MOV L,C
- SHLD MEMND
-
- .Z80
- LD A,(BNK)
- CALL BANK
- .8080
- ;
- ; TEST FOR START ADDRESS > END ADDRESS AND COMPUTE
- ; THE NUMBER OF BYTES TO BE TESTED - THE FOLLOWING SUBTRACTION
- ; ROUTINE IS TAKEN FROM MILLER'S 'MASTERING CPM' P 125, AS THE
- ; ORIGINAL VERSION FAILS WHEN MEMST = 0.
- ;
- XCHG
- LHLD MEMST
- MOV A,E
- SUB L
- MOV L,A
- MOV A,D
- SBB H
- MOV H,A
- CMC
- JC MAIN3
- LXI H,MESG3
- MVI B,MESL3
- CALL MSGL
- CALL CROUT
- JMP MAIN1
- MAIN3: INX H
- SHLD NBYTE
- ;
- ; SET UP REGISTERS TO ESTABLISH THE BARBER-POLE PATTERN
- ;
- MVI A,LNPAT
- STA PATLN
- STA NCYCL
- LXI B,PATRN
- PUSH B
- MAIN4: LHLD NBYTE
- XCHG
- LHLD MEMST
- ;
- ; PUT THE BARBER-POLE PATTERN IN R/W MEMORY
- ;
- MAIN5: LDAX B
- MOV M,A
- INX B
- INX H
- DCX D
- MOV A,E
- ORA D
- JZ MAIN6
- LDA PATLN
- DCR A
- STA PATLN
- JNZ MAIN5
- POP B
- PUSH B
- MVI A,LNPAT
- STA PATLN
- JMP MAIN5
- ;
- ; SET UP REGISTERS TO TEST BARBER-POLE PATTERN
- ;
- MAIN6: POP B
- PUSH B
- MVI A,LNPAT
- STA PATLN
- LHLD NBYTE
- XCHG
- LHLD MEMST
- ;
- ; TEST BARBER-POLE PATTERN
- ;
- MAIN7: LDAX B
- CMP M
- CNZ ERROR
- INX B
- INX H
- DCX D
- MOV A,E
- ORA D
- JZ MAIN8
- LDA PATLN
- DCR A
- STA PATLN
- JNZ MAIN7
- POP B
- PUSH B
- MVI A,LNPAT
- STA PATLN
- JMP MAIN7
- ;
- ; SHIFT THE BARBER-POLE PATTERN BY ONE AND TEST FOR LAST SHIFT
- ;
- MAIN8: POP B
- INX B
- PUSH B
- MVI A,LNPAT
- STA PATLN
- LDA NCYCL
- DCR A
- STA NCYCL
- JNZ MAIN4
- ;
- ; TEST COMPLETED - OUTPUT MESSAGE
- ;
- LDA ERFLG
- ORA A
- JNZ MAIN9
- LXI H,MESG7
- MVI B,MESL7
- CALL MSGL
- CALL CROUT
- JMP BEGIN
- MAIN9: LXI H,MESG8
- MVI B,MESL8
- CALL MSGL
- CALL CROUT
- JMP BEGIN
-
- ;
- ;......................................................................
- ;
- ; CONVERT HEXADECIMAL TO BINARY
- ;
- CNVBN: MOV A,C
- SUI '0'
- CPI 10
- RM
- SUI 7
- RET
- ;
- ;......................................................................
- ;
- ; OUTPUT CR/LF
- ;
- CROUT: MVI C,CR
- CALL ECHO
- RET
- ;
- ;......................................................................
- ;
- ; ECHO CHARACTER TO TERMINAL
- ;
- ECHO: MOV B,C
- MVI A,ESC
- CMP B
- JNZ ECHO5
- MVI C,'$'
- ECHO5: CALL CO
- MVI A,CR
- CMP B
- JNZ ECH10
- MVI C,LF
- CALL CO
- ECH10: MOV C,B
- RET
- ;
- ;......................................................................
- ;
- ; ERROR MESSAGE AND LOCATION OF BAD CELL
- ;
- ERROR: PUSH PSW
- PUSH D
- PUSH H
- PUSH B
- XCHG
- LXI H,MESG4
- MVI B,MESL4
- CALL MSGL
- MOV A,D
- CALL NMOUT
- MOV A,E
- CALL NMOUT
- LXI H,MESG5
- MVI B,MESL5
- CALL MSGL
- POP B
- PUSH B
- LDAX B
- CALL NMOUT
- LXI H,MESG6
- MVI B,MESL6
- CALL MSGL
- XCHG
- MOV A,M
- CALL NMOUT
- CALL CROUT
- MVI A,NZERO
- STA ERFLG
- POP B
- POP H
- POP D
- POP PSW
- RET
- ;
- ;......................................................................
- ;
- ; SET CARRY TO FALSE
- ;
- FRET: STC
- CMC
- RET
- ;
- ;......................................................................
- ;
- ; GET CHARACTER FROM CONSOLE - CLEAR PARITY
- ;
- GETCH: CALL CI
- ANI PRTYO
- MOV C,A
- RET
- ;
- ;......................................................................
- ;
- ; READ 16 BIT BINARY DIGIT FROM CONSOLE - ENTERED AS HEX.
- ;
- GETHX: PUSH H
- LXI H,0
- MVI E,0
- GHX05: CALL GETCH
- CALL ECHO
- MOV A,C
- CPI CR
- JNZ GHX10
- PUSH H
- POP B
- POP H
- MOV A,E
- ORA A
- JNZ SRET
- JZ FRET
- GHX10: CALL VALDG
- JNC GHX15
- CALL CNVBN
- MVI E,0FFH
- DAD H
- DAD H
- DAD H
- DAD H
- MVI B,0
- MOV C,A
- DAD B
- JMP GHX05
- GHX15: CALL CROUT
- POP H
- JMP FRET
- ;
- ;......................................................................
- ;
- ; OUTPUT A MESSAGE
- MSGL: MOV C,M
- CALL CO
- INX H
- DCR B
- JNZ MSGL
- RET
- ;
- ;......................................................................
- ;
- ; OUTPUT AN 8 BIT INTEGER
- ;
- NMOUT: PUSH PSW
- RRC
- RRC
- RRC
- RRC
- CALL PRVAL
- CALL ECHO
- POP PSW
- CALL PRVAL
- CALL ECHO
- RET
- ;
- ;......................................................................
- ;
- ; CONVERT NIBBLE TO HEX REPRESENTATION
- ;
- PRVAL: ANI HCHAR
- ADI 90H
- DAA
- ACI 40H
- DAA
- MOV C,A
- RET
- ;
- ;......................................................................
- ;
- ; SET CARRY TO TRUE
- ;
- SRET: STC
- RET
- ;
- ;......................................................................
- ;
- ; CHECK VALIDITY OF ASCII CHAR FOR REPRESENTING HEX.
- ;
- VALDG: MOV A,C
- CPI '0'
- JM FRET
- CPI '9'
- JM SRET
- JZ SRET
- CPI 'A'
- JM FRET
- CPI 'G'
- JP FRET
- JMP SRET
- ;
- ;......................................................................
- ;
- ; CONSOLE OUTPUT ROUTINE - WILL NEED TO BE MODIFIED FOR ANOTHER MACHINE
- ;
- ANG: IN 0E1H
- ANI 1
- JNZ ANG
- MOV A,C
- OUT 0E0H
- RET
- ;
- ;......................................................................
- ;
- ; BANK SELECT
- ;
- .z80
- bank:
- out (0feh),a ; switch board
- and a ; to get flags
- ld a,0 ; clear a
- jr nz,zero ; disk contr on for bank zero
- inc a ; set a to 1
- zero: out (40h),a ; switch disk controller
- ret
- .8080
- ;
- ;......................................................................
- ;
- ;BARBER-POLE REPRESENTATION
- ;
- ;PATRN: DB 00H,11H,22H,44H,88H,0EEH,0DDH,0BBH,77H
- ; DB 00H,11H,22H,44H,88H,0EEH,0DDH,0BBH,77H
- PATRN: DB 00H,01H,02H,04H,08H,10H,20H,40H,80H
- DB 0FEH,0FDH,0FBH,0F7H,0EFH,0DFH,0BFH,7FH
- DB 00H,01H,02H,04H,08H,10H,20H,40H,80H
- DB 0FEH,0FDH,0FBH,0F7H,0EFH,0DFH,0BFH,7FH
- ;
- ;......................................................................
- ;
- ; MESSAGES
- ;
- MESG0: DB 'ENTER BANK (0,1,2) '
- MESL0 EQU $-MESG0
- MESG1: DB 'ENTER ADDRESS OF MEMORY START IN HEX '
- MESL1 EQU $-MESG1
- MESG2: DB 'ENTER ADDRESS OF MEMORY END IN HEX '
- MESL2 EQU $-MESG2
- MESG3: DB 'ERROR: MEMORY START ADDRESS > MEMORY END ADDRESS'
- MESL3 EQU $-MESG3
- MESG4: DB 'MEMORY ERROR AT '
- MESL4 EQU $-MESG4
- MESG5: DB ' HEX EXPECTED '
- MESL5 EQU $-MESG5
- MESG6: DB ' FOUND '
- MESL6 EQU $-MESG6
- MESG7: DB 'SUCCESSFUL TEST'
- MESL7 EQU $-MESG7
- MESG8: DB 'UNSUCCESSFUL TEST'
- MESL8 EQU $-MESG8
- ;
- ;......................................................................
- ;
- ; WORK-SPACE
- ;
- ERFLG: DS 1
- MEMND: DS 2
- MEMST: DS 2
- NBYTE: DS 2
- NCYCL: DS 1
- PATLN: DS 1
- BNK: DS 1
- STACK: DS 16 ;STACK
- SPLOC EQU $ ;STACK POINTER
-
- .DEPHASE
- enda:
-
- END 100H
-
-