vapsppr@prism.gatech.EDU (Paul Raines) (05/23/91)
Below is the code for H. Piper! I hope some future programmers out there find it an interesting learning tool. For those who just wish to change the key placement or type-o-matic rate, it should be pretty easy to do by simply changing the key definitions near the beginning. Good luck. Paul Raines vapsppr@prism.gatech.edu --------(start of Chipper code file for H. Piper)-------- ; H. Piper Game for the HP48SX ; (c) 1991 5/22 Paul Raines ; Version 1.2 ; Register usage: ; V0: Temporary data, may change during any call ; V1: Temporary data, may change during any call ; V2: Temporary data, may change during any call ; V3: Temporary data, may change during any call ; V4: Temporary data, may change during any call ; V5: Temporary data, may change during any call ; V6: Temporary data, may change during any call ; V7: Current Job Score (ones & tens) ; V8: Current Job Score (hundreds & up) ; V9: Current Box type ; VA: Box progression ; VB: Flow direction ; VC: Current Box pos ; VD: Paddle position ; VE: Speed Level ; VF: Flag register ; NOTE: Box position is stored in one register such that ; #34h ; y pos --^^--- x pos on grid ; ; Two registers are used for the score in order to ; have a decimal number greater than 255. ; ************************* ; START OF DEFINITIONS AREA ; ************************* F_UP = #00 ; direction definitions F_DOWN = #03 F_RIGHT = #06 F_LEFT = #05 B_NE = #1D ; pipe definitions B_SW = #15 B_NW = #1E ; NOTE THAT B_SE = #16 ; B_VERT = #01 ; B_SE xor F_UP and #07 = F_RIGHT B_HORZ = #02 ; B_SW xor F_UP and #07 = F_LEFT B_CROS = #03 ; B_NE xor F_LEFT and #07 = F_UP B_ESTR = #07 ; ... B_WSTR = #08 ; ... B_NSTR = #09 B_SSTR = #0A ; Key definitions ; ( 7 ) -> #1 ( 8 ) -> #2 ( 9 ) -> #3 ( / ) -> #C ; ( 4 ) -> #4 ( 5 ) -> #5 ( 6 ) -> #6 ( * ) -> #D ; ( 1 ) -> #7 ( 2 ) -> #8 ( 3 ) -> #9 ( - ) -> #E ; ( 0 ) -> #A ( . ) -> #0 ( _ ) -> #B ( + ) -> #F K_LEFT = #07 K_RIGHT = #08 K_UP = #03 K_DOWN = #06 K_FAST = #0F K_PLACE = #01 TYPERATE = #90 ; repeat rate for holding down key ; ****************** ; START OF CODE AREA ; ****************** JP FIRST COPYRIGHT: DA 'v1.2 Raines (c) 1991' FIRST: DB #00, #FF ; turnon extend mode LD VE, #4A ; starting level LD V0, 0 ; Zero total score LD V1, 0 ; " " LD I, TSCORE ; " " LD [I], V1 ; " " ; *** SETUP SCREEN, DATA AREA, AND REGISTERS FOR GAME PLAY *** START: CLS LD V0, #0B ; Fill grid array data LD V1, #00 ; area with unfilled LD V2, 0 ; unused grid sites CLEARGRID: LD I, BOXINFO ; " " ADD I, V2 ; " " LD [I], V1 ; " " ADD V2, 2 ; " " SE V2, 120 ; " " JP CLEARGRID ; " " LD V0, #00 ; Fill preview array data LD V2, 0 ; area with blank blocks CLEARPREV: LD I, PBOXINFO ; " " ADD I, V2 ; " " LD [I], V1 ; " " ADD V2, 2 ; " " SE V2, 6 ; " " JP CLEARPREV ; " " LD I, TITLE ; Draw title "H. Piper!" LD V0, 38 LD V1, 57 LD V3, 0 DRAWTITLE: ADD I, V3 DRW V0, V1, 5 LD V3, 5 ADD V0, 8 SE V0, 70 JP DRAWTITLE LD I, HDSCORE ; Draw score and level heading LD V0, 104 LD V1, 2 DRW V0, V1, 5 ADD V0, 8 LD V2, 5 ADD I, V2 DRW V0, V1, 5 LD I, HDLEVEL LD V0, 104 LD V1, 42 DRW V0, V1, 5 ADD V0, 8 LD V2, 5 ADD I, V2 DRW V0, V1, 5 LD V1, VE ; draw needed score SHR V1 LD V0, 100 SUB V0, V1 ; determine needed score LD I, TEMP LD B, V0 ; write BCD of needed score LD V2, [I] ; read BCD in three parts LD V3, 90 LD V4, 57 LD F, V1 ; point to sprite of tens digit DRW V3, V4, 5 ; draw it ADD V3, 5 LD F, V2 ; point to sprite of ones digit DRW V3, V4, 5 ; draw it LD V0, VE ; store the current level in memory LD I, LEVEL ; in case some uses FAST key LD [I], V0 LD I, HORZBOX ; draw top border LD V0, 0 LD V1, 0 RDTOP: DRW V0, V1, 2 ADD V0, 8 SE V0, 96 JP RDTOP LD V4, 2 RDPRV: LD I, PRV1BOX ; Draw preview boxes grids LD V0, 0 DRW V0, V4, 12 LD I, PRV2BOX LD V0, 8 DRW V0, V4, 12 ADD V4, 12 SE V4, 62 JP RDPRV LD V6, 0 PREVAGAIN: LD V0, V6 ; favor corners for first 4 preview boxes CALL NEWPREV ; randomly get five new ADD V6, 1 ; preview boxes SE V6, 5 JP PREVAGAIN LD V1, 50 ; draw bottom border LD V0, 16 LD I, FULLBOX RDBBDR: DRW V0, V1, 6 ADD V0, 8 SE V0, 96 JP RDBBDR LD V1, 0 ; Draw right border LD V0, 96 LD I, RBORDER RDRBDR: DRW V0, V1, 2 ADD V1, 2 SE V1, 56 JP RDRBDR LD VD, #34 ; Draw initial paddles CALL DRAWBPADL CALL DRAWSPADL CALL DRAWCRSHR LD V1, 2 ; Draw grid boxes LD I, GRID RDGRID1: LD V0, 16 RDGRID2: DRW V0, V1, 8 ADD V0, 8 SE V0, 96 JP RDGRID2 ADD V1, 8 SE V1, 50 JP RDGRID1 RND V3, 7 ; Draw random starting box ADD V3, 1 RND VC, #30 ADD VC, #10 ADD VC, V3 ; get random placement RND V3, 3 SHL V3 LD I, RANDDIR ADD I, V3 ; get random direction of opening LD V1, [I] LD VB, V0 ; starting flow direction LD V2, V1 LD V9, V2 ; starting box type LD V0, VC CALL DRAWBOX CALL GETBOXTYPE ; prevent change of starting box LD VA, 2 ; set starting progression LD V7, 0 ; zero current job score LD V8, 0 CALL WRITESCORE CALL WRITELEVEL LD V0, #FF ; maximum delay of progression LD DT, V0 ; for beginning of game ; *** MAIN PROCEDURE FOR PLAYING GAME *** GAMELOOP: LD V0, K_LEFT SKNP V0 CALL MOVELEFT ; move left if K_LEFT key pressed LD V0, K_RIGHT SKNP V0 CALL MOVERIGHT ; move right LD V0, K_UP SKNP V0 CALL MOVEUP ; move up LD V0, K_DOWN SKNP V0 CALL MOVEDOWN ; move down LD V0, K_PLACE SKNP V0 CALL PLACEBOX ; place box LD V0, K_FAST SKNP V0 LD VE, #02 ; go fast LD V0, DT SNE V0, 0 CALL PROGRESS JP GAMELOOP ; ***************************** ; START OF SUBROUTINE CODE AREA ; ***************************** ; Places next box on a grid site if allowed and updates preview boxes ; V1 - V5 modified PLACEBOX: LD V0, #F ; don't favor corners CALL NEWPREV ; get next box type (V2) and update preview LD V0, VD ; get pos to draw box CALL DRAWBOX ; draw box (V2) at desired box coord RET ; Takes paddle coord in VD and put x coord in V0, y coord in V1 ; V0 := (out) paddle x coord ; V1 := (out) paddle y coord ; VD := bott coord SPLITPOS: LD V0, VD LD V1, #0F AND V0, V1 ; store x part in V0 LD V1, VD SUB V1, V0 ; store y part in V1 RET ; The following 4 subroutines move the crosshair in the desired direction ; V0 := --- (m) ; V1 := --- (m) ; VD := paddle coord MOVELEFT: CALL DRAWBPADL ;erase old paddle CALL DRAWCRSHR CALL SPLITPOS ; calculate new pos ADD V0, #FF ; " SNE V0, #FF ; " LD V0, 0 ; " LD VD, V1 ; save new pos ADD VD, V0 CALL DRAWBPADL ; draw new position CALL DRAWCRSHR LD V0, TYPERATE CALL PAUSE RET MOVERIGHT: CALL DRAWBPADL ;erase old paddle CALL DRAWCRSHR CALL SPLITPOS ; calculate new pos ADD V0, #01 ; " SNE V0, #0A ; " LD V0, 9 ; " LD VD, V1 ; save new pos ADD VD, V0 CALL DRAWBPADL ; draw new position CALL DRAWCRSHR LD V0, TYPERATE CALL PAUSE ;NORIGHT: LD V0, K_RIGHT ; wait till key released ; SKNP V0 ; JP NORIGHT RET MOVEUP: CALL DRAWSPADL ;erase old paddle CALL DRAWCRSHR CALL SPLITPOS ; calculate new pos ADD V1, #F0 ; " SNE V1, #F0 ; " LD V1, 0 ; " LD VD, V1 ; save new pos ADD VD, V0 CALL DRAWSPADL ; draw new position CALL DRAWCRSHR LD V0, TYPERATE CALL PAUSE RET MOVEDOWN: CALL DRAWSPADL ;erase old paddle CALL DRAWCRSHR CALL SPLITPOS ; calculate new pos ADD V1, #10 ; " SNE V1, #60 ; " LD V1, #50 ; " LD VD, V1 ; save new pos ADD VD, V0 CALL DRAWSPADL ; draw new position CALL DRAWCRSHR LD V0, TYPERATE CALL PAUSE RET ; Draw bottom paddle ; V0 := --- (m) ; V1 := --- (m) ; VD := paddle coord DRAWBPADL: CALL SPLITPOS ; get paddle position ADD V0, #60 CALL BOXTOSCR LD I, BOTTPADL ; draw it DRW V0, V1, 4 RET ; Draw side paddle ; V0 := --- (m) ; V1 := --- (m) ; VD := paddle coord DRAWSPADL: CALL SPLITPOS LD V0, V1 ADD V0, #0A CALL BOXTOSCR LD I, SIDEPADL DRW V0, V1, 8 RET ; Draw crosshair ; V0 := --- (m) ; V1 := --- (m) ; VD := paddle coord DRAWCRSHR: LD V0, VD CALL BOXTOSCR LD I, CROSSHAIR DRW V0, V1, 8 RET ; All purpose pause subroutine ; V0 := (in) time to delay (m) PAUSE: ADD V0, #FF SE V0, 0 JP PAUSE RET ; Progress flow through current box ; V0 := --- (m) ; V1 := --- (m) ; V2 := --- (m) ; V3 := --- (m) ; V9 := current box type ; VA := box progression so far ; VB := flow direction ; VC := current box pos PROGRESS: LD V0, V9 ; Get box type LD V1, #F0 AND V0, V1 ; if box is a corner (type = #1X) SNE V0, 0 ; then see if need to change direction JP KEEPDIR SE VA, 5 ; if at 5th progression, change direction JP KEEPDIR XOR VB, V9 ; CHECK THIS OUT! Those value assignments LD V0, #07 ; for box and direction aren't arbitrary AND VB, V0 KEEPDIR: ADD VA, 1 ; increment progression LD V2, VA ; store progression in v2 SE VB, 0 ; invert progression if moving up JP NOINVERT ; ^- you will see why below (y position) LD V2, 8 SUB V2, VA NOINVERT: LD V0, VB ; store flow direction in v0 SHR V0 SHR V0 SE V0, 0 ; if flowing right left, skip to R_L_PROG JP R_L_PROG SE VB, 0 ; if flowing down, subtract one from progression ADD V2, #FF ; ^- graphical adjustment LD V0, VC ; copy box coord to v0 CALL BOXTOSCR ; convert to screen coord, v0=x,v1=y ADD V1, V2 ; add progression to y coord for screen pos LD I, VERTMOVE ; load address of vert moving flow DRW V0, V1, 1 ; draw vert moving flow SNE VF, 0 ; if collision took place JP SKIPIT ; check to make sure it SNE VA, 1 ; was only with crosshair JP ENDGAME ; else end the game JP SKIPIT ; end of vertical flow R_L_PROG: SE VB, 5 ; skip to right program if moving right JP RIGHTPRG LD V3, #80 ; start with 10000000 bitmap graphic LEFTPRG: SNE V2, 8 ; iterate over progressions left JP R_L_DRAW SHR V3 ; build proper sprite by shifting 1 digit right ADD V2, 1 ; for each progression not obtained JP LEFTPRG ; end of left flow RIGHTPRG: LD V3, #01 ; start with 00000001 RIGHTPRG2: SNE V2, 8 ; iterate over progressions left JP R_L_DRAW SHL V3 ; build proper sprite ADD V2, 1 JP RIGHTPRG2 ; end of right flow R_L_DRAW: LD V1, V3 LD V0, V3 LD I, TEMP LD [I], V1 ; store built sprite doubled in memory LD I, TEMP LD V0, VC CALL BOXTOSCR ; get position of box to progress flow ADD V1, 3 SE V9, B_CROS ; "tunnel under" if a crossbar and on 4,5 progr JP DRAWIT ; else draw the progression SNE VA, 4 JP NODRAW SE VA, 5 DRAWIT: DRW V0, V1, 2 ; write sprite to screen NODRAW: SNE VF, 0 ; if collision took place JP SKIPIT ; check to make sure it SNE VA, 1 ; was only with crosshair JP ENDGAME ; else end the game SKIPIT: SE VA, 8 ; if at end of progression through box JP ENDPROG CALL WRITESCORE LD V0, 0 SCOREIT: ADD V7, 1 ; earn 3 points for each box passed SE V7, 100 JP SCOREIT2 ADD V8, 1 LD V7, 0 SCOREIT2: ADD V0, 1 SE V0, 3 JP SCOREIT CALL WRITESCORE LD VA, 0 CALL GETNEXTBOX ; get next box pos CALL GETBOXTYPE ; get next box type and prevent change SNE V9, #0B JP ENDGAME ENDPROG: LD V0, VE ; resest timer for next progress check LD V1, V8 ADD V1, V7 SNE V1, 0 ADD V0, #B4 ; increase timer if only starting LD DT, V0 RET ; Wait until space key is pressed ; V0 := --- (m) WAIT: LD V0, #B WAIT2: SKP V0 ; wait till press space JP WAIT2 WAIT3: SKNP V0 JP WAIT3 ; wait till space key released RET ; Determine if game ends, tally score, and reset for next screen ; Changes everything ENDGAME: LD V0, #3 LD ST, V0 ; BEEP CALL WAIT CLS LD V2, 0 LD V3, 0 CHECKBONUS: LD I, BOXINFO ; iterate through box grid array ADD I, V2 ; adding together field LD V1, [I] ; that has a 1 if flowed through ADD V2, 2 ADD V3, V1 SE V2, 120 JP CHECKBONUS ; if every box flowed through SNE V3, 60 ; then give a bonus 100 points ADD V8, 1 LD I, TSCORE ; get old stored total score LD V1, [I] ADD V0, V7 ; add new score to total LD V3, 100 SUB V0, V3 LD V4, VF SE V4, 0 ; if over 100 ADD V1, 1 ; increment hundereds digit SE V4, 1 ; else ADD V0, 100 ; put back to normal ADD V1, V8 LD I, TSCORE ; save new total LD [I], V1 LD V5, V0 ; store tens & ones digit LD V3, 40 ; x coord to display total LD V4, 40 ; y coord to display total LD I, SCORE ; STORE BCD LD B, V1 ; of hundreds score to memory LD V2, [I] ; read BCD DB #F0, #30 ; point to sprite of ten thousands digit DRW V3, V4, 10 ADD V3, 11 DB #F1, #30 ; point to sprite of thousands digit DRW V3, V4, 10 ADD V3, 11 DB #F2, #30 ; point to sprite of hundreds digit DRW V3, V4, 10 LD I, SCORE ; STORE BCD LD B, V5 ; of tens & ones score to memory LD V2, [I] ; read BCD ADD V3, 11 DB #F1, #30 ; point to sprite of tens digit DRW V3, V4, 10 ADD V3, 11 DB #F2, #30 ; point to sprite of ones digit DRW V3, V4, 10 CALL WRITESCORE ; write score of last job in corner LD I, LEVEL LD V0, [I] LD VE, V0 ; get stored level in case FAST used SNE VE, #02 ; don't go beyond level 10 ADD VE, #08 ADD VE, #F8 ; make level harder SE V8, 0 JP GOODSCORE ; check if score good enough to continue SHR V0 ; need 100 - (41 - 4 * LEVEL) pts LD V1, 100 ; in order to continue SUB V1, V0 ; LVL 1 -> 63 SUB V7, V1 ; LVL 2 -> 67 SNE VF, 0 ; LVL 3 -> 71, and so on JP GAMEOVER ; if not, gameover GOODSCORE: CALL DROPWAIT ; show the dripping graphic and wait JP START ; go to next job GAMEOVER: LD I, HDOVER ; print 'OVER' on screen LD V0, 42 LD V1, 24 DRW V0, V1, 5 ADD V0, 8 LD V2, 5 ADD I, V2 DRW V0, V1, 5 CALL DROPWAIT ; show the dripping graphic and wait LD I, TSCORE ; get old stored total score LD V1, [I] DB #F1, #75 ; store total score in user flags DB #00, #FD ; exit game ; Wait with drop graphic ; V0 := --- (m) ; V1 := --- (m) ; V2 := --- (m) ; V3 := --- (m) ; V4 := --- (m) DROPWAIT: LD I, HORZBOX ; draw faucet type pipe LD V3, 2 LD V4, 8 DRW V3, V4, 8 LD I, SWBOX LD V3, 10 DRW V3, V4, 8 LD I, DROP ; draw drop and animate DROPIT: LD V3, 14 LD V4, 16 DRW V3, V4, 7 DRAWDROP: LD V0, #25 CALL PAUSE LD V0, #B SKNP V0 JP ENDDROP DRW V3, V4, 7 ADD V4, 2 SNE V4, 56 JP DROPIT DRW V3, V4, 7 JP DRAWDROP ENDDROP: RET ; Get screen coord from box coord ; V0 := (in) box coord, (out) screen x ; V1 := (out) screen y BOXTOSCR: LD V1, V0 LD VF, #F0 AND V1, VF SHR V1 ; get y part of box coord LD VF, #0F AND V0, VF ; get x part of box coord SHL V0 ; multipy box coords by 8 SHL V0 SHL V0 ADD V0, 16 ; add proper offsets to get screen coord ADD V1, 2 RET ; Get box coord from screen coord ; V0 := (in) screen x, (out) box coord ; V1 := (in) screen y, (m) SCRTOBOX: ADD V0, #F0 ; substr proper offsets ADD V1, #FE SHR V0 ; divide screen coords by 8 SHR V0 SHR V0 SHL V1 ADD V0, V1 ; put together into one register RET ; Get grid array addr from box coord ; V0 := (in) box coord (m) ; V1 := (m) ; I := addr BOXTOADDR: LD I, BOXINFO ; set address to beginning of box array LD V1, V0 LD VF, #0F AND V1, VF SHL V1 ADD I, V1 ; add x offset (2 * box x) LD VF, #F0 AND V0, VF SHR V0 LD V1, V0 SHR V1 SHR V1 ADD V0, V1 SHL V0 ADD I, V0 ; add y offset (20 * box y) RET ; Draws a box on the grid if possible. if not, penalize ; V0 := box coord (m) ; V1 := --- (m) ; V2 := box type (m) ; V3 := --- (m) ; V4 := --- (m) ; V5 := --- (m) DRAWBOX: LD V3, V0 ; push box coord CALL BOXTOADDR ; set I to array address LD V1, [I] ; read in current box LD V5, 0 SE V0, #0B ; if box already placed there, LD V5, #FF ; then penalty SNE V1, 00 ; if box full JP DRAWBOX2 LD V1, #3 ; then disallow LD ST, V1 ; and beep JP SKIPDRAW DRAWBOX2: CALL GETBITADDR ; get mask addr for current box LD V0, V3 ; pop box coord CALL BOXTOSCR ; convert to scr coord DRW V0, V1, 8 ; erase current box LD V0, V3 ; pop box coord CALL BOXTOADDR ; set I to array address LD V1, 0 LD V0, V2 LD [I], V1 ; write box type to array LD V0, V2 CALL GETBITADDR ; get mask addr for box LD V0, V3 ; pop box coord CALL BOXTOSCR ; get screen coord DRW V0, V1, 8 ; draw desired box SKIPDRAW: CALL WRITESCORE ADD V7, V5 ; substract penalty SE V7, #FF ; if V7 was not 0 JP NOADJUST ; no adjustment needed SNE V8, 0 ; else if V8 is 0 JP ZEROOUT ; set job score to 0 ADD V8, #FF ; else substract 100 LD V7, 99 ; and add 99 JP NOADJUST ZEROOUT LD V7, 0 NOADJUST: CALL WRITESCORE RET ; Gets bitmap address for box type ; V0 := box type ; V1 := --- (m) GETBITADDR: LD V1, #0F AND V0, V1 ; get offset to mask for box SHL V0 SHL V0 SHL V0 LD I, ZEROBOX ; set I to mask address ADD I, V0 ; add offset RET ; Get box type from storage array and mark it as unchangable ; V0 := (m) ; V1 := (m) ; V9 := (out) box type ; VC := box pos GETBOXTYPE: LD V0, VC ; get array addr from box pos CALL BOXTOADDR LD V1, [I] ; read boxtype LD V9, V0 LD V0, VC CALL BOXTOADDR ; prevent change of box LD V0, V9 LD V1, #01 LD [I], V1 RET ; Get box coord for next box depending on direction from last ; V0 := --- (m) ; V1 := --- (m) ; VB := direction of flow ; VC := (in) curr box coord, (out) next box coord GETNEXTBOX: LD V0, #00 SNE VB, F_RIGHT LD V0, #01 ; if right, add one to x SNE VB, F_DOWN LD V0, #10 ; if down, add one to y SNE VB, F_UP LD V0, #F0 ; if up, substract 1 from y SNE VB, F_LEFT LD V0, #FF ; if left, subtract 1 from x LD V1, VC ADD V1, V0 ; adjust LD VF, #F0 AND V1, VF SNE V1, #F0 ; if gone off top JP ENDGAME SNE V1, #60 ; if gone off bottom JP ENDGAME LD V1, VC ADD V1, V0 LD VF, #0F AND V1, VF SNE V1, #0F ; if gone off left JP ENDGAME SNE V1, #0A ; if gone off right JP ENDGAME ADD VC, V0 RET ; Get a new preview box and update list ; V0 := --- (m) ; V1 := --- (m) ; V2 := --- (m) , (out) box type dropped ; V3 := --- (m) ; V4 := --- (m) ; V5 := --- (m) NEWPREV: RND V1, 7 ; randomly determine new box SHR V0 SHR V0 SNE V0, 0 ; if favoring corners (V0 = 0,1,2,3) SHR V1 ; divide offset by 2 LD I, RANDBLK ADD I, V1 LD V0, [I] LD V5, V0 ; store new box type in V5 LD V4, 3 ; top preview box coord LD V3, 0 NEXTPREV: LD I, PBOXINFO ; shift old box graphics down ADD I, V3 LD V0, [I] LD V2, V0 CALL GETBITADDR ; erase old box graphic LD V0, 4 DRW V0, V4, 8 LD I, PBOXINFO ADD I, V3 LD V0, V5 LD [I], V0 CALL GETBITADDR ; draw new box graphic LD V0, 4 DRW V0, V4, 8 ADD V4, 12 LD V5, V2 ADD V3, 1 SE V3, 5 JP NEXTPREV RET ; Write the score to screen ; V0 := --- (m) ; V1 := --- (m) ; V2 := --- (m) ; V3 := --- (m) ; V4 := --- (m) ; V7 := (in) score WRITESCORE: LD V3, 105 ; x pos LD V4, 9 ; y pos LD I, SCORE ; write BCD LD B, V8 ; of hundred score to memory LD V2, [I] ; read BCD LD F, V2 ; point to sprite of hundreds digit DRW V3, V4, 5 ADD V3, 6 LD I, SCORE ; write BCD LD B, V7 ; of tens and ones score to memory LD V2, [I] ; read BCD LD F, V1 ; point to sprite of tens digit DRW V3, V4, 5 ADD V3, 6 LD F, V2 ; point to sprite of ones digit DRW V3, V4, 5 RET ; Write the level to screen ; V0 := --- (m) ; V1 := --- (m) ; V2 := --- (m) ; V3 := --- (m) ; V4 := --- (m) ; VE := (in) level WRITELEVEL: LD V0, VE ; convert speed to game level ADD V0, #FE SHR V0 SHR V0 SHR V0 LD V1, #0A SUB V1, V0 LD I, SCORE ; write BCD LD B, V1 ; of level to memory LD V2, [I] ; read BCD DB #F1, #30 ; point to sprite of tens digit LD V3, 104 LD V4, 50 DRW V3, V4, 10 ADD V3, 11 DB #F2, #30 ; point to sprite of ones digit DRW V3, V4, 10 RET ; ****************** ; START OF DATA AREA ; ****************** RBORDER: DW #F8F8 PRV1BOX: DW #C0C0, #C0C0, #C0C0, #C0C0, #C0C0, #C0FF PRV2BOX: DW #0303, #0303, #0303, #0303, #0303, #03FF LEVEL: DW #0000 ZEROBOX: DW #0000, #0000, #0000, #0000 ;0 blank box VERTBOX: DW #C3C3, #C3C3, #C3C3, #C3C3 ;1 vertical pipe HORZBOX: DW #FFFF, #0000, #0000, #FFFF ;2 horizontal pipe CROSBOX: DW #C3C3, #0000, #0000, #C3C3 ;3 crossing pipes FULLBOX: DW #FFFF, #FFFF, #FFFF, #FFFF ;4 full box SWBOX: DW #FFFF, #0303, #0303, #C3C3 ;5 south to west pipe SEBOX: DW #FFFF, #C0C0, #C0C0, #C3C3 ;6 south to east pipe ESTRBOX: DW #FFFF, #C0C0, #C0C0, #FFFF ;7 east open start pipe WSTRBOX: DW #FFFF, #0303, #0303, #FFFF ;8 west open start pipe NSTRBOX: DW #C3C3, #C3C3, #C3C3, #FFFF ;9 north open start pipe SSTRBOX: DW #FFFF, #C3C3, #C3C3, #C3C3 ;A south open start pipe GRID: DW #007E, #4242, #4242, #7E00 ;11 (B) empty grid site TEMP: DW #0000, #0000, #0000, #0000 ;12 (C) temp memory area NEBOX: DW #C3C3, #C0C0, #C0C0, #FFFF ;13 (D) north to east pipe NWBOX: DW #C3C3, #0303, #0303, #FFFF ;14 (E) north to west pipe CROSSHAIR: DW #0000, #183C, #3C18, #0000 ;15 (F) SIDEPADL: DW #0010, #1070, #7010, #1000 BOTTPADL: DW #0018, #187E VERTMOVE: DW #1800 ; bitmap of vertical flow RANDBLK: DW #1D15, #161E, #0102, #0303 ; used for random block select RANDDIR: DW #0607, #0508, #0009, #030A ; used for random direction PBOXINFO: DW #0000, #0000, #0000 ; preview box info SCORE: DW #0000, #0000 ; total score storage TSCORE: DW #0000, #0000 ; temp score area TITLE: DW #A3A2, #E3A2, #AABB, #9293, #123A TITLE2: DW #BBA2, #B322, #3A88, #8888, #4048 HDSCORE: DW #D992, #D252, #D93B, #AAB3, #AA2B HDLEVEL: DW #9A92, #9A91, #D9B4, #A4B4, #2436 HDOVER: DW #EAAA, #AEA4, #E4EE, #8ACE, #89E9 DROP: DW #2020, #70F8, #F8F8, #7000 BOXINFO: DW #0B00, #0B00, #0B00, #0B00, #0B00 ; 60x2 array for X1: DW #0B00, #0B00, #0B00, #0B00, #0B00 ; storage of grid X2: DW #0B00, #0B00, #0B00, #0B00, #0B00 ; placements and X3: DW #0B00, #0B00, #0B00, #0B00, #0B00 ; flow control X4: DW #0B00, #0B00, #0B00, #0B00, #0B00 X5: DW #0B00, #0B00, #0B00, #0B00, #0B00 X6: DW #0B00, #0B00, #0B00, #0B00, #0B00 X7: DW #0B00, #0B00, #0B00, #0B00, #0B00 X8: DW #0B00, #0B00, #0B00, #0B00, #0B00 X9: DW #0B00, #0B00, #0B00, #0B00, #0B00 X10: DW #0B00, #0B00, #0B00, #0B00, #0B00 X11: DW #0B00, #0B00, #0B00, #0B00, #0B00 ------( end of source code)-------------------------- -- Paul Raines Georgia Institute of Technology, Atlanta Georgia, 30332 uucp: ...!{decvax,hplabs,ncar,purdue,rutgers}!gatech!prism!vapsppr Internet: vapsppr@prism.gatech.edu
S088960@UMRVMA.UMR.EDU (05/24/91)
Sorry, wrong title. I am having a big problem with superchip. I cannot get asc to convert the file into a lib. I have used asc on other program, including the older version of chip. If Anyone has a copy of Schip that they know will work, please send it to me. I would greatly appreciate it.