📄 kc.lib
字号:
;;; /* Process stack. */HW equ 105 ;;; int **HW;Stack equ 106 ;;; int *Stack[8];;;; /* Interrupt descriptor table. */SP_IE0 equ 114SP_TF0 equ 115SP_IE1 equ 116SP_TF1 equ 117SP_RI equ 118SP_TI equ 119SP_TF2 equ 120SP_BASE equ 126;;; Special function registers for the 8052T2CON equ 0xc8RCAP2L equ 0xcaRCAP2H equ 0xcbTL2 equ 0xccTH2 equ 0xcd;;; SFR bits for the 80c52.;;; IE and IPET2 bit IE.5PT2 bit IP.5;;; P1T2Ex bit P1.1T2 bit P1.0;;; T2ConTF2 bit T2Con.7EXF2 bit T2Con.6RCLK bit T2Con.5TCLK bit T2Con.4EXEN2 bit T2Con.3TR2 bit T2Con.2C_T2 bit T2Con.1CP_RL2 bit T2Con.0org 0sjmp Startorg 03h mov R0, #SP_IE0 acall Resumeretiorg 13h mov R0, #SP_IE1 acall Resumeretiorg 23h jbc TI, DidTx jbc RI, DidRxretiorg 2bhpush PSWpush Accpush 0push 1 clr TF2 mov R0, #SP_TF2 acall Resumepop 1pop 0pop Accpop PSWretiDidTx: mov R0, #SP_TI acall ResumeretiDidRx: mov R0, #SP_RI acall ResumeretiStart: ;;; Install main(), set its return address to Idle(). mov HW, #Stack ;;; HW = &Stack[0]; mov SP, #(SP_BASE - 1) ;;; SP = SP_BASE - 1; mov DPTR, #Exit push DPL push DPH ;;; @SP++ = Exit(); acall mainIdle: orl PCON, #1sjmp IdlePause: ;;; void Pause(int @@R0) { mov @R0, SP ;;; @R0 = SP;clr EA dec HW mov R0, HWsetb EA mov SP, @R0 ;;; SP = @--HW;ret ;;; "idle until resume";Resume:clr EA mov R1, HW inc HWsetb EA mov @R1, SP ;;; @HW++ = SP; mov SP, @R0 ;;; SP = @R0; mov @R0, #(SP_BASE + 1) ;;; @R0 = SP_BASE + 1;ret ;;; }Spawn: ;;; int Spawn(int @R0, void (*DPTR)())) {clr EA mov R1, HW inc HWsetb EA mov @R1, SP ;;; @HW++ = SP; dec R0 mov SP, R0 ;;; SP = --R0; acall _Enter ;;; (*DPTR)();Exit:clr EA dec HW mov R0, HWsetb EA mov SP, @R0 ;;; SP = @--HW;ret ;;; }_Enter: push DPL push DPHret
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -