Site Map | Contact Info | Home  
  
 Home
 Products
 ROMHACK Toolbox
 Ordering Info
 Code Disassembly
  Bega's Battle
  Cliffhanger
  Thayer's Quest
 My Gameroom
 Links

 

 

Page1

Page2

Page3

Page4

Page5

;----------------------------------------------------
;                    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   060h071h060h071h060h071h
         .byte   060h071h060h071h060h071h





;----------------------------------------------------
;                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