Difference between revisions of "Homebrew:RAM test"
(Created page with "Used to test the Multi-Cart on board RAM which is placed on the same address location as the SABA 20 Chess game. Reason for this is that this cart was used as a donor for the ...") |
|||
Line 6: | Line 6: | ||
However, after building over 100 carts there has never been any errors in the cart RAM. | However, after building over 100 carts there has never been any errors in the cart RAM. | ||
+ | |||
+ | [[:File:Ramtest.bin|Download binary]] | ||
+ | |||
+ | <pre> | ||
+ | processor f8 | ||
+ | |||
+ | pushk = $0107 ; used to allow more subroutine stack space | ||
+ | popk = $011e | ||
+ | |||
+ | |||
+ | IF 0 | ||
+ | |||
+ | *************************************************** | ||
+ | * * | ||
+ | * Program to test 2kByte RAM at $2800-$2FFF * | ||
+ | * * | ||
+ | * Written by Fredric Blåholtz 2004-12-17 * | ||
+ | * * | ||
+ | * Thanks to Sean Riddle for support * | ||
+ | * * | ||
+ | * Bad RAM is marked by a red pixel * | ||
+ | * * | ||
+ | *************************************************** | ||
+ | |||
+ | ENDIF | ||
+ | |||
+ | |||
+ | ; r0 - 32 byte rows counter | ||
+ | ; r1 - 64 byte columns counter | ||
+ | ; r2 - current testvalue | ||
+ | ; r3 - counter to draw Lines | ||
+ | ; r4 - color in plot routine $00 green, $40 red, $80 blue, $C0 background | ||
+ | ; r5 - x-coordinate in plot [0,101] | ||
+ | ; r6 - y-coordinate in plot [0,57] | ||
+ | ; r7 - used by the BIOS_PUSH_K and BIOS_POP_K | ||
+ | ; r8 - width RAMpic | ||
+ | ; r9 - temp storage in faulty routine | ||
+ | ; r10 HU - DC0 copy in faulty routine | ||
+ | ; r11 HL - DC0 copy in faulty routine | ||
+ | ; r12 KU | ||
+ | ; r13 KL used by pushk and popk | ||
+ | |||
+ | ; r14 QU - r5 backup in faulty routine | ||
+ | ; r15 QL - r6 backup in faulty routine | ||
+ | |||
+ | |||
+ | org $0800 | ||
+ | |||
+ | CartridgeStart: LR $5,A ; 0800 55 | ||
+ | NOP ; 0801 2b | ||
+ | CartridgeEntry: LIS $0 ; init the h/w | ||
+ | OUTS 1 | ||
+ | OUTS 4 | ||
+ | OUTS 5 | ||
+ | OUTS 0 | ||
+ | |||
+ | LISU 4 ; Set r32 = complement flag to 0 | ||
+ | LISL 0 | ||
+ | LR S, A | ||
+ | ; setup screen | ||
+ | LI $21 | ||
+ | LR 3,A | ||
+ | PI $00d0 ; BIOS clearscreen routine, uses R3 to set palette | ||
+ | |||
+ | ; Intro screen: | ||
+ | ; B/W | ||
+ | ; "Multi-Cart RAM test | ||
+ | ; by Fredric Blåholtz | ||
+ | ; no copyrights in 2004" | ||
+ | |||
+ | |||
+ | ; Backup Pac-Man score | ||
+ | ; 2E00 - 2E05 | ||
+ | ; Backup current latch value (reset starts this game) | ||
+ | ; 2E06 | ||
+ | |||
+ | dci $2E00 | ||
+ | lisl 0 | ||
+ | lisu 3 | ||
+ | ; set register 'O'30 | ||
+ | lm ; $2E00 | ||
+ | lr I, A ; 30 | ||
+ | lm ; $2E01 | ||
+ | lr I, A ; 31 | ||
+ | lm ; $2E02 | ||
+ | lr I, A ; 32 | ||
+ | lm ; $2E03 | ||
+ | lr I, A ; 33 | ||
+ | lm ; $2E04 | ||
+ | lr I, A ; 34 | ||
+ | lm ; $2E05 | ||
+ | lr I, A ; 35 | ||
+ | lm ; $2E06 | ||
+ | lr I, A ; 36 | ||
+ | |||
+ | ; BACKUP IS DONE | ||
+ | |||
+ | |||
+ | DCI introtext | ||
+ | introrepeat: LM | ||
+ | CI 255 ; compare to 255 - which is end of data marker | ||
+ | BZ endofintro ; go to end if it was 255 | ||
+ | LR 5,A ; read and save x coordinate | ||
+ | LM | ||
+ | LR 6,A ; read and save y coordinate | ||
+ | PI plot | ||
+ | |||
+ | LI 4 ; intro draw delay | ||
+ | LR 6,A | ||
+ | LI $ff | ||
+ | testdelay: AI $FF | ||
+ | BNZ testdelay | ||
+ | DS 6 | ||
+ | BZ introrepeat | ||
+ | LI $FF | ||
+ | BR testdelay | ||
+ | |||
+ | endofintro: | ||
+ | |||
+ | |||
+ | |||
+ | ; wait a moment | ||
+ | |||
+ | |||
+ | LI $ff | ||
+ | LR 5,A | ||
+ | introwait: AI $FF | ||
+ | BNZ introwait | ||
+ | AS 5 | ||
+ | BZ endintrowait | ||
+ | DS 5 | ||
+ | LI $ff | ||
+ | BR introwait | ||
+ | |||
+ | endintrowait: | ||
+ | |||
+ | |||
+ | |||
+ | ; erase text | ||
+ | |||
+ | LI $c0 ; plot color to bg color | ||
+ | LR 4,A | ||
+ | |||
+ | DCI introtext | ||
+ | introrepeat2: LM | ||
+ | CI 255 ; compare to 255 - which is end of data marker | ||
+ | BZ endofintro2 ; go to end if it was 255 | ||
+ | LR 5,A ; read and save x coordinate | ||
+ | LM | ||
+ | LR 6,A ; read and save y coordinate | ||
+ | PI plot | ||
+ | |||
+ | LI $ff ; erase delay | ||
+ | testdelay2: AI $FF | ||
+ | BNZ testdelay2 | ||
+ | BZ introrepeat2 | ||
+ | LI $FF | ||
+ | BR testdelay2 | ||
+ | |||
+ | endofintro2: | ||
+ | |||
+ | |||
+ | |||
+ | |||
+ | ; blue frame around test area of 32*64 pixels | ||
+ | ; setup screen | ||
+ | LI $86 | ||
+ | LR 3,A | ||
+ | PI $00d0 ; BIOS clearscreen routine, uses R3 to set bkg color | ||
+ | |||
+ | |||
+ | |||
+ | |||
+ | |||
+ | PI drawBord | ||
+ | |||
+ | |||
+ | ; four grey areas that represents the four chips of the | ||
+ | |||
+ | LI $C0 | ||
+ | LR 4,A ; set bgcolor to plotcolor | ||
+ | LI 25 | ||
+ | LR 5,A ; set column start value for RAMpic | ||
+ | PI RAMpic | ||
+ | |||
+ | LI 44 | ||
+ | LR 5,A ; set column start value for RAMpic | ||
+ | PI RAMpic | ||
+ | |||
+ | LI 63 | ||
+ | LR 5,A ; set column start value for RAMpic | ||
+ | PI RAMpic | ||
+ | |||
+ | LI 80 | ||
+ | LR 5,A ; set column start value for RAMpic | ||
+ | PI RAMpic | ||
+ | |||
+ | |||
+ | |||
+ | |||
+ | PI loopinit | ||
+ | LI $AA | ||
+ | LR 2,A ; store current testbyte in R2 since PI messes up A | ||
+ | PI writetestdata ; write what's in R2 to all RAM bytes | ||
+ | PI loopinit ; set pointer back to beginning | ||
+ | PI readtest ; read all RAM to see if they're equal to R2 | ||
+ | |||
+ | ; if there's no error paint all green | ||
+ | ; and it doesn't change if there's no error | ||
+ | |||
+ | |||
+ | |||
+ | |||
+ | LIS 0 | ||
+ | LR 4,A ; set green to plotcolor | ||
+ | LI 25 | ||
+ | LR 5,A ; set column start value for RAMpic | ||
+ | PI RAMpic | ||
+ | |||
+ | LI 44 | ||
+ | LR 5,A ; set column start value for RAMpic | ||
+ | PI RAMpic | ||
+ | |||
+ | LI 63 | ||
+ | LR 5,A ; set column start value for RAMpic | ||
+ | PI RAMpic | ||
+ | |||
+ | LI 80 | ||
+ | LR 5,A ; set column start value for RAMpic | ||
+ | PI RAMpic | ||
+ | |||
+ | |||
+ | ; first speedtest done | ||
+ | |||
+ | PI loopinit | ||
+ | LI $55 | ||
+ | LR 2,A | ||
+ | PI writetestdata | ||
+ | PI loopinit | ||
+ | PI readtest | ||
+ | |||
+ | ; second speedtest done, speedy test over | ||
+ | |||
+ | ;endoffast: BR endoffast | ||
+ | |||
+ | |||
+ | |||
+ | ;*************** Slow and thorough test: | ||
+ | |||
+ | |||
+ | LI $FF ; this time we start at the top and | ||
+ | LR 2,A ; loop through all bitpatterns | ||
+ | allbits: LR A,2 | ||
+ | PI loopinit | ||
+ | PI writetestdata | ||
+ | PI loopinit | ||
+ | PI readtest | ||
+ | |||
+ | |||
+ | DS 2 ; decrease R2 | ||
+ | BNZ allbits ; if it's not zero do again | ||
+ | |||
+ | PI loopinit ; one last pass on zero as well | ||
+ | PI writetestdata | ||
+ | PI loopinit | ||
+ | PI readtest | ||
+ | |||
+ | |||
+ | endoftest: JMP allok ; everythingsOK | ||
+ | |||
+ | |||
+ | |||
+ | |||
+ | |||
+ | |||
+ | loopinit: | ||
+ | |||
+ | |||
+ | DCI $2800 ; RAM start adress | ||
+ | |||
+ | ; we've got 2048 bytes to write ( $800 ) | ||
+ | ; spin around 32 times in a 63-0 loop | ||
+ | |||
+ | LI 63 ; A = 63 | ||
+ | LR 1,A ; 63 store in R1 | ||
+ | LI 32 ; We're doing it 32 times | ||
+ | LR 0,A ; store in R0 | ||
+ | LI 82 | ||
+ | LR 5,A ; set start column of graphics in R5 | ||
+ | LI 36 | ||
+ | LR 6,A ; set start row of graphics in R6 | ||
+ | |||
+ | pop | ||
+ | |||
+ | |||
+ | |||
+ | ;**************** subroutine writetestdata | ||
+ | |||
+ | |||
+ | writetestdata: | ||
+ | |||
+ | LR K,P | ||
+ | ;PI pushk | ||
+ | |||
+ | LI $80 ; set color to blue | ||
+ | LR 4,A | ||
+ | LR A,2 ; load testvalue into A | ||
+ | BR writeloop | ||
+ | next64: | ||
+ | |||
+ | ST | ||
+ | PI plot ; plot last byte dot | ||
+ | |||
+ | DS 6 ; decrease graphics row | ||
+ | LI 83 | ||
+ | LR 5,A ; set column to start of row | ||
+ | DS 0 ; decrease R0, one less round to run | ||
+ | BZ donewrite | ||
+ | LI 64 | ||
+ | LR 1,A ; set R1 back to 63 for next chunk of 64 bytes | ||
+ | LR A,2 ; restore test value | ||
+ | |||
+ | writeagain: | ||
+ | DS 5 ; decrease x-counter | ||
+ | DS 1 ; decrease R1, count down 64 | ||
+ | BZ next64 | ||
+ | |||
+ | |||
+ | writeloop: ST ; Store data in RAM | ||
+ | PI plot ; plot dot | ||
+ | |||
+ | LR A,2 ; restore testvalue | ||
+ | BR writeagain | ||
+ | |||
+ | donewrite: ;PI popk | ||
+ | PK | ||
+ | |||
+ | |||
+ | |||
+ | |||
+ | ;******************* subroutine readtest | ||
+ | |||
+ | |||
+ | readtest: | ||
+ | |||
+ | LR K,P | ||
+ | PI pushk | ||
+ | |||
+ | LIS 0 | ||
+ | LR 4,A ; Set color to green (means OK) | ||
+ | LR A,2 ; load testvalue into A | ||
+ | BR readloop | ||
+ | read64: | ||
+ | LR H,DC ; Backup DC0 for errorhandling | ||
+ | CM ; compares to memory, dc0 is increased | ||
+ | BNZ error ; tests last byte of the row | ||
+ | PI plot ; plot last byte dot | ||
+ | |||
+ | jumpback: DS 6 ; decrease graphics row | ||
+ | LI 83 | ||
+ | LR 5,A ; set column to start of row | ||
+ | DS 0 ; decrease R0, one less round to run | ||
+ | BZ allread | ||
+ | |||
+ | LI 64 | ||
+ | LR 1,A ; set R1 back to 63 for next chunk of 64 bytes | ||
+ | LR A,2 ; restore test value | ||
+ | |||
+ | continue: LR A,2 ; restore testvalue | ||
+ | |||
+ | DS 5 ; decrease x-counter | ||
+ | DS 1 ; decrease R1, count down 64 | ||
+ | BZ read64 | ||
+ | |||
+ | ; memo - perhaps backup DC before read, to use with error handling | ||
+ | |||
+ | readloop: LR H,DC ; Backup DC in case of error | ||
+ | CM ; Compare A with data from adress adressed by DC0, DC0 is then incremented | ||
+ | BNZ error ; jump to error handling if they weren't equal | ||
+ | PI plot ; plot dot | ||
+ | LR A,2 ; restore testvalue | ||
+ | BR continue | ||
+ | |||
+ | allread: PI popk | ||
+ | PK | ||
+ | |||
+ | |||
+ | error: LI $40 | ||
+ | LR 4,A ; set color to red, malfunction | ||
+ | PI plot ; plot red dot | ||
+ | |||
+ | JMP malfunction | ||
+ | |||
+ | enderror: LR A,2 ; restore testvalue | ||
+ | BR continue ; back into loop | ||
+ | |||
+ | |||
+ | |||
+ | |||
+ | |||
+ | ;--------------; | ||
+ | ; Draw Border ; | ||
+ | ;--------------; | ||
+ | |||
+ | ; draws the border around the test area | ||
+ | |||
+ | drawBord: | ||
+ | LR K,P | ||
+ | ;PI pushk | ||
+ | |||
+ | LI $80 ; set border color to blue | ||
+ | LR 4, A | ||
+ | |||
+ | ; start row loop | ||
+ | LI 57 | ||
+ | LR 6, A | ||
+ | .drawBordLRow: | ||
+ | LI 17 | ||
+ | LR 5, A | ||
+ | .drawBordLColumn: | ||
+ | PI plot | ||
+ | |||
+ | .drawBordLCheck: | ||
+ | DS 5 | ||
+ | LR A, 5 | ||
+ | BNZ .drawBordLColumn | ||
+ | PI plot | ||
+ | DS 6 | ||
+ | BP .drawBordLRow | ||
+ | .drawBordLEnd: | ||
+ | |||
+ | |||
+ | ; start row loop | ||
+ | LI 57 | ||
+ | LR 6, A | ||
+ | .drawBordRRow: | ||
+ | LI 101 | ||
+ | LR 5, A | ||
+ | .drawBordRColumn: | ||
+ | PI plot | ||
+ | |||
+ | .drawBordRCheck: | ||
+ | DS 5 | ||
+ | LR A, 5 | ||
+ | XI %01010011 ; 01010100 : 17 pixels wide, 01010101: 16, 01011000: 13 101-X= width | ||
+ | BNZ .drawBordRColumn | ||
+ | DS 6 | ||
+ | BP .drawBordRRow | ||
+ | .drawBordREnd: | ||
+ | |||
+ | |||
+ | ; start row loop | ||
+ | LI 57 ; Row | ||
+ | LR 6, A | ||
+ | ;Last 20 rows to write | ||
+ | LI 19 ; decimal 19 | ||
+ | LR 3,A | ||
+ | .dLowBarColumn: | ||
+ | LI 83 | ||
+ | LR 5,A ;Column | ||
+ | .dLowBarRow: | ||
+ | PI plot | ||
+ | |||
+ | .dLowBarCheck: | ||
+ | DS 5 | ||
+ | BNZ .dLowBarRow | ||
+ | DS 6 | ||
+ | DS 3 | ||
+ | BP .dLowBarColumn | ||
+ | .dLowBarEnd: | ||
+ | |||
+ | |||
+ | ; start row loop | ||
+ | LI 3 ; Row | ||
+ | LR 6, A | ||
+ | ;Upper 4 rows to write | ||
+ | LI 3 ; decimal 3 | ||
+ | LR 3,A | ||
+ | .dTopBarColumn: | ||
+ | LI 83 | ||
+ | LR 5,A ;Column | ||
+ | .dTopBarRow: | ||
+ | PI plot | ||
+ | |||
+ | .dTopBarCheck: | ||
+ | DS 5 | ||
+ | BNZ .dTopBarRow | ||
+ | DS 6 | ||
+ | DS 3 | ||
+ | BP .dTopBarColumn | ||
+ | .dTopBarEnd: | ||
+ | |||
+ | .dBorderLEnd: | ||
+ | PK | ||
+ | |||
+ | |||
+ | ;*********************************** Draw DIL pics | ||
+ | |||
+ | |||
+ | RAMpic: | ||
+ | LR K,P | ||
+ | ; start row loop | ||
+ | LI 55 ; Row | ||
+ | LR 6, A | ||
+ | LR A,5 | ||
+ | LR 7,A ; temp store value of R5 in R7 | ||
+ | |||
+ | LI 14 ; 15 rows | ||
+ | LR 3,A | ||
+ | |||
+ | .RamPicColumn: | ||
+ | LR A,7 ; Set back to start column | ||
+ | LR 5,A ; Column | ||
+ | LIS 5 | ||
+ | LR 8,A ; 5 pixels wide | ||
+ | |||
+ | .RamPicRow: | ||
+ | PI plot | ||
+ | |||
+ | .RamPicCheck: | ||
+ | DS 5 | ||
+ | LR A, 5 | ||
+ | DS 8 | ||
+ | BNZ .RamPicRow | ||
+ | DS 6 | ||
+ | DS 3 | ||
+ | BP .RamPicColumn | ||
+ | .RamPicEnd: | ||
+ | |||
+ | |||
+ | PK | ||
+ | |||
+ | |||
+ | |||
+ | |||
+ | |||
+ | |||
+ | ;===================; | ||
+ | ; Drawing Functions ; | ||
+ | ;===================; | ||
+ | |||
+ | ; plot out a single point on the screen | ||
+ | ; uses three registers as "arguments" | ||
+ | ; r4 = color, $40 red, $80 blue, $00 green, $C0 background | ||
+ | ; r5 = x (to screen) (0-101) | ||
+ | ; r6 = y (to screen) (0-57) | ||
+ | |||
+ | plot: | ||
+ | |||
+ | |||
+ | |||
+ | |||
+ | ; set the color using r4 | ||
+ | LR A, 4 | ||
+ | outs 1 | ||
+ | |||
+ | ; set the column using r5 | ||
+ | lis 4 | ||
+ | as 5 | ||
+ | ; LR A, 5 | ||
+ | ; AI 4 | ||
+ | COM | ||
+ | outs 4 | ||
+ | |||
+ | ; set the row using r6 | ||
+ | lis 4 | ||
+ | as 6 | ||
+ | ; LR A, 6 | ||
+ | ; AI 4 | ||
+ | COM | ||
+ | outs 5 | ||
+ | |||
+ | ; transfer data to the screen memory | ||
+ | LI $60 | ||
+ | outs 0 | ||
+ | LI $50 | ||
+ | outs 0 | ||
+ | |||
+ | ; delay until it's fully updated | ||
+ | LIS 4 ; same as bowling - the disappearing ball... | ||
+ | .plotDelay: | ||
+ | AI $ff | ||
+ | bnz .plotDelay | ||
+ | |||
+ | pop | ||
+ | |||
+ | |||
+ | |||
+ | |||
+ | |||
+ | org $C00 | ||
+ | |||
+ | malfunction: | ||
+ | ; Check what adress error is on, change color of chip to red | ||
+ | ; need to decrease DC0 to get the last read byte | ||
+ | |||
+ | |||
+ | |||
+ | ; mask out what chip has the faulty byte/bit and mark it | ||
+ | |||
+ | |||
+ | ; Chips 0 - 3. 0 and 2 is RAM at $2800-$2bff, and Chip 1 and 3 is RAM at $2c00-2fff | ||
+ | ; Low nibble are chips 0 and 1, high nibble chips 2 and 3. | ||
+ | |||
+ | |||
+ | LR A,5 | ||
+ | LR QU,A ; backup r5 in r14, x-coordinate for plot | ||
+ | LR A,6 | ||
+ | LR QL,A ; backup r6 in r15, y-coordinate for plot | ||
+ | |||
+ | ; don't want these to be overwritten by the DIL plot | ||
+ | |||
+ | |||
+ | skiphu: LR A,HU ; copy upper byte of adress to A | ||
+ | CI $2C | ||
+ | BM Chip0 ; compare to 2c, if negative HU:[2D,2F] it's high RAM | ||
+ | BZ Chip0 ; if it's zero it's also high RAM HU = 2C | ||
+ | |||
+ | |||
+ | |||
+ | ; Chip 0 and Chip 2 is low RAM, but what nibble is faulty? | ||
+ | ; Chip 0 is low nibble | ||
+ | |||
+ | LR A,2 ; copy testvalue into A | ||
+ | |||
+ | LR DC,H ; copies H into DC | ||
+ | |||
+ | ; determine if low or high nibble is faulty | ||
+ | NI $F ; Accumulator AND $0F, (keep only low nibble) | ||
+ | LR 9,A ; store result in R9 | ||
+ | LI $F ; A = $F | ||
+ | NM ; A AND readbyte, reads memory and ANDs it, DC0 is increased | ||
+ | |||
+ | ; now we need to compare if A and R9 is the same | ||
+ | ; if they are the same the low nibble is OK - | ||
+ | ; which means the high nibble must be faulty = Chip 3 | ||
+ | ; Branch to Chip 3 if R9 and A are equal | ||
+ | ; compare R9 and A | ||
+ | ; R7 AND and | ||
+ | |||
+ | XS 9 ; A XOR R9 | ||
+ | |||
+ | BZ Chip3 ; If the result is zero => Chip 2 faulty | ||
+ | ; else it's Chip 0... and I do nothing | ||
+ | |||
+ | Chip1: LI 25 | ||
+ | LR 5,A ; set column start value for RAMpic | ||
+ | PI RAMpic | ||
+ | |||
+ | JMP endoferrors ; continue test | ||
+ | |||
+ | Chip3: LI 63 | ||
+ | LR 5,A ; set column start value for RAMpic | ||
+ | PI RAMpic | ||
+ | |||
+ | JMP endoferrors ; continue testing | ||
+ | |||
+ | |||
+ | |||
+ | |||
+ | |||
+ | Chip0: | ||
+ | |||
+ | ; Chip 1 and Chip 3 is high RAM, but what nibble is faulty? | ||
+ | ; Chip 1 is low nibble | ||
+ | |||
+ | LR A,2 ; copy testvalue into A | ||
+ | |||
+ | LR DC,H ; copies H into DC | ||
+ | |||
+ | ; determine if low or high nibble is faulty | ||
+ | NI $F ; ByteWritten AND $0F, keeps low nibble | ||
+ | LR 9,A ; store result in R9 | ||
+ | LI $F ; A = $F | ||
+ | NM ; A AND readbyte, reads memory and ANDs it, DC0 is increased | ||
+ | |||
+ | ; now we need to compare if A and R9 is the same | ||
+ | ; if they are the same the low nibble is OK - | ||
+ | ; which means the high nibble must be faulty = Chip 3 faulty | ||
+ | ; Branch to Chip 2 if R9 and A are equal | ||
+ | ; compare R9 and A | ||
+ | |||
+ | XS 9 ; A XOR R9 | ||
+ | |||
+ | BZ Chip2 ; If the result is zero => Chip3 faulty | ||
+ | ; else it's Chip1... and I do nothing | ||
+ | |||
+ | ; DC is now same as when entering | ||
+ | |||
+ | |||
+ | Chip_0: LI 44 | ||
+ | LR 5,A ; set column start value for RAMpic | ||
+ | PI RAMpic | ||
+ | |||
+ | JMP endoferrors | ||
+ | |||
+ | |||
+ | Chip2: LI 80 | ||
+ | LR 5,A ; set column start value for RAMpic | ||
+ | PI RAMpic | ||
+ | |||
+ | endoferrors: LR A,QU | ||
+ | LR 5,A ; restore r5 from r14 | ||
+ | LR A,QL | ||
+ | LR 6,A ; restore r6 from r15 | ||
+ | LIS 0 | ||
+ | LR 4,A ; set color back to green | ||
+ | LR DC,H ; | ||
+ | CM ; restore DC0 adress | ||
+ | |||
+ | |||
+ | ; if we where at the end of the row, go to jumpback instead | ||
+ | ; if R1 is 0 -> jumpback | ||
+ | LIS 0 | ||
+ | AS 1 | ||
+ | BZ lastonrow | ||
+ | |||
+ | JMP enderror ; continue testing from where we left off | ||
+ | |||
+ | lastonrow: JMP jumpback ; | ||
+ | |||
+ | |||
+ | ; data for paiting up intro screen | ||
+ | ; M | ||
+ | introtext: dc.b 8,12,8,11,8,10,8,9,8,8,8,7,8,6,9,7,9,8,10,9,10,10,10,11 | ||
+ | dc.b 11,12,12,11,12,10,12,9,13,8,13,7,14,6,14,7,14,8,14,9,14,10 | ||
+ | dc.b 14,11,14,12 | ||
+ | ; u | ||
+ | dc.b 16,8,16,9,16,10,16,11,17,12,18,12,19,8,19,9,19,10,19,11,19,12 | ||
+ | ; l | ||
+ | dc.b 21,6,21,7,21,8,21,9,21,10,21,11,21,12 | ||
+ | ; t | ||
+ | dc.b 23,7,23,8,23,9,23,10,23,11,23,12,24,12,22,8,23,8,24,8 | ||
+ | ; i | ||
+ | dc.b 26,8,26,9,26,10,26,11,26,12,26,6 | ||
+ | ; - | ||
+ | dc.b 28,10,29,10 | ||
+ | ; C | ||
+ | dc.b 34,6,33,6,32,6,31,7,31,8,31,9,31,10,31,11,32,12,33,12,34,12 | ||
+ | dc.b 35,11,35,7 | ||
+ | ; a | ||
+ | dc.b 37,8,38,8,39,8,40,8,40,9,40,10,40,11,40,12,39,10,38,10,37,11 | ||
+ | dc.b 37,12,38,12,39,12,40,12 | ||
+ | ; r | ||
+ | dc.b 42,8,42,9,42,10,42,11,42,12,44,8,43,9 | ||
+ | ; t | ||
+ | dc.b 45,7,45,8,45,9,45,10,45,11,45,12,46,12,44,8,45,8,46,8 | ||
+ | |||
+ | ; R | ||
+ | dc.b 52,6,52,7,52,8,52,9,52,10,52,11,52,12,53,6,54,6,55,6,56,7,56,8 | ||
+ | dc.b 55,9,54,9,53,9,55,10,56,11,56,12 | ||
+ | ; A | ||
+ | dc.b 61,6,60,7,60,8,59,9,59,10,59,11,58,12,61,6,62,7,62,8,63,9,63,10 | ||
+ | dc.b 63,11,64,12,59,10,60,10,61,10,62,10,63,10 | ||
+ | ; M | ||
+ | dc.b 65,6,65,7,65,8,65,9,65,10,65,11,65,12,66,7,66,8,67,9,67,10,67,11 | ||
+ | dc.b 68,12,69,11,69,10,69,9,70,8,70,7,71,6,71,7,71,8,71,9,71,10,71,11 | ||
+ | dc.b 71,12 | ||
+ | ; t | ||
+ | dc.b 75,7,75,8,75,9,75,10,75,11,75,12,76,12,74,8,75,8,76,8 | ||
+ | ; e | ||
+ | dc.b 79,10,80,10,81,10,81,9,80,8,79,8,78,9,78,10,78,11 | ||
+ | dc.b 79,12,80,12,81,12 | ||
+ | ; s | ||
+ | dc.b 86,8,85,8,84,8,83,9,84,10,85,10,86,11,85,12,84,12,83,12 | ||
+ | ; t | ||
+ | dc.b 88,7,88,8,88,9,88,10,88,11,88,12,87,8,88,8,89,8 | ||
+ | |||
+ | ; b | ||
+ | dc.b 44,18,44,19,44,20,44,21,44,22,44,23,44,24,45,20,46,20 | ||
+ | dc.b 47,21,47,22,47,23,46,24,45,24 | ||
+ | ; y | ||
+ | dc.b 49,20,50,21,50,22,50,23,53,20,52,21,52,22,52,23,51,24,51,25,50,26 | ||
+ | |||
+ | ; F | ||
+ | dc.b 18,30,18,31,18,32,18,33,18,34,18,35,18,36,19,30,20,30,21,30 | ||
+ | dc.b 19,33,20,33 | ||
+ | ; r | ||
+ | dc.b 22,32,22,33,22,34,22,35,22,36,24,32,23,33 | ||
+ | ; e | ||
+ | dc.b 27,34,28,34,29,34,29,33,28,32,27,32,26,33,26,34,26,35 | ||
+ | dc.b 27,36,28,36,29,36 | ||
+ | ; d | ||
+ | dc.b 34,30,34,31,34,32,34,33,34,34,34,35,34,36,33,32,32,32,31,33 | ||
+ | dc.b 31,34,31,35,32,36,33,36 | ||
+ | ; r | ||
+ | dc.b 36,32,36,33,36,34,36,35,36,36,38,32,37,33 | ||
+ | ; i | ||
+ | dc.b 39,32,39,33,39,34,39,35,39,36,39,30 | ||
+ | ; c | ||
+ | dc.b 44,33,43,32,42,32,41,33,41,34,41,35,42,36,43,36,44,35 | ||
+ | |||
+ | ; B | ||
+ | dc.b 50,30,50,31,50,32,50,33,50,34,50,35,50,36,51,30,52,30 | ||
+ | dc.b 53,31,53,32,52,33,51,33,53,34,53,35,52,36,51,36 | ||
+ | ; l | ||
+ | dc.b 55,30,55,31,55,32,55,33,55,34,55,35,55,36 | ||
+ | ; å | ||
+ | dc.b 57,32,58,32,59,32,60,32,60,33,60,34,60,35,60,36,59,34 | ||
+ | dc.b 58,34,57,35,57,36,58,36,59,36,59,28,58,29,59,30,60,29 | ||
+ | ; h | ||
+ | dc.b 62,30,62,31,62,32,62,33,62,34,62,35,62,36,63,32,64,32 | ||
+ | dc.b 65,33,65,34,65,35,65,36 | ||
+ | ; o | ||
+ | dc.b 69,32,68,32,67,33,67,34,67,35,68,36,69,36,70,35,70,34,70,33 | ||
+ | ; l | ||
+ | dc.b 72,30,72,31,72,32,72,33,72,34,72,35,72,36 | ||
+ | ; t | ||
+ | dc.b 74,31,74,32,74,33,74,34,74,35,74,36,75,36,73,32,74,32,75,32 | ||
+ | ; z | ||
+ | dc.b 77,32,78,32,79,32,79,33,78,34,77,35,77,36,78,36,79,36 | ||
+ | |||
+ | ; 2 | ||
+ | dc.b 39,43,40,42,41,42,42,43,42,44,41,45,41,46,40,47 | ||
+ | dc.b 39,48,40,48,41,48,42,48 | ||
+ | ; 0 | ||
+ | dc.b 46,42,45,42,44,43,44,44,44,45,44,46,44,47,45,48,46,48 | ||
+ | dc.b 47,47,47,46,47,45,47,44,47,43 | ||
+ | ; 0 | ||
+ | dc.b 51,42,50,42,49,43,49,44,49,45,49,46,49,47,50,48,51,48 | ||
+ | dc.b 52,47,52,46,52,45,52,44,52,43 | ||
+ | ; 4 | ||
+ | dc.b 57,42,56,43,55,44,54,45,54,46,55,46,56,46,57,46,58,46 | ||
+ | dc.b 57,42,57,43,57,44,57,45,57,46,57,47,57,48 | ||
+ | |||
+ | ; introend | ||
+ | dc.b 255 | ||
+ | |||
+ | org $fe0 | ||
+ | allok: | ||
+ | ; RESTORE DATA | ||
+ | dci $2E00 | ||
+ | lisl 0 | ||
+ | lisu 3 ; set register 'O'30 | ||
+ | lr A, I ; 30 | ||
+ | st | ||
+ | lr A, I ; 31 | ||
+ | st | ||
+ | lr A, I ; 32 | ||
+ | st | ||
+ | lr A, I ; 33 | ||
+ | st | ||
+ | lr A, I ; 34 | ||
+ | st | ||
+ | lr A, I ; 35 | ||
+ | st | ||
+ | lr A, I ; 36 | ||
+ | st | ||
+ | |||
+ | |||
+ | lock_up_loop: | ||
+ | BR lock_up_loop | ||
+ | |||
+ | |||
+ | org $fff | ||
+ | .byte $fb | ||
+ | |||
+ | </pre> |
Latest revision as of 15:11, 15 March 2019
Used to test the Multi-Cart on board RAM which is placed on the same address location as the SABA 20 Chess game. Reason for this is that this cart was used as a donor for the early Multi-Carts and a test was needed to check that it was OK before sent out to a happy gamer.
Program is run with a nice colorful interface, every memory bit (2048 of them) of the cart RAM is represented by a pixel in the large rectangle in the middle. When tested it's blue, when green it was tested OK and if red it was bad. A full test takes a few minutes because the graphics updated for each bit, a blind test would be a lot faster.
Latest version makes a quick test writing and reading back %10101010 and %01010101 before turning all four RAM capsules green to indicate that these are OK, then a full write and read test is preformed from %00000000 to %11111111 and if there's an error the corresponding RAM capsule is marked in red as well as the bit. For later carts a single 6116 SRAM is used instead so if there's any error at all the whole capsule needs to be replaced.
However, after building over 100 carts there has never been any errors in the cart RAM.
processor f8 pushk = $0107 ; used to allow more subroutine stack space popk = $011e IF 0 *************************************************** * * * Program to test 2kByte RAM at $2800-$2FFF * * * * Written by Fredric Blåholtz 2004-12-17 * * * * Thanks to Sean Riddle for support * * * * Bad RAM is marked by a red pixel * * * *************************************************** ENDIF ; r0 - 32 byte rows counter ; r1 - 64 byte columns counter ; r2 - current testvalue ; r3 - counter to draw Lines ; r4 - color in plot routine $00 green, $40 red, $80 blue, $C0 background ; r5 - x-coordinate in plot [0,101] ; r6 - y-coordinate in plot [0,57] ; r7 - used by the BIOS_PUSH_K and BIOS_POP_K ; r8 - width RAMpic ; r9 - temp storage in faulty routine ; r10 HU - DC0 copy in faulty routine ; r11 HL - DC0 copy in faulty routine ; r12 KU ; r13 KL used by pushk and popk ; r14 QU - r5 backup in faulty routine ; r15 QL - r6 backup in faulty routine org $0800 CartridgeStart: LR $5,A ; 0800 55 NOP ; 0801 2b CartridgeEntry: LIS $0 ; init the h/w OUTS 1 OUTS 4 OUTS 5 OUTS 0 LISU 4 ; Set r32 = complement flag to 0 LISL 0 LR S, A ; setup screen LI $21 LR 3,A PI $00d0 ; BIOS clearscreen routine, uses R3 to set palette ; Intro screen: ; B/W ; "Multi-Cart RAM test ; by Fredric Blåholtz ; no copyrights in 2004" ; Backup Pac-Man score ; 2E00 - 2E05 ; Backup current latch value (reset starts this game) ; 2E06 dci $2E00 lisl 0 lisu 3 ; set register 'O'30 lm ; $2E00 lr I, A ; 30 lm ; $2E01 lr I, A ; 31 lm ; $2E02 lr I, A ; 32 lm ; $2E03 lr I, A ; 33 lm ; $2E04 lr I, A ; 34 lm ; $2E05 lr I, A ; 35 lm ; $2E06 lr I, A ; 36 ; BACKUP IS DONE DCI introtext introrepeat: LM CI 255 ; compare to 255 - which is end of data marker BZ endofintro ; go to end if it was 255 LR 5,A ; read and save x coordinate LM LR 6,A ; read and save y coordinate PI plot LI 4 ; intro draw delay LR 6,A LI $ff testdelay: AI $FF BNZ testdelay DS 6 BZ introrepeat LI $FF BR testdelay endofintro: ; wait a moment LI $ff LR 5,A introwait: AI $FF BNZ introwait AS 5 BZ endintrowait DS 5 LI $ff BR introwait endintrowait: ; erase text LI $c0 ; plot color to bg color LR 4,A DCI introtext introrepeat2: LM CI 255 ; compare to 255 - which is end of data marker BZ endofintro2 ; go to end if it was 255 LR 5,A ; read and save x coordinate LM LR 6,A ; read and save y coordinate PI plot LI $ff ; erase delay testdelay2: AI $FF BNZ testdelay2 BZ introrepeat2 LI $FF BR testdelay2 endofintro2: ; blue frame around test area of 32*64 pixels ; setup screen LI $86 LR 3,A PI $00d0 ; BIOS clearscreen routine, uses R3 to set bkg color PI drawBord ; four grey areas that represents the four chips of the LI $C0 LR 4,A ; set bgcolor to plotcolor LI 25 LR 5,A ; set column start value for RAMpic PI RAMpic LI 44 LR 5,A ; set column start value for RAMpic PI RAMpic LI 63 LR 5,A ; set column start value for RAMpic PI RAMpic LI 80 LR 5,A ; set column start value for RAMpic PI RAMpic PI loopinit LI $AA LR 2,A ; store current testbyte in R2 since PI messes up A PI writetestdata ; write what's in R2 to all RAM bytes PI loopinit ; set pointer back to beginning PI readtest ; read all RAM to see if they're equal to R2 ; if there's no error paint all green ; and it doesn't change if there's no error LIS 0 LR 4,A ; set green to plotcolor LI 25 LR 5,A ; set column start value for RAMpic PI RAMpic LI 44 LR 5,A ; set column start value for RAMpic PI RAMpic LI 63 LR 5,A ; set column start value for RAMpic PI RAMpic LI 80 LR 5,A ; set column start value for RAMpic PI RAMpic ; first speedtest done PI loopinit LI $55 LR 2,A PI writetestdata PI loopinit PI readtest ; second speedtest done, speedy test over ;endoffast: BR endoffast ;*************** Slow and thorough test: LI $FF ; this time we start at the top and LR 2,A ; loop through all bitpatterns allbits: LR A,2 PI loopinit PI writetestdata PI loopinit PI readtest DS 2 ; decrease R2 BNZ allbits ; if it's not zero do again PI loopinit ; one last pass on zero as well PI writetestdata PI loopinit PI readtest endoftest: JMP allok ; everythingsOK loopinit: DCI $2800 ; RAM start adress ; we've got 2048 bytes to write ( $800 ) ; spin around 32 times in a 63-0 loop LI 63 ; A = 63 LR 1,A ; 63 store in R1 LI 32 ; We're doing it 32 times LR 0,A ; store in R0 LI 82 LR 5,A ; set start column of graphics in R5 LI 36 LR 6,A ; set start row of graphics in R6 pop ;**************** subroutine writetestdata writetestdata: LR K,P ;PI pushk LI $80 ; set color to blue LR 4,A LR A,2 ; load testvalue into A BR writeloop next64: ST PI plot ; plot last byte dot DS 6 ; decrease graphics row LI 83 LR 5,A ; set column to start of row DS 0 ; decrease R0, one less round to run BZ donewrite LI 64 LR 1,A ; set R1 back to 63 for next chunk of 64 bytes LR A,2 ; restore test value writeagain: DS 5 ; decrease x-counter DS 1 ; decrease R1, count down 64 BZ next64 writeloop: ST ; Store data in RAM PI plot ; plot dot LR A,2 ; restore testvalue BR writeagain donewrite: ;PI popk PK ;******************* subroutine readtest readtest: LR K,P PI pushk LIS 0 LR 4,A ; Set color to green (means OK) LR A,2 ; load testvalue into A BR readloop read64: LR H,DC ; Backup DC0 for errorhandling CM ; compares to memory, dc0 is increased BNZ error ; tests last byte of the row PI plot ; plot last byte dot jumpback: DS 6 ; decrease graphics row LI 83 LR 5,A ; set column to start of row DS 0 ; decrease R0, one less round to run BZ allread LI 64 LR 1,A ; set R1 back to 63 for next chunk of 64 bytes LR A,2 ; restore test value continue: LR A,2 ; restore testvalue DS 5 ; decrease x-counter DS 1 ; decrease R1, count down 64 BZ read64 ; memo - perhaps backup DC before read, to use with error handling readloop: LR H,DC ; Backup DC in case of error CM ; Compare A with data from adress adressed by DC0, DC0 is then incremented BNZ error ; jump to error handling if they weren't equal PI plot ; plot dot LR A,2 ; restore testvalue BR continue allread: PI popk PK error: LI $40 LR 4,A ; set color to red, malfunction PI plot ; plot red dot JMP malfunction enderror: LR A,2 ; restore testvalue BR continue ; back into loop ;--------------; ; Draw Border ; ;--------------; ; draws the border around the test area drawBord: LR K,P ;PI pushk LI $80 ; set border color to blue LR 4, A ; start row loop LI 57 LR 6, A .drawBordLRow: LI 17 LR 5, A .drawBordLColumn: PI plot .drawBordLCheck: DS 5 LR A, 5 BNZ .drawBordLColumn PI plot DS 6 BP .drawBordLRow .drawBordLEnd: ; start row loop LI 57 LR 6, A .drawBordRRow: LI 101 LR 5, A .drawBordRColumn: PI plot .drawBordRCheck: DS 5 LR A, 5 XI %01010011 ; 01010100 : 17 pixels wide, 01010101: 16, 01011000: 13 101-X= width BNZ .drawBordRColumn DS 6 BP .drawBordRRow .drawBordREnd: ; start row loop LI 57 ; Row LR 6, A ;Last 20 rows to write LI 19 ; decimal 19 LR 3,A .dLowBarColumn: LI 83 LR 5,A ;Column .dLowBarRow: PI plot .dLowBarCheck: DS 5 BNZ .dLowBarRow DS 6 DS 3 BP .dLowBarColumn .dLowBarEnd: ; start row loop LI 3 ; Row LR 6, A ;Upper 4 rows to write LI 3 ; decimal 3 LR 3,A .dTopBarColumn: LI 83 LR 5,A ;Column .dTopBarRow: PI plot .dTopBarCheck: DS 5 BNZ .dTopBarRow DS 6 DS 3 BP .dTopBarColumn .dTopBarEnd: .dBorderLEnd: PK ;*********************************** Draw DIL pics RAMpic: LR K,P ; start row loop LI 55 ; Row LR 6, A LR A,5 LR 7,A ; temp store value of R5 in R7 LI 14 ; 15 rows LR 3,A .RamPicColumn: LR A,7 ; Set back to start column LR 5,A ; Column LIS 5 LR 8,A ; 5 pixels wide .RamPicRow: PI plot .RamPicCheck: DS 5 LR A, 5 DS 8 BNZ .RamPicRow DS 6 DS 3 BP .RamPicColumn .RamPicEnd: PK ;===================; ; Drawing Functions ; ;===================; ; plot out a single point on the screen ; uses three registers as "arguments" ; r4 = color, $40 red, $80 blue, $00 green, $C0 background ; r5 = x (to screen) (0-101) ; r6 = y (to screen) (0-57) plot: ; set the color using r4 LR A, 4 outs 1 ; set the column using r5 lis 4 as 5 ; LR A, 5 ; AI 4 COM outs 4 ; set the row using r6 lis 4 as 6 ; LR A, 6 ; AI 4 COM outs 5 ; transfer data to the screen memory LI $60 outs 0 LI $50 outs 0 ; delay until it's fully updated LIS 4 ; same as bowling - the disappearing ball... .plotDelay: AI $ff bnz .plotDelay pop org $C00 malfunction: ; Check what adress error is on, change color of chip to red ; need to decrease DC0 to get the last read byte ; mask out what chip has the faulty byte/bit and mark it ; Chips 0 - 3. 0 and 2 is RAM at $2800-$2bff, and Chip 1 and 3 is RAM at $2c00-2fff ; Low nibble are chips 0 and 1, high nibble chips 2 and 3. LR A,5 LR QU,A ; backup r5 in r14, x-coordinate for plot LR A,6 LR QL,A ; backup r6 in r15, y-coordinate for plot ; don't want these to be overwritten by the DIL plot skiphu: LR A,HU ; copy upper byte of adress to A CI $2C BM Chip0 ; compare to 2c, if negative HU:[2D,2F] it's high RAM BZ Chip0 ; if it's zero it's also high RAM HU = 2C ; Chip 0 and Chip 2 is low RAM, but what nibble is faulty? ; Chip 0 is low nibble LR A,2 ; copy testvalue into A LR DC,H ; copies H into DC ; determine if low or high nibble is faulty NI $F ; Accumulator AND $0F, (keep only low nibble) LR 9,A ; store result in R9 LI $F ; A = $F NM ; A AND readbyte, reads memory and ANDs it, DC0 is increased ; now we need to compare if A and R9 is the same ; if they are the same the low nibble is OK - ; which means the high nibble must be faulty = Chip 3 ; Branch to Chip 3 if R9 and A are equal ; compare R9 and A ; R7 AND and XS 9 ; A XOR R9 BZ Chip3 ; If the result is zero => Chip 2 faulty ; else it's Chip 0... and I do nothing Chip1: LI 25 LR 5,A ; set column start value for RAMpic PI RAMpic JMP endoferrors ; continue test Chip3: LI 63 LR 5,A ; set column start value for RAMpic PI RAMpic JMP endoferrors ; continue testing Chip0: ; Chip 1 and Chip 3 is high RAM, but what nibble is faulty? ; Chip 1 is low nibble LR A,2 ; copy testvalue into A LR DC,H ; copies H into DC ; determine if low or high nibble is faulty NI $F ; ByteWritten AND $0F, keeps low nibble LR 9,A ; store result in R9 LI $F ; A = $F NM ; A AND readbyte, reads memory and ANDs it, DC0 is increased ; now we need to compare if A and R9 is the same ; if they are the same the low nibble is OK - ; which means the high nibble must be faulty = Chip 3 faulty ; Branch to Chip 2 if R9 and A are equal ; compare R9 and A XS 9 ; A XOR R9 BZ Chip2 ; If the result is zero => Chip3 faulty ; else it's Chip1... and I do nothing ; DC is now same as when entering Chip_0: LI 44 LR 5,A ; set column start value for RAMpic PI RAMpic JMP endoferrors Chip2: LI 80 LR 5,A ; set column start value for RAMpic PI RAMpic endoferrors: LR A,QU LR 5,A ; restore r5 from r14 LR A,QL LR 6,A ; restore r6 from r15 LIS 0 LR 4,A ; set color back to green LR DC,H ; CM ; restore DC0 adress ; if we where at the end of the row, go to jumpback instead ; if R1 is 0 -> jumpback LIS 0 AS 1 BZ lastonrow JMP enderror ; continue testing from where we left off lastonrow: JMP jumpback ; ; data for paiting up intro screen ; M introtext: dc.b 8,12,8,11,8,10,8,9,8,8,8,7,8,6,9,7,9,8,10,9,10,10,10,11 dc.b 11,12,12,11,12,10,12,9,13,8,13,7,14,6,14,7,14,8,14,9,14,10 dc.b 14,11,14,12 ; u dc.b 16,8,16,9,16,10,16,11,17,12,18,12,19,8,19,9,19,10,19,11,19,12 ; l dc.b 21,6,21,7,21,8,21,9,21,10,21,11,21,12 ; t dc.b 23,7,23,8,23,9,23,10,23,11,23,12,24,12,22,8,23,8,24,8 ; i dc.b 26,8,26,9,26,10,26,11,26,12,26,6 ; - dc.b 28,10,29,10 ; C dc.b 34,6,33,6,32,6,31,7,31,8,31,9,31,10,31,11,32,12,33,12,34,12 dc.b 35,11,35,7 ; a dc.b 37,8,38,8,39,8,40,8,40,9,40,10,40,11,40,12,39,10,38,10,37,11 dc.b 37,12,38,12,39,12,40,12 ; r dc.b 42,8,42,9,42,10,42,11,42,12,44,8,43,9 ; t dc.b 45,7,45,8,45,9,45,10,45,11,45,12,46,12,44,8,45,8,46,8 ; R dc.b 52,6,52,7,52,8,52,9,52,10,52,11,52,12,53,6,54,6,55,6,56,7,56,8 dc.b 55,9,54,9,53,9,55,10,56,11,56,12 ; A dc.b 61,6,60,7,60,8,59,9,59,10,59,11,58,12,61,6,62,7,62,8,63,9,63,10 dc.b 63,11,64,12,59,10,60,10,61,10,62,10,63,10 ; M dc.b 65,6,65,7,65,8,65,9,65,10,65,11,65,12,66,7,66,8,67,9,67,10,67,11 dc.b 68,12,69,11,69,10,69,9,70,8,70,7,71,6,71,7,71,8,71,9,71,10,71,11 dc.b 71,12 ; t dc.b 75,7,75,8,75,9,75,10,75,11,75,12,76,12,74,8,75,8,76,8 ; e dc.b 79,10,80,10,81,10,81,9,80,8,79,8,78,9,78,10,78,11 dc.b 79,12,80,12,81,12 ; s dc.b 86,8,85,8,84,8,83,9,84,10,85,10,86,11,85,12,84,12,83,12 ; t dc.b 88,7,88,8,88,9,88,10,88,11,88,12,87,8,88,8,89,8 ; b dc.b 44,18,44,19,44,20,44,21,44,22,44,23,44,24,45,20,46,20 dc.b 47,21,47,22,47,23,46,24,45,24 ; y dc.b 49,20,50,21,50,22,50,23,53,20,52,21,52,22,52,23,51,24,51,25,50,26 ; F dc.b 18,30,18,31,18,32,18,33,18,34,18,35,18,36,19,30,20,30,21,30 dc.b 19,33,20,33 ; r dc.b 22,32,22,33,22,34,22,35,22,36,24,32,23,33 ; e dc.b 27,34,28,34,29,34,29,33,28,32,27,32,26,33,26,34,26,35 dc.b 27,36,28,36,29,36 ; d dc.b 34,30,34,31,34,32,34,33,34,34,34,35,34,36,33,32,32,32,31,33 dc.b 31,34,31,35,32,36,33,36 ; r dc.b 36,32,36,33,36,34,36,35,36,36,38,32,37,33 ; i dc.b 39,32,39,33,39,34,39,35,39,36,39,30 ; c dc.b 44,33,43,32,42,32,41,33,41,34,41,35,42,36,43,36,44,35 ; B dc.b 50,30,50,31,50,32,50,33,50,34,50,35,50,36,51,30,52,30 dc.b 53,31,53,32,52,33,51,33,53,34,53,35,52,36,51,36 ; l dc.b 55,30,55,31,55,32,55,33,55,34,55,35,55,36 ; å dc.b 57,32,58,32,59,32,60,32,60,33,60,34,60,35,60,36,59,34 dc.b 58,34,57,35,57,36,58,36,59,36,59,28,58,29,59,30,60,29 ; h dc.b 62,30,62,31,62,32,62,33,62,34,62,35,62,36,63,32,64,32 dc.b 65,33,65,34,65,35,65,36 ; o dc.b 69,32,68,32,67,33,67,34,67,35,68,36,69,36,70,35,70,34,70,33 ; l dc.b 72,30,72,31,72,32,72,33,72,34,72,35,72,36 ; t dc.b 74,31,74,32,74,33,74,34,74,35,74,36,75,36,73,32,74,32,75,32 ; z dc.b 77,32,78,32,79,32,79,33,78,34,77,35,77,36,78,36,79,36 ; 2 dc.b 39,43,40,42,41,42,42,43,42,44,41,45,41,46,40,47 dc.b 39,48,40,48,41,48,42,48 ; 0 dc.b 46,42,45,42,44,43,44,44,44,45,44,46,44,47,45,48,46,48 dc.b 47,47,47,46,47,45,47,44,47,43 ; 0 dc.b 51,42,50,42,49,43,49,44,49,45,49,46,49,47,50,48,51,48 dc.b 52,47,52,46,52,45,52,44,52,43 ; 4 dc.b 57,42,56,43,55,44,54,45,54,46,55,46,56,46,57,46,58,46 dc.b 57,42,57,43,57,44,57,45,57,46,57,47,57,48 ; introend dc.b 255 org $fe0 allok: ; RESTORE DATA dci $2E00 lisl 0 lisu 3 ; set register 'O'30 lr A, I ; 30 st lr A, I ; 31 st lr A, I ; 32 st lr A, I ; 33 st lr A, I ; 34 st lr A, I ; 35 st lr A, I ; 36 st lock_up_loop: BR lock_up_loop org $fff .byte $fb