.nolist #include "quack.inc" .list .org 4000h #define ExtLibAddr cmdshadow ;2 bytes #define tempcol cmdshadow+2 ;1 byte #define passtemp cmdshadow+3 ;8 bytes #define curprog cmdshadow+11 ;2 bytes #define vatloc cmdshadow+13 ;2 bytes #define progcount cmdshadow+15 ;2 bytes ;Field: Program length .db 080h,0Fh ;Length=0 (N/A for unsigned apps) .db 00h,00h,00h,00h ;Field: Program type .db 080h,013h ;Type = DEV:2EF04 .db 02h, 0EFh, 004h ;Field: App ID .db 080h,021h ;Id = 1 .db 01h ;Field: App Build .db 080h,031h ;Build = 1 .db 01h ;Field: App Name .db 080h,048h ;App Name = APPNAME .db "DuckOS " ;Field: App Pages .db 080h,081h ;App Pages = 1 .db 01h ;No default splash screen .db 080h,090h ;Field: Date stamp - 5/12/1999 .db 003h,026h,009h,004h,004h,06fh,01bh,080h ;Dummy encrypted TI date stamp signature .db 002h ,00dh ,040h .db 0a1h ,06bh ,099h ,0f6h ,059h ,0bch ,067h .db 0f5h ,085h ,09ch ,009h ,06ch ,00fh ,0b4h ,003h ,09bh ,0c9h .db 003h ,032h ,02ch ,0e0h ,003h ,020h ,0e3h ,02ch ,0f4h ,02dh .db 073h ,0b4h ,027h ,0c4h ,0a0h ,072h ,054h ,0b9h ,0eah ,07ch .db 03bh ,0aah ,016h ,0f6h ,077h ,083h ,07ah ,0eeh ,01ah ,0d4h .db 042h ,04ch ,06bh ,08bh ,013h ,01fh ,0bbh ,093h ,08bh ,0fch .db 019h ,01ch ,03ch ,0ech ,04dh ,0e5h ,075h ;Field: Program Image length .db 80h,7Fh .db 0,0,0,0 ;Length=0, N/A .db 0,0,0,0 ;Reserved .db 0,0,0,0 ;Reserved .db 0,0,0,0 ;Reserved .db 0,0,0 ;Reserved jp AppStart ;4080h jp LibFastCopy ;4083h - ionFastCopy jp LibPause ;4086h - PauseCalc jp LibExternalLib ;4089h - External Libraries AppStart: ld hl,AppVarName rst 20h bcall(_chkfindsym) jr c,FirstTimeRan jr MainAppStart FirstTimeRan: ld hl,SplashScreen ld de,plotsscreen ld bc,768 ldir call LibFastCopy ld hl,AppVarName rst 20h ld hl,12 bcall(_createappvar) inc de inc de xor a ld b,12 InitializeAppVarLoop: ld (de),a inc de djnz InitializeAppVarLoop call LibPause MainAppStart: set textwrite,(iy+sgrflags) set bufferonly,(iy+plotflag3) bcall(_delres) ld hl,ExternalLibrary rst 20h bcall(_chkfindsym) push af xor a ld (ExtLibAddr),a pop af jr c,ExternalLibsNotFound inc de \ inc de \ inc de \ inc de \ inc de ;Should be two bytes for size field ;Two bytes for $BB,$6D ;One byte for ret ld (ExtLibAddr),de ExternalLibsNotFound: bcall(_grbufclr) call FindAppVar ld a,(de) or a jr z,NoStartupPassword call GetPassword call FindAppVar ld hl,passtemp ld b,8 PasswordCompareLoop: ld c,(hl) ld a,(de) cp c jp nz,ExitDuckOS inc hl inc de djnz PasswordCompareLoop NoStartupPassword: bcall(_clrscrnfull) ld hl,0 ld (curprog),hl jp ExitDuckOS GetPassword: ld hl,passtemp ld bc,8 bcall(_memclear) ld bc,19*256+25 ld de,77*256+25 bcall(_darkline) ld c,40 ld e,40 bcall(_darkline) ld de,19*256+25 bcall(_darkline) ld bc,77*256+40 ld d,77 bcall(_darkline) ld bc,19*256+34 ld de,77*256+34 bcall(_darkline) ld hl,23*256+20 ld (pencol),hl set textInverse,(iy+textFlags) ld hl,PasswordPrompt call vputstr res textInverse,(iy+textFlags) call LibFastCopy ld ix,passtemp ld b,0 ld a,21 ld (tempcol),a PassInputLoop: ei \ halt bcall(_getcsc) or a jr z,PassInputLoop cp skEnter jr z,passinputdone push af push bc push de push ix ld ix,PasswordChar ld l,31 ld a,(tempcol) ld b,6 call LibPutSprite call LibFastCopy ld a,(tempcol) add a,7 ld (tempcol),a pop ix pop de pop bc pop af inc b ld (ix),a inc ix ld a,b cp 8 jr nz,PassInputLoop passinputdone: ret ExitDuckOS: ld a,$20 ld b,128 ld hl,cmdshadow CmdShadowClrLoop: ld (hl),a inc hl djnz CmdShadowClrLoop bcall($4C36) bjump(_JForceCmdNoChar) FindAppVar: ld hl,AppVarName rst 20h bcall(_chkfindsym) inc de \ inc de ret LibPutSprite: ld e,l ld h,$00 ld d,h add hl,de add hl,de add hl,hl add hl,hl ld e,a and $07 ld c,a srl e srl e srl e add hl,de ld de,gbuf add hl,de putSpriteLoop1: sl1: ld d,(ix) ld e,$00 ld a,c or a jr z,putSpriteSkip1 putSpriteLoop2: srl d rr e dec a jr nz,putSpriteLoop2 putSpriteSkip1: ld a,(hl) xor d ld (hl),a inc hl ld a,(hl) xor e ld (hl),a ld de,$0B add hl,de inc ix djnz putSpriteLoop1 ret vputstr: push af push de push ix vputs10: ld a,(hl) inc hl or a jr z,vputs20 bcall(_vputmap) jr nc,vputs10 vputs20: pop ix pop de pop af ret CountProgs: ld hl,0 ld (progcount),hl ld hl, (ProgPtr) ld bc, (pTemp) ld d,0 SearchLoop: or a sbc hl,bc ret c ret z add hl,bc ld a,(hl) and $1F ld e,6 or a sbc hl,de cp 6 jr z,IsAProg ld e,(hl) inc e or a sbc hl,de jr SearchLoop IsAProg: inc hl inc hl ld b,(hl) inc hl ld c,(hl) LibExternalLib: ld a,(ExtLibAddr) or a ret z ld hl,(ExtLibAddr) ld de,$8A3A ld bc,531 ldir jp $8A3A ;Run external library. LibPause: ei \ halt bcall(_getcsc) or a jr z,LibPause ret LibFastCopy: ;Tested, approved di ld a,$80 ; 7 out ($10),a ; 11 ld hl,plotsscreen-12-(-(12*64)+1) ; 10 ld a,$20 ; 7 ld c,a ; 4 inc hl ; 6 waste dec hl ; 6 waste fastCopyAgain: ld b,64 ; 7 inc c ; 4 ld de,-(12*64)+1 ; 10 out ($10),a ; 11 add hl,de ; 11 ld de,10 ; 10 fastCopyLoop: add hl,de ; 11 inc hl ; 6 waste inc hl ; 6 waste inc de ; 6 ld a,(hl) ; 7 out ($11),a ; 11 dec de ; 6 djnz fastCopyLoop ; 13/8 ld a,c ; 4 cp $2B+1 ; 7 jr nz,fastCopyAgain ; 10/1 ret SplashScreen: .db $FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF .db $80,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$03 .db $BF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FB .db $AF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$EB .db $B7,$FF,$FF,$FF,$FE,$00,$00,$FF,$FF,$FF,$FF,$DB .db $B8,$FF,$FF,$FF,$80,$00,$00,$03,$FF,$FF,$FE,$3B .db $BB,$FF,$FF,$F8,$00,$00,$00,$00,$3F,$FF,$FF,$BB .db $BB,$FF,$FF,$C0,$79,$AF,$64,$E7,$87,$FF,$FF,$BB .db $BF,$FF,$FF,$00,$65,$AC,$69,$14,$01,$FF,$FF,$FB .db $BF,$FF,$F8,$00,$65,$AC,$71,$17,$80,$3F,$FF,$FB .db $BF,$FF,$E0,$00,$65,$AC,$69,$10,$80,$0F,$FF,$FB .db $BF,$FF,$C0,$00,$79,$EF,$64,$E7,$80,$07,$FF,$FB .db $BF,$FF,$00,$00,$00,$00,$00,$00,$00,$01,$FF,$FB .db $BF,$FC,$21,$86,$00,$00,$00,$00,$00,$00,$7F,$FB .db $BF,$F8,$12,$49,$00,$00,$00,$00,$1C,$00,$3F,$FB .db $BF,$F0,$0C,$30,$80,$00,$00,$00,$2E,$00,$1F,$FB .db $BF,$E0,$00,$00,$00,$00,$00,$00,$3C,$00,$0F,$FB .db $BF,$C0,$00,$00,$00,$00,$00,$00,$30,$00,$07,$FB .db $BF,$80,$00,$86,$18,$00,$00,$FF,$F0,$00,$03,$FB .db $BF,$00,$00,$49,$24,$00,$07,$00,$70,$00,$01,$FB .db $BF,$00,$00,$30,$C2,$00,$08,$00,$08,$00,$01,$FB .db $BE,$00,$00,$00,$00,$00,$10,$14,$04,$00,$00,$FB .db $BC,$00,$00,$00,$00,$00,$08,$28,$08,$00,$00,$7B .db $BC,$00,$00,$00,$00,$00,$07,$00,$70,$00,$00,$7B .db $B8,$00,$00,$00,$00,$70,$00,$FF,$84,$30,$C0,$3B .db $B8,$00,$00,$00,$00,$B8,$00,$00,$02,$49,$20,$3B .db $B8,$00,$00,$00,$00,$F0,$00,$00,$01,$86,$10,$3B .db $B0,$86,$18,$00,$00,$C0,$00,$00,$00,$00,$00,$1B .db $B0,$49,$24,$03,$FF,$C0,$21,$86,$00,$00,$00,$1B .db $B0,$30,$C2,$1C,$01,$C0,$12,$49,$00,$00,$00,$1B .db $B0,$00,$00,$20,$00,$20,$0C,$30,$80,$00,$00,$1B .db $B0,$00,$00,$40,$50,$10,$00,$00,$00,$00,$00,$1B .db $B0,$00,$00,$20,$A0,$20,$00,$00,$00,$00,$00,$1B .db $B0,$00,$00,$1C,$01,$C0,$00,$00,$00,$00,$00,$1B .db $B0,$00,$00,$03,$FE,$00,$00,$00,$00,$00,$00,$1B .db $B0,$00,$00,$00,$00,$00,$00,$10,$C3,$00,$00,$1B .db $B8,$00,$00,$00,$00,$00,$00,$09,$24,$80,$00,$3B .db $B8,$00,$00,$00,$00,$00,$00,$06,$18,$40,$00,$3B .db $B8,$04,$30,$C0,$21,$86,$00,$00,$00,$00,$00,$3B .db $BC,$02,$49,$20,$12,$49,$00,$03,$80,$00,$00,$7B .db $BC,$01,$86,$10,$0C,$30,$80,$05,$C0,$00,$00,$7B .db $BE,$00,$00,$00,$00,$00,$00,$07,$80,$00,$00,$FB .db $BF,$00,$00,$00,$00,$00,$00,$06,$04,$30,$C1,$FB .db $BF,$00,$00,$00,$00,$00,$1F,$FE,$02,$49,$21,$FB .db $BF,$80,$00,$00,$00,$00,$E0,$0E,$01,$86,$13,$FB .db $BF,$C0,$00,$86,$18,$01,$00,$01,$00,$00,$07,$FB .db $BF,$E0,$00,$49,$24,$02,$02,$80,$80,$00,$0F,$FB .db $BF,$F0,$00,$30,$C2,$01,$05,$01,$00,$00,$1F,$FB .db $BF,$F8,$00,$00,$00,$00,$E0,$0E,$00,$00,$3F,$FB .db $BF,$FC,$00,$00,$00,$00,$1F,$F0,$00,$00,$7F,$FB .db $BF,$FF,$00,$00,$00,$00,$00,$00,$00,$01,$FF,$FB .db $BF,$FF,$C0,$00,$04,$30,$C0,$00,$00,$07,$FF,$FB .db $BF,$FF,$E0,$00,$02,$49,$20,$00,$00,$0F,$FF,$FB .db $BF,$FF,$F8,$00,$01,$86,$10,$00,$00,$3F,$FF,$FB .db $BF,$FF,$FF,$00,$00,$00,$00,$00,$01,$FF,$FF,$FB .db $BB,$FF,$FF,$C0,$00,$00,$00,$00,$07,$FF,$FF,$BB .db $BB,$FF,$FF,$F8,$00,$00,$00,$00,$3F,$FF,$FF,$BB .db $B8,$FF,$FF,$FF,$80,$00,$00,$03,$FF,$FF,$FE,$3B .db $B7,$FF,$FF,$FF,$FE,$00,$00,$FF,$FF,$FF,$FF,$DB .db $AF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$EB .db $BF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FB .db $80,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$03 .db $FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF .db $FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF ExternalLibrary: .db 6,"DUCKLIBS" AppVarName: .db AppVarObj," DuckOS",0 PasswordPrompt: .db " Enter Password: ",0 PasswordChar: .db %01111000 .db %11101100 .db %11110100 .db %11111100 .db %11111100 .db %01111000 .end