mac-rom/OS/MPDispatchStub.a

72 lines
1.2 KiB
Plaintext

; This ROM implementation of the MPDispatch trap (AA7F) only implements two
; selectors, both for writing to the NanoKernel framebuffer/serial log.
; To print a C string:
; PEA @cstring
; MOVE #-3, -(SP)
; DC.W $AA7F
; To print a hex string:
; MOVE.L #value, -(SP)
; MOVE #2, -(SP) ; 1: byte, 2: word, else: long
; MOVE #-2, -(SP)
; DC.W $AA7F
MPDispatchStubTrap PROC EXPORT
CmpI #-3, $4(SP)
BEQ.S NKxprintf
CmpI #-2, $4(SP) ;
BEQ.S NKPrintHex
Pea.L @errStr ; ERROR
Clr -(SP)
Bsr NKxprintf
MoveQ.L #$0, D0
Move $4(SP), D0
Move.L D0, -(SP)
Move.L #$2, -(SP)
Clr -(SP)
Bsr NKPrintHex
Rts
string Pascal
@errStr dc.b 'Unknown MPDispatch selector: ', 0, 0
NKxprintf
MoveA.L $6(SP), A0
@loop Move.B (A0)+, D0 ; iterate over string to get it in physical RAM?
BNE.S @loop
MoveA.L $6(SP), A0
MoveQ.L #96, D0 ; call NKXprintf
dc.w $fe1f
MoveA.L (SP)+, A0 ; return
AddQ.L #$6, SP
Jmp (A0)
NKPrintHex
MoveA.L $A(SP), A0 ; r3 arg (value to print)
Move.L $6(SP), D1 ; r4 arg (1: byte, 2: 2byte, else: 4byte)
MoveQ.L #97, D0 ; call NKPrintHex
dc.w $fe1f
MoveA.L (SP)+, A0 ; return
dc.w $defc, $000A
; AddA.W #$A, SP
Jmp (A0)
END