;*************************** AMUS Program Label ****************************** ; Filename: ULTRIS.M68 Date: 12/23/91 ; Category: UTIL Hash Code: 436-301-552-343 Version: 1.0(2) ; Initials: ULTR/US Name: DAVID PALLMANN ; Company: ULTRASOFT CORPORATION Telephone #: 5163484848 ; Related Files: ; Min. Op. Sys.: AMOSL 1.3B/AMOS32 1.0 Expertise Level: BEG ; Special: Display is best suited to color terminals (AM72,AM75,PCs) ; Description: UltraSoft's Tetris-like game ;***************************************************************************** ;**************************************************************************** ;* * ;* ULTRIS * ;* UltraSoft's Tetris-like Game * ;* * ;**************************************************************************** ;[102] 24 December 1991 14:01 Edited by David Pallmann ; Adjusted scoring and speed-up logic for broader appeal. ; ;[101] 24 December 1991 10:04 Edited by David Pallmann ; Added B)ase vs. E)xtended piece set selection. ; ;[100] 19 December 1991 14:33 Edited by David Pallmann ; Created. ;version VMAJOR =1 VMINOR =0 VSUB =0 VEDIT =102. VWHO =0 ;universals SEARCH SYS SEARCH SYSSYM SEARCH TRM ;assembly parameters HEIGHT =24. ; well height WIDTH =14. ; well width LFTOFF =<<80.->/2> ;colors BLACK =0 WHITE =1 BLUE =2 MAGENTA =3 RED =4 YELLOW =5 GREEN =6 CYAN =7 ;variables .OFINI .OFDEF RANIDX, 1 ; random number generator index .OFDEF PROT, 1 ; piece rotation (0,1,2,3) .OFDEF PROW, 1 ; moving piece row .OFDEF PCOL, 1 ; moving piece column .OFDEF PTYPE, 1 ; piece type code .OFDEF DROP, 1 ; drop flag .OFDEF PADR, 4 ; address of piece definition .OFDEF COLOR, 1 ; color flag (0=monochrome) .OFDEF SETFLG, 1 ; set flag (0=basic, 1=extended) .OFDEF ACCUM, 2 ; timer - count up register .OFDEF MAXVAL, 2 ; timer - max value .OFDEF BUFFER, 8. ; temporary work buffer .OFDEF SCORE, 4 ; score .OFDEF LEVSCR, 2 ; score for this piece .OFDEF LEVELS, 2 ; levels removed .OFDEF TRMFLG, TC.SIZ ; terminal characteristics .OFDEF BOARD, HEIGHT*WIDTH ; the current display .OFDEF PRVBRD, HEIGHT*WIDTH ; the prior display .OFSIZ MEMSIZ ;macros DEFINE CRT FUNC MOVW #-1_8.+^D,D1 TCRT ENDM DEFINE CURSOR R,C MOVB R,D1 ROLW D1,#8. MOVB C,D1 TCRT ENDM DEFINE FCOLOR N MOVW #-2_8.+^D,D1 TCRT ENDM DEFINE BCOLOR N MOVW #-3_8.+^D,D1 TCRT ENDM DEFINE BOX R1,C1,R2,C2 LEA A6,1$$ CALL BOX BR 2$$ 1$$: BYTE R1'.,C1'.,R2'.,C2'. 2$$: ENDM ;*********** ;* START * ;*********** ;initialization START: PHDR -1,0,PH$REE!PH$REU ; program header GETIMP MEMSIZ,A5 ; allocate memory for variables TRMCHR TRMFLG(A5) ; get terminal characteristics CLRB COLOR(A5) ; set or clear color flag MOV TRMFLG(A5),D7 ; AND #TD$CLR,D7 ; BEQ 10$ ; MOVB #1,COLOR(A5) ; 10$: TRMRST D0 ; set data ORW #T$DAT!T$ECS,D0 ; mode and TRMWST D0 ; disable echoplex CLRB SETFLG(A5) ; start with standard base set ;************** ;* NEW.GAME * ;************** ;Set up for a new game NEW.GAME: CLR SCORE(A5) ; CALL BACKGROUND ; display screen background CLEAR BOARD(A5),HEIGHT*WIDTH ; LEA A6,BOARD(A5) ; MOV #WIDTH,D6 ; 10$: MOVB #1,(A6)+ ; SOB D6,10$ ; LEA A6,BOARD+WIDTH(A5) ; MOV #HEIGHT-2,D6 ; 20$: MOVB #1,@A6 ; MOVB #1,WIDTH-1(A6) ; ADD #WIDTH,A6 ; SOB D6,20$ ; LEA A6,BOARD+<*WIDTH>(A5) ; MOV #WIDTH,D6 ; 30$: MOVB #1,(A6)+ ; SOB D6,30$ ; LEA A0,BOARD(A5) ; LEA A1,PRVBRD(A5) ; MOV #HEIGHT*WIDTH,D0 ; 40$: MOVB (A0)+,(A1)+ ; SOB D0,40$ ; MOVW #425.,MAXVAL(A5) ; CLRB DROP(A5) ; MOVW #1000.,LEVSCR(A5) ; set initial score for this piece ;create a new piece if necessary CREATE: TSTB PROW(A5) ; is there a piece moving? JNE SCAN ; yes - strobe for input 2$: CALL RANDOM ; INCB D7 ; MOVB D7,PCOL(A5) ; MOVB #2,PROW(A5) ; LEA A0,BOARD+WIDTH+1(A5) ; CLR D7 ; MOVB PCOL(A5),D7 ; ADD D7,A0 ; LEA A1,PIECE ; 5$: CALL RANDOM ; MOV D7,D0 ; TSTB SETFLG(A5) ; are we using extended or base set? BEQ 61$ ; base 6$: CALL RANDOM ; MOV D0,D6 ; ADD D7,D6 ; ; extended CMP D6,#PIECECOUNT ; BHIS 5$ ; MOV D6,D7 ; BR 69$ ; 61$: CMPB D0,#7 ; BHIS 5$ ; 69$: MOVB D7,PTYPE(A5) ; INCB PTYPE(A5) ; MUL D7,#16. ; point to standard shape for piece ADD D7,A1 ; MOV A1,PADR(A5) ; CLRB PROT(A5) ; 7$: CALL RANDOM ; CMPB D7,#3 ; BHI 7$ MOVB D7,PROT(A5) ; MUL D7,#4 ; ADD D7,A1 ; MOV A1,PADR(A5) ; CALL CHECK ; will this be a collision? JEQ GAMOVR ; yes - game if over CALL ADD ; add the piece CALL UPDATE ; update the display ;scan for user input SCAN: TCKI ; input? JNE MOVE ; no - go move piece TIN ; UCS ; CMPB D1,#'C-'@ ; JEQ QUIT ; CMPB D1,#'[-'@ ; JEQ QUIT ; CMPB D1,#'Q ; JEQ QUIT ; CMPB D1,#40 ; JEQ DROPIT ; CMPB D1,#'5 ; JEQ ROTATE ; CMPB D1,#'R ; JEQ ROTATE ; CMPB D1,#'4 ; JEQ LEFT ; CMPB D1,#'H-'@ ; JEQ LEFT ; CMPB D1,#'6 ; JEQ RIGHT ; CMPB D1,#'L-'@ ; JEQ RIGHT ; CMPB D1,#'B ; JEQ SETBAS ; CMPB D1,#'E ; JEQ SETEXT ; CMPB D1,#'H ; JEQ HELP ; ;move the current piece MOVE: TSTB PROW(A5) ; is there a piece to move? JEQ CREATE ; no - go create one TSTB DROP(A5) ; are we in Fast Drop mode? BNE 10$ ; yes - go to it ;idler loop to pace drop rate with game duration INCW ACCUM(A5) ; add one to accumulator CMMW ACCUM(A5),MAXVAL(A5) ; time to move the piece? BHIS 10$ ; yes - go do it SLEEP #10. ; sleep 1/1000th second JMP SCAN ; go check for keyboard input ;this is where the piece is actually moved 10$: CMPW LEVSCR(A5),#10. ; BLOS 15$ ; SUBW #5.,LEVSCR(A5) ; 15$: CLRW ACCUM(A5) ; clear out the accumulator CALL DELETE ; delete piece from the board INCB PROW(A5) ; add one to row CALL CHECK ; will this be a collision? BEQ 20$ ; yes CALL ADD ; add piece back to the board CALL UPDATE ; update the screen JMP SCAN ; check input again ;we could not move the piece so it is at rock bottom ;cancel the current moving piece so that a new one will be created 20$: DECB PROW(A5) ; CALL ADD ; CLRB PROW(A5) ; CLRB PCOL(A5) ; CLRB PTYPE(A5) ; CLR PADR(A5) ; CLRB PROT(A5) ; CLRB DROP(A5) ; CMPW MAXVAL(A5),#5 ; are we as fast as can be? JLO 10$ ; yes SUBW #2,MAXVAL(A5) ; no - pick up the pace 30$: CALL REMOVE ; remove any levels that need it JMP SCAN ; go check for keyboard input ;select Fast Drop mode in which our timing delay is temporarily inactivated ;for the current piece DROPIT: MOVB #1,DROP(A5) ; JMP SCAN ; ;move the current piece left LEFT: CALL DELETE ; DECB PCOL(A5) ; CALL CHECK ; collision? BNE 10$ ; no INCB PCOL(A5) ; yes - undo the change CALL ADD ; JMP SCAN ; 10$: CALL ADD ; CALL UPDATE ; JMP SCAN ; ;move the current piece right RIGHT: CALL DELETE ; INCB PCOL(A5) ; CALL CHECK ; collision? BNE 10$ ; no DECB PCOL(A5) ; yes - undo the change CALL ADD ; JMP SCAN ; 10$: CALL ADD ; CALL UPDATE ; JMP SCAN ; ;rotate the current piece clockwise 90 degrees ROTATE: MOVB PROT(A5),D4 ; MOV PADR(A5),D5 ; CALL DELETE ; SUB #4,PADR(A5) ; DECB PROT(A5) ; BPL 10$ ; MOVB #3,PROT(A5) ; ADD #16.,PADR(A5) ; 10$: CALL CHECK ; BEQ UNROTATE ; CALL ADD ; CALL UPDATE ; JMP SCAN ; UNROTATE: MOVB D4,PROT(A5) ; MOV D5,PADR(A5) ; CALL ADD ; JMP SCAN ; ;set base piece set SETBAS: CLRB SETFLG(A5) ; BCOLOR GREEN ; CURSOR #8.,#56. ; TYPE < E extended pieces > JMP SCAN ; ;set extended piece set SETEXT: MOVB #1,SETFLG(A5) ; BCOLOR GREEN ; CURSOR #8.,#56. ; TYPE < B basic pieces > ; JMP SCAN ; ;********** ;* HELP * ;********** HELP: ;************ ;* GAMOVR * ;************ ;game over GAMOVR: ;********** ;* QUIT * ;********** ;Leave Ultris and return to AMOS command level QUIT: CURSOR #24.,#1 ; CRT 28 ; CRT 12 ; BCOLOR 0 ; FCOLOR 1 ; EXIT ; ;************ ;* REMOVE * ;************ ;Function: Remove any full levels ; Calls UPDATE if any have been removed REMOVE: CLR D5 ; removed level count LEA A0,BOARD+WIDTH(A5) ; MOV #2,D4 ; MOV #HEIGHT-2,D3 ; 10$: BCALL REMLVL ; INCW D4 ; ADD #WIDTH,A0 ; SOB D3,10$ ; TSTW D5 ; was anything removed? BEQ 20$ ; no CALL UPDATE ; update the display CALL UPDATE.SCORE ; update score 20$: RTN ; return ;remove level @A0, row D4, if full REMLVL: SAVE A0-A1 ; MOV A0,A6 ; MOV #WIDTH,D6 ; 10$: TSTB (A6)+ ; BEQ 90$ ; SOB D6,10$ ; 20$: LEA A6,BOARD+WIDTH(A5) ; CMP A0,A6 ; BLOS 80$ ; MOV A0,A1 ; SUB #WIDTH,A1 ; MOV #WIDTH,D6 ; 30$: MOVB (A1)+,(A0)+ ; SOB D6,30$ ; SUB #WIDTH*2,A0 ; BR 20$ ; 80$: INCW D5 ; update removed level count MOVW LEVSCR(A5),D7 ; ADD D7,SCORE(A5) ; INCW LEVELS(A5) ; MOVW #1000.,LEVSCR(A5) ; 90$: REST A0-A1 ; RTN ; ;**************** ;* BACKGROUND * ;**************** ;Function: Put up background screen BACKGROUND: BCOLOR BLUE ; CRT 29 ; CRT 0 ; BCOLOR WHITE ; FCOLOR BLACK ; CRT 23 ; ;top lines CURSOR #1,#LFTOFF+1 ; CRT 38 ; MOV #<*2>,D0 ; 10$: CRT 46 ; SOB D0,10$ ; CRT 39 ; ;middle lines MOV #2,D2 ; 20$: CURSOR D2,#LFTOFF+1 ; CRT 47 ; MOV #<*2>,D0 ; 30$: TYPESP ; SOB D0,30$ ; CRT 47 ; INCW D2 ; CMPW D2,#HEIGHT ; BLO 20$ ; ;bottom line CURSOR #HEIGHT,#LFTOFF+1 ; CRT 40 ; MOV #<*2>,D0 ; 40$: CRT 46 ; SOB D0,40$ ; CRT 41 ; CRT 24 ; ;title box BOX 2,7,6,19 ; BCOLOR MAGENTA ; FCOLOR WHITE ; CURSOR #3,#8. ; TYPE < > ; CURSOR #4,#8. ; TYPE < ULTRIS > ; BCOLOR MAGENTA+8. ; TYPESP ; BCOLOR MAGENTA ; CURSOR #5,#8. ; TYPE < > ; BCOLOR MAGENTA+8. ; TYPESP ; TSTB COLOR(A5) ; BEQ 50$ ; CURSOR #6,#9. ; TYPE < > ; ;score box 50$: BOX 8,4,14,23 BCOLOR RED ; FCOLOR WHITE ; CURSOR #9.,#5 ; TYPE < > ; CURSOR #10.,#5 ; TYPE < Score: > ; BCOLOR RED+8. ; TYPESP ; BCOLOR RED ; CURSOR #11.,#5 ; TYPE < > ; BCOLOR RED+8. ; TYPESP ; BCOLOR RED ; CURSOR #12.,#5 ; TYPE < Levels: > ; BCOLOR RED+8. ; TYPESP ; BCOLOR RED ; CURSOR #13.,#5 ; TYPE < > ; BCOLOR RED+8. ; TYPESP ; TSTB COLOR(A5) ; BEQ 60$ ; CURSOR #14.,#6 ; BCOLOR RED+8. ; TYPE < > ;instructions 60$: BOX 2,55,11,79 BCOLOR GREEN ; FCOLOR WHITE ; CURSOR #3,#56. ; TYPE < > CURSOR #4,#56. ; TYPE < 4 moves piece left > BCOLOR GREEN+8. ; TYPESP ; BCOLOR GREEN ; CURSOR #5,#56. ; TYPE < 5 rotates piece > BCOLOR GREEN+8. ; TYPESP ; BCOLOR GREEN ; CURSOR #6,#56. ; TYPE < 6 moves piece right > BCOLOR GREEN+8. ; TYPESP ; BCOLOR GREEN ; CURSOR #7,#56. ; TYPE < SPACE drops piece > BCOLOR GREEN+8. ; TYPESP ; BCOLOR GREEN ; CURSOR #8.,#56. ; TYPE < E extended pieces > BCOLOR GREEN+8. ; TYPESP ; BCOLOR GREEN ; CURSOR #9.,#56. ; TYPE < Q quits game > BCOLOR GREEN+8. ; TYPESP ; BCOLOR GREEN ; CURSOR #10.,#56. ; TYPE < > BCOLOR GREEN+8. ; TYPESP ; BCOLOR GREEN ; TSTB COLOR(A5) ; BEQ 70$ ; CURSOR #11.,#57. ; BCOLOR GREEN+8. ; TYPE < > 70$: CALL UPDATE.SCORE ; RTN ; ;****************** ;* UPDATE.SCORE * ;****************** ;Function: Update score on screen UPDATE.SCORE: BCOLOR RED ; FCOLOR WHITE ; CURSOR #10.,#15. ; MOV SCORE(A5),D1 ; DCVT 5,OT$TRM ; CURSOR #12.,#15. ; CLR D1 ; MOVW LEVELS(A5),D1 ; DCVT 0,OT$TRM ; RTN ; ;************ ;* UPDATE * ;************ ;Function: Update the display, by comparing BOARD(A5) to PRVBRD(A5) ; ; On mode color terminals we use glorious color ; On everything we use boring solid blocks UPDATE: TSTB COLOR(A5) ; color terminal? BNE 5$ ; yes CRT 23 ; no - select alternate char set 5$: LEA A0,BOARD+WIDTH(A5) ; LEA A1,PRVBRD+WIDTH(A5) ; MOV #2,D2 ; MOV #HEIGHT-2,D4 ; 10$: MOV #1,D3 ; MOV #WIDTH-2,D5 ; INC A0 ; INC A1 ; 20$: MOVB (A0)+,D0 ; MOVB (A1)+,D1 ; CMPB D0,D1 ; BNE 30$ ; 25$: INCW D3 ; SOB D5,20$ ; INC A0 ; INC A1 ; INCW D2 ; SOB D4,10$ ; TSTB COLOR(A5) ; color terminal? BNE 28$ ; yes CRT 24 ; no - select standard char set 28$: RTN ; 30$: MOVW #-3_8.+1,D1 ; MOVB D0,-1(A1) ; BEQ 40$ TSTB COLOR(A5) ; color terminal? BEQ 50$ ; no MOVB D0,D1 ; INCW D1 ; AND #377,D1 ; ADDW #-3_8.+0,D1 ; 40$: TCRT ; MOV D3,D0 ; MUL D0,#2 ; ADD #LFTOFF,D0 ; CURSOR D2,D0 ; TYPE < > ; BR 25$ ; 50$: MOVB D0,-1(A1) ; MOV D3,D0 ; MUL D0,#2 ; ADD #LFTOFF,D0 ; CURSOR D2,D0 ; TSTB -1(A1) ; BEQ 60$ ; CRT 49 ; CRT 49 ; JMP 25$ ; 60$: TYPE < > ; JMP 25$ ; ;*********** ;* CHECK * ;*********** ;Function: See if piece's new location is a collision ; ;Inputs: PROW(A5), PCOL(A5) - piece location (of top left corner) ; PADR(A5) - index to piece definition ; ;Outputs: Z - set if there is a collision CHECK: SAVE A0,D2 ; CLR D7 ; MOVB PROW(A5),D7 ; DEC D7 ; MUL D7,#WIDTH ; LEA A0,BOARD(A5) ; ADD D7,A0 ; CLR D6 ; MOVB PCOL(A5),D6 ; ADD D6,A0 ; MOV PADR(A5),A1 ; MOV #4,D6 ; 10$: MOV A0,A6 ; MOV #8.,D7 ; MOVB (A1)+,D2 ; 20$: ASLB D2,#1 ; BCC 30$ ; TSTB @A6 ; BNE 40$ ; 30$: INC A6 ; SOB D7,20$ ; ADD #WIDTH,A0 ; SOB D6,10$ ; REST A0,D2 ; LCC #0 ; clear Z (safe) RTN ; return 40$: REST A0,D2 ; LCC #PS.Z ; set Z (collision) RTN ; return ;********* ;* ADD * ;********* ;Function: Map piece onto board ; ;Inputs: PROW(A5), PCOL(A5) - piece location (of top left corner) ; PADR(A5) - index to piece definition ADD: SAVE A0,D2 ; CLR D7 ; MOVB PROW(A5),D7 ; DEC D7 ; MUL D7,#WIDTH ; LEA A0,BOARD(A5) ; ADD D7,A0 ; CLR D6 ; MOVB PCOL(A5),D6 ; ADD D6,A0 ; MOV PADR(A5),A1 ; MOV #4,D6 ; 10$: MOV A0,A6 ; MOV #8.,D7 ; MOVB (A1)+,D2 ; 20$: ASLB D2,#1 ; BCC 30$ ; MOVB PTYPE(A5),@A6 ; 30$: INC A6 ; SOB D7,20$ ; ADD #WIDTH,A0 ; SOB D6,10$ ; REST A0,D2 ; RTN ; ;************ ;* DELETE * ;************ ;Function: Delete piece from board ; ;Inputs: PROW(A5), PCOL(A5) - piece location (of top left corner) ; PADR(A5) - index to piece definition DELETE: SAVE A0,D2 ; CLR D7 ; MOVB PROW(A5),D7 ; DEC D7 ; MUL D7,#WIDTH ; LEA A0,BOARD(A5) ; ADD D7,A0 ; CLR D6 ; MOVB PCOL(A5),D6 ; ADD D6,A0 ; MOV PADR(A5),A1 ; MOV #4,D6 ; 10$: MOV A0,A6 ; MOV #8.,D7 ; MOVB (A1)+,D2 ; 20$: ASLB D2,#1 ; BCC 30$ ; CLRB @A6 ; 30$: INC A6 ; SOB D7,20$ ; ADD #WIDTH,A0 ; SOB D6,10$ ; REST A0,A2 ; RTN ; ;********* ;* BOX * ;********* ;Function: Draw a box ; ;Inputs: A6 - points to row1, col1, row2, col2 (bytes) BOX: TSTB COLOR(A5) ; JNE BOXRTN ; SAVE D0-D5 CLR D2 ; CLR D3 ; CLR D4 ; CLR D5 ; MOVB (A6)+,D2 ; MOVB (A6)+,D3 ; MOVB (A6)+,D4 ; MOVB (A6)+,D5 ; CRT 23 ; CURSOR D2,D3 ; CRT 38 ; MOV D5,D0 ; SUB D3,D0 ; DEC D0 ; 10$: CRT 46 ; SOB D0,10$ ; CRT 39 ; 20$: INCW D2 ; CMPW D2,D4 ; BHIS 30$ CURSOR D2,D3 ; CRT 47 ; MOV D5,D0 ; SUB D3,D0 ; DEC D0 ; 22$: TYPESP ; SOB D0,22$ ; CRT 47 ; BR 20$ ; 30$: CURSOR D4,D3 ; CRT 40 ; MOV D5,D0 ; SUB D3,D0 ; DEC D0 ; 32$: CRT 46 ; SOB D0,32$ ; CRT 41 ; CRT 24 ; REST D0-D5 ; BOXRTN: RTN ; ;************ ;* RANDOM * ;************ ;Function: Generate random number between 0 and 9 ; ;Outputs: D7 - number ; ;Notes: Automatically seeds self the first time it is run and ; periodically. RANDOM: MOV D7,D5 ; save max value MOVB RANIDX(A5),D7 ; have we been seeded? BNE 10$ ; yes 5$: GTIMES BUFFER(A5) ; CLR D7 ; LEA A6,BUFFER(A5) ; MOVB (A6)+,D7 ; ADDB (A6)+,D7 ; ADDB (A6)+,D7 ; ADDB @A6,D7 ; AND #377,D7 ; MOVB D7,RANIDX(A5) ; BR 20$ ; 10$: CLR D7 ; MOVB RANIDX(A5),D7 ; INCB D7 ; MOVB D7,RANIDX(A5) ; 20$: LEA A6,RANTBL ; ADD D7,A6 ; MOVB @A6,D7 ; BMI 5$ ; RTN ; RADIX 10 RANTBL: BYTE 0,1,2,3,4,5,6,7,8,9 BYTE 9,8,7,6,5,4,3,2,1,0 BYTE 1,3,5,7,9,0,2,4,6,8 BYTE 0,8,6,4,2,8,6,4,2,0 BYTE 1,3,5,7,9,9,7,5,3,1 BYTE 0,8,9,7,1,3,2,4,6,5 BYTE 0,0,8,8,6,6,4,4,2,2 BYTE 1,3,1,3,5,7,5,7,9,9 BYTE 0,9,8,7,6,5,4,3,2,1 BYTE 1,2,3,4,5,6,7,8,9,0 BYTE 6,5,4,3,2,1,0,9,8,7 BYTE 1,2,4,5,7,8,0,3,6,9 BYTE 0,0,0,9,8,8,8,7,6,6 BYTE 6,5,4,4,4,3,2,2,2,1 BYTE 9,9,7,7,5,5,3,3,1,1 BYTE 0,0,0,0,0,0,0,0,0,0 BYTE 1,1,1,1,1,1,1,1,1,1 BYTE 2,2,2,2,2,2,2,2,2,2 BYTE 7,7,7,7,7,7,7,7,7,7 BYTE 5,5,5,5,5,5,5,5,5,5 BYTE 9,9,9,9,9,9,9,9,9,9 BYTE 8,8,8,8,8,8,8,8,8,8 BYTE 3,3,3,3,3,3,3,3,3,3 BYTE 4,4,4,4,4,4,4,4,4,4 BYTE 6,6,6,6,6,6,6,6,6,6 BYTE 1,2,3,4,5,6 IF NE,256.-<.-RANTBL>,ASMERP "?Random number table does not contain right number of entries" BYTE -1,-1,-1,-1,-1,-1,-1,-1,-1,-1 RADIX 8 ;***************************** ;* piece shape definitions * ;***************************** ;This is where pieces are defined ;Each piece is defined in four rotations (0, 90, 180, 270 degrees) ;piece #1 (square) 0 rotation PIECE: BYTE ^B11000000 BYTE ^B11000000 BYTE ^B00000000 BYTE ^B00000000 ;piece #1 (square) 90 rotation BYTE ^B11000000 BYTE ^B11000000 BYTE ^B00000000 BYTE ^B00000000 ;piece #1 (square) 180 rotation BYTE ^B11000000 BYTE ^B11000000 BYTE ^B00000000 BYTE ^B00000000 ;piece #1 (square) 270 rotation BYTE ^B11000000 BYTE ^B11000000 BYTE ^B00000000 BYTE ^B00000000 ;piece #2 (L) 0 rotation BYTE ^B10000000 BYTE ^B10000000 BYTE ^B11000000 BYTE ^B00000000 ;piece #2 (L) 90 rotation BYTE ^B00100000 BYTE ^B11100000 BYTE ^B00000000 BYTE ^B00000000 ;piece #2 (L) 180 rotation BYTE ^B11000000 BYTE ^B01000000 BYTE ^B01000000 BYTE ^B00000000 ;piece #2 (L) 270 rotation BYTE ^B11100000 BYTE ^B10000000 BYTE ^B00000000 BYTE ^B00000000 ;piece #3 (Z) 0 rotation BYTE ^B11000000 BYTE ^B01100000 BYTE ^B00000000 BYTE ^B00000000 ;piece #3 (Z) 90 rotation BYTE ^B01000000 BYTE ^B11000000 BYTE ^B10000000 BYTE ^B00000000 ;piece #3 (Z) 180 rotation BYTE ^B11000000 BYTE ^B01100000 BYTE ^B00000000 BYTE ^B00000000 ;piece #3 (Z) 270 rotation BYTE ^B01000000 BYTE ^B11000000 BYTE ^B10000000 BYTE ^B00000000 ;piece #4 (Z) 0 rotation BYTE ^B01100000 BYTE ^B11000000 BYTE ^B00000000 BYTE ^B00000000 ;piece #4 (Z) 90 rotation BYTE ^B10000000 BYTE ^B11000000 BYTE ^B01000000 BYTE ^B00000000 ;piece #4 (Z) 180 rotation BYTE ^B01100000 BYTE ^B11000000 BYTE ^B00000000 BYTE ^B00000000 ;piece #4 (Z) 270 rotation BYTE ^B10000000 BYTE ^B11000000 BYTE ^B01000000 BYTE ^B00000000 ;piece #5 (T) 0 rotation BYTE ^B01000000 BYTE ^B11100000 BYTE ^B00000000 BYTE ^B00000000 ;piece #5 (T) 90 rotation BYTE ^B10000000 BYTE ^B11000000 BYTE ^B10000000 BYTE ^B00000000 ;piece #5 (T) 180 rotation BYTE ^B11100000 BYTE ^B01000000 BYTE ^B00000000 BYTE ^B00000000 ;piece #5 (T) 270 rotation BYTE ^B01000000 BYTE ^B11000000 BYTE ^B01000000 BYTE ^B00000000 ;piece #6 (-L) 0 rotation BYTE ^B01000000 BYTE ^B01000000 BYTE ^B11000000 BYTE ^B00000000 ;piece #6 (-L) 90 rotation BYTE ^B10000000 BYTE ^B11100000 BYTE ^B00000000 BYTE ^B00000000 ;piece #6 (-L) 180 rotation BYTE ^B11000000 BYTE ^B10000000 BYTE ^B10000000 BYTE ^B00000000 ;piece #6 (-L) 270 rotation BYTE ^B11100000 BYTE ^B00100000 BYTE ^B00000000 BYTE ^B00000000 ;piece #7 (I) 0 rotation BYTE ^B11110000 BYTE ^B00000000 BYTE ^B00000000 BYTE ^B00000000 ;piece #7 (I) 90 rotation BYTE ^B01000000 BYTE ^B01000000 BYTE ^B01000000 BYTE ^B01000000 ;piece #7 (I) 180 rotation BYTE ^B11110000 BYTE ^B00000000 BYTE ^B00000000 BYTE ^B00000000 ;piece #7 (I) 270 rotation BYTE ^B01000000 BYTE ^B01000000 BYTE ^B01000000 BYTE ^B01000000 ;piece #8 (r) 0 rotation BYTE ^B11000000 BYTE ^B10000000 BYTE ^B00000000 BYTE ^B00000000 ;piece #8 (r) 90 rotation BYTE ^B11000000 BYTE ^B01000000 BYTE ^B00000000 BYTE ^B00000000 ;piece #8 (r) 180 rotation BYTE ^B01000000 BYTE ^B11000000 BYTE ^B00000000 BYTE ^B00000000 ;piece #8 (r) 270 rotation BYTE ^B10000000 BYTE ^B11000000 BYTE ^B00000000 BYTE ^B00000000 ;piece #9 (-r) 0 rotation BYTE ^B11000000 BYTE ^B01000000 BYTE ^B00000000 BYTE ^B00000000 ;piece #9 (-r) 90 rotation BYTE ^B01000000 BYTE ^B11000000 BYTE ^B00000000 BYTE ^B00000000 ;piece #9 (-r) 180 rotation BYTE ^B10000000 BYTE ^B11000000 BYTE ^B00000000 BYTE ^B00000000 ;piece #9 (-r) 270 rotation BYTE ^B11000000 BYTE ^B10000000 BYTE ^B00000000 BYTE ^B00000000 ;piece #10 (C) 0 rotation BYTE ^B11000000 BYTE ^B10000000 BYTE ^B11000000 BYTE ^B00000000 ;piece #10 (C) 90 rotation BYTE ^B11100000 BYTE ^B10100000 BYTE ^B00000000 BYTE ^B00000000 ;piece #10 (C) 180 rotation BYTE ^B11000000 BYTE ^B01000000 BYTE ^B11000000 BYTE ^B00000000 ;piece #10 (C) 270 rotation BYTE ^B10100000 BYTE ^B11100000 BYTE ^B00000000 BYTE ^B00000000 ;piece #11 (T) 0 rotation BYTE ^B11100000 BYTE ^B01000000 BYTE ^B01000000 BYTE ^B00000000 ;piece #11 (T) 90 rotation BYTE ^B00100000 BYTE ^B11100000 BYTE ^B00100000 BYTE ^B00000000 ;piece #11 (T) 180 rotation BYTE ^B01000000 BYTE ^B01000000 BYTE ^B11100000 BYTE ^B00000000 ;piece #11 (T) 270 rotation BYTE ^B10000000 BYTE ^B11100000 BYTE ^B10000000 BYTE ^B00000000 ;piece #12 (+) 0 rotation BYTE ^B01000000 BYTE ^B11100000 BYTE ^B01000000 BYTE ^B00000000 ;piece #12 (+) 90 rotation BYTE ^B01000000 BYTE ^B11100000 BYTE ^B01000000 BYTE ^B00000000 ;piece #12 (+) 180 rotation BYTE ^B01000000 BYTE ^B11100000 BYTE ^B01000000 BYTE ^B00000000 ;piece #12 (+) 270 rotation BYTE ^B01000000 BYTE ^B11100000 BYTE ^B01000000 BYTE ^B00000000 ;add new extended piece definitions here ;there must be four definitions for each piece (0, 90, 180, 270 rotations) ;this must come after all piece definitions PIECECOUNT=<<.-PIECE>/16.> END