org 08000h ; EXTERNAL ROM SPECIFICATION BY YENO. FNAME "ROMLOADER.BIN" CPU Z80 dw 3004h ; Magic word $04 $30 DS 0FEh,00h ; Padding... ; ########### END OF YENO EXTERNAL ROM SPECIFICATION. !NO DOT MODIFY THE PROGRAM BELOW THIS WARNING! di ; ON NE **VEUT** PAS D'iNTERRUPTION! ld a, 00h ;SOUNDPatch out (12h), a;SOUNDPatch (woodpecker sound) call CLEAR_SCREEN ld a, 8+24+2 ; X ld b, 10 ; Y ld l, 0h ; Tiny ld de, _msg1 call PUT_TEXT ld a, 8+24+2 ; X ld b, 19 ; Y ld l, 1h ; Tiny ld de, _msg2 call PUT_TEXT ld hl, _imgLOADER ; Position de l'image en mémoire ld a, 8 ;Position X de l'image ld (0D36Dh), a ld a, 8 ;Position Y de l'image ld (0D36Eh), a ld a, 24 ;Taille X de l'image (multiple de 8!) ld (0D371h), a ld a, 19 ;Taille Y de l'image ld (0D372h), a call 06C8h ; Affiche l'image hamiga: ; LOADER ROM ld a,0 call UARTLecture ; IF A = 01h THEN JR LOADER_Ping cp 01h call z, LOADER_Ping ; IF A = 02h THEN JR LOADER_writemem cp 02h call z, LOADER_writemem ; IF A = 03h THEN JR LOADER_readmem cp 03h call z, LOADER_readmem ; IF A = 04h THEN CALL LOADER_writeport cp 04h call z, LOADER_writeport cp 05h call z, LOADER_readport ;cp 06h ;call z, LOADER_kbdtest ;cp 07h ;call z, LOADER_playsound ; SOUND TEST ;cp 08h ;call z, LOADER_ReadKeyboard ; Read Keyboard...AGAIN cp 09h call z, LOADER_Jump_FAR_ ; Execute program in RAM/ROM/Flash.... jr hamiga LOADER_Jump_FAR_: ; Lis 2 octets, l'adresse à executer et jr à cette addresse call UARTLecture ld h, a ; Charge HIGH call UARTLecture ld l, a ; Charge LOW jp (hl) jp $ ; Useless but FORCE a RESET! ;LOADER_ReadKeyboard: ; renvoie le status du clavier ;call 0BBEh ; Call Keyboard status refresh ;ld a, (0D376h) ;call UARTEcriture ;xor a ;ret ;LOADER_kbdtest: ; Structure : ; call 0DBAh ;... et renvoie "a"! ;call 0DBAh ;call UARTEcriture ;xor a ;ret LOADER_readport: ; Structure : ; Lis 1 octets de l'UART ; [PORT] ; et renvoie l'octet du port sur l'UART call UARTLecture ; Charge le port ld c, a in a, (c) ; Récupère l'info du port... call UARTEcriture ; ...et réenvoie l'info xor a ret LOADER_writeport: ; Structure : ; Lis 2 octets de l'UART ; [PORT], [OCTET] ; et l'envoie sur le port call UARTLecture ; charge le port ld c, a call UARTLecture out (c), a xor a ret LOADER_readmem: ; Structure : ; Lis 2 octets de l'UART ; [HIGH Address], [LOW Address] ; et renvoie via l'UART l'octet à HIGHLOW call UARTLecture ld h, a ; Charge HIGH call UARTLecture ld l, a ; Charge LOW ld a, (hl) call UARTEcriture ; Renvoie l'octet lu a (hl) xor a ret LOADER_writemem: ; Structure : ; Lis 3 octets de l'UART ; [HIGH Address], [LOW address], [OCTET] ; puis, écris OCTET à l'adresse HIGHLOW ; Ne renvoie rien via l'UART call UARTLecture ld h, a ; Charge HIGH call UARTLecture ld l, a ; Charge LOW call UARTLecture ; Charge 'a' avec OCTET ld (hl), a ; Ecris l'octet dans l'adresse HL xor a ret LOADER_Ping: ld a, 22h ; !! **RAM** Loader ! call UARTEcriture xor a ret UARTLecture: ; On attend de recevoir un octet de l'UART, le pousse dans 'a' in a, (45h) ; Lis le registre de status bit 0, a ; Teste si un octet est dans le buffer jr z, UARTLecture ; Si OCTET_RECU(bit0)=0 Va a AttenteLecture in a, (40h) ; Lis le buffer ld b, a finlecture: in a, (45h) ; Lis le registre de status bit 0, a ; Teste si un octet est dans le buffer jr nz, finlecture ld a, b ret ; PATCH ANTI-GLITCH ;ld c, a ;ld a, 0FFh ;out (40h), a ;ld a, c ret ; Ret UARTEcriture: ; On ecris un octet (reg a) sur le port série out (40h), a ; Envoie l'octet _uartecriturestatus: in a, (45h) ; Récupère le status bit 6, a ; Le buffer d'envoi est vide ET l'octet à été envoyé ? jr z, _uartecriturestatus ; Non ? Alors récupere le status et recheck... ret tempo1: ld c, 0FFh tempo1_sub: ld c, b ; Backup b content call tempo2 ld b, c ; Restore b content djnz tempo1 ret tempo2: push ix pop ix djnz tempo2 ret PUT_TEXT: ; CODE XREF: BOOTStart+8EC3p ; a=X b=Y l=CHAR FONT ld h,0h ld c,0h ld (0D36Dh), a ; X Position (PIXEL) ld a, b ld (0D36Dh+1), a; Y Position (PIXEL) ;ld l, 41h ; Char. Style ($4X) X=0 Tiny font, X=1 Bold font, X=2 BIG FONT ld a, l add 40h ld l, a call 01D0Ah ret CLEAR_SCREEN: call 05CBh ; Clear screen ret _msg1: db 'YENO Z80 Loader',0h _msg2: db 'Alex BOTZUNG',0h _imgLOADER: incbin "imgLOADER.bin"