home *** CD-ROM | disk | FTP | other *** search
Text File | 1997-09-02 | 25.9 KB | 1,107 lines |
- */beginfile QDOS1_asm
- ; --------------------------------------------------------------
- ; QDOS1_asm - The QDOS kernel
- ; - last modified 17/03/97
- ; QDOS-Amiga sources by Rainer Kowallik
- ; ...latest changes by Mark J Swift
- ; --------------------------------------------------------------
- ;*/beginoverlay
- ORG0:
- DC.L $28480
- ;ORG0:
- DC.L SYS_STARt-ORGN
- DC.L BUSERR-ORGN
- DC.L ADR_ERR-ORGN
- DC.L MOVP_EMU-ORGN
- DC.L ZERO_DIV-ORGN
- DC.L CHK_INST-ORGN
- DC.L TRAPV_INst-ORGN
- DC.L MSR_EMU-ORGN ; priviledge error
- DC.L TRACE-ORGN
- ; line %1010 emulator - not implemented in JS
- L00028:
- DC.L TAS_EMU-ORGN
- ; line %1111 emulator - not implemented on JS
- DC.L TAS_EMU-ORGN
- ; other vectors are reserved
- DC.L TRPOTHER-ORGN
- DC.L TRPOTHER-ORGN
- DC.L TRPOTHER-ORGN
- DC.L TRPOTHER-ORGN
- DC.L TRPOTHER-ORGN
- DC.L TRPOTHER-ORGN
- DC.L TRPOTHER-ORGN
- DC.L TRPOTHER-ORGN
- L00050:
- DC.L TRPOTHER-ORGN
- L00054:
- DC.L TRPOTHER-ORGN
- DC.L TRPOTHER-ORGN
- L0005C:
- DC.L TRPOTHER-ORGN
- ; long vectors for interrupt levels 0 through 7
- L00060:
- DC.L ILLEG_INT-ORGN
- DC.L ILLEG_INT-ORGN
- DC.L QL_MAIN_INT-ORGN
- DC.L ILLEG_INT-ORGN
- DC.L ILLEG_INT-ORGN
- DC.L ILLEG_INT-ORGN
- DC.L ILLEG_INT-ORGN
- DC.L NMI_INT-ORGN
- ; standard QDOS trap vectors
- DC.L TRAP0-ORGN ;*/note routine has moved
- DC.L TRAP1-ORGN
- DC.L TRAP2-ORGN
- DC.L TRAP3-ORGN
- DC.L TRAP4-ORGN
- ; user defined trap vectors
- DC.L TRAP5-ORGN
- DC.L TRAP6-ORGN
- DC.L TRAP7-ORGN
- DC.L TRAP8-ORGN
- DC.L TRAP9-ORGN
- DC.L TRAP10-ORGN
- DC.L TRAP11-ORGN
- DC.L TRAP12-ORGN
- DC.L TRAP13-ORGN
- DC.L TRAP14-ORGN
- DC.L TRAP15-ORGN
- DC.W vMM_ALCHP-ORGN
- DC.W vMM_RECHP-ORGN
- DC.W vUT_WINDW-ORGN
- DC.W vUT_CON-ORGN
- DC.W vUT_SCR-ORGN
- DC.W vUT_ERR0-ORGN
- DC.W vUT_ERR-ORGN
- DC.W vUT_MINT-ORGN
- DC.W vUT_MTEXT-ORGN
- DC.W vUT_LINK-ORGN
- DC.W vMT_UNLNK-ORGN
- DC.W vNONE-ORGN
- DC.W vMM_ALLOC-ORGN
- DC.W vMM_LNKFR-ORGN
- DC.W vIO_QSET-ORGN
- DC.W vIO_QTEST-ORGN
- DC.W vIO_QIN-ORGN
- DC.W vIO_QOUT-ORGN
- DC.W vIO_QEOF-ORGN ;*/note routine has moved
- DC.W vUT_CSTR-ORGN
- DC.W vIO_SERQ-ORGN
- DC.W vIO_SERIO-ORGN
- DC.W vCN_DATE-ORGN
- DC.W vCN_DAY-ORGN
- DC.W vCN_FTOD-ORGN
- DC.W vCN_ITOD-ORGN
- DC.W vCN_ITOBB-ORGN
- DC.W vCN_ITOBW-ORGN
- DC.W vCN_ITOBL-ORGN
- DC.W vCN_ITOHB-ORGN
- DC.W vCN_ITOHW-ORGN
- DC.W vCN_ITOHL-ORGN
- DC.W vCN_DTOF-ORGN
- DC.W vCN_DTOI-ORGN
- DC.W vCN_BTOIB-ORGN
- DC.W vCN_BTOIW-ORGN
- DC.W vCN_BTOIL-ORGN
- DC.W vCN_HTOIB-ORGN
- DC.W vCN_HTOIW-ORGN
- DC.W vCN_HTOIL-ORGN
- DC.W vBP_INIT-ORGN
- DC.W vCA_GTINT-ORGN
- DC.W vCA_GTFP-ORGN
- DC.W vCA_GTSTR-ORGN
- DC.W vCA_GTLIN-ORGN
- DC.W vBV_CHRIX-ORGN
- DC.W vRI_EXEC-ORGN
- DC.W vRI_EXECB-ORGN
- DC.W vBP_LET-ORGN
- DC.W vIO_NAME-ORGN
- DC.W vMD_READ-$4000-ORGN
- DC.W vMD_WRITE-$4000-ORGN
- DC.W vMD_VERIN-$4000-ORGN
- DC.W vMD_SECTR-$4000-ORGN
- ; These vectors not defined in the advanced user guide
- DC.W vANA_SYNX-$4000-ORGN ; basic syntax analyser
- DC.W vTB_LIST-$4000-ORGN ; first syntax table
- ; (commands)
- DC.W vEXP_SYNX-$4000-ORGN ; second syntax table
- ; (expressions)
- DC.W vFMT_LINE-$4000-ORGN ; format precompiled line
- DC.W vCOMP_ERR-$4000-ORGN ; error when compiling
- DC.W vSTO_LINE-$4000-ORGN ; store precompiled line
- DC.W vTKN_LIST-$4000-ORGN ; convert precompiled line
- ; to ASCII
- DC.W vINI_STCK-$4000-ORGN ; initialize BASIC stacks
-
- ;*/beginfilling
- NOP00400:
- DCB.w ($400-(NOP00400-ORGN))/2,$0000
- ;*/endfilling
- ;*/endoverlay
- ; --------------------------------------------------------------
- ;*/beginoverlay
- vMM_ALCHP JMP MM_ALCHP-ORG0
- vMM_RECHP JMP MM_RECHP-ORG0
- vUT_WINDW JMP UT_WINDW-ORG0
- vUT_CON JMP UT_CON-ORG0
- vUT_SCR JMP UT_SCR-ORG0
- vUT_ERR0 JMP UT_ERR0-ORG0
- vUT_ERR JMP UT_ERR-ORG0
- vUT_MINT JMP UT_MINT-ORG0
- vUT_MTEXT JMP UT_MTEXT-ORG0
- vUT_LINK JMP UT_LINK-ORG0
- vMT_UNLNK JMP MT_UNLNK-ORG0
- vNONE RTS
- ; NOP
- ; NOP
- vMM_ALLOC JMP MM_ALLOC-ORG0
- vMM_LNKFR JMP MM_LNKFR-ORG0
- vIO_QSET JMP IO_QSET-ORG0
- vIO_QTEST JMP IO_QTEST-ORG0
- vIO_QIN JMP IO_QIN-ORG0
- vIO_QOUT JMP IO_QOUT-ORG0
- vIO_QEOF JMP IO_QEOF-ORG0
- vUT_CSTR JMP UT_CSTR-ORG0
- vIO_SERQ JMP IO_SERQ-ORG0
- vIO_SERIO JMP IO_SERIO-ORG0
- vCN_DATE JMP CN_DATE-ORG0
- vCN_DAY JMP CN_DAY-ORG0
- vCN_FTOD JMP CN_FTOD-ORG0
- vCN_ITOD JMP CN_ITOD-ORG0
- vCN_ITOBB JMP CN_ITOBB-ORG0
- vCN_ITOBW JMP CN_ITOBW-ORG0
- vCN_ITOBL JMP CN_ITOBL-ORG0
- vCN_ITOHB JMP CN_ITOHB-ORG0
- vCN_ITOHW JMP CN_ITOHW-ORG0
- vCN_ITOHL JMP CN_ITOHL-ORG0
- vCN_DTOF JMP CN_DTOF-ORG0
- vCN_DTOI JMP CN_DTOI-ORG0
- vCN_BTOIB JMP CN_BTOIB-ORG0
- vCN_BTOIW JMP CN_BTOIW-ORG0
- vCN_BTOIL JMP CN_BTOIL-ORG0
- vCN_HTOIB JMP CN_HTOIB-ORG0
- vCN_HTOIW JMP CN_HTOIW-ORG0
- vCN_HTOIL JMP CN_HTOIL-ORG0
- vBP_INIT JMP BP_INIT-ORG0
- vCA_GTINT JMP CA_GTINT-ORG0
- vCA_GTFP JMP CA_GTFP-ORG0
- vCA_GTSTR JMP CA_GTSTR-ORG0
- vCA_GTLIN JMP CA_GTLIN-ORG0
-
- ; TKII jumps into the middle of the BV_CHRIX code
- ; at +$1C and +$2C - some people never learn.
-
- vBV_CHRIX ;reserve space on arithmetic stack
- MOVEQ #$58,D2
- BRA.S vL04E90
- vL04E52 MOVEQ #$0C,D1 ;12 bytes on stack
- vL04E54 MOVEQ #$48,D2
- BRA.S vL04E90
- vL04E58 MOVEQ #4,D1 ;reserve 4 bytes
- vL04E5A MOVEQ #$50,D2
- BRA.S vL04E90
- vL04E5E MOVEQ #8,D1
- vL04E60 MOVEQ #$1C,D2 ;name table
- BRA.S vL04E84
- vL04E64 MOVEQ #$16,D1 ;20 bytes for
- MOVEQ #$3C,D2 ;return table
- BRA.S vL04E84
- vL04E6A MOVEQ #4,D2 ;buffer
- BRA.S vL04E84
- vL04E6E MOVEQ #$0C,D2 ;token list
- BRA.S vL04E84
- vL04E72 MOVEQ #$24,D2 ;Name list
- BRA.S vL04E84
- vL04E76 MOVEQ #$2C,D2 ;variable values
- BRA.S vL04E84
- vL04E7A MOVEQ #$34,D2
- BRA.S vL04E84
- vL04E7E MOVEQ #$44,D2
- BRA.S vL04E84
- vL04E82 MOVEQ #$14,D2
- vL04E84 JMP L04E84-ORG0
- vL04E90 JMP L04E90-ORG0
-
- vRI_EXEC JMP RI_EXEC-ORG0
- vRI_EXECB JMP RI_EXECB-ORG0
- vBP_LET JMP BP_LET-ORG0
- vIO_NAME JMP IO_NAME-ORG0
- vMD_READ JMP MD_READ-ORG0
- vMD_WRITE JMP MD_WRITE-ORG0
- vMD_VERIN JMP MD_VERIN-ORG0
- vMD_SECTR JMP MD_SECTR-ORG0
- vANA_SYNX JMP ANA_SYNX-ORG0
- vFMT_LINE JMP FMT_LINE-ORG0
- vCOMP_ERR JMP COMP_ERR-ORG0
- vSTO_LINE JMP STO_LINE-ORG0
-
- vTKN_LIST MOVEA.L BV_PFBAS(A6),A4 ;TKII messing things up again
- JMP TKN_LST2-ORG0 ;uses jsr $4004()
-
- vINI_STCK JMP INI_STCK-ORG0
-
- vTB_LIST:
- DC.L L08D2B-ORG0
- DC.L COM_SYNX-ORG0
-
- DC.B $00
- vEXP_SYNX ; Expression syntax table
- DC.B $0C,$01,$2A,$08,$10
- DC.L $0C040C02,$08009802
- DC.L $002C0400,$2A05800A,$EB00A202,$002CF600
- DC.L $0202002A,$02009802,$0028FC2C,$00000202
- DC.L $00802A02,$00A20200,$2CF80080,$0EFE2601
- DC.L $9802000E
- DC.B $F7,$80,$00
-
- ;*/beginfilling
- DC.B $00
- NOP00600:
- DCB.w ($600-(NOP00600-ORGN))/2,$4E71
- ;*/endfilling
- ;*/endoverlay
- ; --------------------------------------------------------------
- L00420: ; was code for starting and stopping transmission through 8049
-
- L00460:
- DO_TRAP1:
- CMPI.W #$24,D0
- BHI.S L004BC
- MOVE.W D0,D7
- ADD.W D7,D7
- MOVE.W TRAP1_TAb(PC,D7.W),D7
- JMP DO_TRAP1(PC,D7.W)
- L00472:
- TRAP1_TAb:
- DC.W MT_INF-DO_TRAP1 ; D0=0
- DC.W MT_CJOB-DO_TRAP1 ; 1
- DC.W MT_JINF-DO_TRAP1 ; 2
- DC.W L004BC-DO_TRAP1 ; 3 = ERROR
- DC.W MT_RJOB-DO_TRAP1 ; 4
- DC.W MT_FRJOB-DO_TRAP1 ; 5
- DC.W MT_FREE-DO_TRAP1 ; 6
- DC.W MT_TRAPV-DO_TRAP1 ; 7
- DC.W MT_SUSJB-DO_TRAP1 ; 8
- DC.W MT_RELJB-DO_TRAP1 ; 9
- DC.W MT_ACTIV-DO_TRAP1 ; A
- DC.W MT_PRIOR-DO_TRAP1 ; B
- DC.W MT_ALLOC-DO_TRAP1 ; C
- DC.W MT_LNKFR-DO_TRAP1 ; D
- DC.W MT_ALRES-DO_TRAP1 ; E
- DC.W MT_RERES-DO_TRAP1 ; F
- DC.W MT_DMODE-DO_TRAP1 ; 10
- DC.W MT_IPCOM-DO_TRAP1 ; 11
- DC.W MT_BAUD-DO_TRAP1 ; 12
- DC.W MT_RCLCK-DO_TRAP1 ; 13
- DC.W MT_SCLCK-DO_TRAP1 ; 14
- DC.W MT_ACLCK-DO_TRAP1 ; 15
- DC.W MT_ALBAS-DO_TRAP1 ; 16
- DC.W MT_REBAS-DO_TRAP1 ; 17
- DC.W MT_ALCHP-DO_TRAP1 ; 18
- DC.W MT_RECHP-DO_TRAP1 ; 19
- DC.W MT_LXINT-DO_TRAP1 ; 1A
- DC.W MT_RXINT-DO_TRAP1 ; 1B
- DC.W MT_LPOLL-DO_TRAP1 ; 1C
- DC.W MT_RPOLL-DO_TRAP1 ; 1D
- DC.W MT_LSCHD-DO_TRAP1 ; 1E
- DC.W MT_RSCHD-DO_TRAP1 ; 1F
- DC.W MT_LIOD-DO_TRAP1 ; 20
- DC.W MT_RIOD-DO_TRAP1 ; 21
- DC.W MT_LDD-DO_TRAP1 ; 22
- DC.W MT_RDD-DO_TRAP1 ; 23
- DC.W MT_TRA-DO_TRAP1 ; 24 not documented
- L004BC:
- MOVEQ #ERR.BP,D0 ; bad parameter return
- BRA RET_TRAP
- L004C2:
- MT_INF:
- MOVEQ #-1,D1
- JSR GETJOBID(PC) ;*/undomodify BSR GETJOBID
- MOVE.L #'3.24',D2 ;*/modify MOVE.L $BFF6,D2
- MOVEA.L A6,A0 ; pointer to sys vars
- BRA RET_CLD0
- ; *****************************************************
- ; * TRAP #1 with D0=$24 (undocumented) *
- ; * D1=address => install new key translation table *
- ; * D1=1 => install ROM key translation table *
- ; * D2=address => install new system message table *
- ; * D2=0 => leave old system messages *
- ; *****************************************************
- L004D4:
- MT_TRA:
- TST.L D2
- BEQ.S L004EA ; no new message table
- BTST #0,D2 ; test for odd address
- BNE.S L0051E ; bad parameter return
- MOVEA.L D2,A0
- CMPI.W #$4AFB,(A0) ; test identifier
- BNE.S L0051E
- MOVE.L A0,SV_MGTAB(A6) ; pointer to system messages
- L004EA:
- CLR.B SV_TRAN(A6) ; signal bad key translation
- ; table
- TST.L D1
- BEQ.S L00518 ; no new tra-table
- CMPI.L #1,D1 ; TRA 1 : take old key
- ; translation table
- BNE.S L00500
- RLOC01 MOVE.L #(KEY_TRA-ORG0),D1 ;*/modify MOVE.L $BFE2,D1
- L00500:
- BTST #0,D1
- BNE.S L0051E
- MOVEA.L D1,A0
- CMPI.W #$4AFB,(A0) ; check if any usefull table
- ; is present
- BNE.S L0051E
- MOVE.B #1,SV_TRAN(A6) ; signal that key
- ; translation is present
- MOVE.L A0,SV_TRTAB(A6) ; pointer to key translation
- ; table
- L00518:
- MOVEQ #0,D0
- BRA RET_TRAP
- L0051E:
- MOVEQ #ERR.BP,D0 ; Bad parameter
- BRA RET_TRAP
- MT_JINF:
- JSR GETJOBID(PC) ;*/undomodify BSR GETJOBID
- MOVEQ #0,D3
- TST.W JB_STAT(A0) ; job status
- BEQ.S L00532
- MOVEQ #-$01,D3
- L00532:
- MOVE.B JB_PRINC(A0),D3 ; jobs priority increment
- MOVE.L D2,D0
- MOVE.L A0,-(A7)
- JSR L006C6(PC) ;*/undomodify BSR L006C6
- MOVEA.L (A7)+,A0
- MOVE.L 8(A0),D2 ; owner of job
- LEA JB_END(A0),A0 ; prog start of job
- BRA RET_CLD0
- MT_CJOB:
- TST.L D1
- BEQ.S L00554
- JSR GETJOBID(PC) ;*/undomodify BSR GETJOBID
- L00554:
- MOVEM.L D1-D3/A1-A4,-(A7)
- MOVEQ #0,D7
- MOVEA.L SV_JBBAS(A6),A4 ; Ptr to base of job table
- L0055E:
- TST.B (A4) ; job not active
- BLT.S L00570 ; initialize
- ADDQ.W #1,D7
- ADDQ.W #4,A4 ;*/undomend ADDQ.L #4,A4
- CMPA.L SV_JBTOP(A6),A4 ; Ptr to top of job table
- BLT.S L0055E
- MOVEQ #ERR.NJ,D0 ; invalid job
- BRA.S L005E0
- ; activate job
- L00570:
- MOVEQ #JB_END,D1 ; add size of jobs
- ADD.L D2,D1 ; descriptor to length
- ADD.L D3,D1
- JSR RESERVD1(PC) ;*/undomodify BSR RESERVD1
- ; reserve d1 bytes
- BNE.S L005E0
- MOVEM.L (A7),D1-D3/A1
- MOVE.L A0,(A4)
- CMP.W SV_JBMAX(A6),D7 ; Highest current job number
- BLS.S L0058C ; old job
- MOVE.W D7,SV_JBMAX(A6) ; Highest current job number
- L0058C:
- ADDQ.W #JB_START,A0 ;*/undomend ADDQ.L #4,A0
- ; A0=base_of_job+4
- MOVEQ #((JB_END-JB_START)/4-1),D0 ; len of job descr
- L00590:
- CLR.L (A0)+ ; set job descriptor to 0
- DBF D0,L00590
- ; start of job
- SUBA.W #(JB_END-JB_OWNER),A0 ;*/undomend SUBA.L
- MOVE.L D1,(A0)
- ADDQ.W #(JB_TAG-JB_OWNER),A0 ;*/undomend ADDQ.L #8,A0
- SWAP D7
- MOVE.W SV_JBTAG(A6),D7 ; Current value of job tag
- MOVE.W D7,(A0)
- SWAP D7
- ADDQ.W #1,SV_JBTAG(A6) ; Current value of job tag
- ; Ptr to trap redirection table
- MOVE.L SV_TRAPV(A6),(JB_TRAPV-JB_TAG)(A0)
- ADDA.W #(JB_A4-JB_TAG),A0 ;*/undomend ADDA.L
- ;*/note sign exten long
- MOVE.L D2,(A0)+ ; length of job in JB_A4
- ADD.L D2,D3 ; add data area
- MOVE.L D3,(A0)+ ; len of job + data in JB_A5
- MOVEQ #(JB_END-JB_A6),D0
- ADD.L A0,D0
- MOVE.L D0,(A0)+ ; base of jobs prog in JB_A6
- ADD.L D0,D3 ; d3=total length
- EXG D3,A0
- CLR.L -(A0)
- EXG D3,A0
- MOVE.L D3,(A0) ; address of stack in JB_A7
- ADDQ.W #(JB_PC-JB_A7),A0 ;*/undomend ADDQ.L #6,A0
- MOVE.L A1,D3
- BEQ.S L005D4
- MOVE.L D3,D0
- L005D4:
- MOVE.L D0,(A0) ; start of prog in JB_PC
- MOVE.L D0,(JB_START-JB_PC)(A0); and in JB_START
- bsr CJOBFIX ;*/modify LEA (JB_END-JB_PC)(A0),A0
- MOVEQ #0,D0
- L005E0:
- MOVEM.L (A7)+,D1-D3/A1-A4
- MOVE.L D7,D1
- BRA RET_TRAP
- L005EA:
- MT_RJOB:
- JSR GETJOBID(PC) ;*/undomodify BSR GETJOBID
- MOVE.L D1,D0
- L005F0:
- TST.B JB_PRINC(A0) ; jobs priority increment
- BNE L006C0 ; not complete
- JSR L006C6(PC) ;*/undomodify BSR L006C6
- ; look for next job
- TST.L D1 ; same owner ?
- BNE.S L005F0 ; continue
- MOVE.L D0,D1 ; restore D1 (Job ID)
- MT_FRJOB:
- JSR GETJOBID(PC) ;*/undomodify BSR GETJOBID
- MOVE.L D1,D0 ; job ID
- BEQ L006C0 ; BASIC ? 'not complete'
- BSR L006EE ;*/modify MOVEA.W D1,A1
- ;*/modify ADDA.W A1,A1
- ;*/modify ADDA.W A1,A1
- ;*/modify ADDA.L SV_JBBAS(A6),A1
- L00616:
- MOVE.W #$FFFD,JB_STAT(A0) ;*/modify ADDQ.B #1,(A1)
- ; mark JOB for later removal
- JSR L006C6(PC) ;*/undomodify BSR L006C6
- ;*/remove TST.L D1
- ;*/note flags already set for D1
- BNE.S L00616 ; find next job in tree
- SF -(A7)
- ;*/remove MOVEQ #0,D1
- ;*/note D1 is 0 at this point
- MOVEA.L SV_JBBAS(A6),A1 ; Ptr to base of job table
- L00628:
- ADDQ.W #4,A1 ;*/undomend ADDQ.L #4,A1
- ADDQ.W #1,D1
- CMP.W SV_JBMAX(A6),D1 ; Highest current job number
- BHI L006B6
- MOVEA.L (A1),A0 ;*/insert
- TST.B (A1)
- BLT.S L00628 ;*/modify BLE.S L00628
- ; loop if no valid entry
- CMP.W #$FFFD,JB_STAT(A0) ;*/insert
- BNE.S L00628 ;*/insert
- ; loop if not a marked job
- ;*/remove CLR.B (A1)
- ; unmark job
- ;*/remove MOVEA.L (A1),A0
- SWAP D1
- MOVE.W JB_TAG(A0),D1 ; tag for job
- SWAP D1
- CMPA.L SV_JBPNT(A6),A1 ; Ptr to current job table
- ; entry
- BNE.S L0064C
- ST (A7)
- L0064C TST.B JB_WFLAG(A0) ; is any job waiting for
- ; this to finish ?
- BEQ.S L00670
- MOVE.L JB_WJOB(A0),D0 ; D0 = ID of waiting JOB
- EXG D0,D1
- JSR L003E4(PC) ;*/undomodify BSR L003E4
- ; job OK?
- EXG D1,D0
- BNE.S L00670
- CMPI.W #$FFFE,JB_STAT(A0) ; test JOB status
- BNE.S L00670
- CLR.W JB_STAT(A0) ; job status=0
- MOVE.L D3,JB_D0(A0)
- ; now the channels owned by this job are suspended
- L00670:
- MOVEA.L SV_CHEAP(A6),A0 ; Base of common heap area
- L00674:
- CMP.L CH_OWNER(A0),D1 ; owner of channel
- BNE.S L0069A
- MOVEM.L D1/D3/A0-A1,-(A7)
- MOVE.L CH_RFLAG(A0),D1
- BEQ.S L00688
- MOVEA.L D1,A1
- ST (A1)
- L00688:
- MOVEA.L CH_DRIVR(A0),A1
- LEA -SV_LIO(A1),A3 ; address of linkage block
- MOVEA.L (SV_ACLOS-SV_LIO)(A1),A1 ; address of close routine
- JSR (A1)
- MOVEM.L (A7)+,D1/D3/A0-A1
- L0069A:
- ADDA.L (A0),A0
- CMPA.L SV_FREE(A6),A0 ; Base of free area
- BLT.S L00674
- MOVEM.L D1/D3/A1,-(A7)
- MOVEA.L (A1),A0
- JSR RELE_MEM(PC) ;*/undomodify BSR RELE_MEM
- ; release memory
- MOVEM.L (A7)+,D1/D3/A1
- ST (A1)
- BRA L00628
- L006B6:
- TST.B (A7)+
- BEQ RET_CLD0
- BRA L0093A
- L006C0:
- MOVEQ #ERR.NC,D0 ; not complete error
- BRA RET_TRAP
- L006C6:
- MOVE.L D1,D2 ; D2= owner job
- MOVEQ #0,D1
- L006CA:
- ADDQ.W #1,D1
- CMP.W SV_JBMAX(A6),D1 ; Highest current job number
- BGT.S L006E0
- BSR.S L006EE ; get job base
- TST.B (A1) ; is it active
- BLT.S L006CA
- CMP.L JB_OWNER(A0),D2 ; same owner of job
- BEQ.S L00700
- BRA.S L006CA ; continue searching
- L006E0:
- CMP.W D2,D0
- BEQ.S L006FC
- MOVE.W D2,D1
- BSR.S L006EE
- MOVE.L JB_OWNER(A0),D2 ; owner of job
- BRA.S L006CA ; continue searching
- L006EE:
- ;*/undoinsert SUBA.L A1,A1
- MOVEA.W D1,A1 ;*/note D1 sign exten long
- ADDA.L A1,A1 ;*/mend ADDA.W A1,A1
- ADDA.L A1,A1 ;*/mend ADDA.W A1,A1
- ADDA.L SV_JBBAS(A6),A1 ; Ptr to base of job table
- MOVEA.L (A1),A0
- RTS
- L006FC:
- MOVEQ #0,D1
- RTS
- L00700:
- SWAP D1
- MOVE.W JB_TAG(A0),D1 ; TAG for job
- SWAP D1
- RTS
- L0070A:
- MT_TRAPV:
- JSR GETJOBID(PC) ;*/undomodify BSR GETJOBID
- ; only for those fools, which do not use MT.TRAPV
- SUBA.W #$54,A1 ;*/undomend SUBA.L
- ;*/note #$54 sign exten long
- MOVE.L A1,SV_TRAPV(A6) ; Ptr to trap redirection
- ; table
- MOVE.L A1,JB_TRAPV(A0) ; TRAPV
- BRA RET_CLD0
- L0071E:
- MT_ALLOC:
- ADDA.L 8(A5),A0 ; A0 = ptr to ptr to free
- ; space
- JSR MM_ALLOC(PC) ;*/undomodify BSR MM_ALLOC
- SUBA.L 8(A5),A0 ; base of allocated area
- bra.s L007A2
- L0072C:
- MT_LNKFR:
- ADDA.L 8(A5),A0
- ADDA.L 8(A5),A1
- JSR MM_LNKFR(PC) ;*/undomodify BSR MM_LNKFR
- bra.s L007A2
- L0073A:
- MT_ALCHP:
- EXG D2,D1
- JSR GETJOBID(PC) ;*/undomodify BSR GETJOBID
- MOVE.L D1,-(A7)
- MOVEQ #$10,D1
- ADD.L D2,D1 ; d2= number of bytes
- JSR MM_ALCHP(PC) ;*/undomodify BSR MM_ALCHP
- bne.s L007BC
- ADDQ.W #4,A0 ;*/undomend ADDQ.L #4,A0
- L0074E:
- MOVE.L #(L0075A-ORG0-$0C),(A0)+ ; pointer to address
- ; of release..pardon?
- MOVE.L (A7)+,(A0)+
- CLR.L (A0)+
- BRA.S L00766
- L0075A:
- DC.L MM_RECHP-ORG0 ;*/note I don't understand
- L0075E:
- MT_RECHP:
- LEA -$10(A0),A0
- JSR MM_RECHP(PC) ;*/undomodify BSR MM_RECHP
- L00766:
- BRA RET_CLD0
- L0076A:
- MT_ALRES:
- MT_RERES:
- MOVEA.L SV_RESPR(A6),A0 ; base of resident proc area
- CMPA.L SV_TRNSP(A6),A0 ; base of trans'nt prog area
- BNE.S L007A0
- CMPI.B #$0F,D0 ; $F -> release
- BEQ.S L00786
- TST.L D1
- BLE.S L00766
- JSR RESERVD1(PC) ;*/undomodify BSR RESERVD1
- ; reserve d1 bytes
- blt.s L007BE ;*/undomodify BLT RET_TRAP
- ;*/note would be quicker
- BRA.S L00792
- L00786:
- MOVE.L SV_RAMT(A6),D1 ; Top of RAM(+1)
- SUB.L SV_RESPR(A6),D1 ; Base of resident procs
- JSR RELE_MEM(PC) ;*/undomodify BSR RELE_MEM
- ; release memory
- L00792:
- MOVE.L SV_TRNSP(A6),$1C(A6) ; Base of transient progs
- CLR.L SV_TRNFR(A6) ; First free space in TPA
- BRA RET_CLD0
- L007A0:
- MOVEQ #ERR.NC,D0 ; not complete error
- L007A2:
- bra.s L007BE ;*/undomodify BRA RET_TRAP
- ;*/note would be quicker
- L007A4:
- MT_ALBAS:
- JSR L031B8(PC) ;*/undomodify BSR L031B8
- ; allocate memory
- bra.s L007BE ;*/undomodify BRA RET_TRAP
- ;*/note would be quicker
- MT_REBAS:
- MOVE.L SV_TRNSP(A6),-(A7) ; Base of transient progs
- SUB.L D1,SV_TRNSP(A6) ; Base of transient progs
- JSR L031C8(PC) ;*/undomodify BSR L031C8
- ; release memory
- MOVE.L (A7)+,SV_TRNSP(A6) ; Base of transient progs
- BRA.S L007BE
- L007BC:
- ADDQ.W #4,A7 ;*/undomend ADDQ.L #4,A7
- L007BE:
- BRA RET_TRAP
- L007C2:
- ; --------------------------------------------------------------
- MT_LXINT:
- MT_LPOLL:
- MT_LSCHD:
- MT_LIOD:
- MT_LDD:
- bsr CLRALL ;*/mend
- ADD.W D0,D0
- LEA 4(A6,D0.W),A1 ; decide if external
- ; interrupt/ 50 Hz
- JSR UT_LINK(PC) ;*/undomodify BSR UT_LINK
- ; /scheduler task /IO device
- ; /Directory
- BRA.S L008FC
- MT_RXINT:
- MT_RPOLL:
- MT_RSCHD:
- MT_RIOD:
- MT_RDD:
- ADD.W D0,D0
- LEA 2(A6,D0.W),A1
- JSR MT_UNLNK(PC) ;*/undomodify BSR MT_UNLNK
- L008FC BRA RET_CLD0
- ; --------------------------------------------------------------
- ; 50 Hz vertical Blank interrupt server
- ; --------------------------------------------------------------
- L00900:
- ADDQ.W #1,SV_POLLM(A6) ; Count of poll ints missed
- BVC.S L0090A
- SUBQ.W #1,SV_POLLM(A6) ; Count of poll ints missed
- L0090A:
- MOVEM.L D0-D6/A0-A4,-(A7)
- MOVEQ #-$08,D0
- MOVEQ #$01,D3
- MOVEA.L SV_PLIST(A6),A0 ; Ptr to list of polled
- ; tasks
- JSR EXEC_TSK(PC) ;*/undomodify BSR EXEC_TSK
- MOVEM.L (A7)+,D0-D6/A0-A4
- MOVE.B SV_PCINT(A6),D7 ; Current value of PC
- ; interrupt register
- ori.b #$08,d7 ;*/restorecode
- move.b d7,PC_INTR ;*/restorecode
- BTST #5,$C(A7) ; supervisor mode ?
- BNE L003B6
- L00936:
- JSR L009D4(PC) ;*/undomodify BSR L009D4
- ; save jobs area
- L0093A:
- MOVE.W SV_POLLM(A6),D3 ; Count of poll ints missed
- CLR.W SV_POLLM(A6) ; Count of poll ints missed
- ADDQ.W #1,SV_RAND(A6) ; random number
- MOVEQ #-$10,D0
- MOVEA.L SV_SHLST(A6),A0 ; ptr to list of scheduler
- ; tasks
- JSR EXEC_TSK(PC) ;*/undomodify BSR EXEC_TSK
- ; execute polled task
- JSR L00A0C(PC) ;*/undomodify BSR L00A0C
- ; get highest job priority
- TST.L D0
- BLT.S L0093A ; continue
- MOVE.L D0,SV_JBPNT(A6) ; ptr to current jobtable
- ; entry
- JSR EXEC_JOB(PC) ;*/undomodify BSR EXEC_JOB
- ; Execute job
- L00960:
- MT_SUSJB:
- JSR GETJOBID(PC) ;*/undomodify BSR GETJOBID
- MOVE.W D3,JB_STAT(A0) ; job status
- MOVE.L A1,JB_HOLD(A0)
- MOVEQ #0,D0
- BRA.L L00936 ;*/undomodify bra.s L00936
- ;*/undomodify nop
- L00972:
- MT_RELJB:
- JSR GETJOBID(PC) ;*/undomodify BSR GETJOBID
- TST.W JB_STAT(A0) ; job status
- BEQ.S L0098A
- CLR.W JB_STAT(A0) ; job status
- MOVE.L JB_HOLD(A0),D0 ; pointer to byte which will
- ; be cleared when release
- BEQ.S L0098A
- MOVEA.L D0,A0
- SF (A0)
- L0098A:
- MOVEQ #0,D0
- BRA.L L00936 ;*/undomodify BRA.S L00936
- ;*/undomodify nop
- L00990:
- MT_PRIOR:
- JSR GETJOBID(PC) ;*/undomodify BSR GETJOBID
- MOVE.B D2,JB_PRINC(A0) ; priority increment
- BNE.S L009CA
- SF JB_PRIOR(A0) ; current accumulated
- ; priority
- BRA.S L009CA
- L009A0:
- MT_ACTIV:
- JSR GETJOBID(PC) ;*/undomodify BSR GETJOBID
- TST.B JB_PRINC(A0) ; priority increment
- BNE.S L009D0
- jsr CLRALL(PC) ;*/mend
- MOVE.B D2,JB_PRINC(A0) ; priority increment
- MOVE.L JB_START(A0),JB_PC(A0) ; start address on
- ; activation -> saved PC
- TST.W D3
- BEQ.S L009CA
- ST JB_WFLAG(A0) ; there is a job waiting for
- ; this one
- JSR JOBID_ME(PC) ;*/undomodify BSR JOBID_ME
- MOVE.L D0,JB_WJOB(A0) ; ID of job waiting for this
- ; to finish
- MOVE.W #-2,JB_STAT(A3) ; JOB is waiting for another
- ; job to finish
- L009CA:
- MOVEQ #0,D0
- L009CC:
- BRA L00936
- L009D0:
- MOVEQ #ERR.NC,D0 ; Not complete
- BRA.S L009CC
- L009D4:
- MOVE.L A6,-(A7)
- MOVEA.L $64(A6),A6 ; pointer to current job
- ; table entry
- MOVEA.L (A6),A6 ; get job table of actual
- ; job
- TST.B $12(A6) ; current accumulated
- ; priority
- BEQ.S L009E8
- MOVE.B #$01,$12(A6) ; reset accumulated priority
- L009E8:
- MOVEM.L D0-D7/A0-A4,$20(A6) ; save registers of job
- MOVE.L (A5)+,$3C(A6) ; save D7
- MOVE.L (A5)+,$54(A6) ; save A5
- MOVE.L (A5)+,$58(A6) ; save A6
- MOVE.L USP,A0
- MOVE.L A0,$5C(A6) ; save A7
- MOVE.W (A5)+,$60(A6) ; save SR
- MOVE.L (A5)+,$62(A6) ; save PC
- MOVEA.L (A7)+,A6
- RTS
- L00A0C:
- MOVEQ #-2,D0
- MOVEQ #0,D1
- MOVEA.L $64(A6),A2 ;SV.JBPNT Pointer to
- ; current job table entry
- MOVEA.L A2,A4
- ;*/undoinsert CLR.L D2
- MOVE.W $62(A6),D2 ;SV.JBMAX Highest current
- ; job number
- LSL.W #2,D2 ;*/undomend LSL.L
- ;*/note not neccessary
- MOVEA.L $68(A6),A3 ;SV.JBBAS Pointer to base
- ; of job table
- ADDA.W D2,A3 ;*/undomend ADDA.L
- ;*/note D2 sign extended long
- L00A22:
- ADDQ.W #4,A2 ;*/undomend ADDQ.L #4,A2
- CMPA.L A3,A2
- BLE.S L00A2C
- MOVEA.L $68(A6),A2 ;SV.JBBAS Pointer to base
- ; of job table
- L00A2C:
- TST.B (A2)
- BLT.S L00A72
- MOVEA.L (A2),A0
- TST.B $13(A0) ; jobs priority increment
- BEQ.S L00A72
- TST.W $14(A0) ; job status
- BEQ.S L00A54
- BLT.S L00A72
- SUB.W D3,$14(A0) ; job status
- BGT.S L00A72
- CLR.W $14(A0) ; job status=0
- MOVE.L $0C(A0),D2
- BEQ.S L00A54
- MOVEA.L D2,A1
- SF (A1)
- L00A54:
- MOVE.B $12(A0),D2 ; jobs accumulated priority
- BEQ.S L00A64
- ADD.B $13(A0),D2 ; jobs priority increment
- BCC.S L00A66
- ST D2
- BRA.S L00A66
- L00A64:
- MOVEQ #$01,D2
- L00A66:
- MOVE.B D2,$12(A0) ; jobs accumulated priority
- CMP.B D1,D2
- BLS.S L00A72
- MOVE.L A2,D0
- MOVE.B D2,D1
- L00A72:
- CMPA.L A4,A2
- BNE.S L00A22
- RTS
- ; --------------------------------------------------------------
- ;*/beginoverlay
-
- L003BC:
- GETJOBID:
- TST.W D1
- BGE.S L003D8
- MOVE.L SV_JBPNT(A6),D1 ; pointer to current job
- ; table entry
- MOVEA.L D1,A0
- MOVEA.L (A0),A0 ; Get job table entry
- SUB.L SV_JBBAS(A6),D1 ; subtract pointer to base
- ; of job table
- LSR.L #2,D1 ; divide by 4
- SWAP D1 ; job number is ready
- MOVE.W $10(A0),D1 ; get job tag
- SWAP D1
- L003D6:
- RTS
- L003D8:
- BSR.S L003E4 ; valid job ?
- BEQ.S L003D6
- MOVEQ #ERR.NJ,D0 ; invalid job !
- ADDQ.W #4,A7 ;*/undomend ADDQ.L #4,A7
- BRA.L RET_TRAP ;*/undomodify bra.s RET_TRAP
- ;*/undomodify nop
- L003E4:
- CMP.W SV_JBMAX(A6),D1 ; highest current job number
- BHI.S L003D6 ; RTS
- ;*/undoinsert SUB.L A0,A0
- MOVEA.W D1,A0 ;*/note D1 sign exten long
- ADDA.L A0,A0 ;*/mend ADDA.W A0,A0
- ADDA.L A0,A0 ;*/mend ADDA.W A0,A0
- ADDA.L SV_JBBAS(A6),A0 ; pointer to base of job
- ; table
- TST.B (A0)
- BLT.S L003D6
- MOVEA.L (A0),A0
- SWAP D1
- CMP.W JB_TAG(A0),D1 ; job tag
- BNE.S L003D6
- SWAP D1
- CMP.B D1,D1
- RTS
-
- ; --------------------------------------------------------------
- ; Return ID of actual job in D0, base address in A3
- L00408:
- JOBID_ME:
- MOVEA.L SV_JBPNT(A6),A3 ; Ptr to current job table
- ; entry
- JOBID_ME2:
- MOVE.L A3,D0
- SUB.L SV_JBBAS(A6),D0 ; Ptr to base of job table
- LSR.W #2,D0
- MOVEA.L (A3),A3
- SWAP D0
- MOVE.W JB_TAG(A3),D0
- SWAP D0
- RTS
-
- ;*/endoverlay
- ;*/beginoverlay
-
- MT_DMODE:
- bsr MODEFIX ;*/modify MOVE.B SV_MCSTA(A6),D0
-
- cmp.b #-1,d1 ;*/modify TST.B D1 ; read ?
- beq L0085E ;*/modify BLT L0085E
-
- MT_DMOD1:
- move.l d2,-(a7) ;swap d2
-
- addi.b #%01000000,d1 ; if bits 7/6 do not differ...
-
- tst.b d1
- bmi.s MT_DMOD2
-
- andi.w #%0000000000001000,d1 ; only change mode
- ori.w #%0111011100000000,d1
- bra.s MT_DMOD4
-
- MT_DMOD2:
- btst #6,d1
- bne.s MT_DMOD4
-
- MT_DMOD3:
- ext.w d1 ; if bit 6 was set, set msbyte
-
- MT_DMOD4:
- move.b d0,d2
- rol.w #8,d1
- and.b d1,d2
- rol.w #8,d1
- eor.b d1,d2
- eor.b d0,d2
- lsl.b #2,d2
- bpl.s MT_DMOD5
-
- bsr MODEFIX4 ; exchange lower bits if default scr changes
-
- MT_DMOD5:
- rol.w #8,d1
- and.b d1,d0
- rol.w #8,d1
- eor.b d1,d0
-
- move.b d0,d2
- lsr.b #5,d2
-
- eor.b d2,JB_RELA6(a4) ; set BASICs' JB_RELA6
- andi.b #%11111110,JB_RELA6(a4)
- eor.b d2,JB_RELA6(a4)
-
- lsl.w #3,d0 ; default/shown display into 7/6
- asr.b #2,d0
- lsr.w #1,d0
-
- tst.b d0
- bpl.s MT_DMOD6
-
- roxl.l #1,d1 ; swap bits if default=scrn1
- rol.w #1,d1
- roxr.l #1,d1
- roxr.w #1,d1 ; enable clr scrn0/scrn1 into 15/14
-
- MT_DMOD6:
- addi.b #%01000000,d0
- bpl.s MT_DMOD7
-
- bsr MODEFIX4 ; exchange lower bits if default<>shown
-
- MT_DMOD7:
- lsl.b #2,d0
- asr.b #2,d0 ; position shown display
-
- move.b d0,SV_MCSTA(a6)
- andi.b #%10001010,d0
- move.b d0,MC_STAT
-
- move.l (a7)+,d2 ; swap d2
-
- bsr MDCLS ; can't fit so use sub
-
- ; ori.w #$8000,sr
-
- ; reinitialization of screen channels
- MOVEA.L SV_CHBAS(A6),A4 ; Ptr to base of channel
- ; table
- L007F2:
- MOVE.L (A4)+,D0
- MOVEM.L D1-D6/A0-A6,-(A7)
- BLT.S L00852 ; channel closed ?
-
- MOVEA.L D0,A0
- cmpi.l #$20000,SD_SCRB(a0)
- beq.s MT_DMOD8
-
- cmpi.l #$28000,SD_SCRB(a0)
- bne.s L00852 ; not a screen channel
-
- lsl.w #1,d1
-
- MT_DMOD8:
- tst.w d1
- bmi.s L00852
-
- MT_DMOD9:
- MOVE.W SD_BORWD(A0),-(A7)
- LEA SD_PMASK(A0),A1 ; paper colour mask
- LEA SD_PCOLR(A0),A5 ; paper colour byte
- MOVEQ #$02,D0
- L0081C:
- MOVE.B (A5)+,D1
- JSR L027D8(PC) ;*/undomodify BSR L027D8
- ; set paper mask
- ADDQ.W #4,A1 ;*/undomend ADDQ.L #4,A1
- DBF D0,L0081C
- JSR SD_CLEAR(PC) ;*/undomodify BSR SD_CLEAR
- MOVE.B (A5),D1
- MOVE.W (A7)+,D2
- JSR SD_BORDR(PC) ;*/undomodify BSR SD_BORDR
- SUBQ.W #5,A5 ;*/undomend SUBQ.L #5,A5
- ANDI.B #0,(A5) ; reset char-attributes to 0
- MOVE.L #$6000A,SD_XINC(A0) ; reset char size
- bsr MDTSTFIX
- BEQ.S L0084E ; mode 4
- BSET #6,(A5)+ ; mode 8
- LSL.W SD_XINC(A0)
- L0084E:
- TST.B (A5) ; cursor status
- SNE (A5)
- L00852:
- MOVEM.L (A7)+,D1-D6/A0-A6
- CMPA.L SV_CHTOP(A6),A4 ; Ptr to top of channel
- ; table
- BLT.S L007F2 ; continue for all channels
- ;*/removecode BRA.S L00862
- L0085E:
- exg d0,d1 ;*/removecode MOVEQ #8,D1
- ;*/removecode AND.B D0,D1
-
- L00862:
- TST.B D2
- BGE.S L0086A
- MOVE.B SV_TVMOD(A6),D2 ; 0 if not TV display
- L0086A:
- MOVE.B D2,SV_TVMOD(A6) ; 0 if not TV display
-
- ; disable command-to-8049 and change-baud-rate
- L00872:
- MT_IPCOM:
-
- L00882:
- MT_BAUD:
- BRA RET_CLD0
-
- NOP008E6:
- ; DCB.w ($8E6-(NOP008E6-ORGN))/2,$4E71
- L008E6:
- ;*/endoverlay
- ; --------------------------------------------------------------
- ;*/endfile
-