Files
SharpMZ_MiSTer/asm/tapecheck.asm
2018-09-28 17:04:36 +01:00

1115 lines
32 KiB
NASM

KEYPA: EQU 0E000h
KEYPB: EQU 0E001h
KEYPC: EQU 0E002h
KEYPF: EQU 0E003h
CSTR: EQU 0E002h
CSTPT: EQU 0E003h
CONT0: EQU 0E004h
CONT1: EQU 0E005h
CONT2: EQU 0E006h
CONTF: EQU 0E007h
SUNDG: EQU 0E008h
TEMP: EQU 0E008h
LETNL: EQU 0006h
NL: EQU 0009h
PRNTS: EQU 000Ch
PRNT: EQU 0012h
MSG: EQU 0015h
MSGX: EQU 0018h
MONIT: EQU 0086h
ST1: EQU 0095h
PRTHL: EQU 03BAh
PRTHX: EQU 03C3h
DPCT: EQU 0DDCh
?BRK: EQU 0D11h
?RSTR1: EQU 0EE6h
TPSTART: EQU 10F0h
MSTART: EQU 0C000h
ORG TPSTART
SPV:
IBUFE: ; TAPE BUFFER (128 BYTES)
;ATRB: DS virtual 1 ; ATTRIBUTE
ATRB: DB 01h ; Code Type, 01 = Machine Code.
;NAME: DS virtual 17 ; FILE NAME
NAME: DB "TAPE CHECK V1.0", 0Dh, 00h ; Title/Name (17 bytes).
;SIZE: DS virtual 2 ; BYTESIZE
SIZE: DW MEND - MSTART ; Size of program.
;DTADR: DS virtual 2 ; DATA ADDRESS
DTADR: DW MSTART ; Load address of program.
;EXADR: DS virtual 2 ; EXECUTION ADDRESS
EXADR: DW MSTART ; Exec address of program.
COMNT: DS 104 ; COMMENT
KANAF: DS virtual 1 ; KANA FLAG (01=GRAPHIC MODE)
DSPXY: DS virtual 2 ; DISPLAY COORDINATES
MANG: DS virtual 27 ; COLUMN MANAGEMENT
FLASH: DS virtual 1 ; FLASHING DATA
FLPST: DS virtual 2 ; FLASHING POSITION
FLSST: DS virtual 1 ; FLASHING STATUS
FLSDT: DS virtual 1 ; CURSOR DATA
STRGF: DS virtual 1 ; STRING FLAG
DPRNT: DS virtual 1 ; TAB COUNTER
TMCNT: DS virtual 2 ; TAPE MARK COUNTER
SUMDT: DS virtual 2 ; CHECK SUM DATA
CSMDT: DS virtual 2 ; FOR COMPARE SUM DATA
AMPM: DS virtual 1 ; AMPM DATA
TIMFG: DS virtual 1 ; TIME FLAG
SWRK: DS virtual 1 ; KEY SOUND FLAG
TEMPW: DS virtual 1 ; TEMPO WORK
ONTYO: DS virtual 1 ; ONTYO WORK
OCTV: DS virtual 1 ; OCTAVE WORK
RATIO: DS virtual 2 ; ONPU RATIO
BUFER: DS virtual 81 ; GET LINE BUFFER
ORG MSTART
ENTRYLOAD: JP START
ENTRYSAVE: JP SAVE
START: LD DE,TITLE
CALL MSG
CALL LETNL
CALL NL
CALL NL
LD HL,1200h
LD BC,0A000h
CLEAR1: LD A,00h
LD (HL),A
INC HL
DEC BC
LD A,B
OR C
JP NZ,CLEAR1
CALL LOAD
JP ST1
;
; LOAD COMMAND
;
LOAD: CALL ?RDI
JP C,?ER
LOA0: CALL NL
LD DE,MSG_LOADFROM
CALL MSG
LD HL,(DTADR)
CALL PRTHL
CALL NL
LD DE,MSG_LOADEXEC
CALL MSG
LD HL,(EXADR)
CALL PRTHL
CALL NL
LD DE,MSG_LOADSIZE
CALL MSG
LD HL,(SIZE)
CALL PRTHL
CALL NL
LD DE,MSG_LOADFILE
CALL MSGX
LD DE,NAME
CALL MSGX
CALL NL
CALL ?RDD
JP C,?ER
LD HL,(EXADR)
LD A,H
CP 12h
JP C,ST1
JP (HL)
; SAVE COMMAND
SAVE: CALL NL
LD DE,MSG_SAVEFROM
CALL MSG
LD HL,(DTADR)
CALL PRTHL
CALL NL
LD DE,MSG_SAVEEXEC
CALL MSG
LD HL,(EXADR)
CALL PRTHL
CALL NL
LD DE,MSG_SAVESIZE
CALL MSG
LD HL,(SIZE)
CALL PRTHL
CALL NL
LD DE,MSG_SAVEFILE
CALL MSGX
LD DE,NAME
CALL MSGX
CALL NL
LD A,01H ; ATTRIBUTE: OBJECT CODE
LD (ATRB),A
CALL QWRI
JP C,QER ; WRITE ERROR
CALL QWRD ; DATA
JP C,QER
CALL NL
LD DE,MSGOK ; OK MESSAGE
CALL MSGX ; CALL MSGX
JP ST1
;
; ERROR (LOADING)
;
QER: CP 02h
JP Z,ST1
LD DE,MSG_ERRWRITE
CALL MSG
JP ST1
;
; ERROR (LOADING)
;
?ER: CP 02h
JP Z,ST1
LD DE,MSG_ERRCHKSUM
CALL MSG
JP ST1
;
; READ INFORMATION
;
; EXIT ACC = 0 : OK CF=0
; = 1 : ER CF=1
; = 2 : BREAK CF=1
;
?RDI: DI
PUSH DE
PUSH BC
PUSH HL
LD D,0D2h
LD E,0CCh
LD BC,80h
LD HL,IBUFE
RD1: CALL MOTOR
JP C,RTP6
CALL TMARK
JP C,RTP6
; CALL PRTHL
CALL RTAPE
POP HL
POP BC
POP DE
;CALL MSTOP
PUSH AF
LD A,(TIMFG)
CP 0F0h
JR NZ,RD2
EI
RD2: POP AF
RET
;
; READ DATA
;
?RDD: DI
PUSH DE
PUSH BC
PUSH HL
LD D,0D2h
LD E,53h
LD BC,(SIZE)
LD HL,(DTADR)
LD A,B
OR C
JP Z,RDD1
JR RD1
RDD1: POP HL
POP BC
POP DE
;CALL MSTOP
PUSH AF
LD A,(TIMFG)
CP 0F0h
JR NZ,RDD2
EI
RDD2: POP AF
RET
;
; READ TAPE
;
RTAPE: ;PUSH BC
;PUSH DE
;LD DE,MSG_READTAPE
;CALL MSG
;CALL NL
;POP DE
;POP BC
PUSH DE
PUSH BC
PUSH HL
LD H,2
RTP1: LD BC,KEYPB
LD DE,CSTR
RTP2: CALL EDGE
JP C,RTP6
CALL DLY3
LD A,(DE)
AND 20h
JP Z,RTP2
LD D,H
LD HL,0
LD (SUMDT),HL
POP HL
POP BC
PUSH BC
PUSH HL
RTP3: CALL RBYTE
JP C,RTP6
LD (HL),A
INC HL
DEC BC
LD A,B
OR C
JP NZ,RTP3
LD HL,(SUMDT)
CALL RBYTE ; Checksum MSB
JP C,RTP6
LD D,A
CALL RBYTE ; Checksum LSB
JP C,RTP6
LD E,A
CP L
JP NZ,RTP5
LD A,D
CP H
JP NZ,RTP5
RTP0: XOR A
;
PUSH HL
PUSH DE
PUSH DE
LD DE,MSG_CHKSUM_MZ1
CALL MSGX
CALL PRTHL
CALL NL
LD DE,MSG_CHKSUM_TP1
CALL MSGX
POP DE
EX DE,HL
CALL PRTHL
CALL NL
POP DE
POP HL
;
RTP4:
RET2: POP HL
POP BC
POP DE
CALL MSTOP
PUSH AF
LD A,(TIMFG)
CP 0F0h
JR NZ,RTP8
EI
RTP8: POP AF
RET
RTP5: PUSH HL
PUSH DE
PUSH DE
LD DE,MSG_CHKSUM_MZ2
CALL MSGX
CALL PRTHL
CALL NL
LD DE,MSG_CHKSUM_TP2
CALL MSGX
POP DE
EX DE,HL
CALL PRTHL
CALL NL
POP DE
POP HL
;
LD D,1
DEC D
JR Z,RTP7
LD H,D
CALL GAPCK
JP RTP1
RTP7: LD A,1
JR RTP9
RTP6: LD A,2
RTP9: SCF
JR RTP4
;
; EDGE
; BC = KEYPB
; DE = CSTR
; EXIT CF = 0 : EDGE
; = 1 : BREAK
;
EDGE: LD A,0F0h
LD (KEYPA),A
NOP
EDG1: LD A,(BC)
AND 81h ; SHIFT & BREAK
JP NZ,EDG0
SCF
RET
EDG0: LD A,(DE)
AND 20h
JP NZ,EDG1
EDG2: LD A,(BC)
AND 81h
JP NZ,EDG3
SCF
RET
EDG3: LD A,(DE)
AND 20h
JP Z,EDG2
RET
;
; 1 BYTE READ
;
; EXIT SUMDT=STORE
; CF = 1 : BREAK
; = 0 : DATA=ACC
;
RBYTE: PUSH BC
PUSH DE
PUSH HL
LD HL,0800h
LD BC,KEYPB
LD DE,CSTR
RBY1: CALL EDGE
JP C,RBY3
CALL DLY3
LD A,(DE)
AND 20h
JP Z,RBY2
PUSH HL
LD HL,(SUMDT)
INC HL
LD (SUMDT),HL
POP HL
SCF
RBY2: LD A,L
RLA
LD L,A
DEC H
JP NZ,RBY1
CALL EDGE
LD A,L
RBY3: POP HL
POP DE
POP BC
RET
;
; TAPE MARK DETECT
;
; E=@L@ : INFORMATION
; =@S@ : DATA
; EXIT CF = 0 : OK
; = 1 : BREAK
;
TMARK: CALL GAPCK
PUSH BC
PUSH DE
PUSH HL
PUSH BC
PUSH DE
LD DE,MSG_TAPEMARK
CALL MSG
CALL NL
POP DE
POP BC
LD HL,2828h
LD A,E
CP 0CCh
JP Z,TM0
LD HL,1414h
TM0: LD (TMCNT),HL
LD BC,KEYPB
LD DE,CSTR
TM1: LD HL,(TMCNT)
TM2: CALL EDGE
JP C,TM4
CALL DLY3
LD A,(DE)
AND 20h
JP Z,TM1
DEC H
JP NZ,TM2
; CALL PRTHL
TM3: CALL EDGE
JP C,TM4
CALL DLY3
LD A,(DE)
AND 20h
JP NZ,TM1
DEC L
JP NZ,TM3
CALL EDGE
RET3:
TM4: POP HL
POP DE
POP BC
RET
TM4A: CALL NL
CALL PRTHL ; Print HL as 4digit hex.
LD A,0C4h ; Move cursor left.
TM4B: CALL DPCT
CALL DPCT
CALL DPCT
CALL DPCT
CALL NL
JP ST1
;
; MOTOR ON
;
; D=@W@ : WRITE
; =@R@ : READ
; EXIT CF=0 : OK
; =1 : BREAK
MOTOR: PUSH BC
PUSH DE
PUSH HL
PUSH BC
PUSH DE
LD DE,MSG_MOTORTG
CALL MSG
CALL NL
POP DE
POP BC
LD B,10
MOT1: LD A,(CSTR)
AND 10h
JR Z,MOT4
MOT2: LD B,0A6h
MOT3: CALL DLY12
DJNZ MOT3
XOR A
MOT7: JR RET3
MOT4: LD A,06h
LD HL,CSTPT
LD (HL),A
INC A
LD (HL),A
DJNZ MOT1
CALL NL
LD A,D
CP 0D7h
JR Z,MOT8
LD DE,MSG1
JR MOT9
MOT8: LD DE,MSG3
CALL MSGX
LD DE,MSG2
MOT9: CALL MSGX
MOT5: LD A,(CSTR)
AND 10h
JR NZ,MOT2
CALL ?BRK
JR NZ,MOT5
SCF
JR MOT7
;
; MOTOR STOP
;
MSTOP: PUSH AF
PUSH BC
PUSH DE
PUSH BC
PUSH DE
LD DE,MSG_MOTORSTP
CALL MSG
CALL NL
POP DE
POP BC
LD B,10
MST1: LD A,(CSTR)
AND 10H
JR Z,MST3
MST2: LD A,06h
LD (CSTPT),A
INC A
LD (CSTPT),A
DJNZ MST1
MST3: JP ?RSTR1
;
; CHECK SUM
;
; BC = SIZE
; HL = DATA ADR
; EXIT SUMDT=STORE
; CSMDT=STORE
;
CKSUM: PUSH BC
PUSH DE
PUSH HL
LD DE,0
CKS1: LD A,B
OR C
JR NZ,CKS2
EX DE,HL
LD (SUMDT),HL
LD (CSMDT),HL
POP HL
POP DE
POP BC
RET
CKS2: LD A,(HL)
PUSH BC
LD B,+8
CKS3: RLCA
JR NC,CKS4
INC DE
CKS4: DJNZ CKS3
POP BC
INC HL
DEC BC
JR CKS1
;
; 107 uS DELAY
;
DLY1: LD A,14
DLY1A: DEC A
JP NZ,DLY1A
RET
;
; 240 uS DELAY
;
DLY2: LD A,13
DLY2A: DEC A
JP NZ,DLY2A
RET
;
; 240 uS x 3 DELAY
;
DLY3: NEG
NEG
LD A,42
JP DLY2A
;
; 12mS DELAY
DLY12: PUSH BC
LD B,35
DLY12A: CALL DLY3
DJNZ DLY12A
POP BC
RET
;
; GAP * TAPEMARK
;
; E = @L@ : LONG GAP
; = @S@ : SHORT GAP
;
GAP: PUSH BC
PUSH DE
LD A,E
LD BC,55F0h
LD DE,2028h
CP 0CCh
JP Z,GAP1
LD BC,2AF8h
LD DE,1414h
GAP1: CALL SHORT
GAP1A: DEC BC
LD A,B
OR C
JR NZ,GAP1A
GAP2: CALL LONG
DEC D
JR NZ,GAP2
GAP3: CALL SHORT
DEC E
JR NZ,GAP3
CALL LONG
POP DE
POP BC
RET
;
; GAP CHECK
;
GAPCK: PUSH BC
PUSH DE
PUSH HL
LD DE,MSG_GAPCK
CALL MSG
CALL NL
LD BC,KEYPB
LD DE,CSTR
GAPCK1: LD H,100
GAPCK2: CALL EDGE
JR C,GAPCK3
CALL DLY3
LD A,(DE)
AND 20h
JR NZ,GAPCK1
DEC H
JR NZ,GAPCK2
GAPCK3: JP RET3
;
; 1 bit write
; Short Pulse
;
SHORT: PUSH AF
LD A,03h
LD (CSTPT),A
CALL DLY1
CALL DLY1
LD A,02h
LD (CSTPT),A
CALL DLY1
CALL DLY1
POP AF
RET
;
; 1 bit write
; Long Pulse
;
LONG: PUSH AF
LD A,03h
LD (CSTPT),A
CALL DLY1
CALL DLY1
CALL DLY1
CALL DLY1
LD A,02h
LD (CSTPT),A
CALL DLY1
CALL DLY1
CALL DLY1
CALL DLY1
POP AF
RET
; WRITE INFORMATION
QWRI: DI
PUSH DE
PUSH BC
PUSH HL
LD D,0D7H ; "W"
LD E,0CCH ; "L"
LD HL,IBUFE ; 10F0H
LD BC,80H ; WRITE BYTE SIZE
WRI1: CALL CKSUM ; CHECK SUM
CALL MOTOR ; MOTOR ON
JR C,WRI3
LD A,E
CP 0CCH ; "L"
JR NZ,WRI2
CALL NL
PUSH DE
LD DE,MSGN7 ; WRITING
RST 18H ; CALL MSGX
LD DE,NAME ; FILE NAME
RST 18H ; CALL MSGX
POP DE
WRI2: CALL GAP
CALL WTAPE
WRI3: JP RET2
; WRITE DATA
; EXIT CF=0 : OK
; =1 : BREAK
QWRD: DI
PUSH DE
PUSH BC
PUSH HL
LD D,0D7H ; "W"
LD E,53H ; "S"
L047D: LD BC,(SIZE) ; WRITE DATA BYTE SIZE
LD HL,(DTADR) ; WRITE DATA ADDRESS
LD A,B
OR C
JR Z,RET1
JR WRI1
; TAPE WRITE
; BC=BYTE SIZE
; HL=DATA LOW ADDRESS
; EXIT CF=0 : OK
; =1 : BREAK
WTAPE: PUSH DE
PUSH BC
PUSH HL
LD D,02H
LD A,0F8H ; 88H WOULD BE BETTER!!
LD (KEYPA),A ; E000H
WTAP1: LD A,(HL)
CALL WBYTE ; 1 BYTE WRITE
LD A,(KEYPB) ; E001H
AND 81H ; SHIFT & BREAK
JP NZ,WTAP2
LD A,02H ; BREAK IN CODE
SCF
JR WTAP3
WTAP2: INC HL
DEC BC
LD A,B
OR C
JP NZ,WTAP1
LD HL,(SUMDT) ; SUM DATA SET
LD A,H
CALL WBYTE
LD A,L
CALL WBYTE
CALL LONG
DEC D
JP NZ,L04C2
OR A
JP WTAP3
L04C2: LD B,0
L04C4: CALL SHORT
DEC B
JP NZ,L04C4
POP HL
POP BC
PUSH BC
PUSH HL
JP WTAP1
WTAP3:
RET1: POP HL
POP BC
POP DE
RET
DB 2FH
DB 4EH
; VERIFY (FROM $CMT)
; EXIT ACC=0 : OK CF=0
; =1 : ER CF=1
; =2 : BREAK CF=1
QVRFY: DI
PUSH DE
PUSH BC
PUSH HL
LD BC,(SIZE)
LD HL,(DTADR)
LD D,0D2H ; "R"
LD E,53H ; "S"
LD A,B
OR C
JP Z,RTP4 ; END
CALL CKSUM
CALL MOTOR
JP C,RTP6 ; BRK
CALL TMARK ; TAPE MARK DETECT
JP C,RTP6 ; BRK
CALL TVRFY
JP RTP4
; DATA VERIFY
; BC=SIZE
; HL=DATA LOW ADDRESS
; CSMDT=CHECK SUM
; EXIT ACC=0 : OK CF=0
; =1 : ER =1
; =2 : BREAK =1
TVRFY: PUSH DE
PUSH BC
PUSH HL
LD H,02H ; COMPARE TWICE
TVF1: LD BC,KEYPB
LD DE,CSTR
TVF2: CALL EDGE
JP C,RTP6 ; BRK
CALL DLY3 ; CALL DLY2*3
LD A,(DE)
AND 20H
JP Z,TVF2
LD D,H
POP HL
POP BC
PUSH BC
PUSH HL
; COMPARE TAPE DATA AND STORAGE
TVF3: CALL RBYTE
JP C,RTP6 ; BRK
CP (HL)
JP NZ,RTP7 ; ERROR, NOT EQUAL
INC HL ; STORAGE ADDRESS + 1
DEC BC ; SIZE - 1
LD A,B
OR C
JR NZ,TVF3
; COMPARE CHECK SUM (1199H/CSMDT) AND TAPE
LD HL,(CSMDT)
CALL RBYTE
CP H
JP NZ,RTP7 ; ERROR, NOT EQUAL
CALL RBYTE
CP L
JP NZ,RTP7 ; ERROR, NOT EQUAL
DEC D ; NUMBER OF COMPARES (2) - 1
JP Z,RTP8 ; OK, 2 COMPARES
LD H,D ; (-->05C7H), SAVE NUMBER OF COMPARES
JR TVF1 ; NEXT COMPARE
; 1 BYTE WRITE
WBYTE: PUSH BC
LD B,8
CALL LONG
WBY1: RLCA
CALL C,LONG
CALL NC,SHORT
DEC B
JP NZ,WBY1
POP BC
RET
MSG1: DW 207Fh
MSG2: DB "PLAY", 0Dh, 00h
MSG3: DW 207Fh ; PRESS RECORD
DB "RECORD.", 0Dh, 00h
MSGN7: DB "WRITING", 0Dh, 00h
MSGOK: DB "OK", 0Dh, 00h
MSG_ERRCHKSUM:
DB "CHECKSUM ERROR", 0Dh
MSG_ERRWRITE:
DB "WRITE ERROR", 0Dh
MSG_READTAPE:
DB "READ TAPE", 0Dh, 00h
MSG_TAPEMARK:
DB "TAPEMARK", 0Dh, 00h
MSG_MOTORTG:
DB "MOTOR TOGGLE", 0Dh, 00h
MSG_MOTORSTP:
DB "MOTOR STOP", 0Dh, 00h
MSG_TPMARK:
DB "TAPE MARK START", 0Dh, 00h
MSG_GAPCK:
DB "GAP CHECK", 0Dh, 00h
MSG_LOADFILE:
DB "LOAD FILE = ",0Dh, 00h
MSG_LOADFROM:
DB "LOAD ADDRESS = ", 0Dh, 00h
MSG_LOADEXEC:
DB "EXEC ADDRESS = ", 0Dh, 00h
MSG_LOADSIZE:
DB "LOAD SIZE = ", 0Dh, 00h
MSG_SAVEFILE:
DB "SAVE FILE = ",0Dh, 00h
MSG_SAVEFROM:
DB "SAVE ADDRESS = ", 0Dh, 00h
MSG_SAVEEXEC:
DB "SAVE ADDRESS = ", 0Dh, 00h
MSG_SAVESIZE:
DB "SAVE SIZE = ", 0Dh, 00h
MSG_CHKSUM_MZ1:
DB " MZ CHECKSUM (OK) = ", 0Dh, 00h
MSG_CHKSUM_TP1:
DB "TAPE CHECKSUM (OK) = ", 0Dh, 00h
MSG_CHKSUM_MZ2:
DB " MZ CHECKSUM (ER) = ", 0Dh, 00h
MSG_CHKSUM_TP2:
DB "TAPE CHECKSUM (ER) = ", 0Dh, 00h
TITLE: DB "SHARPMZ TAPE TESTER (C) P. SMART 2018", 0Dh, 00h
; LD B, 20 ; Number of loops
;LOOP: LD HL,MSTART ; Start of checked memory,
; LD D,0CEh ; End memory check CE00
;LOOP1: LD A,000h
; CP L
; JR NZ,LOOP1b
; CALL PRTHL ; Print HL as 4digit hex.
; LD A,0C4h ; Move cursor left.
; LD E,004h ; 4 times.
;LOOP1a: CALL DPCT
; DEC E
; JR NZ,LOOP1a
;LOOP1b: INC HL
; LD A,H
; CP D ; Have we reached end of memory.
; JR Z,LOOP3 ; Yes, exit.
; LD A,(HL) ; Read memory location under test, ie. 0.
; CPL ; Subtract, ie. FF - A, ie FF - 0 = FF.
; LD (HL),A ; Write it back, ie. FF.
; SUB (HL) ; Subtract written memory value from A, ie. should be 0.
; JR NZ,LOOP2 ; Not zero, we have an error.
; LD A,(HL) ; Reread memory location, ie. FF
; CPL ; Subtract FF - FF
; LD (HL),A ; Write 0
; SUB (HL) ; Subtract 0
; JR Z,LOOP1 ; Loop if the same, ie. 0
;LOOP2: LD A,16h
; CALL PRNT ; Print A
; CALL PRTHX ; Print HL as 4 digit hex.
; CALL PRNTS ; Print space.
; XOR A
; LD (HL),A
; LD A,(HL) ; Get into A the failing bits.
; CALL PRTHX ; Print A as 2 digit hex.
; CALL PRNTS ; Print space.
; LD A,0FFh ; Repeat but first load FF into memory
; LD (HL),A
; LD A,(HL)
; CALL PRTHX ; Print A as 2 digit hex.
; NOP
; JR LOOP4
;
;LOOP3: LD DE,OKCHECK
; CALL MSG ; Print check message in DE
; LD A,B ; Print loop count.
; CALL PRTHX
; LD DE,OKMSG
; CALL MSG ; Print ok message in DE
; DEC B
; JR NZ,LOOP
; LD DE,DONEMSG
; CALL MSG ; Print check message in DE
; JP MONIT
;
;OKCHECK: DB 11h
; DB "CHECK: ", 0Dh
;OKMSG: DB "OK.", 0Dh
;DONEMSG: DB 11h
; DB "RAM TEST COMPLETE.", 0Dh
;
;LOOP4: LD B,09h
; CALL PRNTS ; Print space.
; XOR A ; Zero A
; SCF ; Set Carry
;LOOP5: PUSH AF ; Store A and Flags
; LD (HL),A ; Store 0 to bad location.
; LD A,(HL) ; Read back
; CALL PRTHX ; Print A as 2 digit hex.
; CALL PRNTS ; Print space
; POP AF ; Get back A (ie. 0 + C)
; RLA ; Rotate left A. Bit LSB becomes Carry (ie. 1 first instance), Carry becomes MSB
; DJNZ LOOP5 ; Loop if not zero, ie. print out all bit locations written and read to memory to locate bad bit.
; XOR A ; Zero A, clears flags.
; LD A,80h
; LD B,08h
;LOOP6: PUSH AF ; Repeat above but AND memory location with original A (ie. 80)
; LD C,A ; Basically walk through all the bits to find which one is stuck.
; LD (HL),A
; LD A,(HL)
; AND C
; NOP
; JR Z,LOOP8 ; If zero then print out the bit number
; NOP
; NOP
; LD A,C
; CPL
; LD (HL),A
; LD A,(HL)
; AND C
; JR NZ,LOOP8 ; As above, if the compliment doesnt yield zero, print out the bit number.
;LOOP7: POP AF
; RRCA
; NOP
; DJNZ LOOP6
; JP MONIT
;
;LOOP8: CALL LETNL ; New line.
; LD DE,BITMSG ; BIT message
; CALL MSG ; Print message in DE
; LD A,B
; DEC A
; CALL PRTHX ; Print A as 2 digit hex, ie. BIT number.
; CALL LETNL ; New line
; LD DE,BANKMSG ; BANK message
; CALL MSG ; Print message in DE
; LD A,H
; CP 50h ; 'P'
; JR NC,LOOP9 ; Work out bank number, 1, 2 or 3.
; LD A,01h
; JR LOOP11
;
;LOOP9: CP 90h
; JR NC,LOOP10
; LD A,02h
; JR LOOP11
;
;LOOP10: LD A,03h
;LOOP11: CALL PRTHX ; Print A as 2 digit hex, ie. BANK number.
; JR LOOP7
;
;BITMSG: DB " BIT: ", 0Dh
;BANKMSG: DB " BANK: ", 0Dh
MEND: