RED:     EQU   $0F00
GREEN:   EQU   $00F0
BLUE:    EQU   $000F
WHITE:   EQU   $0FFF
YELLOW:  EQU   $0FF0
CYAN:    EQU   $00FF
MAGENTA: EQU   $0F0F
INTREQ:  EQU   $DFF09C
INTREQR: EQU   $DFF01E
INTENA:  EQU   $DFF09A
INTENAR: EQU   $DFF01C
DMACON:  EQU   $DFF096
BPLCON0: EQU   $DFF100
DIWSTRT: EQU   $DFF08E
DIWSTOP: EQU   $DFF090
DDFSTRT: EQU   $DFF092
DDFSTOP: EQU   $DFF094
COP1LC:  EQU   $DFF080
COP2LC:  EQU   $DFF084
COPJMP1: EQU   $DFF088
COPJMP2: EQU   $DFF08A
COPCON:  EQU   $DFF02E
COLOR00: EQU   $DFF180
COLOR01: EQU   $DFF182
COLOR02: EQU   $DFF184
COLOR03: EQU   $DFF186
BLTCPTH: EQU    $DFF048
BLTCPTL: EQU    $DFF04A
BLTBPTH: EQU    $DFF04C
BLTBPTL: EQU    $DFF04E
BLTAPTH: EQU    $DFF050
BLTAPTL: EQU    $DFF052
BLTDPTH: EQU    $DFF054
BLTDPTL: EQU    $DFF056
BLTCMOD: EQU    $DFF060
BLTBMOD: EQU    $DFF062
BLTAMOD: EQU    $DFF064
BLTDMOD: EQU    $DFF066
BLTSIZE: EQU    $DFF058
BLTCON0: EQU    $DFF040
BLTCON1: EQU    $DFF042
BLTAFWM: EQU    $DFF044
BLTALWM: EQU    $DFF046
BLTDDAT: EQU    $DFF000
BLTCDAT: EQU    $DFF070
BLTBDAT: EQU    $DFF072
BLTADAT: EQU    $DFF074
DMACONW: EQU    $DFF096
DMACONR: EQU    $DFF002

	LEA	STO_PC,A5
	MOVE.L	$30004,D0	; get initial PC
	MOVE.L	D0,(A5)
	MOVE.L  $30000,D0	; get initial SSP
	MOVE.L  D0,4(A5)	
	CMP.B	#' ',(A0)	; any characters as command line ?
	BLT.S   GETTIME
	BSR	HexA0_D0	; get RAM bottom
	MOVE.L  D0,$30004	; set RAM bottom as initial PC
	CMP.B   #' ',(A0)	; any more characters ?
	BLT.S   GETTIME
	BSR	HexA0_D0	; get RAM top
	MOVE.L  D0,$28020	; set RAM top
	CMP.B   #' ',(A0)	; any more characters ?
	BLT.S   GETTIME
	BSR	HexA0_D0	; get initial SSP
	MOVE.L  D0,$30000	; set initial SSP
	MOVE.W  #$D254,$28000   ; set QDOS identification
GETTIME:
	MOVE.L	4,A6
	LEA	DOS_Name,A1
	JSR	-408(A6)	; open DOS library
	MOVE.L	D0,A6		; we only want to call a DOS function
	JSR	-192(A6)	; get time vector in D1
	MOVE.L	D1,A0
	MOVE.L	0(A0),D0	; get days since 1.1.1978
	ADD.L	#365*17,D0	; we need days since 1.1.1961
	ADD.L	#4,D0		; add "Schaltjahre"
	MULU	#24*60*60/8,D0	; make seconds since this day
	LSL.L	#3,D0		; only word operand for MULU
	MOVE.L	4(A0),D1	; get minutes since midnight
	MULU	#60,D1		; make seconds
	ADD.L	D1,D0		; now we have seconds since 1.1.1961
	MOVE.L	D0,$280A2	; store as offset for QDOS
	CLR.B	$BFEA01		; reset CIA-A event counter
	CLR.B	$BFE901
	CLR.B	$BFE801
; -------------------------------------------------------------------
; move the whole operating system (48 K) to start of RAM
      LEA      TRAP0,A0
      MOVE.L   A0,$80  ; Initialize TRAP #0 to enter supervisor mode
      TRAP     #0 ; enter supervisor mode
      ORI      #$0700,SR   ; Disable all interrupts
WAITBLIT:
      BTST     #14,DMACONR
      BNE.S    WAITBLIT
      MOVE.W   #$3FFF,INTENA   ; disable all possible interrupt sources
      MOVE.W   #$3FFF,INTREQ   ; clear all pending interrupts
      MOVE.W   #$01FF,DMACON   ; disable DMA (bitplane, copper, blitter)
      MOVE.L   #$FFFFFFFE,D0   ; Copper instruction wait for ever
      MOVE.L   D0,$20000   ; Write "copperlist" to QL-screen
      MOVE.L   #$20000,COP1LC   ; Set copper start address
      MOVE.L   #$20000,COP2LC
      MOVE.W   #0,COPCON   ; inhibit blitter control by copper
      MOVE.W   #0,COPJMP1   ; set copper PC
      MOVE.L   #$30000,A0
      MOVE.L   #0,A1
      MOVE.L   #$3000,D0   ; (48K = $3000 Long words)
MOVQDOS:
      MOVE.L   (A0)+,(A1)+
      DBRA   D0,MOVQDOS
	LEA	STO_PC,A6
	MOVE.L	4(A6),A7 ; get initial SSP
	MOVE.L  (A6),A0  ; get initial PC
      JMP   (A0)      ; start Qdos
TRAP0: ADDQ.L #2,A7
      RTS
STO_PC: DS.L 4

DOS_Name: DC.B "dos.library",0
	NOP
HexA0_D0:                 ; get Hex number from text (A0)  -> D0
        CLR.L D0
; Hack leading spaces
Hack_Blank:
         CMP.B    #' ',(A0)+
         BEQ.S    Hack_Blank
         SUBQ.L   #1,A0
LC6642C:
        MOVE.B (A0)+,D1
        CMPI.B #' ',D1    ; space ?
        BEQ.S LC66454
        CMPI.B #10,D1     ; Line Feed ?
        BEQ.S LC66454
        CMPI.B #'A',D1    ; letter 'A' ?
        BLT.S LC66446
        SUBI.B #55,D1
        BRA.S LC6644A
LC66446:
        SUBI.B #$30,D1    ; generate number from 10 to 15
LC6644A:
        ANDI.B #$F,D1     ; only numbers from 10 to 15 are relevant
        LSL.L #4,D0       ; place for next 4 bits
        OR.B D1,D0        ; insert next 4 bits
        BRA.S LC6642C     ; continue until end of Number
LC66454:RTS

      END
