 |
;----------------------------------------------------
; Start SEARCH
;----------------------------------------------------
LD A,00Ah ; Command = SEARCH
CALL GetCommand ; Get LDPlayer Command Byte
CALL L1E80 ; Send $FF then Command byte to LDPlayer
;----------------------------------------------------
; Wait for SEARCH to complete
;----------------------------------------------------
LD HL,0A79Ah ; Get LDPlayer Status Byte
BIT 3,(HL) ; Check LDPLAYER TYPE
JP Z,L1E67 ; PR-7820 selected so skip ahead
PUSH BC ; Save BC Register
;----------------------------------------------------
; LD-V1000: SEARCH wait
;----------------------------------------------------
LD B,000h ; Start SEARCH wait timer
L1DF4: IN A,(0F1h) ; Get LDPlayer Status
BIT 6,A ; Is LDPlayer READY?
JP NZ,L1DF4 ; Wait here until data arrives
IN A,(0F0h) ; Get LDPlayer Data Byte
CP 0D0h ; Is SEARCH FINISHED?
JR NZ,L1E04 ; No, so skip ahead
POP BC ; SEARCH done so restore BC Register
JR L1E54 ; Wait for STATUS toggle
;----------------------------------------------------
; Test for SEARCH ERROR or excessive wait time
;----------------------------------------------------
L1E04: CP 090h ; Is there a SEARCH ERROR?
JR Z,L1E1A ; Yes, so handle error
INC B ; Count time waiting for SEARCH to complete
LD HL,0A787h ; Get Number of SEARCH Retries
LD A,000h ; Check number of retries
CP (HL) ; Have we retried the SEARCH yet?
JR Z,L1E15 ; No, so wait longer
LD A,066h ; Time to Wait = 66h
JR L1E17 ; Check wait time
L1E15: LD A,0FFh ; Time to Wait = FFh
L1E17: CP B ; Have we waited long enough for SEARCH?
JR NZ,L1E4A ; No, wait longer. Loop back.
;----------------------------------------------------
; Retry SEARCH if SEARCH ERROR encounter
;----------------------------------------------------
L1E1A: LD HL,0A787h ; Get Number of SEARCH Retries
INC (HL) ; Increment number of retries
LD A,003h ; Check for 3 retries
CP (HL) ; Have we retried 3 times yet?
JR NZ,L1E3E ; Not yet, so retry again
;----------------------------------------------------
; LDPlayer FAULT occured, Check if Frame Number Valid
;----------------------------------------------------
LD C,(IY+003h) ; BC = Scene Frame Number
LD B,(IY+004h) ; BC = Scene Frame Number
LD HL,07BD4h ; Check if frame number > 31700
AND A ; Set Carry
SBC HL,BC ; Compare Frame Number
JP C,L0000 ; Frame Number too high, so reset machine
LD HL,00064h ; Check if frame number < 100
AND A ; Set Carry
SBC HL,BC ; Compare Frame Number
JP NC,L0000 ; Frame Number too low, so reset machine
POP BC ; Restore BC Register
JR L1E54 ; Just start disc wherever it's at
;----------------------------------------------------
; Retry SEARCH with Frame Number + 1
;----------------------------------------------------
L1E3E: LD HL,0A7B5h ; Point to Frame Number
LD A,(HL) ; Get Frame Number for addition
ADD A,001h ; Add 1 to frame
DAA ; Add decimal 1 to frame number
LD (HL),A ; Store new frame
POP BC ; Restore BC Register
JP L1DA3 ; Try SEARCH again
;----------------------------------------------------
; LD-V1000 wait for STATUS Bit
;----------------------------------------------------
L1E4A: IN A,(0F1h) ; Get LDPlayer Status
BIT 6,A ; Is LDPlayer READY?
JP Z,L1E4A ; Wait here until SEARCH is finished
JP L1DF4 ; Loop back and wait for byte from LDPlayer
;----------------------------------------------------
; Frame found, now send PLAY Command
;----------------------------------------------------
L1E54: LD HL,0A791h ; Get LDPlayer Control Register
SET 2,(HL) ; Mark search as completed
BIT 4,(HL) ; Is it Freeze Frame?
JP Z,L1E66 ; Yes, so skip PLAY Command
LD A,00Bh ; Get PLAY Command
CALL GetCommand ; Get LDPlayer Command Byte
CALL L1E80 ; Send $FF then Command byte to LDPlayer
L1E66: RET ; Return
;----------------------------------------------------
; PR-8210: SEARCH wait
;----------------------------------------------------
L1E67: IN A,(0F1h) ; Get LDPlayer Status
BIT 7,A ; Is LDPlayer READY?
JP NZ,L1E67 ; Wait here until SEARCH finished
JP L1E54 ; Frame found so continue
;----------------------------------------------------
; Get LDPlayer Command from Table
;----------------------------------------------------
; A = index to command
; $1F65 = Start of Command Table (CommandTable)
; $A784 = Gets loaded with Command Code
;----------------------------------------------------
GetCommand:
PUSH HL ; Save HL Register
LD HL,01F65h ; Load HL with pointer to Command Table
ADD A,L ; A = Index to add to Command Table
LD L,A ; Add Index
JR NC,L1E7A ; Check carry after add
INC H ; Increment Command Table pointer if carry set
L1E7A: LD A,(HL) ; Get Command Byte from Command Table
LD (0A784h),A ; Store Command Byte
POP HL ; Restore HL Register
RET ; Return
;----------------------------------------------------
; Send command with $FF to LDPlayer
;----------------------------------------------------
L1E80: PUSH HL ; Temporarily save HL Register
LD HL,0A79Ah ; Get LDPlayer Status Byte
BIT 3,(HL) ; Check LDPLAYER TYPE
POP HL ; Restore HL Register
JP Z,L1ED8 ; PR-7820 selected so skip ahead
PUSH HL ; Save HL Register
PUSH BC ; Save BC Register
LD A,(0A784h) ; Get Command from A784h
LD B,A ; Store Command in B temporarily
LD A,0FFh ; Load an FFh
LD (0A784h),A ; Store FFh in Command spot
CALL L1EA2 ; Send FFh to LDPlayer
LD A,B ; Restore Command from B
LD (0A784h),A ; Store Command in A784h
CALL L1EA2 ; Send Command to LDPlayer
POP BC ; Restore BC Register
POP HL ; Restore HL Register
RET ; Return
;----------------------------------------------------
; Output Command to LDPlayer (LD-V1000)
;----------------------------------------------------
L1EA2: PUSH HL ; Save HL Register
LD A,(0A784h) ; Load Command byte
OUT (0F4h),A ; Send Command byte to LDPlayer
L1EA8: IN A,(0F1h) ; Get LDPlayer Register
BIT 6,A ; Test Command Strobe
JP NZ,L1EA8 ; Loop until Command Strobe goes low
L1EAF: IN A,(0F1h) ; Get LDPlayer Register
BIT 6,A ; Test Command Strobe
JP Z,L1EAF ; Loop until Command Strobe goes high
;----------------------------------------------------
; Set LDPlayer Communication Bus to Output
;----------------------------------------------------
LD HL,0A783h ; Use LDPlayer Hardware Register
SET 5,(HL) ; Set LDPlayer data bus as Output
RES 7,(HL) ; Clear INT/EXT
LD A,(HL) ; Update LDPlayer Hardware Register
OUT (0F5h),A ; Write to Hardware
;----------------------------------------------------
; Wait until LDPlayer is not BUSY
;----------------------------------------------------
L1EC0: IN A,(0F1h) ; Get LDPlayer Register
BIT 7,A ; Check if LDPlayer busy
JP NZ,L1EC0 ; Wait until LDPlayer is not busy
L1EC7: IN A,(0F1h) ; Get LDPlayer Register
BIT 7,A ; Check if LDPlayer busy
JP Z,L1EC7 ; Wait until LDPlayer is not busy
;----------------------------------------------------
; Return LDPlayer Communication Bus to Input
;----------------------------------------------------
LD HL,0A783h ; Use LDPlayer Hardware Register
RES 5,(HL) ; Set LDPlayer data bus as Input
LD A,(HL) ; Update LDPlayer Hardware Register
OUT (0F5h),A ; Write to Hardware
POP HL ; Restore HL Register
RET ; Return
;----------------------------------------------------
; Send command with $FF (PR-7820)
;----------------------------------------------------
L1ED8: PUSH HL ; Save HL Register
LD HL,0A783h ; Use LDPlayer Hardware Register
RES 7,(HL) ; Clear INT/EXT
LD A,(HL) ; Update LDPlayer Hardware Register
OUT (0F5h),A ; Write to Hardware
LD A,(0A784h) ; Get Command from A784h
OUT (0F4h),A ; Send Command byte to LDPlayer
;----------------------------------------------------
; Return LDPlayer Communication Bus to Output
;----------------------------------------------------
LD HL,0A783h ; Use LDPlayer Hardware Register
SET 5,(HL) ; Set LDPlayer data bus as Output
LD A,(HL) ; Update LDPlayer Hardware Register
OUT (0F5h),A ; Write to Hardware
;----------------------------------------------------
; Press ENTER on LDPlayer then delay
;----------------------------------------------------
RES 6,(HL) ; Press ENTER
LD A,(HL) ; Update LDPlayer Hardware Register
OUT (0F5h),A ; Write to Hardware
CALL L1F0B ; Call Delay (0DF6)
;----------------------------------------------------
; Release ENTER on LDPlayer then delay
;----------------------------------------------------
LD HL,0A783h ; Use LDPlayer Hardware Register
SET 6,(HL) ; Release ENTER
LD A,(HL) ; Update LDPlayer Hardware Register
OUT (0F5h),A ; Write to Hardware
CALL L1F0B ; Call Delay (0DF6)
;----------------------------------------------------
; Return LDPlayer Communication Bus to Input
;----------------------------------------------------
LD HL,0A783h ; Use LDPlayer Hardware Register
RES 5,(HL) ; Set LDPlayer data bus as Input
LD A,(HL) ; Update LDPlayer Hardware Register
OUT (0F5h),A ; Write to Hardware
POP HL ; Restore HL Register
RET ; Return
;----------------------------------------------------
; Delay for 0DF6h
;----------------------------------------------------
L1F0B: LD DE,0FFFFh ; DE = -1
L1F0E: LD HL,00DF6h ; Timer = 0DF6h
L1F11: ADD HL,DE ; Subtract 1 from timer
JR C,L1F11 ; Loop until timer expired
RET ; Return
;----------------------------------------------------
; Send PAUSE command to LDPlayer
;----------------------------------------------------
L1F15: LD A,00Ch ; Get PAUSE Command
CALL GetCommand ; Get LDPlayer Command Byte
CALL L1E80 ; Send $FF then Command byte to LDPlayer
RET ; Return
;----------------------------------------------------
; Send PLAY command to LDPlayer
;----------------------------------------------------
SendPlay:
L1F1E: LD A,00Bh ; Get PLAY Command
CALL GetCommand ; Get LDPlayer Command Byte
CALL L1E80 ; Send $FF then Command byte to LDPlayer
RET ; Return
;----------------------------------------------------
; Send REJECT command to LDPlayer
;----------------------------------------------------
L1F27: LD A,01Bh ; Get REJECT Command
CALL GetCommand ; Get LDPlayer Command Byte
CALL L1E80 ; Send $FF then Command byte to LDPlayer
RET ; Return
;----------------------------------------------------
; Send (unknown) command to LDPlayer
;----------------------------------------------------
L1F30: LD HL,0A79Ah ; Get LDPlayer Status Byte
BIT 3,(HL) ; Check LDPLAYER TYPE
JP Z,L1F41 ; PR-7820 selected so skip ahead
LD A,014h ; Get <> Command
L1F3A: CALL GetCommand ; Get LDPlayer Command Byte
CALL L1E80 ; Send $FF then Command byte to LDPlayer
RET ; Return;
;----------------------------------------------------
; Send (unknown) command to LDPlayer
;----------------------------------------------------
L1F41: LD A,017h ; Get <> Command
JP L1F3A ; Jump back and send command
LD HL,0A79Ah ; Get LDPlayer Status Byte
BIT 3,(HL) ; Check LDPLAYER TYPE
JP Z,L1F57 ; PR-7820 selected so skip ahead
LD A,015h ; Get <> Command
L1F50: CALL GetCommand ; Get LDPlayer Command Byte
CALL L1E80 ; Send $FF then Command byte to LDPlayer
RET ; Return
;----------------------------------------------------
; Send (unknown) command to LDPlayer
;----------------------------------------------------
L1F57: LD A,018h ; Get <> Command
JP L1F50 ; Go back and send command to LDPlayer
LD A,00Fh ; Get <> Command
CALL GetCommand ; Get LDPlayer Command Byte
CALL L1E80 ; Send $FF then Command byte to LDPlayer
RET ; Return
;----------------------------------------------------
; Table of LDPlayer Commands
;----------------------------------------------------
CommandTable:
.byte 03Fh ; A=00 0
.byte 00Fh ; A=01 1
.byte 08Fh ; A=02 2
.byte 04Fh ; A=03 3
.byte 02Fh ; A=04 4
.byte 0AFh ; A=05 5
.byte 06Fh ; A=06 6
.byte 01Fh ; A=07 7
.byte 09Fh ; A=08 8
.byte 05Fh ; A=09 9
.byte 0F7h ; A=0A SEARCH
.byte 0FDh ; A=0B PLAY
.byte 0FBh ; A=0C PAUSE (STOP)
.byte 0DFh ; A=0D (unknown)
.byte 0EFh ; A=0E (unknown)
.byte 0F1h ; A=0F DISPLAY
.byte 0F4h ; A=10 AUDIO 1
.byte 0FCh ; A=11 AUDIO 2
.byte 0A3h ; A=12 X1 FORWARD
.byte 0A0h ; A=13 X0 FORWARD (STOP)
.byte 0CDh ; A=14 DISPLAY DISABLE
.byte 0CEh ; A=15 DISPLAY ENABLE
.byte 0FAh ; A=16 (unknown)
.byte 0E1h ; A=17 (unknow)
.byte 0E0h ; A=18 (unknown)
.byte 0A1h ; A=19 X1/4 FORWARD
.byte 0A2h ; A=1A X1/2 FORWARD
.byte 0F9h ; A=1B REJECT
;----------------------------------------------------
; Diagnostic Test Addresses
;----------------------------------------------------
L1F81: .word 02041h ; RAM Test
.word 0208Ah ; ROM Test
.word 020E1h ; Scoreboard Test
.word 0211Ah ; Keyboard Test
.word 0214Ah ; Communications Link Test
.word 02151h ; Monitor Test
.word 01F9Bh ; Begin Diagnostics
;----------------------------------------------------
; unknown
;----------------------------------------------------
L1F90: .byte 060h, 071h, 060h, 071h, 060h, 071h
.byte 060h, 071h, 060h, 071h, 060h, 071h
;----------------------------------------------------
; Begin Diagnostics
;----------------------------------------------------
L1F9B: LD DE,000A3h ; Load Phrase (A3) "Diagnostic Tests"
CALL L1363 ; Call Speech Routine (phrase)
CALL L210C ; Blank out Scoreboard
CALL L1FD3 ; Check Keyboard for "M" pressed
JR C,L1FEE ; If pressed jump to MENU MODE
LD BC,01F81h ; BC = Pointer to first Test
LD DE,(0C008h) ; Get Frame Number, "Begin Diagnostics, RAM Test in Progress"
L1FB0: LD A,(BC) ; A = Address Pointer
LD L,A ; L = A
INC BC ; Point to next byte
LD A,(BC) ; A = Next Byte
LD H,A ; H = A, HL = Test Address
INC BC ; Increment Pointer to next test
PUSH DE ; Save DE Register
PUSH BC ; Save BC Register
PUSH HL ; Save HL Register
CALL L1C57 ; PAUSE on Frame Number, "Begin Diagnostics"
POP HL ; Restore HL Register
LD DE,01FC2h ; DE = Return Address
PUSH DE ; Store Return Address once test is complete
;----------------------------------------------------
JP (HL) ; Jump to Test Routine
;----------------------------------------------------
L1FC2: CALL L1FD3 ; Check Keyboard for "M" pressed
POP BC ; Restore BC Register (IY)
POP DE ; Restore DE Register (DE)
JR C,L1FEE ; If "M" pressed jump to MENU MODE
LD A,(0C00Ah) ; A = 0Ah, Add 0Ah to Return Address
ADD A,E ; A = A + E (DE = DE + 0Ah)
LD E,A ; E = A
JR NC,L1FB0 ; Check if carry is set
INC D ; Yes, so increment high byte D = D + 1
JR L1FB0 ; Continue Diagnostics
;----------------------------------------------------
; Check Keyboard for "M" Pressed
; C=1, Pressed C=0, Not Pressed
;----------------------------------------------------
L1FD3: LD HL,0BE0Bh ; Check Keyboard Buffer
BIT 0,(HL) ; Has Key been pressed?
JR Z,L1FEC ; No, so skip ahead
RES 0,(HL) ; Clear Keyboard Buffer
LD A,(0BE0Ah) ; Get Keyboard Character
CP 04Dh ; Was "M" Pressed?
JR NZ,L1FEC ; No, so skip ahead
LD DE,(0C013h) ; Get Frame Number, "Thayer's Quest" Title
CALL L1C57 ; PAUSE on Frame Number
SCF ; C = 1
RET ; Return (1)
L1FEC: XOR A ; C = 0
RET ; Return (0)
;----------------------------------------------------
; Diagnostics MENU MODE
;----------------------------------------------------
; "A" = RAM Test
; "B" = EPROM Test
; "C" = Display Test
; "D" = Keyboard Test
; "E" = Communications Link Test
; "F" = Monitor Test
; "G" = Restart Dianostics from beginning
;----------------------------------------------------
L1FEE: CALL L2180 ; Reset Scoreboard to zero
LD DE,000A4h ; Phrase="Menu Mode Press Key A Through G To Choose A Test"
CALL L1363 ; Call Speech Routine (phrase)
LD E,000h ; DE = 0000h
LD D,000h ; DE = 0000h
LD HL,0BE0Bh ; Check Keyboard Buffer
L1FFE: BIT 0,(HL) ; Has a key been pressed?
JR Z,L1FFE ; No key pressed so just loop
RES 0,(HL) ; Clear keypress buffer
LD A,(0BE0Ah) ; Get Keyboard Character
SUB 041h ; Subtract 65d
JR C,L200F ; Key < "A" then Invalid Key
CP 007h ; Check for Key > "G"
JR C,L2017 ; No, so it is a Valid Key
;----------------------------------------------------
; Invalid Key Pressed
;----------------------------------------------------
L200F: LD DE,0003Eh ; Phrase="That Won't Work Here (%)"
CALL L1363 ; Call Speech Routine (phrase)
JR L1FEE ; Continue monitoring keyboard
;----------------------------------------------------
; Valid Key Pressed
;----------------------------------------------------
L2017: ADD A,A ; A = A*2
LD B,A ; B = A
LD DE,000A5h ; Initial phrase="Start of RAM Test"
ADD A,E ; Index to correct phrase
LD E,A ; Store new index to phrase
JR NC,L2021 ; Handle carry
INC D ; Carry set, so bump upper byte
L2021: PUSH DE ; Save Phrase Number to stack
PUSH DE ; Save Phrase Number to stack
CALL L1363 ; Call Speech Routine (phrase)
LD A,B ;
LD DE,01F81h ;
ADD A,E ;
LD E,A ;
JR NC,L202F ;
INC D
L202F: LD A,(DE)
LD L,A
INC DE
LD A,(DE)
LD H,A
LD DE,02039h ; DE = Return Address
PUSH DE ; Save DE Register
JP (HL) ; Jump to Test Routine
L2039: POP DE ; Restore DE Register
POP DE ; Restore DE Register
INC DE ; Increment ?
CALL L1363 ; Call Speech Routine (phrase)
JR L1FEE ; Loop on MENU MODE
;----------------------------------------------------
; Begin RAM Test
;----------------------------------------------------
L2041: POP IX ; IX = Pointer to next test
POP IY
POP DE
;----------------------------------------------------
; Fill RAM A000-BFFF with 55h
;----------------------------------------------------
LD B,055h ; B = 55h
DI ; Disable Interrupts
L2049: LD HL,0A000h ; Point to start of RAM
L204C: LD (HL),B ; Put 55/AAh into RAM location
INC HL ; Point to next RAM spot
LD A,H ; A = H
OR L ; A = A OR L, check HL = 0000h
JR NZ,0204C ; Loop until end of bank
LD HL,0A000h ; Point to beginning of RAM
L2055: LD A,(HL) ; Check to see if RAM was written correctly
CP B ; Compare byte with 55/AAh
JR NZ,L2067 ; Not correct, show "FAILED" screen
INC HL ; Point to next RAM location
LD A,H ; A = H
CP 0C0h ; Is address C000?
JR NZ,L2055 ; No, so loop until C000 is reached
LD A,0AAh ; A = AAh
CP B ; Have we done AA yet?
JR Z,L2074 ; Yes, so clear out RAM
LD B,A ; B = AAh
JR L2049 ; Fill RAM with AAh
;----------------------------------------------------
; Display Message, "RAM Test failed"
;----------------------------------------------------
L2067: CALL L1CA3 ; Check LDPLAYER type by checking the DIPs
LD DE,(0C00Bh) ; Get Frame Number, "RAM Test failed"
CALL L1C57 ; PAUSE on Frame Number
JP L218B ; Wait for Diagnostic DIP to be switched OFF
;----------------------------------------------------
; Clear RAM A000-FFFF
;----------------------------------------------------
L2074: LD HL,0A000h ; HL = A000, first location of RAM
L2077: LD (HL),000 ; Clear out location
INC HL ; Point to next location
LD A,H ; A = H
OR L ; HL = FFFF?
JR NZ,L2077 ; Loop until all spots cleared
;----------------------------------------------------
; Load pointer to next Test
;----------------------------------------------------
CALL L1CA3 ; Check LDPLAYER type by checking the DIPs
LD SP,0BFFFh ; Set Stack Pointer to BFFF
PUSH DE ; Save DE Register
PUSH IY ; Save IY Register
EI ; Enable Interrupts
JP (IX) ; Jump to next test
;77
;----------------------------------------------------
; Perform EPROM Checksum Test
;----------------------------------------------------
L2081: LD IY,0C006h
LD HL,L0000
CALL L20C1
RET Z
LD DE,(0C00Dh) ; Frame # "ROM Checksum failed, Display indicates bad block"
CALL L1C57 ; PAUSE on Frame Number
LD C,0F7h
LD HL,01F8Fh
LD A,L
ADD A,B
LD L,A
LD B,002h
JR NC,L20A9
INC H
L20A9: OTIR
JP L218B
LD HL,LC000
LD B,001h
CALL L20C1
RET Z
LD DE,(0C00F) ; Get Frame Number, "Cartridge ROM Checksum Failed"
CALL L1C57 ; PAUSE on Frame Number
JP L218B
L20C1: LD DE,00000h
L20C4: LD A,(HL)
ADD A,E
LD E,A
JR NC,L20CA
INC D
L20CA: INC HL
LD A,L
CP 000h
JR NZ,L20C4
LD A,H
CP 080h
JR NZ,L20C4
LD A,(IY+000h)
CP E
INC IY
LD A,(IY+000h)
RET NZ
CP D
RET
;----------------------------------------------------
; Begin Scoreboard Test
;----------------------------------------------------
L20E1: LD C,000h ; C = 0
L20E3: LD A,C ; A = C
LD B,008h ; Loop = 8
L20E6: OUT (0F6h),A ; Output to Scoreboard
OUT (0F7h),A ; Output to Scoreboard
ADD A,010h ; Point to next spot
DEC B ; Decrement Loop
JR NZ,L20E6 ; Loop until all spots filled
LD HL,0BE0Bh ; Get Keyboard Buffer
BIT 0,(HL) ; Has a key been pressed?
RES 0,(HL) ; Clear Keyboard Buffer
JR Z,L20FC ; No key pressed, so skip ahead
CALL L2180 ; Reset Scoreboard to zero
RET ; Return from test
L20FC: PUSH BC ; Save BC Register
LD DE,0001Fh ; Timer = 1Fh
CALL L2163 ; Wait until Timer Expires
POP BC ; Restore BC Register
INC C ; C = C + 1, next digit
LD A,00Ah ; A = 10
CP C ; Have we done all digits?
JR NZ,L20E3 ; No, so continue loop
JR L20E1 ; Restart digits and loop again
;----------------------------------------------------
; Blank out Scoreboard
;----------------------------------------------------
L210C: LD A,00Fh ; Get Blank character
LD B,008h ; Loop = 8
L2110: OUT (0F6h),A ; Send character to scoreboard
OUT (0F7h),A ; Send character to scoreboard
ADD A,010h ; Increment position
DEC B ; Decrment Loop
JR NZ,L2110 ; Loop until all spots blanked
RET ; Return
;----------------------------------------------------
; Begin Keyboard Test
;----------------------------------------------------
L211A: LD DE,00592h ; Programmable Timer = 592h
CALL L21A7 ; Set Programmable Timer
LD HL,0BE0Bh ; Get Keyboard buffer
L2123: CALL L21B3 ; Check if Programmable Timer expired
JR NZ,L2146 ; Timer expired so end test
BIT 0,(HL) ; Has a key been pressed?
JR Z,L2123 ; No, so just loop
;----------------------------------------------------
; Key has been pressed
;----------------------------------------------------
LD A,(0BE0Ah) ; Get Keyboard Character
RES 0,(HL) ; Clear keypress buffer
BIT 7,A ; Test if Character is Function Key
JR Z,L2141 ; No, so jump ahead
AND 003h ; AND Key with 3 (0-3)
ADD A,001h ; Add 1 to Key (Function Keys1-4)
LD E,A ; DE = Address of Key Speech
LD D,000h ; Get word (key)
CALL L13C6 ; Call Speech Routine (word)
JR L2123 ; Continue Test
L2141: CALL L19B0 ;
JR L2123 ; Continue Test
;----------------------------------------------------
; 2 minute Timer expired, End Test
;----------------------------------------------------
L2146: CALL L2180 ; Reset Scoreboard to zero
RET ; End of Test
;----------------------------------------------------
; Begin Communications Link Test
;----------------------------------------------------
L214A: LD DE,0005Dh ; Load "M" key
CALL L2163 ; Check for "M" keypress
RET ; Return
;----------------------------------------------------
; Begin Monitor Test
;----------------------------------------------------
L2151: LD DE,0005Dh ; Load "M" key?
CALL L2163 ; Check for "M" keypress
LD DE,(0C011h) ; Get Frame Number, Underwater
CALL L1C57 ; PAUSE on Frame Number
L215E: CALL L216C ; Check Diagnostic Mode DIP
JR L215E ; Wait until Diagnostic Mode switched off
;----------------------------------------------------
; Programmable Timer
; DE = Programmable Timer value
;----------------------------------------------------
L2163: CALL L21A7 ; Set Programmable Timer
L2166: CALL L21B3 ; Check if Programmable Timer expired
JR Z,L2166 ; Loop until Timer expires
RET ; Timer expired, so return
;----------------------------------------------------
; Check Diagnostic Mode DIP
;----------------------------------------------------
L216C: IN A,(0F1h) ; GetDIP Switch B
BIT 0,A ; Test B1, Diagnostic Mode
JR Z,L2178 ; Diagnostic Mode set, so skip ahead
CALL L2180 ; Reset Scoreboard to zero
JP L0000 ; RESET Program
L2178: CALL L1FD3 ; Check Keyboard for "M" pressed
RET NC ; "M" not pressed so return
POP HL ; Restore HL Register
JP L1FEE ; Jump Diagnostics MENU MODE
;----------------------------------------------------
; Reset Scoreboard to Zero
;----------------------------------------------------
L2180: XOR A ; A = 00h
LD (0BE0Dh),A ; Store 0 in credits
LD (0BE0Eh),A ; Store 0 in credits
CALL L210C ; Blank out Scoreboard
RET ; Return
;----------------------------------------------------
; Loop unit Diagnostic Mode DIP switched OFF
;----------------------------------------------------
L218B: CALL L216C ; Check Diagnostic Mode DIP
JR L218B ; Just keep looping
;----------------------------------------------------
; Check Keyboard for a valid Keypress
; A = Character, Z = Set, Z = Clear
;----------------------------------------------------
L2190: PUSH BC ; Save BC Register
PUSH DE ; Save DE Register
PUSH HL ; Save HL Register
PUSH IY ; Save IY Register
LD HL,0BE0Bh ; Check Keyboard Buffer
BIT 0,(HL) ; Check for keypress
SCF ; Carry = set, no keypress
JR Z,L21A1 ; No keypress, so leave routine
LD A,(0BE0Ah) ; Get Keyboard Character
OR A ; Z = Clear
L21A1: POP IY ; Restore IY Register
POP HL ; Restore HL Register
POP DE ; Restore DE Register
POP BC ;&nbs |