wok annotate linld/stuff/src/ISOCRTL.ASM @ rev 23871

linld: fix isoreaddir
author Pascal Bellard <pascal.bellard@slitaz.org>
date Tue Jun 23 13:35:04 2020 +0000 (2020-06-23)
parents 9096d6788292
children d964f766faa5
rev   line source
pascal@23806 1 ;***************************************************************
pascal@23806 2 ;****** This file is distributed under GPL
pascal@23806 3 ;***************************************************************
pascal@23806 4 ideal
pascal@23806 5 %PAGESIZE 1000
pascal@23806 6 %crefref
pascal@23806 7 %noincl
pascal@23806 8 %nomacs
pascal@23806 9 p8086
pascal@23806 10
pascal@23806 11 group DGROUP _TEXT,_DATA,_BSS
pascal@23806 12 assume cs:DGROUP,ds:DGROUP
pascal@23806 13
pascal@23806 14 segment _TEXT byte public use16 'CODE'
pascal@23806 15 ends _TEXT
pascal@23806 16
pascal@23806 17 segment _DATA byte public use16 'DATA'
pascal@23806 18 ends _DATA
pascal@23806 19
pascal@23806 20 segment _BSS byte public use16 'BSS'
pascal@23806 21
pascal@23806 22 include "isostate.inc"
pascal@23806 23
pascal@23806 24 public _isostate
pascal@23806 25 _isostate isostate <?>
pascal@23863 26 ; org $-7
pascal@23806 27
pascal@23806 28 ends _BSS
pascal@23806 29
pascal@23806 30 segment _TEXT byte public use16 'CODE'
pascal@23806 31
pascal@23806 32 global fold:near
pascal@23806 33 fold:
pascal@23863 34 org 0EF00h
pascal@23806 35 global unfold:near
pascal@23806 36 unfold:
pascal@23863 37 jmp iso_open
pascal@23863 38 extrn @isoreaddir$qv
pascal@23863 39 dw @isoreaddir$qv
pascal@23863 40 jmp @readmenu$qv
pascal@23863 41
pascal@23806 42 push dx
pascal@23806 43 call readfd
pascal@23806 44 push ds
pascal@23806 45 pop es
pascal@23806 46 mov di,128h ; TABLE
pascal@23806 47 mov ax,offset iso_open_hack
pascal@23806 48 stosw
pascal@23806 49 mov ax,offset iso_read_hack
pascal@23806 50 stosw
pascal@23806 51 mov ax,offset iso_lseek_hack
pascal@23806 52 stosw
pascal@23806 53 mov ax,offset iso_close_hack
pascal@23806 54 stosw
pascal@23871 55 ; mov ax,offset iso_cleanup_hack
pascal@23871 56 ; stosw
pascal@23806 57 global @_cpuhaslm$qv:near
pascal@23806 58 @_cpuhaslm$qv:
pascal@23806 59 mov ax,[132h]
pascal@23806 60 and al,20h
pascal@23806 61 ret
pascal@23806 62
pascal@23806 63 iso_open_hack:
pascal@23806 64 pop ax
pascal@23806 65 extrn @_isoopen$qv:near
pascal@23806 66 cmp [byte bx],'!'
pascal@23806 67 je @readmenu$qv
pascal@23806 68 xchg ax,bx
pascal@23806 69 global iso_open:near
pascal@23806 70 iso_open:
pascal@23806 71 mov [_isostate.filename2open],ax
pascal@23806 72 call @_isoopen$qv
pascal@23864 73 cmp al,1
pascal@23863 74 cmc
pascal@23844 75 push bx
pascal@23844 76 iso_close_hack:
pascal@23844 77 pop bx
pascal@23806 78 ret
pascal@23806 79
pascal@23806 80
pascal@23806 81 macro curseek
pascal@23806 82 push cx
pascal@23806 83 xor cx,cx
pascal@23806 84 mov ax,4201h
pascal@23868 85 cwd
pascal@23806 86 call dosfd ; lseek(,0L,SEEK_CUR)
pascal@23806 87 call @doseek2
pascal@23806 88 ifndef NO386
pascal@23806 89 push dx
pascal@23806 90 push ax
pascal@23806 91 pop eax
pascal@23806 92 endif
pascal@23806 93 pop cx
pascal@23806 94 endm
pascal@23806 95
pascal@23863 96 ;***************************************************************
pascal@23863 97 ;_fastcall void readmenu(void);
pascal@23863 98 ;***************************************************************
pascal@23863 99 global @readmenu$qv:near
pascal@23863 100 proc @readmenu$qv near
pascal@23806 101
pascal@23844 102 mov dx,18
pascal@23844 103 xor cx,cx
pascal@23844 104 call lseekset
pascal@23844 105 mov dx,offset _isostate.filemod
pascal@23844 106 mov cx,10
pascal@23844 107 call readfd ; // read x->filemod + x->fileofs & x->filesize
pascal@23844 108 mov bx,offset _isostate.fileofs
pascal@23844 109 ; x->fileofs = 0x7FF0 - (x->filesize &= 0xFFFF);
pascal@23844 110 mov ax,7FF0h
pascal@23863 111 cwd
pascal@23863 112 mov [word bx+6],dx
pascal@23844 113 sub ax,[bx+4]
pascal@23863 114 mov [word bx+2],dx
pascal@23844 115 mov [bx],ax
pascal@23844 116 ; //magic = x->filemod;
pascal@23844 117
pascal@23863 118 endp @readmenu$qv
pascal@23863 119
pascal@23806 120 ;***************************************************************
pascal@23806 121 ;_fastcall void isolseek(bx:const unsigned long *offset);
pascal@23806 122 ;***************************************************************
pascal@23806 123 global @isolseek$qpxul:near
pascal@23806 124 proc @isolseek$qpxul near
pascal@23806 125
pascal@23806 126 isolseek:
pascal@23806 127 mov dx,[bx]
pascal@23806 128 mov cx,[bx+2]
pascal@23806 129 lseekset:
pascal@23806 130 mov ax,4200h ; bx=fd cx:dx=offset al=whence
pascal@23806 131 dosfd:
pascal@23806 132 mov bx,[_isostate.fd]
pascal@23806 133 dos:
pascal@23806 134 int 21h
pascal@23806 135 failifc:
pascal@23806 136 jnc @@dosok
pascal@23806 137 fail:
pascal@23806 138 sbb ax,ax
pascal@23806 139 cwd
pascal@23806 140 @@dosok:
pascal@23806 141 ret
pascal@23806 142
pascal@23806 143 endp @isolseek$qpxul
pascal@23806 144
pascal@23806 145 ;***************************************************************
pascal@23806 146 ;_fastcall int isoreadsector(bx:const unsigned long *offset);
pascal@23806 147 ;***************************************************************
pascal@23806 148 global @isoreadsector$qpxul:near
pascal@23806 149 proc @isoreadsector$qpxul near
pascal@23806 150
pascal@23806 151 call isolseek
pascal@23806 152 jc fail
pascal@23806 153 mov cx,2560
pascal@23806 154 mov dx,offset _isostate.buffer
pascal@23806 155 global readfd:near
pascal@23806 156 readfd:
pascal@23806 157 mov ah,3Fh
pascal@23806 158 jmp dosfd
pascal@23806 159
pascal@23806 160 endp @isoreadsector$qpxul
pascal@23806 161
pascal@23806 162 ;***************************************************************
pascal@23806 163 ;_fastcall int strhead(bx:const char* a, ax:const char* b);
pascal@23806 164 ;***************************************************************
pascal@23806 165 global @strhead$qpxzct1:near
pascal@23806 166 proc @strhead$qpxzct1 near
pascal@23806 167
pascal@23806 168 @@loop:
pascal@23806 169 xchg ax,bx
pascal@23806 170 mov cl,[bx] ; cl = *b++
pascal@23806 171 inc bx
pascal@23806 172 or cl,cl ; clear C
pascal@23806 173 jz failifc ; return 0
pascal@23806 174 xchg ax,bx
pascal@23806 175 xor cl,[bx] ; cl -= *a++
pascal@23806 176 inc bx
pascal@23806 177 and cl,0dfh ; case insensitive
pascal@23806 178 jne fail ; return -1
pascal@23806 179 jmp @@loop
pascal@23806 180
pascal@23806 181 endp @strhead$qpxzct1
pascal@23806 182
pascal@23806 183 ;***************************************************************
pascal@23806 184 ;_fastcall int strcmp(bx:const char* a, ax:const char* b);
pascal@23806 185 ;***************************************************************
pascal@23806 186 global @strcmp$qpxzct1:near
pascal@23806 187 proc @strcmp$qpxzct1 near
pascal@23806 188
pascal@23806 189 push si
pascal@23806 190 xchg ax,si
pascal@23806 191 dec bx
pascal@23806 192 @@lp:
pascal@23806 193 inc bx
pascal@23806 194 lodsb
pascal@23806 195 sub al,[bx]
pascal@23806 196 jnz @@out
pascal@23806 197 or al,[bx]
pascal@23806 198 jnz @@lp
pascal@23806 199 @@out:
pascal@23806 200 cbw
pascal@23806 201 pop si
pascal@23806 202 ret
pascal@23806 203
pascal@23806 204 endp @strcmp$qpxzct1
pascal@23806 205
pascal@23863 206 iso_read_hack:
pascal@23863 207 ifdef NO386
pascal@23863 208 push dx
pascal@23863 209 curseek
pascal@23863 210 mov bx,[word _isostate.filesize]
pascal@23863 211 sub bx,ax
pascal@23863 212 mov ax,[(word _isostate.filesize)+2]
pascal@23863 213 sbb ax,dx
pascal@23863 214 ja @@cxok
pascal@23863 215 je @@rem
pascal@23863 216 xor cx,cx
pascal@23863 217 @@rem:
pascal@23863 218 cmp bx,cx
pascal@23863 219 ja @@cxok
pascal@23863 220 mov cx,bx
pascal@23863 221 @@cxok:
pascal@23863 222 pop dx
pascal@23863 223 else
pascal@23863 224 p386
pascal@23863 225 push edx
pascal@23863 226 curseek
pascal@23863 227 mov edx,[_isostate.filesize]
pascal@23863 228 sub edx,eax
pascal@23863 229 jnb @@rem
pascal@23863 230 xor cx,cx
pascal@23863 231 @@rem:
pascal@23863 232 movzx eax,cx
pascal@23863 233 cmp edx,eax
pascal@23863 234 ja @@cxok
pascal@23863 235 mov cx,dx
pascal@23863 236 @@cxok:
pascal@23863 237 pop edx
pascal@23863 238 endif
pascal@23863 239 or cx,cx
pascal@23863 240 pop bx
pascal@23863 241 jmp readfd
pascal@23863 242
pascal@23863 243 iso_lseek_hack:
pascal@23863 244 xchg ax,bx
pascal@23863 245 pop bx
pascal@23863 246 ifdef SEEK_CUR
pascal@23863 247 cmp al,1 ; current
pascal@23863 248 jne @@nocurrent
pascal@23863 249 call dosfd ; lseek(,0L,SEEK_CUR)
pascal@23863 250 jmp @doseek2
pascal@23863 251 @nocurrent:
pascal@23863 252 endif
pascal@23863 253 add dx,[word _isostate.fileofs]
pascal@23863 254 adc cx,[(word _isostate.fileofs)+2]
pascal@23863 255 cmp al,0 ; start
pascal@23863 256 je @@doseek
pascal@23863 257 add dx,[word _isostate.filesize]
pascal@23863 258 adc cx,[(word _isostate.filesize)+2]
pascal@23863 259 @@doseek:
pascal@23863 260 call lseekset ; lseek(,0L,SEEK_SET)
pascal@23863 261 @doseek2:
pascal@23863 262 sub ax,[word _isostate.fileofs]
pascal@23863 263 sbb dx,[(word _isostate.fileofs)+2]
pascal@23863 264 ret
pascal@23863 265
pascal@23871 266 ;iso_cleanup_hack:
pascal@23871 267 ; mov ah,3Eh ; close file
pascal@23871 268 ; jmp dosfd
pascal@23871 269
pascal@23806 270 ifdef NO386
pascal@23806 271 global N_LXLSH@ES:near
pascal@23806 272 N_LXLSH@ES:
pascal@23806 273 mov dx,es
pascal@23806 274 global N_LXLSH@:near
pascal@23806 275 N_LXLSH@:
pascal@23806 276 mov ch,0
pascal@23806 277 @@lp:
pascal@23806 278 shl ax,1
pascal@23806 279 rcl dx,1
pascal@23806 280 loop @@lp
pascal@23806 281 ret
pascal@23806 282 endif
pascal@23806 283
pascal@23806 284 ends _TEXT
pascal@23806 285
pascal@23806 286 end