;Swan v1.0 ;Brandon Wilson include "settings.inc" NOLIST include "ti73.inc" LIST include "header.asm" SEGMENT MAIN GLOBALS ON routineTable EQU statVars curProgPtr EQU statVars+24 numProgsOnscreen EQU statVars+26 curProg EQU statVars+27 curSymPtr EQU statVars+28 curProgSize EQU statVars+30 randSeed EQU statVars+32 StartApp: ;Disable this crazy API the OS uses/expects us to use set 6,(iy+32h) in a,(6) ld (appPage),a ld hl,DummyRet ld (appRawKeyHandle),hl B_CALL RunIndicOff B_CALL DelRes set fullScrnDraw,(iy+apiFlg4) ld hl,9C80h ld (randSeed),hl StartOver: ld hl,(progPtr) call getNextProgram jr z,exitApp ld (curProgPtr),hl ClearDisplayProgs: B_CALL ClrLCDFull ld hl,1 ld (penCol),hl ld hl,sSwan call VPutSApp ld bc,56 ld de,95*256+56 B_CALL DarkLine call DisplayAllPrograms call InvertSelectedProg keyLoop: B_CALL GetKey res onInterrupt,(iy+onFlags) dec a jr z,rightPressed dec a jr z,leftPressed dec a jr z,upPressed dec a jr z,downPressed dec a jr z,executeProgram cp kClear-5 jr z,exitApp cp kQuit-5 jr z,exitApp cp kMode-5 jr nz,keyLoop exitApp: B_CALL ClrLCDFull B_JUMP JForceCmdNoChar rightPressed: ld b,9 ld hl,(curProgPtr) $$: push bc call getNextProgram ex de,hl ld h,b ld l,c pop bc jp z,StartOver djnz $B ld (curProgPtr),de jr ClearDisplayProgs leftPressed: ld hl,(progPtr) $$: push hl ld b,9 leftFindStartLoop: push bc call getNextProgram ld h,b ld l,c pop bc pop de jr z,StartOver push de djnz leftFindStartLoop pop hl ex de,hl ld bc,(curProgPtr) or a sbc hl,bc jr nc,$F add hl,bc jr $B $$: ld (curProgPtr),de jr ClearDisplayProgs upPressed: ld a,(curProg) or a jr z,keyLoop call InvertSelectedProg ld hl,curProg dec (hl) jr $F downPressed: ld a,(numProgsOnscreen) ld b,a ld a,(curProg) inc a cp b jr z,keyLoop call InvertSelectedProg ld hl,curProg inc (hl) $$: call InvertSelectedProg jr keyLoop executeProgram: B_CALL GrBufClr ld a,(curProg) ld b,a ld hl,(curProgPtr) or a jr z,executeFirst $$: push bc call getNextProgram ex de,hl ld h,b ld l,c pop bc djnz $B executeFirst: ld (curSymPtr),hl dec hl ld e,(hl) dec hl ld d,(hl) push de B_CALL ClrLCDFull ld hl,MallardRoutineTable ld de,routineTable ld bc,24 ldir pop hl push hl ld c,(hl) inc hl ld b,(hl) push bc pop hl di ld (curProgSize),hl ld de,userMem exx pop hl inc hl inc hl exx loadProgramLoop: call GetNewBlock push hl exx pop bc push bc push hl ld de,appBackUpScreen ldir pop hl pop de push de push de push hl B_CALL DelMem pop hl pop de add hl,de exx pop hl push hl B_CALL InsertMem pop bc push bc push de ld hl,appBackUpScreen ldir pop de pop bc ex de,hl add hl,bc ex de,hl ld bc,(curProgSize) ld a,b or c jr nz,loadProgramLoop ld hl,userMem+6 call 0033h ;_ldhlind set 7,h ld de,$F push de ei jp (hl) $$ ld hl,(curSymPtr) dec hl ld e,(hl) dec hl ld d,(hl) ex de,hl ld c,(hl) inc hl ld b,(hl) inc hl ld (curProgSize),bc ex de,hl unloadProgramLoop: call GetNewBlock ld b,h ld c,l ex de,hl or a sbc hl,bc push hl push de ld hl,userMem push hl ld de,appBackUpScreen ldir pop hl pop de push de B_CALL DelMem pop hl pop de push hl B_CALL InsertMem ld hl,appBackUpScreen pop bc ldir ld bc,(curProgSize) ld a,b or c jr nz,unloadProgramLoop jp ClearDisplayProgs GetNewBlock: ld bc,768 ld hl,(curProgSize) ld a,h sub b jr nc,$F ld b,h ld c,l xor a ld l,a $$: ld h,a ld (curProgSize),hl ld h,b ld l,c ret InvertSelectedProg: ld a,(curProg) ld b,a inc a add a,a add a,a add a,a sub b ld h,a ld l,0 add a,6 ld d,a ld e,95 B_CALL InvertRect ret DisplayAllPrograms: xor a ld (curProg), a ld hl,(curProgPtr) ld b,8 $$: push bc call getNextProgram jr z,$F ld h,b ld l,c pop bc push bc push hl ld hl,10 add hl,de ld a,8 sub b add a,a add a,a add a,a add a,b ld d,a ld e,1 ld (penCol),de B_CALL VPutS pop hl pop bc djnz $B ld b,0 push bc $$: pop bc ld a,8 sub b ld (numProgsOnscreen),a ret MallardVersion: xor a ld h,a ld l,a ret MallardRandom: push hl push de ld hl,(randSeed) ld a,r ld d, a ld e,(hl) add hl,de add a,l xor h ld (randSeed), hl ld hl,0 ld e,a ld d,h $$: add hl,de djnz $B ld a,h pop de pop hl ret MallardPutSprite: ld e,l ld h,0 ld d,h add hl,de add hl,de add hl,hl add hl,hl ld e,a and 7 ld c,a srl e srl e srl e add hl,de ld de,plotSScreen add hl,de mpsLoop: ld d,(ix+0) ld e,0 ld a,c or a jr z,mps1 $$: srl d rr e dec a jr nz,$B mps1: ld a,(hl) xor d ld (hl),a inc hl ld a,(hl) xor e ld (hl),a ld de,11 add hl,de inc ix djnz mpsLoop ret MallardGetPixel: ld d,0 ld h,d ld l,e add hl,de add hl,de add hl,hl add hl,hl ld de,plotSScreen add hl,de ld b,0 ld c,a and 7 srl c srl c srl c add hl,bc ld b,a inc b ld a,1 $$: rrca djnz $B ret MallardDecompress: di decompressLoop: push bc ld a,(hl) ex af,af' ld a,c ld b,8 cp 1 jr z,decompressLoop2 ld b, 4 cp 3 jr z,decompressLoop2 ld b,2 decompressLoop2: push bc ld a,c ld b,1 cp 1 jr z,$F inc b cp 3 jr z,$F ld b,4 $$: ex af,af' $$: rlca djnz $B ld b,a ex af,af' ld a,b and c ld (de),a inc de pop bc djnz decompressLoop2 inc hl pop bc djnz decompressLoop ei ret MallardFastCopy: di ld a,80h out (10h),a ld hl,plotSScreen+767-12 ld a,20h ld c,a inc hl dec hl rowLoop: ld b,40h inc c ld de,-767 out (10h),a add hl,de ld de,10 $$: add hl,de inc hl inc hl inc de ld a,(hl) out (11h),a dec de djnz $B ld a,c cp 2Ch jr nz,rowLoop ei ret MallardLargeSprite: di ex af,af' ld a,c push af ex af,af' ld e,l ld h,0 ld d,h add hl,de add hl,de add hl,hl add hl,hl ld e,a and 7 ld c,a srl e srl e srl e add hl,de ld de,plotSScreen add hl,de mls1: push hl mls3: ld d,(ix+0) ld e,0 ld a,c or a jr z,mls2 $$: srl d rr e dec a jr nz,$B mls2: ld a,(hl) xor d ld (hl),a inc hl ld a,(hl) xor e ld (hl),a inc ix ex af,af' dec a push af ex af,af' pop af jr nz,mls3 pop hl pop af push af ex af,af' ld de,12 add hl,de djnz mls1 pop af ret MallardLevelDetect: ld de,(pTemp) B_CALL CpHLDE ld a,(hl) jr nz,$F inc a ret $$: push hl and 1 jr nz,mld1 dec hl ld b,(hl) dec hl push hl ld h,(hl) ld l,b inc hl inc hl push ix pop de $$: ld a,(de) or a jr z,mld2 cp (hl) inc de inc hl jr z,$B pop hl mld1: pop hl dec hl dec hl dec hl ld b,(hl) dec hl $$: dec hl djnz $B jr MallardLevelDetect mld2: ex de,hl pop hl pop af dec hl ld b,(hl) inc b $$: dec hl djnz $B ex de,hl xor a ret getNextProgram: ld de,(pTemp) or a sbc hl,de ret z add hl,de ld a,6 cp (hl) dec hl ld e,(hl) dec hl ld d,(hl) dec hl ld c,(hl) ld b,0 gnpNotFound: scf jr z,$F sbc hl,bc jr getNextProgram $$: push hl push de push bc inc de inc de ld hl,DuckHeader ld b,6 $$: ld a,(de) cp (hl) jr nz,$F inc hl inc de djnz $B pop bc pop de pop hl push hl scf sbc hl,bc ld b,h ld c,l pop hl inc hl inc hl inc hl ret $$: pop bc pop de pop hl jr gnpNotFound VPutSApp: ld a,(hl) inc hl or a ret z B_CALL VPutMap jr VPutSApp sSwan: DB "Swan v",VER_STRING,0 DuckHeader: DW 0D9h DB "Duck" MallardRoutineTable: jp MallardVersion jp MallardRandom jp MallardPutSprite jp MallardLargeSprite jp MallardGetPixel jp MallardDecompress jp MallardFastCopy jp MallardLevelDetect DummyRet: ret