** Demo program for the console device  6/87  S.D. **

openlib      = -408      ;open library
closelib     = -414      ;close library
AddPort      = -354      ;create port
RemPort      = -360      ;remove port
OpenDev      = -444      ;open device
CloseDev     = -450      ;close device
execbase     = 4         ;Exec base address
GetMsg       = -372      ;get message
FindTask     = -294      ;determine task
DoIo         = -456      ;perform I/O
SendIo       = -462      ;start I/O

;    ** Intuition functions **
openscreen   = -198              ;open screen
closescreen  = -66               ;close screen
openwindow   = -204              ;open window
closewindow  = -72               ;close window


run:
     bsr     openint             ;open Intuition
     bsr     scropen             ;Screen ”ffnen
     bsr     windopen            ;open screen

     move.l  execbase,a6         ;pointer Exec library

     sub.l   a1,a1               ;this task
     jsr     FindTask(a6)        ;find task
     move.l  d0,readreply+$10    ;set SigTask 

     lea     readreply,a1
     jsr     AddPort(a6)         ;add read reply port

     lea     writerep,a1
     jsr     AddPort(a6)         ;add write reply port

     lea     readio,a1
     move.l  windowhd,readio+$28 ;our window
     move.l  #48,readio+$24      ;length of the structure
     clr.l   d0
     clr.l   d1
     lea     devicename,a0
     jsr     OpenDev(a6)         ;open console device
     tst.l   d0
     bne     error

     move.l  readio+$14,writeio+$14 ;copy DEVICE and
     move.l  readio+$18,writeio+$18 ;UNIT 

go:
     bsr     queueread              ;start input

loop:                         ;* evaluate events *
     move.l  execbase,a6
     move.l  windowhd,a0
     move.l  86(a0),a0        ;window user port
     jsr     GetMsg(a6)
     tst.l   d0
     bne     wevent           ;window event

     lea     readreply,a0
     jsr     GetMsg(a6)       ;console event (key)?
     tst.l   d0
     beq     loop             ;no event

cevent:                       ;* process key *
     bsr     conout           ;output character
     cmp.b   #$d,buffer       ;Return?
     bne     no1              ;no
     move.b  #$a,buffer       ;else output LF
     bsr     conout

no1:
     cmp.b   #$8,buffer       ;Backspace?
     bne     no2
     move.b  #' ',buffer      ;else erase character
     bsr     conout
     move.b  #8,buffer
     bsr     conout           ;and back again

no2:
     bra     go               ;and so on

wevent:                       ;* evaluate window event *
     move.l  d0,a0
     move.l  $16(a0),d6       ;message in D6
     cmp.l   #$2000000,d6     ;window close?
     beq     ende             ;yes: end

     ;* additional evaluations can take place here: *

     move.l  windowhd,a0
     move.l  12(a0),d5        ;mouse position in D5

     ;* e.g. set cursor to mouse position... *


ende:                         ;* End of program: close everything *
     lea     readreply,a1
     jsr     RemPort(a6)      ;remove port
     lea     readio,a1
     jsr     closedev(a6)     ;close device
     lea     writerep,a1
     jsr     RemPort(a6)      ;remove port
error:
     bsr     windclose        ;close window
     bsr     scrclose         ;clsoe screen
     bsr     closeint         ;close Intuition

     rts                      ;* end *


;** Subroutines **

queueread:               ;* start console input *
     move.l  execbase,a6
     lea     readio,a1
     move    #2,28(a1)        ;command: READ
     move.l  #buffer,40(a1)   ;buffer
     move.l  #1,36(a1)        ;length:
     move.l  #readreply,14(a1) ;set reply port
     jsr     sendIo(a6)       ;perform function
     rts

conout:                       ;* output 1 character *
     move.l  execbase,a6
     lea     writeio,a1
     move    #3,28(a1)        ;command: WRITE
     move.l  #buffer,40(a1)   ;buffer
     move.l  #1,36(a1)        ;length:
     move.l  #writerep,14(a1) ;set reply port
     jsr     DoIo(a6)         ;execute function
     rts
       
openint:                      ;* open Intuition *
     move.l  execbase,a6
     lea     intname,a1       ;library name
     jsr     openlib(a6)
     move.l  d0,intbase
     rts

closeint:                     ;* close Intuition *
     move.l  execbase,a6
     move.l  intbase,a1
     jsr     closelib(a6)
     rts

scropen:                     ;* open screen *
     move.l  intbase,a6
     lea     screen_defs,a0
     jsr     openscreen(a6)
     move.l  d0,screenhd
     rts

scrclose:                   ;* close screen *
     move.l  intbase,a6
     move.l  screenhd,a0
     jsr     closescreen(a6)
     rts

windopen:                   ;* open window *
     move.l  intbase,a6
     lea     windowdef,a0
     jsr     openwindow(a6)
     move.l  d0,windowhd
     rts

windclose:                  ;* close window *
     move.l  intbase,a6
     move.l  windowhd,a0
     jsr     closewindow(a6)
     rts

screen_defs:        ;* screen structure *
     dc.w 0,0       ;position
     dc.w 640,200   ;size
     dc.w 4         ;bit maps
     dc.b 0,1       ;colors
     dc.w $800      ;mode
     dc.w 15        ;type
     dc.l 0         ;standard font
     dc.l titel     ;screen title
     dc.l 0         ;standard title
     dc.l 0         ;no gadgets

windowdef:          ;* window structure *
     dc.w 10,20     ;position
     dc.w 300,150   ;size
     dc.b 0,1       ;colors
     dc.l $208      ;IDCMP flags
     dc.l $100f     ;window flags
     dc.l 0         ;no gadgets
     dc.l 0         ;no menu checks
     dc.l windname  ;window name

screenhd: dc.l 0    ;screen structure pointer
     dc.l 0         ;no bit map
     dc.w 100,50    ;min. size
     dc.w 300,200   ;max. size
     dc.w $f        ;screen type

titel:       dc.b "Editor screen",0
windname:    dc.b "Console window ",0
intname:     dc.b "intuition.library",0
devicename:  dc.b 'console.device',0
 align                               ;even
windowhd:    blk.l 1
intbase:     blk.l 1
conbase:     blk.l 1

readio:
message:     blk.b 20,0
io:          blk.b 12,0
ioreq:       blk.b 16,0

writeio:
             blk.b 20,0
             blk.b 12,0
             blk.b 16,0

readreply:   blk.l 8,0
writerep:    blk.l 8,0
buffer:      blk.b 80,0

 end
