Mais um blog inútil.

Useless

Julho 22, 2010

Maquinas Fotográficas Vintage

Arquivado em: lulz, serious-business, useless — falso @ 23:37

Ora viva amigalhaços!
Eu desde há uns tempos que ando fascinado com maquinas fotográficas clássicas, e então há coisa de uns meses atrás vi alta pérola no eBay, uma Kodak Junior II por um preço mesmo bacano, o gajo la dizia que estava boa, e o rating dele era 100% então comprei logo à fome.

Pronta a dispararDetalhe da lente

Quando a recebi é que descobri que havia um drama maior, esta maquina usa rolos de 620, que já não são fabricados, mas com ajuda das Internets descobri que existem os rolos de 120, mas há um pequeno problema, o “carreto” dos rolos de 120 é um bocado mais comprido e mais largo que os de 620, e não cabe na minha maquina. E de novo, Internets to the rescue, achei uns documentos a explicar que se pode limar e cortar um bocado do plástico dos rolos de 120 ate atingirem o tamanho dos clássicos de 620.
Comprei então um pack de 5 rolos de 120 a PB no eBay por alta preço, pedi uma lima toda xpto a um amigo, e eu mais a minha namorada aplicamos-nos a lixar até aquilo caber na maquina.

Depois entretanto parti uma perna e tal, e o rolo teve mil anos na maquina, até que houve um dia que fui com uns amigos até aos Algarves, e eu mandei logo a dica que tínhamos de passar na Praínha de Alvor para tirar umas fotos, porque há uns aninhos atrás o grande Xumpi levou-me la e amei mesmo aquilo.

Andei lá de tripé e tal na praia a tirar fotos com esta relíquia :-P Quando voltei, pus o rolo a revelar, e DUAS SEMANAS E MEIA depois estava revelado, e o resultado foi melhor do que eu esperava!

nameNNNN-001nameNNNN-003nameNNNN-006nameNNNN-004

As fotos estão todas aqui.


Agora há umas semanas atrás novamente no eBay vi alta SLR classica dos anos 70 fabricada na RDA, uma Praktica Super TL 1000, o preço era tão apetecível que não resisti e comprei.

Esta maquina já é mais profissional, é a minha primeira SLR, e pelo que descobri um pouco tempo depois de a ter é que existem MONTES de lentes para ela, usa o tipo de rosca M42. Tem alta “light-meter” para dizer como esta o nível de luz, bem, é uma maravilha! Comprei um rolo, e nestas ferias tenho estado a tirar fotografias com ela. Revelei-as hoje, e para mim ficaram mesmo baris! Estão com alta aspecto vintage, parece que foram tiradas nos anos 70 ou 80.

prakticaNNNN-004prakticaNNNN-001prakticaNNNN-012prakticaNNNN-021prakticaNNNN-025prakticaNNNN-008

As fotos estão todas aqui.

Espero que tenham curtido, fiquem bem e joguem muito!

Junho 4, 2010

Lost Eden

Arquivado em: coding, serious-business, useless — falso @ 00:11

Olá pessoal.

Eu há uns tempos, quando ainda estava de cama, lembrei-me de um granda jogo dos tempos do DOS, o Lost Eden. A história é sobre um mundo onde os humanos e os dinossauros coexistiam, e eram amigos (alguns), e era bem fixe para a altura!
O jogo era feito de animações em vídeo, género ficheiros FLC feitos no 3D Studio, e incluía altas musicas do grande compositor Stéphane Picq (eu tenho o CD original da banda sonora ;-).

Andei à procura nas internets a ver se alguém já tinha feito o reverse engineer ao jogo, e se já dava para jogar em SO actuais, mas pelos vistos não. A única maneira de o jogar é no DOSBox, mas fica uma beca com frame-skip.
Decidi então, mesmo sabendo que não ia fazer nada de jeito, tentar eu algo.

O jogo vem com alta ficheiro de 431MB chamado EDEN.DAT, fui então primeiro tentar descobrir qual é o conteúdo desse ficheiro.

Este site explica o seguinte:
The EDEN.DAT file begins with 2 bytes which might indicate the number of files contained in the GRAF. Following this number is a series of 25-byte records. Each record is laid out as follows:
bytes 0-11 filename: typically 8.3 DOS filenames, padded with zeroes
bytes 12-15 unknown
bytes 16-19 file size
bytes 20-23 absolute offset of file within GRAF
byte 24 unknown

Então meti mãos à obra, e fiz um script para extrair todos os ficheiros que estão no EDEN.DAT.

#!/opt/local/bin/python
# this script can never fail
import os
import struct

dat = open("EDEN.DAT", "rb")

dat.seek(0)
(total,) = struct.unpack("<H", dat.read(2))
print "O total de ficheiros e: %i" % total

# primeiro 0x2 - 2
# segundo 0x1b - 27
# terceiro 0x34 - 52

for info in range(0,total):
#for info in range(0,1000):
    start = 2+25*info
    
    dat.seek(start)
    filename = str.strip(dat.read(12),'\x00')
    if filename != "":
        print "Filename: %s" % filename
    
        dat.seek(start+16)
        (file_size,) = struct.unpack("<L", dat.read(4))
        print "Tamanho : %i bytes" % file_size
    
        dat.seek(start+20)
        (file_offset,) = struct.unpack("<L", dat.read(4))
        print "Offset: 0x%x" % file_offset
    
        destfn = os.path.join("rip/",filename)
        print "A escrever ficheiro %i: %s " % (info, repr(destfn))
        dat.seek(file_offset)
        dest = open(destfn, "wb")
        dest.write(dat.read(file_size))
        dest.close

dat.close

Consegui então extrair, montes de ficheiros VOC, que são todas as vozes e musicas do jogo, e também vários ficheiros mais ou menos grandes com a extensão HNM e com mais umas buscas nas internets descobri que o HNM é alta formato de video proprietário da já extinta CRYO Interactive Entertainment e que não há nenhum decoder ainda feito. Com essa informação fiquei triste e nunca mais toquei nisto, mas hoje liguei aqui o maczinho e vi aqui isto, e achei que era uma boa coisa para blogar, nem que seja para não perder o código. Espero que tenham gostado.

Fiquem bem, e joguem muito!

Maio 27, 2010

Arvorezinha - HP Precision Architecture (aka PA-RISC aka DEMONIO)

Arquivado em: arvorezinha, assembly, coding, useless — paf @ 16:36

E ca fica mais uma arvorezinha, desta vez numa arquitectura demoniaca.

hpux$ cat arvorezinha.S
        .LEVEL 1.1							; cenas gays do hpux
        .SPACE $PRIVATE$						; o HPPA funciona por spaces, ler arch book
        .SUBSPA $DATA$,QUAD=1,ALIGN=8,ACCESS=31				; pra mais informacoes ou esquizofrenia antecipada
        .SUBSPA $BSS$,QUAD=1,ALIGN=8,ACCESS=31,ZERO,SORT=82
        .SPACE $TEXT$
        .SUBSPA $LIT$,QUAD=0,ALIGN=8,ACCESS=44
        .SUBSPA $CODE$,QUAD=0,ALIGN=8,ACCESS=44,CODE_ONLY
        .IMPORT $global$,DATA
        .IMPORT $$dyncall,MILLICODE
        .IMPORT write,CODE						; eh mais simpatico fazer imports
        .IMPORT exit,CODE
        .IMPORT __main,CODE
        .SPACE $TEXT$
        .SUBSPA $LIT$

        .align 4
STAR
        .STRING "\x2a\x00"
LF
        .STRING "\x0a\x00"
        .SPACE $TEXT$
        .SUBSPA $CODE$

        .align 4
        .NSUBSPA $CODE$,QUAD=0,ALIGN=8,ACCESS=44,CODE_ONLY
        .EXPORT main,ENTRY,PRIV_LEV=3,RTNVAL=GR				; a cena dos privilege levels eh funny
main
        .PROC
        .CALLINFO FRAME=64,CALLS,SAVE_RP,SAVE_SP,ENTRY_GR=3
        .ENTRY
        .CALL
        xor     %r4,%r4,%r4						; aka meter %r4 a zero :)

arewedoneyet
        comib,=,n 5,%r4,kk10xbai					; se %r4 for 5, BAI NAO!
        nop
        xor     %r3,%r3,%r3						; inicializar o counter do segundo loope

letsdothis
        comb,<=,n %r3,%r4,estrela					; se o %r3 for menor ou igual a %r4
        xor %r1,%r1,%r26						; sim, isto eh um nop							

        ldi 1,%r26							; escolher o fd (1 eh stdout)
        ldil LR'LF,%r19							; copiar a stringue com
        ldo RR'LF(%r19),%r25						; paneleirices...
        ldi 1,%r24							; length da stringue
        .CALL ARGW0=GR,ARGW1=GR,ARGW2=GR
        bl write,%r2
        xor %r1,%r2,%r3							; sim, isto eh um nop

        addi    1,%r4,%r4						; incrementar o %r4
        b       arewedoneyet
        shladd %r4,2,%r8,%r15						; sim, isto eh um nop

estrela
        ldi 1,%r26							; ver outro write
        ldil LR'STAR,%r19						; eh a mm merda
        ldo RR'STAR(%r19),%r25
        ldi 1,%r24
        .CALL ARGW0=GR,ARGW1=GR,ARGW2=GR
        bl write,%r2
        add %r13,%r14,%r15						; sim, isto eh um nop

        addi    1,%r3,%r3
        b       letsdothis
        nop								; adivinha...

kk10xbai
        ldi 0,%r26
        .CALL ARGW0=GR
        bl exit,%r2
        shrpw %r8,%r7,8,%r9     ; nop nop nop
        subi,OD  42,%r3,%r12    ; nop nop nop nopppppp! :D
        .EXIT
        .PROCEND
hpux$ gcc arvorezinha.S
*
**
***
****
*****
hpux$

jah agora para esclarecer um pouco certas esquisitisses desta arquitectura, para loadar uma word (32 bits), como todas as instruções têm de ter 32bits eh obvio que nao da para meter um endereço com esse tamanho e ainda gastar 6 bits num opcode. entao o que estes genios da computacao fizeram foi primeiro loadar 21 bits e depois os 11 bits restantes.

tipo ali em cima
ldil LR’STAR,%r19
ldo RR’STAR(%r19),%r25
LR’ saca 21 bits da string STAR para o %r19
RR’ saca os 11 bits que faltam…

digam la, HPPA nao eh uma arquitectura magnifica ? (FUCK NO!)

Maio 25, 2010

Arvorezinha - SPARC!

Arquivado em: arvorezinha, assembly, coding, useless — paf @ 15:10

Btw, esta arch é meio intragável….

solaris$ cat arvore.S
.section  ".rodata1"
.align    4
.L0:
        .ascii           "*\0"
.L1:
        .ascii          "\n\0"

.L2:
        .ascii          "bla\n\0"

        .section        ".text"
        .global         main
main:
        save            %sp,-96,%sp
        mov 0,%g2

arewedoneyet:
        cmp %g2,5       ! comparar com RFC_MAX pois claro, n eh preciso registry pra isto
        be weredonefaggot

        mov 0,%g3       ! inicializar counter1

estrelitas:
        cmp %g3,%g2     ! ah e tal, compara-me a pissa, less or equal?
        ble estrela

        set .L1,%o0     ! meter LF no output register, e mandar printar
        call printf

        inc %g2         ! increasar o counter2
        ba arewedoneyet

estrela:
        set     .L0,%o0 ! printar estrelinha
        call    printf

        inc %g3
        ba estrelitas

weredonefaggot:
        nop
        restore

solaris$ gcc arvore.S -o arvorezinha
solaris$ ./arvorezinha
*
**
***
****
*****
solaris$

Arvorezinha - melhor arquitectura do mundo (Alpha)

Arquivado em: arvorezinha, assembly, coding, useless — paf @ 12:53

Como se lê no subject, fica aqui uma arvorezinha na melhor arquitectura à face do planeta. Em breve na terceira melhor arquitectura à face do planeta…(SPARC)

true64> gcc arvore.S -o arvorezinha
true64> ./arvorezinha
*
**
***
****
*****
true64> cat arvore.S
.data
LF:             .ascii          "\n\0"
GAY:            .ascii          "*"

.text
        .align  4
        .set    noreorder
        .arch   ev4
        .globl  main
        .ent    main

main:
        ldgp    $gp,0($27)		# load ao global pointer
        stq     $26,0($sp)			# inicializar o stack pointer (só naquela)

        lda $10,5                       	# RFC_MAX para o loop principal
        lda $9,0				# counter do loop1

loop1:
        cmpeq $9,$10,$7			# se $9 igual $10, branchar para o final
        bne $7,final

        lda $11,0				# counter para o loop2

loop2:
        cmple $11,$9,$7			# se $11 menor ou igual q $9, estrelar!
        bne $7,estrela

        lda $16,LF				# new line pl0x
        jsr $26,printf
        ldgp $gp,0($26)

        lda $9,1($9)			# uma maneira gay de incrementar
        br loop1

estrela:
        lda     $16,GAY			# printar estrelinha...
        jsr     $26,printf			# é sempre preciso fazer reset ao $gp
        ldgp    $gp,0($26)		# depois de usar uma função

        addq $11,1,$11			# outra maneira gay de incrementar :p
        br loop2

final:
        mov     $31,$0                  # return = 0
        ldq     $26,0($sp)              # limpar a stacka, se bem q nao foi usado mas pronto..
        ret     $31,($26),1             # returnarrrrrrrrr
        .end    main

true64>

Arvorezinha - C++ Templates

Arquivado em: arvorezinha, useless — dcoder @ 11:07

A pedido de várias famílias, aqui está uma versão da árvorezinha em C++, sem loops. Os loops são avaliados durante a compilação; o código final contém apenas a sequência de caracteres impressos.

#include <iostream>

enum
{
	LIMIT = 5+1
};

template <int x>
void inner(void)
{
	std::cout << '*';
	inner<x-1>();
}

template <>
void inner<0>(void){}

template <int x>
void outer(void)
{
	inner<x>();
	std::cout << std::endl;
	outer<x+1>();
}

template<>
void outer<LIMIT>(void){}

int main(int argc, char **argv)
{
	outer<1>();
	return 0;
}

Maio 23, 2010

Arvorezinha - REXX

Arquivado em: arvorezinha, coding, useless, windows — falso @ 03:35

Olá de novo, o meu caro amigo cardinal já há uns dias que me tem dito que para eu ser verdadeiramente inútil tinha de fazer uma arvorezinha em AREXX. Fui então pesquisar o que é isso era e descobri que o AREXX é uma implementação para Amiga da linguagem REXX criada pela IBM em 1979 (pelo menos segundo a Wikipedia).
O cardinal disse-me para experimentar o AROS (que é uma implementação do AmigaOS para outras arquitecturas) numa maquina virtual, mas aquilo pareceu-me bues de arcaico. Então fui foi à procura dum interpretador de REXX para Windows, e achei o BREXX (o site é mesmo belo, por isso é que partilhei o urle) e como não há uma sem duas, decidi fazer mais esta arvorezinha hoje, então aqui vai.

/* this script can never fail */
MAX = 5
do i = 1 to MAX by 1
	linha = ""
	do x = 1 to i by 1
		linha = linha || "*"
	end
	say linha
end

E aqui está a prova dos nove.

Arvorezinha - Google Go

Arquivado em: arvorezinha, coding, linux, useless — falso @ 02:54

Olá amigos, estava aqui aborrecido e já a pensar em ir-me deitar porque não tinha series para ver nem nada para fazer, e então lembrei-me que não havia arvorezinha na linguagem de programação Go da Google, então pus mãos à obra, e foi tão simples que até pensei não vir aqui blogar sobre isso, mas como não tinha nada para fazer, aqui vai o sores.

/* this crap can never fail */

package main

import "os"

func main() {
	var RFC_MAX int = 5
	for i := 1; i <= RFC_MAX; i++ {
		for x := 0; x < i; x++ {
			os.Stdout.WriteString("*")
		}
		os.Stdout.WriteString("\n")
	}
}

E a tal pic que toda a gente gosta, como prova!

Maio 21, 2010

Cracking 102

Arquivado em: assembly, cracking, fail, useless — falso @ 20:21

Ora viva amigos!
Há uns dias lembrei-me do mítico Championship Manager Itália 94/95, e das múltiplas tentativas que fazia para o conseguir jogar devido à protecção anti-copia, que basicamente pedia o resultado do jogo X da pagina Y do manual.

Então lá eu ficava montes de tempo a experimentar combinações ate conseguir jogar. Nessa altura sonhava em conseguir crackar aquilo, mas skills de cracking nesse tempo eram quase nulos. Decidi então tentar hoje.

Abri o CM.EXE num dissassembler e procurei por “Please enter the result”, e vi onde essa string era referenciada, fui parar a uma função que me parecia que era onde era feito o check dos resultados, mas parecia um bocado complexa portanto decidi tentar outra aproximação, fui ver onde esta função do check era chamada e…

seg001:0054                         loc_18FE4:                              ; CODE XREF: _main+47j
seg001:0054 9A 25 00 E4 61                          call    sub_61E65       ; Função do check
seg001:0059
seg001:0059                         loc_18FE9:                              ; CODE XREF: _main+99j
seg001:0059 1E                                      push    ds
seg001:005A 68 18 01                                push    offset aChampionshipMa ; "Championship Manager Italia"
seg001:005D 9A F9 48 83 1A                          call    sub_1F129       ; Call Procedure
seg001:0062 1E                                      push    ds
seg001:0063 68 35 01                                push    offset aHelpNewGameCon ; "*Help|New Game|Continue Season|Quick St"...

Vi que o código a seguir ao CALL parecia ser o menu inicial do jogo então alterei os 5 bytes do CALL para 90 (NOP - No OPeration) e não é que foi logo? A parte do check já nem aparece, vai logo directamente para o menu inicial!
Melhor que isto só mesmo o Benfica ser campeão, oh wait…

Maio 16, 2010

Arvorezinha 68K Assembly

Arquivado em: arvorezinha, assembly, coding, useless — falso @ 22:36

Hoje devido aos posts de hoje do falco sobre arvorezinhas ganhei um pouco de moral e fui à procura de arquitecturas que ainda não tivesse feito em assembly e lembrei-me dos Motorola 68K, os que eram usados nos MACs antigos.
Decidi então meter as mãos à obra, e fui procurar um emulador/simulador ou algo do género para este processador e achei o Easy68K que é um três-em-um, Editor, Assembler e Debugger.
Fiquem bem e joguem muito.

* -------------------------------------------can never fail-
* Program    : arvorezinha
* Written by : Pedro de Oliveira
* Date       : 16/05/2010
* Description: Implementação da arvorezinha em 68K assembly 
*-----------------------------------------------------------
        ORG     $1000
START:                          ; first instruction of program

main:
        MOVE.B  #5,d7           ; maximo de linhas/asteriscos
                                ; está a usar o RFC standard 5
        MOVE.B  #0,d5           ; inicializa o counter1 (d5) a 0

ciclo1:
        CMP.B   d5,d7           ; verifica se chegamos o fim
                                ; comparando o counter1 ao maximo
        BEQ     final           ; se for igual salta para o fim
	
        MOVE.B  #0,d6           ; inicializa o counter2 (d6) a 0

ciclo2:
        CMP.B   d5,d6           ; compara o counter1 com o counter2
        BEQ     estrela         ; se for igual
        BLT     estrela         ; ou menor imprime um asterisco
	
        LEA     newline,a1      ; imprime uma newline
        JSR     print
	
        ADD     #1,d5           ; incrementa o counter1
        JMP     ciclo1          ; salta para o ciclo1

estrela:
        LEA     _estrel,a1      ; imprime um asterisco
        JSR     print
	
        ADD     #1,d6           ; incrementa o counter2
        JMP     ciclo2          ; salta para o ciclo2

final:
        MOVE.B  #9,D0
        TRAP    #15             ; halt simulator

print:
        MOVE.B  #14,d0
        TRAP    #15
        RTS

* Variables and Strings

_estrel	DC.B    '*',0
newline DC.B    $0D,$0A,0

        END     START           ; last line of source