Voglio proporre una "challenge" un pò insolita ma secondo me interessante/stimolante, trovata alcuni anni fa su codegolf: Emulate an Intel 8086 CPU.
Si tratta di emulare parzialmente una CPU Intel 8086. Riporto le specifiche originali alle quali attenersi:
Allego lo zip contenente il programma di test che dovrà essere eseguito, e il relativo codice (sono i medesimi del post originale). Il programma di test è un ".com".
Eseguendo quel programma di test dovrete ottenere il seguente output:
Ovviamente potete utilizzare il linguaggio che preferite: dal JS al C passando per Java, Go, PHP e altri.
Se volete implementare più opcodes o funzionalità aggiuntive, ben venga.
Alcune risorse utili sono:
Secondo me tra le risorse migliori c'è quella allegata: da pagina 26 è presente la decodifica delle istruzioni; l'ultima pagina mostra le modalità di indirizzamento oltre ai registri e le relative codifiche.
Potete trovare molte altre informazioni anche online.
Se avete soluzioni parziali, domande, difficoltà o altro... scrivete comunque, senza timori.
Buon divertimento a chi sceglierà di partecipare!
Si tratta di emulare parzialmente una CPU Intel 8086. Riporto le specifiche originali alle quali attenersi:
Start with ip = 0 and sp = 100h.
- Only the following opcodes need to be implemented:
- mov, push, pop, xchg
- add, adc, sub, sbb, cmp, and, or, xor
- inc, dec
- call, ret, jmp
- jb, jz, jbe, js, jnb, jnz, jnbe, jns
- stc, clc
- hlt, nop
- As a result of this, you only need to calculate the carry, zero and sign flags
- Don't implement segments. Assume cs = ds = ss = 0.
- No prefixes
- No kinds of interrupts or port IO
- No string functions
- No two-byte opcodes (0F..)
- No floating point arithmetic
- (obviously) no 32-bit things, sse, mmx, ... whatever has not yet been invented in 1979
- You do not have to count cycles or do any timing
Input: Your emulator should take a binary program in any kind of format you like as input (read from file, predefined array, ...) and load it into memory at address 0.
Output: The video RAM starts at address 8000h, every byte is one (ASCII-)character. Emulate a 80x25 screen to console. Treat zero bytes like spaces.
Example:
Codice:08000 2E 2E 2E 2E 2E 2E 2E 2E 2E 00 00 00 00 00 00 00 ................ 08010 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 08020 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 08030 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 08040 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 08050 48 65 6C 6C 6F 2C 20 77 6F 72 6C 64 21 00 00 00 Hello,.world!...
Allego lo zip contenente il programma di test che dovrà essere eseguito, e il relativo codice (sono i medesimi del post originale). Il programma di test è un ".com".
Eseguendo quel programma di test dovrete ottenere il seguente output:
Codice:
.........
Hello, world!
0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~
################################################################################
## ##
## 0 1 1 2 3 5 8 13 21 34 55 89 144 233 377 610 987 ##
## ##
## 0 1 4 9 16 25 36 49 64 81 100 121 144 169 196 225 256 289 324 361 400 ##
## ##
## 2 3 5 7 11 13 17 19 23 29 31 37 41 43 47 53 59 61 67 71 73 79 83 89 97 ##
## ##
## ##
## ##
## ##
## ##
## ##
## ##
## ##
## ##
## ##
## ##
## ##
################################################################################
Ovviamente potete utilizzare il linguaggio che preferite: dal JS al C passando per Java, Go, PHP e altri.
Se volete implementare più opcodes o funzionalità aggiuntive, ben venga.
Alcune risorse utili sono:
Secondo me tra le risorse migliori c'è quella allegata: da pagina 26 è presente la decodifica delle istruzioni; l'ultima pagina mostra le modalità di indirizzamento oltre ai registri e le relative codifiche.
Potete trovare molte altre informazioni anche online.
Se avete soluzioni parziali, domande, difficoltà o altro... scrivete comunque, senza timori.
Buon divertimento a chi sceglierà di partecipare!