p_AsmHeader: .db 2 .dw $6DBB p_IonHeader: .db 3 xor a jr nc,start .db rp_Byte,1 p_MOSHeader: .db 32 ret .db 1 .db %00000001,%00000000 .db %00011010,%10110000 .db %00111110,%11111000 .db %00111111,%11111000 .db %00111111,%11111000 .db %00111110,%11111000 .db %00011010,%10110000 .db %00001010,%10100000 .db %00000010,%10000000 .db %11111110,%11111110 .db %11001101,%01000010 .db %10110101,%01011110 .db %10000110,%11000110 .db %10110101,%01011110 .db %10110101,%01000010 p_DCSHeader: .db 44 xor d ret jr $+42 .dw $9DC1 .db $05,$00 .dw $9DA1 .dw $0000 .db %00000001,%10000000 .db %00011010,%01011000 .db %00111110,%01111100 .db %00111111,%11111100 .db %00111111,%11111100 .db %00111110,%01111100 .db %00011010,%01011000 .db %00001010,%01010000 .db %00000010,%01000000 .db %11111110,%01111111 .db %11001101,%10100001 .db %10110101,%10101111 .db %10000110,%01100011 .db %10110101,%10101111 .db %10110101,%10100001 .db %11111111,%11111111 Start: ;Saving and loading numbers ;----------------------------------------------- p_LoadConstInt: .db 3 ld hl,$0000 .db rp_Ans,2 p_LoadInt: .db 3 ld hl,($0000) .db rp_Ans,2 p_LoadSymbol: .db 3 ld hl,$0000 .db rp_Sym,2 p_SaveInt: .db 3 ld ($0000),hl .db rp_Ans,2 p_LoadConstInt2: .db 3 ld de,$0000 .db rp_Ans,2 p_LoadInt2: .db 4 ld de,($0000) .db rp_Ans,2 p_PushHL: .db 1 push hl p_PopDE: .db 1 pop de p_PopBC: .db 1 pop bc p_ExHLDE: .db 1 ex de,hl p_LdPtr: .db 3 ld l,(hl) ld h,0 p_LdPtr2: .db 4 ld a,(hl) inc hl ld h,(hl) ld l,a p_SavePtr: .db 1 ld (hl),e p_SavePtr2: .db 3 ld (hl),e inc hl ld (hl),d p_LdSelf: .db 2 ld d,h ld e,l ;Data Manipulation ;----------------------------------------------- p_Fill: .db 8 HL_INTO_BC() pop hl HL_INTO_DE() inc de ldir p_Copy: .db 6 HL_INTO_BC() pop de pop hl ldir p_Exchange: .db 14 HL_INTO_BC() pop de pop hl ld a,(de) ldi dec hl ld (hl),a inc hl ld a,b or c jr nz,$-8 ;Comparing numbers ;----------------------------------------------- p_IntEq: .db 8 xor a sbc hl,de ld h,a ld l,a jr nz,$+3 inc l p_IntNe: .db 8 xor a sbc hl,de jr z,$+5 ld hl,1 p_IntGt: .db 7 ex de,hl xor a sbc hl,de ld h,a rla ld l,a p_IntGe: .db 7 xor a sbc hl,de ld h,a ccf rla ld l,a p_IntLt: .db 6 xor a sbc hl,de ld h,a rla ld l,a p_IntLe: .db 8 ex de,hl xor a sbc hl,de ld h,a ccf rla ld l,a p_EQZero: .db 8 ld a,l or h jr z,$+5 ld hl,255 inc l p_EQOne: .db 8 ld a,l dec a or h jr z,$+5 ld hl,0 p_EQX: .db 10 ld a,l sub $00 or h ld hl,1 jr z,$+3 dec l .db rp_Byte,8 p_NEZero: .db 7 ld a,l or h jr z,$+5 ld hl,1 p_NEOne: .db 8 ld a,h dec l or l jr z,$+5 ld hl,1 p_NEX: .db 10 ld a,l sub $00 ld l,a or h jr z,$+5 ld hl,1 .db rp_Byte,8 ;Signed Stuff ;----------------------------------------------- p_SIntGt: .db 12 ex de,hl xor a ld b,h sbc hl,de ld h,a rla xor b xor d and 1 ld l,a p_SIntGe: .db 12 xor a ld b,h sbc hl,de ld h,a ccf rla xor b xor d and 1 ld l,a p_SIntLt: .db 11 xor a ld b,h sbc hl,de ld h,a rla xor b xor d and 1 ld l,a p_SIntLe: .db 13 ex de,hl xor a ld b,h sbc hl,de ld h,a ccf rla xor b xor d and 1 ld l,a ;Addition and Subtraction ;----------------------------------------------- p_IncHL: .db 1 inc hl p_DecHL: .db 1 dec hl p_AddHLHL: .db 1 add hl,hl p_srlHL: .db 4 srl h rr l p_DivHL128: .db 5 xor a add hl,hl rla ld l,h ld h,a p_IntAdd: .db 1 add hl,de p_IntAdd256: .db 1 inc h p_IntSub: .db 3 or a sbc hl,de p_IntSub256: .db 1 dec h p_IntNeg: .db 6 xor a sub l ld l,a sbc a,a sub h ld h,a p_AbsInt: .db 10 bit 7,h jr z,$+8 xor a sub l ld l,a sbc a,a sub h ld h,a p_MiniSigned: .db 5 ld a,(hl) ld l,a rlca sbc a,a ld h,a ;Bit Operations ;----------------------------------------------- p_FPart: .db 2 ld h,0 p_FPart2: .db 3 ld h,l ld l,0 p_Ipart: .db 3 ld l,h ld h,0 p_Ipart2: .db 2 ld l,0 p_IntOr: .db 6 ld a,h or d ld h,a ld a,l or e ld l,a p_IntAnd: .db 6 ld a,h and d ld h,a ld a,l and e ld l,a p_IntXor: .db 6 ld a,h xor d ld h,a ld a,l xor e ld l,a p_Mod2: .db 5 xor a ld h,a inc a and l ld l,a p_Mod128: .db 4 ld h,0 res 7,l p_ModX: .db 6 ld h,0 ld a,l and $00 ld l,a .db rp_Byte,2 ;Control Structures ;----------------------------------------------- p_Jp: .db 3 jp $0000 .db rp_Ans,2 p_JpSymbol: .db 3 jp $0000 .db rp_Sym,2 p_JpIfZero: .db 5 ld a,h or l jp z,$0000 .db rp_Sym,2 p_JpIfNotZero: .db 5 ld a,h or l jp nz,$0000 .db rp_Sym,2 p_JpCpHLDE: .db 6 or a sbc hl,de jp c,$0000 .db rp_Sym,2 p_Call: .db 3 call $0000 .db rp_Ans,2 p_CallSymbol: .db 3 call $0000 .db rp_Sym,2 p_Ret: .db 1 ret p_RetIfTrue: .db 3 ld a,h or l ret nz p_RetIfFalse: .db 3 ld a,h or l ret z p_SkipNext4: .db 2 jr $+6 ;Text ;----------------------------------------------- p_DispInt: .db 3 B_CALL(_DispHL) p_DispStr: .db 3 B_CALL(_PutS) p_DispChar: .db 4 ld a,l B_CALL(_PutC) p_NewLine: .db 3 B_CALL(_NewLine) p_SetCurRow: .db 4 ld a,l ld (CurRow),a p_SetCurCol: .db 4 ld a,l ld (CurCol),a p_SetCurColRow: .db 3 ld (CurRow),hl p_DrawStr: .db 10 pop de pop bc ld b,e ld (PenCol),bc B_CALL(_VPutS) p_TextSmall: .db 4 res 2,(iy+50) p_TextLarge: .db 4 set 2,(iy+50) p_TextNorm: .db 4 res 3,(iy+5) p_TextInv: .db 4 set 3,(iy+5) p_TextScrn: .db 4 res 7,(iy+20) p_TextBuf: .db 4 set 7,(iy+20) ;Screen ;----------------------------------------------- p_ClearScreen: .db 9 SETCUR(0,0) B_CALL(_ClrScrnFull) p_ClearBuffer: .db 3 B_CALL(_GrBufClr) p_CopyBuffer: .db 3 B_CALL(_GrBufCpy) p_SaveToBuffer: .db 6 ld hl,plotSScreen B_CALL(_SaveDisp) p_InvBuff: .db __InvBuffEnd-1-$ jr __InvBuffEnd ld hl,plotSScreen ld bc,768 __InvBuffLoop: ld a,(hl) cpl ld (hl),a inc hl dec bc ld a,b or c jr nz,__InvBuffLoop ret __InvBuffEnd: p_FastCopy: .db __FastCopyEnd-1-$ jr __FastCopyEnd FastCopy: di ld a,$80 out ($10),a ld hl,plotSScreen+(12*63)-1 ld c,$20 __FastCopyAgain: ld b,64 ld de,1-(12*64) add hl,de ld de,12 SCREENWAIT() ld a,c out ($10),a inc c __FastCopyLoop: add hl,de SCREENWAIT() ld a,(hl) out ($11),a djnz __FastCopyLoop ld a,c cp $2B+1 jr nz,__FastCopyAgain ei ret __FastCopyEnd: p_FrontToBack: .db 11 ld hl,plotSScreen ld de,appBackUpScreen ld bc,768 ldir p_BackToFront: .db 11 ld hl,appBackUpScreen ld de,plotSScreen ld bc,768 ldir ;Screen Shifting ;----------------------------------------------- p_ShiftLeft: .db __ShiftLeftEnd-1-$ jr __ShiftLeftEnd ld hl,plotSScreen+767 ld c,64 __ShiftLeftLoop: ld b,12 or a __ShiftLeftShift: rl (hl) dec hl djnz __ShiftLeftShift dec c jr nz,__ShiftLeftLoop ret __ShiftLeftEnd: p_ShiftRight: .db __ShiftRightEnd-1-$ jr __ShiftRightEnd ld hl,plotSScreen ld c,64 __ShiftRightLoop: ld b,12 or a __ShiftRightShift: rr (hl) inc hl djnz __ShiftRightShift dec c jr nz,__ShiftRightLoop ret __ShiftRightEnd: p_ShiftUp: .db __ShiftUpEnd-1-$ jr __ShiftUpEnd ld hl,plotSScreen+12 ld de,plotSScreen ld bc,768-12 ldir ret __ShiftUpEnd: p_ShiftDown: .db __ShiftDownEnd-1-$ jr __ShiftDownEnd ld hl,plotSScreen+767-12 ld de,plotSScreen+767 ld bc,768-12 lddr ret __ShiftDownEnd: ;Input ;----------------------------------------------- p_GetKey: .db 6 B_CALL(_GetCSC) ld h,0 ld l,a .db 1 p_DKey: .db __DKeyEnd-1-$ jr __DKeyEnd ld a,h out (1),a ld h,0 in a,(1) and l ld l,h ret nz inc l ret __DKeyEnd: p_DKeyAll: .db 8 xor a out (1),a ld h,a in a,(1) inc a ld l,a __DKeyAllEnd: p_Rand: .db __RandEnd-1-$ jr __RandEnd ld hl,(vx_Seed) ld a,r ld d,a ld e,(hl) add hl,de xor (hl) ld e,a add hl,de ld (vx_Seed),hl ret __RandEnd: ;System ;----------------------------------------------- p_DiagOn: .db 7 B_CALL(_RunIndicOn) set 5,(iy+0) p_DiagOff: .db 7 B_CALL(_RunIndicOff) res 5,(iy+0) p_FullSpeed: .db 9 FULLSPEED() ld l,a ld h,a p_NormalSpeed: .db 3 xor a out ($20),a p_Pause: .db 7 djnz $+0 dec hl ld a,l or h jr nz,$-5 p_FreqOut: .db __FreqOutEnd-1-$ jr __FreqOutEnd __FreqOutLoop1: ld d,e LINKOUT($00) __FreqOutLoop2: dec hl ld a,h or l ret z dec d jr nz,__FreqOutLoop2 LINKOUT($03) jr __FreqOutLoop1 __FreqOutEnd: p_AutoScroll: .db 4 set 2,(iy+13) p_Contrast: .db 5 ld a,l or %11000000 out ($10),a ;Multiplication and division ;----------------------------------------------- p_Mul: .db __MulEnd-1-$ jr __MulEnd Multiply: ld b,h ld c,l ld hl,0 ld a,16 __MulNext: add hl,hl rl e rl d jr nc,__MulSkip add hl,bc jr nc,__MulSkip inc de __MulSkip: dec a jr nz,__MulNext ret __MulEnd: p_Div: .db __DivEnd-1-$ jr __DivEnd Divide: ld a,h ld c,l ld hl,0 ld b,16 __DivLoop: scf rl c rla adc hl,hl sbc hl,de jr nc,__DivSkip add hl,de dec c __DivSkip: djnz __DivLoop ld h,a ld l,c ret __DivEnd: p_DivShort: .db __DivShortEnd-1-$ jr __DivShortEnd xor a ld b,16 __DivShortLoop: add hl,hl rla cp e jr c,__DivShortSkip sub e inc l __DivShortSkip: djnz __DivShortLoop ret __DivShortEnd: p_Mod: .db __ModEnd-1-$ jr __ModEnd ld a,h ld c,l ld hl,0 ld b,16 __ModLoop: scf rl c rla adc hl,hl sbc hl,de jr nc,__ModSkip add hl,de dec c __ModSkip: djnz __ModLoop ret __ModEnd: p_MulBy3: .db 4 ld d,h ld e,l add hl,hl add hl,de p_MulBy5: .db 5 ld d,h ld e,l add hl,hl add hl,hl add hl,de p_MulBy6: .db 5 ld d,h ld e,l add hl,hl add hl,de add hl,hl p_MulBy7: .db 6 ld d,h ld e,l add hl,hl add hl,de add hl,hl add hl,de p_MulBy9: .db 6 ld d,h ld e,l add hl,hl add hl,hl add hl,hl add hl,de p_MulBy10: .db 6 ld d,h ld e,l add hl,hl add hl,hl add hl,de add hl,hl p_MulBy12: .db 6 ld d,h ld e,l add hl,hl add hl,de add hl,hl add hl,hl ;Pixel Routines ;----------------------------------------------- p_Pix: .db __PixEnd-1-$ jr __PixEnd ld a,l add a,a add a,l ld l,a add hl,hl add hl,hl ld bc,plotSScreen add hl,bc ld a,e srl e srl e srl e add hl,de and %00000111 ld b,a ld a,%10000000 ret z ___GetPixLoop: rrca djnz ___GetPixLoop ret __PixEnd: p_SetPix: .db 2 or (hl) ld (hl),a p_ResPix .db 3 cpl and (hl) ld (hl),a p_InvPix: .db 2 xor (hl) ld (hl),a p_GetPix: .db 7 and (hl) ld hl,0 jr z,$+3 inc l p_MOSSetPix: .db 4 ld h,e call $40BF ;pixelonhl p_MOSResPix: .db 4 ld h,e call $40CB ;pixeloffhl p_MOSInvPix: .db 4 ld h,e call $40DE ;pixelxorhl p_MOSGetPix: .db 10 ld h,e call $40D1 ;pixeltesthl ld hl,0 jr z,$+3 inc l ;Sprite Routines ;----------------------------------------------- p_DrawOr: .db __DrawOrEnd-1-$ jr __DrawOrEnd push hl pop ix ;Input hl = Sprite ld b,7 ;Input c = Sprite X Position ld d,0 ;Input e = Sprite Y Position ld h,d ld a,c add a,b jr c,__DrawOrClipLeft sub 96+7 ret nc cpl cp b jr nc,__DrawOrNoClipH __DrawOrClipRight: inc d jr __DrawOrClipHDone __DrawOrClipLeft: add a,89 ld c,a __DrawOrClipHDone: inc d ;d,c,e are updated __DrawOrNoClipH: ld a,e add a,b jr c,__DrawOrClipTop sub 64+7 ret nc cpl cp b jr nc,__DrawOrNoClipV jr __DrawOrClipBottom __DrawOrClipTop: inc ix inc e jr nz,__DrawOrClipTop __DrawOrClipBottom: ld b,a __DrawOrNoClipV: ;b,ix,e are updated. dec d jr z,__DrawOrNoFix inc e __DrawOrNoFix: push de ld l,e ld d,h add hl,hl add hl,de add hl,hl add hl,hl ld e,c ld a,e srl e srl e srl e add hl,de ld de,plotSScreen-11 add hl,de pop de inc b and %00000111 jr z,__DrawOrAligned ld c,a __DrawOrLoop: push bc ld b,c ld c,(ix+0) xor a __DrawOrShift: srl c rra djnz __DrawOrShift dec d jr z,__DrawOrSkipRight or (hl) ld (hl),a __DrawOrSkipRight: dec hl inc d jr z,__DrawOrSkipLeft ld a,c or (hl) ld (hl),a __DrawOrSkipLeft: ld c,13 add hl,bc inc ix pop bc djnz __DrawOrLoop ret __DrawOrAligned: dec hl ld de,12 __DrawOrAlignedLoop: ld a,(ix+0) or (hl) ld (hl),a inc ix add hl,de djnz __DrawOrAlignedLoop ret __DrawOrEnd: p_DrawXor: .db __DrawXorEnd-1-$ jr __DrawXorEnd push hl pop ix ;Input hl = Sprite ld b,7 ;Input c = Sprite X Position ld d,0 ;Input e = Sprite Y Position ld h,d ld a,c add a,b jr c,__DrawXorClipLeft sub 96+7 ret nc cpl cp b jr nc,__DrawXorNoClipH __DrawXorClipRight: inc d jr __DrawXorClipHDone __DrawXorClipLeft: add a,89 ld c,a __DrawXorClipHDone: inc d ;d,c,e are updated __DrawXorNoClipH: ld a,e add a,b jr c,__DrawXorClipTop sub 64+7 ret nc cpl cp b jr nc,__DrawXorNoClipV jr __DrawXorClipBottom __DrawXorClipTop: inc ix inc e jr nz,__DrawXorClipTop __DrawXorClipBottom: ld b,a __DrawXorNoClipV: ;b,ix,e are updated. dec d jr z,__DrawXorNoFix inc e __DrawXorNoFix: push de ld l,e ld d,h add hl,hl add hl,de add hl,hl add hl,hl ld e,c ld a,e srl e srl e srl e add hl,de ld de,plotSScreen-11 add hl,de pop de inc b and %00000111 jr z,__DrawXorAligned ld c,a __DrawXorLoop: push bc ld b,c ld c,(ix+0) xor a __DrawXorShift: srl c rra djnz __DrawXorShift dec d jr z,__DrawXorSkipRight xor (hl) ld (hl),a __DrawXorSkipRight: dec hl inc d jr z,__DrawXorSkipLeft ld a,c xor (hl) ld (hl),a __DrawXorSkipLeft: ld c,13 add hl,bc inc ix pop bc djnz __DrawXorLoop ret __DrawXorAligned: dec hl ld de,12 __DrawXorAlignedLoop: ld a,(ix+0) xor (hl) ld (hl),a inc ix add hl,de djnz __DrawXorAlignedLoop ret __DrawXorEnd: p_DrawOff: .db __DrawOffEnd-1-$ jr __DrawOffEnd2 push hl pop ix ;Input hl = Sprite ld b,7 ;Input c = Sprite X Position ld d,0 ;Input e = Sprite Y Position ld h,d ld a,c add a,b jr c,__DrawOffClipLeft sub 96+7 ret nc cpl cp b jr nc,__DrawOffNoClipH __DrawOffClipRight: inc d jr __DrawOffClipHDone __DrawOffClipLeft: add a,89 ld c,a __DrawOffClipHDone: inc d ;d,c,e are updated __DrawOffNoClipH: ld a,e add a,b jr c,__DrawOffClipTop sub 64+7 ret nc cpl cp b jr nc,__DrawOffNoClipV jr __DrawOffClipBottom __DrawOffClipTop: inc ix inc e jr nz,__DrawOffClipTop __DrawOffClipBottom: ld b,a __DrawOffNoClipV: ;b,ix,e are updated. dec d jr z,__DrawOffNoFix inc e __DrawOffNoFix: push de ld l,e ld d,h add hl,hl add hl,de add hl,hl add hl,hl ld e,c ld a,e srl e srl e srl e add hl,de ld de,plotSScreen-11 add hl,de pop de inc b and %00000111 jr z,__DrawOffAligned ld c,a __DrawOffLoop: push bc ld b,c ld c,(ix+0) xor a ld e,a inc a __DrawOffShift: srl c rr e rrca djnz __DrawOffShift dec a dec d jr z,__DrawOffSkipRight ld b,a and (hl) or e ld (hl),a ld a,b __DrawOffSkipRight: dec hl inc d jr z,__DrawOffSkipLeft cpl and (hl) or c ld (hl),a __DrawOffSkipLeft: ld bc,13 add hl,bc inc ix pop bc djnz __DrawOffLoop ret __DrawOffEnd2: jr __DrawOffEnd __DrawOffAligned: dec hl ld de,12 __DrawOffAlignedLoop: ld a,(ix+0) ld (hl),a inc ix add hl,de djnz __DrawOffAlignedLoop ret __DrawOffEnd: ;Advanced Math ;----------------------------------------------- p_Sqrt: .db __SqrtEnd-1-$ jr __SqrtEnd ld a,-1 ld d,a ld e,a __SqrtLoop: add hl,de inc a dec e dec de jr c,__SqrtLoop ld h,0 ld l,a ret __SqrtEnd: p_SinSetup: .db 1 ld a,l p_CosSetup: .db 3 ld a,l add a,64 p_Sin: .db __SinEnd-1-$ jr __SinEnd sla a rr c ld d,a cpl ld e,a xor a ld b,8 __SinLoop: rrc e jr nc,__SinSkip add a,d __SinSkip: rra djnz __SinLoop adc a,a ld l,a ld h,b rl c ret nc cpl inc a ret z ld l,a dec h ret __SinEnd: ;VAT manipulation ;----------------------------------------------- p_GetCalc: .db __GetCalcEnd-1-$ jr __GetCalcEnd MOV9TOOP1() B_CALL(_ChkFindSym) ld hl,0 ret c inc b dec b ret nz inc de inc de ex de,hl ret __GetCalcEnd: p_NewAppVar: .db __NewAppVarEnd-1-$ jr __NewAppVarEnd B_CALL(_EnoughMem) pop hl ex (sp),hl HL_INTO_BC() ld hl,0 ret c push de BC_INTO_HL() MOV9TOOP1() B_CALL(_ChkFindSym) jr c,__NewAppVarSkip B_CALL(_DelVarArc) __NewAppVarSkip: pop hl B_CALL(_CreateAppVar) ex de,hl inc hl inc hl ret __NewAppVarEnd: p_Unarchive: .db __UnarchiveEnd-1-$ jr __UnarchiveEnd MOV9TOOP1() B_CALL(_ChkFindSym) ld hl,0 ret c inc b dec b ret z B_CALL(_Arc_Unarc) ld hl,1 ret __UnarchiveEnd: p_Archive: .db __ArchiveEnd-1-$ jr __ArchiveEnd MOV9TOOP1() B_CALL(_ChkFindSym) ld hl,0 ret c inc b dec b ret nz B_CALL(_Arc_Unarc) ld hl,1 ret __ArchiveEnd: ;GrayScale ;----------------------------------------------- p_DispGS: .db __DispGSEnd-1-$ jr __DispGSEnd DispGS: di ld a,$80 out ($10),a ld hl,plotSScreen+(12*63)-1 ld ix,appBackUpScreen+(12*63)-1 ld c,$20 __DispGSNext: ld b,64 ld de,-(12*64)+1 add hl,de add ix,de SCREENWAIT() ld a,c out ($10),a inc c ld e,12 __DispGSLoop: ld d,0 add hl,de add ix,de bit 0,(iy+asm_Flag1) ld a,%10101010 jr nz,__DispGSSkip rrca __DispGSSkip: ld (iy+asm_Flag1),a and (ix+0) or (hl) ld d,a SCREENWAIT() ld a,d out ($11),a djnz __DispGSLoop ld a,c cp $2B+1 jr nz,__DispGSNext rrc (iy+asm_Flag1) ei ret __DispGSEnd: