DEFUSR=&H7D75:A=USR(0)
The DiskROM doesn't like to be initialised twice, so booting cartridges that use the diskdrive will crash.
Call_System:
ld hl,Start ; relocate to page 3 and execute
ld de,0C000h
push de
ld bc,End-start
ldir
ret
Start: ld a,(0FCC1h)
push af
ld h,00h
call 0024h
pop af
ld h,40h
call 0024h
xor a
ld hl,0F41Fh
ld (0F860h),hl
ld hl,0F423h
ld (0F41Fh),hl
ld (hl),a
ld hl,0F52Ch
ld (0F421h),hl
ld (hl),a
ld hl,0F42Ch
ld (0F862h),hl
ld hl,0C000h+System-Start
jp 4601h
System: db 3Ah,0CAh,"SYSTEM",0
End:
DOS2 only: It's possible to directly load a different program or batchfile using: SYSTEM("progname params"), but in order to avoid an error on exit, you must set the "PROG" environment variable to "$SHELL" using function 6Ch.
; HL = pointer to hex output buffer (upper case ASCII) ; A = binary number to convert Bin2Hex: ld b,a rrca rrca rrca rrca and 0Fh ; These instructions are the important ones cp 10 ; sbc a,69h ; daa ; ld (hl),a inc hl ld a,b and 0Fh cp 10 sbc a,69h daa ld (hl),a ret
; In: A = dividend ; Out: B = quotient, A = rest ; Chg: AF,AF',BC Div10: ld c,a sub 10 ex af,af' ; rest = quotient - 10 ld a,c srl c srl c sub c ; quotient = quotient - quotient >> 2 srl c srl c srl c add a,c ; quotient = quotient + quotient >> 5 rrca rrca rrca and 00011111b ; quotient = quotient >> 3 ld b,a add a,a add a,a add a,b ; temp = quotient + quotient << 2 add a,a ld c,a ; temp = temp << 1 ex af,af' sub c ; rest = rest - temp jp p,.plus ; IF rest < 0 THEN add a,10 ; rest = rest + 10 ret .plus: ; ELSE inc b ; quotient = quotient + 1 ret ; END IF
; CALSUB
;
; In: IX = addr of routine in MSX2 subrom
; AF, HL, DE, BC = parameters for the routine
;
; Out: AF, HL, DE, BC = depending on the routine
;
; Changes: IX, IY, AF', BC', DE', HL'
;
; Call MSX2 subrom from MSXDOS. Should work with all versions of MSXDOS.
;
; Notice: NMI hook will be changed. This should pose no problem as NMI is
; not supported on the MSX at all.
;
CALLSLT equ 001ch
NMI equ 066h
EXTROM equ 015fh
EXPTBL equ 0fcc1h
H_NMI equ 0fdd6h
;
CALSUB: exx
ex af,af' ; store all registers
ld hl,EXTROM
push hl
ld hl,0c300h
push hl ; push NOP ; JP EXTROM
push ix
ld hl,021ddh
push hl ; push LD IX,
ld hl,03333h
push hl ; push INC SP; INC SP
ld hl,0
add hl,sp ; HL = offset of routine
ld a,0c3h
ld (H_NMI),a
ld (H_NMI+1),hl ; JP in NMI hook
ex af,af'
exx ; restore all registers
ld ix,NMI
ld iy,(EXPTBL-1)
call CALLSLT ; call NMI-hook via NMI entry in ROMBIOS
; NMI-hook will call SUBROM
exx
ex af,af' ; store all returned registers
ld hl,10
add hl,sp
ld sp,hl ; remove routine from stack
ex af,af'
exx ; restore all returned registers
ret
Here is a tutorial with example source code.
Here is a tutorial with example source code.
Here is a tutorial with example source code.
Here is a tutorial with example source code.