; BALCHECK Bally Board tester 4/29/80 ; ; This software requires extra hardware to run (we think!) ; ; Retyped by Adam Trionfo ; ; Revisions: ; * February 7, 2004 - 1.0 ; - Finished typing in source-code ; - Code assembles without problem ; - Added conditional assembly for new or old ROM ; * January 25, 2005 - .01 ; - Begin typing in source-code ; ; To assemble this Z-80 source code using ZMAC: ; ; zmac -d -o -x ; ; For example, assemble this Astrocade Z-80 ROM file: ; ; zmac -i -m -o balcheck.bin -x balcheck.lst balcheck.asm ; ; ********************************************************* ; * * ; * IMPORTANT: Conditional Assembly! * ; * * ; * This code can assemble into two different binary * ; * files, as per the 5/16/82 update by Richard G. * ; * Belton. One assembly is for the old ROM and the * ; * other is for the new ROM. * ; * * ; * Here's how to tell which ROM to assemble for * ; * Old ROM - Gunfighter score = 0-99 * ; * Menu reads (C) BALLY MFG 1977 * ; * New ROM - Gunfighter score = 0-9999 * ; * Menu reads (C) BALLY MFG 1978 * ; * * ; * The default is for the new ROM. To assemble for * ; * the new ROM, change NEWROM EQU YES to NEWROM EQU NO * ; * * ; ********************************************************* YES EQU 1 NO EQU 0 NEWROM EQU YES ;******************************************************** ;* * ;* B A L C H E C K * ;* * ;* Check Bally Mother-boards * ;* * ;* 4/29/80 * ;* * ;******************************************************** ; DSPLY EQU 0FFH ; Test unit display port ; Display patterns ; 0 = 0 ; . . ; . . ; 9 = 9 ; A = - ; B = E ; C = H ; D = L ; E = P ; F = blank ; INCLUDE "HVGLIB.H" ; ; LIST ON ; ORG FIRSTC ; JP BCHK ; Go start testing ; ; Multiply A by 16; Shift A left 4 A2003 ADD A,A ; x2 ADD A,A ; x4 ADD A,A ; x8 ADD A,A ; x16 RET ; T2008 DB 00101111B ; Key masks DB 00001111B DB 00001111B DB 00101111B ; ; Expander Test patterns T200C DB 0,55H,0AAH,0FFH ; ; Interrupt vectors T2010 DW A2728 ; Display all input devices T2012 DW A2777 ; Rainbow Interrupt Routine T2014 DW A2016 ; Normal Interrupt Routine ; ; Normal Interrupt routine ; keypad layout ; Port 17 16 15 14 ; Bit 0 1 2 3 4 ; 1 5 6 7 8 ; 2 9 A B C ; 3 D E F 0 ; 4 Q/S x x x ; 5 CE x x Go A2016 DI EX AF,AF' ; Using only reg. IN A,(KEY1) AND A JR NZ,A2046 ; 3 or 7 IN A,(KEY2) AND A JR NZ,A2052 ; 2 or 6 IN A,(KEY3) AND A JR NZ,A2036 ; 1 or 5 or Q/S IN A,(KEY0) AND A JR Z,A2062 CP 1 ; 4 or 8 JP Z,A2627 ; Output Port Write routine CP 2 JP Z,A27BA ; Enter machine code from keys A2036 CP 1 JP Z,A25D9 ; Memory Read routine CP 2 JP Z,A264F ; Memory Read & write routine CP 10H JR Z,A205C ; Q/S JR A2062 ; None of the above ; A2046 CP 1 JP Z,A2611 ; Input Port Read Routine CP 2 JP Z,A2748 ; Rainbow Color Display JR A2062 ; A2052 CP 1 JP Z,A25EA ; Memory Write routine CP 2 JP Z,A2673 ; Display all input devices ; A205C EXX ; Q/S key LD A,C AND 0FH ; Remove bit 7 LD C,A EXX ; A2062 EXX INC D ; 1/60 sec counter LD A,D CP 60 JR NZ,A20A9 ; Jp if no overflow to seconds LD D,0 ; Reset 1/60 sec counter BIT 0,E JR NZ,A2080 ; Jp if odd second LD A,C CP 84H JR NZ,A2078 ; Jp if test not done LD A,0B1H ; "E1" on display JR A2081 ; A2078 LD A,B AND A JR NZ,A2081 LD A,0A0H ; "-0" on display JR A2081 ; A2080 XOR A ; "00" on display A2081 OUT (DSPLY),A INC E ; Increment 1 second counter LD A,E CP 60 JR NZ,A20A9 ; Jp if no seconds overflow LD E,0 ; Reset seconds INC H ; Increment minutes LD A,H CP 60 JR NZ,A20A9 ; Jp if no minutes overflow LD H,0 ; Reset minutes INC L ; Increment hours LD A,L CALL A2003 ; Mul A by 16 CP 0A0H JR NZ,A20A0 ; Jp if not 10 hours LD A,B ADD A,6 LD B,A A20A0 INC B LD A,B CP 99H JR NZ,A20A9 XOR A LD B,A LD L,A A20A9 EXX EX AF,AF' EI RET ; ; Start of program BCHK DI EXX XOR A LD B,A LD C,81H LD D,A LD E,A LD H,A LD L,A EXX LD A,0AAH OUT (DSPLY),A ; Set display to "--" LD A,0 OUT (CONCM),A ; Set Consumer Mode LD A,100 SHL 1 OUT (VERBL),A ; Update = 100 lines ; ; 1. Ensure keypad isn't stuck XOR A LD C,KEY0 A20C7 IN A,(C) ; Ensure no keys stuck AND A JR NZ,A20D4 ; Have a stuck key INC C ; Check all columns LD A,C CP KEY3+1 JR Z,A20DB ; Keyboard has no stuck keys JR A20C7 ; Have a stuck keyboard key A20D4 LD E,1 ; Error Code 1 LD HL,T23EF JR A2147 ; ; 2. Test RAM at 4F00 - 4FFF A20DB LD IY,T20E2 JP A2164 ; T20E2 JR A20E8 DB 78 DB 80 DW NORMEM+3840 ; ; 3. Check screen interrupts A20E8 LD SP,BEGRAM-6 LD A,8 OUT (INMOD),A ; Set interrupt mode LD HL,T2014 ; Initialize interrupt routine LD A,H LD I,A LD A,L OUT (INFBK),A XOR A OUT (INLIN),A ; Interrupt on line 0 IM 2 EI LD D,1 CALL A25CF ; Delay DI EXX LD A,D ; 1/60 seconds AND A JR NZ,A2117 ; Must have gotten screen int. LD A,E ; Seconds AND A JR NZ,A2117 ; Must have gotten screen int. EXX LD E,2 ; Error 2 Screen line Int. err. LD C,0FFH ; Info byte = blank LD HL,T23EF ; Where to continue test JR A2147 ; A2117 LD C,80H ; Set loop counter EXX EI ; ; Start repetitive tests ; Checksum check ROMs ; Which ROM is being used - old or new? IF NEWROM A211B LD BC,8192 ELSE A211B LD BC,2048 ENDIF LD HL,SCREEN ; Start with low memory A2121 XOR A ; Initialize checksum A2122 ADD A,(HL) ; Accumulate checksum LD D,A INC HL DEC C JR NZ,A2122 DEC B JR NZ,A2122 LD A,D ; Which ROM is being used - old or new? IF NEWROM CP 0A4H ELSE CP 0FFH ENDIF JR NZ,A213A ; Checksum bad ; Which ROM is being used - old or new? IF NEWROM JP A214A ELSE LD BC,800H ENDIF LD A,H CP [FIRSTC+2048] SHR 8 JR Z,A214A ; Done with checksum test JR A2121 ; Do next checksum ; A213A LD E,3 ; Error 3 ROM checksum err. LD A,H SUB 8 LD C,A JR NZ,A2144 LD C,0A0H ; "-0" on display A2144 LD HL,A214A ; Where to continue testing A2147 JP A23E6 ; ; Test RAM A214A DI LD IY,T2151 ; Test 4F00 - 4FFF JR A2164 ; T2151 JR A2157 DB 78 DB 80 DW NORMEM+3840 ; A2157 EI LD IY,T215E ; Test 4000 - 4EFF JR A2164 ; T215E JR A21C8 DB 63 DB 79 DW NORMEM ; ; Memory test routine A2164 LD C,0 LD B,1 A2168 LD H,(IY+5) LD L,(IY+4) A216E LD (HL),B LD A,(HL) XOR B JR Z,A2179 LD IX,A2179 JR A21C4 ; A2179 INC HL LD A,H CP (IY+3) JR NZ,A216E A2180 DEC HL LD A,H CP (IY+2) JR Z,A219D LD A,(HL) XOR B JR Z,A2191 LD IX,A2191 JR A21C4 ; A2191 LD A,B CPL LD (HL),A XOR (HL) JR Z,A2180 LD IX,A2180 JR A21C4 ; A219D INC HL LD A,H CP (IY+3) JR Z,A21B3 LD A,B CPL XOR (HL) JR Z,A21AF LD IX,A21AF JR A21C4 ; A21AF XOR A LD (HL),A JR A219D ; A21B3 SLA B JR NC,A2168 LD A,C AND A JR NZ,A21BD JP (IY) ; A21BD LD E,4 ; Error 4 RAM error LD HL,A21C8 JR A2213 ; A21C4 OR C LD C,A JP (IX) ; ; Shifter test A21C8 LD IY,2064 LD IX,NORMEM+2064 XOR A LD C,A ; Init shift count A21D2 LD B,1 A21D4 LD A,C OUT (MAGIC),A ; Set shifter XOR A LD H,A ; Expected first byte LD L,A LD (IY),A LD A,B LD L,B ; Expected first byte LD (IY),A XOR A LD (IY+1),A LD A,C AND A JR Z,A21F5 ; Jp if shift = 0 A21EA RR L RR H RR L RR H DEC A JR NZ,A21EA ; Shift proper number of times A21F5 LD A,(IX) ; Pick resulting RAM data CP L JR NZ,A220E ; Shifter error LD A,(IX+1) ; Second resulting byte CP H JR NZ,A220E ; Shifter error RL B ; Store pattern left 1 bit JR NC,A21D4 ; Keep trying LD A,C ; Done 8 patterns INC A LD C,A CP 4 JR NZ,A21D2 ; Jp if not all shifter sets JR A2215 ; A220E LD E,5 ; Error 5 Shifter error LD HL,A2215 A2213 JR A2248 ; ; Flopper test A2215 LD A,01000000B OUT (MAGIC),A ; Set flopper LD DE,NORMEM+2064 LD HL,T224A LD C,1 ; Write 1s A2221 LD A,C LD (IY),A LD A,(DE) CP (HL) JR NZ,A2243 ; Bad Flop INC HL SLA C JR NC,A2221 ; Do all 8 bites RR C ; Shift back to hi bit A2230 LD A,C ; Write 0s CPL LD (IY),A LD A,(DE) CP (HL) JR NZ,A2240 ; Bad flop INC HL SRL C JR NC,A2230 ; Do all 8 JR A225A ; A2240 LD A,C CPL LD C,A A2243 LD E,7 ; Error 7 Flopper error LD HL,A225A A2248 JR A2291 ; ; Expected flopper patterns T224A DB 01000000B DB 10000000B DB 00010000B DB 00100000B DB 00000100B DB 00001000B DB 00000001B DB 00000010B DB 11111101B DB 11111110B DB 11110111B DB 11111011B DB 11011111B DB 11101111B DB 01111111B DB 10111111B ; ; Expander test A225A LD A,8 OUT (MAGIC),A ; Set Expander XOR A LD C,A LD D,A LD HL,T200C A2264 OUT (XPAND),A LD B,4 A2268 LD A,(HL) LD (IY),A ; Expand M. S. nybble LD (IY+1),A ; Expand L. S. nybble LD A,(IX) ; Resulting data CP D JR NZ,A228C ; Bad expand LD A,(IX+1) CP D JR NZ,A228C ; Bad expand INC HL DJNZ A2268 LD A,D ADD A,01010101B LD D,A LD A,C ADD A,0101B LD C,A CP 14H JR NZ,A2264 JR A2293 ; A228C LD E,12H ; Error 12 Expander error LD HL,A2293 A2291 JR A22CB ; ; OR/XOR write, OR/XOR Intercept test A2293 LD A,10H ; Set for OR write CALL A22CE CALL A22E3 CP 1 JR Z,A22BB ; OR write error CP 2 JR Z,A22B7 ; OR intercept error T22A3 LD A,20H ; Set for XOR write CALL A22CE INC L CALL A22E3 CP 1 JR Z,A22C2 ; XOR Write error CP 2 JR Z,A22C6 ; XOR intercept error JP A233A ; A22B7 LD E,10H ; Error 10 OR intercept err. JR A22BD ; A22BB LD E,8 ; Error 8 OR Write error A22BD LD HL,T22A3 JR A22CB ; A22C2 LD E,9 ; Error 9 XOR Write error JR A22C8 ; A22C6 LD E,11H ; Error 11 XOR intercept err. A22C8 LD HL,A233A A22CB JP A23E6 ; A22CE OUT (MAGIC),A IN A,(INTST) ; Clear intercept status LD HL,104H XOR A LD D,A LD E,A LD C,A LD L,A LD B,4 RET ; A22DD LD A,1 ; Write error RET ; A22E0 LD A,2 ; Intercept error RET ; A22E3 CALL A2333 CALL A2333 CALL A2333 XOR A CP L JR NZ,A22F4 LD A,D OR C JR A22F6 ; A22F4 LD A,D XOR C A22F6 CP (IX) JR NZ,A22DD ; Write error LD A,C AND A JR Z,A2306 ; 0 write = no intercept check IN A,(INTST) ; Get intercept status CP E JR NZ,A22E0 ; Intercept error JR A230B ; A2306 IN A,(INTST) CP C JR NZ,A22E0 ; Intercept error A230B LD A,C ADD A,H LD C,A DJNZ A22E3 LD BC,400H SRL E SLA H SLA H JR NC,A22E3 RL H LD A,E AND A JR NZ,A2325 LD E,88H JR A2327 ; A2325 SRL E A2327 LD A,D ADD A,55H LD D,A LD BC,400H LD E,88H JR NC,A22E3 RET ; A2333 LD (IX),D LD (IY),C RET ; ; Trigger/Joystick test A233A LD B,255 A233C IN A,(VERAF) ; Clear feedback registers IN A,(HORAF) LD C,SW0 A2342 IN A,(C) AND A JP NZ,A23C8 ; ERROR 13 INC C LD A,C CP SW3+1 JR NZ,A2342 ; T234E IN A,(KEY0) IN A,(KEY1) IN A,(KEY2) IN A,(KEY3) LD C,POT0 A2358 IN A,(C) CP 0FFH JR NZ,A23CF ; Error 14 INC C LD A,C CP POT3+1 JR NZ,A2358 DJNZ A233C ; Exercise output ports LD B,255 A2368 LD A,0 OUT (CONCM),A ; Set consumer mode LD A,B OUT (COL0R),A OUT (COL0L),A OUT (COL1R),A OUT (COL1L),A OUT (COL2R),A OUT (COL2L),A OUT (COL3R),A OUT (COL3L),A LD A,20 OUT (HORCB),A LD A,100*2 OUT (VERBL),A LD D,B LD HL,T23DE LD B,8 LD C,COLBX ; Color multiple port OTIR LD HL,T23D6 LD B,8 LD C,SNDBX ; Sound multiple port OTIR LD A,0FFH OUT (VOLN),A OUT (VOLAB),A OUT (VIBRA),A LD A,D OUT (TONMO),A OUT (TONEA),A OUT (TONEB),A OUT (TONEC),A OUT (VOLC),A LD B,D DJNZ A2368 DI EXX LD A,C BIT 7,A JR Z,A23BF INC C ; Increment loop counter LD A,C CP 84H JR NZ,A23C3 ; Not done EXX ; Done with tests EI A23BD JR A23BD ; Hang ; A23BF AND A ; C,7=0 and 6-0 not 0 JR NZ,A23C3 INC C A23C3 EXX EI JP A211B ; Start tests over ; A23C8 LD E,13H ; Error 13 Trigger/Joystick LD HL,T234E JR A23E6 ; A23CF LD E,14H ; Error 14 Pot Error LD HL,A2368 JR A23E6 ; ; Sound port values T23D6 DB 48H ; 17H DB 44H ; 16H DB 34H ; 15H DB 0 ; 14H DB 0FFH ; 13H DB 0FDH ; 12H DB 0F5H ; 11H DB 0F5H ; 10H ; ; Color port values T23DE DB 0DBH ; 07 DB 92H ; 06 DB 49H ; 05 DB 0 ; 04 DB 0DBH ; 03 DB 92H ; 02 DB 49H ; 01 DB 0 ; 00 ; ; Error routine. Enter E = error code #, C = error data A23E6 DI EXX LD A,C EXX AND 0FH AND A JR Z,A243F T23EF LD A,E OUT (DSPLY),A ; Send error code LD HL,T23F7 JR A2430 ; T23F7 LD A,C OUT (DSPLY),A LD HL,T23FF JR A2430 ; T23FF LD A,0CBH ; "HE" OUT (DSPLY),A LD HL,T2408 JR A2430 ; T2408 LD A,0DEH ; "LP" OUT (DSPLY),A LD HL,T2411 JR A2430 ; T2411 EXX LD A,B EXX LD HL,T2420 AND A JR NZ,A241C LD A,0A0H ; "-0" A241C OUT (DSPLY),A JR A2430 ; T2420 LD A,0AAH ; "--" OUT (DSPLY),A LD HL,T2429 JR A2430 ; T2429 LD A,0AAH ; "--" OUT (DSPLY),A LD HL,T23EF ; Circle back for error report ; Display delay routine A2430 LD D,2 A2432 LD A,255 A2434 LD B,255 A2436 DJNZ A2436 DEC A JR NZ,A2434 DEC D JR NZ,A2432 JP (HL) ; A243F EI JP (HL) EJECT T2441 DB 'ENTR 4-DIGT HEX',0 T2451 DB 'READ ADDR',0 T245B DB 'WRITE ADDR',0 T2466 DB 'ENTR 2-DIGT HEX',0 T2476 DB 'READ PORT',0 T2480 DB 'WRITE PORT',0 T248B DB 'STRT ADDR',0 T2495 DB 'ENTR 2-DIGT HEX',0 T24A5 DB 'DATA',0 T24AA DB 'BYTE TO WRITE',0 T24B8 DB '**',0 T24BB DB '****',0 ; T24C0 DB '0E=' DB '0F=' DB ' ' DB ' ' DB '10=' DB '11=' DB '12=' DB '13=' T24D8 DB '14=' DB '15=' DB '16=' DB '17=' DB ' ' DB '1C=' DB '1D=' DB '1E=' DB '1F=' T24F3 DB '"GO" TO RUN',0 ; ; GENERAL USE SUBROUTINES ; ; Set colors for special routines A24FF XOR A OUT (COL0L),A OUT (COL0R),A OUT (HORCB),A LD A,0FH OUT (COL1R),A OUT (COL2R),A OUT (COL3R),A SYSSUK FILL ; Screen Fill Subroutine DW NORMEM ; First byte DW 4016 ; Number of bytes DB 0 ; Data to fill with RET ; A2516 SYSSUK STRDIS ; Display String Subroutine DB 4 ; X coordinate DB 40 ; Y coordinate DB 00001100B ; Options (On Color 03H) DW T2441 ; 'ENTR 4-DIGT HEX' RET ; A251E SYSSUK STRDIS ; Display String Subroutine DB 4 ; X coordinate DB 50 ; Y coordinate DB 00001100B ; Options (On Color 03H) DW T2451 ; 'READ ADDR' RET ; A2526 SYSSUK STRDIS ; Display String Subroutine DB 4 ; X coordinate DB 40 ; Y coordinate DB 00001100B ; Options (On Color 03H) DW T2466 ; 'ENTR 2-DIGT HEX' RET ; A252E SYSSUK STRDIS ; Display String Subroutine DB 4 ; X coordinate DB 40 ; Y coordinate DB 00001100B ; Options (On Color 03H) DW T2495 ; 'ENTR 4-DIGT HEX' SYSSUK STRDIS ; Display String Subroutine DB 4 ; X coordinate DB 50 ; Y coordinate DB 00001100B ; Options (On Color 03H) DW T24AA ; 'BYTE TO WRITE' RET ; ; Display character in A A253D LD C,00001100B ; Options (On Color 03H) A253F LD IX,FNTSML ; Unnecessary instruction SYSTEM CHRDIS ; Display Character Subroutine RET ; ; Hex nybble to ASCII byte A2546 CP 10 JP M,A254D ; Could be JR C, ADD A,7 A254D ADD A,'0' RET ; A2550 PUSH DE PUSH HL LD A,255 LD (TIMOUT),A ; 4 min 15 sec timeout A2557 SYSSUK SENTRY ; Sense Transition Subroutine DW T2008 ; Key Mask Address CP SKYD JR NZ,A2557 ; Wait for key LD A,B CP 16 JR NZ,A2565 XOR A A2565 CP 20 JP P,A256E ; Keys 20-24 LD B,A ; Keys 1-19 CALL A2546 A256E POP HL POP DE RET ; ; Get 2 or 4 hex digits from keypad ; A=0=2 digits A2571 PUSH AF AND A JR NZ,A257E A2575 SYSSUK STRDIS ; Display 2 asterisks DB 72 ; X coordinate DB 70 ; Y coordinate DB 00001100B ; Options (On Color 03H) DW T24B8 ; '**' JR A2585 ; A257E SYSSUK STRDIS ; Display 4 asterisks DB 72 ; X coordinate DB 70 ; Y coordinate DB 00001100B ; Options (On Color 03H) DW T24BB ; '****' A2585 LD HL,0 CALL A2550 CP 24 JR Z,A25CD ; "GO" key CP 21 JR Z,A2575 ; "CE" key XYRELL DE,72,70 CALL A253D LD A,B CALL A2003 ; Mul A by 16 LD H,A ; First nybble CALL A2550 CP 21 JR Z,A2575 ; "CE" key CALL A253D LD A,H OR B LD H,A ; Second nybble POP AF AND A JR NZ,A25B0 RET ; A25B0 PUSH AF CALL A2550 CP 21 JR Z,A257E ; "CE" key CALL A253D LD A,B CALL A2003 ; Mul A by 16 LD L,A CALL A2550 CP 21 JR Z,A257E ; "CE" key CALL A253D LD A,L OR B LD L,A A25CD POP AF RET ; ; Fixed delay routine A25CF LD A,255 A25D1 LD B,255 A25D3 DJNZ A25D3 DEC A JR NZ,A25D1 RET ; ; Special routine 1 Memory Read Routine A25D9 CALL A24FF ; Set colors CALL A2516 ; "ENTR 4-DIGT HEX" CALL A251E ; "READ ADDR" LD A,1 ; Get 4 digits CALL A2571 A25E7 LD A,(HL) JR A25E7 ; Loop forever ; ; Special routine 2 Memory Write Routine A25EA CALL A24FF ; Set colors CALL A252E ; "ENTR 2-DIGT BYTE TO WRITE" XOR A ; Get 2 digits CALL A2571 PUSH HL ; Save LD A,H OUT (DSPLY),A ; Put digits on display CALL A25CF ; Delay CALL A24FF ; Clear screen CALL A2516 ; "ENTR 4-DIGT HEX" SYSSUK STRDIS DB 4 DB 50 DB 00001100B DW T245B ; 'WRITE ADDR' LD A,1 ; Get 4 digits CALL A2571 POP BC A260E LD (HL),B JR A260E ; Loop forever ; ; Special routine 3 Input Port Read Routine A2611 CALL A24FF ; Set colors CALL A2526 ; "ENTR 2-DIGT HEX" SYSSUK STRDIS DB 4 DB 50 DB 00001100B DW T2476 ; 'READ PORT' XOR A CALL A2571 LD C,H A2623 IN A,(C) JR A2623 ; Loop forever ; ; Special routine 4 Output Port Write Routine A2627 CALL A24FF ; Set colors CALL A2526 ; "ENTR 2-DIGT HEX" SYSSUK STRDIS DB 4 DB 50 DB 00001100B DW T2480 ; 'WRITE PORT' XOR A CALL A2571 PUSH HL LD A,H OUT (DSPLY),A CALL A25CF CALL A24FF CALL A252E ; "ENTR 2-DIGT BYTE TO WRITE" XOR A CALL A2571 POP BC LD C,B A264B OUT (C),H JR A264B ; ; Special routine 5 Memory Read and Write Routine A264F CALL A24FF ; Set colors CALL A252E ; "ENTR 2-DIGT BYTE TO WRITE" XOR A ; Get 2 digits CALL A2571 PUSH HL ; Save LD A,H OUT (DSPLY),A ; Send to display CALL A25CF ; Delay CALL A24FF ; Clear screen CALL A2516 ; "ENTR 4-DIGT HEX" CALL A251E ; "READ ADDR" LD A,1 ; Get 4 digits CALL A2571 POP BC A266F LD (HL),B LD A,(HL) JR A266F ; Loop forever ; ; Special routine 6 Display all Input Devices A2673 CALL A24FF LD HL,T24C0 ; Labels XYRELL DE,4,10 CALL A26FB LD HL,T24D8 ; Labels XYRELL DE,80,0 CALL A26FB EX AF,AF' XOR A EX AF,AF' LD HL,T2010 ; Set interrupt routine adrs. LD A,H LD I,A LD A,L OUT (INFBK),A LD A,3 OUT (INMOD),A EI A2699 IN A,(SW0) XYRELL DE,28,50 CALL A2711 IN A,(SW1) XYRELL DE,28,60 CALL A2711 IN A,(SW2) XYRELL DE,28,70 CALL A2711 IN A,(SW3) XYRELL DE,28,80 CALL A2711 IN A,(KEY0) XYRELL DE,104,0 CALL A2711 IN A,(KEY1) XYRELL DE,104,10 CALL A2711 IN A,(KEY2) XYRELL DE,104,20 CALL A2711 IN A,(KEY3) XYRELL DE,104,30 CALL A2711 IN A,(POT0) XYRELL DE,104,50 CALL A2711 IN A,(POT1) XYRELL DE,104,60 CALL A2711 IN A,(POT2) XYRELL DE,104,70 CALL A2711 IN A,(POT3) XYRELL DE,104,80 CALL A2711 JR A2699 ; Loop forever ; ; Display input port labels A26FB LD B,3 ; 3 char/line A26FD LD A,(HL) ; Get character CALL A253D ; Display INC HL DJNZ A26FD ; Do all 3 LD A,E ; Get horizontal pos'n SUB 18H ; Reduce 3 char positions LD E,A LD A,D ; Get vertical position ADD A,10 ; Increment by 1 line LD D,A ; (10 pixels) CP 90 JR NZ,A26FB ; Line 80 is last line RET ; ; Display A in ASCII A2711 LD H,A ; Save input value AND 0F0H ; M. S. nybble first RRCA RRCA RRCA RRCA CALL A2546 ; Convert to ASCII CALL A253D ; Display LD A,H ; L. S. nybble last AND 0FH CALL A2546 ; Convert to ASCII CALL A253D ; Display RET ; ; Interrupt routine for Display ALL Input Devices A2728 DI EX AF,AF' AND A JR Z,A2744 EX AF,AF' IN A,(VERAF) ; Get vertical Lite Pen SRL A XYRELL DE,28,10 CALL A2711 IN A,(HORAF) ; Get horizontal Lite Pen SUB 8 XYRELL DE,28,20 CALL A2711 A2742 EI RET ; A2744 INC A EX AF,AF' JR A2742 ; ; Special Routine 7 Rainbow Color Display A2748 LD DE,NORMEM LD HL,T27A6 LD BC,20 LDIR ; Put up rainbow pattern LD HL,NORMEM LD BC,0FDCH LDIR ; Fill rest of screen LD HL,T2012 ; Set up interrupt adrs LD A,H LD I,A LD A,L OUT (INFBK),A LD A,20 OUT (HORCB),A ; Middle of screen XYRELL BC,INLIN,0F8H ; Output port, mask XYRELL DE,0,32 LD HL,NORMEM+4096 LD A,4 ; Color 0, intensity 4 OUT (C),E ; Interrupt line 0 EI HALT ; Wait for interrupt ; A2777 DI OUT (COL0R),A ; Intensity 4 INC A OUT (COL1R),A ; Intensity 5 INC A OUT (COL2R),A ; Intensity 6 INC A OUT (COL3R),A ; Intensity 7 AND B ; Reset to intensity 0 OUT (COL0L),A ; Intensity 0 INC A OUT (COL1L),A ; Intensity 1 INC A OUT (COL2L),A ; Intensity 2 INC A OUT (COL3L),A ; Intensity 3 ADD A,9 ; Intensity 4, next color INC E ; Increment interrupt line # INC E INC E INC E INC E INC E DEC D JP NZ,A27A0 ; Finish 32 bands XYRELL DE,0,32 ; Reset to top LD A,4 ; Reset to color 0, intens 4 A27A0 OUT (C),E ; Line 5,10,15,...155 ; (32 different bands) POP IX ; Clear stack EI HALT ; Wait for next interrupt ; ; Rainbow pixel pattern T27A6 DB 0,0,0,0,0 ; Color 0 DB 55H,55H,55H,55H,55H ; Color 1 DB 0AAH,0AAH,0AAH,0AAH,0AAH ; Color 2 DB 0FFH,0FFH,0FFH,0FFH,0FFH ; Color 3 ; ; Special Routine 8 Enter Machine Code From Keypad A27BA CALL A24FF ; Set colors CALL A2516 ; "ENTR 4-DIGT HEX" SYSSUK STRDIS DB 4 DB 50 DB 00001100B DW T248B ; 'STRT ADDR' LD A,1 ; Get 4 digits CALL A2571 PUSH HL ; Save start PUSH HL CALL A25CF CALL A24FF SYSSUK STRDIS DB 4 DB 40 DB 00001100B DW T2495 ; 'ENTR 2-DIGT HEX' SYSSUK STRDIS DB 4 DB 50 DB 00001100B DW T24A5 ; 'DATA' SYSSUK STRDIS DB 4 DB 90 DB 00001100B DW T24F3 ; '"GO" TO RUN' A27E9 CALL A25CF ; Delay XOR A ; Get 2 digits CALL A2571 LD A,B CP 24 JR NZ,A27F8 POP HL ; "GO" key POP HL JP (HL) ; A27F8 POP DE LD A,H LD (DE),A INC DE PUSH DE JR A27E9 ; DB 37H ; Checksum byte ; ; END ; End of program