//----------------------------------------------------- version 2.4 -- // // /¯/\ // / / / a program by Tijl Coosemans (tijl@ulyssis.org) // |¯|\ / / / and Dan Weiss (dwedit@hotmail.com) // | | | / /s/ // | | |/ /u/ website: http://www.kalimero.be/ // | | / /n/ // | |/ /e/ !! with special thanks to Jean Carot, Henk Poley, // | /V/ !! Dan Weiss, Guillaume Hoffmann, Patai Gergely // |__/ / !! and Pieter Van Nuffel for the impressive tips // \__\/ !! and beta testing // // // $LastChangedDate: 2005-02-04 19:39:49 +0100 (Fri, 04 Feb 2005) $ // //-------------------------------------------------------------------- processor z80 //-------------------------------------------------------------------- _clrScrnBuf equ 0x515B _clrScrnFull equ 0x475D _deleteMem equ 0x44B2 _delMemUpdate equ 0x44B6 _divHLby10 equ 0x4008 _getFreeMem equ 0x441A _getProgInfo equ 0x4426 _homeUp equ 0x4775 _insertMem equ 0x4432 _insMemUpdate equ 0x44BE _ldHLind equ 0x4000 _parseInp equ 0x4E8C _setRunIndicOn equ 0x4791 _vputmap equ 0x477D _vputs equ 0x4781 _vputsn equ 0x4785 //-------------------------------------------------------------------- op1 equ 0x8039 pencol equ 0x8252 penrow equ 0x8253 screenBuf equ 0x8E29 vDispHLStr equ 0x8096 //-------------------------------------------------------------------- vRandom equ 0xFE72 vFastCopy equ 0xFE75 //-------------------------------------------------------------------- org 0x9329 db 0xE7,"9_[V?",0 //-------------------------------------------------------------------- // ## init //-------------------------------------------------------------------- ld a,1 ld (menuStart),a restart1 ld a,1 ld (selectedItem),a restart2 set 7,(iy+20) //-------------------------------------------------------------------- // ## draw interface //-------------------------------------------------------------------- call _clrScrnBuf ld d,b ld e,2 ld hl,titleTxt call vPuts ld hl,screenBuf call invert ld hl,penrow inc (hl) ld hl,screenBuf+(57*12) ld b,12 drawHorizLine ld (hl),0xFF inc hl djnz drawHorizLine //-------------------------------------------------------------------- // ## draw menu //-------------------------------------------------------------------- menuStart equ $+2 ld bc,0x0100 ld de,(0x9319) getProgramLoop dec de ld hl,(0x9317) xor a sbc hl,de jp nc,drawMenuDone ex de,hl ld (itemPtr),hl ld e,(hl) dec hl ld d,(hl) dec hl push bc ld b,(hl) dec hl ld a,(hl) dec hl djnz $-1 ex de,hl cp '#' jr z,getProgramSkip inc hl inc hl ld a,(hl) inc hl or a jr z,getProgramAShell sub 0x3E jr z,getProgramBasic dec a jr z,getProgramAShell cp 0xC9-0x3F jr z,getProgramIon cp 0xAF-0x3F jr z,getProgramIon sub 0xE7-0x3F jr nz,getProgramNext ld c,6 add hl,bc getProgramIon ld a,(hl) inc hl inc hl cp 0x30 jr getProgramNext getProgramAShell ld a,(hl) ld c,4 add hl,bc // description = (hl) + hl - 0x932D ld c,(hl) inc hl ld b,(hl) add hl,bc ld bc,0x932D or a sbc hl,bc cp 0x18 jr z,getProgramNext getProgramSkip cp 0x28 jr getProgramNext getProgramBasic ld hl,basicDescTxt getProgramNext pop bc jr nz,getProgramLoop djnz getProgramLoop addProgramToMenu inc c ld a,c cp 8 jr z,drawMenuDone push de selectedItem equ $+1 cp 0x01 push af ld a,(penrow) add a,7 ld d,a ld e,2 call vPuts pop af jr nz,notSelected itemPtr equ $+1 ld hl,0x0000 ld (selectedItemPtr),hl ld hl,screenBuf+(1*12) ld de,7*12 ld b,a getScreenBuf add hl,de djnz getScreenBuf call invert notSelected pop de inc b jp getProgramLoop drawMenuDone ld a,c ld (numberOfItems),a or a ld a,55 jr z,quit1 //-------------------------------------------------------------------- // ## display info about selected program //-------------------------------------------------------------------- ld hl,58*256+35 ld (pencol),hl selectedItemPtr equ $+1 ld hl,0x0000 ld e,(hl) dec hl ld d,(hl) dec hl push hl ld a,6 add a,(hl) ex de,hl ld d,0 ld e,a call _ldHLind add hl,de call vDispHL ld a,1 ld (pencol),a pop hl ld b,(hl) drawPrgmName dec hl ld a,(hl) call _vputmap djnz drawPrgmName ld hl,freeTxt ld de,58*256+58 call vPuts call _getFreeMem call vDispHL call vFastCopy //-------------------------------------------------------------------- // ## scan key presses //-------------------------------------------------------------------- getKey res 4,(iy+9) ld bc,0x1A00 getKeyLoop call 0x4014 quit1 res 7,(iy+20) dec a jr z,oneDown dec a jr z,pageUp dec a jr z,pageDown dec a jr z,oneUp cp 9-4 jr z,runProgram sub 54-4 jr z,runProgram dec a jr z,quit chkTurnOff bit 4,(iy+9) jr nz,turnOffCalc halt halt dec bc ld a,b or c jr nz,getKeyLoop turnOffCalc ld a,1 out (3),a halt jr getKey quit call _clrScrnFull jp _homeUp //-------------------------------------------------------------------- // ## navigation //-------------------------------------------------------------------- oneUp ld hl,selectedItem dec (hl) jr nz,reDraw inc (hl) ld hl,menuStart dec (hl) jr nz,reDraw inc (hl) jr getKey pageUp ld hl,menuStart ld a,(hl) sub 8 jr nc,$+3 xor a inc a ld (hl),a jr reDraw pageDown numberOfItems equ $+1 ld a,0x00 cp 8 jr nz,getKey ld hl,menuStart ld a,(hl) add a,7 ld (hl),a ld a,1 jp restart1 oneDown ld hl,numberOfItems ld de,selectedItem ld a,(de) cp (hl) jr z,getKey ex de,hl inc (hl) cp 7 jr nz,reDraw dec (hl) ld hl,menuStart inc (hl) reDraw jp restart2 //-------------------------------------------------------------------- // ## run program //-------------------------------------------------------------------- runProgram ld hl,0x9328 ld (0x9146),hl inc hl ld (0x9144),hl ld hl,0x9337 ld (0x9148),hl ld hl,(selectedItemPtr) ld c,(hl) dec hl ld b,(hl) inc bc inc bc ld a,(bc) cp 0x3E jr z,runBasicPrgm cp 0xE7 jr z,runBasicPrgm runIonPrgm push hl push bc ld hl,pLoadStart ld de,pLoadOrg ld bc,pLoadEnd-pLoadStart ldir ld de,pUnloadOrg ld bc,pUnloadEnd-pUnloadStart ldir pop hl push hl call _ldHLind ld (pFirst2Bytes),hl pop hl ld de,2 call _deleteMem ex de,hl dec hl ld b,(hl) dec hl ld c,(hl) ex de,hl push de // data location push bc // data size push bc call _delMemUpdate pop bc ld de,0x9327-1 // data destination - 1 call _insMemUpdate pop de // data size ld b,8 ld hl,iVectors initIonVectors inc hl ld a,(hl) add a,e ld (hl),a inc hl ld a,(hl) adc a,d ld (hl),a inc hl djnz initIonVectors ld b,d ld c,e pop de ex (sp),hl // program return address push hl ex de,hl ld de,0x9327 jp pMoveProgram runBasicPrgm dec hl ld de,op1+1 ld b,(hl) cpyName dec hl ld a,(hl) ld (de),a inc de djnz cpyName call _clrScrnFull call _homeUp call _setRunIndicOn jp _parseInp //-------------------------------------------------------------------- // ## program loading //-------------------------------------------------------------------- pLoadStart pLoadOrg equ 0xFEB8 rorg pLoadOrg swapAgain sbc hl,bc jr nc,swapSize add hl,bc // HL = size A mod size B push bc ex (sp),hl // HL = size B pop bc // BC = new size A add hl,de // HL = end A sbc hl,bc // HL = new A pMoveProgram push bc // BC = new size A swapLoop ld a,(de) // swap (A) and (B) ldi dec hl ld (hl),a inc hl jp pe,swapLoop // loop size A times sbc hl,de // HL = size B ex (sp),hl // HL = size A pop bc // BC = size B swapSize jr nz,swapAgain pop hl ld (hl),0x93 inc hl ld (hl),0x27 ld a,(pFirst2Bytes) cp 0x3F jr nz,pNoLibs ld hl,(0x932A) ld a,h or l jr z,pNoLibs ld de,0x9327 add hl,de initSOSVectors dec hl rst 20h ld a,5 ld (op1),a push hl call _getProgInfo inc de inc de pop hl ret c ld c,(hl) push hl ex de,hl push hl add hl,bc call _ldHLind pop de add hl,de ex de,hl pop hl inc hl ld c,(hl) push hl ld hl,0x9157+40 add hl,bc ld (hl),0xC3 inc hl ld (hl),e inc hl ld (hl),d pop hl inc hl ld a,(hl) inc a jr nz,initSOSVectors pNoLibs call _clrScrnBuf ld hl,0x9329 ld c,(hl) inc c add hl,bc jp (hl) rorg $$ pLoadEnd //-------------------------------------------------------------------- // ## program unloading //-------------------------------------------------------------------- pUnloadStart pUnloadOrg equ 0x91A7 rorg pUnloadOrg iVectors jp iVersion jp iRandom jp iPutSprite jp iLargeSprite jp iGetPixel jp iFastCopy jp iDetect jp iDecompress ld hl,2 ld de,0x9329 call _insertMem pFirst2Bytes equ $+1 ld hl,0x0000 ld (0x9329),hl res 4,(iy+9) res 2,(iy+2) // some ion programs seem to set this ret rorg $$ pUnloadEnd //-------------------------------------------------------------------- // ## Ion routines //-------------------------------------------------------------------- iVersion xor a ld hl,0x0106 ld de,0x0008 ret iRandom push hl push de call vRandom ld e,h ld h,d ld l,d iRandomLoop add hl,de djnz iRandomLoop ld a,h pop de pop hl ret iPutSprite ld h,0 ld d,h ld e,l add hl,de add hl,de add hl,hl add hl,hl ld e,a srl e srl e srl e add hl,de ld de,screenBuf add hl,de and 7 ld c,a iPutSpriteLoop1 ld d,(ix) ld e,0 inc ix ld a,c or a jr z,iPutSprite1 iPutSpriteLoop2 srl d rr e dec a jr nz,iPutSpriteLoop2 iPutSprite1 ld a,d xor (hl) ld (hl),a inc hl ld a,e xor (hl) ld (hl),a ld de,11 add hl,de djnz iPutSpriteLoop1 ret iLargeSprite ld h,0 ld d,h ld e,l add hl,de add hl,de add hl,hl add hl,hl ld e,a srl e srl e srl e add hl,de ld de,screenBuf add hl,de and 7 ld e,a iLargeSpriteLoop1 push bc push hl ld b,c iLargeSpriteLoop2 ld c,(ix) ld d,0 inc ix ld a,e or a jr z,iLargeSprite1 iLargeSpriteLoop3 srl c rr d dec a jr nz,iLargeSpriteLoop3 iLargeSprite1 ld a,c xor (hl) ld (hl),a inc hl ld a,d xor (hl) ld (hl),a djnz iLargeSpriteLoop2 pop hl ld c,12 add hl,bc pop bc djnz iLargeSpriteLoop1 ret iGetPixel ld d,0 ld h,d ld l,e add hl,de add hl,de add hl,hl add hl,hl ld e,a srl e srl e srl e add hl,de ld de,screenBuf add hl,de and 7 inc a ld b,a ld a,1 iGetPixelLoop rrca djnz iGetPixelLoop ret iFastCopy jp vFastCopy iDetect push ix pop bc ex de,hl iDetectLoop dec de ld hl,(0x9317) xor a sbc hl,de ret nc push bc ex de,hl ld e,(hl) dec hl ld d,(hl) dec hl ex de,hl inc hl iDetectCheck inc hl ld a,(bc) or a jr z,iDetectFound inc bc cp (hl) jr z,iDetectCheck iDetectFound ld a,(de) dec de ld b,a iDetectNext dec de djnz iDetectNext pop bc jr nz,iDetectLoop ret iDecompress di iDecompressLoop push bc ld a,(hl) ex af,af' ld a,c ld b,8 cp 1 jr z,iDcmp1 ld b,4 cp 3 jr z,iDcmp1 ld b,2 iDcmp1 push bc ld a,c ld b,1 cp 1 jr z,iDcmp2 inc b cp 3 jr z,iDcmp2 ld b,4 iDcmp2 ex af,af' iDcmp3 rlca djnz iDcmp3 ld b,a ex af,af' ld a,b and c ld (de),a inc de pop bc djnz iDcmp1 inc hl pop bc djnz iDecompressLoop ret //-------------------------------------------------------------------- // ## routines //-------------------------------------------------------------------- vDispHL ld de,vDispHLStr+5 ld b,5 vDispHLLoop dec de call _divHLby10 add a,0x30 ld (de),a djnz vDispHLLoop ex de,hl ld b,5 jp _vputsn vPuts ld (pencol),de jp _vputs invert ld b,7*12 invertLoop ld a,(hl) cpl ld (hl),a inc hl djnz invertLoop ret //-------------------------------------------------------------------- // ## text //-------------------------------------------------------------------- titleTxt db "Venus 2.4+",6,6,"TijlC&Dan Weiss",0 freeTxt db "free:",0 basicDescTxt db "Basic Program",0 //--------------------------------------------------------------------