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

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...)

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 !
