; DEFENDER game code ; ------------------ ; (c) 1994 Simon Cooke ; Code: Simon Cooke ; Graphics: Simon Cooke ; Music converted by: Roger Hartley ; v1.0 stat: EQU &F9 ; interrupt status lmpr: EQU &FA ; low memory (0-&7fff) page reg hmpr: EQU &FB ; high memory (&8000-&ffff) page reg vmpr: EQU &FC ; video memory page reg, mode select brdr: EQU &FE ; border colour/keyboard map lram: EQU 32 ; ram in 0-3fff -- lmpr mode4: EQU 96 mode3: EQU 64 mode2: EQU 32 mode1: EQU 0 scan: EQU &F8 scroff: EQU &80 ; Main Menu ; --------- menu.p: EQU 1 ORG &8000 DUMP menu.p,0 DI ;bug testing -- save BASIC IN A,(lmpr) ;initialise, display, then return LD (lmpr.store+1),A ;to basic. IN A,(vmpr) LD (vmpr.store+1),A LD (menu.sp),SP LD A,hip+lram OUT (lmpr),A LD SP,hisp CALL init.names CALL init.hiscore CALL disp.hiscores menu.return: LD SP,(menu.sp) lmpr.store: LD A,&00 OUT (lmpr),A vmpr.store: LD A,&00 OUT (vmpr),A EI RET menu.sp: DEFW &0000 ; Music playback data ; ------------------- ; music.init -- initialisation routine for music ; music.set -- puts TUNE address into init routine ; music.play -- plays tune music.p: EQU 5 ; music player page ORG &8000 DUMP music.p,0 music.init: MDAT "music.cde" ;music player by E.S.I. music.play: EQU music.init+6 music.set: LD (music.init+1),HL JP music.init ;music converted by Roger Hartley attract.music: MDAT "attract.m" ;attract mode tune enterhi.music: MDAT "enterhi.m" ;enter name tune pause.music: MDAT "pause.m" ;pause tune viewhi.music: MDAT "viewhi.m" ;view hiscores (after enter) hiscore.logo: MDAT "hscore.lgo" ;put here to give more room hilogo.ln: EQU $-hiscore.logo ;for hiscore routines ;Hiscore source code ;------------------- ;all designed to run in low memory (0-&7fff) hip: EQU 3 ; put routines / data in page 3 hzero: EQU 32 hone: EQU 33 hnine: EQU 41 hspc: EQU 27 hrow: EQU 32*16 hwindow: EQU 92*32 hivid: EQU 30 hilogo1: EQU &8000 hilogo2: EQU 142*128+hilogo1 hisp: EQU &4000 hwindl: EQU 50 ; start line of hiscore window hwindh: EQU 142 ; last line of hiscore window himap.p: EQU 7 ; page for hiscore map to be in himap.a: EQU &8000 ; offset (+ 32768, as in hi memory) ORG 0 DUMP hip,&0000 ORG &38 DUMP hip,&0038 ;Mode 1 interrupt routine PUSH AF IN A,(stat) RRA hi.line.jp: JP NC,hline.int.1 BIT 2,A JR Z,hframe.int POP AF EI RET hframe.int: PUSH BC ;frame interrupt PUSH HL PUSH DE LD A,hwindl ;initialise OUT (stat),A ADD A,6 LD (hline+1),A LD A,(hiscore.off+1) ;current window offset AND %11100000 RLCA RLCA RLCA RLCA LD L,A LD A,(hiscore.off+2) ADD A,A ADD A,A ADD A,A ADD A,A AND %00010000 OR L LD L,A LD H,0 LD DE,colour.tables ;use offset to work out which color ADD HL,DE ;table to use LD E,(HL) INC HL LD D,(HL) EX DE,HL ;set up colors from tables ;for next screen display LD BC,&09F8 LD A,(HL) OUT (C),A INC HL INC B LD A,(HL) OUT (C),A INC HL INC B LD A,(HL) OUT (C),A INC HL INC B LD A,(HL) OUT (C),A INC HL INC B LD A,(HL) OUT (C),A INC HL INC B LD A,(HL) OUT (C),A INC HL INC B LD A,(HL) OUT (C),A INC HL LD (color.tab.p+1),HL LD HL,hline.int.1 ;set to 1st line int. routine LD (hi.line.jp+1),HL POP DE POP HL POP BC POP AF EI ;exit interrupt routine RET ; change screen mode to show hiscore window on line 50 hline.int.1: LD A,mode2+hip+1 OUT (vmpr),A LD A,hwindl+6 OUT (stat),A PUSH HL LD HL,hline.int.2 LD (hi.line.jp+1),HL POP HL POP AF EI RET ;Change 7 colors -- current line of hiscore map is colored ;with color 7 (so we change this last to avoid changing it too ;early). Not enough time to do all the changes per line, so it ;is done this way (cheating?) hline.int.2: PUSH HL PUSH BC color.tab.p: LD HL,ctab0 LD BC,&09F8 LD A,(HL) OUT (C),A INC HL INC B LD A,(HL) OUT (C),A INC HL INC B LD A,(HL) OUT (C),A INC HL INC B LD A,(HL) OUT (C),A INC HL INC B LD A,(HL) OUT (C),A INC HL INC B LD A,(HL) OUT (C),A INC HL INC B LD A,(HL) OUT (C),A INC HL LD (color.tab.p+1),HL hline: LD A,hwindl+6 ;skip 7 lines ADD A,7 LD (hline+1),A OUT (stat),A CP hwindh JR C,not.end.hwind LD A,hwindh OUT (stat),A LD HL,hline.int.3 LD (hi.line.jp+1),HL not.end.hwind: POP BC POP HL POP AF EI RET hline.int.3: LD A,hivid+mode4 OUT (vmpr),A POP AF EI RET ;Read hiscores from disc -- not currently implemented. read.hiscores: XOR A RET ;Write hiscores to disc -- not currently implemented. save.hiscores: RET ; initialise hiscore data ; ----------------------- ; if the hiscore table is not on disc, then calculate one in the ; memory space... ; the hscore.loaded flag is set by the disc reading program. ; (not in this version yet) init.names: CALL read.hiscores ; read from disc. returns OR A ; error in accumulator... RET NZ ; if non-zero, then they ; have been read from disc. LD HL,hiscore.dat LD B,99 LD D,&00 i.names.l: LD (HL),19 ; S INC HL LD (HL),12 ; L INC HL LD (HL),3 ; C INC HL LD (HL),D ; score is ZERO INC HL LD (HL),D INC HL LD (HL),D INC HL LD (HL),D INC HL LD (HL),D INC HL DJNZ i.names.l RET ; generate hi-score data map ; -------------------------- ; generates MODE 2 (bitmap) rendition of hiscores ; needs roughly 64k of memory ; hiscore data record: ; 3 bytes -- hiscore name ; 9 nybbles (5 bytes), hiscore. ; SC OR ER i9 87 65 43 21 ; if msnybble (i) is nonzero, then score is written as INFINITY! init.hiscore: EXX ; init current scoreline counter LD HL,256*hone+hzero ; L = "0", H = "1" EXX LD IX,hiscore.dat LD D,99 LD HL,himap.a IN A,(hmpr) ;store hi page in alternate EX AF,AF' ;accumulator -- may be needed ;later LD A,himap.p OUT (hmpr),A ;page in hiscore data map PUSH DE LD D,H ;create a blank space in data LD E,L ;map, the size of the hiscore INC DE ;view window. This is so that LD BC,hwindow ;the highest score can be LD (HL),&00 ;positioned *anywhere* in the LDIR ;window POP DE write.hisc.l: PUSH HL ;store character destination ;address EXX LD A,L EXX CALL prthichar ;print first char of line EXX LD A,H EXX CALL prthichar ;second char of line counter EXX INC H LD A,H CP hnine+1 ; check to see if line countr JR NZ,not.overf.hc; has overflowed. LD H,hzero INC L not.overf.hc: EXX LD A,hspc ; leave a gap CALL prthichar LD A,(IX) ; print 1st char of name INC IX CALL prthichar LD A,(IX) ; print 2nd char of name INC IX CALL prthichar LD A,(IX) ; print last char of name INC IX CALL prthichar LD A,hspc CALL prthichar ; ix now points to score LD A,(IX) AND &F0 JR Z,print.hscore ; if reached here, then LD IY,hinfinity ; print "INFINITY!" instead LD B,9 ; of score hinfin.l: LD A,(IY) INC IY CALL prthichar DJNZ hinfin.l PUSH BC LD BC,5 ADD IX,BC POP BC JR next.hscore print.hscore: LD B,5 ; 5 bytes to read from JR hpscore.l2 ; ignore high nybble in first ; byte (infinity check) hpscore.l: LD A,(IX) AND &F0 RRCA RRCA RRCA RRCA ADD A,hzero CALL prthichar hpscore.l2: LD A,(IX) INC IX AND &0F ADD A,hzero CALL prthichar DJNZ hpscore.l next.hscore: POP HL ;restore original destination ;address PUSH DE ;store score counter LD DE,hrow ;add bytes in a row of chars ADD HL,DE ;to HL address. POP DE BIT 6,H ;check to see if address has JR Z,not.overf.hp ;overflowed the page boundary RES 6,H ;reset bit 6 (HL-&4000) IN A,(hmpr) ;increment page register INC A OUT (hmpr),A not.overf.hp: ;hl now points to next line DEC D JP NZ,write.hisc.l LD E,L ;clear an area of the map LD D,H ;the size of the display INC DE ;window LD (HL),&00 LD BC,hwindow-1 LDIR EX AF,AF' ;restore HMPR OUT (hmpr),A RET ;Print character in A at address HL prthichar: PUSH HL PUSH DE PUSH BC LD BC,31 ;1 row's length, -1. PUSH HL LD L,A LD H,0 ADD HL,HL ADD HL,HL ADD HL,HL ADD HL,HL ADD HL,HL LD DE,hfont.data ADD HL,DE EX DE,HL ; de now points to font data POP HL ;unlooped for speed. LD A,(DE) LD (HL),A INC HL ; next byte along INC DE LD A,(DE) LD (HL),A INC DE ADD HL,BC ; move to next row LD A,(DE) LD (HL),A INC HL ; next byte along INC DE LD A,(DE) LD (HL),A INC DE ADD HL,BC ; move to next row LD A,(DE) LD (HL),A INC HL ; next byte along INC DE LD A,(DE) LD (HL),A INC DE ADD HL,BC ; move to next row LD A,(DE) LD (HL),A INC HL ; next byte along INC DE LD A,(DE) INC DE LD (HL),A ADD HL,BC ; move to next row LD A,(DE) LD (HL),A INC HL ; next byte along INC DE LD A,(DE) LD (HL),A INC DE ADD HL,BC ; move to next row LD A,(DE) LD (HL),A INC HL ; next byte along INC DE LD A,(DE) LD (HL),A INC DE ADD HL,BC ; move to next row LD A,(DE) LD (HL),A INC HL ; next byte along INC DE LD A,(DE) LD (HL),A INC DE ADD HL,BC ; move to next row LD A,(DE) LD (HL),A INC HL ; next byte along INC DE LD A,(DE) LD (HL),A INC DE ADD HL,BC ; move to next row LD A,(DE) LD (HL),A INC HL ; next byte along INC DE LD A,(DE) LD (HL),A INC DE ADD HL,BC ; move to next row LD A,(DE) LD (HL),A INC HL ; next byte along INC DE LD A,(DE) LD (HL),A INC DE ADD HL,BC ; move to next row LD A,(DE) LD (HL),A INC HL ; next byte along INC DE LD A,(DE) LD (HL),A INC DE ADD HL,BC ; move to next row LD A,(DE) LD (HL),A INC HL ; next byte along INC DE LD A,(DE) LD (HL),A INC DE ADD HL,BC ; move to next row LD A,(DE) LD (HL),A INC HL ; next byte along INC DE LD A,(DE) LD (HL),A INC DE ADD HL,BC ; move to next row LD A,(DE) LD (HL),A INC HL ; next byte along INC DE LD A,(DE) LD (HL),A INC DE ADD HL,BC ; move to next row LD A,(DE) LD (HL),A INC HL ; next byte along INC DE LD A,(DE) LD (HL),A INC DE ADD HL,BC ; move to next row LD A,(DE) LD (HL),A INC HL ; next byte along INC DE LD A,(DE) LD (HL),A INC DE ADD HL,BC ; move to next row POP BC POP DE POP HL INC HL ;move to next character pos. INC HL RET ; actually display hiscores on the screen ; --------------------------------------- disp.hiscores: LD A,192 ;kill line interrupt OUT (stat),A LD HL,&0000 LD (hiscore.off+1),HL LD A,scroff ;turn screen off while OUT (brdr),A ;setting up. LD BC,&0FF8 ;set all 15 colours to black sb.pal: DEFB &ED,&71 ;out (c),&00 DJNZ sb.pal DEFB &ED,&71 ; out (c),&00 LD A,music.p OUT (hmpr),A LD HL,hiscore.logo ;copy into buffer LD DE,&4000 LD BC,hilogo.ln LDIR LD A,hivid OUT (hmpr),A LD HL,&8000 ;clear mode 4 screen area LD DE,&8001 LD (HL),L LD BC,&5FFF LDIR LD HL,&4000 ;copy from buffer LD DE,hilogo1 LD BC,hilogo.ln LDIR LD HL,&4000 ;copy from buffer LD DE,hilogo2 LD BC,hilogo.ln LDIR LD HL,hiscore.pal CALL move.colours LD HL,&4000 ; have hscore window at &4000 LD DE,&4001 ; clear it first LD BC,&1FFF LD (HL),L LDIR LD HL,&663F LD A,%01000001 EXX LD B,92 attr.loop: EXX INC HL LD D,H LD E,L INC DE LD (HL),A LD BC,31 LDIR INC A PUSH AF AND %01000111 CP %01000000 JR NZ,h.atr.nz ;musn't let it be color 0 POP AF LD A,%01000001 PUSH AF h.atr.nz: POP AF EXX DJNZ attr.loop XOR A ; turn screen back on OUT (brdr),A LD A,hivid+mode4 OUT (vmpr),A CALL fade.in LD A,(hienter.flag) OR A JR Z,main.l.enter ; hiscores have not been ; entered recently... LD A,music.p OUT (hmpr),A LD HL,viewhi.music CALL music.set main.l.enter: EI ;screen colors are displayed using an ;interrupt routine main.loop: LD A,&01 IN A,(&F8) CP hwindh JR NZ,main.loop CALL put.hisc.data ;shift hiscore into window ;now that visible window area ;has passed on the scan. LD A,music.p ;play currently initialised OUT (hmpr),A ;tune -- this will be either CALL music.play ;attract music or hiscore ;viewing music (after enter) LD A,&7E ;check for SYMBOL key press IN A,(brdr) ;debugging only. RRA RRA JP C,main.loop DI LD A,192 ;kill line interrupts OUT (stat),A CALL fade.out LD A,(hienter.flag) OR A JP Z,ret.to.menu XOR A ;reset entered score flag LD (hienter.flag),A LD A,music.p ;stop music playing by OUT (hmpr),A ;re-initialising sound chip CALL music.init CALL save.hiscores ;save scores to disc (if ;implemented) JP ret.to.menu put.hisc.data: hiscore.off: LD HL,&0000 LD A,H AND %11000000 RLCA RLCA ADD A,himap.p OUT (hmpr),A RES 7,H RES 6,H LD DE,himap.a ADD HL,DE LD DE,hwindl*32+&4000 LD A,23 h.ldi.l: INC "ldis .S" ;include source file -- ;actually is 32*4 LDI'S ;this is done for speed as music routine is v. ;slow... DEC A JP NZ,h.ldi.l h.sign: LD A,&00 ;sign byte - 0 is +ve OR A JR Z,h.positive h.negative: LD HL,(hiscore.off+1) LD DE,-32 ADD HL,DE LD (hiscore.off+1),HL LD A,H OR L RET NZ XOR A LD (h.sign+1),A RET h.positive: LD HL,(hiscore.off+1) LD DE,32 ADD HL,DE LD (hiscore.off+1),HL LD A,H CP &D1 RET NZ LD A,L CP &80 RET NZ LD A,1 LD (h.sign+1),A RET ; Fader routines -- written 1991, Simon Cooke. fade.out: LD HL,palette LD DE,temppalette LD BC,16 LDIR LD B,8 fadeout1: LD C,16 LD HL,temppalette fadeout2: LD A,(HL) CALL dropdown LD (HL),A INC HL DEC C JP NZ,fadeout2 EXX LD B,10 fadeoutfly: IN A,(&F9) BIT 3,A JP NZ,fadeoutfly DJNZ fadeoutfly LD HL,temppalette+15 LD BC,&10F8 OTDR EXX DJNZ fadeout1 RET fade.in: LD B,9 LD D,8 fadein1: LD C,16 LD HL,palette EXX LD HL,temppalette EXX fadein2: PUSH DE LD A,(HL) INC D DEC D JP Z,nofadein fadein3: PUSH DE CALL dropdown POP DE DEC D JP NZ,fadein3 nofadein: INC HL EXX LD (HL),A INC HL EXX POP DE DEC C JP NZ,fadein2 EXX LD B,10 fadeinfly: IN A,(&F9) BIT 3,A JP NZ,fadeinfly DJNZ fadeinfly LD HL,temppalette+15 LD BC,&10F8 OTDR EXX DEC D DJNZ fadein1 RET dropdown: OR A RET Z XOR 8 BIT 3,A RET Z dropblue: LD D,A AND 17 JP NZ,nextdown1 LD A,D JP dropred nextdown1: AND 1 JP Z,drophighblue LD A,D AND 126 JP dropred drophighblue: LD A,D AND 111 OR 1 dropred: LD D,A AND 34 JP NZ,nextdown2 LD A,D JP dropgreen nextdown2: AND 2 JP Z,drophighred LD A,D AND 125 JP dropgreen drophighred: LD A,D AND 127-32 OR 2 dropgreen: LD D,A AND 68 JP NZ,nextdown3 LD A,D RET nextdown3: AND 4 JP Z,drophighgreen LD A,D AND 123 RET drophighgreen: LD A,D AND 63 OR 4 RET move.colours: LD DE,palette LD BC,16 LDIR RET palette: DEFS 16 temppalette: DEFS 16 ret.to.menu: LD A,menu.p OUT (hmpr),A RET ; representation of INFINITY! as determined by hiscore font. hinfinity: DEFB 9,14,6,9,14,9,20,25,28 ;Hiscore table data... Font corresponds to: ; 0 - 28 : ".ABCDEFGHIJKLMNOPQRSTUVWXYZ !" ; 29 : SMILEY FACE ; 30 : AMPERSAND (&) ; 31 : SIGMA (the entropy E symbol) ;32 - 41 : "0123456789" ;data is of format: ; "AABBCCdefghijklm" -- nybbles.. ; ABC -- player name ; d -- if non-zero, score is shown as infinity ; e-m -- nybbles representing score digits, BCD hiscore.dat: DEFS 8*99 ;reserve space for hiscore ; names... hienter.flag: DEFB &01 hfont.data: MDAT "hifont.dat" hiscore.pal: DEFB 0,32,34,1,16,17,23,113 DEFB 0,8,7,15,112,120,119,127 colour.tables: DEFW ctab4,ctab5,ctab6 DEFW ctab7,ctab8,ctab9,ctaba,ctabb DEFW ctabc,ctabd,ctabe,ctabf DEFW ctab0,ctab1,ctab2,ctab3 ctab0: DEFB 1,16,17,25,23,31,113,121 DEFB 113,31,23,25,17,16,1,0 DEFB 1,16,17,25,23,31,113,121 DEFB 113,31,23,25,17,16,1,0 DEFB 1,16,17,25,23,31,113,121 DEFB 113,31,23,25,17,16,1,0 DEFB 1,16,17,25,23,31,113,121 DEFB 113,31,23,25,17,16,1,0 DEFB 1,16,17,25,23,31,113,121 DEFB 113,31,23,25,17,16,1,0 DEFB 1,16,17,25,23,31,113,121 DEFB 113,31,23,25 ctab1: DEFB 16,17,25,23,31,113,121 DEFB 113,31,23,25,17,16,1,0 DEFB 1,16,17,25,23,31,113,121 DEFB 113,31,23,25,17,16,1,0 DEFB 1,16,17,25,23,31,113,121 DEFB 113,31,23,25,17,16,1,0 DEFB 1,16,17,25,23,31,113,121 DEFB 113,31,23,25,17,16,1,0 DEFB 1,16,17,25,23,31,113,121 DEFB 113,31,23,25,17,16,1,0 DEFB 1,16,17,25,23,31,113,121 DEFB 113,31,23,25,17 ctab2: DEFB 17,25,23,31,113,121 DEFB 113,31,23,25,17,16,1,0 DEFB 1,16,17,25,23,31,113,121 DEFB 113,31,23,25,17,16,1,0 DEFB 1,16,17,25,23,31,113,121 DEFB 113,31,23,25,17,16,1,0 DEFB 1,16,17,25,23,31,113,121 DEFB 113,31,23,25,17,16,1,0 DEFB 1,16,17,25,23,31,113,121 DEFB 113,31,23,25,17,16,1,0 DEFB 1,16,17,25,23,31,113,121 DEFB 113,31,23,25,17,16 ctab3: DEFB 25,23,31,113,121 DEFB 113,31,23,25,17,16,1,0 DEFB 1,16,17,25,23,31,113,121 DEFB 113,31,23,25,17,16,1,0 DEFB 1,16,17,25,23,31,113,121 DEFB 113,31,23,25,17,16,1,0 DEFB 1,16,17,25,23,31,113,121 DEFB 113,31,23,25,17,16,1,0 DEFB 1,16,17,25,23,31,113,121 DEFB 113,31,23,25,17,16,1,0 DEFB 1,16,17,25,23,31,113,121 DEFB 113,31,23,25,17,16,1 ctab4: DEFB 23,31,113,121 DEFB 113,31,23,25,17,16,1,0 DEFB 1,16,17,25,23,31,113,121 DEFB 113,31,23,25,17,16,1,0 DEFB 1,16,17,25,23,31,113,121 DEFB 113,31,23,25,17,16,1,0 DEFB 1,16,17,25,23,31,113,121 DEFB 113,31,23,25,17,16,1,0 DEFB 1,16,17,25,23,31,113,121 DEFB 113,31,23,25,17,16,1,0 DEFB 1,16,17,25,23,31,113,121 DEFB 113,31,23,25,17,16,1,0 ctab5: DEFB 31,113,121 DEFB 113,31,23,25,17,16,1,0 DEFB 1,16,17,25,23,31,113,121 DEFB 113,31,23,25,17,16,1,0 DEFB 1,16,17,25,23,31,113,121 DEFB 113,31,23,25,17,16,1,0 DEFB 1,16,17,25,23,31,113,121 DEFB 113,31,23,25,17,16,1,0 DEFB 1,16,17,25,23,31,113,121 DEFB 113,31,23,25,17,16,1,0 DEFB 1,16,17,25,23,31,113,121 DEFB 113,31,23,25,17,16,1,0 DEFB 1 ctab6: DEFB 113,121 DEFB 113,31,23,25,17,16,1,0 DEFB 1,16,17,25,23,31,113,121 DEFB 113,31,23,25,17,16,1,0 DEFB 1,16,17,25,23,31,113,121 DEFB 113,31,23,25,17,16,1,0 DEFB 1,16,17,25,23,31,113,121 DEFB 113,31,23,25,17,16,1,0 DEFB 1,16,17,25,23,31,113,121 DEFB 113,31,23,25,17,16,1,0 DEFB 1,16,17,25,23,31,113,121 DEFB 113,31,23,25,17,16,1,0 DEFB 1,16 ctab7: DEFB 121 DEFB 113,31,23,25,17,16,1,0 DEFB 1,16,17,25,23,31,113,121 DEFB 113,31,23,25,17,16,1,0 DEFB 1,16,17,25,23,31,113,121 DEFB 113,31,23,25,17,16,1,0 DEFB 1,16,17,25,23,31,113,121 DEFB 113,31,23,25,17,16,1,0 DEFB 1,16,17,25,23,31,113,121 DEFB 113,31,23,25,17,16,1,0 DEFB 1,16,17,25,23,31,113,121 DEFB 113,31,23,25,17,16,1,0 DEFB 1,16,17 ctab8: DEFB 113,31,23,25,17,16,1,0 DEFB 1,16,17,25,23,31,113,121 DEFB 113,31,23,25,17,16,1,0 DEFB 1,16,17,25,23,31,113,121 DEFB 113,31,23,25,17,16,1,0 DEFB 1,16,17,25,23,31,113,121 DEFB 113,31,23,25,17,16,1,0 DEFB 1,16,17,25,23,31,113,121 DEFB 113,31,23,25,17,16,1,0 DEFB 1,16,17,25,23,31,113,121 DEFB 113,31,23,25,17,16,1,0 DEFB 1,16,17,25 ctab9: DEFB 31,23,25,17,16,1,0 DEFB 1,16,17,25,23,31,113,121 DEFB 113,31,23,25,17,16,1,0 DEFB 1,16,17,25,23,31,113,121 DEFB 113,31,23,25,17,16,1,0 DEFB 1,16,17,25,23,31,113,121 DEFB 113,31,23,25,17,16,1,0 DEFB 1,16,17,25,23,31,113,121 DEFB 113,31,23,25,17,16,1,0 DEFB 1,16,17,25,23,31,113,121 DEFB 113,31,23,25,17,16,1,0 DEFB 1,16,17,25,23 ctaba: DEFB 23,25,17,16,1,0 DEFB 1,16,17,25,23,31,113,121 DEFB 113,31,23,25,17,16,1,0 DEFB 1,16,17,25,23,31,113,121 DEFB 113,31,23,25,17,16,1,0 DEFB 1,16,17,25,23,31,113,121 DEFB 113,31,23,25,17,16,1,0 DEFB 1,16,17,25,23,31,113,121 DEFB 113,31,23,25,17,16,1,0 DEFB 1,16,17,25,23,31,113,121 DEFB 113,31,23,25,17,16,1,0 DEFB 1,16,17,25,23,31 ctabb: DEFB 25,17,16,1,0 DEFB 1,16,17,25,23,31,113,121 DEFB 113,31,23,25,17,16,1,0 DEFB 1,16,17,25,23,31,113,121 DEFB 113,31,23,25,17,16,1,0 DEFB 1,16,17,25,23,31,113,121 DEFB 113,31,23,25,17,16,1,0 DEFB 1,16,17,25,23,31,113,121 DEFB 113,31,23,25,17,16,1,0 DEFB 1,16,17,25,23,31,113,121 DEFB 113,31,23,25,17,16,1,0 DEFB 1,16,17,25,23,31,113 ctabc: DEFB 17,16,1,0 DEFB 1,16,17,25,23,31,113,121 DEFB 113,31,23,25,17,16,1,0 DEFB 1,16,17,25,23,31,113,121 DEFB 113,31,23,25,17,16,1,0 DEFB 1,16,17,25,23,31,113,121 DEFB 113,31,23,25,17,16,1,0 DEFB 1,16,17,25,23,31,113,121 DEFB 113,31,23,25,17,16,1,0 DEFB 1,16,17,25,23,31,113,121 DEFB 113,31,23,25,17,16,1,0 DEFB 1,16,17,25,23,31,113,121 ctabd: DEFB 16,1,0 DEFB 1,16,17,25,23,31,113,121 DEFB 113,31,23,25,17,16,1,0 DEFB 1,16,17,25,23,31,113,121 DEFB 113,31,23,25,17,16,1,0 DEFB 1,16,17,25,23,31,113,121 DEFB 113,31,23,25,17,16,1,0 DEFB 1,16,17,25,23,31,113,121 DEFB 113,31,23,25,17,16,1,0 DEFB 1,16,17,25,23,31,113,121 DEFB 113,31,23,25,17,16,1,0 DEFB 1,16,17,25,23,31,113,121 DEFB 113 ctabe: DEFB 1,0 DEFB 1,16,17,25,23,31,113,121 DEFB 113,31,23,25,17,16,1,0 DEFB 1,16,17,25,23,31,113,121 DEFB 113,31,23,25,17,16,1,0 DEFB 1,16,17,25,23,31,113,121 DEFB 113,31,23,25,17,16,1,0 DEFB 1,16,17,25,23,31,113,121 DEFB 113,31,23,25,17,16,1,0 DEFB 1,16,17,25,23,31,113,121 DEFB 113,31,23,25,17,16,1,0 DEFB 1,16,17,25,23,31,113,121 DEFB 113,31 ctabf: DEFB 0 DEFB 1,16,17,25,23,31,113,121 DEFB 113,31,23,25,17,16,1,0 DEFB 1,16,17,25,23,31,113,121 DEFB 113,31,23,25,17,16,1,0 DEFB 1,16,17,25,23,31,113,121 DEFB 113,31,23,25,17,16,1,0 DEFB 1,16,17,25,23,31,113,121 DEFB 113,31,23,25,17,16,1,0 DEFB 1,16,17,25,23,31,113,121 DEFB 113,31,23,25,17,16,1,0 DEFB 1,16,17,25,23,31,113,121 DEFB 113,31,23