;######################### ;# Kevin's Definitions # ;######################### #define B_CALL(xxxx) rst 28h \ .dw xxxx #define B_JUMP(xxxx) call 50h \ .dw xxxx #define SETPEN(xx,yy) LDHL(yy,xx) \ ld (PenCol),hl #define SETCUR(xx,yy) LDHL(xx,yy) \ ld (CurRow),hl #define DRAWHL(xx,yy) B_CALL(_SetXXXXOP2) \ B_CALL(_Op2ToOP1) \ SETPEN(xx,yy) \ ld a,5 \ B_CALL(_DispOP1A) #define DRAWINT(int,xx,yy) ld hl,(int) \ DRAWHL(xx,yy) #define DRAWTEXT(text) ld hl,text \ call AppPutText #define DRAWTEXTINV(text) set 3,(iy+5) \ DRAWTEXT(text) \ res 3,(iy+5) #define DRAWTEXTBUF(text) ld hl,text \ call AppPutTextBuf #define DRAWTEXTBUFINV(text) set 3,(iy+5) \ DRAWTEXTBUF(text) \ res 3,(iy+5) #define DRAWIMG(img,xx,yy) ld hl,img \ LDDE(yy,xx) \ B_CALL(_DisplayImage) #define LDHL(xx,yy) .db 21h \ .db yy \ .db xx #define LDDE(xx,yy) .db 11h \ .db yy \ .db xx #define LDBC(xx,yy) .db 01h \ .db yy \ .db xx #define LINKOUT(xx) ld a,xx \ out (0),a #define LINKIN(xx) in a,(0) \ and $03 \ cp xx #define KEY(xxxx) ld a,xxxx>>8 \ out (1),a \ ld b,xxxx&$00FF \ in a,(1) \ cp b #define FIND(xxxx) ld hl,xxxx \ MOV9TOOP1() \ B_CALL(_ChkFindSym) #define PAUSE(time) ld b,time \ halt \ djnz $-1 #define QUICKPAUSE(time) ld b,time \ djnz $+0 #define OP1TOOP2() rst 08h #define FINDSYM() rst 10h #define PUSHRREALO1() rst 18h #define MOV9TOOP1() rst 20h #define FPADD() rst 30h #define FONTSIZESMALL() res 2,(iy+50) #define FONTSIZELARGE() set 2,(iy+50) #define STARTMODES() res 0,(iy+20) \ set 7,(iy+20) \ set 0,(iy+60) \ res 1,(iy+13) \ B_CALL(_RunIndicOff) #define ENDMODES() res 5,(iy+0) \ res 2,(iy+2) \ set 0,(iy+3) \ res 4,(iy+9) \ res 7,(iy+20) #defcont \ res 0,(iy+60) \ res 2,(iy+50) \ set 1,(iy+13) #define VAR(name,size) name: \ .org name+(size) #define VALIDATE(last) #if ($+0 > (last)) \ .echo "ERROR: MEMORY: " \ .echo ($+0 - (last)) \ .echo " bytes too large\n" \ ld q,q \ #endif #define COPY(src,dest,size) ld hl,src \ ld de,dest \ ld bc,size \ ldir #define FILLRAM(first,last,xx) ld hl,first \ ld de,first+1 \ ld bc,last-first-1 \ ld (hl),xx \ ldir #define ZERORAM(first,last) FILLRAM(first,last,0) #define SCREENWAIT() in a,($10) \ rla \ jr c,$-3 #define FULLSPEED() in a,($02) \ and $80 \ rlca \ out ($20),a #define MAX_A(xx) cp xx \ jr nc,$+4 \ ld a,xx #define MIN_A(xx) cp xx \ jr c,$+4 \ ld a,xx #define PTR_INTO_HL() ld a,(hl) \ inc hl \ ld h,(hl) \ ld l,a #define PTR_INTO_LH() ld a,(hl) \ inc hl \ ld l,(hl) \ ld h,a #define PTR_INTO_DE() ld e,(hl) \ inc hl \ ld d,(hl) #define PTR_INTO_ED() ld d,(hl) \ inc hl \ ld e,(hl) #define PTR_INTO_BC() ld c,(hl) \ inc hl \ ld b,(hl) #define DE_INTO_PTR() ld (hl),e \ inc hl \ ld (hl),d #define HL_INTO_PTR() ld a,l \ ld (hl),l \ ld l,a \ inc hl \ ld (hl),h #define DE_INTO_HL() ld h,d \ ld l,e #define HL_INTO_BC() ld b,h \ ld c,l #define BC_INTO_HL() ld h,b \ ld l,c #define HL_INTO_DE() ld d,h \ ld e,l #define TA_INTO_DE() ld d,0 \ add a,a \ jr nc,$+3 \ inc d \ ld e,a ;########################### ;# Programming Functions # ;########################### ;Headers ;----------------------------------------------- p_AsmHeader: .db 2 .dw $6DBB p_IonHeader: .db 3 xor a jr nc,$+0 .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 ;Saving and loading numbers ;----------------------------------------------- p_LoadInt: .db 3 ld hl,$0000 .db rp_Ans,2 p_LoadVar: .db 3 ld hl,($0000) .db rp_Ans,2 p_LoadSymbol: .db 3 ld hl,$0000 .db rp_Sym,2 p_LoadInt2: .db 3 ld de,$0000 .db rp_Ans,2 p_LoadVar2: .db 4 ld de,($0000) .db rp_Ans,2 p_SaveVar: .db 3 ld ($0000),hl .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 p_Add: .db 1 add hl,de p_Sub: .db 3 or a sbc hl,de ;Optimized Math ;----------------------------------------------- p_Add1: .db 1 inc hl p_Add2: .db 2 inc hl inc hl p_Add3: .db 3 inc hl inc hl inc hl p_Add254: .db 3 inc h dec hl dec hl p_Add255: .db 2 inc h dec hl p_Add256: .db 1 inc h p_Add257: .db 2 inc h inc hl p_Add258: .db 3 inc h inc hl inc hl p_Add511: .db 3 inc h inc h dec hl p_Add512: .db 2 inc h inc h p_Add513: .db 3 inc h inc h inc hl p_Add768: .db 3 inc h inc h inc h p_Sub768: .db 3 dec h dec h dec h p_Sub513: .db 3 dec h dec h dec hl p_Sub512: .db 2 dec h dec h p_Sub511: .db 3 dec h dec h inc hl p_Sub258: .db 3 dec h dec hl dec hl p_Sub257: .db 2 dec h dec hl p_Sub256: .db 1 dec h p_Sub255: .db 2 dec h inc hl p_Sub254: .db 3 dec h inc hl inc hl p_Sub3: .db 3 dec hl dec hl dec hl p_Sub2: .db 2 dec hl dec hl p_Sub1: .db 1 dec hl p_Mul2: .db 1 add hl,hl p_Mul3: .db 4 ld d,h ld e,l add hl,hl add hl,de p_Mul4: .db 2 add hl,hl add hl,hl p_Mul5: .db 5 ld d,h ld e,l add hl,hl add hl,hl add hl,de p_Mul6: .db 5 ld d,h ld e,l add hl,hl add hl,de add hl,hl p_Mul7: .db 6 ld d,h ld e,l add hl,hl add hl,de add hl,hl add hl,de p_Mul8: .db 3 add hl,hl add hl,hl add hl,hl p_Mul9: .db 6 ld d,h ld e,l add hl,hl add hl,hl add hl,hl add hl,de p_Mul10: .db 6 ld d,h ld e,l add hl,hl add hl,hl add hl,de add hl,hl p_Mul12: .db 6 ld d,h ld e,l add hl,hl add hl,de add hl,hl add hl,hl p_Mul16: .db 4 add hl,hl add hl,hl add hl,hl add hl,hl p_Mul32: .db 5 add hl,hl add hl,hl add hl,hl add hl,hl add hl,hl p_Mul64: .db 6 add hl,hl add hl,hl add hl,hl add hl,hl add hl,hl add hl,hl p_Mul256: .db 3 ld h,l ld l,0 p_Mul512: .db 4 ld h,l ld l,0 add hl,hl p_Mul768: .db 6 ld a,l add a,a add a,l ld h,a ld l,0 p_Mul1024: .db 5 ld h,l ld l,0 add hl,hl add hl,hl p_Mul2048: .db 6 ld h,l ld l,0 add hl,hl add hl,hl add hl,hl p_Div2: .db 4 srl h rr l p_Div10: .db 3 B_CALL(_DivHLBy10) p_Div128: .db 5 xor a add hl,hl rla ld l,h ld h,a p_Div256: .db 3 ld l,h ld h,0 p_Div512: .db 5 ld l,h ld h,0 srl l p_Div32768: .db 6 xor a rl h ld h,a rla ld l,a p_Mod2: .db 5 xor a ld h,a inc a and l ld l,a p_Mod4: .db 6 ld h,0 ld a,l and %00000011 ld l,a p_Mod8: .db 6 ld h,0 ld a,l and %00000111 ld l,a p_Mod16: .db 6 ld h,0 ld a,l and %00001111 ld l,a p_Mod32: .db 6 ld h,0 ld a,l and %00011111 ld l,a p_Mod64: .db 6 ld h,0 ld a,l and %00111111 ld l,a p_Mod128: .db 4 ld h,0 res 7,l p_Mod256: .db 2 ld h,0 p_Mod512: .db 4 ld a,%00000001 and h ld h,a p_Mod1024: .db 4 ld a,%00000011 and h ld h,a p_Mod2048: .db 4 ld a,%00000111 and h ld h,a p_Mod4096: .db 4 ld a,%00001111 and h ld h,a p_Mod8192: .db 4 ld a,%00011111 and h ld h,a p_Mod16384: .db 4 ld a,%00111111 and h ld h,a p_Mod32768: .db 2 res 7,h p_EQN256: .db 9 inc h ld a,l or h jr z,$+5 ld hl,255 inc l p_EQN1: .db 9 inc hl ld a,l or h jr z,$+5 ld hl,255 inc l p_EQ0: .db 8 ld a,l or h jr z,$+5 ld hl,255 inc l p_EQ1: .db 8 ld a,l dec a or h jr z,$+5 ld hl,0 p_EQ2: .db 9 dec l ld a,l dec a or h jr z,$+5 ld hl,0 p_EQ256: .db 9 dec h ld a,l or h jr z,$+5 ld hl,255 inc l p_NEN512 .db 9 inc h inc h ld a,l or h jr z,$+5 ld hl,1 p_NEN256: .db 8 inc h ld a,l or h jr z,$+5 ld hl,1 p_NEN2: .db 9 inc hl inc hl ld a,l or h jr z,$+5 ld hl,1 p_NEN1: .db 8 inc hl ld a,l or h jr z,$+5 ld hl,1 p_NE0: .db 7 ld a,l or h jr z,$+5 ld hl,1 p_NE1: .db 8 ld a,h dec l or l jr z,$+5 ld hl,1 p_NE2: .db 9 ld a,h dec l dec l or l jr z,$+5 ld hl,1 p_NE256: .db 8 dec h ld a,l or h jr z,$+5 ld hl,1 p_NE512: .db 9 dec h dec h ld a,l or h jr z,$+5 ld hl,1 p_SLT0: .db 6 xor a rl h ld h,a rla ld l,a p_SGE0: .db 7 xor a rl h ld h,a ccf rla ld l,a ;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_CopyRev: .db 6 HL_INTO_BC() pop de pop hl lddr 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_EQX: .db 10 ld a,l sub $00 or h ld hl,1 jr z,$+3 dec l .db rp_Byte,8 p_NEX: .db 10 ld a,l sub $00 ld l,a or h jr z,$+5 ld hl,1 .db rp_Byte,8 p_Min: .db 8 pop de or a sbc hl,de add hl,de jr c,$+3 ex de,hl p_Max: .db 8 pop de or a sbc hl,de add hl,de jr nc,$+3 ex de,hl ;Signed Stuff ;----------------------------------------------- p_SIntGt: .db 13 ex de,hl xor a ld b,h sbc hl,de ld h,a rra xor b xor d rlca and 1 ld l,a p_SIntGe: .db 12 xor a ld b,h sbc hl,de ld h,a rra xor b xor d rlca sbc a,a inc a ld l,a p_SIntLt: .db 12 xor a ld b,h sbc hl,de ld h,a rra xor b xor d rlca and 1 ld l,a p_SIntLe: .db 13 ex de,hl xor a ld b,h sbc hl,de ld h,a rra xor b xor d rlca sbc a,a inc a ld l,a ;Addition and Subtraction ;----------------------------------------------- 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_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_BoolOr: .db 3 ld a,l or e ld l,a p_BoolAnd: .db 3 ld a,l and e ld l,a p_BoolXor: .db 3 ld a,l xor e ld l,a ;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_TextIntSetup: .db 3 pop bc pop de ld d,c p_TextInt: .db __TextIntEnd-1-$ jr __TextIntEnd ld (PenCol),de B_CALL(_SetXXXXOP2) B_CALL(_Op2ToOP1) ld a,5 B_CALL(_DispOP1A) ret __TextIntEnd: p_TextChar: .db 11 pop bc pop de ld d,c ld (PenCol),de ld a,l B_CALL(_VPutMap) 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 6 B_CALL(_HomeUp) B_CALL(_ClrScrnFull) p_ClearBuffer: .db 3 B_CALL(_GrBufClr) p_ClearBackBuffer: .db 6 ld hl,appBackUpScreen B_CALL(_BufClr) 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: ld hl,plotSScreen di ld a,$80 out ($10),a ld c,$20 __FastCopyAgain: ld b,64 ld de,12 SCREENWAIT() ld a,c out ($10),a inc c __FastCopyLoop: SCREENWAIT() ld a,(hl) out ($11),a add hl,de djnz __FastCopyLoop ld de,1-(12*64) add hl,de 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 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_SDiv: .db __SDivEnd-1-$ jr __SDivEnd ld a,h xor d push af bit 7,h jr z,$+8 xor a sub l ld l,a sbc a,a sub h ld h,a bit 7,d jr z,$+8 xor a sub e ld e,a sbc a,a sub d ld d,a call $0000 pop af add a,a ret nc xor a sub l ld l,a sbc a,a sub h ld h,a ret __SDivEnd: .db rp_Ans,12 p_DivX: .db 5 ld a,$00 B_CALL(_DivHLByA) .db rp_Byte,4 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: ;Pixel Routines ;----------------------------------------------- p_Pix: .db __PixEnd-1-$ ;Draws pixel (e,l) jr __PixEnd ld bc,plotSScreen ld a,l cp 64 ret nc add a,a add a,l ld l,a add hl,hl add hl,hl add hl,bc ld a,e cp 96 ret nc 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 ld hl,plotSScreen-11 ;Input hl = Sprite ld b,7 ;Input c = Sprite X Position ld d,0 ;Input e = Sprite Y Position 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 push hl ld d,0 ld h,d ld l,e 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 pop de 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 ld hl,plotSScreen-11 ;Input hl = Sprite ld b,7 ;Input c = Sprite X Position ld d,0 ;Input e = Sprite Y Position 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 push hl ld d,0 ld h,d ld l,e 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 pop de 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 ld hl,plotSScreen-11 ;Input hl = Sprite ld b,7 ;Input c = Sprite X Position ld d,0 ;Input e = Sprite Y Position 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 push hl ld d,0 ld h,d ld l,e 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 pop de 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_GraySteal: .db 3 ld bc,appBackUpScreen p_GraySteal2: .db 6 push hl pop ix ld hl,appBackUpScreen-11 p_DispGS: .db __DispGSEnd-1-$ jr __DispGSEnd di ld a,$80 out ($10),a ld hl,flags+asm_Flag2 rr (hl) sbc a,a xor %01010101 ld (hl),a ld hl,plotSScreen+(12*63)-1 ld ix,appBackUpScreen+(12*63)-1 ld c,$20 ld a,c __DispGSNext: ld b,64 ld de,-(12*64)+1 add hl,de add ix,de out ($10),a ld de,12 __DispGSLoop: add hl,de add ix,de rrc (iy+asm_Flag2) ld a,(flags+asm_Flag2) and (ix+0) or (hl) out ($11),a djnz __DispGSLoop inc c ld a,c cp $2B+1 jr nz,__DispGSNext ei ret __DispGSEnd: p_4LvlSetup: .db 4 ld (iy+asm_Flag2),%10110110 p_Disp4Lvl: .db __Disp4LvlEnd-1-$ jr __Disp4LvlEnd di ld a,$80 out ($10),a rrc (iy+asm_Flag2) ld hl,plotSScreen+(12*63)-1 ld ix,appBackUpScreen+(12*63)-1 ld c,-$0C __Disp4LvlNext: ld a,c add a,$2C ld b,64 ld de,-(12*64)+1 add hl,de add ix,de out ($10),a __Disp4LvlLoop: ld de,12 add hl,de add ix,de ld de,flags+asm_Flag2 ld a,(de) rrca ld (de),a ld d,a cpl or (hl) and (ix+0) ld e,a ld a,(hl) and d or e out ($11),a djnz __Disp4LvlLoop inc c jr nz,__Disp4LvlNext ei ret __Disp4LvlEnd: ;Line ;----------------------------------------------- p_PopAll3: .db 5 pop bc ld h,c pop de pop bc ld d,c p_Line: ;(h,l) to (d,e) c=error b_7=ystep b_6=steep OP1=dx OP1+1=dy .db __LineEnd-1-$ jr __LineEnd ld ix,OP1 ld a,e sub l ;a = y1 - y0 jr nc,$+4 neg ld c,a ;c = abs(y1 - y0) ld a,d sub h ;a = x1 - x0 jr nc,$+4 neg ;a = abs(x1 - x0) sub c ;a = abs(x1 - x0) - abs(y1 - y0) jr nc,__LineNoSwap ld c,h ;If abs(y1 - y0) > abs(x1 - x0) ld h,l ld l,c ld c,d ld d,e ld e,c __LineNoSwap: rl b ;b = abs(y1 - y0) > abs(x1 - x0) ld a,d sub h ;a = x1 - x0 jr nc,__LineNoEx ex de,hl ;If x0 > x1 neg ccf __LineNoEx: ld (ix+0),a ;(ix+0) = x1 - x0 rra ld c,a ;c = (x1 - x0)/2 ld a,l sub e ;a = y0 - y1 jr nc,$+4 neg ;a = abs(y1 - y0) ld (ix+1),a ;(ix+1) = abs(y1 - y0) rl b ;b = y1 > y0 __LineLoop: push hl push de push bc ld e,h ;(e,l) = (x0,y0) bit 1,b jr z,__LineDrawXY __LineDrawYX: ld e,l ;(e,l) = (y0,x0) ld l,h __LineDrawXY: ld h,0 ld d,h call $0000 or (hl) ld (hl),a pop bc pop de pop hl ld a,c sub (ix+1) ld c,a ;c = c - (ix+1) jr nc,__LineSkip ld a,b and %00000001 add a,a dec a add a,l ld l,a ;l = l + 2*b_0 - 1 ld a,c add a,(ix+0) ld c,a ;c = c + (ix+0) __LineSkip: ld a,h inc h ;x0++ cp d jr nz,__LineLoop ;Loop If x0 != x1 ret __LineEnd: .db rp_Ans,32 ;Bit ;----------------------------------------------- p_GetBit: .db 9 ld b,l pop hl __GetBitLoop: add hl,hl djnz __GetBitLoop ld h,b ld l,b rl l