; xos/s 20-Jun-2005 J.G.Harston ; ; Error-trapping MOS calls ; ; ; r[0]=A; r[1]=X; r[2]=Y; r[3]=P ; status=xos_call(r); ; status==0 - no error returned, A=r[0]; X=r[1]; Y=r[2]; P=r[3]; ; status<>0 - error occured, ERR=status[0]; REPORT=status+1; ; status==-1 - escape occured and acknowledged _xos_cli jsr ~xos .word oscli-1 _xos_byte jsr ~xos .word osbyte-1 _xos_word jsr ~xos .word osword-1 _xos_wrch jsr ~xos .word oswrch-1 _xos_asci jsr ~xos .word osasci-1 _xos_file jsr ~xos .word osfile-1 _xos_args jsr ~xos .word osargs-1 _xos_bget jsr ~xos .word osbget-1 _xos_bput jsr ~xos .word osbput-1 _xos_gbpb jsr ~xos .word osgbpb-1 _xos_find jsr ~xos .word osfind-1 ; xos(reg *r) ; ----------- ~xos pla sta tr+0 ; (tr)=address of data after JSR pla sta tr+1 ldy #0 lda (sp),y sta pr+0 iny lda (sp),y ; sta pr+1 ; (pr)=address of register block lda (brk+1) pha lda (brkv+0) pha ; Save current BRKV lda #>~xostrap sta (brkv+1) lda #<~xostrap sta (brkv+0) lda rsp pha ; Save current return stack pointer tsx stx rsp ; Save stack pointer jsr ~xosjmp ; Call inline address sta tr+0 ; Store returned values stx tr+1 sty tr+2 php pla sta tr+3 dey ~xos2 lda (tr),y ; Copy returned registers sta (pr),y iny cpy #4 bne ~xos2 ldx #0 ldy #0 ; Prepare to return zero bit 0xff bpl ~xosexit ; No pending escape lda #126 jsr osbyte ; Acknowledge escape state dex dey ; Return -1 to indicate escape ~xosexit pla sta rsp ; Restore return stack pointer pla sta (brkv+0) pla sta (brkv+1) ; Restore BRKV rts ~xosjmp ldy #1 lda (tr),y ; Point to inline address pha iny lda (tr),y pha ; Push it onto the stack iny lda (pr),y ; Get P pha ; Push it for later ldy #0 lda (pr),y ; Get A pha ; Push it for later iny lda (pr),y ; Get X tax iny lda (pr),y ; Get Y tay pla ; Get A back plp ; Get P back rts ; Jump to OS routine ~xostrap ldx rsp txs ; Restore stack pointer ldx &FD ldy &FE ; Get pointer to error in &XXAA jmp ~xosexit