; Forbidden planet. Spectrum source, massaged for zxspin. Generates working code. ; ; This code is (c) 1985..2008 Simon Brattel. All rights reserved, etc, etc, yada yada ya. ; ; Policy - to make the generated code as close as possible to the original release code. ; ; Therefore this source contains the original anti-piracy code, make sure the top bit ; of R is set. Or better yet, remove the test code (it is commented). ; ; I've had a terrible time converting the Zeus(5) source to work with the assembler ; in zxspin... I think it's now generating the right code, it seems to work. ; ; There were originally lots of separate sources, but I've stitched them together ; into this one to make life easier. One of the original sources has been lost, ; the one that had all the equates in it. Fortunately I've been able to recover ; those using a disassembler or to be more accurate I've recovered their values. ; ; Where these values were computed using expressions those have been lost. ; ; The formatting is very close to the original 1985 source, except where I've had to ; change some labels because this assembler couldn't distinguish between the case ; sensitive originals or it couldn't distinguish between symbols having the same ; characters as mnemonics. ; ; I did this with string search/replace operations that may have altered some of the ; displayed text accidentally... Don't think they have, but if something looks ; suspicious that's probably the cause. ; ; In this code there are a lot of 16-bit loads to/from indexed variables. As a point ; of interest the original source had these as, say, ld hl,(ix+dObjepDraw) which ; looked a hell of a lot tidier than this. Not that this is a fault of zxspin, Zeus ; was unusual in that it supported these 16-bit pseudo-ops. I added support for them ; during the development of Dark Star. The tokenised source architecture of Zeus didn't ; lend itself to supporting macro's, and I've never much liked macro's anyway, but ; I'd extend Zeus at the drop of a hat. Go figure... ; ; Appears to assemble correctly with the default zxspin assembler options (v0.666) ; ; Pause the spectrum, assemble this source, program/run from the menu and unpause the spectrum ; Have fun... ; ; Feel free to improve it, and send me anything interesting -> crem@desdes.com ; ; Spectrum equates ScreenBase equ $4000 ; Attrs equ $5800 ; lAttrs equ $300 ; ; Front end source starts nOptions equ 3 ; MessWait equ 4000 ; ; General equates CodeFlashRate equ 100 ; ArrowPos1 equ $4004 ArrowPos2 equ $50BF GameRunning equ 0 ; GameFinished equ 1 ; GameQuit equ 2 ; ModeDemo equ 1 ; ; Maximum number of objects nObjes equ 18 ; ; Maximum number of lines nLines equ 200 ; ; Maximum number of stars (stars are surprisingly expensive) nStars equ 25 ; ; Object flag byte bits bOnScreen equ 0 ; bKilled equ 1 ; bRepeat equ 2 ; bCursorClip equ 3 ; bScreenClip equ 4 ; bSlug equ 5 ; bFake equ 6 ; ; Those bits as masks bbSetWind equ $01 ; bbKilled equ $02 ; bbRepeat equ $04 ; bbCursorClip equ $08 ; bbScreenClip equ $10 ; bbSlug equ $20 ; bbFake equ $40 ; ; Another flag byte's bits bClipCent equ 0 ; bbClipCent equ $01 ; bbClipBelow equ $02 ; MinZ equ $01A0 ; ; Scores for objects shot HoleScore equ 1 ; MissScore equ 1 ; TowerScore equ 1 ; ; Damage added on impact with objects FuelDam equ 6 ; TowerDam equ -12 ; SoundPort equ $FE ; nCodes equ 16 ; CodesX equ 160 ; CodesXc equ 255-(6*5) ; MapoY equ 3 ; MapoX equ 16 ; MapFlashRate equ 200 ; CodeUpdateRate equ 100 ; ; Object types tFHoleS equ $00 ; tFHoleM equ $01 ; tFHoleL equ $02 ; tIris equ $09 ; tMiss equ $10 ; tMissA equ $11 ; tProj equ $14 ; tSAMs equ $15 ; tSAMm equ $16 ; tSAMf equ $17 ; tSAMas equ $18 ; tSAMss equ $1B ; tMine equ $1C ; tBunker equ $1D ; tCodeXmit equ $1E ; tCodeXmit1 equ $1E ; tSAMSqu equ $1F ; tTowerS equ $20 ; tTowerM equ $21 ; tTowerL equ $22 ; tSquMiss equ $23 ; tRising equ $24 ; tFuel equ $25 ; tWarp equ $26 ; ; Player movement equates Zdvacc equ -10 ; Zdvdec equ 10 ; dDX equ 2 ; dDY equ 2 ; Xdtstep equ 2 ; Ydtstep equ 2 ; StartY equ $02BC ; StartZ equ $FFCB ; MinSP equ -52 ; MaxSP equ -500 ; ProjSP equ 620 ; HighY equ 17000 ; LowY equ 100 ; DamFSD equ 71 ; ; Offsets to fields in an object ; ie the NN values used in (ix+NN) addressing modes dpnObje_L equ 0 ; dpnObje_H equ 1 ; dppObje_L equ 2 ; dppObje_H equ 3 ; dpnFreeObje_L equ 4 ; dpnFreeObje_H equ 5 ; dObjeX_L equ 6 ; dObjeX_H equ 7 ; dObjeY_L equ 8 ; dObjeY_H equ 9 ; dObjeZ_L equ 10 ; dObjeZ_H equ 11 ; dObjedX_L equ 12 ; dObjedX_H equ 13 ; dObjedY_L equ 14 ; dObjedY_H equ 15 ; dObjedZ_L equ 16 ; dObjedZ_H equ 17 ; dObjeOX_L equ 18 ; dObjeOX_H equ 19 ; dObjeOY_L equ 20 ; dObjeOY_H equ 21 ; dObjeOZ_L equ 22 ; dObjeOZ_H equ 23 ; dObjeDispXL_L equ 24 ; dObjeDispXL_H equ 25 ; dObjeDispXR_L equ 26 ; dObjeDispXR_H equ 27 ; dObjeDispYT_L equ 28 ; dObjeDispYT_H equ 29 ; dObjeDispYB_L equ 30 ; dObjeDispYB_H equ 31 ; dObjepLines_L equ 32 ; 8 line pointers dObjepLines_H equ 33 ; ; These variables overlap line pointers dObjeFFH1_L equ 34 ; dObjeFFH1_H equ 35 ; dObjeFFH2_L equ 36 ; dObjeFFH2_H equ 37 ; dObjeFFV1_L equ 38 ; dObjeFFV1_H equ 39 ; dObjeFFV2_L equ 40 ; dObjeFFV2_H equ 41 ; ; 42 .. 47 are used for line pointers dObjepDraw equ 48 ; dObjepUnDraw equ 49 ; dObjeDraw_L equ 50 ; dObjeDraw_H equ 51 ; dObjeShot_L equ 52 ; dObjeShot_H equ 53 ; dObjeColl_L equ 54 ; dObjeColl_H equ 55 ; dObjeMiss_L equ 56 ; dObjeMiss_H equ 57 ; dObjeAlter_L equ 58 ; dObjeAlter_H equ 59 ; dObjeMove_L equ 60 ; dObjeMove_H equ 61 ; dObjeFlags equ 62 ; dObjeStateF equ 63 ; dObjeStarComp equ 64 ; dObjeAXS_L equ 65 ; dObjeAXS_H equ 66 ; dObjeAYS_L equ 67 ; dObjeAYS_H equ 68 ; dObjepSizeTab_L equ 69 ; dObjepSizeTab_H equ 70 ; dObjeCnt equ 71 ; dObjeBdXS_L equ 72 ; dObjeBdXS_H equ 73 ; dObjeBdYS_L equ 74 ; dObjeBdYS_H equ 75 ; dObjeBXS_L equ 76 ; dObjeBXS_H equ 77 ; dObjeBYS_L equ 78 ; dObjeBYS_H equ 79 ; dObjeWindF equ 80 ; dObjeCol equ 81 ; dObjeCntA equ 82 ; dObjeCntiA equ 83 ; dObjeCntB equ 84 ; dObjeCntiB equ 85 ; dObjeWidthX equ 86 ; dObjeWidthY equ 87 ; dObjeClipFlags equ 88 ; dObjeWeapon equ 89 ; lObje equ 90 ; ; Offsets to fields in a star dpnStar_L equ 0 ; dpnStar_H equ 1 ; dpnStarFree_L equ 2 ; dpnStarFree_H equ 3 ; dStarX_L equ 4 ; dStarX_H equ 5 ; dStarY_L equ 6 ; dStarY_H equ 7 ; dStarZ_L equ 8 ; dStarZ_H equ 9 ; dStarAddr_L equ 10 ; dStarAddr_H equ 11 ; dStarBit equ 12 ; dStarFlag equ 13 ; lStar equ 14 ; ; Offsets to fields in a list of objects dL_pList_L equ 0 ; dL_pList_H equ 1 ; dL_Z_L equ 2 ; dL_Z_H equ 3 ; ; Offsets to an entry in a list of objects dOL_Type equ 0 ; dOL_X_L equ 1 ; dOL_X_H equ 2 ; dOL_Y_L equ 3 ; dOL_Y_H equ 4 ; dOL_Z_L equ 5 ; dOL_Z_H equ 6 ; dOL_ListFlag equ 7 ; lList equ 8 ; ; Offsets to the demonstration data dDemoText_L equ 0 ; dDemoText_H equ 1 ; dDemoObje_L equ 2 ; dDemoObje_H equ 3 ; ; Offsets to a line object dpLineAlg_L equ 0 ; dpLineAlg_H equ 1 ; dpnLine_L equ 2 ; dpnLine_H equ 3 ; dpnLineFree_L equ 4 ; dpnLineFree_H equ 5 ; dLineA equ 6 ; dLineB equ 7 ; dLineC equ 8 ; dLineD equ 9 ; dLineE equ 10 ; dLineL equ 11 ; dLineH equ 12 ; dLineA1 equ 13 ; dLineC1 equ 14 ; dLineE1 equ 15 ; dLineL1 equ 16 ; dLineH1 equ 17 ; dLineSxx equ 18 ; dLineBit equ 19 ; dLineSyy equ 20 ; dLineHV equ 21 ; dLineIX_L equ 22 ; dLineIX_H equ 23 ; lLine equ 24 ; ; Offsets to a tunnel (wormhole) definition dTunnelPos1_L equ 0 ; dTunnelPos1_H equ 1 ; dTunnelAngle1 equ 2 ; dTunnelPos2_L equ 3 ; dTunnelPos2_H equ 4 ; dTunnelAngle2 equ 5 ; ; Offsets to a window object dWindZ_L equ 0 ; dWindZ_H equ 1 ; dWindL_L equ 3 ; dWindL_H equ 4 ; dWindR_L equ 5 ; dWindR_H equ 6 ; dWindU_L equ 7 ; dWindU_H equ 8 ; dWindD_L equ 9 ; dWindD_H equ 10 ; lWind equ 11 ; ; Equates for the hidden rhino hunt game dRhinoSpeed equ 0 ; dRhinoiSpeed equ 1 ; dRhinoPos_L equ 2 ; dRhinoPos_H equ 3 ; dRhinoFlag equ 4 ; lRhino equ 5 ; RhinoMap equ $6700 ; RhinoList equ $6800 ; cRhinoTree equ $13 ; cRhinoBlank equ $14 ; cRhinoChar equ $17 ; cRhinoMan equ $15 ; cRhinoExit equ $16 ; cRhinoFuel equ $0D ; ; Vectors to other parts of the code. This isn't included in this source (yet)... SpaceInvaders equ $DA00 ; ; Start of Spectrum free memory org $5B00 ; Include the fixed data and the start vector ; These are some fixed data fields generated by other tools... ; Character set graphics pChars defb $00,$00,$00,$00,$00,$00,$00,$00 defb $80,$80,$80,$80,$80,$00,$80,$00 defb $A0,$A0,$A0,$00,$00,$00,$00,$00 defb $50,$50,$F8,$50,$F8,$50,$50,$00 defb $20,$78,$A0,$70,$28,$F0,$20,$00 defb $C0,$C8,$10,$20,$40,$98,$18,$00 defb $40,$A0,$A0,$40,$A8,$90,$68,$00 defb $80,$80,$80,$00,$00,$00,$00,$00 defb $20,$40,$80,$80,$80,$40,$20,$00 defb $80,$40,$20,$20,$20,$40,$80,$00 defb $20,$A8,$70,$20,$70,$A8,$20,$00 defb $00,$20,$20,$F8,$20,$20,$00,$00 defb $00,$00,$00,$00,$40,$40,$80,$00 defb $00,$00,$00,$F8,$00,$00,$00,$00 defb $00,$00,$00,$00,$00,$00,$80,$00 defb $00,$08,$10,$20,$40,$80,$00,$00 defb $70,$88,$98,$A8,$C8,$88,$70,$00 defb $20,$60,$20,$20,$20,$20,$70,$00 defb $70,$88,$08,$30,$40,$80,$F8,$00 defb $F8,$08,$10,$30,$08,$88,$70,$00 defb $10,$30,$50,$90,$F8,$10,$10,$00 defb $F8,$80,$F0,$08,$08,$88,$70,$00 defb $38,$40,$80,$F0,$88,$88,$70,$00 defb $F8,$08,$10,$20,$40,$40,$40,$00 defb $70,$88,$88,$70,$88,$88,$70,$00 defb $70,$88,$88,$78,$08,$10,$E0,$00 defb $00,$00,$80,$00,$80,$00,$00,$00 defb $00,$00,$40,$00,$40,$40,$80,$00 defb $10,$20,$40,$80,$40,$20,$10,$00 defb $00,$00,$F8,$00,$F8,$00,$00,$00 defb $80,$40,$20,$10,$20,$40,$80,$00 defb $70,$88,$10,$20,$20,$00,$20,$00 defb $70,$88,$A8,$B8,$B0,$80,$78,$00 defb $20,$50,$88,$88,$F8,$88,$88,$00 defb $F0,$88,$88,$F0,$88,$88,$F0,$00 defb $70,$88,$80,$80,$80,$88,$70,$00 defb $F0,$88,$88,$88,$88,$88,$F0,$00 defb $F8,$80,$80,$F0,$80,$80,$F8,$00 defb $F8,$80,$80,$F0,$80,$80,$80,$00 defb $78,$80,$80,$80,$98,$88,$78,$00 defb $88,$88,$88,$F8,$88,$88,$88,$00 defb $E0,$40,$40,$40,$40,$40,$E0,$00 defb $08,$08,$08,$08,$08,$88,$70,$00 defb $88,$90,$A0,$C0,$A0,$90,$88,$00 defb $80,$80,$80,$80,$80,$80,$F8,$00 defb $88,$D8,$A8,$A8,$88,$88,$88,$00 defb $88,$88,$C8,$A8,$98,$88,$88,$00 defb $70,$88,$88,$88,$88,$88,$70,$00 defb $F0,$88,$88,$F0,$80,$80,$80,$00 defb $70,$88,$88,$88,$A8,$90,$68,$00 defb $F0,$88,$88,$F0,$A0,$90,$88,$00 defb $70,$88,$80,$70,$08,$88,$70,$00 defb $F8,$20,$20,$20,$20,$20,$20,$00 defb $88,$88,$88,$88,$88,$88,$70,$00 defb $88,$88,$88,$88,$88,$50,$20,$00 defb $88,$88,$88,$A8,$A8,$D8,$88,$00 defb $88,$88,$50,$20,$50,$88,$88,$00 defb $88,$88,$50,$20,$20,$20,$20,$00 defb $F8,$08,$10,$20,$40,$80,$F8,$00 defb $F8,$C0,$C0,$C0,$C0,$C0,$F8,$00 defb $00,$80,$40,$20,$10,$08,$00,$00 defb $F8,$18,$18,$18,$18,$18,$F8,$00 defb $20,$70,$A8,$20,$20,$20,$00,$00 defb $00,$00,$00,$00,$00,$00,$F8,$00 defb $00,$00,$00,$00,$00,$00,$00,$00 defb $00,$00,$68,$98,$88,$98,$68,$00 defb $80,$80,$B0,$C8,$88,$C8,$B0,$00 defb $00,$00,$78,$80,$80,$80,$78,$00 defb $08,$08,$68,$98,$88,$98,$68,$00 defb $00,$00,$70,$88,$F8,$80,$70,$00 defb $20,$40,$40,$E0,$40,$40,$40,$00 defb $00,$00,$78,$88,$98,$68,$08,$70 defb $80,$80,$F0,$88,$88,$88,$88,$00 defb $80,$00,$80,$80,$80,$80,$80,$00 defb $00,$20,$00,$20,$20,$20,$20,$C0 defb $80,$80,$90,$A0,$E0,$90,$88,$00 defb $C0,$40,$40,$40,$40,$40,$E0,$00 defb $00,$00,$D0,$A8,$A8,$A8,$A8,$00 defb $00,$00,$F0,$88,$88,$88,$88,$00 defb $00,$00,$70,$88,$88,$88,$70,$00 defb $00,$00,$F0,$88,$88,$F0,$80,$80 defb $00,$00,$78,$88,$88,$78,$08,$08 defb $00,$00,$B0,$C0,$80,$80,$80,$00 defb $00,$00,$78,$80,$70,$08,$F0,$00 defb $00,$20,$F8,$20,$20,$20,$18,$00 defb $00,$00,$88,$88,$88,$88,$78,$00 defb $00,$00,$88,$88,$50,$50,$20,$00 defb $00,$00,$88,$88,$88,$A8,$50,$00 defb $00,$00,$88,$50,$20,$50,$88,$00 defb $00,$00,$90,$90,$90,$F0,$10,$E0 defb $00,$00,$F8,$10,$20,$40,$F8,$00 defb $30,$40,$40,$80,$40,$40,$30,$00 defb $00,$80,$80,$00,$00,$80,$80,$00 defb $C0,$20,$20,$10,$20,$20,$C0,$00 defb $50,$00,$70,$88,$F8,$80,$70,$00 defb $00,$00,$08,$70,$80,$00,$00,$00 ; Character widths wChars defb $07,$09,$09,$09,$09,$09,$09,$03 defb $05,$05,$05,$05,$03,$05,$05,$05 defb $05,$03,$05,$05,$05,$05,$09,$09 ; " " .. defb $07,$09,$07,$02,$05,$09,$07,$09 defb $06,$02,$04,$06,$06,$06,$06,$02 defb $04,$04,$06,$06,$03,$06,$02,$06 defb $06,$06,$06,$06,$06,$06,$06,$06 defb $06,$06,$02,$03,$05,$06,$05,$06 defb $06,$06,$06,$06,$06,$06,$06,$06 defb $06,$04,$06,$06,$06,$06,$06,$06 defb $06,$06,$06,$06,$06,$06,$06,$06 defb $06,$06,$06,$06,$06,$06,$06,$06 defb $06,$06,$06,$06,$06,$06,$04,$06 defb $06,$02,$04,$06,$04,$06,$06,$06 defb $06,$06,$05,$06,$06,$06,$06,$06 defb $06,$05,$06,$05,$02,$05,$06,$06 defb $03,$06,$0C,$12,$18,$1E,$24,$2A ; Wide spaces $80..? defb $30,$36,$3C,$42,$48,$06,$06,$06 defb $01,$02,$03,$04,$05,$06,$06,$06 defb $06,$06,$06,$06,$06,$06,$06,$06 defb $06,$06,$06,$06,$06,$06,$06,$06 defb $06,$06,$06,$06,$06,$06,$06,$06 defb $06,$06,$06,$06,$06,$06,$06,$06 defb $06,$06,$06,$06,$06,$06,$06,$06 defb $06,$06,$06,$06,$06,$06,$06,$06 defb $06,$06,$06,$06,$06,$06,$06,$06 defb $06,$06,$06,$06,$06,$06,$06,$06 defb $06,$06,$06,$06,$06,$06,$06,$06 defb $06,$06,$06,$06,$06,$06,$06,$06 defb $06,$06,$06,$06,$06,$06,$06,$06 defb $06,$06,$06,$06,$06,$06,$06,$06 defb $06,$06,$06,$06,$06,$06,$06,$06 ; The user-defined key codes UDKTab defb $01,$FF,$FF,$FF,$FF,$FF,$FF,$FF defb $FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF defb $02,$FF,$FF,$FF,$FF,$FF,$FF,$FF defb $FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF defb $26,$FF,$FF,$FF,$FF,$FF,$FF,$FF defb $FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF defb $25,$FF,$FF,$FF,$FF,$FF,$FF,$FF defb $FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF defb $0A,$FF,$FF,$FF,$FF,$FF,$FF,$FF defb $FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF defb $05,$FF,$FF,$FF,$FF,$FF,$FF,$FF defb $FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF defb $06,$07,$08,$09,$22,$21,$20,$1F defb $FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF defb $FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF defb $FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF ; Initial settings for the user-defined keys iUDKTab defb $01,$FF,$FF,$FF,$FF,$FF,$FF,$FF defb $FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF defb $02,$FF,$FF,$FF,$FF,$FF,$FF,$FF defb $FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF defb $26,$FF,$FF,$FF,$FF,$FF,$FF,$FF defb $FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF defb $25,$FF,$FF,$FF,$FF,$FF,$FF,$FF defb $FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF defb $0A,$FF,$FF,$FF,$FF,$FF,$FF,$FF defb $FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF defb $05,$FF,$FF,$FF,$FF,$FF,$FF,$FF defb $FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF defb $06,$07,$08,$09,$22,$21,$20,$1F defb $FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF defb $FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF defb $FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF ; The map of the planet. Map defb $FD,$20,$FE,$FE,$FE,$FE,$FE,$0F defb $0E,$0D,$07,$FF,$FF,$18,$02,$FF defb $FF,$00,$FC,$FE,$FE,$FF,$01,$FF defb $FB,$18,$FE,$FE,$FE,$FE,$FE,$FE defb $22,$21,$FE,$FF,$10,$19,$1A,$FF defb $28,$05,$20,$21,$22,$23,$24,$0A defb $FB,$FF,$FE,$02,$FF,$FF,$19,$FF defb $FF,$18,$FE,$08,$09,$08,$09,$08 defb $23,$FE,$06,$1B,$22,$23,$24,$FF defb $04,$FE,$25,$1C,$FF,$FF,$27,$23 defb $18,$10,$FF,$11,$12,$19,$18,$19 defb $FF,$18,$28,$FE,$FC,$09,$FB,$03 defb $00,$FE,$FE,$FC,$25,$FB,$25,$FC defb $FE,$FE,$27,$1D,$FB,$1E,$FC,$03 defb $FE,$FE,$13,$FE,$18,$FE,$FC,$19 defb $04,$FF,$FF,$08,$09,$FF,$FF,$FF defb $01,$02,$FE,$11,$26,$27,$26,$1F defb $FF,$19,$26,$FF,$FF,$1F,$18,$FE defb $20,$11,$14,$FE,$19,$FC,$29,$09 defb $FC,$21,$FF,$22,$23,$FE,$FE,$FE defb $FE,$FE,$03,$FF,$12,$FC,$18,$FF defb $FB,$FF,$24,$23,$1B,$23,$27,$19 defb $24,$15,$16,$FE,$FE,$10,$FF,$18 defb $05,$23,$FF,$22,$25,$FE,$FE,$00 defb $FE,$FE,$05,$04,$06,$1B,$1F,$1A defb $FF,$18,$FE,$29,$1C,$FF,$FE,$1A defb $FF,$10,$11,$12,$2A,$FB,$01,$13 defb $FC,$20,$FF,$21,$08,$10,$19,$04 defb $00,$07,$FF,$FF,$13,$FF,$19,$FF defb $FE,$01,$FE,$1D,$1E,$FB,$09,$FE defb $FE,$23,$24,$02,$2B,$17,$FF,$09 defb $FC,$21,$FF,$24,$01,$02,$FB,$03 defb $FE,$FF,$24,$FF,$14,$FF,$FC,$FF defb $FE,$2A,$FF,$1F,$1E,$00,$01,$07 defb $04,$05,$06,$FF,$FF,$FF,$08,$18 defb $11,$20,$FF,$11,$FF,$FF,$FF,$04 defb $FE,$FF,$FF,$FB,$FE,$FE,$FF,$FE defb $FE,$FE,$03,$18,$05,$FF,$2B,$27 defb $20,$FF,$21,$22,$23,$24,$25,$26 defb $FF,$FE,$FF,$20,$FE,$FE,$FF,$FC defb $FE,$FE,$1C,$1D,$19,$06,$FC,$0F defb $27,$FF,$FB,$02,$0E,$0D,$0C,$20 defb $20,$FE,$FF,$00,$FB,$01,$FE,$FF defb $10,$11,$FE,$03,$08,$FE,$FF,$FC defb $FE,$FE,$1E,$1C,$FF,$FF,$15,$18 defb $23,$FF,$FC,$FF,$FE,$FE,$0B,$22 defb $27,$FF,$FF,$FF,$FF,$FF,$FF,$FF defb $12,$13,$FE,$2C,$09,$26,$08,$FC defb $FE,$FE,$25,$00,$21,$FF,$16,$FB defb $21,$04,$FF,$FF,$FE,$FE,$0A,$24 defb $21,$FF,$FE,$FE,$22,$23,$05,$11 defb $12,$13,$14,$04,$08,$26,$09,$00 defb $FE,$03,$FF,$26,$07,$15,$17,$19 defb $08,$09,$FF,$FE,$FE,$FF,$FC,$FF defb $FF,$FE,$FC,$02,$FC,$03,$FE,$FE defb $18,$FB,$10,$03,$17,$FF,$18,$05 defb $FE,$05,$27,$FE,$20,$01,$04,$FC defb $0A,$0B,$1A,$1B,$FC,$FF,$FE,$10 defb $20,$21,$22,$23,$24,$FF,$00,$01 defb $18,$19,$FF,$FE,$10,$FB,$04,$FE defb $FE,$FE,$04,$2C,$FE,$FE,$FE,$0D defb $0C,$FC,$05,$FB,$03,$19,$FE,$11 defb $FF,$FF,$23,$24,$25,$FF,$04,$05 defb $18,$19,$06,$07,$FE,$FC,$FE,$FE ; This is the correct entry point Main jp FireUp ; Vector off to the start FireUpVector equ $-2 ; This modified to hide the check code later ; Point to the four different HighScore tables... Only two really. HighPtrs defw HighScores,HighScores1,HighScores,HighScores1 ; ; Now have the initial highscore tables. HighScores defb "I see chidren with vacant stares",$00,$01,$00 defb "I thought I heard them say . . . ",$00,$01,$00 defb "Don't think sorry's easily said",$00,$01,$00 defb " ",$00,$01,$00 defb "The price of infamy , the edge of insanity",$00,$01,$00 defb "Talking 'bout stupid things",$00,$01,$00 defb "She is dancing away from you now",$00,$01,$00 defb "Take me for a fool if you feel that's right",$00,$01,$00 defb "Or a whipping boy , someone to despise",$00,$01,$00 defb "Please don't look at me this way",$00,$01,$00 defb " ",$00,$01,$00 defb "It's coming for me thro' the trees",$00,$01,$00 defb "And you may ask yourself",$00,$01,$00 defb "Wonder why . . What makes me rise so high",$00,$01,$00 defb "Surely you know-the chance has gone by",$00,$01,$00 defb "And my spirit is crying for leaving",$00,$01,$00 HighScores1 defb "We're not scared to lose it all",$00,$01,$00 defb "Security gone to the wall",$00,$01,$00 defb "Future dreams we have to realise",$00,$01,$00 defb "A thousand critics hands",$00,$01,$00 defb "Won't keep us from the things we plan",$00,$01,$00 defb "While we cling to the Things we prize",$00,$01,$00 defb "And do you feel scared - I do",$00,$01,$00 defb "But I won't stop and falter",$00,$01,$00 defb "And if we threw it all away",$00,$01,$00 defb "Things can only get better",$00,$01,$00 defb "Treating this as though it was",$00,$01,$00 defb "The last , the final game",$00,$01,$00 defb "Get to christmas and feel no regret",$00,$01,$00 defb "It may take a little time",$00,$01,$00 defb "A lonely path , an uphill climb",$00,$01,$00 defb "Success or failure cannot alter us",$00,$01,$00 defb "Please excuse me , I have some aging & dying to " defb "be getting on with ." ; Fill the rest of the highscore table buffer with zeros defs (HighScores+$600) - $,$00 ; The highscore editing line HSBuffer defs $80,$00 ; Encrypted end message... Message defb $F4,$F4,$F4,$ED,$33,$4F,$48,$52 defb $07,$4A,$4C,$58,$07,$48,$52,$07 defb $42,$56,$51,$51,$4C,$42,$53,$07 defb $00,$07,$33,$4F,$4C,$07,$54,$4C defb $52,$52,$40,$4E,$4C,$07,$51,$4C defb $40,$43,$52,$07,$19,$14,$F4,$F4 defb $F4,$EC,$01,$07,$15,$07,$15,$07 defb $15,$07,$54,$55,$07,$53,$40,$57 defb $4C,$07,$51,$4C,$42,$56,$51,$43 defb $4C,$51,$07,$00,$07,$20,$4F,$07 defb $00,$07,$20,$53,$07,$4B,$40,$52 defb $53,$07,$00,$F4,$31,$48,$4E,$4F defb $53,$07,$0B,$07,$28,$0E,$5D,$4C defb $07,$56,$55,$4B,$58,$07,$4E,$56 defb $53,$07,$40,$07,$4D,$4C,$5E,$07 defb $52,$4C,$42,$56,$55,$43,$52,$07 defb $0B,$07,$4D,$48,$51,$52,$53,$F4 defb $28,$0E,$43,$07,$4B,$48,$4A,$4C defb $07,$53,$56,$07,$52,$40,$58,$07 defb $4F,$56,$5E,$07,$4B,$48,$53,$53 defb $4B,$4C,$07,$28,$0E,$5D,$4C,$07 defb $4C,$55,$49,$56,$58,$4C,$43,$F4 defb $41,$5C,$48,$4B,$43,$48,$55,$4E defb $07,$53,$4F,$48,$52,$07,$53,$4C defb $43,$48,$56,$5C,$52,$07,$57,$4B defb $40,$55,$4C,$53,$07,$0B,$07,$52 defb $4C,$42,$56,$55,$43,$4B,$58,$F4 defb $28,$0E,$43,$07,$49,$5C,$52,$53 defb $07,$4B,$48,$4A,$4C,$07,$53,$56 defb $07,$57,$56,$5C,$51,$07,$42,$56 defb $55,$53,$4C,$54,$57,$53,$07,$56 defb $55,$07,$15,$07,$15,$07,$15,$07 defb $01,$F4,$F4,$ED,$21,$5C,$53,$07 defb $40,$53,$07,$53,$4F,$48,$52,$07 defb $57,$56,$48,$55,$53,$07,$53,$4F defb $4C,$07,$53,$40,$57,$4C,$07,$51 defb $5C,$55,$52,$07,$56,$5C,$53,$07 defb $40,$55,$43,$07,$53,$4F,$4C,$F4 defb $51,$4C,$52,$53,$07,$56,$4D,$07 defb $53,$4F,$4C,$07,$54,$4C,$52,$52 defb $40,$4E,$4C,$07,$48,$52,$07,$4B defb $56,$52,$53,$07,$53,$56,$07,$53 defb $4F,$4C,$07,$52,$4C,$40,$52,$F4 defb $56,$4D,$07,$53,$48,$54,$4C,$07 defb $15,$F4,$F4,$E2,$01,$30,$5C,$48 defb $53,$4C,$07,$40,$07,$57,$56,$4C defb $53,$48,$42,$07,$4C,$55,$43,$48 defb $55,$4E,$07,$28,$07,$53,$4F,$56 defb $5C,$4E,$4F,$53,$01,$F4,$E3,$01 defb $32,$4F,$5C,$53,$07,$5C,$57,$07 defb $40,$55,$43,$07,$43,$56,$07,$53 defb $4F,$4C,$07,$4B,$56,$40,$43,$4C defb $51,$01,$E7,$AA,$AA,$AA,$E6,$9F defb $C3,$CD,$70,$C3,$00,$94,$C3,$9E defb $7A,$C3,$A6,$7A,$C3,$AE,$7A,$C3 defb $B6,$7A,$C3,$BE,$7A,$C3,$C6,$7A defb $C3,$CE,$7A,$C3,$D6,$7A,$E6,$9F defb $F2,$3C,$F8,$3B,$C3,$6A,$6F,$C3 defb $8C,$77,$C3,$A3,$6D,$C3,$F6,$6E defb $C3,$A3,$79,$00,$80,$40,$04,$00 defb $20,$01,$00,$00,$47,$47,$00,$00 defb $00,$C3,$0C,$7D,$F8,$3C,$66,$66 defb $3E,$06,$66,$3C,$00,$3C,$66,$66 defb $66,$66,$66,$3C,$00,$18,$38,$18 ; When decoded, that says: ;[yellow] This key is correct ! The message reads :- ; ; ;[Cyan] " . . . mn tape recorder ! Ah ! At last ! ; Right , I've only got a few seconds , first ; I'd like to say how little I've enjoyed ; building this tedious planet , secondly ; I'd just like to pour contempt on . . . " ; ;[yellow] But at this point the tape runs out and the ; rest of the message is lost to the seas ; of time . ; ;[magenta] "Quite a poetic ending I thought" ;[green] "Shut up and do the loader" ; Fill to the start of the code with zeros defs $6B00 - $,$00 ; This looks like the start address, but that's a piece of misdirection. ; If you start it here it will crash (top bit of R is not set)... Start jp Reset ; ; Vector to the actual game code Play jp GameCode ; ; Vectors to key scan code kLeft defs 3 ; kRight defs 3 ; kUp defs 3 ; kDown defs 3 ; kAccel defs 3 ; kDeccel defs 3 ; kFire defs 3 ; defs 9,$00 ; Spare room vReadKey jp ReadKeys ; vScanOptiKeys jp ScanOptiKeys ; vPrint jp Print ; vPrintStr jp PrintStr ; vAddScroll jp AddScroll ; pCurX defs 1 ; pCurY defs 2 ; ppCurY defs 1 ; AType defs 1 ; BType defs 1 ; CType defs 1 ; DType defs 1 ; EType defs 1 ; DDamage defs 1 ; ADamage defs 1 ; DScore defs 2 ; nCodesFound defs 1 ; vFuckUp jp FuckUp ; EndState defs 1 ; Mode defs 1 ; ; Character set for the soft-scrolling digits Zero defb $3C,$66,$66,$3E,$06,$66,$3C,0; Sc0 defb $3C,$66,$66,$66,$66,$66,$3C,0; Sc1 defb $18,$38,$18,$18,$18,$18,$7E,0; Sc2 defb $3C,$66,$06,$3C,$60,$66,$7E,0; Sc3 defb $3C,$66,$06,$1C,$06,$66,$3C,0; Sc4 defb $1C,$3C,$6C,$CC,$FE,$0C,$1E,0; Sc5 defb $7E,$62,$60,$7C,$06,$66,$3C,0; Sc6 defb $3C,$66,$60,$7C,$66,$66,$3C,0; Sc7 defb $7E,$66,$06,$0C,$18,$18,$18,0; Sc8 defb $3C,$66,$66,$3C,$66,$66,$3C,0; Sc9 defb $3C,$66,$66,$3E,$06,$66,$3C,0; ScS defb 0,0,0,0,0,0,0,0 ; defb $10,$30,$10,$10,$10,$10,$38,0; ScTab1 defw ScS,Sc1,Sc2,Sc3,Sc4 ; defw Sc5,Sc6,Sc7,Sc8,Sc9 ; ScTab2 defw Sc0,Sc1,Sc2,Sc3,Sc4 ; defw Sc5,Sc6,Sc7,Sc8,Sc9 ; ; Energy display dials nDials equ 8 ; MaxEnergy equ nDials*9-1 ; ; These are the Krell meter style graphics Dial0 defb $07,$E0,$18,$18,$20,$04,$40,$02; defb $40,$02,$80,$01,$80,$01,$81,$81; defb $81,$81,$82,$41,$82,$41,$44,$22; defb $44,$22,$24,$24,$18,$18,$00,$00; Dial1 defb $07,$E0,$18,$18,$20,$04,$40,$02; defb $40,$02,$80,$01,$80,$01,$81,$81; defb $83,$81,$86,$41,$8E,$41,$5C,$22; defb $7C,$22,$3C,$24,$18,$18,$00,$00; Dial2 defb $07,$E0,$18,$18,$20,$04,$40,$02; defb $40,$02,$80,$01,$80,$01,$FF,$81; defb $FF,$81,$FE,$41,$FE,$41,$7C,$22; defb $7C,$22,$3C,$24,$18,$18,$00,$00; Dial3 defb $07,$E0,$18,$18,$30,$04,$78,$02; defb $7C,$02,$FE,$01,$FF,$01,$FF,$81; defb $FF,$81,$FE,$41,$FE,$41,$7C,$22; defb $7C,$22,$3C,$24,$18,$18,$00,$00; Dial4 defb $07,$E0,$1F,$18,$3F,$04,$7F,$02; defb $7F,$02,$FF,$01,$FF,$01,$FF,$81; defb $FF,$81,$FE,$41,$FE,$41,$7C,$22; defb $7C,$22,$3C,$24,$18,$18,$00,$00; Dial5 defb $07,$E0,$1F,$F8,$3F,$FC,$7F,$F2; defb $7F,$E2,$FF,$C1,$FF,$81,$FF,$81; defb $FF,$81,$FE,$41,$FE,$41,$7C,$22; defb $7C,$22,$3C,$24,$18,$18,$00,$00; Dial6 defb $07,$E0,$1F,$F8,$3F,$FC,$7F,$FE; defb $7F,$FE,$FF,$FF,$FF,$FF,$FF,$81; defb $FF,$81,$FE,$41,$FE,$41,$7C,$22; defb $7C,$22,$3C,$24,$18,$18,$00,$00; Dial7 defb $07,$E0,$1F,$F8,$3F,$FC,$7F,$FE; defb $7F,$FE,$FF,$FF,$FF,$FF,$FF,$FF; defb $FF,$FF,$FE,$5F,$FE,$47,$7C,$22; defb $7C,$22,$3C,$24,$18,$18,$00,$00; Dial8 defb $07,$E0,$1F,$F8,$3F,$FC,$7F,$FE; defb $7F,$FE,$FF,$FF,$FF,$FF,$FF,$FF; defb $FF,$FF,$FE,$7F,$FE,$7F,$7C,$3E; defb $7C,$3E,$3C,$3C,$18,$18,$00,$00; pUDKTab defs 2 ; pKeyTab defs 2 ; pKeyVDU defs 2 ; CurType defs 1 ; FlashpDisp defs 2 ; UDKat0 defs 1 ; UDKat1 defs 1 ; LineBuffer defs 30 ; OptiFlashR equ 400 ; JoyFlashRate equ 400 ; CurFlag defs 1 ; CurrKey defs 1 ; CurrKeyAddr defs 2 ; RepDel defs 2 ; RepSpeed1 defs 2 ; RepSpeed2 defs 2 ; CursorSpeed defs 1 ; CursorType defs 1 ; CurCol defs 1 ; CapsShift equ KeyCounts ; KeyCounts defs 36 ; SymbolShift defs 4 ; MinScans equ 9 ; FlashRate equ 130 ; HSTimeOut equ $5400 ; pUDKd defs 1 ; UDKfr equ 400 ; UDKft defs 1 ; UDKatt defs 2 ; pList defs 2 ; EntryF defs 1 ; EntryY defs 2 ; pInsert defs 2 ; pHSEnd defs 2 ; KeyMask defs 40 ; cJoy defb 0 ; cJoyAttr defs 2 ; cInput defb "K" ; lKey equ 10 ; cDel equ $08 ; cCret equ $0D ; cCls equ $0C ; Clr equ $1B ; cHome equ $0E ; cBlack equ $00 ; cBlue equ $01 ; cRed equ $02 ; cMagenta equ $03 ; cGreen equ $04 ; cCyan equ $05 ; cYellow equ $06 ; cWhite equ $07 ; Colon1R equ $5AC2 ; Colon2R equ $5AC5 ; Colon1N equ $580E ; Colon2N equ $5811 ; ClockDataR defw ScS,ScS,ScS,ScS,ScS,ScS ; defw $50C7,$50C6,$50C4,$50C3,$50C1,$50C0; defb 9,5,9,5,9,9 ; ClockDataN defw ScS,ScS,ScS,ScS,ScS,ScS ; defw $4013,$4012,$4010,$400F,$400D,$400C; defb 9,5,9,5,9,9 ; CDEnd equ $ ; SecCount defb 1 ; Slice defb 1 ; nScroll defb 1 ; p1 defs 12 ; FirstpDig defs 12 ; FirstDig defs 6 ; ScCnt defb 0 ; Sc_F defb 0 ; ScPtr defw 0 ; ScAttr defb $45 ; ScACnt defb 0 ; Buff0 defb 0 ; Buff1 defb 0 ; Buff2 defb 0 ; Buff3 defb 0 ; Buff4 defb 0 ; Buff5 defb 0 ; Buff6 defb 0 ; Buff7 defb 0 ; pcDial defs 2 ; pcShape defs 2 ; Print push ix ; push hl ; push de ; push bc ; push af ; cp cWhite+1 ; jr c,pColour ; cp cCls ; jr z,pCls ; cp cCret ; jr z,pCR ; cp cHome ; jr z,pHome ; ld h,wChars/256 ; ld l,a ; ld a,(pCurX) ; add a,(hl) ; call c,pCret ; call pOutChar ; ld a,(pCurX) ; add a,(hl) ; ld (pCurX),a ; pExit pop af ; pop bc ; pop de ; pop hl ; pop ix ; ret ; pColour cp 4 ; jr nc,pCol1 ; or $40 ; pCol1 ld (CurCol),a ; jr pExit ; pCR call pCret ; jr pExit ; pCls ld e,$00 ; ld hl,Attrs ; ld bc,$0300 ; pC1 ld a,(hl) ; and $07 ; jr z,pC2 ; set 0,e ; dec (hl) ; pC2 cpi ; jp pe,pC1 ; call Delay ; bit 0,e ; jr nz,pCls ; ld hl,ScreenBase ; ld de,ScreenBase+1 ; ld bc,$1800 ; xor a ; ld (hl),a ; ldir ; ld a,(CurCol) ; ld (hl),a ; ld bc,$02FF ; ldir ; xor a ; out ($FE),a ; pHome xor a ; ld (pCurX),a ; ld (ppCurY),a ; ld a,cWhite ; ld (CurCol),a ; ld hl,ScreenBase ; ld (pCurY),hl ; jr pExit ; pCret ld a,(ppCurY) ; inc a ; SetUpY ld (ppCurY),a ; and $1F ; push hl ; ld l,a ; ld h,$00 ; add hl,hl ; ld de,YTableFE ; add hl,de ; ld a,(hl) ; inc hl ; ld h,(hl) ; ld l,a ; ld (pCurY),hl ; xor a ; ld (pCurX),a ; pop hl ; ret ; pOutChar bit 7,l ; ret nz ; push hl ; ld h,0 ; add hl,hl ; add hl,hl ; add hl,hl ; ld de,pChars-256 ; add hl,de ; push hl ; pop ix ; ld a,(pCurX) ; rrca ; rrca ; rrca ; and $1F ; ld de,(pCurY) ; or e ; ld e,a ; push de ; ld a,d ; rrca ; rrca ; rrca ; and $03 ; or $58 ; ld d,a ; ld a,(CurCol) ; ld (de),a ; inc de ; ld (de),a ; pop de ; ld a,(pCurX) ; and $07 ; ld c,a ; ld b,$08 ; OutCharL ld h,(ix+0) ; ld l,$00 ; ld a,c ; or a ; jr z,OCL1 ; OCL2 srl h ; rr l ; dec a ; jr nz,OCL2 ; OCL1 ld a,(de) ; xor h ; ld (de),a ; inc e ; ld a,(de) ; xor l ; ld (de),a ; dec e ; inc ix ; inc d ; djnz OutCharL ; pop hl ; ret ; YTableFE defw $4000,$4020,$4040,$4060 ; defw $4080,$40A0,$40C0,$40E0 ; defw $4800,$4820,$4840,$4860 ; defw $4880,$48A0,$48C0,$48E0 ; defw $5000,$5020,$5040,$5060 ; defw $5080,$50A0,$50C0,$50E0 ; defw 0,0,0,0,0,0,0,0 ; Wait ld a,$7F ; in a,($FE) ; rra ; jr nc,Wait ; ret ; Delay push bc ; ld bc,$0320 ; Del1 cpi ; dec hl ; jp pe,Del1 ; pop bc ; ret ; PrintStr push hl ; push af ; PStr1 ld a,(hl) ; inc hl ; or a ; jr z,PStr2 ; call Print ; jr PStr1 ; PStr2 pop af ; pop hl ; ret ; PrintStr1 ex (sp),hl ; push af ; PStr11 ld a,(hl) ; inc hl ; or a ; jr z,PStr12 ; call Print ; jr PStr11 ; PStr12 pop af ; ex (sp),hl ; ret ; InitKbd ld hl,KeyCounts ; ld de,KeyCounts+1 ; ld bc,$0027 ; ld (hl),$49 ; ldir ; xor a ; ld (CurrKey),a ; ld hl,200 ; ld (RepSpeed1),hl ; ld hl,30 ; ld (RepSpeed2),hl ; ret ; ReadKey push ix ; push hl ; push de ; push bc ; push af ; ex af,af' ; push af ; ld hl,CapsShift ; set 7,(hl) ; ld hl,SymbolShift ; set 7,(hl) ; call ReadKeys ; dec a ; ld b,a ; xor a ; ld hl,CapsShift ; bit 6,(hl) ; jr z,Shifta ; add a,40 ; Shifta ld hl,SymbolShift ; bit 6,(hl) ; jr z,Shiftb ; add a,80 ; Shiftb add a,b ; ld e,a ; ld d,0 ; ld hl,kTab0 ; add hl,de ; pop af ; ex af,af' ; pop af ; ld a,(hl) ; pop bc ; pop de ; pop hl ; pop ix ; ret ; ReadKeys ld a,1 ; ld (CursorSpeed),a ; ld (CursorType),a ; ReadKeyLp call CursorInv ; call ScanKeys ; jr nz,RKNewKey ; ld a,(CurrKey) ; or a ; jr z,ReadKeyLp ; ld hl,(CurrKeyAddr) ; bit 6,(hl) ; jr z,RKCancelOld ; ld hl,(RepDel) ; dec hl ; ld (RepDel),hl ; ld a,l ; or h ; jr nz,ReadKeyLp ; ld hl,(RepSpeed2) ; RK1 ld (RepDel),hl ; call CursorOff ; ld a,(CurrKey) ; ret ; RKNewKey ld (CurrKey),a ; ld hl,(RepSpeed1) ; ld (CurrKeyAddr),ix ; jr RK1 ; RKCancelOld xor a ; ld (CurrKey),a ; jr ReadKeyLp ; CursorOff ld a,(CursorType) ; or a ; jr z,FlipCur ; ret ; CursorInv ld a,(CursorSpeed) ; dec a ; ld (CursorSpeed),a ; ret nz ; ld a,FlashRate ; ld (CursorSpeed),a ; ld a,(CursorType) ; xor $01 ; ld (CursorType),a ; FlipCur ld l,$5F ; jp pOutChar ; ScanKeys ld bc,$FFFE ; ld hl,KeyCounts ; ld e,0 ; ScanKeyLp dec b ; in a,(c) ; ld d,5 ; ScanKeyLp2 rra ; call nc,SKPressed ; call c,SKNotPressed ; inc hl ; dec d ; jr nz,ScanKeyLp2 ; scf ; rl b ; inc b ; jr nz,ScanKeyLp ; ld a,e ; or a ; ret ; SKPressed ex af,af' ; ld a,(hl) ; and $3F ; cp MinScans ; jr z,SKP1 ; inc (hl) ; ex af,af' ; ret ; SKP1 bit 6,(hl) ; jr nz,SKexit ; bit 7,(hl) ; jr nz,SKexit1 ; ld a,e ; or a ; jr nz,SKexit ; push hl ; pop ix ; call CalcKeyPos ; ld e,a ; SKexit1 set 6,(hl) ; SKexit ex af,af' ; ret ; SKNotPressed ex af,af' ; ld a,(hl) ; and $3F ; jr z,SKNP1 ; dec (hl) ; ex af,af' ; ret ; SKNP1 res 6,(hl) ; ex af,af' ; ret ; CalcKeyPos push de ; ld de,KeyCounts-1 ; or a ; sbc hl,de ; ld a,l ; add hl,de ; pop de ; ret ; ; Keyboard map kTab0 defb " zxcv" ; defb "asdfg" ; defb "qwert" ; defb "12345" ; defb "09876" ; defb "poiuy" ; defb cCret,"lkjh" ; defb " mnb" ; defb " ZXCV" ; defb "ASDFG" ; defb "QWERT" ; defb "!@#$%" ; defb cDel,")('&" ; defb "POIUY" ; defb cCret,"LKJH" ; defb " MNB" ; defb " :#?/" ; defb "~|'{}" ; defb " <>" ; defb "!@#$%" ; defb "_)('&" ; defb $22,$2B," ][" ; Changed from $22,"; ][" because zxspin defb cCret,"=+-^" ; can't cope with ; appearing in a string. defb " .,*" ; It thinks it's a comment! Wonderful.not ; Note that the hidden message in the keys was corrupted defb " " ; defb "t I g" ; This should present a message if you hit the defb "a gir" ; extended-shift keys in order... defb cBlue,cRed,cMagenta,cGreen,cCyan ; defb Clr,cCls,cCret,cWhite,cYellow; defb "sel l" ; defb "dam o" ; defb " " ; ; Front end code starts here Reset di ; ld a,r ; Randomly choose a table and $06 ; (if the loader doesn't screw R) add a,HighPtrs & $FF ; ld l,a ; ld h, HighPtrs / 256 ; ld a,(hl) ; Read the address inc hl ; ld h,(hl) ; ld l,a ; ld de,HighScores ; And move it to the start ld bc,$0300 ; ldir ; Boot ld sp,$0000 ; Set the stack ld hl,iUDKTab ; Set the user defined keys ld de,UDKTab ; ld bc,$0080 ; ldir ; call InitKbd ; Setup the keys call InitOpti ; And the options DispMain di ; Start the front end ld hl,sMainMenu ; Show the menu call PrintStr ; ld hl,HSTimeOut ; Pause before show highscores MainLoop ld bc,$7C10 ; call ScanOptiKeys ; ld de,MainVecTab ; jp c,VecGoto ; dec hl ; Loop ld a,h ; or l ; jr nz,MainLoop ; ; Show the highscore table DispHS ld hl,0 ; ld (DScore),hl ; DispHS1 xor a ; ld (EntryF),a ; ld hl,sHighA ; call PrintStr ; ld ix,HighScores ; ld a,"1" ; DHSlp call PrintHS ; inc a ; cp "9"+1 ; jr nz,DHS1 ; add a,"A"-("9"+1) ; DHS1 cp "H" ; jr nz,DHSlp ; ld a,(EntryF) ; or a ; jp nz,AcceptEnt ; ld hl,sHighB ; call PrintStr ; HSw ld bc,$0030 ; call ScanOptiKeys ; jr nc,HSw ; cp 10 ; jp z,DispMain ; jp DispGame ; DispCont ld a,(cInput) ; cp "J" ; jp z,DispJoy ; DispKeys ld a,"K" ; ld (cInput),a ; ld hl,sKeysMenu ; call PrintStr ; ld hl,UDKTab ; ld iy,YTableFE+4 ; ld b,$07 ; UDKa push bc ; ld c,(iy+0) ; ld b,(iy+1) ; ld (pCurY),bc ; ld a,100 ; ld (pCurX),a ; call UDKlist ; ld bc,4 ; add iy,bc ; ld a,l ; or $0F ; ld l,a ; inc hl ; pop bc ; djnz UDKa ; UDKw call UDKwa1 ; UDKw1 ld bc,$7FF0 ; call ScanOptiKeys ; jr nc,UDKw1 ; cp 9 ; jp z,DispJoy ; cp 8 ; jp nc,DispMain ; push af ; add a,a ; add a,a ; ld l,a ; ld h,0 ; ld de,YTableFE ; add hl,de ; ld a,(hl) ; inc hl ; ld h,(hl) ; ld l,a ; ld (pCurY),hl ; pop af ; dec a ; ld l,a ; ld h,$00 ; add hl,hl ; add hl,hl ; add hl,hl ; add hl,hl ; add hl,hl ; add hl,hl ; ld bc,Attrs+64+2 ; add hl,bc ; add a,a ; add a,a ; add a,a ; add a,a ; ld e,a ; ld d,0 ; inc hl ; ld a,(hl) ; ld (UDKat0),a ; dec hl ; xor $40 ; ld (UDKat1),a ; ld (pKeyVDU),hl ; ld hl,UDKTab ; add hl,de ; ld (pKeyTab),hl ; ld a,100 ; ld (pCurX),a ; ld iy,(pCurY) ; ld hl,(pKeyTab) ; call UDKlist ; ld (pCurY),iy ; ld a,100 ; ld (pCurX),a ; ld hl,(pKeyTab) ; ld b,$10 ; UDKc1 ld (hl),$FF ; inc hl ; djnz UDKc1 ; call UDKwa1 ; call SetUpKeyMap ; ld ix,(pKeyTab) ; xor a ; ld (CurType),a ; ld hl,1 ; UDKlp call FlashLine ; call UDKscan ; jr z,UDKlp ; cp 16 ; "1" jr z,UDKend ; dec a ; ld b,a ; ld a,ixl ; cpl ; and $0F ; jr z,UDKlp ; ld a,cMagenta ; call Print ; ld a,b ; ld (ix+0),a ; inc ix ; call UDKchar ; call PrintSp2 ; jr UDKlp ; UDKwa1 ld e,30 ; ld b,$7F ; UDKwait ld c,$FE ; in a,(c) ; or $E0 ; inc a ; jr nz,UDKwa1 ; rrc b ; jr c,UDKwait ; dec e ; jr nz,UDKwait ; ret ; UDKend ld a,(UDKat0) ; call FLO ; push ix ; pop hl ; ld de,(pKeyTab) ; or a ; sbc hl,de ; jp nz,UDKw ; ld l,e ; ld h,d ; ld bc,iUDKTab-UDKTab ; add hl,bc ; ld bc,16 ; ldir ; ld hl,(pKeyTab) ; call UDKlist ; jp UDKw ; UDKscan ld iy,KeyCounts ; ld e,1 ; ld c,$FE ; ld b,$FE ; UDKsc1 ld d,$01 ; UDKsc2 in a,(c) ; and d ; jr nz,UDKsc3 ; bit 6,(iy+0) ; jr z,UDKsc3 ; res 6,(iy+0) ; ld a,e ; ret ; UDKsc3 inc iy ; inc e ; rlc d ; ld a,d ; cp $20 ; jr nz,UDKsc2 ; rlc b ; jr c,UDKsc1 ; xor a ; ret ; UDKlist ld a,(hl) ; bit 7,(hl) ; ret nz ; ld a,cMagenta ; call Print ; ld a,(hl) ; call UDKchar ; call PrintSp2 ; ld a,l ; cpl ; and $0F ; ret z ; inc hl ; jr UDKlist ; ; Show a UDK character name. Some are more than one char long... UDKchar push hl ; ld hl,UDKdesc ; inc a ; UDKp dec a ; jr z,UDKp1 ; UDKp2 bit 7,(hl) ; inc hl ; jr nz,UDKp2 ; jr UDKp ; UDKp1 ld a,(hl) ; and $7F ; call Print ; bit 7,(hl) ; inc hl ; jr nz,UDKp1 ; pop hl ; ret ; SetUpKeyMap ld hl,KeyCounts ; ld b,40 ; SUKM set 6,(hl) ; inc hl ; djnz SUKM ; ret ; DispJoy ld a,"J" ; ld (cInput),a ; ld hl,sJoysticks ; call PrintStr ; ld a,(cJoy) ; NewJoy call CalcpJoyAttr ; ld (cJoyAttr),hl ; call GrabLine ; ld d,0 ; ld hl,1 ; DJlp dec hl ; ld a,l ; or h ; jr nz,DJa ; ld hl,(cJoyAttr) ; inc d ; bit 0,d ; jr z,DJ1 ; call ClearLine ; ld d,1 ; jr DJa1 ; DJ1 call PutLine ; ld d,0 ; DJa1 ld hl,JoyFlashRate ; DJa ld bc,$7CF0 ; call ScanOptiKeys ; jr nc,DJlp ; cp 9 ; jp z,DispKeys ; cp 8 ; jp nc,DispMain ; ld hl,(cJoyAttr) ; call PutLine ; dec a ; ld b,a ; ld a,(cJoy) ; cp b ; jr z,NewJoy ; ld a,b ; ld (cJoy),a ; jp NewJoy ; CalcpJoyAttr ld l,a ; ld h,0 ; add hl,hl ; add hl,hl ; add hl,hl ; add hl,hl ; add hl,hl ; add hl,hl ; ld de,Attrs+(3*32)+2 ; add hl,de ; ret ; InitOpti ld ix,OptiData ; ld hl,AType ; ld b,nOptions ; ld d,0 ; InitOptiLp push ix ; ld a,(ix+4) ; add a,5 ; ld e,a ; add ix,de ; ld a,(ix+0) ; ld (hl),a ; inc hl ; pop ix ; ld e,16 ; add ix,de ; djnz InitOptiLp ; ret ; GetString ld ix,HSBuffer ; call InitKbd ; ld a,cMagenta ; call Print ; AElp call ReadKey ; or a ; jr z,AElp ; cp cCret ; ret z ; cp cDel ; jr z,AEcDel ; cp Clr ; jr z,AEclr ; cp 8 ; jr c,AE1 ; cp $18 ; jr c,AElp ; AE1 ld e,a ; ld d,wChars/256 ; ld a,(de) ; ld c,a ; ld a,(pCurX) ; add a,c ; cp 255-39 ; jr nc,AElp ; push ix ; pop hl ; ld bc,HSBuffer ; or a ; sbc hl,bc ; ld bc,130 ; or a ; sbc hl,bc ; jr nc,AElp ; ld a,e ; ld (ix+0),a ; inc ix ; call Print ; jr AElp ; AEDel call AEcDel ; jp AElp ; AEclr call AEcDel ; jr nz,AEclr ; jp AElp ; ; Remove a character/colour code AEcDel ld de,HSBuffer ; push ix ; pop hl ; or a ; sbc hl,de ; add hl,de ; ret z ; dec hl ; ld a,(hl) ; cp 8 ; jr c,DelCC ; push hl ; ld l,a ; ld b,a ; ld h,wChars/256 ; ld e,(hl) ; ld d,0 ; ld hl,(pCurX) ; or a ; sbc hl,de ; ld (pCurX),hl ; ld a,b ; call Print ; ld (pCurX),hl ; pop ix ; or a ; ret ; DelCC ld de,HSBuffer ; ld c,cMagenta ; DCC1 or a ; sbc hl,de ; add hl,de ; jr z,DCC2 ; ld a,(de) ; cp 8 ; jr nc,DCC3 ; ld c,a ; DCC3 inc de ; jr DCC1 ; DCC2 ld a,c ; call Print ; push hl ; pop ix ; or a ; ret ; AcceptEnt ld hl,sAccept ; call PrintStr ; ld hl,(EntryY) ; ld (pCurY),hl ; ld a,9 ; ld (pCurX),a ; call GetString ; push ix ; pop hl ; call MWEntry ; ld (hl),0 ; inc hl ; ld a,(DScore) ; ld (hl),a ; inc hl ; ld a,(DScore+1) ; ld (hl),a ; inc hl ; ld de,HSBuffer ; or a ; sbc hl,de ; ld b,h ; ld c,l ; push bc ; ld hl,(pHSEnd) ; ld de,(pInsert) ; or a ; sbc hl,de ; push hl ; ld hl,(pHSEnd) ; add hl,bc ; ex de,hl ; ld hl,(pHSEnd) ; pop bc ; inc bc ; lddr ; ld hl,HSBuffer ; ld de,(pInsert) ; pop bc ; ldir ; jp DispHS ; MWEntry ld de,HSBuffer ; Is the entry blank? or a ; sbc hl,de ; jr nz,MWE1 ; ; If so we change it to "Someone" for the first 8 tries ; then to "Someone else" after 8 blank entries ; then to "Someone else ( who shall remain nameless)" after 16 ld a,0 ; Self-modifying code... nSomeone equ $-1 ; inc a ; ld (nSomeone),a ; cp 16 ; > 16? ld bc,SomeoneEnd-Someone ; jr nc,MWEa ; cp Someone1 - Someone ; < 8 ld bc,8 ; jr c,MWEa ; ld bc,Someone2-Someone ; 9..15 MWEa ld hl,Someone ; ld de,HSBuffer ; ldir ; ex de,hl ; ret ; Someone defb "Someone" ; Someone1 defb " else" ; Someone2 defb " ( who shall remain nameless )***"; SomeoneEnd equ $ ; MWE1 xor a ; Clear the someone count ld (nSomeone),a ; ld a,l ; Entry > 125 chars? add hl,de ; cp 125 ; jr c,MWE2 ; ; Replace with the long entry text ld hl,TooLong ; ld de,HSBuffer ; ld bc,lTooLong ; ldir ; ex de,hl ; ret ; TooLong defb "What strange behaviour !" ; lTooLong equ $-TooLong ; MWE2 ld ix,sClues ; ld iy,Text ; ld (hl),0 ; push hl ; MWElp push ix ; ld hl,HSBuffer ; Mlp1 ld a,(hl) ; or a ; jr z,Mlpf ; cp $21 ; inc hl ; jr c,Mlp1 ; call ConvLC ; cp (ix+0) ; inc ix ; jr z,Mlp1 ; dec ix ; Mlpf ld a,(ix+0) ; or a ; pop ix ; jr z,MWEcg ; StepIX ld a,(ix+0) ; inc ix ; or a ; jr nz,StepIX ; StepIY ld a,(iy+0) ; inc iy ; or a ; jr nz,StepIY ; ld a,(ix+0) ; inc a ; jr nz,MWElp ; pop hl ; ret ; ConvLC cp "Z"+1 ; ret nc ; cp "A" ; ret c ; add a,"a"-"A" ; ret ; MWEcg push iy ; pop de ; pop af ; ld hl,HSBuffer ; CGlp ld a,(de) ; or a ; ret z ; ld (hl),a ; inc hl ; inc de ; jr CGlp ; DispOpti ld hl,sOptiMenu ; call PrintStr ; OptiLoop ld bc,$74A0 ; call ScanOptiKeys ; jr nc,OptiLoop ; cp 5 ; jp z,HexMon ; cp 8 ; jp z,DispMain ; cp 10 ; jp z,DispMain ; dec a ; add a,a ; add a,a ; add a,a ; add a,a ; ld e,a ; ld d,0 ; ld ix,OptiData ; add ix,de ; ld l,(ix+2) ; ld h,(ix+3) ; call PrintStr ; ld a,20 ; ld (ppCurY),a ; ld hl,sBottom ; call PrintStr ; OptiLpA ld a,(ix+4) ; call CalcpVDU ; ld (FlashpDisp),hl ; call GrabLine ; ld d,0 ; OptiLpB ld hl,OptiFlashR ; OptiLp1 ld b,(ix+5) ; ld c,$E0 ; call ScanOptiKeys ; jr c,OptiKP ; dec hl ; ld a,l ; or h ; jr nz,OptiLp1 ; ld a,d ; cpl ; ld d,a ; or a ; push de ; ld hl,(FlashpDisp) ; push af ; call z,PutLine ; pop af ; call nz,ClearLine ; pop de ; jr OptiLpB ; OptiKP cp (ix+4) ; jr z,OptiLp1 ; push af ; ld hl,(FlashpDisp) ; call PutLine ; pop af ; cp 8 ; jp z,DispMain ; cp 9 ; jp nc,DispOpti ; ld (ix+4),a ; push ix ; pop hl ; add a,5 ; ld e,a ; ld d,0 ; add hl,de ; ld a,(hl) ; ld l,(ix+11) ; ld h,(ix+12) ; ld (hl),a ; jr OptiLpA ; CalcpVDU push de ; dec a ; ld l,a ; ld h,0 ; add hl,hl ; ld de,CpV ; add hl,de ; ld a,(hl) ; inc hl ; ld h,(hl) ; ld l,a ; pop de ; ret ; CpV defw $5882,$58C2,$5942,$5982,$5A22 GrabLine ld de,LineBuffer ; ld bc,30 ; ldir ; ret ; FlashLine dec hl ; ld a,h ; or l ; ret nz ; ld hl,(pKeyVDU) ; ld a,(CurType) ; xor $01 ; ld (CurType),a ; ld a,(UDKat0) ; jr z,FLO ; ld a,(UDKat1) ; FLO ld hl,(pKeyVDU) ; ld d,h ; ld e,l ; inc de ; ld bc,7 ; ld (hl),a ; ldir ; ld hl,UDKfr ; ret ; PutLine ex de,hl ; ld hl,LineBuffer ; ld bc,30 ; ldir ; ret ; ClearLine ld e,l ; ld d,h ; inc de ; ld (hl),$41 ; ld bc,29 ; ldir ; ret ; HexMon ld a,0 ; Self modifying code MonFlag equ $-1 ; or a ; jr nz,HexMon1 ; ld hl,sHexMon ; call PrintStr ; call Input ; call ReadHex16 ; ld de,$1278 ; or a ; sbc hl,de ; jp nz,DispOpti ; ld a,1 ; ld (MonFlag),a ; HexMon1 ld hl,sHexMon1 ; call PrintStr ; MonLoop call Input ; ld a,(de) ; inc de ; or a ; jr z,MonLoop ; cp " " ; jr z,MonLoop ; cp "m" ; jr z,MonM ; cp "t" ; jr z,MonT ; cp "q" ; jp z,DispOpti ; cp "e" ; jr nz,MonLoop ; call ReadHex16 ; jr c,MonErr ; call FrontCallHL ; jp MonLoop ; MonM call ReadHex16 ; jp c,MonErr ; MonMlp call ReadHex8 ; jr z,MonLoop ; jp c,MonErr ; ld (hl),a ; inc hl ; jr MonMlp ; MonT call ReadHex16 ; jr z,MonTa ; jp c,MonErr ; ld (TabPtr),hl ; MonTa call ClearWind ; ld ix,$0000 ; Self modifying code TabPtr equ $-2 ; ld b,8 ; MonTlp push bc ; call TabLine ; pop bc ; djnz MonTlp ; ld (TabPtr),ix ; jp MonLoop ; TabLine push ix ; pop hl ; call PrintHex16 ; ld b,8 ; TLlp ld a," " ; call Print ; ld a,(ix+0) ; inc ix ; call PrintHex8 ; djnz TLlp ; ld a,cCret ; jp Print ; ClearWind ld hl,$4800 ; CW8 push hl ; call ClearGraph ; pop hl ; ld a,l ; add a,$20 ; ld l,a ; jr nz,CW8 ; ld a,7 ; ld (ppCurY),a ; ld a,cCyan ; call Print ; ld a,cCret ; jp Print ; MonErr ld hl,$40C0 ; ld (pCurY),hl ; xor a ; ld (pCurX),a ; ld hl,sMonError ; call PrintStr ; ld bc,0 ; Err_1 cpi ; jp pe,Err_1 ; ld hl,$40C0 ; call ClearGraph ; jp MonLoop ; ClearGraph call CGa ; inc h ; ld a,h ; and $07 ; ret z ; jr ClearGraph ; CGa push hl ; ld d,h ; ld e,l ; inc de ; ld bc,$001F ; ld (hl),$00 ; ldir ; pop hl ; ret ; Input ld hl,$4080 ; ld (pCurY),hl ; call ClearGraph ; xor a ; ld (pCurX),a ; call GetString ; ld (ix+0),$00 ; ld de,HSBuffer ; ret ; Hex sub "0" ; ret c ; cp 10 ; ccf ; ret nc ; sub 7+" " ; cp 10 ; ret c ; cp 17 ; ccf ; ret ; ReadHex8 push hl ; call ReadHex16 ; push af ; ld a,h ; or a ; jr z,RH8 ; pop af ; scf ; ld a,l ; pop hl ; ret ; RH8 pop af ; ld a,l ; pop hl ; ret ; ReadHex16 ld a,(de) ; inc de ; cp " " ; jr z,ReadHex16 ; dec de ; ReadHex ld a,(de) ; or a ; scf ; ret z ; call Hex ; ret c ; ld h,0 ; ld l,a ; Read3 inc de ; ld a,(de) ; call Hex ; ccf ; ret nc ; add hl,hl ; ret c ; add hl,hl ; ret c ; add hl,hl ; ret c ; add hl,hl ; ret c ; or l ; ld l,a ; jr Read3 ; Mon call ReadKey ; call Print ; DispDemo ld a,1 ; jp DispGame1 ; DispInst ld hl,sInst ; call PrintStr ; DIlp ld bc,$7FF0 ; call ScanOptiKeys ; jr nc,DIlp ; jp DispMain ; PrintHS push af ; ld (HSChar),a ; ld hl,sHighC ; call PrintStr ; push ix ; pop hl ; ld a,(EntryF) ; or a ; jr nz,PHSb ; PHSa ld a,(hl) ; or a ; inc hl ; jr nz,PHSa ; ld a,(hl) ; inc hl ; ld h,(hl) ; ld l,a ; ld de,(DScore) ; or a ; sbc hl,de ; jr nc,PHSb ; ld a,1 ; ld (EntryF),a ; ld hl,(pCurY) ; ld (EntryY),hl ; ld (pInsert),ix ; ex de,hl ; jr PHSx ; PHSb ld a,(ix+0) ; or a ; inc ix ; jr z,PHS2a ; call Print ; jr PHSb ; PHS2a ld l,(ix+0) ; inc ix ; ld h,(ix+0) ; inc ix ; ld (pHSEnd),ix ; PHSx ld a,255 - (5*6) ; ld (pCurX),a ; ld a,cYellow ; call Print ; call PrintScore ; ld a,"0" ; call Print ; ld a,cCret ; call Print ; pop af ; ret ; PHS2 inc ix ; PHS3 call PrintSp ; djnz PHS3 ; jr PHS2a ; PrintSp push af ; ld a," " ; call Print ; pop af ; ret ; PrintSp2 push af ; ld a,$80 ; call Print ; pop af ; ret ; PrintScore1 ld c,$80 ; ld b,4 ; jr PS0 ; PrintScore ld c,0 ; ld b,4 ; PS0 call PS1 ; add hl,hl ; add hl,hl ; add hl,hl ; add hl,hl ; djnz PS0 ; ret ; PS1 ld a,h ; rrca ; rrca ; rrca ; rrca ; and $0F ; jr z,PS1a ; inc c ; or "0" ; jp Print ; PS1a ld a,c ; cp $80 ; ret z ; and $7F ; jr z,PS2 ; ld a,"0" ; jp Print ; PS2 ld a,(pCurX) ; add a,6 ; ld (pCurX),a ; ret ; OptiData defw 0,sSkillLevels ; defb 2 ; defb $7C ; defb -1,-2,-3,-4,-5 ; defw AType ; defs 3 ; defw 0,sNoises ; defb 3 ; defb $78 ; defb $00,$09,$0F,$FF,$FF ; defw BType ; defs 3 ; defw 0,sDisplay ; defb 1 ; defb $70 ; defb 0,2,3,0,0 ; defw CType ; defs 3 ; VecGoto dec a ; add a,a ; ld l,a ; ld h,0 ; add hl,de ; ld a,(hl) ; inc hl ; ld h,(hl) ; ld l,a ; FrontCallHL jp (hl) ; MainVecTab defw DispGame ; 1 defw DispInst ; 2 defw DispCont ; 3 defw DispOpti ; 4 defw DispDemo ; 5 defw DispMain ; 6 defw DispMain ; 7 defw DispMain ; 8 defw DispMain ; 9 defw DispMain ; 10 defw DispHS ; 11 ScanOptiKeys push ix ; push de ; push bc ; call SOK ; pop bc ; pop de ; pop ix ; ret ; SOK ld ix,OptKeyTab ; ld e,12 ; SOKlp rl c ; rl b ; jr c,SOK0 ; push bc ; ld bc,4 ; add ix,bc ; pop bc ; SOKx dec e ; jr nz,SOKlp ; or a ; ret ; SOK0 call SOK1 ; ret c ; jr SOKx ; SOK1 push bc ; ld b,(ix+0) ; ld c,$FE ; in a,(c) ; or (ix+1) ; inc a ; jr z,SOKnp ; ld a,(ix+2) ; and $0F ; cp 4 ; jr z,SOK2 ; inc (ix+2) ; SOKxf ld bc,4 ; add ix,bc ; or a ; pop bc ; ret ; SOK2 bit 7,(ix+2) ; jr nz,SOKxf ; set 7,(ix+2) ; ld a,(ix+3) ; ld bc,4 ; add ix,bc ; scf ; pop bc ; ret ; SOKnp ld a,(ix+2) ; and $0F ; jr z,SOKxf ; dec (ix+2) ; dec a ; and $0F ; jr nz,SOKxf ; res 7,(ix+2) ; jr SOKxf ; IntRoutine push af ; push hl ; ld a,(CType) ; cp 3 ; jr z,IntIgnore ; push bc ; push de ; push ix ; push iy ; ld a,(SecCount) ; and $01 ; jr z,Int0 ; call ScrollScore ; ld a,(ADamage) ; ld b,a ; ld a,(DDamage) ; cp b ; call nz,StepEnergy ; Int0 call ScMess ; ld a,(SecCount) ; dec a ; ld (SecCount),a ; cp 25 ; jr z,Int2 ; or a ; call z,SetUpSec ; ld a,(Slice) ; or a ; jr z,Int1 ; dec a ; ld (Slice),a ; call ScrollIt ; Int1 pop iy ; pop ix ; pop de ; Crash pop bc ; pop hl ; pop af ; ei ; ret ; Int2 ld a,$00 ; Colons OFF ld ($0000),a ; SMC CM1 equ $-2 ; ld ($0000),a ; SMC CM2 equ $-2 ; jp Int1 ; IntIgnore ld a,(DDamage) ; ld (ADamage),a ; ld hl,(DScore) ; ld (AScore),hl ; pop hl ; pop af ; ei ; ret ; RotDig xor a ; add hl,hl ; rla ; add hl,hl ; rla ; add hl,hl ; rla ; add hl,hl ; rla ; ret ; ScNext ld hl,(ScPtr) ; ld a,(hl) ; inc hl ; ld (ScPtr),hl ; inc a ; ld (Sc_F),a ; jp z,ScNew ; dec a ; jr z,ScN2 ; cp $20 ; jr nc,ScN1 ; ld (ScAttr),a ; ld a,3 ; ld (ScCnt),a ; ld hl,Buff0 ; ld de,Buff1 ; ld bc,7 ; ld (hl),$00 ; ldir ; jr ScIt ; ScN1 ld l,a ; ld h,wChars/256 ; ld a,(hl) ; inc a ; sra a ; ld (ScCnt),a ; ld h,0 ; add hl,hl ; add hl,hl ; add hl,hl ; ld a,0+(pChars/256)-1 ; <> add a,h ; ld h,a ; ld de,Buff0 ; ld bc,8 ; ldir ; jr ScIt ; ScN2 ld a,$7F ; ld (ScCnt),a ; jr ScIt ; ScMess ld a,(Sc_F) ; or a ; jp z,ScNew ; ld a,(ScCnt) ; or a ; jr z,ScNext ; dec a ; ld (ScCnt),a ; ScIt ld a,(ScACnt) ; dec a ; ld (ScACnt),a ; and $3 ; call z,ScAtt ; ld hl,Buff0 ; sla (hl) ; ex af,af' ; sla (hl) ; ex af,af' ; ld hl,$50FF ; call Sc1m ; ld hl,Buff1 ; sla (hl) ; ex af,af' ; sla (hl) ; ex af,af' ; ld hl,$51FF ; call Sc1m ; ld hl,Buff2 ; sla (hl) ; ex af,af' ; sla (hl) ; ex af,af' ; ld hl,$52FF ; call Sc1m ; ld hl,Buff3 ; sla (hl) ; ex af,af' ; sla (hl) ; ex af,af' ; ld hl,$53FF ; call Sc1m ; ld hl,Buff4 ; sla (hl) ; ex af,af' ; sla (hl) ; ex af,af' ; ld hl,$54FF ; call Sc1m ; ld hl,Buff5 ; sla (hl) ; ex af,af' ; sla (hl) ; ex af,af' ; ld hl,$55FF ; call Sc1m ; ld hl,Buff6 ; sla (hl) ; ex af,af' ; sla (hl) ; ex af,af' ; ld hl,$56FF ; call Sc1m ; ld hl,Buff7 ; sla (hl) ; ex af,af' ; sla (hl) ; ex af,af' ; ld hl,$57FF ; Sc1m ld b,8 ; Sc2m rl (hl) ; ex af,af' ; rl (hl) ; ex af,af' ; dec l ; rl (hl) ; ex af,af' ; rl (hl) ; ex af,af' ; dec l ; rl (hl) ; ex af,af' ; rl (hl) ; ex af,af' ; dec l ; rl (hl) ; ex af,af' ; rl (hl) ; ex af,af' ; dec l ; djnz Sc2m ; ret ; ScAtt ld hl,$5AE1 ; ld de,$5AE0 ; ld bc,$1F ; ldir ; ld a,(ScAttr) ; ld (de),a ; ret ; ScNew ld ix,$0000 ; pScrBuf2 equ $-2 ; ld a,(ix+2) ; or a ; ret z ; ld a,1 ; ld (Sc_F),a ; ld l,(ix+0) ; ld h,(ix+1) ; ld (ix+2),$00 ; ld (ScPtr),hl ; ScNew1 push ix ; pop hl ; inc hl ; inc hl ; inc hl ; ld de,SetUpSec ; ld (pScrBuf2),hl ; or a ; sbc hl,de ; ret nz ; ld hl,ScrollBuff ; ld (pScrBuf2),hl ; ret ; AddScroll ld a,(CType) ; cp 3 ; ret z ; push ix ; di ; ld ix,$0000 ; pScrBuf1 equ $-2 ; ld a,(ix+2) ; or a ; jr nz,AScx ; ld (ix+0),l ; ld (ix+1),h ; ld (ix+2),1 ; push ix ; pop hl ; inc hl ; inc hl ; inc hl ; ld (pScrBuf1),hl ; ld de,SetUpSec ; or a ; sbc hl,de ; jr nz,AScx ; ld hl,ScrollBuff ; ld (pScrBuf1),hl ; AScx pop ix ; ei ; ret ; InitScroll xor a ; ld (Sc_F),a ; ld (ScCnt),a ; ld (ScACnt),a ; ld hl,ScrollBuff ; ld (pScrBuf1),hl ; ld (pScrBuf2),hl ; ld hl,ScrollBuff ; ld de,ScrollBuff+1 ; ld bc,29 ; ld (hl),0 ; ldir ; ret ; ScrollBuff defs 30 ; SetUpSec ld a,8 ; ld (Slice),a ; ld a,50 ; ld (SecCount),a ; ld a,$47 ; CM0 equ $-1 ; ld ($0000),a ; CM1a equ $-2 ; ld ($0000),a ; CM2a equ $-2 ; call AddOne ; ld a,b ; ld (nScroll),a ; ret ; AddOne ld de,FirstDig ; ld hl,p1 ; ld b,1 ; call DoTen ; ret c ; call DoSix ; ret c ; call DoTen ; ret c ; call DoSix ; ret c ; call DoTen ; ret c ; call DoTen ; dec b ; ret ; DoTen ld a,(de) ; inc a ; ld (de),a ; cp 10 ; ret c ; ld (hl),Zero & $FF ; inc hl ; ld (hl),Zero / 256 ; inc hl ; xor a ; ld (de),a ; inc b ; inc de ; ret ; DoSix ld a,(de) ; inc a ; ld (de),a ; cp 6 ; ret c ; ld (hl),Zero & $FF ; inc hl ; ld (hl),Zero / 256 ; inc hl ; xor a ; ld (de),a ; inc b ; inc de ; ret ; ScrollIt ld ix,p1 ; ld a,(nScroll) ; ld b,a ; SIlp ld e,(ix+0) ; ld d,(ix+1) ; ld l,(ix+12) ; ld h,(ix+13) ; ld c,8 ; SIlp1 ld a,(de) ; inc de ; ld (hl),a ; inc h ; dec c ; jr nz,SIlp1 ; inc (ix+0) ; inc ix ; inc ix ; djnz SIlp ; ret ; UDKWS defs 7*64,0 ; DispGame xor a ; DispGame1 ld (Mode),a ; ld a,cCls ; call Print ; ld a,(cInput) ; cp "J" ; jp z,GameJoy ; call DoKeys ; GameExit call InitInt ; call InitInst ; ld a,(CType) ; cp 3 ; jp z,Play1 ; call InitClock ; call InitScore ; call InitEnergy ; Play1 call IntVec ; ld a,(Mode) ; ld hl,FUM ; or a ; jr z,Mess1 ; ld hl,FUD ; Mess1 call AddScroll ; ld a,(BType) ; bit 3,a ; call SetSoundFlag ; ld (Trumpet),a ; ld (Trumpet1),a ; call Play ; di ; ld a,(Mode) ; or a ; jp nz,DispMain ; ld a,(EndState) ; dec a ; jr z,EndEsc ; EndDead ld hl,sEndDead ; call PrintStr ; ld hl,(DScore) ; call PrintScore1 ; ld hl,sEndDead1 ; call PrintStr ; jp EElp ; EndEsc ld hl,sEndEsc ; call PrintStr ; call GetString ; ld ix,HSBuffer ; call FindCRC ; The correct str -> hl=$DF51 ld de,$DF51 ; or a ; sbc hl,de ; jr z,CodeFound1 ; ld hl,sWrongCode ; call PrintStr ; EElp ld bc,$FFD0 ; call ScanOptiKeys ; jr nc,EElp ; jp DispHS1 ; CodeFound1 ld hl,(DScore) ; ld a,$05 ; add a,h ; daa ; ld h,a ; jr nc,CF2 ; ld hl,$9999 ; CF2 ld (DScore),hl ; ld ix,HSBuffer+2 ; call FindCRC ; The correct str -> hl=$041D ex de,hl ; ld hl,Message ; CodeFlp ld a,(hl) ; xor d ; add a,e ; jr z,EElp ; call Print ; inc hl ; ld bc,MessWait ; MessW cpi ; dec hl ; jp pe,MessW ; jr CodeFlp ; FindCRC ld hl,0 ; ld de,4 ; ld a,8 ; DecLp ld c,(ix+0) ; ld b,(ix+1) ; add hl,bc ; add ix,de ; dec a ; jr nz,DecLp ; ret ; SetSoundFlag ld a,$00 ; ret z ; ld a,$F8 ; ret ; ; Report problems to the user... Bad idea... FuckUp di ; pop hl ; ld sp,0 ; push hl ; ld hl,sFuckUp ; call PrintStr ; pop hl ; dec hl ; dec hl ; dec hl ; call PrintHex16 ; FUlp ld bc,$0020 ; call ScanOptiKeys ; jr nc,FUlp ; jp Boot ; PrintHex16 ld a,h ; call PrintHex8 ; ld a,l ; PrintHex8 call PH2 ; PH2 rrca ; rrca ; rrca ; rrca ; push af ; and $0F ; add a,"0" ; cp "9"+1 ; jr c,PH3 ; add a,"A"-("9"+1) ; PH3 call Print ; pop af ; ret ; InitEnergy xor a ; ld (ADamage),a ; ld (cMag),a ; ld a,MaxEnergy ; ld (DDamage),a ; ld de,$50A6 ; ld a,(CType) ; or a ; jr z,IEa ; ld de,$50A9 ; IEa ld (pcDial),de ; ld hl,Dial0 ; ld (pcShape),hl ; ld b,nDials ; IElp push de ; push bc ; ld hl,Dial0 ; call Place ; pop bc ; pop de ; inc de ; inc de ; djnz IElp ; ret ; StepEnergy jr nc,SEinc ; ld a,$F8 ; Trumpet equ $-1 ; out ($FE),a ; ld a,$00 ; cMag equ $-1 ; or a ; ld de,(pcDial) ; ld hl,(pcShape) ; jr nz,SEdec1 ; dec de ; dec de ; ld (pcDial),de ; ld hl,Dial8+32 ; ld a,9 ; SEdec1 dec a ; ld (cMag),a ; ld a,(ADamage) ; dec a ; ld bc,-32 ; jp SEexit ; SEinc ld a,$F8 ; Trumpet1 equ $-1 ; out ($FE),a ; ld a,(cMag) ; cp 8 ; ld de,(pcDial) ; ld hl,(pcShape) ; jr nz,SEinc1 ; inc de ; inc de ; ld (pcDial),de ; ; This next bit is intentionally devious. It's the piracy check ; ; We will have set the top-bit of the R register if we think ; the game is NOT pirated. ; ; This code reads the R register and checks for this. ld hl,Protect ; Unscramble the LD A,R inst. rlc (hl) ; defb $ED ; Scrambled LD A,R Protect defb $AF ; add a,a ; Carry set if bit 7 or R set jp nc,Crash ; Cause a crash if it isn't rrc (hl) ; Scramble it again ; Carry on ld hl,Dial0-32 ; ld a,-1 ; SEinc1 inc a ; ld (cMag),a ; ld bc,32 ; ld a,(ADamage) ; inc a ; SEexit ld (ADamage),a ; add hl,bc ; ld (pcShape),hl ; xor a ; out ($FE),a ; Place push de ; call PInner ; pop de ; ld a,e ; add a,$20 ; ld e,a ; PInner ld b,8 ; Inner1 ld a,(hl) ; ld (de),a ; inc hl ; inc e ; ld a,(hl) ; ld (de),a ; inc hl ; dec e ; inc d ; djnz Inner1 ; ret ; InitScore ld hl,ScoreData ; ld de,ScorePtrs ; ld bc,ScorePtrs-ScoreData ; ldir ; ld hl,0 ; ld (DScore),hl ; ld a,(CType) ; Point at the score screen pos ld hl,$50BB ; or a ; jr z,IS1 ; ld hl,$50DB ; IS1 ld (pScore),hl ; ret ; ScrollScore ld a,(ScScrCnt) ; dec a ; jr nz,SSupdate ; ld hl,(AScore) ; ld de,(DScore) ; or a ; sbc hl,de ; ret z ; ex de,hl ; ld (AScore),hl ; ld a,0 ; jr c,SSpos ; ld a,7 ; SSpos ld (ScScrDir),a ; ld ix,ScorePtrs ; ld iy,1 ; ld b,4 ; ld c,ScTab1 & $FF ; ld d,Zero/256 ; SScalc xor a ; add hl,hl ; adc a,a ; add hl,hl ; adc a,a ; add hl,hl ; adc a,a ; add hl,hl ; adc a,a ; push af ; cp (ix+1) ; ld (ix+1),a ; jr z,SSb ; ld a,iyh ; or a ; jr nz,SSb ; ld iyh,iyl ; SSb pop af ; jr z,SSa ; ld c,ScTab2 & $FF ; SSa add a,a ; add a,c ; ld e,a ; ld a,(de) ; ld e,a ; ld a,(ScScrDir) ; add a,e ; ld (ix+0),a ; inc iyl ; inc ix ; inc ix ; djnz SScalc ; ld a,(ScScrDir) ; add a,Sc0 & $FF ; ld (ix+0),a ; ld a,iyh ; ld (ScScrNo),a ; ld a,8 ; SSupdate ld (ScScrCnt),a ; ld de,ScreenBase ; pScore equ $-2 ; ld a,(ScScrNo) ; ld iyl,a ; ld a,(ScScrDir) ; add a,d ; cp d ; ld d,a ; jr nz,SSscdown ; SSscup ld hl,ScorePtrs ; ld b,5 ; SSscuplp dec iyl ; jr nz,SSscupX ; inc iyl ; push bc ; push de ; push hl ; ld b,7 ; ld h,d ; ld l,e ; inc h ; SSscuplp1 ld a,(hl) ; ld (de),a ; inc h ; inc d ; djnz SSscuplp1 ; pop hl ; ld c,(hl) ; ld b,Sc0/256 ; ld a,(bc) ; ld (de),a ; inc (hl) ; pop de ; pop bc ; SSscupX inc e ; inc hl ; inc hl ; djnz SSscuplp ; ret ; SSscdown ld hl,ScorePtrs ; ld b,5 ; SSscdolp dec iyl ; jr nz,SSscdoX ; inc iyl ; push bc ; push de ; push hl ; ld b,7 ; ld h,d ; ld l,e ; dec h ; SSscdolp1 ld a,(hl) ; ld (de),a ; dec h ; dec d ; djnz SSscdolp1 ; pop hl ; ld c,(hl) ; ld b,Sc0/256 ; ld a,(bc) ; ld (de),a ; dec (hl) ; pop de ; pop bc ; SSscdoX inc e ; inc hl ; inc hl ; djnz SSscdolp ; ret ; ; Score variables (for the scrolling display) ScoreData defw ScS,ScS,ScS,ScS,Sc0 ; Initial data. Copied down defw 0 ; defb 9,0,1 ; ; The initial data above is copied to these vars to init them ScorePtrs defs 5*2 ; AScore defs 2 ; ScScrCnt defs 1 ; ScScrDir defs 1 ; ScScrNo defs 1 ; GameJoy call DoKeys ; ld a,(cJoy) ; ld l,a ; ld h,0 ; add hl,hl ; ld d,h ; ld e,l ; add hl,hl ; add hl,hl ; add hl,de ; ld de,JoyVects ; add hl,de ; ld de,kLeft ; ld b,4 ; Joy1 call DoJoy ; djnz Joy1 ; inc de ; inc de ; inc de ; inc de ; inc de ; inc de ; call DoJoy ; jp GameExit ; DoJoy inc de ; ld a,(hl) ; ld (de),a ; inc hl ; inc de ; ld a,(hl) ; ld (de),a ; inc hl ; inc de ; ret ; ; Addresses of Joystick scanning routines JoyVects defw KemL,KemR,KemU,KemD,KemF ; Left,Right,Up,Down,Fire defw FulL,FulR,FulU,FulD,FulF ; defw ProL,ProR,ProU,ProD,ProF ; defw SinL,SinR,SinU,SinD,SinF ; defw SinL,SinR,SinU,SinD,SinF ; ; Scanning routines for the different types of joystick KemL in a,($1F) ; bit 1,a ; ret ; KemR in a,($1F) ; bit 0,a ; ret ; KemU in a,($1F) ; bit 3,a ; ret ; KemD in a,($1F) ; bit 2,a ; ret ; KemF in a,($1F) ; bit 4,a ; ret ; FulL in a,($7F) ; cpl ; bit 2,a ; ret ; FulR in a,($7F) ; cpl ; bit 3,a ; ret ; FulU in a,($7F) ; cpl ; bit 0,a ; ret ; FulD in a,($7F) ; cpl ; bit 1,a ; ret ; FulF in a,($7F) ; cpl ; bit 7,a ; ret ; ProL ld a,$F7 ; in a,($FE) ; cpl ; bit 4,a ; ret ; ProR ld a,$EF ; in a,($FE) ; cpl ; bit 2,a ; ret ; ProU ld a,$EF ; in a,($FE) ; cpl ; bit 3,a ; ret ; ProD ld a,$EF ; in a,($FE) ; cpl ; bit 4,a ; ret ; ProF ld a,$EF ; in a,($FE) ; cpl ; bit 0,a ; ret ; SinL ld a,$EF ; in a,($FE) ; cpl ; bit 4,a ; ret ; SinR ld a,$EF ; in a,($FE) ; cpl ; bit 3,a ; ret ; SinU ld a,$EF ; in a,($FE) ; cpl ; bit 1,a ; ret ; SinD ld a,$EF ; in a,($FE) ; cpl ; bit 2,a ; ret ; SinF ld a,$EF ; in a,($FE) ; cpl ; bit 0,a ; ret ; ; This code compiles the user defined keys into the fastest code to read them DoKeys ld ix,kLeft ; ld iy,UDKWS ; ld de,UDKTab ; ld b,8 ; Game1 push bc ; push de ; ld hl,HSBuffer ; DK1 ld a,(de) ; cp 40 ; jr nc,DK2 ; call Conv ; ld (hl),b ; inc hl ; ld (hl),c ; inc hl ; inc de ; jr DK1 ; Conv ld bc,$FEFE ; inc a ; Conv1 dec a ; ret z ; rlc c ; bit 5,c ; jr nz,Conv1 ; ld c,$FE ; rlc b ; jr Conv1 ; DK2 ld (hl),0 ; ld de,HSBuffer-2 ; DK3 inc de ; inc de ; ld a,(de) ; or a ; jr z,DK5 ; ld h,d ; ld l,e ; DK4 inc hl ; inc hl ; ex af,af' ; ld a,(hl) ; or a ; jr z,DK3 ; ex af,af' ; cp (hl) ; jr nz,DK4 ; inc de ; inc hl ; ex af,af' ; ld a,(de) ; and (hl) ; ld (de),a ; ex af,af' ; ld (hl),$FF ; dec hl ; dec de ; ld (hl),$FF ; jr DK4 ; DK5 ld de,HSBuffer-2 ; DK5a inc de ; inc de ; ld a,(de) ; or a ; jr z,DK5c ; cp $FF ; jr z,DK5a ; inc de ; ld a,(de) ; dec de ; ld h,d ; ld l,e ; inc hl ; DK5b inc hl ; ex af,af' ; ld a,(hl) ; or a ; jr z,DK5a ; ex af,af' ; inc hl ; cp (hl) ; jr nz,DK5b ; dec hl ; ex af,af' ; ld a,(de) ; and (hl) ; ld (de),a ; ex af,af' ; ld (hl),$FF ; inc hl ; ld (hl),$FF ; jr DK5b ; DK5c ld (ix+0),$C3 ; ld a,iyl ; ld (ix+1),a ; ld a,iyh ; ld (ix+2),a ; inc ix ; inc ix ; inc ix ; ld hl,HSBuffer-2 ; DK6 inc hl ; inc hl ; DK7 ld a,(hl) ; or a ; jr z,DK8 ; cp $FF ; jr z,DK6 ; ld (iy+0),$3E ; inc iy ; ld a,(hl) ; inc hl ; ld (iy+0),a ; inc iy ; ld (iy+0),$DB ; inc iy ; ld (iy+0),$FE ; inc iy ; ld (iy+0),$F6 ; inc iy ; ld a,(hl) ; inc hl ; ld (iy+0),a ; inc iy ; ld (iy+0),$3C ; inc iy ; ld (iy+0),$C0 ; inc iy ; jr DK7 ; DK8 ld (iy-1),$C9 ; pop de ; pop bc ; ld a,e ; or $0F ; ld e,a ; inc de ; dec b ; jp nz,Game1 ; ret ; ; Init the interrupt handler InitInt ld hl,IntPage ; ld b,0 ; ld a,IntVec/256 ; IIlp ld (hl),a ; inc hl ; djnz IIlp ; ld (hl),a ; ld a,1 ; ld (SecCount),a ; xor a ; ld (Sc_F),a ; ld a,IntPage/256 ; ld i,a ; im 2 ; ret ; ; Init the clock display InitClock ld hl,ClockDataN ; ld de,Colon1N ; ld bc,Colon2N ; ld a,(CType) ; or a ; ld a,$47 ; jr z,IC0 ; ld a,$7 ; ld hl,ClockDataR ; ld de,Colon1R ; ld bc,Colon2R ; IC0 ld (CM1),de ; ld (CM1a),de ; ld (CM2),bc ; ld (CM2a),bc ; ld (CM0),a ; ld de,p1 ; ld bc,CDEnd-ClockDataN ; ldir ; ld a,(CType) ; or a ; ld a,$1C ; jr z,IC2 ; ld hl,$52C2 ; call IC1 ; ld hl,$52C5 ; IC1 ld (hl),a ; inc h ; ld (hl),a ; inc h ; inc h ; ld (hl),a ; inc h ; ld (hl),a ; ret ; IC2 ld hl,$420E ; call IC1 ; ld hl,$4211 ; jr IC1 ; InitInst ld a,(CType) ; or a ; jr z,InitIN ; cp 3 ; jp z,InitIt ; ld a,0 ; ld (pCurX),a ; ld hl,$50A0 ; ld (pCurY),hl ; call PrintStr1 ; defb "Energy",0 ld a,$CE ; ld (pCurX),a ; call PrintStr1 ; defb "Angle",0 ld de,$5AA0 ; ld hl,BottDefNR ; NR1 call SetAttr ; jp InitScroll ; ; Init the instruments InitIN xor a ; ld (pCurX),a ; ld hl,ScreenBase ; ld (pCurY),hl ; call PrintStr1 ; defb "Angle",0 xor a ; ld (pCurX),a ; ld hl,$50A0 ; ld (pCurY),hl ; call PrintStr1 ; defb "Energy",0 ld a,$B8 ; ld (pCurX),a ; call PrintStr1 ; defb "Score",0 ld de,Attrs ; ld hl,TopDefN ; call SetAttr ; ld de,$5A80 ; ld hl,BottDefN ; call SetAttr ; call InitScroll ; ld hl,$5680 ; call ILine ; ld hl,$4120 ; call ILine ; ret ; ; Clear the attributes to bright white/black InitIt ld hl,Attrs ; ld de,Attrs+1 ; ld bc,lAttrs-1 ; ld (hl),$47 ; ldir ; ret ; ; Fire-up menu FUM defb $5 ; defb "Forbidden Planet " ; defb $3 ; defb "(c) " ; defb 5 ; defb "Design" ; defb 6 ; defb "Design" ; defb 7 ; defb "Software" ; defb $00,$FF ; ; Fire-up demo FUD defb $5 ; defb "Demo mode" ; defb $00,$FF ; ; Draw a dotted line ILine ld b,$20 ; ILine1 ld (hl),$AA ; inc l ; djnz ILine1 ; ret ; SetAttr ld a,(hl) ; or a ; ret z ; inc hl ; ld b,(hl) ; inc hl ; SAlp ld (de),a ; inc de ; djnz SAlp ; jr SetAttr ; BottDefNR defb $43,$19 ; defb $45,$07 ; defb $47,$08 ; defb $43,$11 ; defb $47,$07 ; defb $07,$20 ; defb $00 ; BottDefN defb $47,$20 ; defb $43,$06 ; defb $43,$10 ; defb $46,$05 ; defb $07,$05 ; defb $43,$06 ; defb $43,$10 ; defb $46,$05 ; defb $07,$05 ; defb $47,$20 ; defb $00 ; TopDefN defb $45,$06 ; defb $47,$1A ; defb $47,$20 ; defb $00 ; OptKeyTab defb $FF,$FF,$84,$00 ; Esc defb $F7,$FE,$00,$01 ; "1" defb $F7,$FD,$00,$02 ; "2" defb $F7,$FB,$00,$03 ; "3" defb $F7,$F7,$00,$04 ; "4" defb $F7,$EF,$00,$05 ; "5" defb $EF,$EF,$84,$06 ; "6" defb $EF,$F7,$84,$07 ; "7" defb $EF,$FB,$84,$08 ; "8" defb $EF,$FD,$84,$09 ; "9" defb $BF,$FE,$84,$0A ; cCret defb $7F,$FE,$00,$0B ; " " UDKdesc defb $80 or "C","S" ; defb "ZXCV" ; defb "ASDFG" ; defb "QWERT" ; defb "12345" ; defb "09876" ; defb "POIUY" ; defb $80 or "C","r" ; defb "LKJH" ; defb $80 or "S","p" ; defb $80 or "S","S" ; defb "MNB" ; ; Menu text sEndDead defb cCls,cCret,cCret,cYellow defb "You were killed , scoring " defb cWhite,0 sEndDead1 defb "0 " defb cYellow defb "points ." defb cCret,cCret,cCyan defb "Press SPACE",0 sEndEsc defb cCls,cCret,cCret,cYellow defb "Congratulations ! You escaped from the planet" defb cCret,cCret,cCyan defb "If you can decode it , enter the key ." defb cCret,cCret,cMagenta,0 sWrongCode defb $0D,$0D,$05 defb "Sorry , this key does not decode the message" defb $0D,$0D,$06 defb "Press SPACE",$00 sFuckUp defb $0C,$06 defb "Oh dear ! something's gone wrong !" defb $0D,$0D,$05 defb "Please phone 061-205-6603 and quote this" defb $0D defb "number :- " defb $07 defb "2.0:",$00 sHexMon defb $0C,$05 defb "Sorry , this option is not enabled at present" defb $0D,$0D,$07 defb "Press ENTER",$00 sHexMon1 defb $0C,$05,$86,$83 defb "Quaimon 2" defb $0D,$0D,$06 defb "(m)od , (t)ab , (e)xec , (q)uit" defb $00 sMonError defb $05 defb "Error !" defb $00 sMainMenu defb $07,$0C,$86,$86,$82 defb "Forbidden Planet" defb $0D,$0D defb $03 defb " Part Three of the Dark Star Trilogy" defb $0D,$0D defb $07 defb " 1 " defb $03 defb " Play the game" defb $07 defb $0D,$0D defb " 2 " defb $02 defb " Instructions" defb $07 defb $0D,$0D defb $0D,$0D defb " 3 " defb $06 defb " Select the playing keys and joystick" defb $07 defb $0D,$0D defb " 4 " defb $04 defb " Change the game options" defb $07 defb $0D,$0D defb $0D,$0D defb $0D defb " 5 " defb $05 defb " Simple demo sheet" defb $0D,$0D defb $0D,$0D defb $03 defb "Designed without the aid of a computer ." defb $0D,$0D defb "(c) Design Design Software" defb $00 ; These were disassembled back from the object, hence the ugly formatting. sKeysMenu defb $0C,$86,$83,$85,$06,"Present Controls",$0D,$0D,$07 defb " 1 ",$04,"Turn left",$0D,$0D,$07," 2 ",$04 defb "Turn right",$0D,$0D,$07," 3 ",$05 defb "Move Up",$0D,$0D,$07," 4 ",$05,"Move Down",$0D,$0D,$07 defb " 5 ",$06,"Accelerate",$0D,$0D,$07 defb " 6 ",$06,"Decelerate",$0D,$0D,$07 defb " 7 ",$05,"Fire",$0D,$0D,$07," 8 ",$03 defb "Return to main menu ",$07,"9 ",$03 defb "Select Joystick",$0D,$0D,$05,"Press a number between ",$07 defb "'1' ",$05,"and ",$07,"'7' ",$05,"to select the control that you wi" defb "sh to change .",$0D,$0D,$06," Then type all the keys that yo" defb "u want for",$0D,"that control and finish by typing the" defb " ",$07,"'1' ",$06,"key.",$00 sJoysticks defb $0C,$86,$86,$83,$06,"Joystick Menu",$0D,$0D,$0D defb " 1 ",$04,"Kempston",$07,$0D,$0D," 2 ",$03 defb "Fuller Box",$0D,$0D,$07," 3 ",$06 defb "Protek ( any cursor joystick )",$0D,$0D,$07 defb " 4 ",$05,"Sinclair Interface 2",$0D,$0D,$07 defb " 5 ",$04,"IEEE Interface",$0D,$0D,$0D,$07 defb " 8 ",$03,"Return to main menu ",$07 defb " 9 ",$03,"Select keyboard",$0D,$0D,$0D,$06 defb " Please note that even when you select",$0D defb "a joystick the keyboard is still used for",$0D defb "accelerate & deccelerate .",$0D,$0D,$05 defb " If you have a programmable joystick then",$0D defb "select the Sinclair and define yours to be",$0D defb "6 = Left 7 = Right 9 = Up 8 = Down 0 = Fire",$00 sSkillLevels defb $0C,$86,$86,$86,$81,$05,"Skill Levels",$0D,$0D,$0D,$0D,$07 defb " 1 ",$05,"Easy",$0D,$0D,$07," 2 ",$06 defb "Normal",$0D,$0D,$0D,$0D,$07," 3 ",$04 defb "Nasty",$0D,$0D,$07," 4 ",$03,"Very nasty",$0D,$0D,$0D,$0D,$0D,$07 defb " 5 ",$05,"Pretty damn devastating !",$00 sNoises defb $0C,$86,$86,$86,$82,$06,"Noises",$0D,$0D,$0D,$0D,$07 defb " 1 ",$05,"None",$0D,$0D,$07," 2 ",$06 defb "Strange",$0D,$0D,$0D,$0D,$07," 3 ",$04 defb "Very Strange",$00 sDisplay defb $0C,$86,$86,$86,$82,$03,"Display",$0D,$0D,$0D,$0D,$07 defb " 1 ",$05,"Normal",$0D,$0D,$07," 2 ",$06 defb "Slimline",$0D,$0D,$0D,$0D,$07," 3 ",$04 defb "Wideangle",$00 sOptiMenu defb $0C,$86,$86,$84,$04,"Game Options",$0D,$0D,$0D,$0D,$07 defb " 1 ",$05,"Change Skill Factors",$0D,$0D,$07 defb " 2 ",$06,"Change Noises",$0D,$0D,$0D,$0D,$07 defb " 3 ",$03,"Display Format",$0D,$0D,$0D,$0D,$0D,$0D,$0D,$0D,$0D,$0D sBottom defb $0D,$07," 8 ",$05,"Return to main menu",$0D,$0D,$07 defb " 9 ",$03,"Return to options menu",$00 sInst defb $0C,$86,$86,$84,"Instructions",$0D,$0D,$0D,$03 defb " You must find the code segments and",$0D,$0D defb "decode them .",$0D,$0D,$04," All the keys are user-defined e" defb "xcept :-",$0D,$0D,$0D,$0D,$07," 1 ",$05 defb "Displays map .",$0D,$0D,$07," 2 ",$06 defb "Quit Game .",$0D,$0D,$07," 3 ",$04 defb "Display codes found .",$07,$0D,$0D,$0D defb " 4 ",$05,"Returns to the game from these .",$00 sHighA defb $0C,$86,$86,$82,"Forbidden Planet",$0D,$0D,$86,$86,$84,$05 defb "Hall of Fame",$0D,$0D,$0D,$00 sHighB defb $0D,$0D," Press ",$05,"SPACE ",$06 defb "to play or ",$05,"ENTER ",$06,"for options",$00 sHighC defb $07 HSChar defb "1",$92,$03,$00 sAccept defb $0D,$0D,$85,"Please type in your entry .",$03,$00 ; The clues for the high-score table modifications... sClues defb "version",0 defb "sex",0 defb "laser",0 defb "fuck",0 defb "shit",0 defb "help",0 defb "designdesign",0 defb "pinback",0 defb "darkstar",0 defb "mon",0 defb "corwench",0 defb $FF ; The text for the high-score table modifications... Text defb "Ver 2.0 [Massaged for zx-spin :( ]",0 defb "Hmmm. . . tricky !",0 defb "2mW Helium-Neon 633 nm",0 defb "Oh yes please !",0 defb "Shit somewhere else !",0 defb "Help ?",0 defb "What a what a silly silly name !",0 defb "Want yer mouse ?",0 defb $22," Hate it ! ",$22,0 defb "Let go of my ears - I know my job !",0 defb "Nibble nibble !",0 defb $FF ; Fire up code. This deletes itself after running to hide the LD R,A instruction ; ; This code sets the top-bit of R, the loader starts the game here if it ; thinks the game hasn't been pirated. How does it know? In the quiet gap ; between sections of tape it looks at how noisy the tape is. An original ; is very quiet, most copies were made using AGC so they're noisy... ; ; Years later someone else claimed this idea as their own. Sic Transit... ; FireUpHack ldir ; FireUp ld bc,$E7FE ; "I" key in a,(c) ; or $E0 ; inc a ; jp nz,SpaceInvaders ; ld a,$80 ; Set the top-bit of R ld r,a ; But this kills the random HS ld hl,Start ; ld (FireUpVector),hl ; ld hl,FireUpHack ; ld bc,36 ; ld ix,$6B00 ; ldir ; jp (ix) ; ; Interrupt table here! ; ; The idea is that we fill a page with the same value then put the z80 in ; IM2, the vectored mode. It doesn't matter what the vector value is because ; all addresses point to the same place... ; ; Took bloody ages to get zxspin's joke of an assembler to do what I wanted ; here. It silently failed but reported problems elsewhere, which is just ; about the only unforgivable sin in an assembler... ; align 256 ; IntPage equ $ defs $101,((IntPage/256)+1) ; org IntPage+$100 + (IntPage/256)+1 ; IntVec jp IntRoutine ; ; The main game code org $9400 GameCode call Options_Subs ; call SetUpTabs ; call GenYTab ; call Gen192Tab ; call InitVars ; call InitStars ; call InitObjes ; call InitLines ; call CreateStars ; call InitCodes ; call InitStats ; ld a,$47 ; ld (GameAttr),a ; ld (Colour),a ; ld a,DamFSD ; ld (DDamage),a ; ld a,GameRunning ; ld (EndState),a ; call CLS ; ld hl,$1000 ; ld (Distance),hl ; halt ; halt ; ld a,(Mode) ; cp ModeDemo ; jp z,DoDemo ; call InitMap ; Loop ld a,(ADamage) ; or a ; jr z,Exit ; ld a,(EndState) ; cp GameRunning ; jr nz,Exit ; call AlterSteps ; call DoVectors ; call DrawSights ; call ShowObje ; call ShowStars ; call PlayerFire ; call AddObjects ; ld bc,$EFFE ; in a,(c) ; or $E0 ; 6,7,8,9,0 inc a ; jp nz,Loop ; ld bc,$F7FE ; in a,(c) ; bit 3,a ; jr z,Loop ; or $F8 ; 1,2,3 inc a ; jp z,Loop ; call DispStats ; jp Loop ; Exit di ; ld bc,0 ; ExitLp cpi ; jp pe,ExitLp ; ret ; DoDemo ld iy,DemoData ; DemoLoop ld l,(iy+dDemoText_L) ; ld h,(iy+dDemoText_H) ; ld a,l ; or h ; jr z,DemoQuit ; push iy ; call vAddScroll ; pop iy ; ld l,(iy+dDemoObje_L) ; ld h,(iy+dDemoObje_H) ; ld bc,4 ; add iy,bc ; push hl ; pop ix ; push iy ; call NextObje ; pop iy ; ld hl,-$B0 ; ld bc,$80 ; call DemoFlyIn ; ld hl,-$10 ; ld bc,$90 ; call DemoFlyIn ; jp DemoLoop ; DemoQuit di ; ret ; DemoFlyIn ld (DeltaZ),hl ; DemoLp push iy ; push bc ; call ShowObje ; call ShowStars ; pop bc ; pop iy ; cpi ; jp pe,DemoLp ; ret ; sdIris defb cCyan,"Various holes in force fields which must be flo" defb "wn through .",0,$FF sdHoles defb cCyan,"yet more holes which must be flown through .",0,$FF sdDef defb cCyan,"Various defences .",0,$FF sdCode defb cYellow,"This is a code store , the code is revealed on " defb "impact ",0,$FF DemoData defw sdIris,IrisDemo ; defw sdHoles,HoleDemo ; defw sdDef,TowerDemo ; defw sdCode,CodeDemo ; defw 0,0 ; ; Start of MATHS NegHL ld a,l ; cpl ; ld l,a ; ld a,h ; cpl ; ld h,a ; inc hl ; ret ; Rand push hl ; push bc ; call Rand1 ; pop bc ; pop hl ; ld de,(Seed) ; ret ; Rand1 ld hl,(Seed+2) ; rl l ; rl h ; rl l ; rl h ; ld c,h ; ld a,(Seed) ; rla ; ld b,a ; ld de,(Seed+1) ; rl e ; rl d ; res 7,d ; ld hl,(Seed) ; add hl,bc ; ld (Seed),hl ; ld hl,(Seed+2) ; adc hl,de ; res 7,h ; ld (Seed+2),hl ; ret m ; ld hl,Seed ; Rand2 inc (hl) ; ret nz ; inc hl ; jr Rand2 ; Seed defb "Nig!" ; DivHLDE ld a,h ; cp d ; jr z,Div1 ; jr nc,Div16 ; Div81 xor a ; Div8 ld c,a ; add hl,hl ; sbc hl,de ; jr c,Div70 ; adc a,a ; add hl,hl ; sbc hl,de ; jr c,Div60 ; Div61 adc a,a ; add hl,hl ; sbc hl,de ; jr c,Div50 ; Div51 adc a,a ; add hl,hl ; sbc hl,de ; jr c,Div40 ; Div41 adc a,a ; add hl,hl ; sbc hl,de ; jr c,Div30 ; Div31 adc a,a ; add hl,hl ; sbc hl,de ; jr c,Div20 ; Div21 adc a,a ; add hl,hl ; sbc hl,de ; jr c,Div10 ; Div11 adc a,a ; add hl,hl ; sbc hl,de ; adc a,a ; cpl ; ld l,a ; ld h,c ; ret ; Div1 ld a,l ; cp e ; jr c,Div81 ; jr z,Div0 ; Div16 ld a,l ; ld l,h ; ld h,$00 ; ld b,$08 ; Div16a add a,a ; adc hl,hl ; sbc hl,de ; jr nc,Div16b ; add hl,de ; djnz Div16a ; jp Div8 ; Div16b inc a ; djnz Div16a ; jp Div8 ; Div70 adc a,a ; add hl,hl ; add hl,de ; ccf ; jr nc,Div61 ; Div60 adc a,a ; add hl,hl ; add hl,de ; ccf ; jr nc,Div51 ; Div50 adc a,a ; add hl,hl ; add hl,de ; ccf ; jr nc,Div41 ; Div40 adc a,a ; add hl,hl ; add hl,de ; ccf ; jr nc,Div31 ; Div30 adc a,a ; add hl,hl ; add hl,de ; ccf ; jr nc,Div21 ; Div20 adc a,a ; add hl,hl ; add hl,de ; ccf ; jr nc,Div11 ; Div10 adc a,a ; add hl,hl ; add hl,de ; ccf ; adc a,a ; cpl ; ld l,a ; ld h,c ; ret ; Div0 ld hl,$0100 ; ret ; ObjeDiv bit 7,h ; jr nz,OD1 ; call DivHLDE ; srl h ; rr l ; ret ; OD1 ld a,l ; cpl ; ld l,a ; ld a,h ; cpl ; ld h,a ; inc hl ; call DivHLDE ; ld a,l ; cpl ; ld l,a ; ld a,h ; cpl ; ld h,a ; inc hl ; sra h ; rr l ; ret ; ShapeDiv push bc ; call ObjeDiv ; pop bc ; ret ; MultHLDE ld b,h ; ld c,l ; ld hl,0 ; ld a,c ; ld c,b ; ld b,8 ; rra ; Mul0 jr nc,Mul1 ; add hl,de ; Mul1 rr h ; rl l ; rra ; djnz Mul0 ; ld b,a ; ld a,c ; ld c,b ; ld b,$08 ; rra ; Mul2 jr nc,Mul3 ; add hl,de ; Mul3 rr h ; rr l ; rra ; djnz Mul2 ; ld h,l ; ld l,a ; ret ; SignMult bit 7,h ; jr z,SM1 ; ld a,h ; cpl ; ld h,a ; ld a,l ; cpl ; ld l,a ; inc hl ; bit 7,d ; jr z,SMn ; ld a,d ; cpl ; ld d,a ; ld a,e ; cpl ; ld e,a ; inc de ; SMp jp MultHLDE ; SMn call MultHLDE ; ld a,h ; cpl ; ld h,a ; ld a,l ; cpl ; ld l,a ; inc hl ; ret ; SM1 bit 7,d ; jr z,MultHLDE ; ld a,d ; cpl ; ld d,a ; ld a,e ; cpl ; ld e,a ; inc de ; jp SMn ; SignDiv bit 7,h ; jr z,SD1 ; ld a,h ; cpl ; ld h,a ; ld a,l ; cpl ; ld l,a ; inc hl ; bit 7,d ; jr z,SDn ; ld a,d ; cpl ; ld d,a ; ld a,e ; cpl ; ld e,a ; inc de ; SDp jp DivHLDE ; SDn call DivHLDE ; ld a,h ; cpl ; ld h,a ; ld a,l ; cpl ; ld l,a ; inc hl ; ret ; SD1 bit 7,d ; jp z,DivHLDE ; ld a,d ; cpl ; ld d,a ; ld a,e ; cpl ; ld e,a ; inc de ; jp SDn ; ; End of MATHS Options_Subs ld a,(BType) ; ld b,a ; bit 0,b ; call GetSoundFlag ; ld (SoundFlagHLX),a ; bit 1,b ; call GetSoundFlag ; ld (SoundFlagVL),a ; bit 2,b ; call GetSoundFlag ; ld (SoundFlagAL),a ; ld (SoundFlagAL1),a ; xor a ; ld (cSoundVal),a ; ret ; GetSoundFlag ld a,0 ; ret z ; ld a,$F8 ; ret ; ; Uncomment this section to make the easy option not do damage when not firing... ; If this is -1, ie, we are on the easy level, ignore it unless we are firing ;DoDamage ld a,b ; If not -1 then do it ; cp -1 ; ; jr nz,AlwaysDoDamage ; ; This is the smallest amount possible, easy level ; call kFire ; Are we firing? ; jr z,DoDx ; No, ignore this ; We are firing, so allow damage ; ld b,-1 ; Do it ; Given a +- amount of damage in B, add it to the damage. DoDamage equ $ AlwaysDoDamage ld a,(DDamage) ; bit 7,b ; jr nz,DDa ; add a,b ; cp DamFSD ; jr c,DD1 ; ld a,DamFSD ; DD1 ld (DDamage),a ; DoDx ret ; DDa add a,b ; jp p,DD1 ; xor a ; jr DD1 ; AddScore ld hl,(DScore) ; add a,l ; daa ; ld l,a ; ld a,h ; adc a,$00 ; daa ; ld h,a ; jr nc,AS1 ; ld hl,$9999 ; AS1 ld (DScore),hl ; ret ; SubScore ret ; LimitStarCnt ld b,a ; ld a,(cnStars) ; add a,b ; cp $1A ; ret nc ; ld (cnStars),a ; ret ; ShowObje ld hl,$0000 ; ld (cObjeZ),hl ; xor a ; ld (ShuffledF),a ; ld (cnObje),a ; ld iy,ObjeSeq ; ld hl,(pObjeList) ; SOlp ld a,l ; or h ; jp z,ShowObje2 ; ld (iy+2),l ; ld (iy+3),h ; push hl ; pop ix ; bit bKilled,(ix+dObjeFlags) ; jp nz,SOMiss ; ld e,(ix+dObjedX_L) ; ld d,(ix+dObjedX_H) ; ld hl,(DeltaX) ; add hl,de ; ld e,(ix+dObjeX_L) ; ld d,(ix+dObjeX_H) ; ld (ix+dObjeOX_L),e ; ld (ix+dObjeOX_H),d ; add hl,de ; ld (ix+dObjeX_L),l ; ld (ix+dObjeX_H),h ; ld e,(ix+dObjedY_L) ; ld d,(ix+dObjedY_H) ; ld hl,(DeltaY) ; add hl,de ; ld e,(ix+dObjeY_L) ; ld d,(ix+dObjeY_H) ; ld (ix+dObjeOY_L),e ; ld (ix+dObjeOY_H),d ; add hl,de ; ld (ix+dObjeY_L),l ; ld (ix+dObjeY_H),h ; ld e,(ix+dObjedZ_L) ; ld d,(ix+dObjedZ_H) ; ld hl,(DeltaZ) ; add hl,de ; ld e,(ix+dObjeZ_L) ; ld d,(ix+dObjeZ_H) ; ld (ix+dObjeOZ_L),e ; ld (ix+dObjeOZ_H),d ; add hl,de ; ld (ix+dObjeZ_L),l ; ld (ix+dObjeZ_H),h ; bit 7,h ; jp nz,SOkill ; ld de,MinZ ; or a ; sbc hl,de ; jp m,SOkill ; ld de,$8000 ; add hl,de ; ld (iy+0),l ; ld (iy+1),h ; Test ld de,(cObjeZ) ; ld (cObjeZ),hl ; or a ; sbc hl,de ; call c,SortObje ; ld bc,4 ; add iy,bc ; ld a,(cnObje) ; inc a ; ld (cnObje),a ; ld l,(ix+dpnObje_L) ; ld h,(ix+dpnObje_H) ; jp SOlp ; SOkill ld a,(ix+dObjeFlags) ; bit bCursorClip,a ; jr nz,SOCurClip ; bit bScreenClip,a ; jp z,SOMiss ; bit bOnScreen,a ; jr nz,SOHit ; ld l,(ix+dObjeDispXL_L) ; ld h,(ix+dObjeDispXL_H) ; ld de,-128 ; add hl,de ; bit 7,h ; jp p,SOMiss ; ; For some reason we call kLeft here. I think this was an editing mistake ; in the original source call kLeft ; ld l,(ix+dObjeDispYT_L) ; ld h,(ix+dObjeDispYT_H) ; add hl,de ; bit 7,h ; jp p,SOMiss ; ld l,(ix+dObjeDispXR_L) ; ld h,(ix+dObjeDispXR_H) ; ld de,128 ; add hl,de ; bit 7,h ; jp m,SOMiss ; ld l,(ix+dObjeDispYB_L) ; ld h,(ix+dObjeDispYB_H) ; add hl,de ; bit 7,h ; jp m,SOMiss ; jp SOHit ; SOCurClip ld l,(ix+dObjeDispXL_L) ; ld h,(ix+dObjeDispXL_H) ; ld de,(XTurn) ; sra d ; rr e ; or a ; sbc hl,de ; jp p,SOMiss ; ld l,(ix+dObjeDispXR_L) ; ld h,(ix+dObjeDispXR_H) ; or a ; sbc hl,de ; jp m,SOMiss ; ld l,(ix+dObjeDispYT_L) ; ld h,(ix+dObjeDispYT_H) ; ld de,(YTurn) ; sra d ; rr e ; or a ; sbc hl,de ; jp p,SOMiss ; ld l,(ix+dObjeDispYB_L) ; ld h,(ix+dObjeDispYB_H) ; or a ; sbc hl,de ; jp m,SOMiss ; SOHit ld l,(ix+dObjeColl_L) ; ld h,(ix+dObjeColl_H) ; jp SO_k1 ; SOMiss ld l,(ix+dObjeMiss_L) ; ld h,(ix+dObjeMiss_H) ; SO_k1 call CallHL ; ld l,(ix+dpnObje_L) ; ld h,(ix+dpnObje_H) ; push iy ; push hl ; call KillObje ; pop hl ; pop iy ; ld a,(ix+dObjeStarComp) ; call LimitStarCnt ; jp SOlp ; ShowObje2 ld a,0 ; ShuffledF equ $-1 ; or a ; call nz,ResortObje ; ld hl,WindowTable ; ld (pcWindow),hl ; ld hl,$7FFF ; ld (WindowTable),hl ; call ResMargin ; ld a,$FF ; ld (WindowMask),a ; ld hl,(pObjeList) ; SOlp2 ld a,l ; or h ; ret z ; push hl ; pop ix ; ld l,(ix+dObjeAlter_L) ; ld h,(ix+dObjeAlter_H) ; call CallHL ; ld l,(ix+dObjeMove_L) ; ld h,(ix+dObjeMove_H) ; call CallHL ; res bOnScreen,(ix+dObjeFlags) ; ld a,(WindowMask) ; and (ix+dObjeCol) ; ld (Colour),a ; ld l,(ix+dObjeDraw_L) ; ld h,(ix+dObjeDraw_H) ; call CallHL ; ld l,(ix+dpnObje_L) ; ld h,(ix+dpnObje_H) ; jp SOlp2 ; CallDE push de ; Ret0 ret ; CallHL jp (hl) ; ResortObje ld iy,ObjeSeq ; ld b,0 ; cnObje equ $-1 ; ld de,0 ; ld l,(iy+2) ; ld h,(iy+3) ; ld (pObjeList),hl ; ROlp inc iy ; inc iy ; inc iy ; inc iy ; push hl ; pop ix ; ld (ix+dppObje_L),e ; ld (ix+dppObje_H),d ; ex de,hl ; ld l,(iy+2) ; ld h,(iy+3) ; ld (ix+dpnObje_L),l ; ld (ix+dpnObje_H),h ; djnz ROlp ; ld hl,0 ; ld (ix+dpnObje_L),l ; ld (ix+dpnObje_H),h ; ret ; SortObje ld a,$38 ; ld (ShuffledF),a ; ld e,(iy+0) ; ld d,(iy+1) ; push ix ; ld ix,ObjeSeq-4 ; ld bc,4 ; SortLp add ix,bc ; ld l,(ix+0) ; ld h,(ix+1) ; or a ; sbc hl,de ; jp m,SortLp ; ld a,(cnObje) ; add a,a ; add a,a ; add a,4 ; ld c,a ; ld b,0 ; push ix ; pop hl ; add hl,bc ; ld d,h ; ld e,l ; inc de ; inc de ; inc de ; inc de ; lddr ; ld l,(iy+4) ; ld h,(iy+5) ; ld (ix+0),l ; ld (ix+1),h ; ld l,(iy+6) ; ld h,(iy+7) ; ld (ix+2),l ; ld (ix+3),h ; pop ix ; ret ; FFgetline ld iy,(pFreeLines) ; ld a,iyl ; or iyh ; scf ; ret z ; ld l,(iy+dpnLineFree_L) ; ld h,(iy+dpnLineFree_H) ; ld (pFreeLines),hl ; ld hl,0 ; ld (iy+dpnLine_L),l ; ld (iy+dpnLine_H),h ; ld hl,Ret02 ; The various Ret's, Ret02 and so on are ld (iy+dpLineAlg_L),l ; zxspin modifications - zeus could use Ret. ld (iy+dpLineAlg_H),h ; zxspin can't distinguish symbols from mnemonics or a ; And as well as that there are scoping issues ret ; when the sources were combined, so several Ret's clashed. AddFirstLine ld iy,(pFreeLines) ; ld a,iyl ; or iyh ; scf ; ret z ; ld l,(iy+dpnLineFree_L) ; ld h,(iy+dpnLineFree_H) ; ld (pFreeLines),hl ; ld hl,0 ; ld (iy+dpnLine_L),l ; ld (iy+dpnLine_H),h ; ld hl,Ret02 ; ld (iy+dpLineAlg_L),l ; ld (iy+dpLineAlg_H),h ; ld a,(ix+dObjepDraw) ; inc a ; and $07 ; ld (ix+dObjepDraw),a ; add a,a ; add a,dObjepLines_L ; add a,ixl ; ld l,a ; ld a,ixh ; adc a,0 ; ld h,a ; ld a,iyl ; ld (hl),a ; inc hl ; ld a,iyh ; ld (hl),a ; or a ; ret ; AddLine ld hl,(pFreeLines) ; ld (iy+dpnLine_L),l ; ld (iy+dpnLine_H),h ; ld a,l ; or h ; scf ; ret z ; push hl ; pop iy ; ld l,(iy+dpnLineFree_L) ; ld h,(iy+dpnLineFree_H) ; ld (pFreeLines),hl ; ld hl,0 ; ld (iy+dpnLine_L),l ; ld (iy+dpnLine_H),h ; ld hl,Ret02 ; ld (iy+dpLineAlg_L),l ; ld (iy+dpLineAlg_H),h ; ret ; UndrawLines ld a,(ix+dObjepUnDraw) ; inc a ; and $07 ; ld (ix+dObjepUnDraw),a ; add a,a ; add a,dObjepLines_L ; add a,ixl ; ld l,a ; ld b,$00 ; ld a,ixh ; adc a,b ; ld h,a ; ld a,(hl) ; ld (hl),b ; inc hl ; ld c,(hl) ; ld (hl),b ; ld h,c ; ld l,a ; Undrawlp ld a,l ; or h ; ret z ; push hl ; pop iy ; ld l,(iy+dpLineAlg_L) ; ld h,(iy+dpLineAlg_H) ; call CallHL ; ld hl,(pFreeLines) ; ld (iy+dpnLineFree_L),l ; ld (iy+dpnLineFree_H),h ; ld (pFreeLines),iy ; ld l,(iy+dpnLine_L) ; ld h,(iy+dpnLine_H) ; jp Undrawlp ; InitObjes ld hl,ObjeTable ; ld (pFreeObje),hl ; ld b,nObjes ; ld de,lObje ; IOlp push hl ; pop ix ; add hl,de ; ld (ix+dpnFreeObje_L),l ; ld (ix+dpnFreeObje_H),h ; djnz IOlp ; ld hl,0 ; ld (ix+dpnFreeObje_L),l ; ld (ix+dpnFreeObje_H),h ; ld (pObjeList),hl ; ret ; InitLines ld hl,LineTable ; ld (pFreeLines),hl ; ld b,nLines ; ld de,lLine ; ILlp push hl ; pop ix ; add hl,de ; ld (ix+dpnLineFree_L),l ; ld (ix+dpnLineFree_H),h ; djnz ILlp ; ld hl,0 ; ld (ix+dpnLineFree_L),l ; ld (ix+dpnLineFree_H),h ; ret ; AddObje ex de,hl ; ld iy,(pFreeObje) ; ld a,iyl ; or iyh ; scf ; ret z ; ld l,(iy+dpnFreeObje_L) ; ld h,(iy+dpnFreeObje_H) ; ld (pFreeObje),hl ; ld hl,(pObjeList) ; ld a,l ; or h ; jr nz,AOnz ; ld (iy+dppObje_L),l ; ld (iy+dppObje_H),h ; ld (iy+dpnObje_L),l ; ld (iy+dpnObje_H),h ; ld (pObjeList),iy ; ex de,hl ; ld (iy+dObjeZ_L),l ; ld (iy+dObjeZ_H),h ; or a ; ret ; AOlast ld (iy+dpnObje_L),l ; ld (iy+dpnObje_H),h ; push ix ; pop hl ; ld (iy+dppObje_L),l ; ld (iy+dppObje_H),h ; push iy ; pop hl ; ld (ix+dpnObje_L),l ; ld (ix+dpnObje_H),h ; ex de,hl ; ld (iy+dObjeZ_L),l ; ld (iy+dObjeZ_H),h ; or a ; ret ; AOnxt ld l,(ix+dpnObje_L) ; ld h,(ix+dpnObje_H) ; ld a,l ; or h ; jr z,AOlast ; AOnz push hl ; pop ix ; ld l,(ix+dObjeZ_L) ; ld h,(ix+dObjeZ_H) ; or a ; sbc hl,de ; jp m,AOnxt ; ld l,(ix+dppObje_L) ; ld h,(ix+dppObje_H) ; ld (iy+dppObje_L),l ; ld (iy+dppObje_H),h ; push iy ; pop bc ; ld (ix+dppObje_L),c ; ld (ix+dppObje_H),b ; push ix ; push hl ; pop ix ; pop hl ; ld (iy+dpnObje_L),l ; ld (iy+dpnObje_H),h ; ld a,ixh ; or ixl ; jr z,AOb ; ld (ix+dpnObje_L),c ; ld (ix+dpnObje_H),b ; ex de,hl ; ld (iy+dObjeZ_L),l ; ld (iy+dObjeZ_H),h ; or a ; ret ; AOb ld hl,0 ; ld (iy+dppObje_L),l ; ld (iy+dppObje_H),h ; ld (pObjeList),iy ; ex de,hl ; ld (iy+dObjeZ_L),l ; ld (iy+dObjeZ_H),h ; or a ; ret ; KillObje ld de,dObjepLines_L ; push ix ; pop iy ; add iy,de ; ld b,8 ; KOlines push iy ; push bc ; ld l,(iy+0) ; ld h,(iy+1) ; call Undrawlp ; pop bc ; pop iy ; inc iy ; inc iy ; djnz KOlines ; ld l,(ix+dppObje_L) ; ld h,(ix+dppObje_H) ; ld a,l ; or h ; jr z,KOz ; push hl ; pop iy ; ld e,(ix+dpnObje_L) ; ld d,(ix+dpnObje_H) ; ld (iy+dpnObje_L),e ; ld (iy+dpnObje_H),d ; push de ; pop iy ; ld (iy+dppObje_L),l ; ld (iy+dppObje_H),h ; KOx ld hl,(pFreeObje) ; ld (ix+dpnFreeObje_L),l ; ld (ix+dpnFreeObje_H),h ; ld (pFreeObje),ix ; ret ; KOz ld e,(ix+dpnObje_L) ; ld d,(ix+dpnObje_H) ; ld (pObjeList),de ; push de ; pop iy ; ld (iy+dppObje_L),l ; ld (iy+dppObje_H),h ; jp KOx ; InitVectAdd ld hl,(DeltaX) ; ld a,h ; ld (vaXh),a ; ld a,l ; ld (vaXl),a ; ld hl,(DeltaY) ; ld a,h ; ld (vaYh),a ; ld a,l ; ld (vaY1),a ; ld hl,(DeltaZ) ; ld a,h ; ld (vaZh),a ; ld a,l ; ld (vaZl),a ; ret ; DoVectAdd ld a,(hl) ; add a,0 ; vaXl equ $-1 ; ld (hl),a ; inc hl ; ld a,(hl) ; adc a,0 ; vaXh equ $-1 ; ld (hl),a ; inc hl ; ld a,(hl) ; add a,0 ; vaY1 equ $-1 ; ld (hl),a ; inc hl ; ld a,(hl) ; adc a,0 ; vaYh equ $-1 ; ld (hl),a ; inc hl ; ld a,(hl) ; add a,0 ; vaZl equ $-1 ; ld (hl),a ; inc hl ; ld a,(hl) ; adc a,0 ; vaZh equ $-1 ; ld (hl),a ; ret ; DoVectors ld hl,(GroundX) ; ld de,(DeltaX) ; add hl,de ; ld (GroundX),hl ; ld hl,(GroundY) ; ld de,(DeltaY) ; add hl,de ; ld (GroundY),hl ; ld hl,(GroundZ) ; ld de,(DeltaZ) ; add hl,de ; ld (GroundZ),hl ; ret ; ResMargin ld hl,-127 ; ld (MinX),hl ; ld (nMinX),hl ; ld (TopY),hl ; ld (nTopY),hl ; ld hl,127 ; ld (MaxX),hl ; ld (BotY),hl ; ld hl,0 ; ld (AMinX),hl ; ld (ATopY),hl ; ld hl,256 ; ld (AMaxX),hl ; ld (ABotY),hl ; ret ; SetRMargin push hl ; push de ; ld de,(MaxX) ; or a ; sbc hl,de ; add hl,de ; jp p,SRMx ; ld de,128 ; ld (MaxX),hl ; add hl,de ; ld (AMaxX),hl ; SRMx pop de ; pop hl ; ret ; SetDMargin push hl ; push de ; ld de,(BotY) ; or a ; sbc hl,de ; add hl,de ; jp p,SDMx ; ld de,128 ; ld (BotY),hl ; add hl,de ; ld (ABotY),hl ; SDMx pop de ; pop hl ; ret ; SetLMargin push hl ; push de ; ld de,(MinX) ; or a ; sbc hl,de ; add hl,de ; jp m,SLMx ; ld de,128 ; ld (MinX),hl ; add hl,de ; ld (AMinX),hl ; or a ; sbc hl,de ; call NegHL ; ld (nMinX),hl ; SLMx pop de ; pop hl ; ret ; SetUMargin push hl ; push de ; ld de,(TopY) ; or a ; sbc hl,de ; add hl,de ; jp m,SUMx ; ld de,128 ; ld (TopY),hl ; add hl,de ; ld (ATopY),hl ; or a ; sbc hl,de ; call NegHL ; ld (nTopY),hl ; SUMx pop de ; pop hl ; ret ; SetUpTabs ld hl,BitTab ; ld a,$80 ; GenXTab ld (hl),a ; inc l ; rrca ; jr nc,GenXTab ; ld a,$FF ; GenXTab1 ld (hl),a ; inc l ; srl a ; or a ; jr nz,GenXTab1 ; ld a,$80 ; GenXTab2 ld (hl),a ; inc l ; sra a ; cp $FF ; jr nz,GenXTab2 ; ld (hl),a ; Ret02 ret ; GenYTab ld hl,YTable ; ld de,ScreenBase ; ld c,24 ; CharLp ld b,8 ; CharLp1 ld (hl),e ; inc h ; ld (hl),d ; dec h ; inc l ; inc d ; djnz CharLp1 ; ld a,d ; sub 8 ; ld d,a ; dec c ; jr z,GYT1 ; ld a,e ; add a,32 ; ld e,a ; jr nc,CharLp ; ld a,d ; add a,8 ; ld d,a ; jr CharLp ; GYT1 ld b,$40 ; GYT2 ld (hl),0 ; inc h ; ld (hl),0 ; dec h ; inc l ; djnz GYT2 ; ret ; CLS ld a,(CType) ; ld hl,YTable+10 ; ld b,156 ; or a ; jr z,CLSa ; ld hl,YTable ; ld b,170 ; cp 3 ; jr c,CLSa ; ld hl,YTable ; ld b,192 ; CLSa xor a ; CLSlp ld e,(hl) ; inc h ; ld d,(hl) ; dec h ; inc l ; push hl ; push bc ; ld h,d ; ld l,e ; inc de ; ld bc,$1F ; ld (hl),a ; ldir ; pop bc ; pop hl ; djnz CLSlp ; ld hl,$5820 ; ld de,$5821 ; ld bc,$27F ; ld (hl),$47 ; ldir ; ret ; Gen192Tab ld bc,DivTab ; ld hl,$0D00 ; ld de,$0099 ; ld a,(CType) ; or a ; jr z,G192 ; ld hl,$0000 ; ld de,$00A7 ; $a8 in v1.1 cp 3 ; jr c,G192 ; ld hl,$0000 ; ld de,191 ; G192 ld a,h ; ld (bc),a ; add hl,de ; inc c ; jr nz,G192 ; ret ; CAf ld hl,0 ; xor a ; scf ; ret ; ClipAddr ld bc,(BotY) ; or a ; sbc hl,bc ; jp p,CAf ; add hl,bc ; ld bc,(TopY) ; or a ; sbc hl,bc ; jp m,CAf ; add hl,bc ; ex de,hl ; ld bc,(MaxX) ; or a ; sbc hl,bc ; jp p,CAf ; add hl,bc ; ld bc,(MinX) ; or a ; sbc hl,bc ; jp m,CAf ; add hl,bc ; ex de,hl ; CalcAddr ld bc,128 ; add hl,bc ; ex de,hl ; add hl,bc ; ex de,hl ; ld h,DivTab/256 ; ld l,(hl) ; ld h,YTable/256 ; ld a,(hl) ; inc h ; ld h,(hl) ; ld l,a ; ld a,e ; rrca ; rrca ; rrca ; and $1F ; or l ; ld l,a ; ld a,e ; and $07 ; ld e,a ; ld d,BitTab/256 ; ld a,(de) ; ret ; VB1 pop hl ; scf ; ret ; VertLine push hl ; or a ; sbc hl,de ; add hl,de ; jp p,HS1 ; push bc ; ld bc,(BotY) ; or a ; sbc hl,bc ; jp p,HS1a ; ld hl,(TopY) ; or a ; sbc hl,de ; jp p,HS1a ; pop hl ; ld bc,(MaxX) ; or a ; sbc hl,bc ; jp p,HS1 ; add hl,bc ; ld bc,(MinX) ; or a ; sbc hl,bc ; jp m,HS1 ; add hl,bc ; ld bc,128 ; add hl,bc ; ld a,l ; rrca ; rrca ; rrca ; and $1F ; ld (V1),a ; ld a,l ; rlca ; rlca ; rlca ; cpl ; and $38 ; or $C6 ; ld (vm0),a ; ld (vm1),a ; ld (vm2),a ; ld (vm3),a ; ld (vm4),a ; ld (vm5),a ; ld (vm6),a ; ld (vm7),a ; ld (vm8),a ; ld (vm9),a ; and $BF ; ld (iy+dLineBit),a ; pop hl ; ld bc,(TopY) ; or a ; sbc hl,bc ; add hl,bc ; jp p,VS2 ; ld h,b ; ld l,c ; VS2 ld bc,128 ; add hl,bc ; ex de,hl ; ld bc,(BotY) ; or a ; sbc hl,bc ; add hl,bc ; jp m,VS3 ; ld h,b ; ld l,c ; VS3 ld bc,128 ; add hl,bc ; ex de,hl ; or a ; sbc hl,de ; add hl,de ; ret p ; ld h,DivTab/256 ; ld d,DivTab/256 ; ld a,(de) ; sub (hl) ; or a ; ret z ; inc a ; ld (iy+dLineB),a ; ld b,a ; ld l,(hl) ; ld h,YTable/256 ; ld a,0 ; V1 equ $-1 ; ld c,a ; add a,(hl) ; ld (iy+dLineL),a ; inc h ; ld a,(hl) ; ld (iy+dLineH),a ; ld a,l ; rlca ; rlca ; and $03 ; or $58 ; ld (iy+dLineH1),a ; ld d,a ; ld a,l ; rlca ; rlca ; and $E0 ; or c ; ld (iy+dLineL1),a ; ld e,a ; ld a,l ; and $07 ; ld l,a ; ld h,BitTab/256 ; ld a,(Colour) ; ld c,a ; ld a,(hl) ; ld (iy+dLineA),a ; ex de,hl ; ld de,$0020 ; exx ; ld c,$1F ; ld b,(iy+dLineB) ; ld l,(iy+dLineL) ; ld h,(iy+dLineH) ; call vl1 ; VS4 ld (iy+dpLineAlg_L),Vert10 & $FF; ld (iy+dpLineAlg_H),Vert10 / 256; scf ; ret ; vl1 dec b ; ret z ; set 0,(hl) ; SMC vm0 equ $-1 ; inc h ; rrca ; jp nc,vl1 ; ld a,l ; adc a,c ; ld l,a ; jr c,vl2 ; ld a,h ; sub 8 ; ld h,a ; vl2 exx ; ld (hl),c ; add hl,de ; exx ; ld a,b ; rrca ; rrca ; rrca ; and $1F ; jr z,vl3 ; vl4 set 0,(hl) ; vm1 equ $-1 ; inc h ; set 0,(hl) ; vm2 equ $-1 ; inc h ; set 0,(hl) ; vm3 equ $-1 ; inc h ; set 0,(hl) ; vm4 equ $-1 ; inc h ; set 0,(hl) ; vm5 equ $-1 ; inc h ; set 0,(hl) ; vm6 equ $-1 ; inc h ; set 0,(hl) ; vm7 equ $-1 ; inc h ; set 0,(hl) ; vm8 equ $-1 ; inc h ; ex af,af' ; ld a,(cSoundVal) ; xor $F8 ; SoundFlagVL equ $-1 ; ld (cSoundVal),a ; out (SoundPort),a ; ld a,l ; add a,$20 ; ld l,a ; jr c,vl6 ; ld a,h ; sub $08 ; ld h,a ; vl6 exx ; ld (hl),c ; add hl,de ; exx ; ex af,af' ; dec a ; jr nz,vl4 ; vl3 ld a,b ; and $07 ; ret z ; ld b,a ; vl5 set 0,(hl) ; vm9 equ $-1 ; inc h ; djnz vl5 ; exx ; ld (hl),c ; exx ; ret ; Vert10 ld l,(iy+dLineL1) ; ld h,(iy+dLineH1) ; ld de,$0020 ; ld a,(GameAttr) ; ld c,a ; exx ; ld a,(iy+dLineBit) ; ld (vm0),a ; ld (vm1),a ; ld (vm2),a ; ld (vm3),a ; ld (vm4),a ; ld (vm5),a ; ld (vm6),a ; ld (vm7),a ; ld (vm8),a ; ld (vm9),a ; ld a,(iy+dLineA) ; ld b,(iy+dLineB) ; ld l,(iy+dLineL) ; ld h,(iy+dLineH) ; ld c,$1F ; jp vl1 ; HS1a pop bc ; HS1 pop hl ; or a ; ret ; HpS defw 0 ; HpA defw 0 ; HoriLineEx xor a ; ld (HLsmc),a ; out (SoundPort),a ; call HoriLine ; ld a,$F8 ; SoundFlagHLX equ $-1 ; out (SoundPort),a ; ld a,$FF ; ld (HLsmc),a ; ret ; HoriLine push hl ; or a ; sbc hl,de ; add hl,de ; jp p,HS1 ; push bc ; ld bc,(MaxX) ; or a ; sbc hl,bc ; jp p,HS1a ; ld hl,(MinX) ; or a ; sbc hl,de ; jp p,HS1a ; pop bc ; ld hl,128 ; add hl,bc ; ld bc,(ABotY) ; or a ; sbc hl,bc ; jp p,HS1 ; add hl,bc ; ld bc,(ATopY) ; or a ; sbc hl,bc ; jp m,HS1 ; add hl,bc ; ld h,DivTab/256 ; ld l,(hl) ; ld h,YTable/256 ; ld c,(hl) ; inc h ; ld b,(hl) ; ld (HpS),bc ; ld (iy+dLineH),b ; ld a,l ; rlca ; rlca ; and $03 ; or $58 ; ld h,a ; ld a,l ; rlca ; rlca ; and $E0 ; ld l,a ; ld (HpA),hl ; ld (iy+dLineD),h ; pop hl ; ld bc,(MinX) ; or a ; sbc hl,bc ; add hl,bc ; jp p,HS2 ; ld h,b ; ld l,c ; HS2 ld bc,128 ; add hl,bc ; ex de,hl ; ld bc,(MaxX) ; or a ; sbc hl,bc ; add hl,bc ; jp m,HS3 ; ld h,b ; ld l,c ; HS3 ld bc,128 ; add hl,bc ; ex de,hl ; or a ; sbc hl,de ; add hl,de ; ret p ; ld a,e ; sub l ; or a ; ret z ; ld a,l ; and $07 ; add a,8 ; ld c,a ; ld b,BitTab/256 ; ld a,(bc) ; ld (iy+dLineA),a ; ld a,e ; and $07 ; add a,16 ; ld c,a ; ld a,(bc) ; ld (iy+dLineA1),a ; ld a,l ; rrca ; rrca ; rrca ; and $1F ; ld l,a ; ld a,e ; rrca ; rrca ; rrca ; and $1F ; ld e,a ; ld a,(HpS) ; or l ; ld (HpS),a ; ld (iy+dLineL),a ; ld a,(HpA) ; or l ; ld (HpA),a ; ld (iy+dLineE),a ; ld a,e ; sub l ; jr z,HS4 ; ld (iy+dLineB),a ; ld hl,(HpS) ; ld de,(HpA) ; ld b,a ; ld a,(Colour) ; ld c,a ; ld a,(iy+dLineA1) ; ex af,af' ; ld a,(iy+dLineA) ; call HoriS ; ld (iy+dpLineAlg_L),HS6 & $FF ; ld (iy+dpLineAlg_H),HS6 / 256 ; set bOnScreen,(ix+dObjeFlags) ; scf ; ret ; HS4 ld hl,(HpA) ; ld a,(Colour) ; ld (hl),a ; ld hl,(HpS) ; ld a,(iy+dLineA) ; and (iy+dLineA1) ; or (hl) ; ld (hl),a ; ld (iy+dpLineAlg_L),HS5 & $FF ; ld (iy+dpLineAlg_H),HS5 / 256 ; set bOnScreen,(ix+dObjeFlags) ; scf ; ret ; HS5 ld l,(iy+dLineE) ; ld h,(iy+dLineD) ; ld a,(GameAttr) ; ld (hl),a ; ld l,(iy+dLineL) ; ld h,(iy+dLineH) ; ld a,(iy+dLineA) ; and (iy+dLineA1) ; cpl ; and (hl) ; ld (hl),a ; ret ; HS6 ld l,(iy+dLineL) ; ld h,(iy+dLineH) ; ld e,(iy+dLineE) ; ld d,(iy+dLineD) ; ld b,(iy+dLineB) ; ld a,(iy+dLineA1) ; cpl ; ex af,af' ; ld a,(GameAttr) ; ld c,a ; ld a,(iy+dLineA) ; cpl ; and (hl) ; ld (hl),a ; ld a,c ; ld (de),a ; inc l ; inc e ; djnz Hori0a ; ld (de),a ; ex af,af' ; and (hl) ; ld (hl),a ; ret ; Hori0a ld c,$00 ; Hori1a ld (hl),c ; ld (de),a ; inc l ; inc e ; djnz Hori1a ; ld (de),a ; ex af,af' ; and (hl) ; ld (hl),a ; ret ; HoriS or (hl) ; ld (hl),a ; ld a,c ; ld (de),a ; inc l ; inc e ; djnz Hori0 ; ld (de),a ; ex af,af' ; or (hl) ; ld (hl),a ; ret ; Hori0 ld c,$FF ; HLsmc equ $-1 ; Hori1 ld (hl),c ; ld (de),a ; inc l ; inc e ; djnz Hori1 ; ld (de),a ; ex af,af' ; or (hl) ; ld (hl),a ; ret ; CalcEdges push bc ; xor a ; ld bc,(AMaxX) ; sbc hl,bc ; add hl,bc ; jp p,CEgx ; ld bc,(AMinX) ; or a ; sbc hl,bc ; jp m,CElx ; add hl,bc ; CEY ex de,hl ; ld bc,(ABotY) ; or a ; sbc hl,bc ; add hl,bc ; jp p,CEgy ; ld bc,(ATopY) ; or a ; sbc hl,bc ; jp m,CEly ; add hl,bc ; ex de,hl ; pop bc ; ret ; CEgx or $02 ; jp CEY ; CElx or $01 ; add hl,bc ; jp CEY ; CEgy or $04 ; ex de,hl ; pop bc ; ret ; CEly or $08 ; add hl,bc ; ex de,hl ; pop bc ; ret ; ClipThing ld bc,128 ; add hl,bc ; ld (ctX2),hl ; ex de,hl ; add hl,bc ; ld (ctX1),hl ; exx ; ld bc,128 ; add hl,bc ; ld (ctY2),hl ; ex de,hl ; add hl,bc ; ld (ctY1),hl ; ld hl,0 ; ctX1 equ $-2 ; ld de,0 ; ctY1 equ $-2 ; call CalcEdges ; ld b,a ; ld hl,0 ; ctX2 equ $-2 ; ld de,0 ; ctY2 equ $-2 ; call CalcEdges ; ld c,a ; or b ; ret z ; ld a,c ; and b ; scf ; ret nz ; ld hl,(ctX1) ; ld (PaX),hl ; ld hl,(ctY1) ; ld (PaY),hl ; ld hl,(ctX2) ; ld (PbX),hl ; ld hl,(ctY2) ; ld (PbY),hl ; call ClipInner ; ret c ; ld hl,(PaX) ; ld (ctX2),hl ; ld hl,(PaY) ; ld (ctY2),hl ; ld hl,(ctX1) ; ld (PbX),hl ; ld hl,(ctY1) ; ld (PbY),hl ; call ClipInner ; ret c ; ld hl,(PaX) ; ld (ctX1),hl ; ld hl,(PaY) ; ld (ctY1),hl ; or a ; ret ; ClipInner ld hl,0 ; PbX equ $-2 ; ld de,0 ; PbY equ $-2 ; ld (PmX),hl ; ld (PmY),de ; call CalcEdges ; or a ; jr nz,C2 ; ld (PaX),hl ; ld (PaY),de ; ret ; C2 ld hl,0 ; PaX equ $-2 ; ld de,0 ; PaY equ $-2 ; call CalcEdges ; ld b,a ; ld hl,0 ; PmX equ $-2 ; ld de,0 ; PmY equ $-2 ; call CalcEdges ; and b ; scf ; ret nz ; ld hl,(PmX) ; ld de,(PaX) ; or a ; sbc hl,de ; sra h ; rr l ; ld de,(PaX) ; add hl,de ; ld (PmX),hl ; ld hl,(PmY) ; ld de,(PaY) ; or a ; sbc hl,de ; sra h ; rr l ; ld de,(PaY) ; add hl,de ; ld (PmY),hl ; call TestPm ; ret z ; ld hl,(PbX) ; ld de,(PbY) ; call CalcEdges ; ld b,a ; ld hl,(PmX) ; ld de,(PmY) ; call CalcEdges ; and b ; jr z,C4a ; ld (PbX),hl ; ld (PbY),de ; jp C2 ; C4a ld (PaX),hl ; ld (PaY),de ; ld hl,(PbX) ; ld de,(PbY) ; ld (PmX),hl ; ld (PmY),de ; jp C2 ; TestPm ld hl,(PmX) ; ld de,(PaX) ; or a ; sbc hl,de ; jr nz,TPm1 ; ld hl,(PmY) ; ld de,(PaY) ; or a ; sbc hl,de ; ret z ; TPm1 ld hl,(PmX) ; ld de,(PbX) ; or a ; sbc hl,de ; ret nz ; ld hl,(PmY) ; ld de,(PbY) ; or a ; sbc hl,de ; ret ; ALOld push ix ; ld a,(iy+dLineSxx) ; ld (OAxx),a ; ld a,(iy+dLineSyy) ; ld (OAyy),a ; ld a,(iy+dLineHV) ; ld (OAHV),a ; ld l,(iy+dLineIX_L) ; ld h,(iy+dLineIX_H) ; push hl ; pop ix ; ld c,(iy+dLineC1) ; ld e,(iy+dLineE1) ; ld l,(iy+dLineL1) ; exx ; ld b,(iy+dLineB) ; ld c,(iy+dLineC) ; ld e,(iy+dLineE) ; ld l,(iy+dLineL) ; ld h,(iy+dLineH) ; ld a,(GameAttr) ; ld d,a ; ld a,(hl) ; OA1 cpl ; or c ; cpl ; exx ; ex af,af' ; ld a,l ; sub e ; jr c,OA3 ; ld l,a ; exx ; ex af,af' ; call Incxx ; OAHV equ $-2 ; djnz OA1 ; ld (hl),a ; OA3x ld a,c ; and e ; jp m,OA3a ; ld (ix+dpnObje_L),d ; OA3a pop ix ; ret ; OA3 add a,c ; ld l,a ; ex af,af' ; exx ; call Incxx ; OAxx equ $-2 ; call Incxx ; OAyy equ $-2 ; ld (hl),a ; djnz OA1 ; jp OA3x ; AnyLine call ClipThing ; ccf ; ret nc ; ld a,(ctX1) ; ld e,a ; srl e ; srl e ; srl e ; and $07 ; ld l,a ; ld h,BitTab/256 ; ld c,(hl) ; ld h,DivTab/256 ; ld a,(ctY1) ; ld l,a ; ld a,(hl) ; ld (ctY1),a ; ld d,a ; rlca ; rlca ; and $03 ; or $58 ; ld (IX_h),a ; ld (iy+dLineIX_H),a ; ld a,d ; rlca ; rlca ; and $E0 ; or e ; ld (IX_l),a ; ld (iy+dLineIX_L),a ; ld a,(ctY2) ; ld l,a ; ld a,(hl) ; ld (ctY2),a ; ld a,d ; and $07 ; ld l,a ; ld h,BitTab/256 ; ld b,(hl) ; exx ; push ix ; push iy ; ld iy,Incyy ; ld ix,Incxx ; ld de,(ctY1) ; ld hl,(ctY2) ; or a ; sbc hl,de ; jp p,LineA ; ld a,l ; cpl ; ld l,a ; ld a,h ; cpl ; ld h,a ; inc hl ; ld iy,Decyy ; LineA ld c,l ; ld b,h ; ld de,(ctX1) ; ld hl,(ctX2) ; or a ; sbc hl,de ; jp p,LineB ; ld a,l ; cpl ; ld l,a ; ld a,h ; cpl ; ld h,a ; inc hl ; ld ix,Decxx ; LineB ld (sxxVector),ix ; ld (syyVector),iy ; or a ; sbc hl,bc ; add hl,bc ; jp m,LineC ; ld (HorizVector),ix ; ld e,c ; ld d,b ; ld c,l ; ld b,h ; jp LineD ; LineC ld (HorizVector),iy ; ld e,l ; ld d,h ; ld l,c ; ld h,b ; LineD sra h ; rr l ; ld a,c ; exx ; pop iy ; pop ix ; scf ; ccf ; ret z ; ex af,af' ; ld h,YTable/256 ; ld l,d ; ld a,(hl) ; add a,e ; inc h ; ld h,(hl) ; ld l,a ; ex af,af' ; ld e,b ; ld b,a ; ld (iy+dpLineAlg_L),ALOld & $FF; ld (iy+dpLineAlg_H),ALOld / 256 ; ld (iy+dLineL),l ; ld (iy+dLineH),h ; ld (iy+dLineE),e ; ld (iy+dLineC),c ; ld (iy+dLineB),b ; exx ; ld (iy+dLineL1),l ; ld (iy+dLineE1),e ; ld (iy+dLineC1),c ; exx ; ld a,(Colour) ; ld d,a ; push ix ; ld ix,$0000 ; IX_l equ $-2 ; IX_h equ $-1 ; ld a,(hl) ; LineAlg or c ; exx ; ex af,af' ; ld a,l ; sub e ; jr c,LineAlg1 ; ld l,a ; exx ; ex af,af' ; call Ret02 ; HorizVector equ $-2 ; djnz LineAlg ; jp LineX ; LineAlg1 add a,c ; ld l,a ; exx ; ex af,af' ; call Ret02 ; sxxVector equ $-2 ; call Ret02 ; syyVector equ $-2 ; djnz LineAlg ; LineX ld (hl),a ; ld a,e ; and c ; jp m,LineXa ; ld (ix+dpnObje_L),d ; LineXa pop ix ; ld a,(sxxVector) ; ld (iy+dLineSxx),a ; ld a,(syyVector) ; ld (iy+dLineSyy),a ; ld a,(HorizVector) ; ld (iy+dLineHV),a ; set bOnScreen,(ix+dObjeFlags) ; scf ; ret ; ; Align to a page boundary align 256 ; Incxx rrc c ; ret nc ; ld (hl),a ; ld (ix+0),d ; inc ixl ; inc l ; ld a,r ; and $F8 ; SoundFlagAL equ $-1 ; out (SoundPort),a ; ld a,(hl) ; ret ; Decxx rlc c ; ret nc ; ld (hl),a ; ld (ix+0),d ; dec ixl ; dec l ; ld a,r ; and $F8 ; SoundFlagAL1 equ $-1 ; out (SoundPort),a ; ld a,(hl) ; ret ; Incyy ld (hl),a ; inc h ; rrc e ; ld a,(hl) ; ret nc ; ld (ix+0),d ; push bc ; ld bc,$20 ; add ix,bc ; pop bc ; ld a,l ; add a,$20 ; ld l,a ; ld a,(hl) ; ret c ; ld a,h ; sub $08 ; ld h,a ; ld a,(hl) ; ret ; Decyy ld (hl),a ; dec h ; rlc e ; ld a,(hl) ; ret nc ; ld (ix+0),d ; push bc ; ld bc,-$20 ; add ix,bc ; pop bc ; ld a,l ; sub $20 ; ld l,a ; ld a,(hl) ; ret c ; ld a,h ; add a,$08 ; ld h,a ; ld a,(hl) ; ret ; MinX defs 2 ; nMinX defs 2 ; MaxX defs 2 ; TopY defs 2 ; nTopY defs 2 ; BotY defs 2 ; AMinX defs 2 ; AMaxX defs 2 ; ATopY defs 2 ; ABotY defs 2 ; pFreeObje defs 2 ; cObjeZ defs 2 ; ObjeSeq defs nObjes*4*2 ; pFreeLines defs 2 ; ; End of SUBS DoRhino ld a,(DDamage) ; ld (RhinoDamage),a ; ld a,DamFSD ; ld (DDamage),a ; ld hl,(DScore) ; ld (RhinoScore),hl ; ld hl,0 ; ld (DScore),hl ; ld hl,Ret0 ; ld (cFlashRoutine),hl ; ld hl,sRhino ; call vAddScroll ; halt ; halt ; PlayRhino xor a ; ld (nRhinos),a ; RhinoPlay call CLS ; call RhinoInc ; call RhinoInit ; call RhinoDisp ; RhinoLoop call RhinoManMove ; call MoveRhino ; ld b,200 ; djnz $ ; ld a,(RhinoEnd) ; cp 1 ; jr z,RhinoFini ; ld a,(ADamage) ; or a ; jr nz,RhinoLoop ; ld hl,sRhino1 ; call vAddScroll ; ld b,170 ; Rlx halt ; djnz Rlx ; ld hl,(RhinoScore) ; ld (DScore),hl ; ld a,(RhinoDamage) ; ld (DDamage),a ; ret ; RhinoFini ld a,$10 ; call AddScore ; ld b,20 ; call AlwaysDoDamage ; jp RhinoPlay ; RhinoClear push hl ; call RhinoMUp ; ld (hl),1 ; call RhinoMRight ; ld (hl),1 ; call RhinoMDown ; ld (hl),1 ; call RhinoMDown ; ld (hl),1 ; call RhinoMLeft ; ld (hl),1 ; call RhinoMLeft ; ld (hl),1 ; call RhinoMUp ; ld (hl),1 ; call RhinoMUp ; ld (hl),1 ; pop hl ; ret ; RhinoInc ld a,(nRhinos) ; inc a ; cp 16 ; ret z ; ld (nRhinos),a ; ret ; RhinoGetPos push de ; call Rand ; ld a,e ; pop de ; ld l,a ; ld h,RhinoMap / 256 ; ld a,(hl) ; or a ; jr nz,RhinoGetPos ; ret ; RhinoInit ld hl,RhinoMap ; ld b,0 ; xor a ; ld (RhinoEnd),a ; RIlp ld (hl),a ; inc hl ; djnz RIlp ; ld hl,RhinoMap+$11 ; call RhinoClear ; ld (RhinoManPos),hl ; ld a,cRhinoMan ; ld (hl),a ; call RhinoPrint ; ld hl,RhinoMap+$EE ; call RhinoClear ; ld a,cRhinoExit ; ld (hl),a ; call RhinoPrint ; ld b,20 ; RIlp1 call RhinoGetPos ; ld (hl),cRhinoTree ; djnz RIlp1 ; ld a,(nRhinos) ; ld b,a ; ld ix,RhinoList ; RIlp2 push bc ; call RhinoGetPos ; ld (hl),cRhinoTree ; ld (ix+dRhinoPos_L),l ; ld (ix+dRhinoPos_H),h ; ld a,r ; and $7F ; add a,65 ; ld (ix+dRhinoiSpeed),a ; ld (ix+dRhinoSpeed),1 ; ld (ix+dRhinoFlag),0 ; ld bc,lRhino ; add ix,bc ; pop bc ; djnz RIlp2 ; ld b,4 ; RIlp5 call RhinoGetPos ; ld (hl),cRhinoFuel ; djnz RIlp5 ; ld hl,RhinoMap ; RIlp3 ld a,(hl) ; dec a ; jr nz,RIlp3a ; ld (hl),a ; RIlp3a inc l ; jr nz,RIlp3 ; ret ; MoveRhino ld a,(nRhinos) ; ld b,a ; ld ix,RhinoList ; MRlp push bc ; dec (ix+dRhinoSpeed) ; jr nz,MR3 ; ld a,(ix+dRhinoiSpeed) ; ld (ix+dRhinoSpeed),a ; MR1 ld a,(ix+dRhinoFlag) ; or a ; jr nz,MR2 ; ld l,(ix+dRhinoPos_L) ; ld h,(ix+dRhinoPos_H) ; call RhinoVector ; call RhinoLook ; jr nc,MR3 ; MR2 ld (ix+dRhinoFlag),1 ; ld l,(ix+dRhinoPos_L) ; ld h,(ix+dRhinoPos_H) ; call RhinoVector ; call VectorAdd ; ld a,(hl) ; or a ; jr nz,MR3a ; MR3c ex de,hl ; ld l,(ix+dRhinoPos_L) ; ld h,(ix+dRhinoPos_H) ; ld a,(hl) ; cp cRhinoChar ; jr nz,MR2b ; xor a ; ld (hl),a ; call RhinoPrint ; MR2b ex de,hl ; ld a,cRhinoChar ; ld (hl),a ; call RhinoPrint ; ld (ix+dRhinoPos_L),l ; ld (ix+dRhinoPos_H),h ; MR3 ld bc,lRhino ; add ix,bc ; pop bc ; djnz MRlp ; ret ; MR3a cp cRhinoFuel ; jr nz,MR3b ; sra (ix+dRhinoiSpeed) ; jr MR3c ; MR3b cp cRhinoMan ; jr nz,MR3 ; call RhinoHit ; jr MR3 ; RhinoVector ld a,l ; and $0F ; ld e,a ; ld a,(RhinoManPos) ; and $0F ; sub e ; ld d,0 ; jr z,RVa ; ld d,$01 ; jp p,RVa ; ld d,$02 ; RVa ld a,l ; rrca ; rrca ; rrca ; rrca ; and $0F ; ld e,a ; ld a,(RhinoManPos) ; rrca ; rrca ; rrca ; rrca ; and $0F ; sub e ; ret z ; set 2,d ; ret p ; ld a,d ; xor $0C ; ld d,a ; ret ; VectorAdd bit 0,d ; call nz,RhinoMRight ; bit 1,d ; call nz,RhinoMLeft ; bit 2,d ; call nz,RhinoMDown ; bit 3,d ; call nz,RhinoMUp ; ret ; RhinoLook ld b,h ; ld c,l ; call VectorAdd ; or a ; sbc hl,bc ; add hl,bc ; scf ; ccf ; ret z ; ld a,(hl) ; or a ; jr z,RhinoLook ; cp cRhinoMan ; scf ; ret z ; cp cRhinoTree ; jr nz,RhinoLook ; or a ; ret ; RhinoDisp ld hl,RhinoMap ; ld b,0 ; RDlp ld a,(hl) ; call RhinoPrint ; inc hl ; djnz RDlp ; ret ; RhinoPrint push de ; push bc ; push af ; ld a,l ; and $0F ; ld e,a ; ld a,l ; rrca ; rrca ; rrca ; rrca ; and $0F ; ld d,a ; pop af ; or a ; jr z,RPa ; call PrintMap ; pop bc ; pop de ; ret ; RPa ld a,cRhinoBlank ; call PrintMap ; pop bc ; pop de ; ret ; RhinoManMove ld hl,RhinoManSpeed ; dec (hl) ; ret nz ; ld (hl),30 ; ld hl,(RhinoManPos) ; call kLeft ; call nz,RhinoMLeft ; call kRight ; call nz,RhinoMRight ; call kUp ; call nz,RhinoMUp ; call kDown ; call nz,RhinoMDown ; ld a,(hl) ; or a ; jr z,RMMa ; cp cRhinoExit ; jr nz,RMMb ; ld a,1 ; ld (RhinoEnd),a ; RMMa ex de,hl ; ld hl,(RhinoManPos) ; xor a ; ld (hl),a ; call RhinoPrint ; ex de,hl ; ld a,cRhinoMan ; ld (hl),a ; call RhinoPrint ; ld (RhinoManPos),hl ; ret ; RMMb cp cRhinoFuel ; jr nz,RMMc ; push hl ; ld b,20 ; call AlwaysDoDamage ; ld a,1 ; call AddScore ; pop hl ; jr RMMa ; RMMc cp cRhinoChar ; ret nz ; RhinoHit ld b,-1 ; jp AlwaysDoDamage ; RhinoEnd defs 1 ; RhinoManPos defs 2 ; RhinoManSpeed defs 1 ; nRhinos defs 1 ; RhinoDamage defs 1 ; RhinoScore defs 2 ; RhinoMLeft dec hl ; ld a,l ; cpl ; and $0F ; ret nz ; inc hl ; ret ; RhinoMRight inc hl ; ld a,l ; and $0F ; ret nz ; dec hl ; ret ; RhinoMUp ld e,-16 ; ld a,l ; add a,e ; ld l,a ; cpl ; and $F0 ; ret nz ; ld a,l ; sub e ; ld l,a ; ret ; RhinoMDown ld e,16 ; ld a,l ; add a,e ; ld l,a ; and $F0 ; ret nz ; ld a,l ; sub e ; ld l,a ; ret ; InitStats ld hl,$FFFF ; ld (CurrentStat),hl ; ld hl,Ret0 ; ld (cFlashRoutine),hl ; ret ; DispStatsInner ld bc,$F7FE ; in a,(c) ; bit 3,a ; jr nz,DS1 ; StatsExit ld hl,$FFFF ; ld (CurrentStat),hl ; ld hl,Ret0 ; ld (cFlashRoutine),hl ; jp CLS ; DS1 or $F8 ; inc a ; jr nz,DispStats ; ld hl,0 ; cFlashValue equ $-2 ; dec hl ; ld (cFlashValue),hl ; ld a,h ; or l ; call z,0 ; cFlashRoutine equ $-2 ; ld b,0 ; djnz $ ; jp DispStatsInner ; DispStats dec a ; cpl ; and $07 ; add a,a ; add a,pStats & $FF ; ld l,a ; ld a,pStats / 256 ; adc a,0 ; ld h,a ; ld a,(hl) ; inc hl ; ld h,(hl) ; ld l,a ; ; Has the display routine changed? ld de,(CurrentStat) ; or a ; sbc hl,de ; add hl,de ; ld (CurrentStat),hl ; call nz,CallHL ; If so, call it... jr DispStatsInner ; CurrentStat defw $FFFF ; pStats defw DoMap ; Null defw DoMap ; defw DoOpt ; defw DoMap ; defw DoCode ; defw DoOpt ; defw DoCode ; defw DoRhino ; SteppMapR push bc ; push af ; ld a,l ; inc a ; and $1F ; ld c,a ; ld a,l ; and $E0 ; or c ; ld l,a ; pop af ; pop bc ; ret ; SteppMapL push bc ; push af ; ld a,l ; dec a ; and $1F ; ld c,a ; ld a,l ; and $E0 ; or c ; ld l,a ; pop af ; pop bc ; ret ; SteppMapU push bc ; push af ; ld a,l ; sub $20 ; ld l,a ; jr nc,SpMU ; ld a,h ; cp Map / 256 ; ld h,Map / 256 ; jr nz,SpMU ; ld h,0+(Map+$100) / 256 ; SpMU pop af ; pop bc ; ret ; SteppMapD push bc ; push af ; ld a,l ; add a,$20 ; ld l,a ; jr nc,SpMD ; ld a,h ; cp Map / 256 ; ld h,Map / 256 ; jr nz,SpMD ; ld h,0+(Map+$100) / 256 ; SpMD pop af ; pop bc ; ret ; PrintMap push hl ; push de ; push af ; ld a,d ; add a,MapoY ; add a,a ; add a,YTab & $FF ; ld l,a ; ld a,YTab / 256 ; adc a,0 ; ld h,a ; ld a,(hl) ; inc hl ; ld h,(hl) ; ld l,a ; ld a,e ; add a,MapoX ; or l ; ld l,a ; pop af ; push af ; ld e,a ; add a,a ; add a,a ; add a,a ; add a,e ; *9 add a,MapChars & $FF ; ld e,a ; ld a,MapChars / 256 ; adc a,0 ; ld d,a ; push hl ; ld a,h ; rrca ; rrca ; rrca ; and $03 ; or $58 ; ld h,a ; ld a,(de) ; inc de ; ld (hl),a ; pop hl ; ld b,8 ; MPlp ld a,(de) ; ld (hl),a ; inc h ; inc de ; djnz MPlp ; pop af ; pop de ; pop hl ; ret ; Print8x8 push hl ; push de ; push bc ; push af ; push hl ; ld l,a ; ld h,0 ; ld d,h ; ld e,l ; add hl,hl ; add hl,hl ; add hl,hl ; add hl,de ; ld de,MapChars ; add hl,de ; ex de,hl ; pop hl ; push hl ; ld a,h ; rrca ; rrca ; rrca ; and $03 ; or $58 ; ld h,a ; ld a,(de) ; inc de ; ld (hl),a ; pop hl ; ld b,8 ; P8lp ld a,(de) ; ld (hl),a ; inc h ; inc de ; djnz P8lp ; pop af ; pop bc ; pop de ; pop hl ; ret ; ShowMap ld hl,(pMap) ; ld b,7 ; OffsetL call SteppMapL ; call SteppMapU ; djnz OffsetL ; ld d,0 ; SMlp1 ld e,0 ; push hl ; SMlp2 call GetMap ; call MapConvert ; call PrintMap ; call SteppMapR ; ld a,15 ; inc e ; cp e ; jr nz,SMlp2 ; pop hl ; call SteppMapD ; inc d ; cp d ; jr nz,SMlp1 ; ld hl,(pMap) ; ld a,(hl) ; call MapConvert ; ld h,a ; ld a,(Angle) ; ld l,a ; ld (FlashChars),hl ; ld hl,MapFlash ; StartFlash ld (cFlashRoutine),hl ; ld hl,1 ; ld (cFlashValue),hl ; ret ; MapFlash ld hl,$F1F2 ; FlashChars equ $-2 ; ld a,h ; ld h,l ; ld l,a ; ld (FlashChars),hl ; ld de,$0707 ; call PrintMap ; ld hl,MapFlashRate ; ld (cFlashValue),hl ; ; If Fire and '5' we allow moving on the map ; This commented code allows movement around the map during map display ; useful for testing. ; call kFire ; Fire? ; jr z,MF_X ; No... ; ld bc,$F7FE ; '5'? ; in a,(c) ; ; bit 4,a ; ; jr nz,MF_X ; ; call kUp ; Up? ; jr nz,FC_Up ; Yes, skip ; call kDown ; Down ; jr nz,FC_Down ; Yes, skip ; call kLeft ; Left? ; jr nz,FC_Left ; Yes, skip ; call kRight ; Right? ; jr nz,FC_Right ; Yes, skip ;MF_X ret ; Done ; Move UP ;FC_Up ld hl,(pMap) ; ; call SteppMapU ; ; ld (pMap),hl ; ; call DoMap ; ; call InitMapLocal ; ; ret ; ; Move DOWN ;FC_Down ld hl,(pMap) ; ; call SteppMapD ; ; ld (pMap),hl ; ; call DoMap ; ; call InitMapLocal ; ; ret ; ; Move LEFT ;FC_Left ld hl,(pMap) ; ; call SteppMapL ; ; ld (pMap),hl ; ; call DoMap ; ; call InitMapLocal ; ; ret ; ; Move RIGHT ;FC_Right ld hl,(pMap) ; ; call SteppMapR ; ; ld (pMap),hl ; ; call DoMap ; ; call InitMapLocal ; ret ; GetMap ld a,(hl) ; ret ; MapConvert cp $FA ; jr nc,MC1 ; rrca ; rrca ; rrca ; and $1F ; add a,8 ; ret ; MC1 push bc ; sub $FA ; add a,$0E ; pop bc ; ret ; YTab defw $4000,$4020,$4040,$4060 ; defw $4080,$40A0,$40C0,$40E0 ; defw $4800,$4820,$4840,$4860 ; defw $4880,$48A0,$48C0,$48E0 ; defw $5000,$5020,$5040,$5060 ; defw $5080,$50A0,$50C0,$50E0 ; DoMap call CLS ; ld hl,sMap ; call vPrintStr ; ld hl,MapKeyTable ; DMlp ld a,(hl) ; or a ; jr z,DMa ; inc hl ; ld e,(hl) ; inc hl ; ld d,(hl) ; inc hl ; call MapConvert ; call PrintMap ; jr DMlp ; DMa jp ShowMap ; MapKeyTable defb $FE ; defw $04F0 ; defb $FB ; defw $06F0 ; defb $18 ; defw $08F0 ; defb $08 ; defw $08F1 ; defb $10 ; defw $08F2 ; defb $FC ; defw $0AF0 ; defb $FF ; defw $0CF0 ; defb $28 ; defw $0EF0 ; defb $FD ; defw $10F0 ; defb 0 ; DoOpt call CLS ; ld hl,sIFF ; call vPrintStr ; ld hl,OptFlash ; jp StartFlash ; OptFlash ld bc,$0020 ; call vScanOptiKeys ; jr nc,OFx ; ld a,GameQuit ; ld (EndState),a ; pop hl ; ret ; OFx ld hl,1 ; ld (cFlashValue),hl ; ret ; DoCode call CLS ; ld hl,sCode ; call vPrintStr ; ld d,1 ; call DisplayCodes ; ld hl,CodeFlash ; jp StartFlash ; CodeFlash ld hl,CodeFlashRate ; ld (cFlashValue),hl ; ld d,0 ; jp DisplayCodes ; DisplayCodes ld a,2 ; ld (ppCurY),a ; ld hl,Codes ; ld c,nCodes ; DClp ld a,cCret ; call vPrint ; ld a,CodesX ; ld (pCurX),a ; ld e,(hl) ; inc hl ; bit 0,d ; jr z,DCa ; bit 0,e ; call nz,PrintFound ; call z,PrintNotFound ; DCa ld a,e ; cpl ; or d ; bit 0,a ; jr nz,DCb ; inc hl ; inc hl ; inc hl ; inc hl ; jr DCc ; DCb ld a,5 ; call vPrint ; ld b,4 ; ld a,CodesXc ; ld (pCurX),a ; DClpA ld a,(pCurX) ; ld ixl,a ; ld a,(hl) ; bit 0,d ; call z,vPrint ; ld a,ixl ; ld (pCurX),a ; ld a,(hl) ; bit 0,e ; call z,RandomChar ; ld (hl),a ; inc hl ; call vPrint ; ld a,ixl ; add a,6 ; ld (pCurX),a ; djnz DClpA ; DCc dec c ; jr nz,DClp ; ret ; PrintFound push af ; push hl ; ld hl,sFound ; call vPrintStr ; pop hl ; pop af ; ret ; PrintNotFound push hl ; ld hl,sNotFound ; call vPrintStr ; pop hl ; ret ; RandomChar ld a,r ; and $0F ; add a,"0" ; cp "9"+1 ; ret c ; add a,"A"-("9"+1) ; ret ; InitCodes ld hl,Codes ; ld de,5 ; ld b,nCodes ; xor a ; IClp ld (hl),a ; add hl,de ; djnz IClp ; ld (nCodesFound),a ; ret ; AddCodes ld a,(nCodesFound) ; cp nCodes ; jr z,AddC1 ; inc a ; AddC1 ld (nCodesFound),a ; ld hl,(pMap) ; ld a,(hl) ; cp $FB ; jr nz,AddC2 ; dec (hl) ; AddC2 ld hl,InitialCodes ; ld de,Codes ; ld bc,4 ; AClp ld a,(de) ; or a ; jr z,ACadd ; inc de ; add hl,bc ; ex de,hl ; add hl,bc ; ex de,hl ; jr AClp ; ACadd inc a ; ld (de),a ; inc de ; push hl ; push bc ; ldir ; pop bc ; pop hl ; ld de,AddCodeStr ; ldir ; push ix ; ld hl,sScrollCodes ; call vAddScroll ; pop ix ; ret ; sScrollCodes defb $06,"Code sequence",$05 AddCodeStr defb "%%%%",$06,"recieved",$00,$FF sFound defb $06,"Recieved -",$00 sNotFound defb $03," ",$00 sRhino defb $05,"Welcome to",$07,"Whino Hunt",$00,$FF sRhino1 defb $04,"Wavaged by a wampant whino !",$00,$FF sMap defb $0E,$0D,$0D,$0D,$05,"Terrain within scope",$0D,$0D,$03 defb "Key to display",$0D,$0D,$06," = Unknown",$0D,$0D,$03 defb " = Code Stores",$0D,$0D,$06," = Plasma Guides",$0D,$0D,$03 defb " = Dislocations",$0D,$0D,$04," = Heavy Defences",$0D,$0D,$05 defb " = Energy Stores",$0D,$0D,$07," = Exit Linear Accele" defb "rator",$00 sCode defb $0E,$0D,$0D,$0D,$05,"Escape Code Sequence",$0D,$00 sIFF defb $0E,$0D,$0D,$0D,$05,"Various Options",$0D,$0D,$0D,$06 defb "Press ",$07,"ENTER ",$06,"to quit game .",$0D,$0D,$05 defb "Press ",$07,"4 ",$05,"to continue .",$00 MapChars defb $05 ; defb $10,$38,$54,$10,$10,$10,$10,$10; defb $05 ; defb $07,$03,$05,$08,$10,$20,$40,$80; defb $05 ; defb $00,$04,$02,$FF,$02,$04,$00,$00; defb $05 ; defb $80,$40,$20,$10,$08,$05,$03,$07; defb $05 ; defb $10,$10,$10,$10,$10,$54,$38,$10; defb $05 ; defb $01,$02,$04,$08,$10,$A0,$C0,$E0; defb $05 ; defb $00,$20,$40,$FF,$40,$20,$00,$00; defb $05 ; defb $E0,$C0,$A0,$10,$08,$04,$02,$01; defb $06 ; defb $00,$00,$00,$00,$00,$00,$00,$00; defb $06 ; defb $00,$00,$3C,$00,$00,$3C,$00,$00; defb $06 ; defb $00,$02,$42,$E2,$47,$42,$40,$00; defb $06 ; defb $00,$40,$42,$47,$E2,$42,$02,$00; defb $43 ; defb $00,$28,$10,$28,$10,$10,$10,$10; defb $45 ; defb $00,$3C,$20,$38,$20,$20,$20,$00; defb $07 ; defb $28,$00,$AA,$00,$AA,$00,$28,$00; defb $07 ; defb $00,$28,$AA,$AA,$AA,$AA,$28,$00; defb $04 ; defb $00,$6E,$89,$69,$19,$19,$6E,$00; defb $47 ; defb $10,$54,$38,$EE,$38,$54,$10,$00; defb $43 ; defb $00,$00,$00,$00,$00,$00,$00,$00; defb $44 ; defb $28,$54,$AA,$55,$AA,$55,$2A,$14; defb $44 ; defb $00,$00,$00,$00,$00,$00,$00,$00; defb $45 ; defb $00,$00,$18,$3C,$3C,$18,$00,$00; defb $05 ; defb $00,$18,$24,$42,$42,$24,$18,$00; defb $43 ; defb $00,$00,$02,$7C,$A4,$24,$24,$00; ; These are the codes that are displayed. ; ; I've forgotten how these are used to find the secret code :( ; InitialCodes defb "9472" ; defb "E602" ; defb "F627" ; defb "0227" ; defb "6756" ; defb "9647" ; defb "5602" ; defb "5726" ; defb "0237" ; defb "0226" ; defb "9647" ; defb "2696" ; defb "5656" ; defb "5666" ; defb "7237" ; defb "3786" ; Codes defs 5 * 16 ; ; End of STATS InitStars ld hl,StarTable ; ld (pFreeStars),hl ; ld b,nStars ; ld de,lStar ; ISlp push hl ; pop ix ; add hl,de ; ld (ix+dpnStarFree_L),l ; ld (ix+dpnStarFree_H),h ; djnz ISlp ; ld hl,0 ; ld (ix+dpnStarFree_L),l ; ld (ix+dpnStarFree_H),h ; ld (pStarList),hl ; ld (pLastStar),hl ; xor a ; ld (crStars),a ; ld a,nStars ; ld (cnStars),a ; ret ; AddStar ld hl,(pFreeStars) ; ld a,l ; or h ; scf ; ret z ; ld ix,(pLastStar) ; ld a,ixl ; or ixh ; jr nz,ASa ; ld (pStarList),hl ; ASa ld (ix+dpnStar_L),l ; ld (ix+dpnStar_H),h ; ld (pLastStar),hl ; push hl ; pop ix ; ld l,(ix+dpnStarFree_L) ; ld h,(ix+dpnStarFree_H) ; ld (pFreeStars),hl ; xor a ; ld (ix+dpnStar_L),a ; ld (ix+dpnStar_H),a ; ld a,(crStars) ; inc a ; ld (crStars),a ; or a ; ret ; CreateStars ld b,nStars ; ld hl,$500 ; SUSlp push bc ; push hl ; call AddStar ; pop hl ; ld (ix+dStarZ_L),l ; ld (ix+dStarZ_H),h ; ld de,$7000/nStars ; add hl,de ; call Rand ; ld (ix+dStarX_L),e ; ld (ix+dStarX_H),d ; ld de,StartY ; ld (ix+dStarY_L),e ; ld (ix+dStarY_H),d ; ld (ix+dStarBit),0 ; ld (ix+dStarFlag),1 ; pop bc ; djnz SUSlp ; ret ; ShowStars call InitVectAdd ; call ResMargin ; ld hl,WindowTable ; ld (pcWindowLocal),hl ; ld hl,(WindowTable) ; ld (cWindZ),hl ; ld hl,0 ; ld (pPrevStar),hl ; ld hl,(pStarList) ; SSlp ld a,l ; or h ; jp z,ReplaceStars ; push hl ; pop ix ; ld de,dStarX_L ; add hl,de ; call DoVectAdd ; SS0 ld l,(ix+dStarZ_L) ; ld h,(ix+dStarZ_H) ; ld de,(cWindZ) ; or a ; sbc hl,de ; jp m,SS1 ; push ix ; ld ix,(pcWindowLocal) ; ld l,(ix+dpnStarFree_H) ; ld h,(ix+dStarX_L) ; call SetLMargin ; ld l,(ix+dStarX_H) ; ld h,(ix+dStarY_L) ; call SetRMargin ; ld l,(ix+dStarY_H) ; ld h,(ix+dStarZ_L) ; call SetUMargin ; ld l,(ix+dStarZ_H) ; ld h,(ix+dStarAddr_L) ; call SetDMargin ; ld de,lWind ; add ix,de ; ld (pcWindowLocal),ix ; ld l,(ix+dpnStar_L) ; ld h,(ix+dpnStar_H) ; ld (cWindZ),hl ; pop ix ; jp SS0 ; SS1 bit 7,(ix+dStarZ_H) ; jp nz,SSn ; ld l,(ix+dStarX_L) ; ld h,(ix+dStarX_H) ; ld e,(ix+dStarZ_L) ; ld d,(ix+dStarZ_H) ; bit 7,h ; jr nz,SSW1 ; or a ; sbc hl,de ; jp nc,SSn ; add hl,de ; call DivHLDE ; srl h ; rr l ; jp SS2 ; SSW1 ld a,l ; cpl ; ld l,a ; ld a,h ; cpl ; ld h,a ; inc hl ; or a ; sbc hl,de ; jp nc,SSn ; add hl,de ; call DivHLDE ; srl h ; rr l ; ld a,l ; cpl ; ld l,a ; ld h,$FF ; inc hl ; SS2 push hl ; ld l,(ix+dStarY_L) ; ld h,(ix+dStarY_H) ; ld e,(ix+dStarZ_L) ; ld d,(ix+dStarZ_H) ; bit 7,h ; jr nz,SSW1a ; or a ; sbc hl,de ; jp nc,SSna ; add hl,de ; call DivHLDE ; srl h ; rr l ; jp SS2a ; SSW1a ld a,l ; cpl ; ld l,a ; ld a,h ; cpl ; ld h,a ; inc hl ; or a ; sbc hl,de ; jp nc,SSna ; add hl,de ; call DivHLDE ; srl h ; rr l ; ld a,l ; cpl ; ld l,a ; ld h,$FF ; inc hl ; SS2a pop de ; call ClipAddr ; ld e,(ix+dStarAddr_L) ; ld d,(ix+dStarAddr_H) ; ld b,(ix+dStarBit) ; ld (ix+dStarAddr_L),l ; ld (ix+dStarAddr_H),h ; ld (ix+dStarBit),a ; ld c,a ; ex de,hl ; ld a,b ; cpl ; and (hl) ; ld (hl),a ; ex de,hl ; ld a,c ; and (hl) ; jr nz,SS3 ; ld a,c ; or (hl) ; ld (hl),a ; SS3 ld (pPrevStar),ix ; ld l,(ix+dpnStar_L) ; ld h,(ix+dpnStar_H) ; jp SSlp ; SSna pop hl ; SSn ld iy,(pPrevStar) ; ld l,(ix+dStarAddr_L) ; ld a,(ix+dStarBit) ; ld h,(ix+dStarAddr_H) ; cpl ; and (hl) ; ld (hl),a ; ld a,(crStars) ; dec a ; ld (crStars),a ; push ix ; pop hl ; ld de,(pLastStar) ; or a ; sbc hl,de ; jr nz,SSnc ; ld (pLastStar),iy ; SSnc ld l,(ix+dpnStar_L) ; ld h,(ix+dpnStar_H) ; ld (iy+dpnStar_L),l ; ld (iy+dpnStar_H),h ; ld a,iyl ; or iyh ; jr nz,SSnb ; ld (pStarList),hl ; SSnb ld hl,(pFreeStars) ; ld (ix+dpnStarFree_L),l ; ld (ix+dpnStarFree_H),h ; ld (pFreeStars),ix ; ld l,(ix+dpnStar_L) ; ld h,(ix+dpnStar_H) ; jp SSlp ; ReplaceStars ld a,(cnStars) ; ld b,a ; ld a,(crStars) ; sub b ; ret nc ; call AddStar ; ret c ; ld hl,$7F00 ; ld (ix+dStarZ_L),l ; ld (ix+dStarZ_H),h ; call Rand ; ld (ix+dStarX_L),e ; ld (ix+dStarX_H),d ; ld hl,(GroundY) ; ld (ix+dStarY_L),l ; ld (ix+dStarY_H),h ; ld (ix+dStarBit),0 ; ld (ix+dStarFlag),1 ; ret ; pFreeStars defs 2 ; pStarList defs 2 ; pLastStar defs 2 ; pPrevStar defs 2 ; crStars defs 1 ; pcWindowLocal defs 2 ; cWindZ defs 2 ; ; Spurious pop ix ; For some reason there's a spurious pop ix here in the original source ; an editing mistake? A joke? Misdirection? Who knows... pop ix ; ; Start of DRAW vSmallX equ 100 ; vSmallY equ 160 ; vMediumX equ 240 ; vMediumY equ 320 ; vLargeX equ 400 ; vLargeY equ 500 ; ObjectDescs defw aFixed ,vSmallX ,vSmallY ,Hole defw aFixed ,vMediumX ,vMediumY ,Hole defw aFixed ,vLargeX ,vLargeY ,Hole defw aVari ,CycleXY ,vLargeX ,Hole defw aVari ,CycleY ,vLargeX ,Hole defw aVari ,CycleX ,vLargeX ,Hole defw aVari1 ,CycleXmY ,vLargeX ,Hole defw aVari ,OneXY ,0 ,Hole defw aVari ,OneXY ,vMediumX ,Hole defw aIris ,CycleXY ,vLargeX ,Hole defw aIrisA ,CycleXY ,vLargeX ,Hole defw aIrisB ,CycleXY ,vLargeX ,Hole defw aIrisC ,CycleXY ,vLargeX ,Hole defw aIrisC ,CycleXY ,vLargeX ,Hole defw aIrisC ,CycleXY ,vLargeX ,Hole defw aIrisC ,CycleXY ,vLargeX ,Hole ; #10 defw aMiss ,ChaserA ,20 ,Miss defw aMiss ,ChaserB ,vSmallX ,Miss defw aExpl ,ExplTab1 ,0 ,Miss defw aExpl ,ExplTab2 ,0 ,Miss defw Ret0 ,0 ,0 ,Slugs defw aSAM ,20 ,-200 ,SAM defw aSAM ,15 ,-300 ,SAM defw aSAM ,10 ,-400 ,SAM defw aSAMa ,20 ,-200 ,SAM defw aSAMa ,15 ,-300 ,SAM defw aSAMa ,10 ,-400 ,SAM defw aSAM ,40 ,-100 ,SAM defw aMine ,30 ,-200 ,TOW defw aBunker ,20 ,-30 ,TOW defw aCodeXmit ,20 ,-100 ,TOW defw aSAMSqu ,20 ,-200 ,SAM ; #20 defw aSquTow ,10 ,-200 ,TOW defw aSquTow ,20 ,-200 ,TOW defw aSquTow ,30 ,-200 ,TOW defw aSquMiss ,ChaserB ,20 ,Miss defw aRising ,10 ,-200 ,SAM defw aFuel ,CycleXY ,vLargeX ,Hole defw aWarp ,CycleXmY ,vLargeX ,Hole defw aCodeXm1 ,20 ,-100 ,TOW aFuel ld bc,FuelHit ; ld (iy+dObjeColl_L),c ; ld (iy+dObjeColl_H),b ; jp aVari ; aWarp ld bc,WarpHit ; ld (iy+dObjeColl_L),c ; ld (iy+dObjeColl_H),b ; ld bc,Ret0 ; ld (iy+dObjeShot_L),c ; ld (iy+dObjeShot_H),b ; ld bc,Ret0 ; ld (iy+dObjeMiss_L),c ; ld (iy+dObjeMiss_H),b ; ld (iy+dObjeWindF),0 ; ld (iy+dObjeCol),$46 ; ld bc,DispSquareB ; ld (iy+dObjeDraw_L),c ; ld (iy+dObjeDraw_H),b ; jp aVari1 ; aSquTow ld (iy+dObjeBdYS_L),e ; ld (iy+dObjeBdYS_H),d ; ld (iy+dObjeCntA),l ; ret ; aBunker ld bc,$0300 ; ld (iy+dObjeAXS_L),c ; ld (iy+dObjeAXS_H),b ; ld bc,$C0 ; ld (iy+dObjeAYS_L),c ; ld (iy+dObjeAYS_H),b ; jp aSquTow ; aCodeXmit ld bc,(pMap) ; ld a,(bc) ; cp $FB ; jr nz,aCodeXm1 ; ld bc,CodeSend ; ld (iy+dObjeColl_L),c ; ld (iy+dObjeColl_H),b ; aCodeXm1 ld (iy+dObjeCol),$43 ; ld bc,DispDiamond ; ld (iy+dObjeDraw_L),c ; ld (iy+dObjeDraw_H),b ; ld (iy+dObjeClipFlags),0 ; jp aSquTow ; aMine ld bc,DispMiss ; ld (iy+dObjeDraw_L),c ; ld (iy+dObjeDraw_H),b ; jp aSquTow ; aRising set 0,(iy+dObjeStateF) ; aSAMSqu ld a,tSquMiss ; ld (iy+dObjeWeapon),a ; jr aSAM ; aSAMa ld a,tMiss ; ld (iy+dObjeWeapon),a ; aSAM ld (iy+dObjeBdYS_L),e ; ld (iy+dObjeBdYS_H),d ; ld (iy+dObjeCntA),l ; ld (iy+dObjeCntiA),l ; ld bc,(GroundY) ; ld (iy+dObjeY_L),c ; ld (iy+dObjeY_H),b ; ret ; aFixed ld (iy+dObjeBXS_L),l ; ld (iy+dObjeBXS_H),h ; ld (iy+dObjeBYS_L),e ; ld (iy+dObjeBYS_H),d ; ret ; aVari ld (iy+dObjepSizeTab_L),l ; ld (iy+dObjepSizeTab_H),h ; ld (iy+dObjeBXS_L),e ; ld (iy+dObjeBXS_H),d ; ld (iy+dObjeBYS_L),e ; ld (iy+dObjeBYS_H),d ; ret ; aVari1 ld (iy+dObjepSizeTab_L),l ; ld (iy+dObjepSizeTab_H),h ; ld (iy+dObjeBYS_L),e ; ld (iy+dObjeBYS_H),d ; ld de,0 ; ld (iy+dObjeBXS_L),e ; ld (iy+dObjeBXS_H),d ; ret ; aIris ld bc,DispIris ; aIrisCommon ld (iy+dObjeDraw_L),c ; ld (iy+dObjeDraw_H),b ; ld bc,vLargeX ; ld (iy+dObjeAXS_L),c ; ld (iy+dObjeAXS_H),b ; ld (iy+dObjeAYS_L),c ; ld (iy+dObjeAYS_H),b ; jp aVari ; aIrisA ld bc,DispIrisA ; jp aIrisCommon ; aIrisB ld bc,DispIrisB ; jp aIrisCommon ; aIrisC ld bc,DispIrisC ; jp aIrisCommon ; aSquMiss ld bc,DispSquMiss ; ld (iy+dObjeDraw_L),c ; ld (iy+dObjeDraw_H),b ; aMiss ld (iy+dObjeMove_L),l ; ld (iy+dObjeMove_H),h ; ld (iy+dObjeCntiA),e ; ld hl,PlayerShot ; ld (iy+dObjeColl_L),l ; ld (iy+dObjeColl_H),h ; set bScreenClip,(iy+dObjeFlags) ; res bCursorClip,(iy+dObjeFlags) ; ret ; aProj ld (iy+dObjeAXS_L),l ; ld (iy+dObjeAXS_H),h ; ld (iy+dObjeCntA),e ; set bRepeat,(iy+dObjeFlags) ; ld (iy+dObjepUnDraw),-2 ; aExpl ld bc,ExplTab1 ; ld (iy+dObjepSizeTab_L),c ; ld (iy+dObjepSizeTab_H),b ; ld bc,Ret0 ; ld (iy+dObjeColl_L),c ; ld (iy+dObjeColl_H),b ; ld (iy+dObjeShot_L),c ; ld (iy+dObjeShot_H),b ; ld (iy+dObjeMiss_L),c ; ld (iy+dObjeMiss_H),b ; ld (iy+dObjeAlter_L),c ; ld (iy+dObjeAlter_H),b ; ld (iy+dObjeMove_L),c ; ld (iy+dObjeMove_H),b ; ld bc,DispExpl ; ld (iy+dObjeDraw_L),c ; ld (iy+dObjeDraw_H),b ; ld (iy+dObjeClipFlags),0 ; ret ; CycleXY defb 30 ; defw -13,-13 ; defb 30 ; defw 13,13 ; defb 0 ; defw CycleXY ; CycleX defb 30 ; defw -13,0 ; defb 30 ; defw 13,0 ; defb 0 ; defw CycleX ; CycleY defb 30 ; defw 0,-13 ; defb 30 ; defw 0,13 ; defb 0 ; defw CycleY ; CycleXmY defb 30 ; defw 13,-13 ; defb 30 ; defw -13,13 ; defb 0 ; defw CycleXmY ; OneXY defb 30 ; defw 13,13 ; defb 30 ; defw -13,-13 ; defb 0 ; defw FixedSize ; ExplTab1 defb $1E,$0F,$04 ; defb $23,$16,$04 ; defb $28,$1E,$05 ; defb $2D,$25,$05 ; defb $32,$2D,$06 ; defb $37,$34,$06 ; defb $3C,$3C,$07 ; defb $41,$43,$07 ; defb $46,$4B,$06 ; defb $4B,$52,$05 ; defb $50,$5A,$04 ; defb $55,$61,$03 ; defb $5A,$69,$02 ; defb $5F,$70,$01 ; defb $00,$00,$00 ; ExplTab2 defb $3C,$0F,$04 ; defb $46,$16,$04 ; defb $50,$1E,$05 ; defb $5A,$25,$05 ; defb $64,$2D,$06 ; defb $6E,$34,$06 ; defb $78,$3C,$07 ; defb $82,$43,$07 ; defb $8C,$4B,$06 ; defb $96,$52,$05 ; defb $A0,$5A,$04 ; defb $AA,$61,$03 ; defb $B4,$69,$02 ; defb $BE,$70,$01 ; defb $00,$00,$00 ; ProjTab defb $14,$0F,$44 ; defb $28,$1E,$45 ; defb $3C,$2D,$46 ; defb $55,$3C,$47 ; defb $55,$3C,$47 ; defb $3C,$2D,$46 ; defb $28,$1E,$45 ; defb $14,$0F,$44 ; defb $00,$00,$00 ; Hole defb -1 ; defw DispForce ; Draw defw Ret0 ; Shot defw HoleHit ; Coll defw HoleMissed ; Miss defw DoSizeCycle ; Alter defw Ret0 ; Move defb bbCursorClip ; Flags defb 0 ; StateF defb 0 ; StarComp defw 0 ; AXS defw 0 ; AYS defw FixedSize ; SizeTab defb 1 ; Cnt defw 0 ; BdXS defw 0 ; BdYS defw vMediumX ; BXS defw vMediumY ; BYS defb bbSetWind ; WindF defb $45 ; Col defb 0 ; CntA defb 0 ; CntiA defb 0 ; CntB defb 0 ; CntiB defb 0 ; WidthX defb 0 ; WidthY defb 0 ; ClipFlags defb 0 ; Weapon HoleEnd equ $ ; Length of a definition Miss defb -3 ; defw DispMiss ; defw MissShot ; defw Ret0 ; defw Ret0 ; defw Ret0 ; defw Ret0 ; defb 0 ; defb 0 ; defb 3 ; defw $100 ; defw $100 ; defw 0 ; defb 1 ; defw 0 ; defw 0 ; defw 0 ; defw 0 ; defb 0 ; defb $45 ; defb 1 ; defb 20 ; defb 0 ; defb 0 ; defb 2 ; defb 2 ; defb bbClipCent ; defb 0 ; SAM defb -1 ; defw DispSAM ; defw Ret0 ; defw Ret0 ; defw Ret0 ; defw Ret0 ; defw Ret0 ; defb 0 ; defb 0 ; defb 3 ; defw 0 ; defw 0 ; defw 0 ; defb 1 ; defw 0 ; defw -140 ; defw 0 ; defw 0 ; defb $00 ; defb $45 ; defb 40 ; defb 40 ; defb 2 ; defb 0 ; defb 2 ; defb 2 ; defb bbClipBelow ; defb tMissA ; TOW defb -1 ; defw DispSquTower ; defw TowerShot ; defw TowerColl ; defw Ret0 ; defw Ret0 ; defw MoveTower ; defb bbScreenClip ; defb 0 ; defb 3 ; defw $80 ; defw $100 ; defw 0 ; defb 1 ; defw MoveTower ; defw 0 ; defw 0 ; defw 0 ; defb $00 ; defb $45 ; defb 40 ; defb 40 ; defb 2 ; defb 0 ; defb 2 ; defb 2 ; defb bbClipBelow ; defb tMissA ; Slugs defb -3 ; defw DispSlugs ; defw Ret0 ; defw Ret0 ; defw Ret0 ; defw Ret0 ; defw TestHit ; defb 0 ; defb 0 ; defb 0 ; defw 0 ; defw 0 ; defw 0 ; defb 28 ; defw 200 ; defw 0 ; defw 0 ; defw 0 ; defb bSlug ; defb $45 ; defb 40 ; defb 1 ; defb 0 ; defb 0 ; defb 0 ; defb 0 ; defb 0 ; defb 0 ; MoveTower ld a,(ix+dObjeStateF) ; cp 1 ; jr z,TowerFire ; dec (ix+dObjeCntA) ; jr z,MTa ; ld l,(ix+dObjeY_L) ; ld h,(ix+dObjeY_H) ; ld e,(ix+dObjeBdYS_L) ; ld d,(ix+dObjeBdYS_H) ; add hl,de ; cp 2 ; jr nz,MT0 ; or a ; sbc hl,de ; or a ; sbc hl,de ; MT0 ld (ix+dObjeY_L),l ; ld (ix+dObjeY_H),h ; ex de,hl ; ld hl,(GroundY) ; or a ; sbc hl,de ; ret p ; jp KillObject ; MTa ld (ix+dObjeStateF),$01 ; ret ; TowerFire ld a,r ; and $3F ; ret nz ; bit 7,(ix+dObjeY_H) ; ret nz ; jp FireMissile ; DispDiamond ld l,(ix+dObjeX_L) ; ld h,(ix+dObjeX_H) ; ld e,(ix+dObjeZ_L) ; ld d,(ix+dObjeZ_H) ; ld (TempZ),de ; call ObjeDiv ; ld (X1),hl ; ld l,(ix+dObjeY_L) ; ld h,(ix+dObjeY_H) ; ld de,(TempZ) ; call ObjeDiv ; ld (Y1),hl ; ld hl,(X1) ; ld de,-128 ; or a ; sbc hl,de ; jp m,KillObject ; ld de,255 ; or a ; sbc hl,de ; jp p,KillObject ; set bOnScreen,(ix+dObjeFlags) ; ld hl,300 ; ld de,(TempZ) ; call ObjeDiv ; ex de,hl ; ld hl,(X1) ; add hl,de ; ld (X2),hl ; add hl,de ; ld (X3),hl ; ld hl,(X1) ; or a ; sbc hl,de ; ld (X4),hl ; or a ; sbc hl,de ; ld (X5),hl ; ld hl,(Y1) ; add hl,de ; ld (Y2),hl ; add hl,de ; ld (Y3),hl ; add hl,de ; ld (Y3a),hl ; ld hl,(Y1) ; or a ; sbc hl,de ; ld (Y4),hl ; or a ; sbc hl,de ; ld (Y5),hl ; or a ; sbc hl,de ; ld (Y5a),hl ; call UndrawLines ; call AddFirstLine ; ret c ; ld hl,(Y4) ; ld de,(Y2) ; ld bc,(X5) ; call VertLine ; call c,AddLine ; ld hl,(Y4) ; ld de,(Y2) ; ld bc,(X3) ; call VertLine ; call c,AddLine ; ld hl,(Y5) ; ld de,(Y3) ; ld bc,(X4) ; call VertLine ; call c,AddLine ; ld hl,$0000 ; Y5a equ $-2 ; ld de,$0000 ; Y3a equ $-2 ; ld bc,(X1) ; call VertLine ; call c,AddLine ; ld hl,(Y5) ; ld de,(Y3) ; ld bc,(X2) ; jp VertLine ; CodeSend ld a,$10 ; call AddScore ; jp AddCodes ; DispSquMiss call DispSquare ; bit 0,(ix+dObjeFlags) ; ret nz ; jp KillObject ; DispSquTower ld l,(ix+dObjeX_L) ; ld h,(ix+dObjeX_H) ; ld (TempX),hl ; ld e,(ix+dObjeZ_L) ; ld d,(ix+dObjeZ_H) ; ld (TempZ),de ; ld c,(ix+dObjeAXS_L) ; ld b,(ix+dObjeAXS_H) ; or a ; sbc hl,bc ; ld (TempX1),hl ; push bc ; call ObjeDiv ; pop bc ; ld (X1),hl ; ld hl,(TempX) ; add hl,bc ; ld (TempXr),hl ; call ObjeDiv ; ld (X2),hl ; ld de,(X1) ; or a ; sbc hl,de ; ret m ; add hl,de ; ld bc,-128 ; or a ; sbc hl,bc ; jp m,KillObject ; ld de,255 ; or a ; sbc hl,de ; jp p,KillObject ; ld l,(ix+dObjeY_L) ; ld h,(ix+dObjeY_H) ; ld (TempY),hl ; ld de,(TempZ) ; call ObjeDiv ; ld (Y1),hl ; ld hl,(GroundY) ; ld de,(TempZ) ; call ObjeDiv ; ld (Y2),hl ; ld hl,(TempZ) ; ld c,(ix+dObjeAYS_L) ; ld b,(ix+dObjeAYS_H) ; add hl,bc ; ld (TempZ),hl ; ex de,hl ; ld hl,$0000 ; TempX1 equ $-2 ; call ObjeDiv ; ld (X3),hl ; ld hl,$0000 ; TempXr equ $-2 ; ld de,(TempZ) ; call ObjeDiv ; ld (X4),hl ; ld hl,(TempY) ; ld de,(TempZ) ; call ObjeDiv ; ld (Y3),hl ; ld hl,(GroundY) ; ld de,(TempZ) ; call ObjeDiv ; ld (Y4),hl ; call UndrawLines ; call AddFirstLine ; ret c ; ld hl,(X4) ; ld bc,(X2) ; dec bc ; dec hl ; or a ; sbc hl,bc ; jp p,Towerad ; ld hl,(X1) ; ld bc,(X3) ; dec hl ; or a ; sbc hl,bc ; jp p,Towercf ; Towerbe ld a,(Y1+1) ; bit 7,a ; jr nz,Towere ; ld de,(Y2) ; ld hl,(Y1) ; ld bc,(X1) ; call VertLine ; call c,AddLine ; ld de,(Y2) ; ld hl,(Y1) ; ld bc,(X2) ; call VertLine ; call c,AddLine ; ld hl,(X1) ; ld de,(X2) ; ld bc,(Y1) ; call HoriLine ; call c,AddLine ; ld hl,(X3) ; ld de,(X4) ; ld bc,(Y3) ; call HoriLine ; call c,AddLine ; ld hl,(X3) ; ld de,(X1) ; exx ; ld hl,(Y3) ; ld de,(Y1) ; exx ; call AnyLine ; call c,AddLine ; ld hl,(X4) ; ld de,(X2) ; exx ; ld hl,(Y3) ; ld de,(Y1) ; exx ; jp AnyLine ; Towere ld hl,(Y1) ; ld de,(Y2) ; ld bc,(X1) ; call VertLine ; call c,AddLine ; ld hl,(Y1) ; ld de,(Y2) ; ld bc,(X2) ; call VertLine ; call c,AddLine ; ld hl,(X1) ; ld de,(X2) ; ld bc,(Y1) ; jp HoriLine ; Towerad ld a,(Y1+1) ; bit 7,a ; jr nz,Towerd ; ld hl,(Y1) ; ld de,(Y2) ; ld bc,(X1) ; call VertLine ; call c,AddLine ; ld hl,(Y1) ; ld de,(Y2) ; ld bc,(X2) ; call VertLine ; call c,AddLine ; ld hl,(Y3) ; ld de,(Y4) ; ld bc,(X4) ; call VertLine ; call c,AddLine ; ld hl,(X1) ; ld de,(X2) ; ld bc,(Y1) ; call HoriLine ; call c,AddLine ; ld hl,(X3) ; ld de,(X4) ; ld bc,(Y3) ; call HoriLine ; call c,AddLine ; ld hl,(X3) ; ld de,(X1) ; exx ; ld hl,(Y3) ; ld de,(Y1) ; exx ; call AnyLine ; call c,AddLine ; ld hl,(X4) ; ld de,(X2) ; exx ; ld hl,(Y3) ; ld de,(Y1) ; exx ; jp AnyLine ; Towerd ld hl,(Y1) ; ld de,(Y2) ; ld bc,(X1) ; call VertLine ; call c,AddLine ; ld hl,(Y1) ; ld de,(Y2) ; ld bc,(X2) ; call VertLine ; call c,AddLine ; ld hl,(Y3) ; ld de,(Y4) ; ld bc,(X4) ; call VertLine ; call c,AddLine ; ld hl,(X1) ; ld de,(X2) ; ld bc,(Y1) ; call HoriLine ; call c,AddLine ; ld hl,(X4) ; ld de,(X2) ; exx ; ld hl,(Y3) ; ld de,(Y1) ; exx ; jp AnyLine ; Towercf ld a,(Y1+1) ; bit 7,a ; jr nz,Towerf ; ld hl,(Y1) ; ld de,(Y2) ; ld bc,(X1) ; call VertLine ; call c,AddLine ; ld hl,(Y1) ; ld de,(Y2) ; ld bc,(X2) ; call VertLine ; call c,AddLine ; ld hl,(Y3) ; ld de,(Y4) ; ld bc,(X3) ; call VertLine ; call c,AddLine ; ld hl,(X1) ; ld de,(X2) ; ld bc,(Y1) ; call HoriLine ; call c,AddLine ; ld hl,(X3) ; ld de,(X4) ; ld bc,(Y3) ; call HoriLine ; call c,AddLine ; ld hl,(X3) ; ld de,(X1) ; exx ; ld hl,(Y3) ; ld de,(Y1) ; exx ; call AnyLine ; call c,AddLine ; ld hl,(X4) ; ld de,(X2) ; exx ; ld hl,(Y3) ; ld de,(Y1) ; exx ; jp AnyLine ; Towerf ld hl,(Y1) ; ld de,(Y2) ; ld bc,(X1) ; call VertLine ; call c,AddLine ; ld hl,(Y1) ; ld de,(Y2) ; ld bc,(X2) ; call VertLine ; call c,AddLine ; ld hl,(Y3) ; ld de,(Y4) ; ld bc,(X3) ; call VertLine ; call c,AddLine ; ld hl,(X1) ; ld de,(X2) ; ld bc,(Y1) ; call HoriLine ; call c,AddLine ; ld hl,(X3) ; ld de,(X1) ; exx ; ld hl,(Y3) ; ld de,(Y1) ; exx ; jp AnyLine ; TestHit push ix ; ld a,(ix+dObjeOX_H) ; add a,(ix+dObjeX_H) ; rra ; ld d,a ; ld a,(ix+dObjeOY_H) ; add a,(ix+dObjeY_H) ; rra ; ld e,a ; exx ; ld e,(ix+dObjeOZ_L) ; ld d,(ix+dObjeOZ_H) ; ld b,0 ; TestH1p ld (THtempIX),ix ; ld l,(ix+dppObje_L) ; ld h,(ix+dppObje_H) ; ld a,h ; or l ; jr z,TestH1 ; inc b ; push hl ; pop ix ; ld l,(ix+dObjeOZ_L) ; ld h,(ix+dObjeOZ_H) ; or a ; sbc hl,de ; jr nc,TestH1p ; ld ix,$0000 ; THtempIX equ $-2 ; dec b ; jp TestH2 ; TestH1 ld ix,(pObjeList) ; TestH2 ld a,b ; or a ; jr z,TestH4 ; exx ; ld b,a ; TestH3 ld a,(ix+dObjeClipFlags) ; or a ; jr z,TestH3a ; ld a,(ix+dObjeOX_H) ; add a,(ix+dObjeX_H) ; rra ; sub d ; jp p,AbsX ; neg ; AbsX cp (ix+dObjeWidthX) ; jr nc,TestH3a ; ld a,(ix+dObjeOY_H) ; add a,(ix+dObjeY_H) ; rra ; bit bClipCent,(ix+dObjeClipFlags); jr nz,TestCC ; cp e ; jp p,TestH3a ; jp TestTrue ; TestCC sub e ; jp p,AbsY ; neg ; AbsY cp (ix+dObjeWidthY) ; jr nc,TestH3a ; TestTrue ld l,(ix+dObjeShot_L) ; ld h,(ix+dObjeShot_H) ; call CallHL ; push ix ; pop hl ; pop ix ; push iy ; push ix ; pop iy ; call aExpl ; push iy ; pop de ; pop iy ; ld bc,$000C ; add hl,bc ; ex de,hl ; add hl,bc ; ex de,hl ; ld bc,3*2 ; ldir ; ret ; TestH3a ld l,(ix+dpnObje_L) ; ld h,(ix+dpnObje_H) ; push hl ; pop ix ; djnz TestH3 ; TestH4 pop ix ; ret ; PlayerShot ld a,(AType) ; ld b,a ; jp DoDamage ; WarpHit ld de,(pMap) ; ld iy,Tunnels ; ld bc,6 ; ld a,12 ; FindTunnel ld l,(iy+dTunnelPos1_L) ; ld h,(iy+dTunnelPos1_H) ; or a ; sbc hl,de ; jr z,WH1 ; ld l,(iy+dTunnelPos2_L) ; ld h,(iy+dTunnelPos2_H) ; or a ; sbc hl,de ; jr z,WH2 ; add iy,bc ; dec a ; jr nz,FindTunnel ; ld hl,$6021 ; ld a,3 ; jr WH3 ; WH1 ld l,(iy+dTunnelPos2_L) ; ld h,(iy+dTunnelPos2_H) ; ld a,(iy+dTunnelAngle2) ; jr WH3 ; WH2 ld l,(iy+dTunnelPos1_L) ; ld h,(iy+dTunnelPos1_H) ; ld a,(iy+dTunnelAngle1) ; WH3 ld (pMap),hl ; ld (Angle),a ; ld hl,(ArrowPos) ; jp Print8x8 ; Tunnels defw $6012 ; defb $02 ; defw $61FD ; defb $00 ; defw $6106 ; defb $00 ; defw $61B2 ; defb $06 ; defw $6146 ; defb $07 ; defw $61C7 ; defb $01 ; defw $6063 ; defb $02 ; defw $6067 ; defb $02 ; defw $6098 ; defb $02 ; defw $617F ; defb $04 ; defw $6095 ; defb $02 ; defw $615F ; defb $04 ; defw $60F8 ; defb $02 ; defw $613F ; defb $04 ; defw $605C ; defb $02 ; defw $60D8 ; defb $02 ; defw $606E ; defb $01 ; defw $60A5 ; defb $05 ; defw $616A ; defb $00 ; defw $61E9 ; defb $06 ; defw $61B4 ; defb $06 ; defw $61CC ; defb $05 ; defw $6076 ; defb $04 ; defw $61AE ; defb $04 ; HoleHit bit bFake,(ix+dObjeStateF) ; ret nz ; ld a,HoleScore ; jp AddScore ; FuelHit bit bFake,(ix+dObjeStateF) ; ret nz ; ld b,FuelDam ; jp DoDamage ; MissShot ld a,MissScore ; call AddScore ; set bKilled,(ix+dObjeFlags) ; ret ; TowerShot ld a,TowerScore ; call AddScore ; ld (ix+dObjeStateF),2 ; ld l,(ix+dObjeBdYS_L) ; ld h,(ix+dObjeBdYS_H) ; ld de,-20 ; add hl,de ; ld (ix+dObjeBdYS_L),l ; ld (ix+dObjeBdYS_H),h ; ret ; TowerColl ld b,TowerDam ; call DoDamage ; ld a,TowerScore ; jp SubScore ; HoleMissed bit bFake,(ix+dObjeStateF) ; ret nz ; ld a,(AType) ; ld b,a ; jp DoDamage ; FixedSize defb 255 ; defw 0,0 ; defb 0 ; defw FixedSize ; CreateObject ld (TempAcc1),a ; and $3F ; ld (TempAcc),a ; push de ; push bc ; call AddObje ; pop bc ; pop de ; ret c ; call COinn ; ld a,0 ; TempAcc1 equ $-1 ; and $C0 ; or (iy+dObjeStateF) ; ld (iy+dObjeStateF),a ; ld a,(iy+dObjeStarComp) ; neg ; jp LimitStarCnt ; COinn ld (iy+dObjeX_L),e ; ld (iy+dObjeX_H),d ; ld (iy+dObjeY_L),c ; ld (iy+dObjeY_H),b ; exx ; ld (iy+dObjedZ_L),l ; ld (iy+dObjedZ_H),h ; ld (iy+dObjedX_L),e ; ld (iy+dObjedX_H),d ; ld (iy+dObjedY_L),c ; ld (iy+dObjedY_H),b ; exx ; ld d,iyh ; ld e,iyl ; ld hl,dObjepLines_L ; add hl,de ; ld b,8 ; xor a ; COlp ld (hl),a ; inc hl ; ld (hl),a ; inc hl ; djnz COlp ; ld (hl),a ; inc hl ; ex de,hl ; ld l,0 ; TempAcc equ $-1 ; ld h,0 ; add hl,hl ; add hl,hl ; add hl,hl ; ld bc,ObjectDescs ; add hl,bc ; ld c,(hl) ; inc hl ; ld b,(hl) ; inc hl ; push bc ; ld c,(hl) ; inc hl ; ld b,(hl) ; inc hl ; push bc ; ld c,(hl) ; inc hl ; ld b,(hl) ; inc hl ; push bc ; ld a,(hl) ; inc hl ; ld h,(hl) ; ld l,a ; ld bc,HoleEnd-Hole ; ldir ; pop de ; pop hl ; ret ; CalcSquareA12 ld l,(ix+dObjeAXS_L) ; ld h,(ix+dObjeAXS_H) ; ld e,(ix+dObjeAYS_L) ; ld d,(ix+dObjeAYS_H) ; ld iy,X1 ; jp CalcSquare ; CalcSquareB12 ld l,(ix+dObjeBXS_L) ; ld h,(ix+dObjeBXS_H) ; ld e,(ix+dObjeBYS_L) ; ld d,(ix+dObjeBYS_H) ; ld iy,X1 ; jp CalcSquare ; CalcSquareA34 ld l,(ix+dObjeAXS_L) ; ld h,(ix+dObjeAXS_H) ; ld e,(ix+dObjeAYS_L) ; ld d,(ix+dObjeAYS_H) ; ld iy,X3 ; jp CalcSquare ; CalcSquareB34 ld l,(ix+dObjeBXS_L) ; ld h,(ix+dObjeBXS_H) ; ld e,(ix+dObjeBYS_L) ; ld d,(ix+dObjeBYS_H) ; ld iy,X3 ; jp CalcSquare ; CalcSquare push de ; push hl ; ld c,(ix+dObjeX_L) ; ld b,(ix+dObjeX_H) ; add hl,bc ; ld e,(ix+dObjeZ_L) ; ld d,(ix+dObjeZ_H) ; push de ; push bc ; call ObjeDiv ; pop bc ; pop de ; ld (iy+0),l ; ld (iy+1),h ; pop hl ; ld a,l ; cpl ; ld l,a ; ld a,h ; cpl ; ld h,a ; inc hl ; add hl,bc ; push de ; call ObjeDiv ; pop de ; ld (iy+2),l ; ld (iy+3),h ; pop hl ; push hl ; ld c,(ix+dObjeY_L) ; ld b,(ix+dObjeY_H) ; add hl,bc ; ld e,(ix+dObjeZ_L) ; ld d,(ix+dObjeZ_H) ; push de ; push bc ; call ObjeDiv ; pop bc ; pop de ; ld (iy+4),l ; ld (iy+5),h ; pop hl ; ld a,l ; cpl ; ld l,a ; ld a,h ; cpl ; ld h,a ; inc hl ; add hl,bc ; push de ; call ObjeDiv ; pop de ; ld (iy+6),l ; ld (iy+7),h ; ret ; ChaserA dec (ix+dObjeCntA) ; ret nz ; ld a,(ix+dObjeCntiA) ; ld (ix+dObjeCntA),a ; ld b,40 ; ld c,57 ; ld a,r ; and $31 ; jp nz,OFAim ; ld (ix+dObjeCntiA),100 ; ld hl,ChaserB ; ld (ix+dObjeMove_L),l ; ld (ix+dObjeMove_H),h ; ChaserB dec (ix+dObjeCntA) ; ret nz ; ld a,(ix+dObjeCntiA) ; ld (ix+dObjeCntA),a ; ld b,17 ; ld c,20 ; jp OFAim ; OFAim exx ; ld hl,(DeltaX) ; call NegHL ; call MissAimMult ; ld e,(ix+dObjeX_L) ; ld d,(ix+dObjeX_H) ; or a ; sbc hl,de ; call MissAimDiv ; ld (ix+dObjedX_L),l ; ld (ix+dObjedX_H),h ; ld hl,(DeltaY) ; call NegHL ; call MissAimMult ; ld e,(ix+dObjeY_L) ; ld d,(ix+dObjeY_H) ; or a ; sbc hl,de ; call MissAimDiv ; ld (ix+dObjedY_L),l ; ld (ix+dObjedY_H),h ; ld hl,(DeltaZ) ; call NegHL ; call MissAimMult ; ld e,(ix+dObjeZ_L) ; ld d,(ix+dObjeZ_H) ; or a ; sbc hl,de ; call MissAimDiv ; ld (ix+dObjedZ_L),l ; ld (ix+dObjedZ_H),h ; ret ; MissAimMult exx ; ld a,c ; exx ; ld e,0 ; ld d,a ; jp SignMult ; MissAimDiv exx ; ld a,b ; exx ; ld e,0 ; ld d,a ; jp SignDiv ; dec (ix+dObjeCntA) ; jr nz,DispExpl ; KillObject set bKilled,(ix+dObjeFlags) ; ret ; DispSlugs dec (ix+dObjeCnt) ; jp z,KillObject ; ld l,(ix+dObjeY_L) ; ld h,(ix+dObjeY_H) ; ld de,(GroundY) ; or a ; sbc hl,de ; jp p,KillObject ; add hl,de ; ld e,(ix+dObjeZ_L) ; ld d,(ix+dObjeZ_H) ; ld (TempZ),de ; call ObjeDiv ; ld (Y1),hl ; ld l,(ix+dObjeX_L) ; ld h,(ix+dObjeX_H) ; ld c,(ix+dObjeBdXS_L) ; ld b,(ix+dObjeBdXS_H) ; add hl,bc ; ld de,(TempZ) ; call ObjeDiv ; ld (X2),hl ; ld l,(ix+dObjeX_L) ; ld h,(ix+dObjeX_H) ; ld c,(ix+dObjeBdXS_L) ; ld b,(ix+dObjeBdXS_H) ; or a ; sbc hl,bc ; ld de,(TempZ) ; call ObjeDiv ; ld (X1),hl ; call UndrawLines ; call AddFirstLine ; ret c ; ld hl,(X1) ; ld de,(X2) ; ld bc,(Y1) ; call HoriLineEx ; bit bOnScreen,(ix+dObjeFlags) ; ret nz ; jp KillObject ; DispExpl ld l,(ix+dObjeX_L) ; ld h,(ix+dObjeX_H) ; ld e,(ix+dObjeZ_L) ; ld d,(ix+dObjeZ_H) ; ld (TempZ),de ; call ObjeDiv ; ld (X1),hl ; ld bc,128 ; add hl,bc ; ld a,h ; add a,2 ; cp 4 ; jp nc,KillObject ; ld l,(ix+dObjeY_L) ; ld h,(ix+dObjeY_H) ; ld de,(TempZ) ; call ObjeDiv ; ld (Y1),hl ; ld bc,128 ; add hl,bc ; ld a,h ; add a,2 ; cp 4 ; jp nc,KillObject ; ld l,(ix+dObjepSizeTab_L) ; ld h,(ix+dObjepSizeTab_H) ; push hl ; pop iy ; ld hl,(TempZ) ; sra h ; rr l ; sra h ; rr l ; sra h ; rr l ; ld (TempZ),hl ; ld l,(iy+0) ; ld a,l ; or a ; jr nz,Expl1 ; bit bRepeat,(ix+dObjeFlags) ; jp z,KillObject ; ld l,(ix+dObjeAXS_L) ; ld h,(ix+dObjeAXS_H) ; push hl ; pop iy ; ld l,(iy+0) ; Expl1 ld h,0 ; inc iy ; ld de,(TempZ) ; call ObjeDiv ; ex de,hl ; ld hl,(X1) ; ld b,h ; ld c,l ; add hl,de ; ld (eX1),hl ; ld h,b ; ld l,c ; or a ; sbc hl,de ; ld (eX2),hl ; sra d ; rr e ; ld h,b ; ld l,c ; add hl,de ; ld (eX3),hl ; ld h,b ; ld l,c ; or a ; sbc hl,de ; ld (eX4),hl ; ld l,(iy+0) ; ld h,0 ; inc iy ; ld de,(TempZ) ; call ObjeDiv ; ex de,hl ; ld hl,(Y1) ; ld b,h ; ld c,l ; add hl,de ; ld (eY1),hl ; ld h,b ; ld l,c ; or a ; sbc hl,de ; ld (eY2),hl ; sra d ; rr e ; ld h,b ; ld l,c ; add hl,de ; ld (eY3),hl ; ld h,b ; ld l,c ; or a ; sbc hl,de ; ld (eY4),hl ; ld a,(iy+0) ; ld (Colour),a ; inc iy ; push iy ; pop hl ; ld (ix+dObjepSizeTab_L),l ; ld (ix+dObjepSizeTab_H),h ; call UndrawLines ; call AddFirstLine ; ret c ; ld hl,(eX3) ; ld de,(eX1) ; ld bc,(eY4) ; call HoriLineEx ; call c,AddLine ; ld de,$0000 ; eX1 equ $-2 ; ld hl,$0000 ; eX3 equ $-2 ; ld bc,(eY3) ; call HoriLineEx ; call c,AddLine ; ld de,$0000 ; eX4 equ $-2 ; ld hl,$0000 ; eX2 equ $-2 ; ld bc,$0000 ; eY4 equ $-2 ; call HoriLineEx ; call c,AddLine ; ld hl,(eX2) ; ld de,(eX4) ; ld bc,$0000 ; eY3 equ $-2 ; call HoriLineEx ; call c,AddLine ; ld hl,(eX4) ; ld de,(eX3) ; ld bc,$0000 ; eY2 equ $-2 ; call HoriLineEx ; call c,AddLine ; ld hl,(eX4) ; ld de,(eX3) ; ld bc,$0000 ; eY1 equ $-2 ; jp HoriLineEx ; ObjeNotShown call UndrawLines ; call AddFirstLine ; ret ; DispMiss ld a,(ix+dObjeCol) ; inc a ; and $03 ; or $44 ; ld (ix+dObjeCol),a ; ld l,(ix+dObjeY_L) ; ld h,(ix+dObjeY_H) ; ld de,(GroundY) ; or a ; sbc hl,de ; or a ; bit 7,h ; jp z,KillObject ; ld e,(ix+dObjeZ_L) ; ld d,(ix+dObjeZ_H) ; ld (TempZ),de ; ld l,(ix+dObjeX_L) ; ld h,(ix+dObjeX_H) ; call ObjeDiv ; ld (X1),hl ; ld bc,128 ; add hl,bc ; ld a,h ; add a,2 ; cp 4 ; jp nc,ObjeNotShown ; ld l,(ix+dObjeY_L) ; ld h,(ix+dObjeY_H) ; ld de,(TempZ) ; call ObjeDiv ; ld (Y1),hl ; ld bc,128 ; add hl,bc ; ld a,h ; add a,2 ; cp 4 ; jp nc,ObjeNotShown ; ShowMiss ld hl,(TempZ) ; sra h ; rr l ; sra h ; rr l ; sra h ; rr l ; ld (TempZ),hl ; dec (ix+dObjeCnt) ; ld a,(ix+dObjeCnt) ; and $03 ; jp z,Miss1 ; dec a ; jp z,Miss2 ; dec a ; jp z,Miss3 ; Miss4 ld hl,0 ; exx ; ld hl,$28 ; jp Miss0 ; Miss3 ld hl,$10 ; exx ; ld hl,$24 ; jp Miss0 ; Miss2 ld hl,$20 ; exx ; ld hl,$20 ; jp Miss0 ; Miss1 ld hl,$24 ; exx ; ld hl,$10 ; Miss0 ld de,(TempZ) ; call ObjeDiv ; ex de,hl ; exx ; ld de,(TempZ) ; call ObjeDiv ; ex de,hl ; ld hl,(X1) ; add hl,de ; ld (mXa),hl ; or a ; sbc hl,de ; or a ; sbc hl,de ; ld (mXc),hl ; ld hl,(Y1) ; add hl,de ; ld (mYd),hl ; or a ; sbc hl,de ; or a ; sbc hl,de ; ld (mYb),hl ; exx ; ld hl,(X1) ; add hl,de ; ld (mXd),hl ; or a ; sbc hl,de ; or a ; sbc hl,de ; ld (mXb),hl ; ld hl,(Y1) ; add hl,de ; ld (mYc),hl ; or a ; sbc hl,de ; or a ; sbc hl,de ; ld (mYa),hl ; call UndrawLines ; call AddFirstLine ; ret c ; ld hl,$0000 ; mYa equ $-2 ; ld de,$0000 ; mYc equ $-2 ; exx ; ld hl,$0000 ; mXa equ $-2 ; ld de,$0000 ; mXc equ $-2 ; call AnyLine ; call c,AddLine ; ld a,(Colour) ; xor $03 ; ld (Colour),a ; ld hl,$0000 ; mYb equ $-2 ; ld de,$0000 ; mYd equ $-2 ; exx ; ld hl,$0000 ; mXb equ $-2 ; ld de,$0000 ; mXd equ $-2 ; call AnyLine ; bit bOnScreen,(ix+dObjeFlags) ; jp z,KillObject ; ret ; DispSAM dec (ix+dObjeCntA) ; jp z,DispSAMns ; ld a,(ix+dObjeCntiB) ; cp 1 ; jr z,DispSAM1 ; ld e,(ix+dObjeBdYS_L) ; ld d,(ix+dObjeBdYS_H) ; ld l,(ix+dObjeY_L) ; ld h,(ix+dObjeY_H) ; add hl,de ; ld (ix+dObjeY_L),l ; ld (ix+dObjeY_H),h ; DispSAM1 ld l,(ix+dObjeX_L) ; ld h,(ix+dObjeX_H) ; ld e,(ix+dObjeZ_L) ; ld d,(ix+dObjeZ_H) ; ld (TempZ),de ; call ObjeDiv ; ld a,h ; add a,2 ; cp 4 ; jp nc,ObjeNotShown ; ld (X1),hl ; ld l,(ix+dObjeY_L) ; ld h,(ix+dObjeY_H) ; ld de,(TempZ) ; call ObjeDiv ; ld (Y1),hl ; ld hl,(GroundY) ; ld de,(TempZ) ; call ObjeDiv ; ld (Y2),hl ; bit 0,(ix+dObjeStateF) ; jr nz,SAMRising ; ld a,(ix+dObjeCntiB) ; or a ; jr nz,SAMretreat ; call ShowMiss ; res bKilled,(ix+dObjeFlags) ; call AddLine ; SAMa ld hl,(Y1) ; ld de,(Y2) ; ld bc,(X1) ; jp VertLine ; SAMretreat call UndrawLines ; call AddFirstLine ; ret c ; jp SAMa ; SAMRising ld a,(ix+dObjeCntiB) ; or a ; jr nz,SAMRisingret ; call ShowMiss ; res bKilled,(ix+dObjeFlags) ; call AddLine ; SAMRisingA ld de,(Y1) ; ld hl,(Y2) ; or a ; sbc hl,de ; sra h ; rr l ; ex de,hl ; ld hl,(X1) ; or a ; sbc hl,de ; push hl ; add hl,de ; add hl,de ; pop de ; ex de,hl ; ld bc,(Y2) ; jp HoriLine ; SAMRisingret call UndrawLines ; call AddFirstLine ; ret c ; jp SAMRisingA ; DispSAMns ld a,(ix+dObjeCntiB) ; cp 2 ; jp z,KillObject ; cp 1 ; jr z,FireMiss ; inc (ix+dObjeCntiB) ; FireMiss ld a,r ; and $07 ; add a,4 ; ld (ix+dObjeCntA),a ; call FireMissile ; dec (ix+dObjeCntB) ; ret nz ; DispSAMexit ld (ix+dObjeCntiB),2 ; ld a,(ix+dObjeCntiA) ; ld (ix+dObjeCntA),a ; ld l,(ix+dObjeBdYS_L) ; ld h,(ix+dObjeBdYS_H) ; call NegHL ; ld (ix+dObjeBdYS_L),l ; ld (ix+dObjeBdYS_H),h ; ret ; FireMissile ld l,(ix+dObjeZ_L) ; ld h,(ix+dObjeZ_H) ; ld e,(ix+dObjeX_L) ; ld d,(ix+dObjeX_H) ; ld c,(ix+dObjeY_L) ; ld b,(ix+dObjeY_H) ; exx ; ld hl,0 ; ld de,0 ; ld bc,0 ; exx ; push ix ; ld a,(ix+dObjeWeapon) ; call CreateObject ; pop ix ; ret ; DispSquareB call CalcSquareB34 ; ld hl,(X4) ; ld (ix+dObjeDispXL_L),l ; ld (ix+dObjeDispXL_H),h ; ld hl,(X3) ; ld (ix+dObjeDispXR_L),l ; ld (ix+dObjeDispXR_H),h ; ld hl,(Y4) ; ld (ix+dObjeDispYT_L),l ; ld (ix+dObjeDispYT_H),h ; ld hl,(Y3) ; ld (ix+dObjeDispYB_L),l ; ld (ix+dObjeDispYB_H),h ; jr DispSq1 ; DispSquare call CalcSquareA34 ; DispSq1 call UndrawLines ; call AddFirstLine ; ret c ; ld hl,(X4) ; ld de,(X3) ; ld bc,(Y3) ; call HoriLine ; call c,AddLine ; ld hl,(X4) ; ld de,(X3) ; ld bc,(Y4) ; call HoriLine ; call c,AddLine ; ld hl,(Y4) ; ld de,(Y3) ; ld bc,(X3) ; call VertLine ; call c,AddLine ; ld hl,(Y4) ; ld de,(Y3) ; ld bc,(X4) ; jp VertLine ; DispIris call CalcSquareB12 ; call DispSquare ; call c,AddLine ; ld hl,(X2) ; ld de,(X3) ; ld bc,(Y1) ; call HoriLine ; call c,AddLine ; ld hl,(X4) ; ld de,(X1) ; ld bc,(Y2) ; call HoriLine ; call c,AddLine ; ld hl,(Y2) ; ld de,(Y3) ; ld bc,(X2) ; call VertLine ; call c,AddLine ; ld hl,(Y4) ; ld de,(Y1) ; ld bc,(X1) ; call VertLine ; jp AlterWindow1 ; DispIrisA call DispParaH ; jp AlterWindow1 ; DispIrisB call CalcSquareB12 ; call DispSquare ; jp AlterWindow1 ; DispIrisC call CalcSquareB12 ; jp AlterWindow1 ; DispParaH call CalcSquareB12 ; call CalcSquareA34 ; call UndrawLines ; call AddFirstLine ; ret c ; ld hl,(X2) ; ld de,(X1) ; ld bc,(Y1) ; call HoriLine ; call c,AddLine ; ld hl,(X2) ; ld de,(X1) ; ld bc,(Y2) ; call HoriLine ; call c,AddLine ; ld hl,(X4) ; ld de,(X3) ; ld bc,(Y3) ; call HoriLine ; call c,AddLine ; ld hl,(X4) ; ld de,(X3) ; ld bc,(Y4) ; jp HoriLine ; DispForce call CalcSquareB12 ; ld l,(ix+dObjeFFH1_L) ; ld h,(ix+dObjeFFH1_H) ; ld de,0 ; ld (ix+dObjeFFH1_L),e ; ld (ix+dObjeFFH1_H),d ; call Undrawlp ; call FFgetline ; ret c ; ld hl,(X2) ; ld de,(X1) ; ld bc,(Y1) ; call HoriLine ; push iy ; pop hl ; ld (ix+dObjeFFH1_L),l ; ld (ix+dObjeFFH1_H),h ; ld l,(ix+dObjeFFH2_L) ; ld h,(ix+dObjeFFH2_H) ; ld de,0 ; call Undrawlp ; call FFgetline ; ret c ; ld hl,(X2) ; ld de,(X1) ; ld bc,(Y2) ; call HoriLine ; push iy ; pop hl ; ld (ix+dObjeFFH2_L),l ; ld (ix+dObjeFFH2_H),h ; ld l,(ix+dObjeFFV1_L) ; ld h,(ix+dObjeFFV1_H) ; ld de,0 ; ld (ix+dObjeFFV1_L),e ; ld (ix+dObjeFFV1_H),d ; call Undrawlp ; call FFgetline ; ret c ; ld hl,(Y2) ; ld de,(Y1) ; ld bc,(X1) ; call VertLine ; push iy ; pop hl ; ld (ix+dObjeFFV1_L),l ; ld (ix+dObjeFFV1_H),h ; ld l,(ix+dObjeFFV2_L) ; ld h,(ix+dObjeFFV2_H) ; ld de,0 ; ld (ix+dObjeFFV2_L),e ; ld (ix+dObjeFFV2_H),d ; call Undrawlp ; call FFgetline ; ret c ; ld hl,(Y2) ; ld de,(Y1) ; ld bc,(X2) ; call VertLine ; push iy ; pop hl ; ld (ix+dObjeFFV2_L),l ; ld (ix+dObjeFFV2_H),h ; AlterWindow1 bit 6,(ix+dObjeStateF) ; ret nz ; ld hl,(X2) ; ld (ix+dObjeDispXL_L),l ; ld (ix+dObjeDispXL_H),h ; ld hl,(X1) ; ld (ix+dObjeDispXR_L),l ; ld (ix+dObjeDispXR_H),h ; ld hl,(Y2) ; ld (ix+dObjeDispYT_L),l ; ld (ix+dObjeDispYT_H),h ; ld hl,(Y1) ; ld (ix+dObjeDispYB_L),l ; ld (ix+dObjeDispYB_H),h ; AlterWindow ld iy,(pcWindow) ; ld l,(ix+dObjeZ_L) ; ld h,(ix+dObjeZ_H) ; ld (iy+dWindZ_L),l ; ld (iy+dWindZ_H),h ; ld hl,(X2) ; inc hl ; ld (iy+dWindL_L),l ; ld (iy+dWindL_H),h ; call SetLMargin ; ld hl,(X1) ; dec hl ; ld (iy+dWindR_L),l ; ld (iy+dWindR_H),h ; call SetRMargin ; ld hl,(Y2) ; inc hl ; ld (iy+dWindU_L),l ; ld (iy+dWindU_H),h ; call SetUMargin ; ld hl,(Y1) ; dec hl ; ld (iy+dWindD_L),l ; ld (iy+dWindD_H),h ; call SetDMargin ; ld bc,lWind ; add iy,bc ; ld hl,$7FFF ; ld (iy+dWindZ_L),l ; ld (iy+dWindZ_H),h ; ld (pcWindow),iy ; ld a,$07 ; ld (WindowMask),a ; ret ; AlterRHS push hl ; ld hl,(pcWindow) ; ld d,h ; ld e,l ; push hl ; pop iy ; ld bc,lWind ; or a ; sbc hl,bc ; ldir ; ld (pcWindow),de ; pop hl ; dec hl ; ld (iy+dWindR_L),l ; ld (iy+dWindR_H),h ; call SetRMargin ; ld l,(ix+dObjeZ_L) ; ld h,(ix+dObjeZ_H) ; ld (iy+dWindZ_L),l ; ld (iy+dWindZ_H),h ; ld hl,$7FFF ; ld (iy+11),l ; ld (iy+12),h ; ret ; DoSizeCycle dec (ix+dObjeCnt) ; jr z,NextCycle ; ld l,(ix+dObjeBdXS_L) ; ld h,(ix+dObjeBdXS_H) ; ld e,(ix+dObjeBXS_L) ; ld d,(ix+dObjeBXS_H) ; add hl,de ; ld (ix+dObjeBXS_L),l ; ld (ix+dObjeBXS_H),h ; ld l,(ix+dObjeBdYS_L) ; ld h,(ix+dObjeBdYS_H) ; ld e,(ix+dObjeBYS_L) ; ld d,(ix+dObjeBYS_H) ; add hl,de ; ld (ix+dObjeBYS_L),l ; ld (ix+dObjeBYS_H),h ; ret ; NextCycle ld hl,dObjepSizeTab_L ; push ix ; pop de ; add hl,de ; ld e,(hl) ; inc hl ; ld d,(hl) ; inc hl ; ex de,hl ; ld a,(hl) ; or a ; jr z,NCloop ; NCa ld bc,5 ; ldir ; ld (ix+dObjepSizeTab_L),l ; ld (ix+dObjepSizeTab_H),h ; ret ; NCloop inc hl ; ld a,(hl) ; inc hl ; ld h,(hl) ; ld l,a ; jp NCa ; X1 defs 2 ; X2 defs 2 ; Y1 defs 2 ; Y2 defs 2 ; X3 defs 2 ; X4 defs 2 ; Y3 defs 2 ; Y4 defs 2 ; X5 defs 2 ; X6 defs 2 ; Y5 defs 2 ; Y6 defs 2 ; TempX defs 2 ; TempY defs 2 ; TempZ defs 2 ; ; Start of PLAYER PlayerFire ld a,0 ; PFDel equ $-1 ; dec a ; PFa ld (PFDel),a ; and $03 ; ret nz ; call kFire ; ld a,1 ; jr z,PFa ; ld bc,0 ; ld de,0 ; ld hl,$0200 ; exx ; ld hl,(FireDZ) ; ld de,(FireDX) ; ld bc,(FireDY) ; exx ; ld a,tProj ; jp CreateObject ; AlterSteps ld de,(XTurn) ; ld bc,0 ; bit 7,d ; jr z,AX1 ; dec bc ; AX1 ld hl,(XTurnSum) ; add hl,de ; ld (XTurnSum),hl ; ld hl,(XTurnSum+2) ; adc hl,bc ; ld (XTurnSum+2),hl ; ld hl,(CellCount) ; inc hl ; ld (CellCount),hl ; call kDeccel ; jr nz,AlterSteps0 ; call kAccel ; jr z,AlterSteps2x ; ld de,Zdvacc ; jr AlterSteps1 ; AlterSteps0 ld de,Zdvdec ; AlterSteps1 ld hl,(DeltaZ) ; add hl,de ; ld de,MinSP ; or a ; sbc hl,de ; jp p,AlterSteps2 ; add hl,de ; ld de,MaxSP ; or a ; sbc hl,de ; jp m,AlterSteps2 ; add hl,de ; ex de,hl ; AlterSteps2 ex de,hl ; ld (DeltaZ),hl ; AlterSteps2x call kLeft ; jr nz,AlterSteps2k ; call kRight ; jp z,AlterSteps3x ; ld a,2 ; jr AlterSteps21 ; AlterSteps2k call kRight ; jr nz,AlterSteps3x ; ld a,1 ; AlterSteps21 ld b,a ; ld a,(OldX) ; cp b ; jr z,AlterSteps2a ; ld hl,Xdtstep ; ld (Xvar),hl ; AlterSteps2a ld hl,(Xvar) ; ld de,dDX ; add hl,de ; ld (Xvar),hl ; ex de,hl ; ld hl,(XTurn) ; ld a,b ; ld (OldX),a ; bit 0,a ; call ASMakeTurn ; ld (XTurn),hl ; jr AlterSteps3 ; AlterSteps3x ld de,Xdtstep ; ld (Xvar),de ; AlterSteps3 call kUp ; jr nz,AlterSteps3k ; call kDown ; jr z,AlterSteps4x ; ld a,2 ; jr AlterSteps31 ; AlterSteps3k call kDown ; jr nz,AlterSteps4x ; ld a,1 ; AlterSteps31 ld b,a ; ld a,(OldY) ; cp b ; jr z,AlterSteps3a ; ld hl,Ydtstep ; ld (Yvar),hl ; AlterSteps3a ld hl,(Yvar) ; ld de,dDY ; add hl,de ; ld (Yvar),hl ; ld a,b ; ld (OldY),a ; bit 0,a ; ex de,hl ; ld hl,(YTurn) ; call ASMakeTurn ; ld (YTurn),hl ; jr AlterSteps4 ; AlterSteps4x ld hl,Ydtstep ; ld (Yvar),hl ; AlterSteps4 ld a,(YTurn+1) ; bit 7,a ; jr z,AlterSteps4a ; ld hl,HighY ; call Inner ; jr nz,AlterSteps5 ; jr AlterSteps4c ; AlterSteps4a ld hl,LowY ; call Inner ; jr z,AlterSteps5 ; AlterSteps4c ld (YTurn),hl ; AlterSteps5 ld hl,(DeltaZ) ; ld de,(YTurn) ; add hl,hl ; add hl,hl ; add hl,hl ; add hl,hl ; call SignMult ; sra h ; rr l ; sra h ; rr l ; sra h ; rr l ; sra h ; rr l ; ld (DeltaY),hl ; call NegHL ; add hl,hl ; ld (FireDY),hl ; ld de,(XTurn) ; ld hl,(DeltaZ) ; add hl,hl ; add hl,hl ; add hl,hl ; add hl,hl ; call SignMult ; sra h ; rr l ; sra h ; rr l ; sra h ; rr l ; sra h ; rr l ; ld (DeltaX),hl ; call NegHL ; add hl,hl ; ld (FireDX),hl ; ld hl,(DeltaZ) ; call NegHL ; add hl,hl ; ld (FireDZ),hl ; ld de,ProjSP ; or a ; sbc hl,de ; or a ; bit 7,h ; ret z ; ld (FireDZ),de ; ld hl,ProjSP ; ld de,(YTurn) ; add hl,hl ; add hl,hl ; add hl,hl ; add hl,hl ; call SignMult ; sra h ; rr l ; sra h ; rr l ; sra h ; rr l ; sra h ; rr l ; ld (FireDY),hl ; ld hl,ProjSP ; ld de,(XTurn) ; add hl,hl ; add hl,hl ; add hl,hl ; add hl,hl ; call SignMult ; sra h ; rr l ; sra h ; rr l ; sra h ; rr l ; sra h ; rr l ; ld (FireDX),hl ; or a ; ret ; Inner ld de,(GroundY) ; or a ; sbc hl,de ; sra h ; rr l ; sra h ; rr l ; ld de,(DeltaZ) ; ex de,hl ; add hl,hl ; add hl,hl ; add hl,hl ; add hl,hl ; ex de,hl ; call SignDiv ; add hl,hl ; add hl,hl ; add hl,hl ; add hl,hl ; ld de,(YTurn) ; or a ; sbc hl,de ; bit 7,h ; add hl,de ; ret ; Xvar defw 3 ; AS4y ld de,Ydtstep ; ld (Yvar),de ; jp AlterSteps4 ; Yvar defw 1 ; OldX defs 1 ; OldY defs 1 ; ASMakeTurn jr z,ASMT1 ; ld a,d ; cpl ; ld d,a ; ld a,e ; cpl ; ld e,a ; inc de ; ASMT1 add hl,de ; bit 7,h ; jr nz,ASMT2 ; dec h ; inc h ; ret z ; ld hl,$00FF ; ret ; ASMT2 inc h ; jr nz,ASMT2a ; dec h ; ret ; ASMT2a ld hl,$FF00 ; ret ; DrawSights ld de,(XTurn) ; ld a,(CType) ; add a,SightClipY & $FF ; ld l,a ; ld a,SightClipY / 256 ; adc a,$00 ; ld h,a ; ld b,(hl) ; ld hl,(YTurn) ; sra h ; rr l ; ld a,l ; xor $80 ; ld l,a ; sra d ; rr e ; ld a,e ; xor $80 ; cp 3 ; jr nc,DrawSights1 ; ld a,3 ; jp DrawSights3 ; DrawSights1 cp 251 ; jr c,DrawSights3 ; ld a,251 ; DrawSights3 ld e,a ; ld h,DivTab / 256 ; ld a,(hl) ; sub 3 ; jr nc,DrawSights3a ; xor a ; DrawSights3a cp b ; jr c,DrawSights3b ; ld a,b ; DrawSights3b ld l,a ; ld a,e ; sub 3 ; rrca ; rrca ; rrca ; and $1F ; ld d,a ; ld a,e ; sub $03 ; and $07 ; add a,a ; add a,a ; add a,a ; add a,a ; ld c,a ; ld b,$00 ; ld ix,Sights ; add ix,bc ; ld e,l ; ld hl,(SighDE) ; or a ; sbc hl,de ; ld a,l ; or h ; jr nz,PutS2 ; push ix ; pop bc ; ld hl,(SighIX) ; or a ; sbc hl,bc ; ld a,l ; or h ; jr z,PutS1 ; PutS2 push ix ; push de ; call UnDrawSights ; pop de ; pop ix ; ld (SighDE),de ; ld (SighIX),ix ; PutS1 ld b,$07 ; PutClp ld l,e ; ld h,YTable / 256 ; ld a,(hl) ; inc h ; ld h,(hl) ; add a,d ; ld l,a ; ld a,(ix+0) ; or (hl) ; ld (hl),a ; inc ix ; inc l ; ld a,(ix+0) ; or (hl) ; ld (hl),a ; inc e ; inc ix ; djnz PutClp ; ret ; SightClipY defb 159,159,161,185 ; UnDrawSights ld de,$0000 ; SighDE equ $-2 ; ld ix,$0000 ; SighIX equ $-2 ; ld b,7 ; RemClp ld l,e ; ld h,YTable / 256 ; ld a,(hl) ; inc h ; ld h,(hl) ; add a,d ; ld l,a ; ld a,(ix+0) ; cpl ; and (hl) ; ld (hl),a ; inc ix ; inc l ; ld a,(ix+0) ; Mutter, mutter (ix+0)... Mutter... cpl ; I mean, what sort of fucking clown and (hl) ; writes a z80 assembler than doesn't ld (hl),a ; understand that (ix) MEANS (ix+0) ?? inc e ; inc ix ; djnz RemClp ; ret ; Sights defb $C6,$00,$C6,$00,$28,$00,$00,$00; defb $28,$00,$C6,$00,$C6,$00,$00,$00; defb $63,$00,$63,$00,$14,$00,$00,$00; defb $14,$00,$63,$00,$63,$00,$00,$00; defb $31,$80,$31,$80,$0A,$00,$00,$00; defb $0A,$00,$31,$80,$31,$80,$00,$00; defb $18,$C0,$18,$C0,$05,$00,$00,$00; defb $05,$00,$18,$C0,$18,$C0,$00,$00; defb $0C,$60,$0C,$60,$02,$80,$00,$00; defb $02,$80,$0C,$60,$0C,$60,$00,$00; defb $06,$30,$06,$30,$01,$40,$00,$00; defb $01,$40,$06,$30,$06,$30,$00,$00; defb $03,$18,$03,$18,$00,$A0,$00,$00; defb $00,$A0,$03,$18,$03,$18,$00,$00; defb $01,$8C,$01,$8C,$00,$50,$00,$00; defb $00,$50,$01,$8C,$01,$8C,$00,$00; InitVars ld hl,0 ; ld (DeltaX),hl ; ld (DeltaY),hl ; ld (XTurn),hl ; ld (YTurn),hl ; ld hl,StartZ ; ld (DeltaZ),hl ; ld hl,0 ; ld (GroundX),hl ; ld (GroundZ),hl ; ld hl,StartY ; ld (GroundY),hl ; xor a ; ld (OldX),a ; ld (OldY),a ; ld hl,$0F59 ; ld (SighDE),hl ; ld hl,$A93F ; ld (SighIX),hl ; ret ; ; End of PLAYER lCodeA defw vPsi9,$2000 ; defw vPsi8,$2000 ; defw vPsi7,$2000 ; defw vPsi6,$2000 ; defw vPsi5,$3000 ; defw vPsi4,$3000 ; defw vPsi3,$2000 ; defw vPsi2,$2000 ; defw vPsi1,$3000 ; defw vPsi2,$3000 ; defw vPsi2,$3000 ; defw vPsi2,$3000 ; defw 0 ; lCodeB defw vPsi7,$2000 ; defw vPsi9,$1000 ; defw vPsi4,$2000 ; defw vPsi18,$2000 ; defw vPsi17,$3000 ; defw vPsi16,$3000 ; defw vPsi15,$2000 ; defw vPsi13,$2000 ; defw vPsi12,$3000 ; defw vPsi5,$3000 ; defw vPsi11,$2000 ; defw vPsi10,$2000 ; defw vPsi13,$4000 ; defw vPsi2,$4000 ; defw vPsi13,$4000 ; defw 0 ; lCodeC defw vPsi7,$2000 ; Oh, to hell with these ;'s! defw vPsi13,$1000 ; You want 'em. you add 'em... defw vPsi6,$2000 defw vPsi5,$2000 defw vPsi12,$3000 defw vPsi19,$3000 defw vPsi4,$2000 defw vPsi8,$2000 defw vPsi12,$3000 defw vPsi8,$3000 defw vPsi20,$2000 defw vPsi5,$3000 defw vPsi12,$3000 defw vPsi24,$3000 defw 0 lCodeD defw vPsi27,$2000 defw vPsi30,$1000 defw vPsi11,$2000 defw vPsi24,$2000 defw vPsi28,$3000 defw vPsi2,$3000 defw vPsi5,$2000 defw vPsi6,$2000 defw vPsi2,$3000 defw vPsi12,$3000 defw vPsi27,$2000 defw vPsi26,$2000 defw vPsi24,$3000 defw vPsi6,$2000 defw vPsi12,$4000 defw 0 lFuelA defw vPsi46,$2000 defw vPsi47,$1000 defw vPsi46,$2000 defw vPsi47,$2000 defw vPsi46,$3000 defw vPsi17,$3000 defw vPsi46,$2000 defw 0 lFuelB defw vPsi46,$2000 defw vPsi27,$1000 defw vPsi46,$2000 defw vPsi8,$2000 defw vPsi47,$3000 defw vPsi6,$3000 defw vPsi3,$2000 defw 0 lFuelC defw vPsi46,$2000 defw vPsi2,$1000 defw vPsi46,$2000 defw vPsi12,$2000 defw vPsi46,$3000 defw vPsi12,$3000 defw vPsi46,$2000 defw 0 lFuelD defw vPsi46,$2000 defw vPsi19,$1000 defw vPsi46,$2000 defw vPsi19,$2000 defw vPsi12,$3000 defw vPsi19,$3000 defw vPsi46,$2000 defw 0 lSAMA defw vPsi8,$3220 defw vPsi2,$2450 defw vPsi11,$3430 defw vPsi2,$3123 defw vPsi28,$3760 defw vPsi2,$3060 defw vPsi5,$2900 defw vPsi2,$2800 defw vPsi15,$3030 defw vPsi2,$3300 defw vPsi2,$2323 defw vPsi2,$3435 defw vPsi6,$2123 defw 0 lSAMB defw vPsi12,$3235 defw vPsi3,$2433 defw vPsi5,$3463 defw vPsi18,$3575 defw vPsi19,$3320 defw vPsi2,$3650 defw vPsi12,$3550 defw vPsi2,$3004 defw vPsi24,$3043 defw vPsi2,$3600 defw 0 lSAMC defw vPsi2,$4000 defw vPsi12,$3000 defw vPsi3,$4000 defw vPsi24,$3000 defw vPsi19,$4000 defw vPsi2,$3000 defw vPsi18,$4000 defw vPsi2,$3000 defw vPsi5,$4000 defw vPsi2,$4400 defw 0 lSAMD defw vPsi13,$3100 defw vPsi12,$3000 defw vPsi13,$3430 defw vPsi12,$3000 defw vPsi16,$3330 defw vPsi2,$3000 defw vPsi16,$3456 defw vPsi18,$3000 defw vPsi5,$3650 defw 0 lThreeA defw vPsi27,$5000 defw vPsi30,$5000 defw vPsi11,$5000 defw vPsi24,$5000 defw vPsi28,$5000 defw vPsi2,$5000 defw vPsi2,$5500 defw 0 lThreeB defw vPsi16,$5000 defw vPsi27,$5000 defw vPsi11,$5000 defw vPsi24,$5000 defw vPsi17,$5000 defw vPsi2,$5000 defw vPsi5,$5000 defw vPsi6,$5000 defw 0 lThreeC defw vPsi27,$5000 defw vPsi11,$5000 defw vPsi16,$5000 defw vPsi24,$5000 defw vPsi2,$5000 defw vPsi2,$5000 defw vPsi5,$5000 defw vPsi15,$5000 defw 0 lThreeD defw vPsi2,$5000 defw vPsi19,$5000 defw vPsi13,$5000 defw vPsi9,$5000 defw vPsi5,$5000 defw vPsi17,$5000 defw vPsi28,$5000 defw vPsi15,$5000 defw 0 lDeath defw vPsi2,$2000 defw vPsi3,$2000 defw vPsi4,$2000 defw vPsi5,$2000 defw vPsi6,$3000 defw vPsi7,$2000 defw vPsi8,$2000 defw vPsi9,$2000 defw vPsi11,$3000 defw vPsi12,$3000 defw 0 Abs equ 0 ; [relents] Oh, all right. RelX equ 1 ; They give a nice, finished appearence RelY equ 2 ; to the line. RelXY equ 3 ; IrisDemo defb tIris or bbFake ; defw -$2000,-800,$6000 ; defb Abs ; defb tIris or bbFake ; defw $2000,-800,$6000 ; defb Abs ; defb tIris ; defw 0,-800,$6100 ; defb Abs ; defb $FF ; HoleDemo defb tFHoleL or bbFake ; defw -$2000,-800,$6000 ; defb Abs ; defb tFHoleL or bbFake ; defw $2000,-800,$6000 ; defb Abs ; defb tFHoleL ; defw 0,-800,$6100 ; defb Abs ; defb $FF ; SAMDemo defb tSAMSqu ; defw -$2000,0,$6000 ; defb Abs ; defb tSAMs ; defw 0,0,$6100 ; defb Abs ; defb tSAMSqu ; defw $2000,0,$6000 ; defb Abs ; defb $FF ; TowerDemo defb tTowerL ; defw -$2000,0,$6000 ; defb Abs ; defb tTowerL ; defw $2000,0,$6000 ; defb Abs ; defb tBunker ; defw 0,0,$6100 ; defb Abs ; defb $FF ; CodeDemo defb tCodeXmit1 ; defw 0,0,$6400 ; defb Abs ; defb $FF ; vPsi1 defb tCodeXmit1 ; defw 0,0,$6000 defb Abs ; defb $FF ; vPsi2 defb tSAMSqu ; defw -$3000,0,$6000 ; defb Abs ; defb tSAMSqu ; defw $3000,0,$6000 ; defb Abs ; defb $FF ; vPsi3 defb tTowerM ; defw 0,0,$6000 ; defb Abs ; defb $FF ; vPsi4 defb tFHoleL or bbFake ; defw -$3000,-1000,$6000 ; defb Abs ; defb tFHoleL or bbFake ; defw $3000,-1000,$6000 ; defb Abs ; defb tFHoleL ; defw 0,-1000,$6080 ; defb Abs ; defb $FF ; vPsi5 defb tTowerM ; defw -$3000,0,$5000 ; defb Abs ; defb tTowerM ; defw $3000,0,$5000 ; defb Abs ; defb tTowerS ; defw 0,0,$6000 ; defb Abs ; defb $FF ; vPsi6 defb tTowerM ; defw -$3000,0,$6000 ; defb Abs ; defb tTowerM ; defw $3000,0,$6000 ; defb Abs ; defb tTowerS ; defw 0,0,$6000 ; defb Abs ; defb $FF ; vPsi7 defb tBunker ; defw -$3000,0,$5000 ; defb Abs ; defb tBunker ; defw $3000,0,$5000 ; defb Abs ; defb tSAMs ; defw -$1000,0,$6000 ; defb Abs ; defb tSAMs ; defw $1000,0,$6000 ; defb Abs ; defb tSAMs ; defw 0,0,$6000 ; defb Abs ; defb $FF ; vPsi8 defb tFHoleM ; defw 0,-$500,$5000 defb Abs ; defb tBunker ; defw 0,0,$5800 defb Abs ; defb tFHoleM ; defw 0,-$1000,$6000 defb Abs ; defb $FF ; vPsi9 defb tTowerM ; defw -$3000,0,$6000 defb Abs ; defb tTowerM ; defw $3000,0,$6000 defb Abs ; defb $FF ; vPsi10 defb tBunker ; defw -$3000,0,$5000 defb Abs ; defb tBunker ; defw $3000,0,$5000 defb Abs ; defb tBunker ; defw 0,0,$4000 defb Abs ; defb tBunker ; defw 0,0,$6000 defb Abs ; defb tCodeXmit ; defw 0,0,$5000 defb Abs ; defb $FF ; vPsi11 defb tFHoleL ; defw 0,-1000,$4800 defb Abs ; defb tTowerM ; defw 0,0,$5000 defb Abs ; defb tSAMs ; defw -$2000,0,$6000 defb Abs ; defb tSAMs ; defw -$1000,0,$6000 defb Abs ; defb tSAMs ; defw $1000,0,$6000 defb Abs ; defb tSAMs ; defw $2000,0,$6000 defb Abs ; defb $FF ; vPsi12 defb tSAMSqu ; defw -$2000,0,$6000 defb Abs ; defb tSAMSqu ; defw $2000,0,$6000 defb Abs ; defb tSAMSqu ; defw 0,0,$6000 defb Abs ; defb $FF ; vPsi13 defb tRising ; defw -$2000,0,$6000 defb Abs ; defb tRising ; defw $2000,0,$6000 defb Abs ; defb $FF ; vPsi14 defb $FF ; vPsi15 defb tTowerM ; defw -$2000,0,$6000 defb Abs ; defb tTowerM ; defw $2000,0,$6000 defb Abs ; defb tTowerS ; defw 0,0,$5000 defb Abs ; defb $FF ; vPsi16 defb tTowerS ; defw 0,0,Attrs defb Abs ; defb tIris ; defw 0,$FC18,$6000 defb Abs ; defb $FF ; vPsi17 defb tTowerL ; defw -$1700,0,$5000 defb Abs ; defb tTowerL ; defw $1700,0,$5000 defb Abs ; defb tBunker ; defw -$3000,0,$6000 defb Abs ; defb tBunker ; defw $3000,0,$6000 defb Abs ; defb tBunker ; defw 0,0,$6000 ; defb Abs ; defb $FF ; vPsi18 defb tTowerL ; defw $E900,0,$5000 defb Abs ; defb tTowerL ; defw $1700,0,$5000 defb Abs ; defb tRising ; defw 0,0,$6000 defb Abs ; defb $FF ; vPsi19 defb tBunker ; defw -$1000,0,$6000 defb Abs ; defb tBunker ; defw $1000,0,$6000 defb Abs ; defb $FF ; vPsi20 defb tCodeXmit ; defw 0,0,$6000 defb Abs ; defb tRising ; defw -$2000,0,$6000 defb Abs ; defb tRising ; defw $2000,0,$6000 defb Abs ; defb $FF ; vPsi21 defb tIris ; defw 0,$FC18,$5000 defb Abs ; defb tSAMs ; defw -$1000,0,Attrs defb Abs ; defb tSAMs ; defw $1000,0,Attrs defb Abs ; defb tFHoleL ; defw 0,$FC18,$6000 defb Abs ; defb $FF ; vPsi24 defb tSAMSqu ; defw -$2000,0,$6000 defb Abs ; defb tSAMSqu ; defw $2000,0,$6000 defb Abs ; defb tSAMs ; defw -$1000,0,$6000 defb Abs ; defb tSAMs ; defw 0,0,$6000 defb Abs ; defb tSAMs ; defw $1000,0,$6000 defb Abs ; defb $FF ; vPsi25 defb tSAMSqu ; defw $E800,0,$6000 defb Abs ; defb tSAMSqu ; defw $1800,0,$6000 defb Abs ; defb tBunker ; defw 0,0,$6000 defb Abs ; defb $FF ; vPsi26 defb tBunker ; defw $E800,0,$6000 defb Abs ; defb tIris ; defw 0,0,$6000 defb Abs ; defb tBunker ; defw $1800,0,$6000 defb Abs ; defb $FF ; vPsi27 defb tBunker ; defw $E800,0,$6000 defb Abs ; defb tBunker ; defw 0,0,$5000 defb Abs ; defb tBunker ; defw $1800,0,$6000 defb Abs ; defb $FF ; vPsi28 defb tIris ; defw 0,$FC18,$6000 defb Abs ; defb $FF ; vPsi29 defb tTowerS ; defw 0,0,$6000 defb Abs ; defb tSAMm ; defw $E800,0,$6000 defb Abs ; defb tSAMs ; defw $D000,0,$6000 defb Abs ; defb tSAMs ; defw $3000,0,$6000 defb Abs ; defb tSAMm ; defw $1800,0,$6000 defb Abs ; defb $FF ; vPsi30 defb tRising ; defw -$2000,0,$6000 defb Abs ; defb tRising ; defw $2000,0,$6000 defb Abs ; defb tBunker ; defw 0,0,$6000 defb Abs ; defb $FF ; vPsi47 defb tFuel ; defw -$2000,$FC18,$6000 defb Abs ; defb tFuel ; defw $2000,$FC18,$6000 defb Abs ; vPsi46 defb tFuel ; defw 0,$FC18,$6000 defb Abs ; defb $FF ; CellVectors defw lThreeA ; defw lThreeB ; defw lThreeC ; defw lThreeA ; defw lThreeB ; defw lThreeC ; defw lThreeA ; defw lThreeC ; defw lStraightB ; defw lStraightC ; defw lStraightD ; defw lStraightE ; defw lWarpGate ; defw lWarpGate ; defw lStraightE ; defw lStraightC ; defw lStraightA ; defw lStraightA ; defw lStraightA ; defw lStraightA ; defw lStraightA ; defw lStraightA ; defw lStraightA ; defw lStraightA ; defw lAntiClock ; defw lAntiClock ; defw lAntiClock ; defw lAntiClock ; defw lAntiClock ; defw lAntiClock ; defw lAntiClock ; defw lAntiClock ; defw lSAMA ; defw lSAMB ; defw lSAMC ; defw lSAMD ; defw lSAMA ; defw lSAMB ; defw lSAMC ; defw lSAMD ; defw lFuelA ; defw lFuelB ; defw lFuelC ; defw lFuelD ; defw lFuelA ; defw lFuelB ; defw lFuelC ; defw lFuelD ; defw lFuelA ; defw lFuelB ; defw lFuelC ; defw lFuelD ; defw lFuelA ; defw lFuelB ; defw lFuelC ; defw lFuelD ; lEnd defw vBlank,$2000 defw 0 lDummy defw vBlank,$4000 defw 0 lAntiClock defw vFHoleLrcent,$5000 defw vFHoleLdleft,$5000 defw vFHoleLleft,$5000 defw vFHoleLleft,$5000 defw vFHoleLleft,$5000 defw vFHoleLleft,$5000 defw vFHoleLleft,$5000 defw vFHoleLleft,$5000 defw vFHoleLleft,$5000 defw vFHoleLleft,$5000 defw 0 lStraightA defw vFHoleLrcent,$5000 defw vFHoleLdright,$5000 defw vFHoleLright,$5000 defw vFHoleLright,$5000 defw vFHoleLright,$5000 defw vFHoleLright,$5000 defw vFHoleLright,$5000 defw vFHoleLright,$5000 defw vFHoleLright,$5000 defw vFHoleLright,$5000 defw 0 lStraightB defw vFHoleLcent,$2000 defw vFakeH2a,$2000 defw vFakeH2b,$2000 defw vFHoleLd1,$2000 defw vFHoleLd11,$1800 defw vFakeH3a,$1800 defw vFHoleScent,$1800 defw vFakeH3c,$1800 defw vFHoleLd11,$2000 defw vFHoleLd1,$1800 defw vFakeH3c,$7000 defw 0 lStraightC defw vFakeH3a,$3000 defw vFakeI3c,$3000 defw vFakeH2b,$3000 defw vFHoleLd1,$4000 defw vHolenSAM1,$1800 defw vFakeH3a,$1800 defw vFakeH3c,$7000 defw 0 lStraightD defw vFakeH3a,$1800 defw vFakeH2b,$5000 defw vSAM5sa,$2000 defw vFHoleLcent,$3000 defw vHolenSAM1,$1800 defw vFakeH3a,$1800 defw vFakeH3c,$7000 defw 0 lStraightE defw vFakeH2a,$2000 defw vFakeH2b,$2000 defw vFakeH2a,$2000 defw vFakeH2b,$2000 defw vFakeH2a,$2000 defw vFakeH2b,$2000 defw vFakeH3c,$2000 defw vFakeH2a,$2000 defw vFakeH2b,$2000 defw 0 lWarpGate defw vFakeH2a,$2000 defw vFakeH2b,$2000 defw vFakeH2a,$2000 defw vFakeH2b,$2000 defw vFakeH2a,$2000 defw vFakeH2b,$2000 defw vFakeH3c,$2000 defw vFakeH2a,$2000 defw vFakeH2b,$2000 defw 0 lWarpGate2 defw vFakeH2a,$2000 defw vFakeH2b,$2000 defw vFakeH2a,$2000 defw vFakeH2b,$2000 defw vFakeH2a,$2000 defw vFakeH2b,$2000 defw vFakeH3c,$2000 defw vFakeH2a,$4000 defw vWarp,$4000 defw vBlank,$4000 defw vBlank,$2000 defw 0 vBlank defb $FF ; vtTower defb tTowerL ; defw 0,0,$7000 defb Abs ; defb $FF ; vtMine defb tMine ; defw 0,0,$7000 defb Abs ; defb $FF ; vFakeI1a defb tIris or bbFake ; defw 0,$FC18,$7000 defb Abs ; defb $FF ; vFakeH1a defb tFHoleL or bbFake ; defw 0,$FC18,$7000 defb Abs ; defb $FF ; vFakeI2a defb tIris or bbFake ; defw $FC18,$FC18,$7000 defb Abs ; defb tIris ; defw $03E8,$FC18,$7100 defb Abs ; defb $FF ; vFakeI2b defb tIris or bbFake ; defw $03E8,$FC18,$7000 defb Abs ; defb tIris ; defw $FC18,$FC18,$7100 defb Abs ; defb $FF ; vFakeH2a defb tFHoleL or bbFake ; defw $FC18,$FC18,$7000 defb Abs ; defb tFHoleL ; defw $03E8,$FC18,$7100 defb Abs ; defb $FF ; vFakeH2b defb tFHoleL or bbFake ; defw $03E8,$FC18,$7000 defb Abs ; defb tFHoleL ; defw $FC18,$FC18,$7100 defb Abs ; defb $FF ; vFakeI3a defb tIris or bbFake ; defw $F830,$FC18,$7000 defb Abs ; defb tIris or bbFake ; defw 0,$FC18,$7000 defb Abs ; defb tIris ; defw $07D0,$FC18,$7100 defb Abs ; defb $FF ; vFakeI3b defb tIris or bbFake ; defw $F830,$FC18,$7000 defb Abs ; defb tIris or bbFake ; defw $07D0,$FC18,$7000 defb Abs ; defb tIris ; defw 0,$FC18,$7100 defb Abs ; defb $FF ; vFakeI3c defb tIris or bbFake ; defw 0,$FC18,$7000 defb Abs ; defb tIris or bbFake ; defw $07D0,$FC18,$7000 defb Abs ; defb tIris ; defw $F830,$FC18,$7100 defb Abs ; defb $FF ; vFakeH3a defb tFHoleL or bbFake ; defw $F830,$FC18,$7000 defb Abs ; defb tFHoleL or bbFake ; defw 0,$FC18,$7000 defb Abs ; defb tFHoleL ; defw $07D0,$FC18,$7100 defb Abs ; defb $FF ; vFakeH3b defb tFHoleL or bbFake ; defw $F830,$FC18,$7000 defb Abs ; defb tFHoleL or bbFake ; defw $07D0,$FC18,$7000 defb Abs ; defb tFHoleL ; defw 0,$FC18,$7100 defb Abs ; defb $FF ; vFakeH3c defb tFHoleL or bbFake ; defw 0,$FC18,$7000 defb Abs ; defb tFHoleL or bbFake ; defw $07D0,$FC18,$7000 defb Abs ; defb tFHoleL ; defw $F830,$FC18,$7100 defb Abs ; defb $FF ; vHolenSAM1 defb tIris ; defw 0,$FC18,$5000 defb Abs ; defb tSAMss ; defw 0,0,$4800 defb Abs ; defb $FF ; vFHoleLcent defb tFHoleL ; defw 0,$FC18,$6000 defb Abs ; defb $FF ; vFHoleLrcent defb tFHoleL ; defw 0,$FC18,$6000 defb RelX ; defb $FF ; vFHoleLdright defb tFHoleL ; defw $3000,$FC18,$6000 defb RelX ; defb $FF ; vFHoleLdleft defb tFHoleL ; defw $D000,$FC18,$6000 defb RelX ; defb $FF ; vFHoleLd1 defb tFHoleL ; defw $F830,$FC18,$6000 defb Abs ; defb $FF ; vFHoleLd11 defb tFHoleL ; defw $F060,$FC18,$6000 defb Abs ; defb $FF ; vFHoleScent defb tFHoleS ; defw 0,$FC18,$6000 defb Abs ; defb $FF ; vFHoleMcent defb tFHoleM ; defw 0,$FC18,$6000 defb Abs ; defb $FF ; vFHoleLleft defb tFHoleL ; defw $B000,$FC18,$6000 defb RelX ; defb $FF ; vFHoleSleft defb tFHoleS ; defw $B000,$FC18,$6000 defb Abs ; defb $FF ; vFHoleMleft defb tFHoleM ; defw $B000,$FC18,$6000 defb Abs ; defb $FF ; vFHoleLright defb tFHoleL ; defw $5000,$FC18,$6000 defb RelX ; defb $FF ; vFHoleSright defb tFHoleS ; defw $5000,$FC18,$6000 defb Abs ; defb $FF ; vFHoleMright defb tFHoleM ; defw $5000,$FC18,$6000 defb Abs ; defb $FF ; vSAM1acent defb tSAMs ; defw 0,0,$6000 defb Abs ; defb $FF ; vSAM3a defb tSAMs ; defw $E0C0,0,$7000 defb Abs ; defb tSAMm ; defw 0,0,$7000 defb Abs ; defb tSAMs ; defw $1F40,0,$7000 defb Abs ; defb $FF ; vSAM4a defb tSAMf ; defw $C950,0,$4000 defb Abs ; defb tSAMf ; defw $36B0,0,$4000 defb Abs ; defb tSAMm ; defw $E0C0,0,$5000 defb Abs ; defb tSAMm ; defw $1F40,0,$5000 defb Abs ; defb $FF ; vSAM3b defb tSAMs ; defw $C950,0,Attrs defb Abs ; defb tSAMf ; defw 0,0,$3400 defb Abs ; defb tSAMs ; defw $36B0,0,Attrs defb Abs ; defb $FF ; vSAM2a defb tSAMas ; defw $DCD8,0,$4800 defb Abs ; defb tSAMas ; defw $2328,0,$4800 defb Abs ; defb $FF ; vSAM5sa defb tSAMss ; defw $BD98,0,Attrs defb Abs ; defb tSAMss ; defw $E4A8,0,$6000 defb Abs ; defb tSAMss ; defw 0,0,RhinoList defb Abs ; defb tSAMss ; defw $1B58,0,$6000 defb Abs ; defb tSAMss ; defw $4268,0,Attrs defb Abs ; defb $FF ; vWarp defb tWarp ; defw 0,$F830,$6000 ; defb Abs ; defb $FF ; InitMap ld hl,Map ; ld bc,$200 ; IMlp ld a,(hl) ; cp $FA ; jr nz,IM1 ; inc (hl) ; IM1 cpi ; jp pe,IMlp ; ld hl,Map+$21 ; ld (pMap),hl ; ld a,(CType) ; ld hl,ArrowPos1 ; or a ; jr z,IMa ; ld hl,ArrowPos2 ; cp 3 ; jr c,IMa ; ld hl,0 ; IMa ld (ArrowPos),hl ; ld a,3 ; ld (Angle),a ; call Print8x8 ; jr InitMapLocal ; DoMapMove ld a,(Mode) ; cp ModeDemo ; ret z ; call AlterAngle ; InitMapLocal ld hl,0 ; ld (XTurnSum),hl ; ld (XTurnSum+2),hl ; ld (CellCount),hl ; ld hl,(pMap) ; ld a,(hl) ; cp $FF ; ld ix,lDeath ; jp z,NextList ; cp $FA ; jr z,GetBase ; cp $FB ; jr z,GetBase ; cp $FE ; jr z,SetRandom ; cp $FD ; jr z,LeavePlanet ; cp $FC ; ld ix,lWarpGate2 ; jp z,NextList ; cp $30 ; jr nc,SetRandom ; NewSquareAcc add a,a ; add a,CellVectors & $FF ; ld l,a ; ld a,CellVectors / 256 ; adc a,0 ; ld h,a ; ld a,(hl) ; inc hl ; ld h,(hl) ; ld l,a ; push hl ; pop ix ; jp NextList ; SetRandom ld a,r ; and $3F ; cp $30 ; jr c,NewSquareAcc ; jr SetRandom ; GetBase ld a,r ; and $06 ; add a,BaseVectors & $FF ; ld l,a ; ld a,BaseVectors / 256 ; adc a,0 ; ld h,a ; ld a,(hl) ; inc hl ; ld h,(hl) ; ld l,a ; push hl ; pop ix ; jp NextList ; BaseVectors defw lCodeA,lCodeB,lCodeC,lCodeD LeavePlanet ld a,GameFinished ; ld (EndState),a ; ld ix,lEnd ; jp NextList ; AlterAngle ld hl,(CellCount) ; xor a ; add hl,hl ; adc a,a ; add hl,hl ; adc a,a ; add hl,hl ; adc a,a ; add hl,hl ; adc a,a ; add hl,hl ; adc a,a ; add hl,hl ; adc a,a ; ld d,h ; ld e,l ; ld b,a ; add hl,hl ; adc a,a ; add hl,de ; adc a,b ; ld b,a ; ld a,l ; ld l,h ; ld h,b ; ld de,(XTurnSum+1) ; bit 7,d ; jr nz,DMapA ; or a ; sbc hl,de ; jr nc,DMapB ; ld a,(Angle) ; inc a ; and $07 ; ld (Angle),a ; jr DMapB ; DMapA add hl,de ; jr c,DMapB ; ld a,(Angle) ; dec a ; and $07 ; ld (Angle),a ; DMapB ld a,(Angle) ; ld hl,(ArrowPos) ; call Print8x8 ; ld hl,(pMap) ; inc a ; and $07 ; cp 3 ; call c,SteppMapU ; sub 2 ; cp 3 ; call c,SteppMapR ; sub 2 ; cp $03 ; call c,SteppMapD ; sub 2 ; cp $03 ; call c,SteppMapL ; cp $FA ; call z,SteppMapL ; ld (pMap),hl ; ret ; AddObjects ld hl,(Distance) ; ld de,(DeltaZ) ; add hl,de ; ld (Distance),hl ; bit 7,h ; ret z ; ld ix,(pObjectList) ; NextList ld l,(ix+dL_pList_L) ; ld h,(ix+dL_pList_H) ; ld a,l ; or h ; jp z,DoMapMove ; ld e,(ix+dL_Z_L) ; ld d,(ix+dL_Z_H) ; inc ix ; inc ix ; inc ix ; inc ix ; ld (pObjectList),ix ; push hl ; pop ix ; ld hl,(Distance) ; add hl,de ; ld (Distance),hl ; NextObje ld a,(ix+dOL_Type) ; cp $FF ; ret z ; ld e,(ix+dOL_X_L) ; ld d,(ix+dOL_X_H) ; ld c,(ix+dOL_Y_L) ; ld b,(ix+dOL_Y_H) ; bit 0,(ix+dOL_ListFlag) ; jr nz,NOa ; ld hl,(GroundX) ; add hl,de ; ex de,hl ; NOa bit 1,(ix+dOL_ListFlag) ; jr nz,NOb ; ld hl,(GroundY) ; add hl,bc ; ld b,h ; ld c,l ; NOb ld l,(ix+dOL_Z_L) ; ld h,(ix+dOL_Z_H) ; exx ; ld hl,0 ; ld de,0 ; ld bc,0 ; exx ; push ix ; call CreateObject ; pop ix ; ld de,lList ; add ix,de ; jp NextObje ; pObjectList defs 2 ; YeEnd equ $ ; End of OBJECTS org $E000 ; YTable defs 256 * 2 ; DivTab defs 256 ; BitTab defs 8 * 3 ; Colour defs 1 ; cSoundVal defs 1 ; GameAttr defs 1 ; WindowMask defs 1 ; pObjeList defs 2 ; pMap defs 2 ; Angle defs 1 ; ArrowPos defs 2 ; cnStars defs 1 ; DeltaX defs 2 ; DeltaY defs 2 ; DeltaZ defs 2 ; GroundX defs 2 ; GroundY defs 2 ; GroundZ defs 2 ; XTurn defs 2 ; YTurn defs 2 ; XTurnSum defs 4 ; CellCount defs 2 ; FireDX defs 2 ; FireDY defs 2 ; FireDZ defs 2 ; Distance defs 2 ; pcWindow defs 2 ; StarTable defs nStars * lStar ; ObjeTable defs nObjes * lObje ; LineTable defs nLines * lLine ; defs 12 ; ?? Gawd knows... WindowTable equ $ ; Plus an unknown number of elephants!!!