/usr/share/z88dk/lib/spec_crt0.asm is in z88dk-data 1.8.ds1-10.
This file is owned by root:root, with mode 0o644.
The actual contents of the file can be viewed below.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 | ; Kludgey startup for Spectra
;
; djm 18/5/99
;
; $Id: spec_crt0.asm,v 1.14 2007/06/27 20:48:03 dom Exp $
;
MODULE zx82_crt0
;--------
; Include zcc_opt.def to find out some info
;--------
INCLUDE "zcc_opt.def"
;--------
; Some scope definitions
;--------
XREF _main ;main() is always external to crt0 code
XDEF cleanup ;jp'd to by exit()
XDEF l_dcal ;jp(hl)
XDEF _vfprintf ;jp to the printf() core
XDEF exitsp ;atexit() variables
XDEF exitcount
XDEF heaplast ;Near malloc heap variables
XDEF heapblocks
XDEF __sgoioblk ;stdio info block
XDEF base_graphics ;Graphical variables
XDEF coords ;Current xy position
XDEF snd_tick ;Sound variable
XDEF call_rom3 ;Interposer
;--------
; Set an origin for the application (-zorg=) default to 32768
;--------
IF DEFINED_ZXVGS
IF !myzorg
DEFC myzorg = $5CCB ;repleaces BASIC program
ENDIF
IF !STACKPTR
DEFC STACKPTR = $FF57 ;below UDG, keep eye when using banks
ENDIF
ENDIF
IF !myzorg
defc myzorg = 32768
ENDIF
org myzorg
.start
ld iy,23610 ; restore the right iy value, fixes the self-relocating trick
IF !DEFINED_ZXVGS
ld (start1+1),sp ;Save entry stack
ENDIF
IF STACKPTR
ld sp,STACKPTR
ENDIF
ld hl,-64
add hl,sp
ld sp,hl
ld (exitsp),sp
IF DEFINED_ZXVGS
;setting variables needed for proper keyboard reading
LD (IY+1),$CD ;FLAGS #5C3B
LD (IY+48),1 ;FLAGS2 #5C6A
EI ;ZXVGS starts with disabled interrupts
ENDIF
ld a,2 ;open the upper display (uneeded?)
call 5633
IF !DEFINED_nostreams
IF DEFINED_ANSIstdio
; Set up the std* stuff so we can be called again
ld hl,__sgoioblk+2
ld (hl),19 ;stdin
ld hl,__sgoioblk+6
ld (hl),21 ;stdout
ld hl,__sgoioblk+10
ld (hl),21 ;stderr
ENDIF
ENDIF
IF DEFINED_NEEDresidos
call residos_detect
jp c,cleanup_exit
ENDIF
call _main ;Call user program
.cleanup
;
; Deallocate memory which has been allocated here!
;
push hl
IF !DEFINED_nostreams
IF DEFINED_ANSIstdio
LIB closeall
call closeall
ENDIF
ENDIF
IF DEFINED_ZXVGS
POP BC ;let's say exit code goes to BC
RST 8
DEFB $FD ;Program finished
ELSE
.cleanup_exit
ld hl,10072 ;Restore hl' to what basic wants
exx
pop bc
.start1 ld sp,0 ;Restore stack to entry value
ret
ENDIF
.l_dcal jp (hl) ;Used for function pointer calls
;-----------
; Define the stdin/out/err area. For the z88 we have two models - the
; classic (kludgey) one and "ANSI" model
;-----------
.__sgoioblk
IF DEFINED_ANSIstdio
INCLUDE "#stdio_fp.asm"
ELSE
defw -11,-12,-10
ENDIF
;---------------------------------
; Select which printf core we want
;---------------------------------
._vfprintf
IF DEFINED_floatstdio
LIB vfprintf_fp
jp vfprintf_fp
ELSE
IF DEFINED_complexstdio
LIB vfprintf_comp
jp vfprintf_comp
ELSE
IF DEFINED_ministdio
LIB vfprintf_mini
jp vfprintf_mini
ENDIF
ENDIF
ENDIF
;---------------------------------------------
; Some +3 stuff - this needs to be below 49152
;---------------------------------------------
IF DEFINED_NEEDresidos
INCLUDE "#idedos.def"
defc ERR_NR=$5c3a ; BASIC system variables
defc ERR_SP=$5c3d
XDEF dodos
;
; This is support for residos, we use the normal
; +3 -lplus3 library and rewrite the values so
; that they suit us somewhat
.dodos
exx
push iy
pop hl
ld b,PKG_IDEDOS
rst RST_HOOK
defb HOOK_PACKAGE
ld iy,23610
ret
; Detect an installed version of ResiDOS.
;
; This should be done before you attempt to call any other ResiDOS/+3DOS/IDEDOS
; routines, and ensures that the Spectrum is running with ResiDOS installed.
; Since +3DOS and IDEDOS are present only from v1.40, this version must
; be checked for before making any further calls.
;
; If you need to use calls that were only provided from a certain version of
; ResiDOS, you can check that here as well.
;
; The ResiDOS version call is made with a special hook-code after a RST 8,
; which will cause an error on Speccies without ResiDOS v1.20+ installed,
; or error 0 (OK) if ResiDOS v1.20+ is present. Therefore, we need
; to trap any errors here.
.residos_detect
ld hl,(ERR_SP)
push hl ; save the existing ERR_SP
ld hl,detect_error
push hl ; stack error-handler return address
ld hl,0
add hl,sp
ld (ERR_SP),hl ; set the error-handler SP
rst RST_HOOK ; invoke the version info hook code
defb HOOK_VERSION
pop hl ; ResiDOS doesn't return, so if we get
jr noresidos ; here, some other hardware is present
.detect_error
pop hl
ld (ERR_SP),hl ; restore the old ERR_SP
ld a,(ERR_NR)
inc a ; is the error code now "OK"?
jr nz,noresidos ; if not, ResiDOS was not detected
ex de,hl ; get HL=ResiDOS version
push hl ; save the version
ld de,$0140 ; DE=minimum version to run with
and a
sbc hl,de
pop bc ; restore the version to BC
ret nc ; and return with it if at least v1.40
.noresidos
ld bc,0 ; no ResiDOS
ld a,$ff
ld (ERR_NR),a ; clear error
ret
ENDIF
;---------------------------------------------
; Some +3 stuff - this needs to be below 49152
;---------------------------------------------
IF DEFINED_NEEDplus3dodos
; Routine to call +3DOS Routines. Located in startup
; code to ensure we don't get paged out
; (These routines have to be below 49152)
; djm 17/3/2000 (after the manual!)
XDEF dodos
.dodos
call dodos2 ;dummy routine to restore iy afterwards
ld iy,23610
ret
.dodos2
push af
push bc
ld a,7
ld bc,32765
di
ld (23388),a
out (c),a
ei
pop bc
pop af
call cjumpiy
push af
push bc
ld a,16
ld bc,32765
di
ld (23388),a
out (c),a
ei
pop bc
pop af
ret
.cjumpiy
jp (iy)
ENDIF
IF 0
; Short routine to set up a +3 DOS header so files
; Can be accessed from BASIC, we set to type code
; load address 0 and length supplied
;
; Entry: b = file handle
; hl = file length
.setheader
ld iy,setheader_r
call dodos
ret
.setheader_r
push hl
call 271 ;DOS_RED_HEAD
pop hl
ld (ix+0),3 ;CODE
ld (ix+1),l ;Length
ld (ix+2),h
ld (ix+3),0 ;Load address
ld (ix+4),0
ret
ENDIF
; Call a routine in the spectrum ROM
; The routine to call is stored in the two bytes following
.call_rom3
exx ; Use alternate registers
ex (sp),hl ; get return address
ld c,(hl)
inc hl
ld b,(hl) ; BC=BASIC address
inc hl
ex (sp),hl ; restore return address
push bc
exx ; Back to the regular set
ret
;-----------
; Now some variables
;-----------
.coords defw 0 ; Current graphics xy coordinates
.base_graphics defw 0 ; Address of the Graphics map
IF !DEFINED_HAVESEED
XDEF _std_seed ;Integer rand() seed
._std_seed defw 0 ; Seed for integer rand() routines
ENDIF
.exitsp defw 0 ; Address of where the atexit() stack is
.exitcount defb 0 ; How many routines on the atexit() stack
.heaplast defw 0 ; Address of last block on heap
.heapblocks defw 0 ; Number of blocks
IF DEFINED_NEED1bitsound
.snd_tick defb 0 ; Sound variable
ENDIF
defm "Small C+ ZX" ;Unnecessary file signature
defb 0
;-----------------------
; Floating point support
;-----------------------
IF NEED_floatpack
INCLUDE "#float.asm"
.fp_seed defb $80,$80,0,0,0,0 ;FP seed (unused ATM)
.extra defs 6 ;FP register
.fa defs 6 ;FP Accumulator
.fasign defb 0 ;FP register
ENDIF
|