202 lines
		
	
	
	
		
			2.9 KiB
		
	
	
	
		
			ArmAsm
		
	
	
	
	
	
			
		
		
	
	
			202 lines
		
	
	
	
		
			2.9 KiB
		
	
	
	
		
			ArmAsm
		
	
	
	
	
	
| .define _read,_write,_ioctl,_getpid,_open,_close,_exit,_errno
 | |
| .sect .text
 | |
| .sect .rom
 | |
| .sect .data
 | |
| .sect .bss
 | |
| .sect .text
 | |
| _read:
 | |
| 	ld (savebc),bc
 | |
| 	push af
 | |
| 	pop bc
 | |
| 	ld (saveaf),bc	! save all registers in savereg
 | |
| 	ld (savede),de
 | |
| 	ld (savehl),hl
 | |
| 	ld (saveix),ix
 | |
| 	ex	(sp),hl	! return address in hl
 | |
| 	pop	bc	! skip return address
 | |
| 	pop	bc	! get fd
 | |
| 	ld	a,b	! check fd = 0
 | |
| 	or	c
 | |
| 	jr	nz,errrd
 | |
| 	pop	de	! get buffer
 | |
| 	pop	bc	! get count
 | |
| 	ld	ix,0	! reset counter
 | |
| 	push	bc
 | |
| 	push	de
 | |
| 	push	ix
 | |
| 	push	hl	! return address
 | |
| 	ex	de,hl	! buffer to hl
 | |
| 1:	ld	a,b
 | |
| 	or	c
 | |
| 	jr	z,done	! done if count = 0
 | |
| 	call	getchr
 | |
| 	ld	(hl),a
 | |
| 	inc	hl	! increment pointer
 | |
| 	inc	ix	! increment char counter
 | |
| 	dec	bc	! decrement count
 | |
| 	cp	0xA
 | |
| 	jr	nz,1b	! done if char = CR
 | |
| done:
 | |
| 	ld bc,(saveaf)
 | |
| 	push bc
 | |
| 	pop af
 | |
| 	ld bc,(savebc)
 | |
| 	ld de,(savede)
 | |
| 	ld hl,(savehl)
 | |
| 	ld ix,(saveix)
 | |
| 	ret
 | |
| errrd:	
 | |
| 	push	bc
 | |
| 	push	hl	! return address
 | |
| 	ld bc,(saveaf)
 | |
| 	push bc
 | |
| 	pop af
 | |
| 	ld bc,(savebc)
 | |
| 	ld de,(savede)
 | |
| 	ld hl,(savehl)
 | |
| 	ld ix,(saveix)
 | |
| 	ld	ix,-1
 | |
| 	ret
 | |
| 
 | |
| _write:
 | |
| 	ld (savebc),bc
 | |
| 	push af
 | |
| 	pop bc
 | |
| 	ld (saveaf),bc	! save all registers in savereg
 | |
| 	ld (savede),de
 | |
| 	ld (savehl),hl
 | |
| 	ld (saveix),ix
 | |
| 	ex	(sp),hl	! return address in hl
 | |
| 	pop	de	! skip return address
 | |
| 	pop	de	! get fd
 | |
| 	ld	a,e	! check for fd = 1
 | |
| 	cp	1
 | |
| 	jr	nz,errwr
 | |
| 	ld	a,d
 | |
| 	or	a
 | |
| 	jr	nz,errwr
 | |
| 	pop	de      ! buffer in de
 | |
| 	pop	bc	! count in bc
 | |
| 	push	bc
 | |
| 	push	de
 | |
| 	push	de
 | |
| 	push	hl
 | |
| 	ex	de,hl	! buffer in hl
 | |
| 	ld	e,c
 | |
| 	ld	d,b	! count also in de
 | |
| 1:	ld	a,b
 | |
| 	or	c
 | |
| 	jr	z,exit
 | |
| 	ld	a,(hl)
 | |
| 	call	putchr
 | |
| 	inc	hl
 | |
| 	dec	bc
 | |
| 	jr	1b
 | |
| errwr:
 | |
| 	push	de
 | |
| 	push	hl
 | |
| 	ld bc,(saveaf)
 | |
| 	push bc
 | |
| 	pop af
 | |
| 	ld bc,(savebc)
 | |
| 	ld de,(savede)
 | |
| 	ld hl,(savehl)
 | |
| 	ld ix,(saveix)
 | |
| 	ld	ix,-1	! error in fd
 | |
| 	ret
 | |
| exit:
 | |
| 	push	de	! count on stack
 | |
| 	ld bc,(saveaf)
 | |
| 	push bc
 | |
| 	pop af
 | |
| 	ld bc,(savebc)
 | |
| 	ld de,(savede)
 | |
| 	ld hl,(savehl)
 | |
| 	ld ix,(saveix)
 | |
| 	pop	ix	! return count to caller
 | |
| 	ret
 | |
| 
 | |
| _ioctl:
 | |
| 	ret
 | |
| _getpid:
 | |
| 	ret
 | |
| 
 | |
| ! open return a file descriptor (0,1,2)
 | |
| ! depending on 'mode'
 | |
| ! mode 2 doesn't work!!
 | |
| _open:
 | |
| 	ld (savebc),bc
 | |
| 	push af
 | |
| 	pop bc
 | |
| 	ld (saveaf),bc	! save all registers in savereg
 | |
| 	ld (savede),de
 | |
| 	ld (savehl),hl
 | |
| 	ld (saveix),ix
 | |
| 	pop	bc	! return address
 | |
| 	pop	de	! name pointer
 | |
| 	pop	ix	! mode (0 for read,
 | |
| 			! 1 for write)
 | |
| 	push	ix
 | |
| 	push	de
 | |
| 	push	bc
 | |
| 	ld bc,(saveaf)
 | |
| 	push bc
 | |
| 	pop af
 | |
| 	ld bc,(savebc)
 | |
| 	ld de,(savede)
 | |
| 	ld hl,(savehl)
 | |
| 	ld ix,(saveix)
 | |
| 	ret		! return fd = 0 for read
 | |
| 			! fd = 1 for write
 | |
| 
 | |
| _close:
 | |
| 	ld	ix,0	! return succes
 | |
| 	ret
 | |
| _exit:
 | |
| jp 0x38
 | |
| .sect .data
 | |
| _errno:
 | |
| 	.data2	0
 | |
| ! output routine in monitor
 | |
| CRT	= 0x013B
 | |
| ! output a charcter
 | |
| ! entry: ascii character in a
 | |
| .sect .text
 | |
| !putchr:
 | |
| !	push	hl
 | |
| !	push	bc
 | |
| !	ld	hl,tab
 | |
| !	ld	b,5
 | |
| !1:	cp	(hl)
 | |
| !	jr	z,fetch
 | |
| !	inc	hl
 | |
| !	inc	hl
 | |
| !	djnz	1b
 | |
| !2:	call	CRT
 | |
| !	pop	bc
 | |
| !	pop	hl
 | |
| !	ret
 | |
| !fetch:	inc	hl
 | |
| !	ld	a,(hl)
 | |
| !	jr	2b
 | |
| !! conversion table for nascom characters
 | |
| !tab:	.data1	0x0D,0x00
 | |
| !	.data1	0x1B,0x1E
 | |
| !	.data1	0x08,0x1D
 | |
| !	.data1	0x0A,0x1F
 | |
| !	.data1	0x7F,0x00
 | |
| 
 | |
| KBD	= 0x69
 | |
| ! get character from keyboard
 | |
| getchr:
 | |
| 	call	KBD
 | |
| 	jr	nc,getchr
 | |
| 	cp	0x1F
 | |
| 	jr	z,CR
 | |
| 	cp	0x1D
 | |
| 	jr	z,BS
 | |
| 	ret
 | |
| CR:	ld	a,0xA
 | |
| 	ret
 | |
| BS:	ld	a,0x8
 | |
| 	ret
 |