Real time clock display in assembler problem

Anything QL Software or Programming Related.
Post Reply
User avatar
grafvonb
Bent Pin Expansion Port
Posts: 80
Joined: Sat Jan 05, 2019 7:54 am
Location: Frankfurt/Germany

Real time clock display in assembler problem

Post by grafvonb »

I've found this assembler example in the Adrian Dickens "QL Advanced User Guide" book and was able to compile it successfully with vasm.
However when I run it using Qemulator it hangs and shows nothing. What's wrong with it?

Code: Select all

        include "consts.asm"

ME      equ     -1
    
init
        bra.s   clock           ;branch to clock code
        ds.b    4               ;and skip along a bit so that
        dc.w    $4afb           ;job flag is in bytes 6 and 7
        dc.w    5               ;characters in job name
        dc.b    'Clock'         ;followed by ASCII characters
        even
clock
        suba.l  a6,a6           ;clear a6 for CN_DATE now
        moveq   #MT_PRIOR,d0    ;set priority
        moveq   #ME,d1          ;...of this job
        moveq   #1,d2           ;...to 1 (the lowest)
        trap    #1
        
        move.w  #UT_SCR,a2      ;open window for clock output
        lea     scr(PC),a1      ;address of definition
        jsr     (a2)
        move.l  a0,a4           ;save channel id
        
clockLp
        moveq   #MT_RCLCK,d0    ;read the time into d1
        trap    #1
        
        lea     bufTop(PC),a1   ;use buffer from top down
        move.w  CN_DATE,a2      ;to convert date into
        jsr     (a2)
        
        moveq   #IO_SSTRG,d0    ;now send the resulting string
        move.w  (a1)+,d2        ;of 20 characters
        moveq   #-1,d3          ;...with no timeout
        move.l  a4,a0           ;to our window
        trap    #3
        
        moveq   #SD_TAB,d0      ;now set the cursor at the
        moveq   #0,d1           ;...start of the line
        trap    #3
        
        moveq   #MT_SUSJB,d0    ;suspend to reduce IO load
        moveq   #ME,d1
        moveq   #5,d3           ;for a 10th of a second
        suba.l  a1,a1           ;no flag
        trap    #1
        
        bra.s   clockLp
        
scr
        dc.b    0               ;no border
        dc.b    0               ;no border colour
        dc.b    4               ;green background
        dc.b    0               ;black characters
        
;window definition for monitor mode
        dc.w    120             ;pixels wide (20 chr, all 6 wide)
        dc.w    10              ;10 pixels high
        dc.w    512-120         ;120 pixels from the HRS
        dc.w    206             ;and at top of default window #0
        
buffer
        ds.b    22
bufTop
        end


Loving QL & ZX Spectrum & Amiga...
Derek_Stewart
Font of All Knowledge
Posts: 3929
Joined: Mon Dec 20, 2010 11:40 am
Location: Sunny Runcorn, Cheshire, UK

Re: Real time clock display in assembler problem

Post by Derek_Stewart »

Hi,

Did VASM produce an executable programme, I assembled this clock programme with QMAC and output an executable file.


Regards,

Derek
User avatar
grafvonb
Bent Pin Expansion Port
Posts: 80
Joined: Sat Jan 05, 2019 7:54 am
Location: Frankfurt/Germany

Re: Real time clock display in assembler problem

Post by grafvonb »

Derek_Stewart wrote:Hi,

Did VASM produce an executable programme, I assembled this clock programme with QMAC and output an executable file.
Yes it did, I used it successfully for my other "experiments" (borrowed from Keith Hello World https://www.youtube.com/watch?v=xRNiethed1w)

I run my code using a standard procedure similar to this snippet:

Code: Select all

5 CLS
10 start=RESPR(32768)
20 LBYTES mdv3_bl_bin,start
30 CALL start
Did you succeed to run it?

The consts.asm looks like this for those who want to try it:

Code: Select all

;Hardware Keys
;The following are the addresses of the registers within the QL hardware.
PC_CLOCK    equ     $18000      ;real time clock in seconds (long word)
PC_TCTRL    equ     $18002      ;transmit control
PC_MCTRL    equ     $18020      ;Microdrive control/status and IPC status
PC_IPCRD    equ     $18020      ;IPC read is the same
PC_IPCWR    equ     $18003      ;IPC write
PC_INTR     equ     $18021      ;interrupt control/status
PC_TDATA    equ     $18022      ;transmit data
PC_TRAK1    equ     $18022      ;Microdrive read track 1
PC_TRAK2    equ     $18023      ;Microdrive read track 2
MC_STAT     equ     $18063      ;display control

;from gwassm
MT_INF                        EQU   $00000000
MT_CJOB                       EQU   $00000001
MT_JINF                       EQU   $00000002
MT_RJOB                       EQU   $00000004
MT_FRJOB                      EQU   $00000005
MT_FREE                       EQU   $00000006
MT_TRAPV                      EQU   $00000007
MT_SUSJB                      EQU   $00000008
MT_RELJB                      EQU   $00000009
MT_ACTIV                      EQU   $0000000A
MT_PRIOR                      EQU   $0000000B
MT_ALLOC                      EQU   $0000000C
MT_LNKFR                      EQU   $0000000D
MT_ALRES                      EQU   $0000000E
MT_RERES                      EQU   $0000000F
MT_DMODE                      EQU   $00000010
MT_IPCOM                      EQU   $00000011
MT_BAUD                       EQU   $00000012
MT_RCLCK                      EQU   $00000013
MT_SCLCK                      EQU   $00000014
MT_ACLCK                      EQU   $00000015
MT_ALBAS                      EQU   $00000016
MT_REBAS                      EQU   $00000017
MT_ALCHP                      EQU   $00000018
MT_RECHP                      EQU   $00000019
MT_LXINT                      EQU   $0000001A
MT_RXINT                      EQU   $0000001B
MT_LPOLL                      EQU   $0000001C
MT_RPOLL                      EQU   $0000001D
MT_LSCHD                      EQU   $0000001E
MT_RSCHD                      EQU   $0000001F
MT_LIOD                       EQU   $00000020
MT_RIOD                       EQU   $00000021
MT_LDD                        EQU   $00000022
MT_RDD                        EQU   $00000023
IO_OPEN                       EQU   $00000001
IO_CLOSE                      EQU   $00000002
IO_FORMT                      EQU   $00000003
IO_DELET                      EQU   $00000004
IO_PEND                       EQU   $00000000
IO_FBYTE                      EQU   $00000001
IO_FLINE                      EQU   $00000002
IO_FSTRG                      EQU   $00000003
IO_EDLIN                      EQU   $00000004
IO_SBYTE                      EQU   $00000005
IO_SSTRG                      EQU   $00000007
SD_EXTOP                      EQU   $00000009
SD_PXENQ                      EQU   $0000000A
SD_CHENQ                      EQU   $0000000B
SD_BORDR                      EQU   $0000000C
SD_WDEF                       EQU   $0000000D
SD_CURE                       EQU   $0000000E
SD_CURS                       EQU   $0000000F
SD_POS                        EQU   $00000010
SD_TAB                        EQU   $00000011
SD_NL                         EQU   $00000012
SD_PCOL                       EQU   $00000013
SD_NCOL                       EQU   $00000014
SD_PROW                       EQU   $00000015
SD_NROW                       EQU   $00000016
SD_PIXP                       EQU   $00000017
SD_SCROL                      EQU   $00000018
SD_SCRTP                      EQU   $00000019
SD_SCRBT                      EQU   $0000001A
SD_PAN                        EQU   $0000001B
SD_PANLN                      EQU   $0000001E
SD_PANRT                      EQU   $0000001F
SD_CLEAR                      EQU   $00000020
SD_CLRTP                      EQU   $00000021
SD_CLRBT                      EQU   $00000022
SD_CLRLN                      EQU   $00000023
SD_CLRRT                      EQU   $00000024
SD_FONT                       EQU   $00000025
SD_RECOL                      EQU   $00000026
SD_SETPA                      EQU   $00000027
SD_SETST                      EQU   $00000028
SD_SETIN                      EQU   $00000029
SD_SETFL                      EQU   $0000002A
SD_SETUL                      EQU   $0000002B
SD_SETMD                      EQU   $0000002C
SD_SETSZ                      EQU   $0000002D
SD_FILL                       EQU   $0000002E
SD_POINT                      EQU   $00000030
SD_LINE                       EQU   $00000031
SD_ARC                        EQU   $00000032
SD_ELIPS                      EQU   $00000033
SD_SCALE                      EQU   $00000034
SD_FLOOD                      EQU   $00000035
SD_GCUR                       EQU   $00000036
FS_CHECK                      EQU   $00000040
FS_FLUSH                      EQU   $00000041
FS_POSAB                      EQU   $00000042
FS_POSRE                      EQU   $00000043
FS_MDINF                      EQU   $00000045
FS_HEADS                      EQU   $00000046
FS_HEADR                      EQU   $00000047
FS_LOAD                       EQU   $00000048
FS_SAVE                       EQU   $00000049
MM_ALCHP                      EQU   $000000C0
MM_RECHP                      EQU   $000000C2
UT_WINDW                      EQU   $000000C4
UT_CON                        EQU   $000000C6
UT_SCR                        EQU   $000000C8
UT_ERR0                       EQU   $000000CA
UT_ERR                        EQU   $000000CC
UT_MINT                       EQU   $000000CE
UT_MTEXT                      EQU   $000000D0
UT_LINK                       EQU   $000000D2
UT_UNLNK                      EQU   $000000D4
MM_ALLOC                      EQU   $000000D8
MM_LNKFR                      EQU   $000000DA
IO_QSET                       EQU   $000000DC
IO_QTEST                      EQU   $000000DE
IO_QIN                        EQU   $000000E0
IO_QOUT                       EQU   $000000E2
IO_QEOF                       EQU   $000000E4
UT_CSTR                       EQU   $000000E6
IO_SERQ                       EQU   $000000E8
IO_SERIO                      EQU   $000000EA
CN_DATE                       EQU   $000000EC
CN_DAY                        EQU   $000000EE
CN_FTOD                       EQU   $000000F0
CN_ITOD                       EQU   $000000F2
CN_ITOBB                      EQU   $000000F4
CN_ITOBW                      EQU   $000000F6
CN_ITOBL                      EQU   $000000F8
CN_ITOHB                      EQU   $000000FA
CN_ITOHW                      EQU   $000000FC
CN_ITOHL                      EQU   $000000FE
CN_DTOF                       EQU   $00000100
CN_DTOI                       EQU   $00000102
CN_BTOIB                      EQU   $00000104
CN_BTOIW                      EQU   $00000106
CN_BTOIL                      EQU   $00000108
CN_HTOIB                      EQU   $0000010A
CN_HTOIW                      EQU   $0000010C
CN_HTOIL                      EQU   $0000010E
BP_INIT                       EQU   $00000110
CA_GTINT                      EQU   $00000112
CA_GTFP                       EQU   $00000114
CA_GTSTR                      EQU   $00000116
CA_GTLIN                      EQU   $00000118
BV_CHRIX                      EQU   $0000011A
RI_EXEC                       EQU   $0000011C
RI_EXECB                      EQU   $0000011E
BP_LET                        EQU   $00000120
IO_NAME                       EQU   $00000122
MD_READ                       EQU   $00000124
MD_WRITE                      EQU   $00000126
MD_VERIN                      EQU   $00000128
MD_SECTR                      EQU   $0000012A
SV_IDENT                      EQU   $00000000
SV_CHEAP                      EQU   $00000004
SV_CHPFR                      EQU   $00000008
SV_FREE                       EQU   $0000000C
SV_BASIC                      EQU   $00000010
SV_TRNSP                      EQU   $00000014
SV_TRNFR                      EQU   $00000018
SV_RESPR                      EQU   $0000001C
SV_RAMT                       EQU   $00000020
SV_RAND                       EQU   $0000002E
SV_POLLM                      EQU   $00000030
SV_TVMOD                      EQU   $00000032
SV_SCRST                      EQU   $00000033
SV_MCSTA                      EQU   $00000034
SV_PCINT                      EQU   $00000035
SV_NETNR                      EQU   $00000037
SV_I2LST                      EQU   $00000038
SV_PLIST                      EQU   $0000003C
SV_SHLST                      EQU   $00000040
SV_DRLST                      EQU   $00000044
SV_DDLST                      EQU   $00000048
SV_KEYQ                       EQU   $0000004C
SV_TRAPV                      EQU   $00000050
SV_BTPNT                      EQU   $00000054
SV_BTBAS                      EQU   $00000058
SV_BTTOP                      EQU   $0000005C
SV_JBTAG                      EQU   $00000060
SV_JBMAX                      EQU   $00000062
SV_JBPNT                      EQU   $00000064
SV_JBBAS                      EQU   $00000068
SV_JBTOP                      EQU   $0000006C
SV_CHTAG                      EQU   $00000070
SV_CHMAX                      EQU   $00000072
SV_CHPNT                      EQU   $00000074
SV_CHBAS                      EQU   $00000078
SV_CHTOP                      EQU   $0000007C
SV_CAPS                       EQU   $00000088
SV_ARBUF                      EQU   $0000008A
SV_ARDEL                      EQU   $0000008C
SV_ARFRQ                      EQU   $0000008E
SV_ARCNT                      EQU   $00000090
SV_CQCH                       EQU   $00000092
SV_WP                         EQU   $00000094
SV_SOUND                      EQU   $00000096
SV_SER1C                      EQU   $00000098
SV_SER2C                      EQU   $0000009C
SV_TMODE                      EQU   $000000A0
SV_CSUB                       EQU   $000000A2
SV_TIMO                       EQU   $000000A6
SV_TIMOV                      EQU   $000000A8
SV_FSTAT                      EQU   $000000AA
SV_PROG                       EQU   $000000AC
SV_DATA                       EQU   $000000B0
SV_DEST                       EQU   $000000B4
SV_THINGL                     EQU   $000000B8
SV_MDRUN                      EQU   $000000EE
SV_MDCNT                      EQU   $000000EF
SV_MDDID                      EQU   $000000F0
SV_MDSTA                      EQU   $000000F8
SV_FSDEF                      EQU   $00000100
SV_FSLST                      EQU   $00000140
SV_STACB                      EQU   $00000180
SV_STACT                      EQU   $00000480
SV_TRAPO                      EQU   $00000054
SV_LXINT                      EQU   $00000000
SV_AXINT                      EQU   $00000004
SV_LPOLL                      EQU   $00000008
SV_APOLL                      EQU   $0000000C
SV_LSCHD                      EQU   $00000010
SV_ASCHD                      EQU   $00000014
SV_LIO                        EQU   $00000018
SV_AIO                        EQU   $0000001C
SV_AOPEN                      EQU   $00000020
SV_ACLOS                      EQU   $00000024
CH_LEN                        EQU   $00000000
CH_DRIVR                      EQU   $00000004
CH_OWNER                      EQU   $00000008
CH_RFLAG                      EQU   $0000000C
CH_TAG                        EQU   $00000010
CH_STAT                       EQU   $00000012
CH_ACTN                       EQU   $00000013
CH_JOBWT                      EQU   $00000014
CH_QIN                        EQU   $00000018
CH_QOUT                       EQU   $0000001C
FS_NEXT                       EQU   $00000018
FS_ACCES                      EQU   $0000001C
FS_DRIVE                      EQU   $0000001D
FS_FILNR                      EQU   $0000001E
FS_NBLOK                      EQU   $00000020
FS_NBYTE                      EQU   $00000022
FS_EBLOK                      EQU   $00000024
FS_EBYTE                      EQU   $00000026
FS_CBLOK                      EQU   $00000028
FS_UPDT                       EQU   $0000002C
FS_FNAME                      EQU   $00000032
FS_SPARE                      EQU   $00000058
FS_END                        EQU   $000000A0
FS_DRIVR                      EQU   $00000010
FS_DRIVN                      EQU   $00000014
FS_MNAME                      EQU   $00000016
FS_FILES                      EQU   $00000022
JB_LEN                        EQU   $00000000
JB_START                      EQU   $00000004
JB_OWNER                      EQU   $00000008
JB_HOLD                       EQU   $0000000C
JB_TAG                        EQU   $00000010
JB_PRIOR                      EQU   $00000012
JB_PRINC                      EQU   $00000013
JB_STAT                       EQU   $00000014
JB_RELA6                      EQU   $00000016
JB_WFLAG                      EQU   $00000017
JB_WJOB                       EQU   $00000018
JB_TRAPV                      EQU   $0000001C
JB_D0                         EQU   $00000020
JB_D1                         EQU   $00000024
JB_D2                         EQU   $00000028
JB_D3                         EQU   $0000002C
JB_D4                         EQU   $00000030
JB_D5                         EQU   $00000034
JB_D6                         EQU   $00000038
JB_D7                         EQU   $0000003C
JB_A0                         EQU   $00000040
JB_A1                         EQU   $00000044
JB_A2                         EQU   $00000048
JB_A3                         EQU   $0000004C
JB_A4                         EQU   $00000050
JB_A5                         EQU   $00000054
JB_A6                         EQU   $00000058
JB_A7                         EQU   $0000005C
JB_SR                         EQU   $00000060
JB_PC                         EQU   $00000062
JB_END                        EQU   $00000068
SD_XMIN                       EQU   $00000018
SD_YMIN                       EQU   $0000001A
SD_XSIZE                      EQU   $0000001C
SD_YSIZE                      EQU   $0000001E
SD_BORWD                      EQU   $00000020
SD_XPOS                       EQU   $00000022
SD_YPOS                       EQU   $00000024
SD_XINC                       EQU   $00000026
SD_YINC                       EQU   $00000028
SD_SCRB                       EQU   $00000032
SD_PMASK                      EQU   $00000036
SD_SMASK                      EQU   $0000003A
SD_IMASK                      EQU   $0000003E
SD_CATTR                      EQU   $00000042
SD_CURF                       EQU   $00000043
SD_PCOLR                      EQU   $00000044
SD_SCOLR                      EQU   $00000045
SD_ICOLR                      EQU   $00000046
SD_BCOLR                      EQU   $00000047
SD_NLSTA                      EQU   $00000048
SD_FMOD                       EQU   $00000049
SD_YORG                       EQU   $0000004A
SD_XORG                       EQU   $00000050
SD_SCAL                       EQU   $00000056
SD_FBUF                       EQU   $0000005C
SD_FUSE                       EQU   $00000060
SD_KBD                        EQU   $00000064
SD_END                        EQU   $00000068


Loving QL & ZX Spectrum & Amiga...
User avatar
tofro
Font of All Knowledge
Posts: 2685
Joined: Sun Feb 13, 2011 10:53 pm
Location: SW Germany

Re: Real time clock display in assembler problem

Post by tofro »

The resulting executable (note: not binary) is intended to be run as an executable job (You can see that because it has a job header and no return to BASIC). If you start it as part of SuperBASIC (with CALL), it will never return and thus suspend SuperBASIC.

Do the following:

Code: Select all

10 start=RESPR(32768)
20 LBYTES mdv3_bl_bin,start
30 SEXEC mdv3_bl_exe,start,length_of_code,100 : REMark use 100 bytes of stack
(Insert the actual length of the code as <length_of_code> in line 30.)

The SEXEC is needed because I am pretty sure VASM cannot produce a proper QDOS file header - If you used a QDOS assembler like QMAC, that could directly produce executable files. The program should run with 100 to 200 bytes of data space, as we only need stack for the system calls. What you have done now is convert a piece of binary code into an executable file that can run as an independant job.

The job should now be started with

Code: Select all

EXEC mdv3_bl_exe
instead of CALL and should work, at least after a cursory glance.

(I guess if you refer back to Mr. Dickens, he might have written that somewhere, and you, eager to see something running, ignored that ;) )

EDIT: After a bit more than a cursory glance, I did find an error:

Code: Select all

	move.w  <#>UT_SCR,a2      ;open window for clock output
The hash sign before UT_SCR needs to be removed. You don't want the immediate value $C8 in a2, but rather the sign-extended word at address $C8 in the ROM's vector table. That's very probably the reason why you can't see anything happening on the screen. The rest of the above still holds true.

Tobias


ʎɐqǝ ɯoɹɟ ǝq oʇ ƃuᴉoƃ ʇou sᴉ pɹɐoqʎǝʞ ʇxǝu ʎɯ 'ɹɐǝp ɥO
User avatar
grafvonb
Bent Pin Expansion Port
Posts: 80
Joined: Sat Jan 05, 2019 7:54 am
Location: Frankfurt/Germany

Re: Real time clock display in assembler problem

Post by grafvonb »

tofro wrote:The resulting executable (note: not binary) is intended to be run as an executable job (You can see that because it has a job header and no return to BASIC). If you start it as part of SuperBASIC (with CALL), it will never return and thus suspend SuperBASIC.
Wow, respect tofro, you are my hero and I've learned a lot :idea:!

I have done all you proposed and the clock works now 8-) :
ql_clock.PNG
ql_clock.PNG (6.32 KiB) Viewed 2003 times
Thx, Adam


Loving QL & ZX Spectrum & Amiga...
User avatar
grafvonb
Bent Pin Expansion Port
Posts: 80
Joined: Sat Jan 05, 2019 7:54 am
Location: Frankfurt/Germany

Re: Real time clock display in assembler problem

Post by grafvonb »

Derek_Stewart wrote:Did VASM produce an executable programme, I assembled this clock programme with QMAC and output an executable file.
After explanation by tofro I now understood you question :D and you were right, vasm is not able to produce an executable programme... I had to convert my binary first.


Loving QL & ZX Spectrum & Amiga...
Post Reply