Fermer2
deephLe 22/02/2013 à 11:08
Créer un shell pour la 84+ C SE à plusieurs ça vous dit ?

Je ne parle pas d'une usine à gaz qui regroupe 36000 routines, des icônes énormes etc... mais d'un petit shell proposant des routines simples et suffisante pour rapidement porter nos projets actuels smile

Voici quelques routines qui pourraient être intéressante (à compléter et à discuter bien entendu) :

- tirage d'un nombre aléatoire
- affichage de sprite clippées (16-bits voire moins ? Peut être même 1-bit pour la retrocompatibilité ?)
- flip/rotation de sprites
- dessin de rectangle pleins/vides, cercles, lignes
- routine qui copie un buffer de 768 octets au milieu de l'écran (ou 1 bit = 1 pixel)
- link ?

Au niveau du format, je pense qu'il vaudrait mieux partir sur une app.

Pour la mise en page il faudrait un truc simple : le nom du shell, un "toggle" (button on/off) pour l'installation, le choix de "write-backer" les programmes désarchivés et de quoi quitter l'app.

Au niveau des fonctions : autoréinstallation après un reset (peut être re-réglage de l'horloge aussi ?) etc...

J'ai commencé à écrire quelques bouts de codes, le problème c'est qu'on ne peux pas (encore) tester sur 84+ C SE, du coup ça compile pour 83+, mais de toute façons il n'y aura que la partie graphique à revoir (le système des apps/hook est très certainement le même). On peut déjà commencer à coder quelques routines (tirage aléatoire, copie de buffers...) smile

L'header est normalement correcte, l'app est bien signée (par contre la clé RSA est-elle la même ?), j'ai codé la création de l'appvar (qui stock l'état de l'installation du shell (mais on pourrait peut être le deviner en détectant le hook ?), et si on write-back), un début de lecture/écriture de ce même appvar et l'installation d'un hook qui empêche le lancement des programmes (par contre je n'ai pas encore codé sa désinstallation).
zshell.z80
.nolist ;#include "ti84pcse.inc" #include "ti83p.inc" ; only for debug .list .org $4000 .db $80,$0f,$00,$00,$00,$00 ; program length = 0 .db $80,$12,$01,$04 ; program type = shareware for TI 83+ .db $80,$21,$01 ; app id = 1 .db $80,$31,$01 ; app build # = 1 .db $80,$48, "zSHELL " ; app name (must be 8 bytes long) .db $80,$81,$01 ; app page = 1 .db $80,$90 ; no default splash screen .db $03,$26,$09,$04,$04,$06f,$1b,$80 ; date stamp = 5/12/1999 .db $02,$0d,$40 ; encrypted TI date stamp signature .db $a1,$6b,$99,$f6,$59,$bc,$67 .db $f5,$85,$9c,$09,$6c,$0f,$b4,$03,$9b,$c9 .db $03,$32,$2c,$e0,$03,$20,$e3,$2c,$f4,$2d .db $73,$b4,$27,$c4,$a0,$72,$54,$b9,$ea,$7c .db $3b,$aa,$16,$f6,$77,$83,$7a,$ee,$1a,$d4 .db $42,$4c,$6b,$8b,$13,$1f,$bb,$93,$8b,$fc .db $19,$1c,$3c,$ec,$4d,$e5,$75 .db $80,$7f,$00,$00,$00,$00 ; program image length = 0 .dw $0000,$0000,$0000,$0000,$0000,$0000,$0000,$0000 ; padding (header length must be 128 bytes long) start: di ; disable interrupts (todo : check which bcall may resume them) bcall(_clrlcdfull) ; clear screen bcall(_indicatoroff) ; disable run indicator bcall(_cleargbuf) ; clear graph buffer res texterasebelow,(iy+textflags) ; reset some textflags res textinverse,(iy+textflags) ; reset some textflags ld hl,$0501 ld (currow),hl ld hl,zshell_string call iputs ld hl,zshell_appvar rst rmov9toop1 ; hl to op1 bcall(_chkfindsym) call c,create_zshell_appvar ex de,hl ; cause of _getbytepaged parameters ld a,b or a jr z,appvar_is_in_ram ; todo : unarchive appvar appvar_is_in_ram: inc hl inc hl ;skip size bytes call get_byte or a jr z,install_zshell uninstall_zshell: dec hl ld (hl),0 ld hl,$0003 ld (currow),hl ld hl,uninstalling_string call iputs bcall(_getkey) bcall(_jforcecmdnochar) install_zshell: dec hl ld (hl),1 ; set zschell installed in the appvar bit parserhookactive,(iy+hookflags4) ; activate parser hook jr nz,some_hook_already_exists ld hl,zschell_hook ; put hook adress into hl in a,(pmpagea) ; put page # into a bcall(_setparserhook) ; install hook ld hl,$0003 ld (currow),hl ld hl,installing_string call iputs bcall(_getkey) some_hook_already_exists: ; todo : ask for destroying or chaining it bcall(_jforcecmdnochar) ; quit the app get_byte: ld a,b or a ld a,(hl) push de call nz,get_byte_paged pop de inc hl ret get_byte_paged: ld a,b bcall(_getbytepaged) ld a,b ret create_zshell_appvar: ld hl,zshell_appvar rst rmov9toop1 ld hl,zshell_appvar_content_length-zshell_appvar_content bcall(_createappvar) ; todo : check if enough ram inc de inc de ; skip first two bytes (size of the appvar) ld hl,zshell_appvar_content ld bc,zshell_appvar_content_length-zshell_appvar_content ldir ld hl,zshell_appvar rst rmov9toop1 bcall(_chkfindsym) ret iputs: ld a,(hl) or a ret z bcall(_putc) inc hl jr iputs zshell_appvar: .db appvarobj,"zSHELL",0 zshell_appvar_content: .db 0 ; is installed .db 0 ; allow program writeback zshell_appvar_content_length: #include "hook.inc" zshell_string: .db "zSHELL",0 installing_string: .db "zSHELL has been installed",0 uninstalling_string: .db "zSHELL has been uninstalled",0 .end
hook.inc
zschell_hook: .db $83 ; used by os for hook safety check ld a,(parse_var) ; check the currently executed program type cp progobj jr z,run_program cp protprogobj jr nz,exit_zschell_hook run_program: exit_zschell_hook: or $80 ; reset zero flag, the parser can't continue to parse the variable ret

zSHELL.zip

Qu'en pensez-vous ? Il faudrait aussi discuter de l'header des programmes asm compatibles (pour ma part je pensais au moins inclure du code unsquishé au début qui afficherai un message d'erreur si le shell n'est pas installé).

La prochaine chose à coder est le hook en lui même (et gérer quelques autres cas gênant lors de l'installation : s'il y a déjà un hook d'installé, si l'appvar est dans l'archive etc...).

Quant au nom du shell, j'ai fait simple mais on peut tout à fait le changer, j'attend vos propositions ! happy